WS_MAIN.C
上传用户:dansui
上传日期:2007-01-04
资源大小:71k
文件大小:77k
源码类别:

Ftp客户端

开发平台:

WINDOWS

  1. //*****************************************************************************
  2. //*****************************************************************************
  3. //*****************************************************************************
  4. //*****************************************************************************
  5. //  Windows Sockets FTP Application
  6. //
  7. //  Based on the WS_FTP program written by: John A. Junod
  8. //  Internet: <junodj@gordon-emh2.army.mil>
  9. //
  10. //  This program executable and all source code is released into the public
  11. //  domain.  The primary purpose of this application was to learn what it
  12. //  takes to write a Window Sockets Application and this is NOT a full 
  13. //  implementation of an FTP client.
  14. //
  15. //  WINFTP written by:
  16. //      Santanu Lahiri       Internet: <slahiri@magnus.acs.ohio-state.edu>
  17. //
  18. //  Reworked most of the code in this module into a format similar to 
  19. //  the Microsoft Class Library Naming Convention.  Hopefully this will
  20. //  reduce the effort needed to convert it to an MSVC/C++ app if ever.
  21. //
  22. //  Added the Configuration Entry in the Connect dialog box to allow
  23. //  multiple configurations for the same host.  Also added the "Delete
  24. //  Config" option to delete unwanted configs.  Checking the "Save Config"
  25. //  will now save the current configuration or update an existing one.
  26. //
  27. //  Added the History option to the main window.  This control now tracks
  28. //  the directories being visited for ease of browsing.  This is a Drop-Down
  29. //  combo box where the list box shows the dirs.  Clicking on an entry in the
  30. //  list causes a CHDIR command to be executed.
  31. //
  32. //  Added a Refresh button to allow refreshing the Directory listings.  Next
  33. //  step is to add code to optionally suppress automatic listing of directories
  34. //  and allowing listing of specified file types.
  35. //
  36. //  Converted all Command buttons to simulated buttons to reduce resources.
  37. //  The remaining controls are the list boxes, combo boxes, radio
  38. //  buttons, and static text boxes.  This reduces #controls by about 22.
  39. //
  40. //  MODULE: WS_MAIN.C  (main window functions and some dialog boxes)
  41. //
  42. //*****************************************************************************
  43. //*****************************************************************************
  44. #include "ws_glob.h"
  45. #include "winftp.H"
  46. #include <stdio.h>
  47. #include <stdlib.h> 
  48. #include <direct.h>
  49. #include <dos.h>
  50. #include <shellapi.h>
  51. #define RB_SHOWCHECKS 8100
  52. #define EN_TEXTCHANGE 0x4000
  53. int nView=0;
  54. int selects[256];
  55. BOOL bDebugLog;
  56. static HBRUSH hbrGray1, hbrGray2;
  57. FARPROC lpfnOldLocal,  lpfnNewLocal;
  58. FARPROC lpfnOldRemote, lpfnNewRemote;
  59. LRESULT CALLBACK LocalDirProc  (HWND, UINT, WPARAM, LPARAM);
  60. LRESULT CALLBACK RemoteDirProc (HWND, UINT, WPARAM, LPARAM);
  61. #ifndef USEASYNC
  62. SubProcessAsync (HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
  63. {
  64.   return(FALSE);
  65. }
  66. #endif
  67. BOOL CALLBACK WS_DeleteFileProc (HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
  68. //*****************************************************************************
  69. //  Main Program
  70. //*****************************************************************************
  71. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
  72. {
  73.   int        nRc;           // return value from Register Classes
  74.   int        nErr;
  75. #ifdef WIN32
  76.   lstrcpy (szAppName, "WINFTP32");
  77. #else
  78.   lstrcpy (szAppName, "WINFTP16");
  79. #endif
  80.   
  81.   hInst = hInstance;
  82.   hbrGray1 = CreateSolidBrush (RGB (192,192,192));
  83.   hbrGray2 = CreateSolidBrush (RGB (128,128,128));
  84.   if (!hPrevInstance)
  85.   {
  86.     if ((nRc = nCwRegisterClasses()) == -1)
  87.     {
  88.       MessageBox((HWND)NULL, "Window creation failed", NULL, MB_ICONEXCLAMATION);
  89.       return nRc;    
  90.     }
  91.   }
  92.   if ((nErr=InitInstance (hInst))!=IDOK) return nErr;
  93.   if(strstr (lpszCmdLine, "auto")!=NULL) bAutoStart=TRUE;
  94.   switch (nErr=WSAStartup( 0x0101, &WSAData))  // register with winsock tcp/ip API
  95.   {
  96.     case  0: nRc = ExecFTPApp (nCmdShow); break;
  97.     default: ReportWSError ("WSAStartup", nErr);            
  98.   }
  99.   UnsetStatusLines();
  100.   unlink (szCurrentDir);
  101.   CwUnRegisterClasses();
  102.   DeleteObject (hbrGray1);
  103.   DeleteObject (hbrGray2);
  104.   
  105.   return nRc;
  106. }
  107. //*****************************************************************************
  108. //  Initialize this instance of the application
  109. //*****************************************************************************
  110. InitInstance (HINSTANCE hInst)
  111. {
  112.   long       nWndunits;       // window units for size and location
  113.   int        nWidth, nHeight; // resulting width and height for this window
  114.   
  115.   nWndunits = GetDialogBaseUnits();
  116.   nWndx = LOWORD (nWndunits);
  117.   nWndy = HIWORD (nWndunits);
  118.   nWidth = ((250 * nWndx) / 4);
  119.   nHeight = ((222 * nWndy) / 8);
  120.   hWndMain = CreateWindow (szAppName, szDefaultHdr,  WS_OVERLAPPEDWINDOW,
  121.     CW_USEDEFAULT, CW_USEDEFAULT, nWidth, nHeight, (HWND) NULL, (HMENU) NULL, hInst,  NULL);
  122.   if (hWndMain == (HWND) NULL)
  123.   {
  124.     MessageBox((HWND)NULL, "Error registering class", NULL, MB_ICONEXCLAMATION);
  125.     return IDCANCEL;
  126.   }
  127.   return IDOK;
  128. }
  129. //*****************************************************************************
  130. //  Main message loop is in this routine
  131. //*****************************************************************************
  132. ExecFTPApp (int nCmdShow)
  133. {
  134.   MSG msg;
  135.   HWND hLocal;
  136.   HWND hRemote;
  137.   
  138.   GetLocalInfo();
  139.   hLocal  = GetDlgItem (hWndMain, EDT_LFILETYPE);
  140.   hRemote = GetDlgItem (hWndMain, EDT_RFILETYPE);
  141.   lpfnOldLocal  = (FARPROC) GetWindowLong (hLocal,  GWL_WNDPROC);
  142.   lpfnOldRemote = (FARPROC) GetWindowLong (hRemote, GWL_WNDPROC);
  143.   lpfnNewLocal  = (FARPROC) MakeProcInstance ((FARPROC) LocalDirProc,  hInst);
  144.   lpfnNewRemote = (FARPROC) MakeProcInstance ((FARPROC) RemoteDirProc,  hInst);
  145.   SetWindowLong (hLocal,  GWL_WNDPROC, (LONG) lpfnNewLocal);
  146.   SetWindowLong (hRemote, GWL_WNDPROC, (LONG) lpfnNewRemote);
  147.   
  148.   ShowWindow(hWndMain, nCmdShow);         // display main window
  149.   if (bAutoStart) PostMessage (hWndMain, WM_COMMAND, BTN_CONNECT, 0L);
  150.   while(GetMessage (&msg, (HWND) NULL, 0, 0))     // Until WM_QUIT message
  151.   {
  152.     TranslateMessage(&msg);
  153.     DispatchMessage(&msg);
  154.   }
  155.   WSACleanup();
  156.   ReleaseDisplayMem();
  157.   return msg.wParam;
  158. }
  159. //*****************************************************************************
  160. //  Check and despatch messages as necessary
  161. //*****************************************************************************
  162. CheckMsgQueue (HWND hWnd)
  163. {
  164.   MSG Msg;
  165.   int i;
  166.   
  167.   for (i=0; i<10; i++)
  168.   {
  169.     if (!PeekMessage (&Msg, hWnd, 0, 0, PM_REMOVE)) return 0;
  170.     TranslateMessage (&Msg);
  171.     DispatchMessage (&Msg);
  172.   }
  173.   return 0;
  174. }
  175. //*****************************************************************************
  176. // Clean up the files in the temp directory
  177. //*****************************************************************************
  178. void CleanupTempFiles (HWND hWnd)
  179. {
  180.   char szName[_MAX_PATH];
  181.   char szFile[_MAX_PATH];
  182.   int nMax, nI, nLen;
  183.   char *lp;
  184.   
  185. #ifdef WIN32
  186.   HANDLE hFile;
  187.   WIN32_FIND_DATA f;
  188. #else
  189.   struct _find_t f;
  190. #endif
  191.   if (bRetain) return;
  192.   memset (szName, '', _MAX_PATH);
  193.   lstrcpy (szName, szTmpViewFile);
  194.   lp = strstr (szName, "%04d");
  195.   if (lp!=NULL)
  196.   {
  197.     lstrcpy (lp, "*.tmp");
  198.     lp = szTempDir;
  199.     if (lstrlen (szTempDir)>0) lp += lstrlen (szTempDir) - 1;
  200.     if (*lp=='\') *lp = '';
  201. #ifdef WIN32
  202.     while ((hFile=FindFirstFile (szName, &f))!=INVALID_HANDLE_VALUE)
  203.     {
  204.       wsprintf (szFile, "%s\%s", szTempDir, f.cFileName);
  205.       unlink (szFile);
  206.       FindClose (hFile);
  207.     }
  208. #else
  209.     while (_dos_findfirst (szName, _A_NORMAL, &f)==0)
  210.     {
  211.       wsprintf (szFile, "%s\%s", szTempDir, f.name);
  212.       unlink (szFile);
  213.     }
  214. #endif
  215.   }
  216.   nMax = (int) SendDlgItemMessage (hWnd, LST_DELFILES, LB_GETCOUNT, (WPARAM) 0, (LPARAM) 0L);
  217.   if ((nMax==0)||(nMax==LB_ERR)) return;
  218.   for (nI=0; nI<nMax; nI++)
  219.   {
  220.     nLen = (int) SendDlgItemMessage (hWndMain, LST_DELFILES, LB_GETTEXT, (WPARAM) nI, (LPARAM)(LPCSTR) szFile);
  221.     if (nLen>0) unlink (szFile);
  222.   }
  223. }
  224. //*****************************************************************************
  225. //  If the current directory is not already in the list, add it in.
  226. //*****************************************************************************
  227. LPSTR FindViewerName (LPSTR lpName)
  228. {
  229.   char szBuf[_MAX_PATH];
  230.   int nI;
  231.   
  232.   lstrcpy (szBuf, lpName);
  233.   strupr (szBuf);
  234.   for (nI=0; nI<nViewNum; nI++)
  235.   {
  236.     if (strstr (szBuf, lpVuExt(nI))!=NULL) return (LPSTR) lpVuPgm(nI);
  237.   }
  238.   return szViewer;
  239. }
  240. //*****************************************************************************
  241. //  If the current directory is not already in the list, add it in.
  242. //*****************************************************************************
  243. int FindViewerIndex (LPSTR lpName)
  244. {
  245.   char szBuf[_MAX_PATH];
  246.   int nI;
  247.   
  248.   lstrcpy (szBuf, lpName);
  249.   strupr (szBuf);
  250.   for (nI=0; nI<nViewNum; nI++)
  251.   {
  252.     if (strstr (szBuf, lpVuExt(nI))!=NULL) return nI;
  253.   }
  254.   return -1;
  255. }
  256. //*****************************************************************************
  257. //  If the current directory is not already in the list, add it in.
  258. //*****************************************************************************
  259. AddDirToList (HWND hWnd, int nID, LPSTR lpDir)
  260. {
  261.   if (SendDlgItemMessage (hWnd, nID, CB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)(LPCSTR) lpDir)==CB_ERR)
  262.      SendDlgItemMessage (hWnd, nID, CB_ADDSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) lpDir);
  263.   return 0;
  264. }
  265. //*****************************************************************************
  266. //  Directory selected from Local ComboBox dropdown list.  Switch to that dir.
  267. //  This is the "Recall History" function.
  268. //*****************************************************************************
  269. OnCmdLocalChangeDirLst (HWND hWnd)
  270. {
  271.   int nIndex;
  272.   char szMsgBuf[_MAX_PATH];
  273.   if ((nIndex=(int) SendMessage (hLbxLDirLst, CB_GETCURSEL, 0, 0L))!=CB_ERR)
  274.   {
  275.     SendDlgItemMessage (hWnd, LST_LDIRLST, CB_GETLBTEXT, (WPARAM) nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  276.     if (chdir (szMsgBuf)==0) GetLocalDirForWnd (hWnd);
  277.   }
  278.   return 0;
  279. }
  280. //*****************************************************************************
  281. //  Change to selected local directory from the Directory/Drive list box
  282. //*****************************************************************************
  283. OnCmdLocalChangeDir (HWND hWnd)
  284. {
  285.   int nIndex;
  286.   FARPROC lpfnMsgProc; 
  287.   char szMsgBuf[_MAX_PATH];
  288.   if ((nIndex=(int) SendMessage (hLbxLDir, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  289.   {
  290.     SendMessage (hLbxLDir, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  291.     if (strncmp (szMsgBuf,"[-",2)==0) 
  292.     {
  293.       setdisk (szMsgBuf[2]-'a'+1);
  294.       GetLocalDirForWnd (hWnd);
  295.       return 0;
  296.     } 
  297.   }
  298.   switch (chdir (szMsgBuf))
  299.   {
  300.     case 0 : _getcwd (szMsgBuf, 80);
  301.              strlwr (szMsgBuf);
  302.              AddDirToList (hWnd, LST_LDIRLST, szMsgBuf);
  303.              GetLocalDirForWnd (hWnd); break;
  304.     default: lstrcpy (szDlgPrompt,"Enter local directory name:");
  305.              memset (szDlgEdit, '', sizeof (szDlgEdit));
  306.              lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  307.              DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  308.              FreeProcInstance (lpfnMsgProc);
  309.              if (chdir(szDlgEdit)==0) 
  310.              {
  311.                _getcwd (szMsgBuf, 80);
  312.                strlwr (szMsgBuf);
  313.                AddDirToList (hWnd, LST_LDIRLST, szMsgBuf);
  314.                GetLocalDirForWnd(hWnd);  
  315.              }
  316.   }
  317.   return 0;
  318. }
  319. //*****************************************************************************
  320. //*****************************************************************************
  321. OnCmdLocalToRemote (HWND hWnd)
  322. {
  323.   u_char szTmp[150];
  324.   char szLocalName[_MAX_PATH], szRemoteName[_MAX_PATH];
  325.   int nCount, nRC, nIndex;
  326.   if (!bConnected) return 0;
  327.   bCancelXfer = FALSE;
  328.   bOpInProgress = TRUE;
  329.   nCount = (int) SendMessage (hLbxLFiles, LB_GETSELITEMS, 256, (LPARAM)(int far *) selects);
  330.   if (nCount>0 && nCount!=LB_ERR) 
  331.   {
  332.     
  333.     for (nIndex=0; (nIndex<nCount); nIndex++) 
  334.          SendMessage (hLbxLFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  335.     CreateXferWindow();
  336.     for (nIndex=0; (nIndex<nCount)&(!bCancelXfer); nIndex++) 
  337.     {
  338.       SendMessage (hLbxLFiles, LB_GETTEXT, selects[nIndex], (LPARAM)(LPCSTR) szLocalName);
  339.       SendMessage (hLbxLFiles, LB_SETSEL, (WPARAM) TRUE, MAKELPARAM (selects[nIndex], 0));
  340.       lstrcpy (szRemoteName, szLocalName);
  341.       if (bInteractive)
  342.       {
  343.         FARPROC lpfnMsgProc;
  344.         
  345.         wsprintf (szDlgPrompt, "Enter remote file name for %s:", szLocalName);
  346.         lstrcpy (szDlgEdit, szRemoteName);
  347.         lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  348.         DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  349.         FreeProcInstance (lpfnMsgProc);
  350.         lstrcpy (szRemoteName, szDlgEdit);
  351.       }
  352.       wsprintf (szTmp, "Sending %s as %s (%u of %u)", szLocalName, szRemoteName, nIndex+1, nCount);
  353.       DoAddLine (szTmp);
  354.       wsprintf (szTmp, "STOR %s", szRemoteName);
  355.       nRC = SendFile (ctrl_socket, szTmp, szLocalName, fType);
  356.       SendMessage (hLbxLFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  357.     }
  358.     DeleteXferWindow();
  359.     GetRemoteDirForWnd(hWnd);
  360.   }
  361.   bOpInProgress = FALSE;
  362.   SendMessage (hTxtLBytes, WM_SETTEXT, (WPARAM) 0, (LPARAM)(LPCSTR) "");
  363.   return 0;
  364. }
  365. //*****************************************************************************
  366. //*****************************************************************************
  367. OnCmdLocalMakeDir (HWND hWnd)
  368. {
  369.   FARPROC lpfnMsgProc;
  370.   lstrcpy(szDlgPrompt, "Enter new local directory name:");
  371.   memset (szDlgEdit, '', sizeof (szDlgEdit));
  372.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  373.   DialogBox(hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  374.   FreeProcInstance (lpfnMsgProc);
  375.   _mkdir (szDlgEdit);
  376.   GetLocalDirForWnd (hWnd);
  377.   return 0;
  378. }
  379. //*****************************************************************************
  380. //*****************************************************************************
  381. OnCmdLocalRemoveDir (HWND hWnd)
  382. {
  383.   int nIndex;
  384.   if ((nIndex=(int) SendMessage (hLbxLDir, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  385.   {
  386.     SendMessage(hLbxLDir, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  387.     wsprintf (szString, "Are you sure you want to delete "%s"?", szMsgBuf);
  388.     if (MessageBox (hWnd, szString, "Verify Deletion", MB_YESNO)==IDYES)
  389.     {
  390.       if (_rmdir (szMsgBuf)==0) GetLocalDirForWnd (hWnd);
  391.     }
  392.   }
  393.   return 0;
  394. }
  395. //*****************************************************************************
  396. //*****************************************************************************
  397. OnCmdLocalDeleteFile (HWND hWnd)
  398. {
  399.   int nIndex, nCount, nNum, nRC;
  400.   char szLocalName[_MAX_PATH];
  401.   BOOL bConfirm = TRUE;
  402.   FARPROC lpfnMsgProc;
  403.   
  404.   bCancelXfer = FALSE;
  405.   bOpInProgress = TRUE;
  406.   nCount = (int) SendMessage (hLbxLFiles, LB_GETSELITEMS, 256, (LPARAM) (int *) selects);
  407.   if (nCount>0 && nCount!=LB_ERR)
  408.   {
  409.     for (nIndex=0; (nIndex<nCount); nIndex++) 
  410.          SendMessage (hLbxLFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  411.     for (nIndex=0; (nIndex<nCount)&(!bCancelXfer); nIndex++) 
  412.     {
  413.       SendMessage(hLbxLFiles, LB_GETTEXT, nNum=selects[nIndex], (LPARAM)(LPCSTR) szLocalName);
  414.       SendMessage (hLbxLFiles, LB_SETSEL, (WPARAM) TRUE, MAKELPARAM (nNum, 0));
  415.       nRC = DLG_DELETE;
  416.       if (bConfirm)
  417.       {
  418.         lstrcpy (szDlgEdit, szLocalName);
  419.         lpfnMsgProc = MakeProcInstance ((FARPROC) WS_DeleteFileProc, hInst);
  420.         nRC = DialogBox (hInst, (LPSTR) "DLG_DELETEFILE", hWnd, lpfnMsgProc);
  421.         FreeProcInstance (lpfnMsgProc);
  422.       }
  423.       switch (nRC)
  424.       {
  425.         case DLG_NOTDELETE: break;
  426.         case IDCANCEL     : nIndex = nCount+1; break;
  427.         case DLG_DELETEALL: bConfirm = FALSE;
  428.         case DLG_DELETE   : _unlink (szLocalName); break;
  429.       }
  430.       SendMessage (hLbxLFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (nNum, 0));
  431.     }
  432.     GetLocalDirForWnd (hWnd);
  433.   }
  434.   bOpInProgress = FALSE;
  435.   return 0;
  436. }
  437. //*****************************************************************************
  438. //*****************************************************************************
  439. OnCmdLocalRenameFile (HWND hWnd)
  440. {
  441.   int nIndex;
  442.   FARPROC lpfnMsgProc;
  443.   if ((nIndex=(int) SendMessage (hLbxLFiles, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  444.   {
  445.     SendMessage (hLbxLFiles, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  446.     wsprintf (szDlgPrompt, "Enter new name for "%s":", szMsgBuf);
  447.     memset (szDlgEdit, '', sizeof (szDlgEdit));
  448.     lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  449.     DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  450.     FreeProcInstance (lpfnMsgProc);
  451.     if (rename (szMsgBuf, szDlgEdit)==0) GetLocalDirForWnd (hWnd);
  452.   }
  453.   return 0;
  454. }
  455. //*****************************************************************************
  456. //*****************************************************************************
  457. OnCmdLocalHistory (HWND hWnd)
  458. {  
  459.   return 0;
  460. }
  461. //*****************************************************************************
  462. //*****************************************************************************
  463. LPSTR GetViewer (LPSTR lpLocalName, LPSTR lpVuPgm, LPSTR lpExt)
  464. {
  465.   static char szTmpViewer[_MAX_PATH];
  466.   char *lp;
  467.   lp = strchr (lpLocalName, '.');
  468.   if (lp!=NULL)
  469.   {
  470.     strncpy (lpExt, ++lp, 4); 
  471.     GetProfileString ("Extensions", lpExt, "", szTmpViewer, sizeof (szTmpViewer)-5);
  472.     if (lstrlen (szTmpViewer) > 0) 
  473.     {
  474.       lp = strchr (szTmpViewer, '^');
  475.       if (lp!=NULL) *lp = '';
  476.       lpVuPgm = szTmpViewer;
  477.     }
  478.   }
  479.   return lpVuPgm;
  480. }
  481. //*****************************************************************************
  482. //*****************************************************************************
  483. OnCmdLocalDisplay (HWND hWnd)
  484. {
  485.   char szLocalName[_MAX_PATH], szMsgBuf[_MAX_PATH], szDir[_MAX_PATH], *lpVuPgm;
  486.   char szExt[10];
  487.   int nIndex;
  488.   if((nIndex=(int) SendMessage(hLbxLFiles, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  489.   {
  490.     SendMessage (hTxtLDir, WM_GETTEXT, (WPARAM) sizeof (szDir)-1, (LPARAM)(LPCSTR) szDir);
  491.     SendMessage (hLbxLFiles, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szLocalName);
  492.     lpVuPgm = FindViewerName (szLocalName);
  493.     if (lpVuPgm==szViewer) lpVuPgm = GetViewer (szLocalName, lpVuPgm, szExt);
  494.     nIndex = lstrlen (szDir)-1;
  495.     if (szDir[nIndex]=='\') szDir[nIndex] = '';
  496.     wsprintf(szMsgBuf, "%s %s\%s", lpVuPgm, szDir, szLocalName);
  497.     if ((nIndex=WinExec((LPCSTR) szMsgBuf, SW_SHOWNORMAL))<32)
  498.     {
  499.       wsprintf (szLocalName, "Error Code was %d", nIndex);
  500.       MessageBox (hWnd, szMsgBuf, szLocalName, MB_OK);
  501.     }
  502.   }
  503.   return 0;
  504. }
  505. //*****************************************************************************
  506. //  Execute the Double Click command defined by current setting
  507. //*****************************************************************************
  508. OnCmdLButtonDblClkLocal (HWND hWnd)
  509. {
  510.   switch (bDblClkVu)
  511.   {
  512.     case FALSE: OnCmdLocalToRemote (hWnd); break;
  513.     default   : OnCmdLocalDisplay (hWnd); break;
  514.   }
  515.   return 0;
  516. }
  517. //*****************************************************************************
  518. //*****************************************************************************
  519. OnCmdLocalRefresh (HWND hWnd)
  520. {  
  521.   GetLocalDirForWnd (hWnd);
  522.   return 0;
  523. }
  524. //*****************************************************************************
  525. //*****************************************************************************
  526. OnCmdRemoteMakeDir (HWND hWnd)
  527. {
  528.   FARPROC lpfnMsgProc;
  529.   int nRC;
  530.   if (!bConnected) return 0;
  531.   lstrcpy (szDlgPrompt, "Enter new remote directory name:");
  532.   memset (szDlgEdit, '', sizeof (szDlgEdit));
  533.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  534.   DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  535.   FreeProcInstance (lpfnMsgProc);
  536.   nRC = DoMKD (ctrl_socket, szDlgEdit);
  537.   if (nRC==FTP_COMPLETE) GetRemoteDirForWnd (hWnd);
  538.   return 0;
  539. }
  540. //*****************************************************************************
  541. //*****************************************************************************
  542. OnCmdRemoteRemoveDir (HWND hWnd)
  543. {
  544.   int nIndex, nRC;
  545.   char szMsgBuf[80];
  546.   if (!bConnected) return 0;
  547.   if ((nIndex = (int) SendMessage (hLbxRDir, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  548.   {
  549.     SendMessage (hLbxRDir, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  550.     wsprintf (szString, "Are you sure you want to delete "%s"?", szMsgBuf);
  551.     if (MessageBox (hWnd, szString, "Verify Deletion", MB_YESNO)==IDYES) 
  552.     {
  553.       nRC = DoRMD (ctrl_socket, szMsgBuf);
  554.       if (nRC==FTP_COMPLETE) GetRemoteDirForWnd (hWnd);
  555.     }
  556.   }
  557.   return 0;
  558. }
  559. //*****************************************************************************
  560. //*****************************************************************************
  561. OnCmdRemoteDeleteFile (HWND hWnd)
  562. {
  563.   int nIndex, nCount, nRC;
  564.   char szRemoteName[80];
  565.   BOOL bConfirm = TRUE;
  566.   FARPROC lpfnMsgProc;
  567.   
  568.   bCancelXfer = FALSE;
  569.   bOpInProgress = TRUE;
  570.   nCount = (int) SendMessage (hLbxRFiles, LB_GETSELITEMS, 256, (LPARAM) (int *) selects);
  571.   if (nCount>0 && nCount!=LB_ERR)
  572.   {
  573.     for (nIndex=0; (nIndex<nCount); nIndex++) 
  574.          SendMessage (hLbxRFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  575.     for (nIndex=0; (nIndex<nCount)&(!bCancelXfer); nIndex++) 
  576.     {
  577.       SendMessage(hLbxRFiles, LB_GETTEXT, selects[nIndex], (LPARAM)(LPCSTR) szRemoteName);
  578.       SendMessage (hLbxRFiles, LB_SETSEL, (WPARAM) TRUE, MAKELPARAM (selects[nIndex], 0));
  579.       nRC = DLG_DELETE;
  580.       if (bConfirm)
  581.       {
  582.         lstrcpy (szDlgEdit, szRemoteName);
  583.         lpfnMsgProc = MakeProcInstance ((FARPROC) WS_DeleteFileProc, hInst);
  584.         nRC = DialogBox (hInst, (LPSTR) "DLG_DELETEFILE", hWnd, lpfnMsgProc);
  585.         FreeProcInstance (lpfnMsgProc);
  586.       }
  587.       switch (nRC)
  588.       {
  589.         case DLG_NOTDELETE: break;
  590.         case IDCANCEL     : nIndex = nCount+1; break;
  591.         case DLG_DELETEALL: bConfirm = FALSE;
  592.         case DLG_DELETE   : nRC = DoDELE (ctrl_socket, szRemoteName); break;
  593.       }
  594.       SendMessage (hLbxRFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  595.     }
  596.     GetRemoteDirForWnd (hWnd);
  597.   }
  598.   bOpInProgress = FALSE;
  599.   return 0;
  600. }
  601. //*****************************************************************************
  602. //*****************************************************************************
  603. OnCmdRemoteRenameFile (HWND hWnd)
  604. {
  605.   int nIndex, nRC;
  606.   FARPROC lpfnMsgProc;
  607.   char szRemoteName[80];
  608.  
  609.   if (!bConnected) return 0;
  610.   if ((nIndex=(int) SendMessage (hLbxRFiles, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  611.   {
  612.     SendMessage (hLbxRFiles, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szRemoteName);
  613.     wsprintf (szDlgPrompt, "Enter new name for "%s":", szRemoteName);
  614.     memset (szDlgEdit, '', sizeof (szDlgEdit));
  615.     lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  616.     nRC=DialogBox(hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  617.     FreeProcInstance (lpfnMsgProc);
  618.     if (nRC==IDOK)
  619.     {
  620.       nRC = command(ctrl_socket, "RNFR %s", szRemoteName);
  621.       if (nRC==FTP_CONTINUE) 
  622.       {
  623.         nRC=command (ctrl_socket, "RNTO %s", szDlgEdit);
  624.         if (nRC==FTP_COMPLETE) GetRemoteDirForWnd (hWnd);
  625.       }
  626.     }
  627.   }
  628.   return 0;
  629. }
  630. //*****************************************************************************
  631. //*****************************************************************************
  632. OnCmdRemoteChangeDir (HWND hWnd)
  633. {
  634.   int nIndex, nRC;
  635.   FARPROC lpfnMsgProc;
  636.   char szMsgBuf[80];
  637.   
  638.   if (!bConnected) return 0;
  639.   if ((nIndex=(int) SendMessage (hLbxRDir, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  640.   {
  641.     SendMessage (hLbxRDir, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  642.     nRC = DoCWD (ctrl_socket, szMsgBuf);
  643.     if (nRC==FTP_COMPLETE) 
  644.     {
  645.       GetRemoteDirForWnd (hWnd);
  646.     }
  647.   }
  648.   else
  649.   {
  650.     lstrcpy (szDlgPrompt, "Enter remote directory name:");
  651.     memset (szDlgEdit, '', sizeof (szDlgEdit));
  652.     lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  653.     nRC = DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  654.     FreeProcInstance (lpfnMsgProc);
  655.     if (nRC==IDOK)
  656.     {
  657.       nRC = DoCWD ((SOCKET) ctrl_socket, szDlgEdit);
  658.       if (nRC==FTP_COMPLETE)
  659.       {
  660.         GetRemoteDirForWnd (hWnd);
  661.       }
  662.     }
  663.   }
  664.   return 0;
  665. }
  666. //*****************************************************************************
  667. //*****************************************************************************
  668. OnCmdRemoteChangeDirLst (HWND hWnd)
  669. {
  670.   int nIndex, nRC;
  671.   char szMsgBuf[80];
  672.   
  673.   if (!bConnected) return 0;
  674.   if ((nIndex=(int) SendMessage (hLbxRDirLst, CB_GETCURSEL, 0, 0L))!=CB_ERR)
  675.   {
  676.     SendDlgItemMessage (hWnd, LST_RDIRLST, CB_GETLBTEXT, nIndex, (LPARAM)(LPCSTR) szMsgBuf);
  677.     nRC = DoCWD (ctrl_socket, szMsgBuf);
  678.     if (nRC==FTP_COMPLETE) 
  679.     {
  680.       GetRemoteDirForWnd (hWnd);
  681.     }
  682.   }
  683.   return 0;
  684. }
  685. //*****************************************************************************
  686. //*****************************************************************************
  687. OnCmdRemoteToLocal (HWND hWnd)
  688. {
  689.   char szTmp[80];
  690.   char szRemoteName[80];
  691.   char szLocalName[80];
  692.   int nCount, nRC, nIndex;
  693.   if (!bConnected) return 0;
  694.   bCancelXfer = FALSE;
  695.   bOpInProgress = TRUE;
  696.   nCount = (int) SendMessage (hLbxRFiles, LB_GETSELITEMS, 256, (LPARAM) (int far *) selects);
  697.   if (nCount>0 && nCount!=LB_ERR) 
  698.   {
  699.     memset (szRemoteName, '', 80);
  700.     memset (szLocalName,  '', 80);
  701.     for (nIndex=0; (nIndex<nCount); nIndex++) 
  702.          SendMessage (hLbxRFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  703.     for (nIndex=0; (nIndex<nCount)&(!bCancelXfer); nIndex++) 
  704.     {
  705.       SendMessage (hLbxRFiles, LB_GETTEXT, selects[nIndex], (LPARAM)(LPCSTR) szRemoteName);
  706.       SendMessage (hLbxRFiles, LB_SETSEL, (WPARAM) TRUE, MAKELPARAM (selects[nIndex], 0));
  707.       MakeLocalName (szLocalName, szRemoteName);
  708.       if (bInteractive)
  709.       { 
  710.         FARPROC lpfnMsgProc;
  711.         
  712.         wsprintf (szDlgPrompt, "Enter local file name for %s:", szRemoteName);
  713.         lstrcpy (szDlgEdit, szLocalName);
  714.         lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  715.         DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  716.         FreeProcInstance (lpfnMsgProc);
  717.         lstrcpy (szLocalName, szDlgEdit);
  718.       }
  719.       DoPrintf ("receiving %s as %s (%u of %u)", szRemoteName, szLocalName, nIndex+1, nCount);
  720.       wsprintf (szTmp, "RETR %s", szRemoteName);
  721.       nRC = RetrieveFile ((SOCKET)ctrl_socket, (LPSTR) szTmp, (LPSTR) szLocalName, fType);
  722.       if (nRC==2) 
  723.       {
  724.         SendMessage (hLbxLFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) szRemoteName);
  725.         SendMessage (hLbxRFiles, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nIndex], 0));
  726.       }
  727.       else break;
  728.     }
  729.     DeleteXferWindow();
  730.     GetLocalDirForWnd (hWnd);
  731.   }
  732.   bOpInProgress = FALSE;
  733.   SendMessage (hTxtRBytes, WM_SETTEXT, (WPARAM) 0, (LPARAM)(LPCSTR) "");
  734.   return 0;
  735. }
  736. //*****************************************************************************
  737. //*****************************************************************************
  738. OnCmdRemoteRefresh (HWND hWnd)
  739. {  
  740.   if (!bConnected) return 0;
  741.   GetRemoteDirForWnd (hWnd);
  742.   return 0;
  743. }
  744. //*****************************************************************************
  745. //*****************************************************************************
  746. OnCmdRemoteHistory (HWND hWnd)
  747. {  
  748.   return 0;
  749. }
  750. //*****************************************************************************
  751. //*****************************************************************************
  752. OnCmdRemoteDisplay (HWND hWnd)
  753. {
  754.   char szTmp[80], *lpVuExec, *lpViewDir;
  755.   char szRemoteName[80];
  756.   char szUniqViewFile[_MAX_PATH], szExt[_MAX_EXT];
  757.   int nIndex, nRC, nViewer, nLen;
  758.   char nXferType=TYPE_A;
  759.   
  760.   if (!bConnected) return 0;
  761.   if ((nIndex=(int) SendMessage (hLbxRFiles, LB_GETCURSEL, 0, 0L))!=LB_ERR)
  762.   {
  763.     SendMessage (hLbxRFiles, LB_GETTEXT, nIndex, (LPARAM)(LPCSTR) szRemoteName);
  764.     wsprintf (szTmp, "RETR %s", szRemoteName);
  765.     nViewer = FindViewerIndex (szRemoteName);
  766.     lpVuExec = (nViewer==-1) ? GetViewer (szRemoteName, szViewer, szExt) : lpVuPgm (nViewer);
  767.     nXferType = (nViewer==-1) ? (lpVuExec==szViewer?TYPE_A:TYPE_I) : GetViewTyp (nViewer);
  768.     switch (nViewer)
  769.     {
  770.       case -1: wsprintf (szUniqViewFile, szTmpViewFile, ++nView); break;
  771.       default: lpViewDir = lpVuDir (nViewer);
  772.                nLen = lpViewDir==NULL ? 0 : lstrlen (lpViewDir);
  773.                if ((lpViewDir==NULL) || (nLen==0))
  774.                {
  775.                   wsprintf (szUniqViewFile, szTmpViewFile, ++nView); 
  776.                }
  777.                else 
  778.                {
  779.                  lstrcpy (szUniqViewFile, lpViewDir);
  780.                  if (szUniqViewFile[nLen-1]!='\') lstrcat (szUniqViewFile, "\"), nLen++;
  781.                  wsprintf (szUniqViewFile+nLen, "WFTP%04d%s", nView++, lpVuExt(nViewer));
  782.                  SendDlgItemMessage (hWnd, LST_DELFILES, LB_ADDSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) szUniqViewFile);
  783.                }
  784.     }
  785.     DoPrintf ("[1] Retrieve %s as %s", szRemoteName, szUniqViewFile);
  786.     bOpInProgress = TRUE;
  787.     nRC = RetrieveFile ((SOCKET) ctrl_socket, (LPSTR) szTmp, (LPSTR) szUniqViewFile, nXferType);
  788.     DeleteXferWindow();
  789.     bOpInProgress = FALSE;
  790.     if (nRC==2) 
  791.     {
  792.       DoPrintf ("[1] View %s as %s", szRemoteName, szUniqViewFile);
  793.       wsprintf (szString, "%s %s", lpVuExec, szUniqViewFile);
  794.       WinExec (szString, SW_SHOWNORMAL);
  795.       if ((!bRetain)&&(nView>1))
  796.       {
  797.         wsprintf (szUniqViewFile, szTmpViewFile, nView-1);
  798.         unlink (szUniqViewFile);
  799.       }
  800.     }
  801.   }
  802.   return 0;
  803. }
  804. //*****************************************************************************
  805. //  Execute the Double Click command defined by current setting
  806. //*****************************************************************************
  807. OnCmdLButtonDblClkRemote (HWND hWnd)
  808. {
  809.   switch (bDblClkVu)
  810.   {
  811.     case FALSE: OnCmdRemoteToLocal (hWnd); break;
  812.     default   : OnCmdRemoteDisplay (hWnd); break;
  813.   }
  814.   return 0;
  815. }
  816. //*****************************************************************************
  817. //*****************************************************************************
  818. OnShowTransferType (HWND hWnd)
  819. {
  820.   SendMessage (hRBascii,  BM_SETCHECK, fType==TYPE_A, 0L);
  821.   SendMessage (hRBbinary, BM_SETCHECK, fType==TYPE_I, 0L);
  822.   SendMessage (hRBl8,     BM_SETCHECK, fType==TYPE_L, 0L);
  823.   return 0;
  824. }
  825. //*****************************************************************************
  826. //*****************************************************************************
  827. OnCmdConnectHost (HWND hWnd, WORD wNotifyCode)
  828. {
  829.   FARPROC lpfnMsgProc;
  830.   int nRC;
  831.   
  832.   if (ctrl_socket==INVALID_SOCKET) 
  833.   {
  834.     lpfnMsgProc = MakeProcInstance ((FARPROC) WS_HostMsgProc, hInst);
  835.     nRC = DialogBox (hInst, (LPSTR) "DLG_HOST", hWnd, lpfnMsgProc);
  836.     FreeProcInstance (lpfnMsgProc);
  837.     if (nRC) 
  838.     {
  839.       ctrl_socket = (SOCKET) DoConnect (szRemoteHost);
  840.       if (ctrl_socket!=INVALID_SOCKET)
  841.       {
  842.         RetrieveDirList (hWnd);
  843.         if (szInitDir[0]!=0) DoCWD (ctrl_socket, szInitDir);
  844.         if (wNotifyCode==BTN_CONNECT) GetRemoteDirForWnd (hWnd);
  845.         //if (szScript[0]!='') DoRunScript (hWnd, szScript);
  846.       }
  847.     }
  848.   }
  849.   else
  850.   {
  851.     DoAddLine ("Already connected");
  852.   }
  853.   return 0;
  854. }
  855. //*****************************************************************************
  856. //*****************************************************************************
  857. OnCmdListHost (HWND hWnd)
  858. {
  859.   char szMsgBuf[_MAX_PATH+80];
  860.   
  861.   if (bConnected)
  862.   {
  863.     wsprintf (szMsgBuf, "%s %s", szViewer, szTmpDirFile);
  864.     WinExec (szMsgBuf, SW_SHOWNORMAL);
  865.   }
  866.   return 0;
  867. }
  868. //*****************************************************************************
  869. //  Display the long dir listing
  870. //*****************************************************************************
  871. OnCmdNListHost (HWND hWnd, WORD wNotifyCode)
  872. {
  873.   char szMsgBuf[_MAX_PATH+80];
  874.   
  875.   if (wNotifyCode==CMD_NLST)
  876.   {
  877.     if(DoDirList ((SOCKET)ctrl_socket, "NLST")!=FTP_COMPLETE) return 0;
  878.   }
  879.   if (bConnected) 
  880.   {
  881.     wsprintf (szMsgBuf, "%s %s", szViewer, szCurrentDir);
  882.     WinExec (szMsgBuf, SW_SHOWNORMAL);
  883.   }
  884.   return 0;  
  885. }
  886. //*****************************************************************************
  887. //*****************************************************************************
  888. OnCmdLogToFile (HWND hWnd, WORD wCtlID)
  889. {
  890.   HMENU hMenu = GetMenu (hWnd);
  891.   UINT nState = GetMenuState (hMenu, IDM_LOGTOFILE, MF_BYCOMMAND);
  892.                 
  893.   CheckMenuItem (hMenu, IDM_LOGTOFILE, nState=(nState==MF_CHECKED)?MF_UNCHECKED:MF_CHECKED);
  894.   nLogFlag = nState;
  895.   return 0;
  896. }
  897. //*****************************************************************************
  898. //*****************************************************************************
  899. OnCmdLogFileName (HWND hWnd, WORD wCtlID)
  900. {
  901.   FARPROC lpfnMsgProc;
  902.   int nResult;
  903.   lstrcpy (szDlgPrompt, "Enter Log File Name:");
  904.   strcpy (szDlgEdit, szLogFile);
  905.   lpfnMsgProc = MakeProcInstance ((FARPROC)WS_InputMsgProc, hInst);
  906.   nResult = DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  907.   FreeProcInstance (lpfnMsgProc);
  908.   if (nResult==IDOK) strcpy (szLogFile, szDlgEdit);
  909.   return 0;
  910. }
  911. //*****************************************************************************
  912. //*****************************************************************************
  913. OnCmdHelpHost (HWND hWnd)
  914. {
  915.   command ((SOCKET) ctrl_socket, "HELP");
  916.   return 0;
  917. }
  918. //*****************************************************************************
  919. //*****************************************************************************
  920. OnCmdStatusHost (HWND hWnd)
  921.   FARPROC lpfnMsgProc;
  922.   
  923.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_StatMsgProc, hInst);
  924.   DialogBox (hInst, (LPSTR) "DLG_STATUS", hWnd, lpfnMsgProc);
  925.   FreeProcInstance (lpfnMsgProc);
  926.   SendMessage (hWnd, WM_COMMAND, RB_SHOWCHECKS, 0l);
  927.   return 0;
  928. }
  929. //*****************************************************************************
  930. //*****************************************************************************
  931. OnCmdPWDHost (HWND hWnd)
  932. {
  933.   DoPWD ((SOCKET) ctrl_socket);
  934.   return 0;
  935. }
  936. //*****************************************************************************
  937. //*****************************************************************************
  938. OnCmdDirOpHost (HWND hWnd, WORD wCtlID)
  939. {
  940.   FARPROC lpfnMsgProc;
  941.   int nResult;
  942.   
  943.   lstrcpy(szDlgPrompt,"Enter remote directory name:");
  944.   memset (szDlgEdit, '',sizeof (szDlgEdit));
  945.   lpfnMsgProc=MakeProcInstance((FARPROC)WS_InputMsgProc,hInst);
  946.   nResult = DialogBox(hInst,(LPSTR)"DLG_INPUT",hWnd,lpfnMsgProc);
  947.   FreeProcInstance (lpfnMsgProc);
  948.   if (nResult==IDOK) switch (wCtlID)
  949.   {
  950.     case CMD_RMD : DoRMD (ctrl_socket, szDlgEdit); break;
  951.     case CMD_MKD : DoMKD (ctrl_socket, szDlgEdit); break;
  952.   }
  953.   return 0;
  954. }
  955. //*****************************************************************************
  956. //*****************************************************************************
  957. OnCmdGetFileHost (HWND hWnd)
  958.   FARPROC lpfnMsgProc;
  959.   int nResult;
  960.   
  961.   lstrcpy (szDlgPrompt, "Enter remote file name:");
  962.   memset (szDlgEdit, '', sizeof (szDlgEdit));
  963.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  964.   nResult = DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  965.   FreeProcInstance (lpfnMsgProc);
  966.   if (nResult==IDOK)
  967.   {
  968.     wsprintf (szDlgPrompt, "RETR %s", szDlgEdit);
  969.     RetrieveFile (ctrl_socket, szDlgPrompt, szDlgEdit, fType);
  970.   }
  971.   return 0;
  972. }
  973. //*****************************************************************************
  974. //*****************************************************************************
  975. OnCmdPutFileHost (HWND hWnd)
  976.   FARPROC lpfnMsgProc;
  977.   int nResult;
  978.   
  979.   lstrcpy (szDlgPrompt, "Enter local file name:");
  980.   memset (szDlgEdit, '', sizeof (szDlgEdit));
  981.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  982.   nResult = DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  983.   FreeProcInstance (lpfnMsgProc);
  984.   if (nResult==IDOK)
  985.   {
  986.     wsprintf (szDlgPrompt, "STOR %s", szDlgEdit);
  987.     SendFile (ctrl_socket, szDlgPrompt, szDlgEdit, fType);
  988.   }
  989.   return 0;
  990. }
  991. //*****************************************************************************
  992. //*****************************************************************************
  993. OnCmdQuoteHost (HWND hWnd)
  994.   FARPROC lpfnMsgProc;
  995.   int nResult;
  996.   
  997.   lstrcpy (szDlgPrompt, "Enter command for remote host:");
  998.   memset (szDlgEdit, '', sizeof (szDlgEdit));
  999.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  1000.   nResult = DialogBox(hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  1001.   FreeProcInstance (lpfnMsgProc);
  1002.   if (nResult==IDOK) DoQUOTE ((SOCKET) ctrl_socket, szDlgEdit);
  1003.   return 0;
  1004. }
  1005. //*****************************************************************************
  1006. //*****************************************************************************
  1007. OnCmdGetCwdHost (HWND hWnd)    
  1008.   FARPROC lpfnMsgProc;
  1009.   int nResult;
  1010.   lstrcpy (szDlgPrompt, "Enter remote directory name:");
  1011.   memset (szDlgEdit, '', sizeof (szDlgEdit));
  1012.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  1013.   nResult = DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  1014.   FreeProcInstance (lpfnMsgProc);
  1015.   if (nResult==IDOK) DoCWD ((SOCKET) ctrl_socket, szDlgEdit);
  1016.   return 0;
  1017. }
  1018. //*****************************************************************************
  1019. //*****************************************************************************
  1020. OnCmdFireWallSetup (HWND hWnd)    
  1021.   FARPROC lpfnMsgProc;
  1022.   int nResult;
  1023.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_FireWallSetupProc, hInst);
  1024.   nResult = DialogBox (hInst, (LPSTR) "DLG_FIREWALL", hWnd, lpfnMsgProc);
  1025.   FreeProcInstance (lpfnMsgProc);
  1026.   return 0;
  1027. }
  1028. //*****************************************************************************
  1029. //*****************************************************************************
  1030. OnCmdAbort (HWND hWnd)
  1031.   if (!bOpInProgress) return 0;
  1032.   //ForcePacket (ctrl_socket, "ABOR");
  1033.   bCancelXfer = TRUE;
  1034.   bAborted = TRUE;
  1035.   //if (WSAIsBlocking()) WSACancelBlockingCall();
  1036.   //ForceCommand (ctrl_socket, "ABOR");
  1037.   if (nTimerID!=-1)
  1038.   {
  1039.     KillTimer (hWndMain, nTimerID);
  1040.     nTimerID = -1;
  1041.   }
  1042.   DoAddLine("Operation aborted by user");    
  1043.   return 0;
  1044. }
  1045. //*****************************************************************************
  1046. //*****************************************************************************
  1047. OnCmdAbout (HWND hWnd)
  1048.   FARPROC lpfnMsgProc;
  1049.   
  1050.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_AboutMsgProc, hInst); 
  1051.   DialogBox (hInst, (LPSTR)"DLG_ABOUT", hWnd, lpfnMsgProc);
  1052.   FreeProcInstance (lpfnMsgProc);     
  1053.   return 0;
  1054. }
  1055. //*****************************************************************************
  1056. //*****************************************************************************
  1057. OnCmdShowDebug (HWND hWnd, WORD wCtrlID)
  1058. {
  1059.   HMENU hMenu = GetMenu (hWnd);
  1060.   UINT nState = GetMenuState (hMenu, IDM_SHOWDEBUG, MF_BYCOMMAND);
  1061.                 
  1062.   CheckMenuItem (hMenu, IDM_SHOWDEBUG, nState=(nState==MF_CHECKED)?MF_UNCHECKED:MF_CHECKED);
  1063.   ShowWindow (hWndDbg, nState==MF_CHECKED?SW_SHOWNORMAL : SW_HIDE);
  1064.   return 0;
  1065. }
  1066. //*****************************************************************************
  1067. //*****************************************************************************
  1068. OnCmdSaveDir (HWND hWnd, WORD wCtrlID)
  1069. {
  1070.   HMENU hMenu = GetMenu (hWnd);
  1071.   UINT nState = GetMenuState (hMenu, IDM_SAVEDIR, MF_BYCOMMAND);
  1072.                 
  1073.   CheckMenuItem (hMenu, IDM_SAVEDIR, nState=(nState==MF_CHECKED)?MF_UNCHECKED:MF_CHECKED);
  1074.   UpdateDirListOpt (hWnd, (BOOL) (nState==MF_CHECKED)?TRUE:FALSE);
  1075.   return 0;
  1076. }
  1077. //*****************************************************************************
  1078. //*****************************************************************************
  1079. OnCmdGetHostAddr (HWND hWnd, WORD wCtlID)
  1080. {
  1081. #ifdef WIN32
  1082.   DialogBox (hInst, (LPCTSTR)"DLG_FINDHOST", hWnd, (FARPROC) WS_FindHostProc);
  1083.   return 0;
  1084. #else
  1085.   FARPROC lpfnMsgProc;
  1086.   
  1087.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_FindHostProc, hInst); 
  1088.   DialogBox (hInst, (LPSTR)"DLG_FINDHOST", hWnd, lpfnMsgProc);
  1089.   FreeProcInstance (lpfnMsgProc);     
  1090.   return 0;
  1091. #endif
  1092.   
  1093. }
  1094. //*****************************************************************************
  1095. //*****************************************************************************
  1096. OnCmdSortByType (HWND hWnd, WORD wCtlID)
  1097. {
  1098.   HMENU hMenu = GetMenu (hWnd);
  1099.   LONG lStyle;
  1100.   if (wSortType==wCtlID) return 0;
  1101.   CheckMenuItem (hMenu, wSortType, MF_UNCHECKED);
  1102.   CheckMenuItem (hMenu, wSortType=wCtlID, MF_CHECKED);
  1103.   lStyle = GetWindowLong (hLbxRFiles, GWL_STYLE);
  1104.   switch (wSortType)
  1105.   {
  1106.     case IDM_SORTBYNAME: SetWindowLong (hLbxRFiles, GWL_STYLE, lStyle | LBS_SORT); break;
  1107.     default            : SetWindowLong (hLbxRFiles, GWL_STYLE, lStyle & ~LBS_SORT); break;
  1108.   }
  1109.   GetRemoteDirForWnd (hWnd);
  1110.   return 0;
  1111. }
  1112. //*****************************************************************************
  1113. //*****************************************************************************
  1114. OnCmdDownload (HWND hWnd, WORD wCtlID)
  1115. {
  1116. //  FARPROC lpfnMsgProc;
  1117. //  lpfnMsgProc = MakeProcInstance ((FARPROC) WS_DownloadProc, hInst); 
  1118. //  DialogBox (hInst, (LPSTR)"DLG_DOWNLOAD", hWnd, lpfnMsgProc);
  1119. //  FreeProcInstance (lpfnMsgProc);     
  1120. //  GetLocalDirForWnd (hWnd);
  1121.   return 0;
  1122. }
  1123. //*****************************************************************************
  1124. //*****************************************************************************
  1125. OnCmdLFileType (HWND hWnd, WORD wCode)
  1126. {
  1127.   char szBuf[20];
  1128.   
  1129.   if (wCode!=EN_TEXTCHANGE) return 0;
  1130.   memset (szBuf, '', 20);
  1131.   SendDlgItemMessage (hWnd, EDT_LFILETYPE, WM_GETTEXT, (WPARAM) 19, (LPARAM)(LPCSTR) szBuf);
  1132.   if (lstrcmpi (szBuf, szLFileType)==0) return 0;
  1133.   GetLocalDirForWnd (hWnd);
  1134.   return 0;  
  1135. }
  1136. //*****************************************************************************
  1137. //*****************************************************************************
  1138. OnCmdRFileType (HWND hWnd, WORD wCode)
  1139. {
  1140.   char szBuf[20];
  1141.   
  1142.   if (wCode!=EN_TEXTCHANGE) return 0;
  1143.   memset (szBuf, '', 20);
  1144.   SendDlgItemMessage (hWnd, EDT_RFILETYPE, WM_GETTEXT, (WPARAM) 19, (LPARAM)(LPCSTR) szBuf);
  1145.   if (lstrcmp (szBuf, szRFileType)==0) return 0;
  1146.   GetRemoteDirForWnd (hWnd);
  1147.   return 0;  
  1148. }
  1149. LPSTR szDisconnect = "You have a transfer in progress.n"
  1150.                      "Disconnecting now may cause a GPFn"
  1151.                      "Are you sure you wish to disconnect?";
  1152. //*****************************************************************************
  1153. //*****************************************************************************
  1154. OnCmdCloseOrExit (HWND hWnd, WPARAM wParam)
  1155. {
  1156.   if (bConnected)
  1157.   {
  1158.     if (bOpInProgress)
  1159.     {
  1160.       if (MessageBox (hWnd, szDisconnect, "Verify Disconnect", MB_YESNO)!=IDYES)
  1161.           return 0;
  1162.     }
  1163.     bAborted = TRUE;
  1164.     bCancelXfer = TRUE;
  1165.     if (data_socket!=INVALID_SOCKET) data_socket = DoClose (data_socket);
  1166.     if (listen_socket!=INVALID_SOCKET) listen_socket = DoClose (listen_socket);
  1167.     if (bConnected) DoDisconnect (ctrl_socket);  // Perform Shutdown
  1168.     if (ctrl_socket!=INVALID_SOCKET) 
  1169.     {
  1170.       ctrl_socket = DoClose (ctrl_socket);
  1171.       bConnected=FALSE;
  1172.     }
  1173.     SaveDirList (hWnd);
  1174.     SendDlgItemMessage (hWnd, LST_RDIRLST, CB_RESETCONTENT, 0, 0L);
  1175.     SetWindowText (hWnd, szDefaultHdr);
  1176.   }
  1177.   switch (wParam)
  1178.   {
  1179.     case IDM_EXIT:
  1180.     case BTN_EXIT: CleanupTempFiles (hWnd);
  1181.                    SendMessage (hWnd, WM_CLOSE, 0, 0L); break;
  1182.     default: GetRemoteDirForWnd (hWnd);
  1183.   }
  1184.   return 0;
  1185. }
  1186. //*****************************************************************************
  1187. //*****************************************************************************
  1188. LRESULT OnWmCmd (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1189. {
  1190.   WORD wNotifyCode;
  1191.   WORD wCtlID;
  1192. #ifdef WIN32
  1193.   wNotifyCode = HIWORD (wParam);
  1194.   wCtlID      = LOWORD (wParam);
  1195. #else
  1196.   wNotifyCode = HIWORD (lParam);
  1197.   wCtlID      = wParam;
  1198. #endif
  1199.   bAborted = FALSE;
  1200.   switch (wCtlID)
  1201.   {
  1202.     case BTN_CLOSE:
  1203.     case BTN_EXIT :
  1204.     case IDM_EXIT : OnCmdCloseOrExit (hWnd, wCtlID); return 0;
  1205.     default       : if (bCmdInProgress) return FALSE;
  1206.   }
  1207.   switch (wCtlID)
  1208.   {
  1209.     //*******************************************************
  1210.     // Local Button Functions and Dialog Boxes
  1211.     //*******************************************************
  1212.     case LST_LDIRS   : if (wNotifyCode==LBN_DBLCLK) OnCmdLocalChangeDir (hWnd); break;
  1213.     case LST_LDIRLST : if (wNotifyCode==CBN_SELCHANGE) OnCmdLocalChangeDirLst (hWnd); break;
  1214.     case LST_LFILES  : if (wNotifyCode==LBN_DBLCLK) OnCmdLButtonDblClkLocal (hWnd); break;
  1215.     case BTN_LCHANGE : OnCmdLocalChangeDir (hWnd); break;
  1216.     case BTN_LMKDIR  : OnCmdLocalMakeDir (hWnd); break;
  1217.     case BTN_LRMDIR  : OnCmdLocalRemoveDir (hWnd); break;
  1218.     case BTN_LDELETE : OnCmdLocalDeleteFile (hWnd); break;
  1219.     case BTN_LRENAME : OnCmdLocalRenameFile (hWnd); break;
  1220.     case BTN_LREFRESH: OnCmdLocalRefresh (hWnd); break;
  1221.     case BTN_LDISPLAY: OnCmdLocalDisplay (hWnd); break;
  1222.     case BTN_LHISTORY: OnCmdLocalHistory (hWnd); break;
  1223.     case BTN_LOCAL_TO_REMOTE: OnCmdLocalToRemote (hWnd); break;
  1224.     //*******************************************************
  1225.     // Remote Button Functions and Dialog Boxes
  1226.     //*******************************************************
  1227.     case LST_RDIRS   : if (wNotifyCode==LBN_DBLCLK) OnCmdRemoteChangeDir (hWnd); break;
  1228.     case LST_RDIRLST : if (wNotifyCode==CBN_SELCHANGE) OnCmdRemoteChangeDirLst (hWnd); break;
  1229.     case LST_RFILES  : if (wNotifyCode==LBN_DBLCLK) OnCmdLButtonDblClkRemote (hWnd); break;
  1230.     case BTN_RCHANGE : OnCmdRemoteChangeDir (hWnd);    break;
  1231.     case BTN_RMKDIR  : OnCmdRemoteMakeDir (hWnd); break;
  1232.     case BTN_RRMDIR  : OnCmdRemoteRemoveDir (hWnd); break;
  1233.     case BTN_RDELETE : OnCmdRemoteDeleteFile (hWnd); break;
  1234.     case BTN_RRENAME : OnCmdRemoteRenameFile (hWnd); break;
  1235.     case BTN_RREFRESH: OnCmdRemoteRefresh (hWnd); break;
  1236.     case BTN_RDISPLAY: OnCmdRemoteDisplay (hWnd); break;
  1237.     case BTN_RHISTORY: OnCmdRemoteHistory (hWnd); break;
  1238.     case BTN_REMOTE_TO_LOCAL: OnCmdRemoteToLocal (hWnd); break;
  1239.     case RB_ASCII : fType=TYPE_A; OnShowTransferType (hWnd); break;
  1240.     case RB_BINARY: fType=TYPE_I; OnShowTransferType (hWnd); break;
  1241.     case RB_L8    : fType=TYPE_L; OnShowTransferType (hWnd); break;
  1242.     case RB_SHOWCHECKS:           OnShowTransferType (hWnd); break;
  1243. //    case CMD_TYPE_I : fType=TYPE_I; break;
  1244. //    case CMD_TYPE_A : fType=TYPE_A; break;
  1245.     
  1246.     case BTN_LONG   : OnCmdNListHost (hWnd, wCtlID); break;
  1247.     case BTN_OPTION : OnCmdStatusHost (hWnd); break;
  1248.     case BTN_CONNECT: OnCmdConnectHost (hWnd, wCtlID); break;
  1249.     case BTN_ABORT  : OnCmdAbort (hWnd); break;
  1250.     case BTN_ABOUT  : OnCmdAbout (hWnd); break;
  1251.     
  1252.     case EDT_LFILETYPE: OnCmdLFileType (hWnd, wNotifyCode); break;
  1253.     case EDT_RFILETYPE: OnCmdRFileType (hWnd, wNotifyCode); break;
  1254.     
  1255.     case IDM_SHOWDEBUG  : OnCmdShowDebug (hWnd, wCtlID); break;
  1256.     case IDM_SAVEDIR    : OnCmdSaveDir (hWnd, wCtlID); break;
  1257.     case IDM_LOGTOFILE  : OnCmdLogToFile (hWnd, wCtlID); break;
  1258.     case IDM_LOGFILENAME: OnCmdLogFileName (hWnd, wCtlID); break;
  1259.     case IDM_HOSTADDR   : OnCmdGetHostAddr (hWnd, wCtlID); break;
  1260.     case IDM_HOSTLIST   : OnCmdDisplayHostList (hWnd, wCtlID, wNotifyCode); break;
  1261.     case IDM_DROPFILES  : OnCmdDropFiles (hWnd, (LPSTR *)lParam); break;
  1262.     case IDM_ZOOMINFO   : OnCmdZoomInfo (hWnd); break;
  1263.     case IDM_FIREWALL   : OnCmdFireWallSetup (hWnd); break;
  1264.     case IDM_SORTBYDATE : OnCmdSortByType (hWnd, wCtlID); break;
  1265.     case IDM_SORTBYNAME : OnCmdSortByType (hWnd, wCtlID); break;
  1266.     case IDM_DOWNLOAD   : OnCmdDownload (hWnd, wCtlID); break;
  1267.     case BTN_CLOSE  : OnCmdCloseOrExit (hWnd, wCtlID); break;
  1268.     case IDM_EXIT   : OnCmdCloseOrExit (hWnd, wCtlID); break;
  1269.     case IDM_ABOUT  : OnCmdAbout (hWnd); break;
  1270.     
  1271.     case CMD_CONNECT: OnCmdConnectHost (hWnd, wCtlID); break;
  1272.     case CMD_LIST   : OnCmdListHost (hWnd); break;
  1273.     case CMD_NLST   : OnCmdNListHost (hWnd, wCtlID); break;
  1274.     case CMD_HELP   : OnCmdHelpHost (hWnd); break;
  1275.     case CMD_PWD    : OnCmdPWDHost (hWnd); break;
  1276.     case CMD_RMD    : OnCmdDirOpHost (hWnd, wCtlID); break;
  1277.     case CMD_MKD    : OnCmdDirOpHost (hWnd, wCtlID); break;
  1278.     case CMD_RETR   : OnCmdGetFileHost (hWnd); break;
  1279.     case CMD_STOR   : OnCmdPutFileHost (hWnd); break;
  1280.     case CMD_QUOTE  : OnCmdQuoteHost (hWnd); break;
  1281.     case CMD_CWD    : OnCmdGetCwdHost (hWnd); break;
  1282.     
  1283.     default         : if (!SubProcessAsync (hWnd, Msg, wParam, lParam))
  1284.                           return DefWindowProc (hWnd, Msg, wParam, lParam);
  1285.   }
  1286.   return 0;
  1287. }
  1288. //*****************************************************************************
  1289. //*****************************************************************************
  1290. LRESULT OnSetCursor (HWND hWnd,UINT Msg,WPARAM wParam, LPARAM lParam)
  1291. {
  1292.   switch (bCmdInProgress)
  1293.   {
  1294.     case TRUE: SetCursor (hWaitCursor); return TRUE;
  1295.     default  : return (LRESULT) DefWindowProc (hWnd, Msg, wParam, lParam); 
  1296.   }
  1297. }
  1298. //*****************************************************************************
  1299. //*****************************************************************************
  1300. LRESULT OnPaint (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1301. {
  1302.   DoMainPaint (hWnd); 
  1303.   return 0;
  1304. }
  1305. int nBtnNum=-1;
  1306. int nListView=0;
  1307. //*****************************************************************************
  1308. //*****************************************************************************
  1309. LRESULT OnRButtonDown (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1310. {
  1311.   if (nListView) return (LRESULT) 0;
  1312.   ShowWindow (GetDlgItem (hWnd, LST_DELFILES), SW_SHOWNORMAL);
  1313.   nListView = 1;
  1314.   return (LRESULT) NULL;
  1315. }
  1316. //*****************************************************************************
  1317. //*****************************************************************************
  1318. LRESULT OnRButtonUp (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1319. {
  1320.   if (!nListView) return (LRESULT) 0;
  1321.   ShowWindow (GetDlgItem (hWnd, LST_DELFILES), SW_HIDE);
  1322.   nListView = 0;
  1323.   return (LRESULT) NULL;
  1324. }
  1325. //*****************************************************************************
  1326. //*****************************************************************************
  1327. LRESULT OnLButtonDown (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1328. {
  1329.   int nBtn;
  1330.   //HWND hWndFocus, hFile;
  1331.   
  1332.   if ((nBtn=FindButtonClicked (LOWORD (lParam), HIWORD (lParam)))==-1) return (LRESULT) 0;
  1333.   if (!GetButtonEnabledStatus (nBtn)) return (LRESULT) 0;
  1334.   if (SetButtonStatus (nBtn, 1)) return (LRESULT) 0;
  1335.   DoPaintButton (hWnd, nBtnNum=nBtn, 1);
  1336.   return (LRESULT) NULL;
  1337. }
  1338. //*****************************************************************************
  1339. //*****************************************************************************
  1340. LRESULT OnLButtonUp (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1341. {
  1342.   int nBtn, nID;
  1343.   
  1344.   if (nBtnNum==-1) return (LRESULT) NULL;
  1345.   if ((nBtn=FindButtonClicked (LOWORD (lParam), HIWORD (lParam)))==-1) return (LRESULT) 0;
  1346.   if (!GetButtonEnabledStatus (nBtn)) return (LRESULT) 0;
  1347.   if (nBtn!=nBtnNum) return (LRESULT) NULL;
  1348.   if (!SetButtonStatus (nBtn, 0)) return (LRESULT) NULL;
  1349.   switch (nID=GetButtonID (nBtn))
  1350.   {
  1351.     case BTN_ABORT: OnCmdAbort (hWnd); break;
  1352. #ifdef WIN32
  1353.     default       : PostMessage (hWnd, WM_COMMAND, MAKEWPARAM (nID, WM_LBUTTONUP), 0L); break;
  1354. #else
  1355.     default       : PostMessage (hWnd, WM_COMMAND, (WPARAM) nID, 0L); break;
  1356. #endif
  1357.   }
  1358.   DoPaintButton (hWnd, nBtn, 0);
  1359.   nBtnNum = -1;
  1360.   return (LRESULT) NULL;
  1361. }
  1362. //*****************************************************************************
  1363. //*****************************************************************************
  1364. LRESULT OnMouseMove (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1365. {
  1366.   int nBtn;
  1367.   
  1368.   if ((nBtnNum==-1) || !(wParam & MK_LBUTTON)) return (LRESULT) NULL;
  1369.   if ((nBtn=FindButtonClicked (LOWORD (lParam), HIWORD (lParam)))==nBtnNum) return (LRESULT) 0;
  1370.   if (nBtnNum==-1) return (LRESULT) NULL;
  1371.   if (!SetButtonStatus (nBtnNum, 0)) return (LRESULT) NULL;
  1372.   DoPaintButton (hWnd, nBtnNum, 0);
  1373.   nBtnNum = -1;
  1374.   return (LRESULT) NULL;
  1375. }
  1376. //*****************************************************************************
  1377. //*****************************************************************************
  1378. LRESULT OnVScroll (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1379. {
  1380.   switch(wParam) 
  1381.   {
  1382.     case SB_LINEUP  : ScrollStatus (hWnd, -1); break;
  1383.     case SB_LINEDOWN: ScrollStatus (hWnd, 1) ; break;
  1384.   }
  1385.   return DefWindowProc(hWnd, Msg, wParam, lParam);
  1386. }
  1387. #ifdef WIN32
  1388. //*****************************************************************************
  1389. //*****************************************************************************
  1390. LRESULT OnCtlColorBtn (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1391. {
  1392.   if (lParam==(LPARAM) hRBascii || lParam==(LPARAM) hRBbinary || lParam==(LPARAM) hRBl8) 
  1393.   {
  1394.     SelectObject ((HDC)wParam, GetStockObject (ANSI_VAR_FONT));
  1395.     SetBkColor ((HDC) wParam, RGB (192,192,192));
  1396.     return (LRESULT) hbrGray1;
  1397.   }
  1398.   return (LRESULT) NULL;
  1399. }
  1400. //*****************************************************************************
  1401. //*****************************************************************************
  1402. LRESULT OnCtlColorStatic (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1403. {
  1404.   SelectObject ((HDC)wParam, GetStockObject (ANSI_VAR_FONT));
  1405.   SetBkColor ((HDC) wParam, RGB (192,192,192));
  1406.   return (LRESULT) hbrGray1;
  1407. }
  1408. #else
  1409. //*****************************************************************************
  1410. //*****************************************************************************
  1411. LRESULT OnCtlColor (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1412. {
  1413.   switch (HIWORD(lParam)) 
  1414.   {
  1415.     case CTLCOLOR_BTN: if (!(LOWORD(lParam)==hRBascii || LOWORD(lParam)==hRBbinary || LOWORD(lParam)==hRBl8)) 
  1416.       {
  1417.         SelectObject ((HDC)wParam, GetStockObject(ANSI_VAR_FONT));
  1418.         return (LRESULT) NULL;
  1419.       }
  1420.     case CTLCOLOR_STATIC:
  1421.                 SelectObject ((HDC)wParam, GetStockObject (ANSI_VAR_FONT));
  1422.                 SetBkColor ((HDC) wParam, RGB (192,192,192));
  1423.                 return (LRESULT) hbrGray1;
  1424.   }
  1425.   return (LRESULT) NULL;
  1426. }
  1427. #endif
  1428. //*****************************************************************************
  1429. //*****************************************************************************
  1430. LRESULT OnClose (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1431. {
  1432.   if (hWnd == hWndMain) 
  1433.   {
  1434.     if (data_socket!=INVALID_SOCKET) data_socket = DoClose (data_socket);
  1435.     if (listen_socket!=INVALID_SOCKET) listen_socket = DoClose (data_socket);
  1436.     if (ctrl_socket!=INVALID_SOCKET) ctrl_socket = DoClose (ctrl_socket);
  1437.     DragAcceptFiles (hWnd, FALSE);
  1438.     DestroyWindow (hWnd);
  1439.     SaveUserInfo();
  1440.     PostQuitMessage (0);  // Quit the application
  1441.   }
  1442.   else
  1443.   {
  1444.     DestroyWindow (hWnd);
  1445.   }
  1446.   return 0;
  1447. }
  1448. //*****************************************************************************
  1449. //*****************************************************************************
  1450. LRESULT OnSetFocus (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1451. {
  1452.   SetFocus (GetDlgItem (hWnd, EDT_LFILETYPE));
  1453.   return 0;
  1454. }
  1455. //*****************************************************************************
  1456. //*****************************************************************************
  1457. LRESULT OnKillFocus (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1458. {
  1459.   
  1460.   return 0;
  1461. }
  1462. //*****************************************************************************
  1463. //*****************************************************************************
  1464. LRESULT OnDragDropFile (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1465. {
  1466.   UINT uiFiles, uiNum;
  1467.   LPSTR *lpPtr;
  1468. #ifdef WIN32
  1469. #define  IDDROPNUM  0xFFFFFFFF
  1470. #else
  1471. #define  IDDROPNUM  0xFFFF
  1472. #endif
  1473.   uiFiles = DragQueryFile ((HANDLE) wParam, IDDROPNUM, (LPSTR) NULL, 0);
  1474.   if (uiFiles==0) return 0;
  1475.   
  1476.   lpPtr = (LPSTR *) GlobalAllocPtr (GHND, (uiFiles+2)*sizeof (LPSTR));
  1477.   if (lpPtr!=NULL) 
  1478.   {
  1479.     for (uiNum = 0; uiNum < uiFiles; uiNum++) 
  1480.     {
  1481.       lpPtr[uiNum] = (LPSTR) GlobalAllocPtr (GHND, _MAX_PATH);
  1482.       if (lpPtr[uiNum]!=NULL) DragQueryFile ((HANDLE) wParam, uiNum, lpPtr[uiNum], _MAX_PATH);
  1483.     }
  1484.     lpPtr[uiNum] = (LPSTR) NULL;
  1485.   }
  1486.   DragFinish ((HANDLE) wParam);
  1487.   PostMessage (hWnd, WM_COMMAND, (WPARAM) IDM_DROPFILES, (LPARAM) lpPtr);
  1488.   return 0;
  1489. }
  1490. //*****************************************************************************
  1491. //*****************************************************************************
  1492. LRESULT OnCreate (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1493. {
  1494.   hStdCursor=LoadCursor((HINSTANCE)NULL,IDC_ARROW);
  1495.   hWaitCursor=LoadCursor((HINSTANCE)NULL,IDC_WAIT);
  1496.   LoadUserInfo();
  1497.   CreateDebugWindow(hWnd,hInst);
  1498.   CreateSubWindows(hWnd,hInst);
  1499.   GetLocalDirForWnd(hWnd);
  1500.   GetRemoteDirForWnd(hWnd);
  1501.   SendMessage(hWnd,WM_COMMAND,RB_SHOWCHECKS,0L);
  1502.   DragAcceptFiles (hWnd, TRUE);
  1503.   CheckMenuItem (GetMenu (hWnd), IDM_LOGTOFILE, nLogFlag);
  1504.   CheckMenuItem (GetMenu (hWnd), wSortType=IDM_SORTBYNAME, MF_CHECKED);
  1505.   return 0;
  1506. }
  1507. //*****************************************************************************
  1508. //*****************************************************************************
  1509. LRESULT OnTimer (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1510. {
  1511.   if ((int) wParam==10)
  1512.   {
  1513.     KillTimer (hWndMain, 10);
  1514.     nTimerID = -1;
  1515.     if(WSAIsBlocking()) 
  1516.     {
  1517.       DoAddLine("Timer cancelled blocking call");    
  1518.       bAborted=TRUE;
  1519.       WSACancelBlockingCall();
  1520.     }
  1521.   }
  1522.   return 0;
  1523. }
  1524. //*****************************************************************************
  1525. //*****************************************************************************
  1526. LRESULT OnParentNotify (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1527. {
  1528.   static WORD wChildID=0;
  1529.   WORD wTmpID;
  1530.   int nSel, nI;
  1531.   
  1532.   if (wParam!=WM_LBUTTONDOWN) return DefWindowProc (hWnd, Msg, wParam, lParam);
  1533.   wTmpID = GetChildWindowID (lParam);
  1534.   if ((wChildID==wTmpID)||(wTmpID==0)) return 0L;
  1535.   
  1536.   switch (wChildID)
  1537.   {
  1538.     case LST_LDIRS   : 
  1539.     case LST_RDIRS   : SendDlgItemMessage (hWnd, wChildID, LB_SETCURSEL, (WPARAM) -1, 0L); break;
  1540.     case LST_LFILES  : 
  1541.     case LST_RFILES  : nSel = (int) SendDlgItemMessage (hWnd, wChildID, LB_GETSELITEMS, 256, (LPARAM) (int far *) selects);
  1542.                        if (nSel>0 && nSel!=LB_ERR) 
  1543.                        {
  1544.                          for (nI=0; nI<nSel; nI++) 
  1545.                            SendDlgItemMessage (hWnd, wChildID, LB_SETSEL, (WPARAM) FALSE, MAKELPARAM (selects[nI], 0));
  1546.                        }
  1547.                        break;
  1548.     default          : wChildID = wTmpID;
  1549.                        return DefWindowProc (hWnd, Msg, wParam, lParam);
  1550.   }
  1551.   wChildID = wTmpID;
  1552.   return 0L;
  1553. }
  1554. /************************************************************************/
  1555. /* Main Window Procedure                                                */
  1556. /* This procedure provides service routines for the Windows events      */
  1557. /* (messages) that Windows sends to the window, as well as the user     */
  1558. /* initiated events (messages) that are generated when the user selects */
  1559. /* the action bar and pulldown menu controls or the corresponding       */
  1560. /* keyboard accelerators.                                               */
  1561. /************************************************************************/
  1562. LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  1563. {
  1564.   switch (Msg)
  1565.   {
  1566.     case WM_CREATE      : return OnCreate (hWnd, Msg, wParam, lParam); break;
  1567.     case WM_TIMER       : return OnTimer  (hWnd, Msg, wParam, lParam); break;
  1568.     case WM_COMMAND     : return OnWmCmd  (hWnd, Msg, wParam, lParam); break;
  1569.     case WM_SETCURSOR   : return OnSetCursor (hWnd, Msg, wParam, lParam); break;
  1570.     case WM_PAINT       : return OnPaint  (hWnd, Msg, wParam, lParam); break;
  1571.     case WM_LBUTTONDOWN : return OnLButtonDown (hWnd, Msg, wParam, lParam); break;
  1572.     case WM_LBUTTONUP   : return OnLButtonUp (hWnd, Msg, wParam, lParam); break;
  1573.     case WM_MOUSEMOVE   : return OnMouseMove (hWnd, Msg, wParam, lParam); break;
  1574.     case WM_VSCROLL     : return OnVScroll (hWnd, Msg, wParam, lParam); break;
  1575.     case WM_KILLFOCUS   : return OnKillFocus (hWnd, Msg, wParam, lParam); break;
  1576.     case WM_SETFOCUS    : return OnSetFocus (hWnd, Msg, wParam, lParam); break;
  1577.     case WM_PARENTNOTIFY: return OnParentNotify (hWnd, Msg, wParam, lParam); break;
  1578.     case WM_DROPFILES   : return OnDragDropFile (hWnd, Msg, wParam, lParam); break;
  1579.     case WM_CLOSE       : return OnClose  (hWnd, Msg, wParam, lParam); break;
  1580.     //case WM_RBUTTONDOWN : return OnRButtonDown (hWnd, Msg, wParam, lParam); break;
  1581.     //case WM_RBUTTONUP   : return OnRButtonUp (hWnd, Msg, wParam, lParam); break;
  1582. #ifdef WIN32
  1583.     case WM_CTLCOLORBTN   : return OnCtlColorBtn (hWnd, Msg, wParam, lParam); break; 
  1584.     case WM_CTLCOLORSTATIC: return OnCtlColorStatic (hWnd, Msg, wParam, lParam); break;
  1585. #else
  1586.     case WM_CTLCOLOR    : return OnCtlColor (hWnd, Msg, wParam, lParam); break;
  1587. #endif
  1588.     
  1589.     default             : return DefWindowProc (hWnd, Msg, wParam, lParam);
  1590.   }
  1591.   return 0L;
  1592. }
  1593. /************************************************************************/
  1594. /************************************************************************/
  1595. void CreateTempFileNames (LPSTR szTempDir)
  1596. {
  1597.   char szDir[100], *lp;
  1598.   
  1599.   lstrcpy (szDir, szTempDir);
  1600.   lp = szDir;
  1601.   if (lstrlen (lp)>0) lp += lstrlen (lp)-1;
  1602.   if (*lp=='\') *lp='';
  1603.   wsprintf (szTmpDirFile,  "%s\%s", szDir, szTmpDirFileName);
  1604.   wsprintf (szTmpViewFile, "%s\%s", szDir, szTmpViewFileName);
  1605. }
  1606. /************************************************************************/
  1607. /* Misc Dialog Window Procedures                                        */
  1608. /************************************************************************/
  1609. BOOL CALLBACK WS_AboutMsgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
  1610.   switch (Msg)
  1611.   {
  1612.     case WM_INITDIALOG: 
  1613.       {
  1614.         char szVer[80];
  1615.         LPSTR szStamp = __DATE__;
  1616.         wsprintf (szVer, "Version %s", szStamp);
  1617.         SetWindowText (GetDlgItem (hDlg, IDC_VERSION), szVer);
  1618.         cwCenter (hDlg, 0); 
  1619.       } break;
  1620.     case WM_CLOSE     : PostMessage (hDlg, WM_COMMAND, IDCANCEL, 0L); break;
  1621.     case WM_COMMAND   : switch (wParam)
  1622.       {
  1623.         case IDOK     : EndDialog(hDlg, TRUE); return TRUE;
  1624.         case IDCANCEL : EndDialog(hDlg, FALSE); return TRUE;
  1625.         default       : return TRUE;
  1626.       }
  1627.     default: return FALSE;
  1628.   }
  1629. }
  1630. /************************************************************************/
  1631. /************************************************************************/
  1632. BOOL CALLBACK WS_FireWallSetupProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
  1633.   switch (Msg)
  1634.   {
  1635.     case WM_INITDIALOG: 
  1636.       {
  1637.         SetDlgItemText (hDlg, IDC_FIREWALLHOST, szFireWallHost);
  1638.         SetDlgItemText (hDlg, IDC_FIREWALLUSER, szFireWallUserID);
  1639.         SetDlgItemText (hDlg, IDC_FIREWALLPASS, szFireWallUserPass);
  1640.       } break;
  1641.     case WM_CLOSE     : PostMessage (hDlg, WM_COMMAND, IDCANCEL, 0L); break;
  1642.     case WM_COMMAND   : switch (wParam)
  1643.       {
  1644.         case IDOK     : GetDlgItemText (hDlg, IDC_FIREWALLHOST, szFireWallHost, 80);
  1645.                         GetDlgItemText (hDlg, IDC_FIREWALLUSER, szFireWallUserID, 25);
  1646.                         GetDlgItemText (hDlg, IDC_FIREWALLPASS, szFireWallUserPass, 25);
  1647.                         EndDialog(hDlg, TRUE); return TRUE;
  1648.         case IDCANCEL : EndDialog(hDlg, FALSE); return TRUE;
  1649.         default       : return TRUE;
  1650.       }
  1651.     default: return FALSE;
  1652.   }
  1653. }
  1654. //*****************************************************************************
  1655. //*****************************************************************************
  1656. BOOL CALLBACK WS_InputMsgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
  1657.   switch(Msg)
  1658.   {
  1659.     case WM_INITDIALOG: SetDlgItemText (hDlg, DLG_PROMPT, szDlgPrompt);
  1660.                         SetDlgItemText (hDlg, DLG_EDIT, szDlgEdit);
  1661.                         cwCenter (hDlg, 0);
  1662.                         break;
  1663.     //case WM_CLOSE     : PostMessage (hDlg, WM_COMMAND, IDCANCEL, 0L); break;
  1664.     case WM_COMMAND   : switch (wParam)
  1665.       {
  1666.         case IDOK     : GetDlgItemText (hDlg, DLG_EDIT, szDlgEdit, 70);
  1667.                         EndDialog (hDlg, TRUE);
  1668.                         break;
  1669.         case IDCANCEL : EndDialog (hDlg, FALSE);
  1670.                         break;
  1671.       } break;
  1672.       
  1673.     default: return FALSE;
  1674.   }
  1675.   return TRUE;
  1676. }
  1677. //*****************************************************************************
  1678. //*****************************************************************************
  1679. BOOL CALLBACK WS_DeleteFileProc (HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
  1680.   switch(Msg)
  1681.   {
  1682.     case WM_INITDIALOG: SetDlgItemText (hDlg, DLG_EDIT, szDlgEdit); break;
  1683.     //case WM_CLOSE     : PostMessage (hDlg, WM_COMMAND, IDCANCEL, 0L); break;
  1684.     case WM_COMMAND   : switch (wParam)
  1685.       {
  1686.         case DLG_NOTDELETE: EndDialog (hDlg, DLG_NOTDELETE); break;
  1687.         case DLG_DELETEALL: EndDialog (hDlg, DLG_DELETEALL); break;
  1688.         case DLG_DELETE   : EndDialog (hDlg, DLG_DELETE); break;
  1689.         case IDCANCEL     : EndDialog (hDlg, IDCANCEL);   break;
  1690.       } break;
  1691.       
  1692.     default: return FALSE;
  1693.   }
  1694.   return TRUE;
  1695. }
  1696. static int nViewer=0;
  1697. //*****************************************************************************
  1698. //*****************************************************************************
  1699. void GetViewerInfo (HWND hDlg)
  1700. {
  1701.   char szExt[10], szPgm[80], szDir[80];
  1702.   LPSTR lp1, lp2, lp3;
  1703.   int nI, nTyp, nXfer;
  1704.   
  1705.   GetDlgItemText (hDlg, DLG_VIEWTYPE, szExt, 5);
  1706.   GetDlgItemText (hDlg, DLG_VIEWPGM,  szPgm, 75);
  1707.   GetDlgItemText (hDlg, DLG_VIEWDIR,  szDir, 75);
  1708.   strupr (szExt);
  1709.   
  1710.   nTyp = IsDlgButtonChecked (hDlg, DLG_VIEW_ASCII) ? TYPE_A : TYPE_I;
  1711.   lp1 = lpVuExt (nViewer);
  1712.   lp2 = lpVuPgm (nViewer);
  1713.   lp3 = lpVuDir (nViewer);
  1714.   
  1715.   nXfer = GetViewTyp (nViewer);
  1716.   if ((lstrcmp (lp1, szExt)==0)&&(lstrcmp (lp2, szPgm)==0)&&
  1717.       (lstrcmp (lp3, szDir)==0)&&(nXfer==nTyp)) return;
  1718.   for (nI=0; nI<nViewNum; nI++)
  1719.   {
  1720.     if (lstrcmp (lpVuExt (nI), szExt)==0)
  1721.     {
  1722.       lstrcpy (lpVuPgm (nI), szPgm);
  1723.       lstrcpy (lpVuDir (nI), szDir);
  1724.       SetViewTyp (nI, (char) nTyp);
  1725.       return;
  1726.     }
  1727.   }
  1728.   if (ReAllocViewer (nViewNum+1)!=NULL)
  1729.   {
  1730.     nI = nViewNum++;
  1731.     lstrcpy (lpVuExt (nI), szExt);
  1732.     lstrcpy (lpVuPgm (nI), szPgm);
  1733.     lstrcpy (lpVuDir (nI), szDir);
  1734.     SetViewTyp (nI, (char) nTyp);
  1735.   }
  1736. }
  1737. //*****************************************************************************
  1738. //*****************************************************************************
  1739. void SetViewerInfo (HWND hDlg, int nBtn)
  1740. {
  1741.   int nTyp;
  1742.   HWND hWndScroll = GetDlgItem (hDlg, DLG_SCROLLVIEWER);
  1743.         
  1744.   SetDlgItemText (hDlg, DLG_VIEWTYPE, lpVuExt (nBtn));
  1745.   SetDlgItemText (hDlg, DLG_VIEWPGM,  lpVuPgm (nBtn));
  1746.   SetDlgItemText (hDlg, DLG_VIEWDIR,  lpVuDir (nBtn));
  1747.   nTyp = GetViewTyp (nBtn);
  1748.   CheckDlgButton (hDlg, DLG_VIEW_ASCII, nTyp==TYPE_A);
  1749.   CheckDlgButton (hDlg, DLG_VIEW_BINARY, nTyp==TYPE_I);
  1750.   SetScrollRange (hWndScroll, SB_CTL, 0, nViewNum-1, FALSE);
  1751.   SetScrollPos (hWndScroll, SB_CTL, nBtn, TRUE);
  1752. }
  1753. //*****************************************************************************
  1754. //*****************************************************************************
  1755. BOOL CALLBACK WS_StatMsgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
  1756.   switch(Msg)
  1757.   {
  1758.     case WM_INITDIALOG: switch (fType)
  1759.       {
  1760.         case TYPE_A : CheckRadioButton(hDlg,RB_ASCII,RB_L8,RB_ASCII); break;
  1761.         case TYPE_I : CheckRadioButton(hDlg,RB_ASCII,RB_L8,RB_BINARY); break;
  1762.         default     : CheckRadioButton(hDlg,RB_ASCII,RB_L8,RB_L8); break;
  1763.       }
  1764.       SetDlgItemText (hDlg, DLG_EDIT, szViewer);
  1765.       SetDlgItemText (hDlg, DLG_MAILADDR, szMailAddress);
  1766.       SetDlgItemText (hDlg, DLG_TEMPDIR,  szTempDir);
  1767.       
  1768.       CheckDlgButton(hDlg, DLG_DBLCLK_VIEW, bDblClkVu);
  1769.       CheckDlgButton(hDlg, DLG_DBLCLK_XFER, !bDblClkVu);
  1770.       if (nViewNum>0) SetViewerInfo (hDlg, nViewer=0);
  1771.       
  1772.       CheckDlgButton(hDlg, CKB_VERBOSE,     bVerbose);
  1773.       CheckDlgButton(hDlg, CKB_BELL,        bBell);
  1774.       CheckDlgButton(hDlg, CKB_GLOBBING,    bDoGlob);
  1775.       CheckDlgButton(hDlg, CKB_HASH,        bHash);
  1776.       CheckDlgButton(hDlg, CKB_PROMPT,      bInteractive);
  1777.       CheckDlgButton(hDlg, CKB_MCASE,       bMCase);
  1778.       CheckDlgButton(hDlg, CKB_PORT_CMDS,   bSendPort);
  1779.       CheckDlgButton(hDlg, CKB_RECV_UNIQUE, bRecvUniq);
  1780.       CheckDlgButton(hDlg, CKB_STOR_UNIQUE, bStorUniq);
  1781.       CheckDlgButton(hDlg, CKB_CRSTRIP,     bCRstrip);
  1782.       CheckDlgButton(hDlg, CKB_AUTOSTART,   bAutoStart);
  1783.       CheckDlgButton(hDlg, CKB_RETAINFILES, bRetain);
  1784.       CheckDlgButton(hDlg, CKB_DEBUGLOG,    bDebugLog);
  1785.       break;
  1786.     case WM_CLOSE: PostMessage (hDlg, WM_COMMAND, IDCANCEL, 0L);
  1787.                    break;
  1788.     case WM_SETCURSOR: if (bCmdInProgress) SetCursor (hWaitCursor);
  1789.                        else return FALSE;
  1790.                        break;
  1791.     case WM_VSCROLL: 
  1792.     {
  1793. #ifdef WIN32
  1794.       HWND hCtl = (HWND) lParam;
  1795. #else
  1796.       HWND hCtl = (HWND) HIWORD (lParam);
  1797. #endif
  1798.                        
  1799.       if (hCtl != GetDlgItem (hDlg, DLG_SCROLLVIEWER)) return FALSE;
  1800.       GetViewerInfo (hDlg);
  1801.       switch (wParam)
  1802.       {
  1803.         case SB_LINEUP  : if (nViewer>0) nViewer--; break;
  1804.         case SB_LINEDOWN: if (nViewer<(nViewNum-1)) nViewer++; break;
  1805.         default         : return FALSE;
  1806.       }
  1807.       SetViewerInfo (hDlg, nViewer);
  1808.       return TRUE;
  1809.     }
  1810.                        
  1811.     case WM_COMMAND: switch(wParam)
  1812.       {
  1813.         case IDOK:  fType = TYPE_L;
  1814.                     if (IsDlgButtonChecked (hDlg, RB_ASCII)) fType = TYPE_A;
  1815.                     else if (IsDlgButtonChecked (hDlg, RB_BINARY)) fType = TYPE_I;
  1816.                     bDblClkVu   = IsDlgButtonChecked (hDlg, DLG_DBLCLK_VIEW);
  1817.                     bVerbose    = IsDlgButtonChecked (hDlg, CKB_VERBOSE);
  1818.                     bBell       = IsDlgButtonChecked (hDlg, CKB_BELL);
  1819.                     bDoGlob     = IsDlgButtonChecked (hDlg, CKB_GLOBBING);
  1820.                     bHash       = IsDlgButtonChecked (hDlg, CKB_HASH);
  1821.                     bInteractive= IsDlgButtonChecked (hDlg, CKB_PROMPT);
  1822.                     bMCase      = IsDlgButtonChecked (hDlg, CKB_MCASE);
  1823.                     bSendPort   = IsDlgButtonChecked (hDlg, CKB_PORT_CMDS);
  1824.                     bCRstrip    = IsDlgButtonChecked (hDlg, CKB_CRSTRIP);
  1825.                     bRecvUniq   = IsDlgButtonChecked (hDlg, CKB_RECV_UNIQUE);
  1826.                     bStorUniq   = IsDlgButtonChecked (hDlg, CKB_STOR_UNIQUE);
  1827.                     bAutoStart  = IsDlgButtonChecked (hDlg, CKB_AUTOSTART);
  1828.                     bRetain     = IsDlgButtonChecked (hDlg, CKB_RETAINFILES);
  1829.                     bDebugLog   = IsDlgButtonChecked (hDlg, CKB_DEBUGLOG);
  1830.                     GetDlgItemText (hDlg, DLG_EDIT, szViewer, 70);
  1831.                     GetDlgItemText (hDlg, DLG_MAILADDR, szMailAddress, 127);
  1832.                     GetDlgItemText (hDlg, DLG_TEMPDIR,  szTempDir, 70);
  1833.                     GetViewerInfo  (hDlg);
  1834.                     CreateTempFileNames (szTempDir);
  1835.                     EndDialog (hDlg, TRUE);
  1836.                     break;
  1837.         case IDCANCEL: EndDialog(hDlg, FALSE); break;
  1838.       }  return TRUE;
  1839.     default: return FALSE;
  1840.   }
  1841.   return TRUE;
  1842. }
  1843. #ifdef WIN32
  1844. #define  WINFTPICON   "winftpnt"
  1845. #else
  1846. #define  WINFTPICON   "winftp"
  1847. #endif
  1848. /************************************************************************/
  1849. /* nCwRegisterClasses Function                                          */
  1850. /* The following function registers all the classes of all the windows  */
  1851. /* associated with this application. The function returns an error code */
  1852. /* if unsuccessful, otherwise it returns 0.                             */
  1853. /************************************************************************/
  1854. int nCwRegisterClasses(void)
  1855. {
  1856.   WNDCLASS   wc;    // struct to define a window class
  1857.   memset(&wc, 0x00, sizeof(wc));
  1858.   wc.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW;
  1859.   wc.lpfnWndProc = WndProc;
  1860.   wc.cbClsExtra = 0;
  1861.   wc.cbWndExtra = 0;
  1862.   wc.hInstance = hInst;
  1863.   wc.hIcon = LoadIcon (hInst, WINFTPICON);
  1864.   wc.hCursor = LoadCursor ((HINSTANCE) NULL, IDC_ARROW);
  1865.   wc.hbrBackground = hbrGray1;
  1866.   wc.lpszMenuName = "WINFTP";   /* Menu Name is App Name */
  1867.   wc.lpszClassName = szAppName; /* Class Name is App Name */
  1868.   if (RegisterClass (&wc)==0) return -1;
  1869.   wc.style = CS_HREDRAW | CS_VREDRAW;
  1870.   wc.lpfnWndProc   = WndXferProc;
  1871.   wc.hIcon         = LoadIcon (hInst, WINFTPICON);
  1872.   wc.hbrBackground = hbrGray1;
  1873.   wc.lpszMenuName  = NULL;      /* Menu Name is App Name */
  1874.   wc.lpszClassName = szXferWnd; /* Class Name is App Name */
  1875.   if (RegisterClass (&wc)==0) return -1;
  1876.   wc.style = CS_HREDRAW | CS_VREDRAW;
  1877.   wc.lpfnWndProc   = WndMsgProc;
  1878.   wc.hIcon         = LoadIcon ((HINSTANCE) NULL, IDI_ASTERISK);
  1879.   wc.hbrBackground = GetStockObject (WHITE_BRUSH);
  1880.   wc.lpszMenuName  = NULL;      /* Menu Name is App Name */
  1881.   wc.lpszClassName = szMsgWnd; /* Class Name is App Name */
  1882.   if (RegisterClass (&wc)==0) return -1;
  1883.   return 0;
  1884. }
  1885. /************************************************************************/
  1886. /*  cwCenter Function                                                   */
  1887. /*  centers a window based on the client area of its parent             */
  1888. /************************************************************************/
  1889. void cwCenter(HWND hWnd, int top)
  1890. {
  1891.   POINT      pt;
  1892.   RECT       swp;
  1893.   RECT       rParent;
  1894.   int        iwidth;
  1895.   int        iheight;
  1896.   // get the rectangles for the parent and the child
  1897.   GetWindowRect (hWnd, &swp);
  1898.   GetClientRect (hWndMain, &rParent);
  1899.   // calculate the height and width for MoveWindow
  1900.   iwidth = swp.right - swp.left;
  1901.   iheight = swp.bottom - swp.top;
  1902.   // find the center point and convert to screen coordinates
  1903.   pt.x = (rParent.right - rParent.left) / 2;
  1904.   pt.y = (rParent.bottom - rParent.top) / 2;
  1905.   ClientToScreen (hWndMain, &pt);
  1906.   // calculate the new x, y starting point
  1907.   pt.x = pt.x - (iwidth / 2);
  1908.   pt.y = pt.y - (iheight / 2);
  1909.   // top will adjust the window position, up or down
  1910.   if (top) pt.y = pt.y + top;
  1911.   // move the window
  1912.   MoveWindow(hWnd, pt.x, pt.y, iwidth, iheight, FALSE);
  1913. }
  1914. /************************************************************************/
  1915. /*  CwUnRegisterClasses Function                                        */
  1916. /*  Deletes any refrences to windows resources created for this         */
  1917. /*  application, frees memory, deletes instance, handles and does       */
  1918. /*  clean up prior to exiting the window                                */
  1919. /************************************************************************/
  1920. void CwUnRegisterClasses (void)
  1921. {
  1922.   WNDCLASS   wc;    // struct to define a window class
  1923.   
  1924.   memset (&wc, 0x00, sizeof(wc));
  1925.   UnregisterClass (szAppName, hInst);
  1926.   UnregisterClass (szXferWnd, hInst);
  1927. }
  1928. //******************************************************************************
  1929. //******************************************************************************
  1930. LRESULT CALLBACK LocalDirProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  1931. {
  1932.   if (msg==WM_KEYDOWN && wParam==VK_RETURN)
  1933. #ifdef WIN32
  1934.      SendMessage (hWndMain, WM_COMMAND, MAKEWPARAM (EDT_LFILETYPE, EN_TEXTCHANGE), MAKELPARAM (hwnd, 0));
  1935. #else
  1936.      SendMessage (hWndMain, WM_COMMAND, EDT_LFILETYPE, MAKELONG (hwnd, EN_TEXTCHANGE));
  1937. #endif
  1938.   return CallWindowProc (lpfnOldLocal, hwnd, msg, wParam, lParam);
  1939. }
  1940. //******************************************************************************
  1941. //******************************************************************************
  1942. LRESULT CALLBACK RemoteDirProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  1943. {
  1944.   if (msg==WM_KEYDOWN && wParam==VK_RETURN)
  1945. #ifdef WIN32
  1946.      SendMessage (hWndMain, WM_COMMAND, MAKEWPARAM (EDT_RFILETYPE, EN_TEXTCHANGE), MAKELPARAM (hwnd, 0));
  1947. #else
  1948.      SendMessage (hWndMain, WM_COMMAND, EDT_RFILETYPE, MAKELONG (hwnd, EN_TEXTCHANGE));
  1949. #endif
  1950.   return CallWindowProc (lpfnOldRemote, hwnd, msg, wParam, lParam);
  1951. }