/*===========================================================================*/
/*          Copyright (c) 1987 - 1988, Future Soft Engineering, Inc.         */
/*                              Houston, Texas                               */
/*===========================================================================*/

#define  NOGDICAPMASKS     TRUE
#define  NOVIRTUALKEYCODES TRUE
#define  NOICONS	         TRUE
#define  NOKEYSTATES       TRUE
#define  NOSYSCOMMANDS     TRUE
#define  NOATOM	         TRUE
#define  NOCLIPBOARD       TRUE
#define  NODRAWTEXT	      TRUE
#define  NOMINMAX	         TRUE
#define  NOOPENFILE	      TRUE
#define  NOSCROLL	         TRUE
#define  NOHELP            TRUE
#define  NOPROFILER	      TRUE
#define  NODEFERWINDOWPOS  TRUE
#define  NOPEN             TRUE
#define  NO_TASK_DEFINES   TRUE
#define  NOLSTRING         TRUE
#define  WIN31
#define  USECOMM

#include <windows.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include "task.h"
#include "connect.h"


/*--------------------- >>> Local Global Declarations <<< -------------------*/

static INT retryCnt;
static INT timeOutSec;                       /* mbbx 2.00: display time remaining */


/*---------------------------------------------------------------------------*/
/* dbDialing() - Dialing dialog box message proccessing.                     */
/*---------------------------------------------------------------------------*/

#define MAX_DIAL_STRLEN             21       /* mbbx 2.00: CUA */

INT_PTR APIENTRY dbDialing(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
   CHAR  tmp1[TMPNSTR], tmp2[TMPNSTR];
   COMSTAT  serInfo;

   switch(message)
   {
   case WM_INITDIALOG:
      initDlgPos(hDlg);                      /* mbbx 2.00: CUA... */

      strcpy(tmp1, trmParams.phone);
      if(strlen(tmp1) > MAX_DIAL_STRLEN)
         strcpy(tmp1+(MAX_DIAL_STRLEN-3), "...");
      SetDlgItemText(hDlg, IDDIALING, tmp1);

      retryCnt = 0;
      itemHit = -1;

      if(!SetTimer(hDlg, -1, 128, NULL))    /* rjs bugs 006 */
      {
         LoadString(hInst, STRERRNOTIMERS, tmp1, TMPNSTR);
         MessageBox(hDlg, tmp1, NULL, MB_OK | MB_ICONEXCLAMATION);
         break;
      }

      return(TRUE);

   case WM_TIMER:
      if(itemHit == -1)
      {
         sprintf(tmp1, "%u", timeOutSec = trmParams.dlyRetry);    /* mbbx 2.00: time remaining... */
         SetDlgItemText(hDlg, IDDIALTIME, tmp1);

         if(!sPortErr)    /* rjs bug2 */
         {
            termSendCmd(trmParams.originate, strlen(trmParams.originate), TRUE);    /* mbbx 2.01.19 ... */
            getMdmResult();

            termSendCmd(trmParams.dialPrefix, strlen(trmParams.dialPrefix), FALSE);

            strcpy(tmp1, trmParams.phone);      /* mbbx 2.01.18 ... */
            strcpy(tmp1+strlen(tmp1), trmParams.phone2);
            termSendCmd(tmp1, strlen(tmp1), 0x0080 | FALSE);

            termSendCmd(trmParams.dialSuffix, strlen(trmParams.dialSuffix), TRUE);

         }
         else
            modemReset();

         dialStart = tickCount();
         itemHit = 0;
      }
      else if(itemHit == 0)
      {
         updateTimer();

         if(trmParams.fCarrier)               /* mbbx 1.10: CUA... */
            mdmConnect();
         else if(modemBytes())
         {
            getMdmResult();
            mdmOnLine = (mdmValid && (mdmResult[2] == 'C'));
//            mdmOnLine = TRUE;
         }

         if(mdmOnLine)
         {
            getMdmResult();
            if(trmParams.flgSignal)
            {
               sysBeep();
               sysBeep();                    /* mbbx 2.00: more noise for signal... */
               sysBeep();
            }
            timerAction(TRUE, TRUE);         /* mbbx 1.03 */
            break;
         }

         if((tickCount() - dialStart) > (DWORD)((trmParams.dlyRetry > 30) ? (trmParams.dlyRetry * 60) : (30 * 60)))
         {
            if((trmParams.flgRetry) && ((retryCnt < trmParams.cntRetry) || (trmParams.cntRetry == 255)))
            {
               LoadString(hInst, STR_RETRYCOUNT, tmp1, TMPNSTR);
               sprintf(tmp2, tmp1, ++retryCnt);
               SetDlgItemText(hDlg, IDDIALRETRY, tmp2);

               if(trmParams.flgSignal)       /* mbbx 2.00: redial beep optional... */
                  sysBeep();

               itemHit = -1;
            }
            else
            {
               if(!sPortErr)    /* rjs bug2 */
                  modemWr(CR);
               break;
            }
         }
         else if((INT)(trmParams.dlyRetry - ((tickCount() - dialStart) / 60)) != timeOutSec)
         {
            sprintf(tmp1, "%u", timeOutSec = trmParams.dlyRetry - ((tickCount() - dialStart) / 60));
            SetDlgItemText(hDlg, IDDIALTIME, tmp1);
         }
      }
      return(TRUE);

   case WM_COMMAND:                          /* mbbx 2.00: only one control... */
      modemWr(CR);
      break;

   default:
      return(FALSE);
   }

   KillTimer(hDlg, -1);                      /* mbbx 2.00: eliminate statics... */
   EndDialog(hDlg, TRUE);
   return(TRUE);
}


