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

Ftp客户端

开发平台:

WINDOWS

  1. #include "ws_glob.h"
  2. #include "winftp.h"
  3. #include <stdlib.h>  
  4. #include <io.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #define MAXHOSTS 20
  8. #define GET_CBOX_INDEX(wnd,id,str) (int) SendDlgItemMessage (wnd, id, CB_SELECTSTRING, (WPARAM) 0, (LPARAM) (LPCSTR) str)
  9. LPVIEWERCFG lpViewer;
  10. LPHOSTCONFIG lpHostCfg;
  11. HANDLE hHostCfg;
  12. BOOL bSaveUID=FALSE;
  13. BOOL bSavePWD=FALSE;
  14. BOOL bSaveDir;
  15. char szCrypt[160];
  16. LPSTR lpApp          = "winftp";
  17. LPSTR szUndecipher   = "undecipherable";
  18. LPSTR szAnony        = "anonymous";
  19. LPSTR szProfHostName = "HostName";
  20. LPSTR szProfUserID   = "UserID";
  21. LPSTR szProfHostType = "HostType";
  22. LPSTR szProfTimeOut  = "TimeOut";
  23. LPSTR szProfMailAddr = "MailAddr";
  24. LPSTR szProfViewer   = "Viewer";
  25. LPSTR szProfTempDir  = "TempDir";
  26. LPSTR szProfAutoStart= "AutoStart";
  27. LPSTR szProfRetain   = "Retain";
  28. LPSTR szProfConfigNum= "ConfigNum";
  29. LPSTR szProfFlags    = "Flags";
  30. LPSTR szProfConfig   = "Config";
  31. LPSTR szProfPass     = "Pass";
  32. LPSTR szProfDir      = "Dir";
  33. LPSTR szProfScript   = "Script";
  34. LPSTR szProfFireWall = "FireWall";
  35. LPSTR szProfLogFlag  = "LogFlag";
  36. LPSTR szProfLogFile  = "LogFile";
  37. LPSTR szProfDblClk   = "DblClk";
  38. LPSTR szProfViewPgm  = "Viewer";
  39. LPSTR szProfViewTyp  = "Ext";
  40. LPSTR szProfViewXfer = "Xfer";
  41. LPSTR szProfSaveDir  = "Save";
  42. LPSTR szProfViewCount= "ViewerCount";
  43. LPSTR szProfFireWallHost = "FireWallHost";
  44. LPSTR szProfFireWallUser = "FireWallUser";
  45. LPSTR szProfFireWallPass = "FireWallPass";
  46. LPSTR lpHostTypes[] = { "AutoDetect",  "Unix",    "IBM VM",  "VMS/Multinet",
  47.                         "VMS/UCX", "FTP Software PCTCP", "CUTCP/NCSA", 
  48.                         "NOS/KA9Q", "WinQVT/Net", "IBMPC TCP/IP",
  49.                         "CHAMELEON", "SuperTCP", "SI NT/FTPD", "IBM MVS", 
  50.                         "UniSys 5000" };
  51. int nHostTypes = sizeof (lpHostTypes) / sizeof (char *);
  52. LPSTR lpAcctTypes[] = { "Account not needed", "Account Type 1", 
  53.                         "Account Type 2", "Account Type 3", 
  54.                         "Account Type 4" };
  55. extern BOOL bHELP;
  56. //******************************************************************************
  57. //******************************************************************************
  58. LPSTR GetHostName (int nI)
  59. {
  60.   if (lpHostCfg==NULL) return NULL;
  61.   if (nI>=nCfgNum) return NULL;
  62.   return lpHostCfg[nI].szHostName;
  63. }
  64. char szTmpHostType[40];
  65. //******************************************************************************
  66. //******************************************************************************
  67. LPSTR GetHostType (int nI)
  68. {
  69.   char szSection[200];
  70.   int nType;
  71.   
  72.   if (lpHostCfg==NULL) return NULL;
  73.   if (nI>=nCfgNum) return NULL;
  74.   wsprintf (szSection, "%s:%s", lpApp, lpHostCfg[nI].szConfig);
  75.   GetPrivateProfileString (szSection, szProfHostType, NULL, szTmpHostType, 29, szIniFile);
  76.   if (!isdigit (szTmpHostType[0])) return (LPSTR) szTmpHostType;
  77.   nType = atoi (szTmpHostType); 
  78.   if (nType==LB_ERR) nType = HOST_AUTO;
  79.   return lpHostTypes[nType];
  80. }
  81. //******************************************************************************
  82. //******************************************************************************
  83. LPSTR GetHostTypeValue (int nI)
  84. {
  85.   if (nI>=nHostTypes) return NULL;
  86.   return lpHostTypes[nI];
  87. }
  88. //******************************************************************************
  89. // this encryption is not secure nor is it intended to be
  90. // this is just to keep the password from being plain text
  91. // in the ini file.  I'd really recommend people don't save
  92. // their passwords
  93. //******************************************************************************
  94. LPSTR EnCrypt(LPSTR userid,LPSTR passwd)
  95. {
  96.   int nIndex;
  97.   if(lstrcmp(userid,szAnony)==0)
  98.     return(passwd);
  99.   szCrypt[0]=0;
  100.   for(nIndex=0;nIndex<lstrlen(passwd);nIndex++) 
  101.   {
  102.     wsprintf(&szCrypt[nIndex*2],"%02X",
  103.       ((char)passwd[nIndex])+nIndex);
  104.   }
  105.   return(szCrypt);
  106. }
  107. //******************************************************************************
  108. //******************************************************************************
  109. int unhex(char c) 
  110. {
  111.   if(c>'9') return(c-'7');
  112.   return (c-'0');
  113. }
  114. //******************************************************************************
  115. //******************************************************************************
  116. LPSTR DeCrypt(LPSTR userid,LPSTR passwd)
  117. {
  118.   int nIndex;
  119.   if(lstrcmp(userid,szAnony)==0)
  120.     return(passwd);
  121.   szCrypt[0]=0;
  122.   for(nIndex=0;nIndex<lstrlen(passwd);nIndex+=2) 
  123.   {
  124.     (BYTE)szCrypt[nIndex/2]=
  125.       ((unhex(passwd[nIndex])*16)+
  126.        unhex(passwd[nIndex+1]))-(nIndex/2);
  127.     szCrypt[nIndex/2+1]=0;
  128.   }
  129.   return(szCrypt);
  130. }
  131. //******************************************************************************
  132. //******************************************************************************
  133. void InitConfigLists (HWND hDlg)
  134. {
  135.   LRESULT nI;
  136.   int nIndex;
  137.   SendDlgItemMessage (hDlg,DLG_EDT_CONFIG, CB_RESETCONTENT, 0, 0L);
  138.   SendDlgItemMessage (hDlg,DLG_EDT_HOST,   CB_RESETCONTENT, 0, 0L);
  139.   if (nCfgNum==0) return;
  140.   for (nIndex=0; nIndex<nCfgNum; nIndex++)
  141.   {
  142.     if (lpHostCfg[nIndex].szConfig[0]!=0)
  143.        SendDlgItemMessage (hDlg, DLG_EDT_CONFIG, CB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpHostCfg[nIndex].szConfig);
  144.     if (lpHostCfg[nIndex].szHostName[0]!=0)
  145.     {
  146.       nI = SendDlgItemMessage (hDlg, DLG_EDT_HOST, CB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)(LPCSTR) lpHostCfg[nIndex].szHostName);
  147.       if (nI==CB_ERR) SendDlgItemMessage (hDlg,DLG_EDT_HOST,CB_ADDSTRING,0,(LPARAM)(LPCSTR) lpHostCfg[nIndex].szHostName);
  148.     }
  149.   }
  150.   SendDlgItemMessage (hDlg, DLG_EDT_CONFIG, WM_SETTEXT, 0, (LPARAM) (LPCSTR) szConfig);
  151.   SendDlgItemMessage (hDlg, DLG_EDT_HOST,   WM_SETTEXT, 0, (LPARAM) (LPCSTR) szRemoteHost);
  152.   for (nI=0; nI<5; nI++)
  153.   {
  154.     SendDlgItemMessage (hDlg, DLG_ACCOUNTTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpAcctTypes[nI]);
  155.   }
  156.   SendDlgItemMessage (hDlg, DLG_ACCOUNTTYPE, CB_SELECTSTRING, 0, (LPARAM)(LPCSTR) lpAcctTypes[nAcctType]);
  157. }
  158. //******************************************************************************
  159. //******************************************************************************
  160. SetDefaultDlgStuff(HWND hDlg, int nIndex) 
  161. {
  162.   char szSection[80], szHostType[30], szFireWall[10];
  163.   HOSTINFO Host;
  164.   
  165.   wsprintf (szSection, "%s:%s", lpApp, lpHostCfg[nIndex].szConfig);
  166.   memset (&Host, '', sizeof (HOSTINFO));
  167.   memset (szHostType, '', 30);
  168.   memset (szFireWall, '', 10);
  169.   GetPrivateProfileString (szSection, szProfUserID,   NULL, Host.szUserID,   79, szIniFile);
  170.   GetPrivateProfileString (szSection, szProfPass,     NULL, Host.szPassword, 79, szIniFile);
  171.   GetPrivateProfileString (szSection, szProfDir,      NULL, Host.szInitDir,  79, szIniFile);
  172.   GetPrivateProfileString (szSection, szProfScript,   NULL, Host.szScript,   79, szIniFile);
  173.   GetPrivateProfileString (szSection, szProfHostType, NULL, szHostType,      29, szIniFile);
  174.   GetPrivateProfileString (szSection, szProfFireWall, NULL, szFireWall,       9, szIniFile);
  175.   Host.nTimeOut = GetPrivateProfileInt (szSection, szProfTimeOut,  65, szIniFile);
  176.   Host.bSaveDir = GetPrivateProfileInt (szSection, szProfSaveDir,   0, szIniFile);
  177.   Host.bFireWall= (lstrcmpi (szFireWall, "Yes")==0)||(lstrcmp (szFireWall, "1")==0);
  178.   switch (isdigit (szHostType[0]))
  179.   {
  180.     case 0 : Host.nType = GET_CBOX_INDEX (hDlg, DLG_HOST_CBHOSTTYPE, szHostType); break;
  181.     default: Host.nType = atoi (szHostType); 
  182.   }
  183.   if (Host.nType==LB_ERR) Host.nType = HOST_AUTO;
  184.   Host.nType = __max (HOST_AUTO, __min (Host.nType, (nHostTypes-1)));
  185.   
  186.   SetDlgItemText (hDlg, DLG_EDT_SCRIPT, Host.szScript);
  187.   SetDlgItemText (hDlg, DLG_EDT_USERID, (Host.szUserID[0]!='')?Host.szUserID:szUserID);
  188.   SetDlgItemText (hDlg, DLG_EDT_PASSWD, DeCrypt (Host.szUserID, Host.szPassword));
  189.   GET_CBOX_INDEX (hDlg, DLG_HOST_CBHOSTTYPE, lpHostTypes[Host.nType]);
  190.   
  191.   CheckDlgButton (hDlg, DLG_HOST_SAVEDIR, Host.bSaveDir);
  192.   CheckDlgButton (hDlg, DLG_HOST_FIREWALL, Host.bFireWall);
  193.   SetDlgItemText (hDlg, DLG_HOST_DIR, Host.szInitDir);
  194.   SetDlgItemInt  (hDlg, DLG_HOST_TIMEOUT, Host.nTimeOut, FALSE);
  195.   return 0;
  196. }
  197. //******************************************************************************
  198. //******************************************************************************
  199. SetDefaultHostStuff (HWND hDlg,LPSTR szRHost) 
  200. {
  201.   int nIndex;
  202.   if (nCfgNum<=0) return FALSE;
  203.   for (nIndex=0; nIndex<nCfgNum; nIndex++)
  204.   {
  205.     if(lstrcmp (szRHost, lpHostCfg[nIndex].szHostName)==0) 
  206.     {
  207.       SetDlgItemText (hDlg, DLG_EDT_CONFIG, lpHostCfg[nIndex].szConfig);
  208.       SetDefaultDlgStuff (hDlg, nIndex);
  209.       break;
  210.     }
  211.   }
  212.   return TRUE;
  213. }
  214. //******************************************************************************
  215. //******************************************************************************
  216. SetDefaultConfigStuff (HWND hDlg, LPSTR szConfig) 
  217. {
  218.   int nIndex;
  219.   if (nCfgNum<=0) return FALSE;
  220.   for (nIndex=0; nIndex<nCfgNum; nIndex++)
  221.   {
  222.     if(lstrcmp (szConfig, lpHostCfg[nIndex].szConfig)==0) 
  223.     {
  224.       SetDlgItemText (hDlg,DLG_EDT_HOST, lpHostCfg[nIndex].szHostName);
  225.       SetDefaultDlgStuff (hDlg, nIndex);
  226.     }
  227.   }
  228.   return TRUE;
  229. }
  230. //********************************************************************
  231. //********************************************************************
  232. void WriteConfig (int nIndex)
  233. {
  234.   char szSection[100];
  235.   
  236.   wsprintf (szString, "CFG%d", nIndex);
  237.   WritePrivateProfileString (lpApp, szString, szConfig, szIniFile);
  238.   wsprintf (szSection, "%s:%s", lpApp, szConfig);
  239.   WritePrivateProfileString (szSection, szProfHostName, szRemoteHost, szIniFile);
  240.   if (szUserID[0]!=0) 
  241.   {
  242.     WritePrivateProfileString (szSection, szProfUserID, szUserID, szIniFile);
  243.     if (szPassWord[0]!=0) 
  244.     {
  245.       WritePrivateProfileString (szSection, szProfPass, EnCrypt (szUserID, szPassWord), szIniFile);
  246.     }
  247.   }
  248.   WritePrivateProfileString (szSection, szProfDir,      szInitDir, szIniFile);
  249.   WritePrivateProfileString (szSection, szProfScript,   szScript,  szIniFile);
  250.   WritePrivateProfileString (szSection, szProfFireWall, bFireWall?"Yes":"No",  szIniFile);
  251.   WritePrivateProfileString (szSection, szProfHostType, lpHostTypes[nHostType], szIniFile);
  252.   wsprintf (szMsgBuf, "%u", uiTimeOut / 1000);
  253.   WritePrivateProfileString (szSection, szProfTimeOut, szMsgBuf, szIniFile);
  254.   WritePrivateProfileString (szSection, szProfSaveDir, bSaveDir?"1":"0", szIniFile);
  255. }
  256. //********************************************************************
  257. //  Set the Transfer type for View operations
  258. //********************************************************************
  259. void SetViewTyp (int nI, char nTyp)
  260. {
  261.   if (nI>=nViewNum) return;
  262.   if (lpViewer==NULL) return;
  263.   lpViewer[nI].nTyp = nTyp;
  264. }
  265. //********************************************************************
  266. //  Return a Transfer type 
  267. //********************************************************************
  268. char GetViewTyp (int nI)
  269. {
  270.   if (nI>=nViewNum) return TYPE_A;
  271.   if (lpViewer==NULL) return TYPE_A;
  272.   return lpViewer[nI].nTyp;
  273. }
  274. //********************************************************************
  275. //  Return a pointer to Extension 
  276. //********************************************************************
  277. LPSTR lpVuExt (int nI)
  278. {
  279.   if (nI>=nViewNum) return (LPSTR) "";
  280.   if (lpViewer==NULL) return (LPSTR) NULL;
  281.   return lpViewer[nI].szExt;
  282. }
  283. //********************************************************************
  284. //  Return a pointer to Viewer
  285. //********************************************************************
  286. LPSTR lpVuPgm (int nI)
  287. {
  288.   if (nI>=nViewNum) return (LPSTR) "";
  289.   if (lpViewer==NULL) return (LPSTR) szViewer;
  290.   return lpViewer[nI].szViewer;
  291. }
  292. //********************************************************************
  293. //  Return a pointer to Directory
  294. //********************************************************************
  295. LPSTR lpVuDir (int nI)
  296. {
  297.   if (nI>=nViewNum) return (LPSTR) NULL;
  298.   if (lpViewer==NULL) return NULL;
  299.   return lpViewer[nI].szDir;
  300. }
  301. //********************************************************************
  302. //  ReAllocate the viewer specs buffer
  303. //********************************************************************
  304. LPSTR ReAllocViewer (int nNum)
  305. {
  306.   LPSTR lpVu;
  307.   if (lpViewer==NULL)
  308.     lpVu = (LPSTR) GlobalAllocPtr (GHND, nNum*sizeof (VIEWERCFG));
  309.   else
  310.     lpVu = (LPSTR) GlobalReAllocPtr (lpViewer, nNum*sizeof (VIEWERCFG), GHND);
  311.   if (lpVu==NULL) return NULL;
  312.   lpViewer = (LPVIEWERCFG) lpVu;
  313.   return lpVu;
  314. }
  315. //********************************************************************
  316. //  Convert type to string
  317. //********************************************************************
  318. LPSTR XferTypToStr (int nVal)
  319. {
  320.   switch (nVal)
  321.   {
  322.     case TYPE_I : return "I";
  323.     case TYPE_A : return "A";
  324.     default     : return "A";
  325.   }
  326.   return "A";
  327. }
  328. //********************************************************************
  329. //  Read the Viewer Definitions
  330. //********************************************************************
  331. void ReadViewerInfo()
  332. {
  333.   char szSection[30], szBuf[160], *lp;
  334.   int nIndex, nLast;
  335.   nViewNum  =GetPrivateProfileInt (lpApp, szProfViewCount, 0, szIniFile);
  336.   if (nViewNum==0) { lpViewer=NULL; return; };
  337.   nViewNum = __max (nViewNum, 20);
  338.   lpViewer  = (LPVIEWERCFG) GlobalAllocPtr (GHND, nViewNum * sizeof (VIEWERCFG));
  339.   wsprintf (szSection, "%s:%s", lpApp, szProfViewer);
  340.   for (nIndex=0; nIndex<nViewNum; nIndex++) 
  341.   {
  342.     wsprintf (szString,"%s%u", szProfViewPgm, nIndex+1);
  343.     GetPrivateProfileString (szSection, szString, NULL, szBuf, 155, szIniFile);
  344.     lpViewer[nIndex].nTyp = szBuf[0]=='I' ?TYPE_I:TYPE_A;
  345.     lp = strtok (szBuf+1, ",");
  346.     if (lp!=NULL) lstrcpy (lpViewer[nIndex].szExt, lp), 
  347.                   strupr (lpViewer[nIndex].szExt);
  348.     lp = strtok (NULL, ",");
  349.     if (lp!=NULL) lstrcpy (lpViewer[nIndex].szViewer, lp);
  350.     lp = strtok (NULL, ",");
  351.     if (lp!=NULL) lstrcpy (lpViewer[nIndex].szDir, lp);
  352.     if (lstrlen (lpViewer[nIndex].szViewer)>0) nLast=nIndex+1;
  353.   }
  354.   nViewNum = nLast;
  355. }
  356. //********************************************************************
  357. //  Save the Viewer Definitions
  358. //********************************************************************
  359. void SaveViewerInfo()
  360. {
  361.   char szSection[30], szBuf[30];
  362.   int nIndex, nNum=1;
  363.   LPSTR lp1, lp2;
  364.   
  365.   if (nViewNum==0) return;
  366.   wsprintf (szSection, "%d", nViewNum);
  367.   WritePrivateProfileString (lpApp, szProfViewCount, szSection, szIniFile);
  368.   wsprintf (szSection, "%s:%s", lpApp, szProfViewer);
  369.   for (nIndex=0; nIndex<nViewNum; nIndex++) 
  370.   {
  371.     lp1 = lpVuExt (nIndex);
  372.     lp2 = lpVuPgm (nIndex);
  373.     if ((lstrlen (lp1)>0) && (lstrlen (lp2)>0))
  374.     {
  375.       wsprintf (szBuf,"%s%u", szProfViewPgm, nNum++);
  376.       wsprintf (szString, "%s,%s,%s,%s", XferTypToStr (lpViewer[nIndex].nTyp), 
  377.                  lpViewer[nIndex].szExt, lpViewer[nIndex].szViewer, 
  378.                  lpViewer[nIndex].szDir);
  379.       WritePrivateProfileString (szSection, szBuf, szString, szIniFile);
  380.     }
  381.   }
  382. }
  383. //********************************************************************
  384. //  Load the User Info from the .ini file
  385. //********************************************************************
  386. void LoadUserInfo()
  387. {
  388.   char szSection[100];
  389.   char szLogFlag[10];
  390.   UINT flags;
  391.   int nIndex;
  392.   GetPrivateProfileString (lpApp, szProfConfig,   "Cica.indiana", szConfig, 79, szIniFile);
  393.   GetPrivateProfileString (lpApp, szProfHostName, "ftp.cica.indiana.edu", szRemoteHost, 79, szIniFile);
  394.   GetPrivateProfileString (lpApp, szProfUserID,   "anonymous", szUserID, 80, szIniFile);
  395.   GetPrivateProfileString (lpApp, szProfMailAddr, NULL, szMailAddress, 127, szIniFile);
  396.   GetPrivateProfileString (lpApp, szProfViewer,   "notepad", szViewer, 120, szIniFile);
  397.   GetPrivateProfileString (lpApp, szProfTempDir,  "C:\", szTempDir, 80, szIniFile);
  398.   GetPrivateProfileString (lpApp, szProfLogFile,  "C:\WINFTP.LOG", szLogFile, _MAX_PATH, szIniFile);
  399.   GetPrivateProfileString (lpApp, szProfLogFlag,  "Off", szLogFlag, 5, szIniFile);
  400.   GetPrivateProfileString (lpApp, szProfFireWallHost,  "", szFireWallHost, 80, szIniFile);
  401.   GetPrivateProfileString (lpApp, szProfFireWallUser,  "", szFireWallUserID, 30, szIniFile);
  402.   GetPrivateProfileString (lpApp, szProfFireWallPass,  "", szFireWallUserPass, 30, szIniFile);
  403.   lstrcpy (szFireWallUserPass, DeCrypt (szFireWallUserID, szFireWallUserPass));
  404.   
  405.   bAutoStart= GetPrivateProfileInt (lpApp, szProfAutoStart, bAutoStart, szIniFile);
  406.   bRetain   = GetPrivateProfileInt (lpApp, szProfRetain, 0, szIniFile);
  407.   bDblClkVu = GetPrivateProfileInt (lpApp, szProfDblClk, 0, szIniFile);
  408.   nCfgNum   = GetPrivateProfileInt (lpApp, szProfConfigNum, MAXHOSTS, szIniFile);
  409.   nCfgNum   = __max (nCfgNum, MAXHOSTS);
  410.   nLogFlag  = (lstrcmpi (szLogFlag, "Off")==0) ? MF_UNCHECKED : MF_CHECKED;
  411.   flags=GetPrivateProfileInt(lpApp, szProfFlags, 64+4+1, szIniFile);
  412.   if(flags & 1) bRecvUniq=1; else bRecvUniq=0;
  413.   if(flags & 2) bStorUniq=1; else bStorUniq=2;
  414.   if(flags & 4) bBell=1; else bBell=0;
  415.   if(flags & 8) bInteractive=1; else bInteractive=0;
  416.   if(flags & 16) bVerbose=1; else bVerbose=0;
  417.   if(flags & 32) bHash=1; else bHash=2;
  418. //if(flags & 64) bSendPort=1; else bSendPort=0;
  419.   if(flags & 128) bDoGlob=1; else bDoGlob=2;
  420.   
  421.   CreateTempFileNames (szTempDir);
  422.   
  423.   lpHostCfg = (LPHOSTCONFIG) GlobalAllocPtr (GHND, nCfgNum * sizeof (HOSTCONFIG));
  424.   for (nIndex=0; nIndex<nCfgNum; nIndex++) 
  425.   {
  426.     wsprintf (szString,"CFG%u", nIndex);
  427.     GetPrivateProfileString (lpApp, szString, NULL, lpHostCfg[nIndex].szConfig, 79, szIniFile);
  428.   }
  429.   ReadViewerInfo();
  430.   for (nIndex=0; nIndex<nCfgNum; nIndex++) 
  431.   {
  432.     if (lpHostCfg[nIndex].szConfig[0]!='')
  433.     {
  434.       wsprintf (szSection,"%s:%s", lpApp, lpHostCfg[nIndex].szConfig);
  435.       GetPrivateProfileString (szSection, szProfHostName, NULL, lpHostCfg[nIndex].szHostName, 79, szIniFile);
  436.     } 
  437.   }
  438. }
  439. //********************************************************************
  440. //  Save the User Info to the .ini file
  441. //********************************************************************
  442. void SaveUserInfo()
  443. {
  444.   UINT flags;
  445.   int nIndex;
  446.   flags=((bRecvUniq==1)?1:0) +
  447. //              ((bStorUniq==1)?2:0) +
  448.                 ((bBell==1)?4:0) +
  449.                 ((bInteractive==1)?8:0)+
  450. //              ((bHash==1)?32:0) +
  451. //              ((bSendPort==1)?64:0) +
  452. //              ((bDoGlob==1)?128:0) +
  453.                 ((bVerbose==1)?16:0);
  454.  
  455.   if (lstrlen (szFireWallHost)>0)
  456.     lstrcpy (szFireWallUserPass, EnCrypt (szFireWallUserID, szFireWallUserPass));
  457.   WritePrivateProfileString (lpApp, szProfConfig,   szConfig,     szIniFile);
  458.   WritePrivateProfileString (lpApp, szProfHostName, szRemoteHost, szIniFile);
  459.   WritePrivateProfileString (lpApp, szProfUserID,   szUserID,     szIniFile);
  460.   WritePrivateProfileString (lpApp, szProfMailAddr, szMailAddress,szIniFile);
  461.   WritePrivateProfileString (lpApp, szProfViewer,   szViewer,     szIniFile);
  462.   WritePrivateProfileString (lpApp, szProfTempDir,  szTempDir,    szIniFile);
  463.   WritePrivateProfileString (lpApp, szProfLogFile,  szLogFile,    szIniFile);
  464.   
  465.   WritePrivateProfileString (lpApp, szProfFireWallHost, szFireWallHost,     szIniFile);
  466.   WritePrivateProfileString (lpApp, szProfFireWallUser, szFireWallUserID,   szIniFile);
  467.   WritePrivateProfileString (lpApp, szProfFireWallPass, szFireWallUserPass, szIniFile);
  468.   WritePrivateProfileString(lpApp, szProfLogFlag,  (nLogFlag==MF_UNCHECKED)?"Off":"On", szIniFile);
  469.   wsprintf(szString,"%u",bAutoStart);
  470.   WritePrivateProfileString(lpApp, szProfAutoStart,szString,    szIniFile);
  471.   wsprintf(szString,"%u",bDblClkVu);
  472.   WritePrivateProfileString(lpApp, szProfDblClk,   szString,    szIniFile);
  473.   wsprintf (szString,"%d",nCfgNum);
  474.   WritePrivateProfileString (lpApp,szProfConfigNum, szString, szIniFile);
  475.   wsprintf (szString,"%d",bRetain);
  476.   WritePrivateProfileString (lpApp,szProfRetain, szString, szIniFile);
  477.   wsprintf (szString,"%u",flags);
  478.   WritePrivateProfileString (lpApp,szProfFlags, szString, szIniFile);
  479.   for (nIndex=0; nIndex<nCfgNum; nIndex++)
  480.   {
  481.     if (lpHostCfg[nIndex].szHostName[0]!=0) 
  482.     {
  483.       wsprintf (szString, "CFG%u", nIndex);
  484.       WritePrivateProfileString (lpApp, szString, lpHostCfg[nIndex].szConfig, szIniFile);
  485.     }
  486.   }
  487.   SaveViewerInfo();
  488.   GlobalFreePtr (lpViewer);
  489.   GlobalFreePtr (lpHostCfg);
  490. }
  491. //******************************************************************************
  492. // Update an Existing Configuration
  493. //******************************************************************************
  494. UpdateConfig (int nIndex)
  495. {
  496.   if (nIndex>=nCfgNum) return -1;
  497.   WriteConfig (nIndex);
  498.   return 0;
  499. }
  500. //******************************************************************************
  501. // Add a New Configuration to the Config List
  502. //******************************************************************************
  503. void ClearConfig (int nIndex)
  504. {
  505.   char szSection[100];
  506.   HOSTINFO Host;
  507.   
  508.   wsprintf (szString,"CFG%u", nIndex);
  509.   wsprintf (szSection,"%s:%s", lpApp, lpHostCfg[nIndex].szConfig);
  510.   memset (lpHostCfg+nIndex, '', sizeof (HOSTCONFIG));
  511.   memset (&Host, '', sizeof (HOSTINFO));
  512.   WritePrivateProfileString (lpApp,     szString,       Host.szConfig,   szIniFile);
  513.   WritePrivateProfileString (szSection, szProfHostName, Host.szHostName, szIniFile);
  514.   WritePrivateProfileString (szSection, szProfUserID,   Host.szUserID,   szIniFile);
  515.   WritePrivateProfileString (szSection, szProfPass,     Host.szPassword, szIniFile);
  516.   WritePrivateProfileString (szSection, szProfDir,      Host.szInitDir,  szIniFile);
  517.   WritePrivateProfileString (szSection, szProfHostType,  "0",  szIniFile);
  518.   WritePrivateProfileString (szSection, szProfTimeOut,  "65",  szIniFile);
  519. }
  520. //******************************************************************************
  521. // Add a New Configuration to the Config List
  522. //******************************************************************************
  523. AddNewConfig()
  524. {
  525.   int nIndex;
  526.   LPHOSTCONFIG lpHost;
  527.   
  528.   for (nIndex=0; nIndex<nCfgNum; nIndex++)
  529.   {
  530.     if (lpHostCfg[nIndex].szConfig[0]=='') break;
  531.   }
  532.   if (nIndex==nCfgNum)
  533.   {
  534.     lpHost = (LPHOSTCONFIG) GlobalReAllocPtr (lpHostCfg, (nCfgNum+5)*sizeof (HOSTCONFIG), GHND);
  535.     if (lpHost==NULL) return -1;
  536.     else lpHostCfg = lpHost, nCfgNum+=5;
  537.   }
  538.   if (szConfig[0]=='') wsprintf (szConfig, "Cfg.%s", szRemoteHost);
  539.   UpdateConfig (nIndex);
  540.   return 0;
  541. }
  542. //******************************************************************************
  543. // Given a Config Name, find its index
  544. //******************************************************************************
  545. int FindConfig (LPSTR lpConfig, BOOL bCase)
  546. {
  547.   int nIndex;
  548.   for (nIndex=0; nIndex<nCfgNum; nIndex++)
  549.   {
  550.     switch (bCase)
  551.     {
  552.       case TRUE : if (lstrcmp  (lpHostCfg[nIndex].szConfig, lpConfig)==0) return nIndex; break;
  553.       case FALSE: if (lstrcmpi (lpHostCfg[nIndex].szConfig, lpConfig)==0) return nIndex;
  554.     }
  555.   }
  556.   return -1;
  557. }
  558. //******************************************************************************
  559. //  Retrieve the directories associated with the configuration
  560. //******************************************************************************
  561. RetrieveDirList (HWND hWnd)
  562. {
  563. char szCfgBuf[100];
  564. char szDir[100], szDirSpec[10];
  565. int nI=0, nLen;
  566. int nIndex = FindConfig (szConfig, TRUE);
  567. if (nIndex==-1) return 0;
  568. if (lstrcmpi (szRemoteHost, lpHostCfg[nIndex].szHostName)!=0) return 0;
  569. if (!bSaveDir) return 0;
  570. wsprintf (szCfgBuf, "%s:%s", lpApp, szConfig);
  571. do
  572. {
  573. wsprintf (szDirSpec, "DIR%d", ++nI);
  574.     GetPrivateProfileString (szCfgBuf, szDirSpec, "", szDir, 95, szIniFile);
  575.     nLen=lstrlen (szDir);
  576.     if ((nLen>0) && (lstrcmp (szDir, szUndecipher)!=0))
  577.     {
  578.       SendDlgItemMessage (hWnd, LST_RDIRLST, CB_ADDSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) szDir);
  579.     }
  580. }
  581. while (nLen>0);
  582. return 0;
  583. }
  584. //******************************************************************************
  585. //  Retrieve the directories associated with the configuration
  586. //******************************************************************************
  587. SaveDirList (HWND hWnd)
  588. {
  589. char szCfgBuf[100];
  590. char szDir[100], szDirSpec[10];
  591. int nI=0, nJ, nMax;
  592. int nIndex = FindConfig (szConfig, TRUE);
  593. if (nIndex==-1) return 0;
  594. if (lstrcmpi (szRemoteHost, lpHostCfg[nIndex].szHostName)!=0) return 0;
  595. if (!bSaveDir) return 0;
  596. nMax = (int) SendDlgItemMessage (hWnd, LST_RDIRLST, CB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
  597. if (nMax==0) return 0;
  598. wsprintf (szCfgBuf, "%s:%s", lpApp, szConfig);
  599. for (nI=0, nJ=1; nI<nMax; nI++)
  600. {
  601.     SendDlgItemMessage (hWnd, LST_RDIRLST, CB_GETLBTEXT, (WPARAM) nI, (LPARAM)(LPCSTR) szDir);
  602.     if (lstrcmp (szDir, szUndecipher)!=0)
  603.     {
  604.    wsprintf (szDirSpec, "DIR%d", nJ++);
  605.       WritePrivateProfileString (szCfgBuf, szDirSpec, szDir, szIniFile);
  606.     }
  607. }
  608. return 0;
  609. }
  610. //******************************************************************************
  611. //  Retrieve the directories associated with the configuration
  612. //******************************************************************************
  613. UpdateDirListOpt (HWND hWnd, BOOL bOpt)
  614. {
  615.   bSaveDir = bOpt;
  616. return 0;
  617. }
  618. //******************************************************************************
  619. //******************************************************************************
  620. int RetrieveConfig (HWND hDlg, BOOL bFlag)
  621. {
  622.   int nRC=0;
  623.   BOOL bXlat;
  624.   memset (szScript, '', 5);
  625.   memset (szAccountPass, '', 5);
  626.   GetDlgItemText (hDlg, DLG_EDT_CONFIG, szConfig, 70);
  627.   GetDlgItemText (hDlg, DLG_EDT_HOST, szRemoteHost, 70);
  628.   GetDlgItemText (hDlg, DLG_EDT_USERID, szUserID, 15);
  629.   GetDlgItemText (hDlg, DLG_EDT_PASSWD, szPassWord, 50);
  630.   GetDlgItemText (hDlg, DLG_EDT_ACCOUNT, szAccountPass, 30);
  631.   GetDlgItemText (hDlg, DLG_EDT_SCRIPT, szScript, _MAX_PATH);
  632.   GetDlgItemText (hDlg, DLG_HOST_DIR, szInitDir, _MAX_PATH);
  633.   nRC = GetDlgItemInt (hDlg, DLG_HOST_TIMEOUT, &bXlat, FALSE);
  634.   if (!bXlat) nRC = 0; nRC = __min (nRC, 65);
  635.   uiTimeOut = ((nRC==0) ? 65 : (UINT) nRC ) * 1000;
  636.   bSavePWD = bFlag | IsDlgButtonChecked (hDlg,DLG_HOST_PASSWORD);
  637.   bSaveDir = IsDlgButtonChecked (hDlg,DLG_HOST_SAVEDIR);
  638.   bFireWall= IsDlgButtonChecked (hDlg,DLG_HOST_FIREWALL);
  639.   bAccount = (lstrlen (szAccountPass) > 0);
  640.   nAcctType = (int) SendDlgItemMessage (hDlg, DLG_ACCOUNTTYPE, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);
  641.   nHostType = (int) SendDlgItemMessage (hDlg, DLG_HOST_CBHOSTTYPE, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);
  642.   if ((!bAccount)||(nAcctType>4)) nAcctType = 0;
  643.   return 0;
  644. }
  645. //******************************************************************************
  646. //******************************************************************************
  647. ProcessConfig (HWND hDlg)
  648. {
  649.   int nIndex = FindConfig (szConfig, TRUE);
  650.   switch (nIndex)
  651.   {
  652.     case -1: AddNewConfig(); break;
  653.     default: UpdateConfig (nIndex); break;
  654.   }
  655.   return 0;
  656. }
  657. //******************************************************************************
  658. //******************************************************************************
  659. BOOL OnCmdDeleteHostConfig (HWND hDlg, WORD wCtlID, WORD wNotifyCode)
  660. {
  661.   int nIndex;
  662.   char szConfig[80];
  663.   GetDlgItemText (hDlg, DLG_EDT_CONFIG, szConfig, 70);
  664.   nIndex = FindConfig (szConfig, TRUE);
  665.   if (nIndex!=-1) ClearConfig (nIndex);
  666.   memset (szConfig, '', sizeof (szConfig));
  667.   SetDlgItemText (hDlg, DLG_EDT_CONFIG, szConfig);
  668.   SetDlgItemText (hDlg, DLG_EDT_HOST,   szConfig);
  669.   SetDlgItemText (hDlg, DLG_EDT_USERID, szConfig);
  670.   SetDlgItemText (hDlg, DLG_EDT_PASSWD, szConfig);
  671.   SetDlgItemText (hDlg, DLG_HOST_DIR,   szConfig);
  672.   SetDlgItemInt (hDlg, DLG_HOST_TIMEOUT, uiTimeOut/1000, FALSE);
  673.   InitConfigLists (hDlg);
  674.   return TRUE;
  675. }
  676. //******************************************************************************
  677. //******************************************************************************
  678. BOOL OnDlgHostInit (HWND hDlg)
  679. {
  680.   int nIndex;
  681.   
  682.   SendDlgItemMessage (hDlg, DLG_HOST_CBHOSTTYPE, CB_RESETCONTENT, (WPARAM) 0, (LPARAM) 0);
  683.   for (nIndex=0; nIndex<nHostTypes; nIndex++)
  684.   {
  685.     SendDlgItemMessage (hDlg, DLG_HOST_CBHOSTTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpHostTypes[nIndex]);
  686.   }
  687.   InitConfigLists (hDlg);
  688.   SetDlgItemText (hDlg, DLG_EDT_CONFIG, szConfig);
  689.   SetDlgItemText (hDlg, DLG_EDT_HOST, szRemoteHost);
  690.   SetDlgItemText (hDlg, DLG_EDT_USERID, szUserID);
  691.   SetDlgItemText (hDlg, DLG_EDT_PASSWD, szPassWord);
  692.   SetDlgItemText (hDlg, DLG_HOST_DIR, szInitDir);
  693.   SetDlgItemInt  (hDlg, DLG_HOST_TIMEOUT, uiTimeOut/1000, FALSE);
  694.   CheckDlgButton (hDlg, DLG_HOST_SAVEDIR, bSaveDir);
  695.   CheckDlgButton (hDlg, DLG_HOST_FIREWALL, bFireWall);
  696.   CheckDlgButton (hDlg, DLG_HOST_PASSWORD, FALSE);
  697.   if (lstrlen (szConfig)>0) SetDefaultConfigStuff (hDlg, szConfig);
  698.   else if (lstrlen (szRemoteHost)>0) SetDefaultHostStuff (hDlg, szRemoteHost);
  699.   SendDlgItemMessage (hDlg, DLG_EDT_HOST, WM_SETREDRAW, TRUE, 0l);
  700.   return TRUE;
  701. }
  702. //******************************************************************************
  703. //******************************************************************************
  704. BOOL OnCmdEditConfig (HWND hDlg, WORD wCtlID, WORD wNotifyCode)
  705. {
  706.   int nIndex;
  707.   switch (wNotifyCode)
  708.   {
  709.     case CBN_KILLFOCUS :
  710.     case CBN_EDITCHANGE: GetDlgItemText (hDlg, DLG_EDT_CONFIG, szConfig, 70);
  711.                          SetDefaultConfigStuff (hDlg, szConfig);
  712.                          return TRUE;
  713.     case CBN_SELCHANGE : if ((nIndex=(int) SendDlgItemMessage (hDlg, DLG_EDT_CONFIG, CB_GETCURSEL, 0, 0L))!=LB_ERR)
  714.                          {
  715.                            SendDlgItemMessage (hDlg, DLG_EDT_CONFIG, CB_GETLBTEXT, nIndex, (LPARAM)(LPCSTR) szConfig);
  716.                            SetDefaultConfigStuff (hDlg, szConfig);
  717.                            return TRUE;
  718.                          }
  719.   }
  720.   return FALSE;
  721. }
  722. //******************************************************************************
  723. //******************************************************************************
  724. BOOL OnCmdAnonymous (HWND hDlg, WORD wCtlID, WORD wNotifyCode)
  725. {
  726.   SetDlgItemText (hDlg, DLG_EDT_USERID, szAnony);
  727.   SetDlgItemText (hDlg, DLG_EDT_PASSWD, szMailAddress);
  728.   return TRUE;
  729. }
  730. //******************************************************************************
  731. //******************************************************************************
  732. BOOL OnCmdPassword (HWND hDlg, WORD wCtlID, WORD wNotifyCode)
  733. {
  734.   if (!IsDlgButtonChecked (hDlg, DLG_HOST_SAVE))
  735.      CheckDlgButton (hDlg, DLG_HOST_PASSWORD, FALSE);
  736.   return(FALSE);
  737. }
  738. //******************************************************************************
  739. //******************************************************************************
  740. BOOL OnCmdSaveHostConfig (HWND hDlg, WORD wCtlID, WORD wNotifyCode)
  741. {
  742.   RetrieveConfig (hDlg, TRUE);
  743.   ProcessConfig (hDlg);
  744.   InitConfigLists (hDlg);
  745.   return TRUE;
  746. }
  747. //******************************************************************************
  748. //******************************************************************************
  749. BOOL FAR PASCAL WS_HostMsgProc (HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
  750. {
  751.   switch(Message)
  752.   {
  753.     case WM_INITDIALOG: return OnDlgHostInit (hDlg);
  754.     case WM_CLOSE     : PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0L); break;
  755.     case WM_COMMAND:
  756.     {
  757. #ifdef WIN32
  758.       WORD wCtlID =  LOWORD (wParam);
  759.       WORD wNotifyCode = HIWORD(wParam);
  760. #else
  761.       WORD wCtlID =  wParam;
  762.       WORD wNotifyCode = HIWORD(lParam);
  763. #endif
  764.       
  765.       switch (wCtlID)
  766.       {
  767.         case DLG_EDT_CONFIG   : return OnCmdEditConfig (hDlg, wCtlID, wNotifyCode); 
  768.         case DLG_HOST_ANONY   : return OnCmdAnonymous (hDlg, wCtlID, wNotifyCode);
  769.         case DLG_HOST_PASSWORD: return OnCmdPassword (hDlg, wCtlID, wNotifyCode);
  770.         case IDC_DELCFG       : return OnCmdDeleteHostConfig (hDlg, wCtlID, wNotifyCode);
  771.         case IDC_SAVCFG       : return OnCmdSaveHostConfig (hDlg, wCtlID, wNotifyCode);
  772.         case IDOK             : RetrieveConfig (hDlg, FALSE);
  773.                                 EndDialog (hDlg, TRUE); return TRUE;
  774.         case IDCANCEL         : EndDialog(hDlg, FALSE); return TRUE;
  775.         default               : return FALSE;
  776.       }
  777.     }
  778.     return TRUE;
  779.     default: return FALSE;
  780.   }
  781.   return TRUE;
  782. }
  783. //********************************************************************
  784. //  Create a local Name for the file
  785. //********************************************************************
  786. MakeLocalName (LPSTR localname, LPSTR remotename)
  787. {
  788.   int nIndex;
  789.   char szRemote[_MAX_PATH], *lpRemote;
  790.   char szName[10], Ext[4], *s;
  791.   //**********************************************************
  792.   // Scan past leading periods in string
  793.   //  Copy at most eight characters to szName
  794.   //**********************************************************
  795.   
  796.   lstrcpy (szRemote, remotename); 
  797.   lpRemote=szRemote;
  798.   if ((s=strchr (szRemote, ';'))!=NULL) *s='';
  799.   while (*lpRemote!=0 && *lpRemote=='.') lpRemote++;
  800.   for (nIndex=0; nIndex<8; nIndex++)
  801.   {
  802.     if (*lpRemote!=0 && *lpRemote!='.' && *lpRemote!=' ') szName[nIndex] = *lpRemote++;
  803.     else break;
  804.   }
  805.   szName[nIndex]=0; 
  806.   Ext[0]=0;
  807.   
  808.   //**********************************************************
  809.   // Check if there are any second level names
  810.   //**********************************************************
  811.   if ((s=strchr(lpRemote,'.'))!=NULL) lpRemote=s;
  812.   
  813.   //**********************************************************
  814.   //  Scan past blanks or periods
  815.   //  Copy the next three characters at most to Extension
  816.   //**********************************************************
  817.   while ((*lpRemote!=0) && (*lpRemote=='.' || *lpRemote==' ')) lpRemote++;
  818.   if (*lpRemote!=0) 
  819.   {
  820.     for (nIndex=0; nIndex<3; nIndex++)
  821.     {
  822.       if (*lpRemote!=0) Ext[nIndex] = *lpRemote++;
  823.       else break;
  824.     }
  825.     Ext[nIndex]=0;
  826.   }
  827.   
  828.   //**********************************************************
  829.   //  Create the full local name of the local file
  830.   //**********************************************************
  831.   if (Ext[0]==0) lstrcpy (localname, szName);
  832.   else wsprintf (localname,"%s.%s",szName, Ext);
  833.   if (lstrlen (localname)==0) 
  834.   {
  835.     lstrcpy (szName,"aaremote");
  836.     lstrcpy (localname, szName);
  837.   }
  838.   if (bRecvUniq) 
  839.   {
  840.     CreateUniqueName (localname, szName, Ext);
  841.   }
  842.   return(TRUE);
  843. }
  844. //********************************************************************
  845. // used if name is last thing on the line
  846. //********************************************************************
  847. LPSTR FindName(LPSTR szLine)
  848. {
  849.   int nIndex;
  850.   char *pStr;
  851.   static char szTrim[5] = " rnt";
  852.   
  853.   nIndex = lstrlen (szLine);
  854.   
  855.   // strip trailing garbage from the line if there is any.
  856.   while ((nIndex>2) && (strchr (szTrim, szLine[nIndex-1])!=NULL))
  857.     szLine[nIndex--]=0;
  858.   // now the name SHOULD be the last thing on the line
  859.   if((pStr=strrchr(szLine,' '))!=NULL ||
  860.      (pStr=strrchr(szLine,0x09))!=NULL) 
  861.   {
  862.     while(*pStr && (*pStr==' ' || *pStr==0x09)) pStr++;
  863.     return(pStr);
  864.   }
  865.   return(szLine);
  866. }
  867. //********************************************************************
  868. //  Process Dir Line for SuperTCP, Chameleon, NCSA servers
  869. //********************************************************************
  870. void ReadDirLineSuperTCP (LPSTR lpStr)
  871. {
  872.   LPSTR pStr;
  873.   if (strstr (lpStr,"<DIR>")!=NULL) 
  874.   {
  875.     if ((pStr=strchr(lpStr,' '))!=NULL) *pStr=0;
  876.     if (lstrcmp (lpStr,".")!=0 && lstrcmp (lpStr,"..")!=0)
  877.        SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  878.   } 
  879.   else 
  880.   {
  881.     if ((pStr=strchr (lpStr,' '))!=NULL) *pStr=0;
  882.     if (lpStr[0]!=0)
  883.        SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  884.   }
  885. }
  886. //********************************************************************
  887. //  Process Dir Line for QVT/Net server
  888. //********************************************************************
  889. void ReadDirLineQVT (LPSTR lpStr)
  890. {
  891.   int nLen = lstrlen (lpStr);
  892.   
  893.   if (lpStr[nLen-1]=='/' || lpStr[nLen-1]=='\')
  894.   {
  895.     lpStr[nLen-1]=0;
  896.     if (lstrcmp(lpStr,".")!=0 && lstrcmp (lpStr,"..")!=0)
  897.         SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  898.   } 
  899.   else
  900.   {
  901.     SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  902.   }
  903. }
  904. //********************************************************************
  905. //  Process Dir Line for IBM VM servers
  906. //********************************************************************
  907. void ReadDirLineIBMVM (LPSTR lpStr)
  908. {
  909.   lpStr[12]=0;
  910.   SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  911. }
  912. //********************************************************************
  913. //  Process Dir Line for IBM MVS servers
  914. //********************************************************************
  915. void ReadDirLineIBMMVS (LPSTR lpStr)
  916. {
  917.   if (strstr (lpStr, "Lrecl")!=NULL) return;
  918.   if (lstrlen (lpStr+54)>0)
  919.      SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) (lpStr+54));
  920. }
  921. //********************************************************************
  922. //  Process Dir Line for VMS servers
  923. //********************************************************************
  924. void ReadDirLineVMS (LPSTR lpStr)
  925. {
  926.   int nLen = lstrlen (lpStr);
  927.   LPSTR lp, s;
  928.   if (*lpStr==' ') return;
  929.   if ((s=strchr(lpStr,';'))==NULL) return;
  930.                   
  931.   s++; 
  932.   while (isdigit (*s)) s++;
  933.   *s=0;
  934.   if ((nLen>4) && ((lp=strstr (lpStr,".DIR"))!=NULL))
  935.   {
  936.     *lp = 0;
  937.     SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  938.   } 
  939.   else
  940.   {
  941.     SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  942.   }
  943. }
  944. //********************************************************************
  945. //  Process Dir Line for PCTCP servers
  946. //********************************************************************
  947. void ReadDirLinePCTCP (LPSTR lpStr)
  948. {
  949.   LPSTR lp;
  950.   lpStr[30]=0; 
  951.   lp=FindName(lpStr);
  952.   if (strncmp (lpStr, "<dir>", 5)==0) 
  953.   {
  954.     if (lstrcmp(lp,".")!=0 && lstrcmp(lp,"..")!=0)
  955.          SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lp);
  956.   } 
  957.   else
  958.   {
  959.     SendMessage(hLbxRFiles,LB_ADDSTRING,0,(LPARAM)(LPCSTR) lp);
  960.   }
  961. }
  962. //********************************************************************
  963. //  Process Dir Line for SuperTCP, Chameleon, NCSA servers
  964. //********************************************************************
  965. void ReadDirLineIBMTCP (LPSTR lpStr)
  966. {
  967.   LPSTR lp;
  968.   lp = FindName (lpStr);
  969.   if (strstr (lpStr," DIR ")!=NULL) 
  970.   {
  971.     if (lstrcmp(lp,".")!=0 && lstrcmp(lp,"..")!=0)
  972.        SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lp);
  973.   } 
  974.   else
  975.   {
  976.     SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lp);
  977.   }
  978. }
  979. //********************************************************************
  980. //  Process Dir Line for SuperTCP, Chameleon, NCSA servers
  981. //********************************************************************
  982. void ReadDirLineNOS (LPSTR lpStr)
  983. {
  984.   LPSTR pStr;
  985.   int nLen, nRC;
  986.   if (strstr (lpStr,"Disk size")!=NULL) return;
  987.              
  988.   nLen=lstrlen (lpStr);
  989.   lpStr[13]=0; 
  990.   nRC=13;
  991.   while (nLen>0 && lpStr[nLen-1]==' ') lpStr[--nLen]=0;
  992.   if (*lpStr!=0) 
  993.   {
  994.     if (lpStr[nLen-1]=='/' || lpStr[nLen-1]=='\')
  995.     {
  996.       lpStr[nLen-1]=0;
  997.       if (lstrcmp (lpStr,".")!=0)
  998.         SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  999.     } 
  1000.     else
  1001.     {
  1002.       SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) lpStr);
  1003.     }
  1004.   }
  1005.   pStr=lpStr+41; 
  1006.   nRC=13; 
  1007.   pStr[nRC]=0;
  1008.   while ((nRC=lstrlen(pStr))>0 && pStr[nRC-1]==' ') pStr[nRC-1]=0;
  1009.   if (*pStr=='') return;
  1010.   nLen = lstrlen (pStr);
  1011.   if (pStr[nLen-1]=='/' || pStr[nLen-1]=='\')
  1012.   {
  1013.     pStr[nLen-1]=0;
  1014.     if (lstrcmp (pStr,".")!=0 && lstrcmp (pStr,"..")!=0)
  1015.        SendMessage (hLbxRDir, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) pStr);
  1016.   } 
  1017.   else
  1018.   {
  1019.     SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) pStr);
  1020.   }
  1021. }
  1022. //********************************************************************
  1023. //  Process Dir Line for SuperTCP, Chameleon, NCSA servers
  1024. //********************************************************************
  1025. void ReadDirLineUNIX (LPSTR lpStr)
  1026. {
  1027.   LPSTR pStr;
  1028.   // assume UNIX ls format
  1029.   // if line starts with 'd' its a directory
  1030.   
  1031.   pStr = FindName (lpStr);
  1032.   if (lpStr[0]=='d')
  1033.   {
  1034.     if (lstrcmp (pStr,".")!=0 && lstrcmp (pStr,"..")!=0)
  1035.       SendMessage(hLbxRDir,LB_ADDSTRING,0,(LPARAM)(LPCSTR) pStr);
  1036.   } 
  1037.   else if (lpStr[0]=='l')
  1038.   {
  1039.     SendMessage (hLbxRDir,LB_ADDSTRING,0,(LPARAM)(LPCSTR) pStr);
  1040.     SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) pStr);
  1041.   } 
  1042.   else
  1043.   {
  1044.     // if line starts with - or f its a file
  1045.     if (nHostType==HOST_SINTFTPD || strchr ("-f", lpStr[0])!=NULL) 
  1046.     {
  1047.       SendMessage (hLbxRFiles, LB_ADDSTRING, 0, (LPARAM)(LPCSTR) pStr);
  1048.     }
  1049.   }
  1050. }
  1051. //********************************************************************
  1052. //  Get the Remote directory listing
  1053. //********************************************************************
  1054. int GetRemoteDirForWnd (HWND hWnd)
  1055. {
  1056.   char *pStr;
  1057.   FILE *fd;
  1058.   int nRC, nLen;
  1059.   //***************************************************************
  1060.   // clean out the old contents of the list boxes
  1061.   //***************************************************************
  1062.   SendMessage (hLbxRDir,   LB_RESETCONTENT, 0, 0);
  1063.   SendMessage (hLbxRFiles, LB_RESETCONTENT, 0, 0);
  1064.   //***************************************************************
  1065.   // can't do much if we aren't connected
  1066.   //***************************************************************
  1067.   if (!bConnected) 
  1068.   {
  1069.     SendMessage (hTxtRDir, WM_SETTEXT,0,(LPARAM)(LPCSTR) "");
  1070.     if (bHELP) DoAddLine ("Connection Closed"), bHELP = FALSE;
  1071.     return 0;
  1072.   }
  1073.   //***************************************************************
  1074.   // For the first time round, do the Help command now to avoid
  1075.   // Undecipherable in the Directory window.
  1076.   //***************************************************************
  1077.   if (!bHELP) ReadProcessHelp (hWnd, ctrl_socket);
  1078.   
  1079.   //***************************************************************
  1080.   // get the remote directory name
  1081.   //***************************************************************
  1082.   lstrcpy (szString, szUndecipher);
  1083.   nRC = DoPWD (ctrl_socket);
  1084.   if (nRC==FTP_COMPLETE) 
  1085.   {
  1086.     if ((pStr=strchr (szMsgBuf,'"'))!=NULL) strncpy (szString,++pStr,180);
  1087.     else ConvertSourceDir (szMsgBuf, szString, 100);
  1088.     if ((pStr=strchr (szString,'"'))!=NULL) *pStr=0;
  1089.     else szString[180]=0;
  1090.   }
  1091.   //***************************************************************
  1092.   // DLG_RDIRECTORY (directory name)
  1093.   //***************************************************************
  1094.   SendMessage (hTxtRDir, WM_SETTEXT, 0, (LPARAM)(LPCSTR) szString);
  1095.   AddDirToList (hWnd, LST_RDIRLST, szString);
  1096.   SendDlgItemMessage (hWnd, LST_RDIRLST, CB_SELECTSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) szString);
  1097.   //***************************************************************
  1098.   // go get the current remote directory listing in tmpfile.tmp
  1099.   // get the file type, check for all files, if not, append to the
  1100.   // LIST request about to be issued to the remote host
  1101.   //***************************************************************
  1102.   lstrcpy (szString, "LIST");
  1103.   if ((wSortType==IDM_SORTBYDATE) && (nHostType==HOST_UNIX || nHostType==HOST_AUTO))
  1104. //  if (wSortType==IDM_SORTBYDATE)
  1105.   {
  1106.     lstrcat (szString, " -lt");
  1107.   }
  1108.   nLen = lstrlen (szString);
  1109.   szString[nLen++] = '';
  1110.   SetDebugWindowText ("WinFTP List");
  1111.   SendDlgItemMessage (hWnd, EDT_RFILETYPE, WM_GETTEXT, (WPARAM) 80, (LPARAM)(LPCSTR)(szString+nLen));
  1112.   if ((lstrlen (szString+nLen)>0) && (lstrcmp (szString+nLen,"*")!=0)) szString[nLen-1] = ' ';
  1113.   nRC = DoDirList (ctrl_socket, szString);
  1114.   SetDebugWindowText (lpDebugWindow);
  1115.   SendMessage (hLbxRDir, LB_ADDSTRING,0, (LPARAM)(LPCSTR) "..");
  1116.   if (nRC!=FTP_COMPLETE)
  1117.   {
  1118.     DoPrintf ("Directory List Error (Code %u)", nRC);
  1119.     return 0;
  1120.   }
  1121.   if ((fd=fopen (szCurrentDir,"r"))==NULL)
  1122.   {
  1123.     DoAddLine ("Couldn't open TempDirFile for reading.");
  1124.     return 0;
  1125.   }
  1126.   while (fgets (szString,180,fd)!=NULL)
  1127.   {
  1128.     if ((pStr=strchr (szString,'n'))!=NULL) *pStr=0;
  1129.     switch (nHostType) 
  1130.     {
  1131.       case HOST_SUPER       : ReadDirLineSuperTCP (szString); break;
  1132.       case HOST_CHAMELEON   : ReadDirLineSuperTCP (szString); break;
  1133.       case HOST_NCSA        : ReadDirLineSuperTCP (szString); break;
  1134.       case HOST_QVT         : ReadDirLineQVT (szString); break;
  1135.       case HOST_IBM_VM      : ReadDirLineIBMVM (szString); break;
  1136.       case HOST_MVS         : ReadDirLineIBMMVS (szString); break;
  1137.       case HOST_VMS_UCX     : ReadDirLineVMS (szString); break;
  1138.       case HOST_VMS_MULTINET: ReadDirLineVMS (szString); break;
  1139.       case HOST_PCTCP       : ReadDirLinePCTCP (szString); break;
  1140.       case HOST_IBM_TCP     : ReadDirLineIBMTCP (szString); break;
  1141.       case HOST_NOS         : ReadDirLineNOS (szString); break;
  1142.       case HOST_SINTFTPD    : ReadDirLineUNIX (szString); break;
  1143.       case HOST_U5000       : ReadDirLineUNIX (szString); break;
  1144.       case HOST_UNIX        : ReadDirLineUNIX (szString); break;
  1145.       default               : ReadDirLineUNIX (szString); break;
  1146.     }
  1147.   }
  1148.   fclose(fd);
  1149.   return 0;
  1150. }
  1151. extern BOOL bCanMKD,bCanRMD,bCanREN,bCanDELE;
  1152. //********************************************************************
  1153. //  Show Flag Settings
  1154. //********************************************************************
  1155. void ShowOurFlags()
  1156. {
  1157.   DoPrintf("MKD=%u RMD=%u REN=%u DEL=%u HostType=%u",
  1158.     bCanMKD,bCanRMD,bCanREN,bCanDELE,nHostType);
  1159. }
  1160. //********************************************************************
  1161. //  Process Help Info
  1162. //********************************************************************
  1163. int ReadProcessHelp (HWND hWnd, SOCKET ctrl_socket)
  1164. {
  1165.   int iRetCode;
  1166.   BOOL bCanSYST;
  1167.   bCanMKD=bCanRMD=bCanREN=bCanDELE=bCanSYST=FALSE;
  1168.   if (SendPacket (ctrl_socket,"HELP")!=-1) 
  1169.   {
  1170.     SetDebugWindowText ("WSFTP Help");
  1171.     iRetCode=ReadLine(ctrl_socket);
  1172.     if((iRetCode/100)==5 && nHostType==0) nHostType = HOST_NOS;
  1173.     else 
  1174.     {
  1175.       if (nHostType==HOST_AUTO) 
  1176.       {
  1177.         if (strstr(szMsgBuf,"NCSA")!=NULL || strstr(szMsgBuf,"CUTCP")!=NULL) nHostType=HOST_NCSA;
  1178.         else if (strncmp(szMsgBuf,"214-PC FTP server",17)==0 || strstr(szMsgBuf,"QVT")!=NULL)
  1179.                 nHostType=HOST_QVT;
  1180.       }
  1181.       while((iRetCode!=421) && ((iRetCode/100)!=2 || szMsgBuf[3]=='-')) 
  1182.       {
  1183.         if(strstr(szMsgBuf,"MKD")!=NULL) bCanMKD=TRUE;
  1184.         if(strstr(szMsgBuf,"RMD")!=NULL) bCanRMD=TRUE;
  1185.         if(strstr(szMsgBuf,"RNFR")!=NULL) bCanREN=TRUE;
  1186.         if(strstr(szMsgBuf,"DELE")!=NULL) bCanDELE=TRUE;
  1187.         if(strstr(szMsgBuf,"SYST")!=NULL) bCanSYST=TRUE;
  1188.         iRetCode=ReadLine(ctrl_socket);
  1189.       }
  1190.     }
  1191.   }
  1192.   SetButtonEnabledStatus (BTN_RMKDIR, bCanMKD);
  1193.   SetButtonEnabledStatus (BTN_RRMDIR, bCanRMD);
  1194.   SetButtonEnabledStatus (BTN_RRENAME, bCanREN);
  1195.   SetButtonEnabledStatus (BTN_RDELETE, bCanDELE);
  1196.   bHELP=TRUE;
  1197.   
  1198.   if (bCanSYST) DoSystemCommand (ctrl_socket);
  1199.   else if (nHostType==HOST_AUTO) nHostType=HOST_UNIX;
  1200.   SetDebugWindowText (lpDebugWindow);
  1201.   return iRetCode;
  1202. }
  1203. //************************************************************************
  1204. //  Convert Directory name to VMS style directory name
  1205. //************************************************************************
  1206. ConvertToVMSDir (LPSTR lpDir, int nSiz)
  1207. {
  1208.   char szTmp[120];
  1209.   (lstrcmp (lpDir,"..")!=0) ? ((long) wsprintf (szTmp, "[.%s]", lpDir)) : ((long) lstrcpy (szTmp, "[-]"));
  1210.   if (lstrlen (szTmp)<nSiz) lstrcpy (lpDir, szTmp);
  1211.   return 0;
  1212. }
  1213. //************************************************************************
  1214. //  Convert Directory name to VMS style directory name
  1215. //************************************************************************
  1216. ConvertFromVMSDir (LPSTR lpBuf, LPSTR lpDir, int nSiz)
  1217. {
  1218.   char *lp;
  1219.   lp = strstr (lpBuf, ":[");    //  Look for the Disk:[dir] format
  1220.   if (lp==NULL) return 0;       //  If not found, nothing can be done
  1221.   while ((lp!=lpBuf) && (*lp!=' ')) lp--;
  1222.   if (*lp==' ') lp++;
  1223. #ifdef WIN32
  1224.   lstrcpy (lpDir, lp);
  1225. #else
  1226.   lstrcpyn (lpDir, lp, nSiz-1);
  1227. #endif
  1228.   
  1229.   lp = strchr (lpDir, ' ');
  1230.   if (lp!=NULL) *lp = '';
  1231.   return 0;
  1232. }
  1233. //************************************************************************
  1234. //  Convert Directory name to VMS style directory name
  1235. //************************************************************************
  1236. ConvertFromDefaultDir (LPSTR lpBuf, LPSTR lpDir, int nSiz)
  1237. {
  1238.   LPSTR lp;
  1239.   char szBuf[_MAX_PATH];
  1240.   lp = strchr (lpBuf, '"');    //  Look for the Disk:[dir] format
  1241.   if (lp==NULL) return 0;       //  If not found, nothing can be done
  1242.   lp++;
  1243.   lstrcpy (szBuf, lp);
  1244.   lp = strchr (szBuf, '"');
  1245.   if (lp==NULL) return 0;
  1246.   *lp = '';
  1247. #ifdef WIN32
  1248.   lstrcpy (lpDir, szBuf);
  1249. #else
  1250.   lstrcpyn (lpDir, szBuf, nSiz-1);
  1251. #endif
  1252.   
  1253.   lp = strchr (lpDir, ' ');
  1254.   if (lp!=NULL) *lp = '';
  1255.   return 0;
  1256. }
  1257. //************************************************************************
  1258. //  Convert to the appropriate host directory name format
  1259. //************************************************************************
  1260. ConvertTargetDir (LPSTR lpDir, int nSiz)
  1261. {
  1262.   switch (nHostType)
  1263.   {
  1264.     case HOST_VMS_MULTINET:
  1265.     case HOST_VMS_UCX     : ConvertToVMSDir (lpDir, nSiz); break;
  1266.   }
  1267.   return 0;  
  1268. }
  1269. //************************************************************************
  1270. //  Convert to the appropriate host directory name format
  1271. //************************************************************************
  1272. ConvertSourceDir (LPSTR lpBuf, LPSTR lpDir, int nSiz)
  1273. {
  1274.   switch (nHostType)
  1275.   {
  1276.     case HOST_VMS_MULTINET: 
  1277.     case HOST_VMS_UCX     : ConvertFromVMSDir (lpBuf, lpDir, nSiz); break;
  1278.     default               : ConvertFromDefaultDir (lpBuf, lpDir, nSiz); break;
  1279.   }
  1280.   return 0;  
  1281. }