/* oversize.c
 *
 * Code to handle user interaction when we find a message that has exceeded the size
 * we've been configured to download
 *
 * (C) Joseph Heenan, 1998. All rights reserved.
 *
 * $Id: oversize,v 1.6 1999/10/05 22:33:51 joseph Exp $
 *
 */

#include <stdio.h>
#include <string.h>

#include "wimplib.h"
#include "wimpclib.h"
#include "swis.h"

#include "config.h"
#include "dkm.h"
#include "stopquit.h"
#include "popstar.h"
#include "IconNames.h"

#include "memleak.h"

#include "oversize.h"




/* This functions fills in and opens the window, then waits for:
     - the user to click a button, or
     - a timeout occurs

   Returns one of :
     - abort fetch
     - download message
     - delete message
     - leave message on server and email user to say it's there
   (return in the oversize_action type)
 */


static osaction_t oversize_action = osaction_waiting;
static int oversize_winhan = -1;
static unsigned int oversize_timeout;
/* when the dialogue is going to timeout, so delete dialogue can give 5 secs extra */

void oversize_init( int winhan )
{
  oversize_winhan = winhan;
}

osaction_t oversize_query( const char *ruser, const char *server, const char *from, const char *subject, int size )
{
  unsigned int timenow;
  char msg[256];
  char dkm[64];
  WimpPollBlock event;

  if ( oversize_winhan == -1 || config_lookup_num( "OversizeQueryWait:20" ) == 0 )
    return osaction_leave;

  /* fill in and open window */
  dkm_to_str( dkm, size );
  snprintf( msg, sizeof (msg),
    "The message detailed below in mailbox %.20s@%.60s is %.10s, exceeding "
    "the configured maximum. What would you like to do with the message?",
                ruser, server, dkm );
  wimpc_seticontext( oversize_winhan, oversize_Message, msg );
  wimpc_seticontext( oversize_winhan, oversize_From, from );
  wimpc_seticontext( oversize_winhan, oversize_Subject, subject );
  wimpc_seticontext( oversize_winhan, oversize_Timer, "" );
  wimpc_seticontext( oversize_winhan, oversize_Leave, "Get Header" );
  wimpc_deleteicon( oversize_winhan, oversize_Download, 0 ); /* make sure download button is there */
  wimpc_deleteicon( oversize_winhan, oversize_Skip, 0 ); /* make sure skip button is there */
  wimpc_openwindowcentre( oversize_winhan, 0 );

  _swix( OS_ReadMonotonicTime, _OUT(0), &timenow );
  oversize_timeout = config_lookup_num( "OversizeQueryWait:20" ); /* default timeout is 20 secs */
  if ( oversize_timeout > 400 ) oversize_timeout = 400; /* longer than five minutes is silly */
  oversize_timeout = oversize_timeout * 100 + timenow;

  oversize_action = osaction_waiting;

  if (config_lookup_bool( "OversizeBell:N" ))
    _kernel_oswrch (7);

  do
  {
    /* do checks before poll, othersize the user might press a button and we would then
     * override it... */
    if ( stopquit_pending )
      oversize_action = osaction_abort;
    else if ( timenow - oversize_timeout < 0x80000000 )
      oversize_action = osaction_skip; /* timer has expired */
    else
    {
      int ecode;
      /* update timer in query window */
      sprintf( dkm, "%d", (oversize_timeout - timenow) / 100 );
      wimpc_seticontext( oversize_winhan, oversize_Timer, dkm );

      popstar_event_poll( &ecode, &event, timenow + 100 ); /* make this an idle poll for a second */
      _swix( OS_ReadMonotonicTime, _OUT(0), &timenow );
    }
  }
  while ( oversize_action == osaction_waiting || oversize_action == osaction_confdelete );

  /* close window */
  wimp_close_window( &oversize_winhan );

  return oversize_action;
}


void oversize_mouseclick( int icon, int but )
{
  if ( but != Wimp_MouseButtonSelect )
    return;

  switch ( icon )
  {
    case oversize_Delete:
      if ( oversize_action == osaction_confdelete )
      {
        oversize_action = osaction_delete;
        wimpc_deleteicon( oversize_winhan, oversize_Download, 0 ); /* replace download button */
      }
      else
      {
        /* make the user confirm the deletion, as it's rather permanent */
        unsigned int timenow;
        _swix( OS_ReadMonotonicTime, _OUT(0), &timenow );
        if ( timenow + 500 - oversize_timeout < 0x80000000 ) /* ie. if left side is +ve */
          oversize_timeout += 500; /* give an extra 5 seconds... */
        wimpc_seticontext( oversize_winhan, oversize_Message,
                           "Are you sure you want to delete this message? "
                           "Once deleted, the message cannot be recovered." );
        wimpc_deleteicon( oversize_winhan, oversize_Download, 1 ); /* remove download button */
        wimpc_deleteicon( oversize_winhan, oversize_Skip, 1 ); /* remove skip button */
        wimpc_seticontext( oversize_winhan, oversize_Leave, "Cancel" );
        oversize_action = osaction_confdelete;
      }
      break;
    case oversize_Leave:
      oversize_action = osaction_leave;
      break;
    case oversize_Download:
      oversize_action = osaction_download;
      break;
    case oversize_Skip:
      oversize_action = osaction_skip;
    default:
      /* do nothing */
      break;
  }
}