/*---------------------------------------------------------------------------*/
/* dialPhone() -                                                       [scf] */
/*---------------------------------------------------------------------------*/

VOID dialPhone()
{
   BYTE tmp1[TMPNSTR];
   DCB  dcb;

   if(trmParams.comDevRef == ITMDLLCONNECT)  /* slc nova 031 */
   {
      DLL_ConnectConnector(ghCCB, TRUE);
      return;
   }

   if(*trmParams.phone == 0)                 /* Don't dial if no phone no.   */
      doSettings(IDDBPHON, dbPhon);

   if(*trmParams.phone == 0)                 /* Don't dial if no phone no.   */
      return;

   while(modemBytes())
      rdModem(FALSE);

   offCursor();
   if(mdmOnLine)                             /* Tell user to hang up         */
   {
      LoadString(hInst, STR_HANGUP, tmp1, TMPNSTR);
         itemHit = testBox(NULL, -(MB_OK | MB_ICONHAND), STR_ERRCAPTION, tmp1);
      onCursor();
      return;
   }

   if(trmParams.flgRetry )
      trmParams.cntRetry = 255;

   dialing = TRUE;
   DialogBox(hInst, MAKEINTRESOURCE(IDDBDIALING), GetFocus(), dbDialing);
   dialing = FALSE;

   onCursor();
   trmParams.cntRetry = 0;
}


/*---------------------------------------------------------------------------*/
/* hangUpPhone() -                                                   [scf]   */
/*---------------------------------------------------------------------------*/

VOID hangUpPhone()
{
   if(trmParams.comDevRef == ITMDLLCONNECT)  /* slc nova 031 */
   {
      DLL_DisconnectConnector(ghCCB);
      return;
   }

   SetCursor(LoadCursor(NULL, IDC_WAIT));    /* mbbx 1.10: ala jtf */

   delay(33, NULL);                          /* mbbx 0.62: formerly 66 ticks */

   termSendCmd(trmParams.hangSuffix, strlen(trmParams.hangSuffix), 0x0040 | TRUE);  /* mbbx 2.01.19 ... */
   getMdmResult();

   if(trmParams.fCarrier)                     /* mbbx 1.10: carrier... */
      mdmConnect();
   else
      mdmOnLine = FALSE;

   modemReset();                             /* mbbx: isolate COM */
   timerAction(FALSE, FALSE);                /* mbbx 1.03 */

   SetCursor(LoadCursor(NULL, IDC_ARROW));   /* mbbx 1.10: ala jtf */
}


/*---------------------------------------------------------------------------*/
/* getMdmResult() -                                                    [mbb] */
/*---------------------------------------------------------------------------*/

VOID getMdmResult()
{
   LONG  begTime;

   begTime = tickCount();
   *mdmResult = 0;
   mdmValid = FALSE;

   repeat
   {
      rdModem(TRUE);
      if(!dialing)
         idleProcess();
   }
   until(mdmValid || ((tickCount() - begTime) > 90));

   if(!mdmValid && (*mdmResult >= 2))
      mdmValid = TRUE;                       /* mbbx: override timeout !!! */
}


/*---------------------------------------------------------------------------*/
/* termSendCmd() -                                                     [mbb] */
/*---------------------------------------------------------------------------*/

/* convert ==>       ABCDEFGHIJKLMNOPQRSTUVWXYZ */
#define PHONE_CHARS "2223334445556667-77888999-"

BOOL termSendCmd(BYTE *   str, int      nBytes, WORD     wFlags)
{
   INT   ndx;

   if(wFlags & 0x0040)                       /* get modem's attention */
   {
      if(nBytes == 0)
         return(TRUE);

      termSendCmd(trmParams.hangPrefix, strlen(trmParams.hangPrefix), (3 << 8) | FALSE);
      delay(66, NULL);
      getMdmResult();
   }

   for(ndx = 0; ndx < nBytes; ndx += 1)
   {
      if(wFlags & 0x0080)                    /* xlate phone string */
      {
         if((str[ndx] >= 'A') && (str[ndx] <= 'Z'))
            str[ndx] = PHONE_CHARS[str[ndx] - 'A'];
         else if((str[ndx] >= 'a') && (str[ndx] <= 'z'))
            str[ndx] = PHONE_CHARS[str[ndx] - 'a'];
      }

      modemWr(str[ndx]);

      if((wFlags & 0xFF00) > 0)
         delay(((wFlags >> 8) & 0x00FF), NULL);

      if(!dialing)                           /* mbbx 2.01.19: why is this needed ??? */
         idleProcess();
   }

   if(wFlags & 0x0001)                       /* send CR */
      modemWr(CR);

   if(wFlags & 0x0002)                       /* clear modem response */
      getMdmResult();

   return(TRUE);
}
