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

Ftp客户端

开发平台:

WINDOWS

  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <dos.h>
  4. #include <errno.h>
  5. #include "ws_glob.h"
  6. #include "winftp.h"
  7. #ifdef WIN32
  8. void CreateUniqueName (LPSTR localname, LPSTR szName, LPSTR Ext)
  9. {
  10.   int nIndex;
  11.   char szUniq[_MAX_PATH];
  12.    
  13.     nIndex = 0;
  14.     lstrcpy (szUniq, localname);
  15.     while ((GetFileAttributes (szUniq)!=0xFFFFFFFF) && (nIndex<99))
  16.     {
  17.       DoPrintf ("[recvuniq] %s - %s - %s", szName, Ext, szUniq);
  18.       switch (Ext[0])
  19.       {
  20.         case '': wsprintf (szUniq, "%s.%03u", szName, nIndex); break;
  21.         default  : if (lstrlen (szName)>5) szName[5]='';
  22.                    wsprintf (szUniq, "%s%3.3d.%s", szName, nIndex, Ext);
  23.       }
  24.       nIndex++;
  25.     }
  26.     lstrcpy (localname, szUniq);
  27. }
  28. #else
  29. void CreateUniqueName (LPSTR localname, LPSTR szName, LPSTR Ext)
  30. {
  31.   int nIndex;
  32.   char szUniq[80];
  33.   struct _find_t f;
  34.     
  35.     nIndex = 0;
  36.     lstrcpy (szUniq, localname);
  37.     while ((int) _dos_findfirst (szUniq, _A_NORMAL, &f)==0 && nIndex<99) 
  38.     {
  39.       DoPrintf ("[recvuniq] %s - %s - %s", szName, Ext, szUniq);
  40.       switch (Ext[0])
  41.       {
  42.         case '': wsprintf (szUniq, "%s.%03u", szName, nIndex); break;
  43.         default  : if (lstrlen (szName)>5) szName[5]='';
  44.                    wsprintf (szUniq, "%s%3.3d.%s", szName, nIndex, Ext);
  45.       }
  46.       nIndex++;
  47.     }
  48.     lstrcpy (localname, szUniq);
  49. }
  50. #endif
  51. //*****************************************************************************
  52. //*****************************************************************************
  53. BOOL OnCmdInitHostList (HWND hDlg, WPARAM wParam, LPARAM lParam)
  54. {
  55.   int nI;
  56.   char szHost[40];
  57.   char szType[30];
  58.   char szBuf[80];
  59.   for (nI=0; nI<nCfgNum; nI++)
  60.   {
  61.       lstrcpy (szHost, GetHostName (nI));
  62.       if (lstrlen (szHost)>0)
  63.       {
  64.         lstrcpy (szType, GetHostType (nI));
  65.         wsprintf (szBuf, "%-30s  %s", szHost, szType);
  66.         SendDlgItemMessage (hDlg, LBX_HOSTLIST, LB_ADDSTRING, (WPARAM) 0, (LPARAM)(LPCSTR) szBuf);
  67.       }
  68.   }
  69.   if (bConnected)
  70.   {
  71.     lstrcpy (szType, GetHostTypeValue (nHostType));
  72.     wsprintf (szBuf, "Connected Host Type is %s", szType);
  73.     SetDlgItemText (hDlg, TXT_CURHOST, szBuf);
  74.   }
  75.   else
  76.   {
  77.     SetDlgItemText (hDlg, TXT_CURHOST, "Not Connected to Remote Host");
  78.   }
  79.   SendDlgItemMessage (hDlg, LBX_HOSTLIST, WM_SETFONT, 
  80.       (WPARAM) GetStockObject (ANSI_FIXED_FONT), (LPARAM) MAKELONG (TRUE, 0));
  81.   return TRUE;
  82. }
  83. //*****************************************************************************
  84. //*****************************************************************************
  85. BOOL OnCmdHostListCmd (HWND hDlg, WPARAM wParam, LPARAM lParam)
  86. {
  87.   WORD wNotifyCode;
  88.   WORD wCtlID;
  89. #ifdef WIN32
  90.   wNotifyCode = HIWORD (wParam);
  91.   wCtlID      = LOWORD (wParam);
  92. #else
  93.   wNotifyCode = HIWORD (lParam);
  94.   wCtlID      = wParam;
  95. #endif
  96.   
  97.   switch (wCtlID)
  98.   {
  99.     case IDOK : EndDialog (hDlg, TRUE);
  100.                 return TRUE;
  101.     default   : return FALSE;
  102.   }
  103.   return FALSE;
  104. }
  105. //*****************************************************************************
  106. //*****************************************************************************
  107. BOOL CALLBACK WS_HostListProc (HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
  108. {
  109.   switch (Msg)
  110.   {
  111.     case WM_INITDIALOG: return OnCmdInitHostList (hDlg, wParam, lParam); 
  112.     case WM_COMMAND   : return OnCmdHostListCmd (hDlg, wParam, lParam);
  113.     default           : return FALSE;
  114.   }
  115.   return FALSE;
  116. }
  117. //*****************************************************************************
  118. //*****************************************************************************
  119. OnCmdDisplayHostList (HWND hWnd, WORD wCtlID, WORD wNotifyCode)
  120. {
  121.   FARPROC lpfnMsgProc;
  122.   
  123.   lpfnMsgProc = MakeProcInstance ((FARPROC) WS_HostListProc, hInst);
  124.   DialogBox (hInst, (LPSTR) "DLG_HOSTLIST", hWnd, lpfnMsgProc);
  125.   FreeProcInstance (lpfnMsgProc);
  126.   return 0;
  127. }
  128. //*****************************************************************************
  129. //*****************************************************************************
  130. OnCmdDropFiles (HWND hWnd, LPSTR *lpPtr)
  131. {
  132.   char szRemoteName[_MAX_FNAME+_MAX_EXT+2], szExt[_MAX_EXT];
  133.   int nCount, nRC, nIndex;
  134.   u_char szTmp[150];
  135.   if (!bConnected) return 0;
  136.   if (lpPtr==NULL) return 0;
  137.   if (lpPtr[0]==NULL) return 0;
  138.   
  139.   nCount=0; 
  140.   while (lpPtr[nCount]!=NULL) nCount++;
  141.   bCancelXfer = FALSE;
  142.   bOpInProgress = TRUE;
  143.   CreateXferWindow();
  144.   for (nIndex=0; (nIndex<nCount)&(!bCancelXfer); nIndex++) 
  145.   {
  146.     if (lpPtr[nIndex]!=NULL)
  147.     {
  148.       _splitpath (lpPtr[nIndex], NULL, NULL, szRemoteName, szExt);
  149.       lstrcat (szRemoteName, szExt);
  150.       if (bInteractive)
  151.       {
  152.         FARPROC lpfnMsgProc;
  153.       
  154.         wsprintf (szDlgPrompt, "Enter remote file name for %s:", lpPtr[nIndex]);
  155.         lstrcpy (szDlgEdit, szRemoteName);
  156.         lpfnMsgProc = MakeProcInstance ((FARPROC) WS_InputMsgProc, hInst);
  157.         DialogBox (hInst, (LPSTR) "DLG_INPUT", hWnd, lpfnMsgProc);
  158.         FreeProcInstance (lpfnMsgProc);
  159.         lstrcpy (szRemoteName, szDlgEdit);
  160.       }
  161.       DoPrintf (szTmp, "Sending %s as %s (%u of %u)", lpPtr[nIndex], szRemoteName, nIndex+1, nCount);
  162.       wsprintf (szTmp, "STOR %s", szRemoteName);
  163.       nRC = SendFile (ctrl_socket, szTmp, lpPtr[nIndex], fType);
  164.       GlobalFreePtr (lpPtr[nIndex]);
  165.     }
  166.   }
  167.   DeleteXferWindow();
  168.   GetRemoteDirForWnd (hWnd);
  169.   bOpInProgress = FALSE;
  170.   GlobalFreePtr (lpPtr);
  171.   return 0;
  172. }
  173. /************************************************************************/
  174. /************************************************************************/
  175. DoRunScript (HWND hWnd, LPSTR lpScript)
  176. {
  177.   FILE *fp;
  178.   char szCmd[150];
  179.   LPSTR lpParm;
  180.   
  181.   if ((fp=fopen (lpScript, "rt"))==NULL)
  182.   {
  183.     DoPrintf ("Could not execute Script: %s", lpScript);
  184.     return 0;
  185.   }
  186.   while (fgets (szCmd, 145, fp)!=NULL)
  187.   {
  188.     strtok (szCmd, "n");
  189.     lpParm = strchr (szCmd, ' ');
  190.     if (lpParm!=NULL) *lpParm++ = '';
  191.     if (lstrcmpi (szCmd, "CMD") == 0) command (ctrl_socket, lpParm);
  192.   }
  193.   fclose (fp);
  194.   return 0;
  195. }
  196. static LONG lTotalBytes=0, lXferBytes=0;
  197. static int  nPercentXfer;
  198. static HWND hWndXfer=NULL;
  199. /************************************************************************/
  200. /************************************************************************/
  201. void PaintXfer (HDC hDC)
  202. {
  203.   RECT rc;
  204.   char szBuf[10];
  205.   CreateButtonPens();
  206.   SelectObject (hDC, GetStockObject (WHITE_BRUSH));
  207.   Rectangle (hDC, (nWndx*20)/4, (nWndy*10)/8, (nWndx*122)/4, (nWndy*20)/8);
  208.   rc.left = (nWndx*21)/4;  rc.right = (nWndx*(nPercentXfer+21))/4;
  209.   rc.top  = (nWndy*11)/8;  rc.bottom= (nWndy*19)/8;
  210.   FillRect (hDC, &rc, GetStockObject (GRAY_BRUSH));
  211.   rc.right = (nWndx*121)/4;
  212.   SetBkMode (hDC, TRANSPARENT);
  213.   wsprintf (szBuf, "%d%%", nPercentXfer);
  214.   DrawText (hDC, szBuf, lstrlen (szBuf), &rc, DT_CENTER | DT_VCENTER);
  215.   SetBkMode (hDC, OPAQUE);
  216.   BoxIt (hDC, 18, 8, 106, 14, FALSE);
  217.   DeleteButtonPens();
  218. }
  219. /************************************************************************/
  220. /************************************************************************/
  221. void OnPaintXfer (HWND hWnd)
  222. {
  223.   HDC hDC;
  224.   PAINTSTRUCT ps;
  225.   
  226.   hDC = BeginPaint (hWnd, &ps);
  227.   PaintXfer (hDC);
  228.   EndPaint (hWnd, &ps);
  229. }
  230. /************************************************************************/
  231. /************************************************************************/
  232. void ForcePaintXfer (HWND hWnd)
  233. {
  234. }
  235. /************************************************************************/
  236. /************************************************************************/
  237. void SetTotalBytes (LONG lBytes)
  238. {
  239.   lTotalBytes = lBytes;
  240. }
  241. /************************************************************************/
  242. /************************************************************************/
  243. void SetXmitBytes (LONG lBytes)
  244. {
  245.   int nOld;
  246.   
  247.   lXferBytes = lBytes;
  248.   if ((lTotalBytes==0)||(hWndXfer==NULL)) return;
  249.   nOld = nPercentXfer;
  250.   nPercentXfer = (int) ((lBytes*100)/lTotalBytes);
  251.   if (nOld!=nPercentXfer) 
  252.   {
  253.     HDC hDC;
  254.   
  255.     hDC = GetDC (hWndXfer);
  256.     PaintXfer (hDC);
  257.     ReleaseDC (hWndXfer, hDC);
  258.   }
  259. }
  260. /************************************************************************/
  261. /************************************************************************/
  262. LRESULT CALLBACK WndXferProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  263. {
  264.   switch (Msg)
  265.   {
  266.     case WM_GETMINMAXINFO: 
  267.     {
  268.       MINMAXINFO FAR *lpmmi=(MINMAXINFO FAR *) lParam;
  269.       lpmmi->ptMaxSize.x = (nWndx*140)/4;
  270.       lpmmi->ptMaxSize.y = (nWndy*45)/8;
  271.       lpmmi->ptMaxTrackSize.x = (nWndx*140)/4;
  272.       lpmmi->ptMaxTrackSize.y = (nWndy*45)/8;
  273.       lpmmi->ptMinTrackSize.x = (nWndx*140)/4;
  274.       lpmmi->ptMinTrackSize.y = (nWndy*45)/8;
  275.     } break;
  276.     case WM_PAINT: OnPaintXfer (hWnd); return 0L;
  277.   }
  278.   return (LRESULT) DefWindowProc (hWnd, Msg, wParam, lParam);
  279. }
  280. /************************************************************************/
  281. /************************************************************************/
  282. void CreateXferWindow()
  283. {
  284.   if (hWndXfer!=NULL) return;
  285.   hWndXfer = CreateWindowEx ( WS_EX_TOPMOST, 
  286.        szXferWnd, "",  WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CAPTION,
  287.        CW_USEDEFAULT, CW_USEDEFAULT, (nWndx*140)/4, (nWndy*40)/8, (HWND) NULL, 
  288.        (HMENU) NULL, hInst,  NULL);
  289.   lTotalBytes = 0L;
  290.   lXferBytes  = 0L;
  291.   nPercentXfer = 0L;
  292. }
  293. /************************************************************************/
  294. /************************************************************************/
  295. void DeleteXferWindow()
  296. {
  297.   if (hWndXfer==NULL) return;
  298.   DestroyWindow (hWndXfer);
  299.   lTotalBytes  = lXferBytes = 0l;
  300.   nPercentXfer = 0;
  301.   hWndXfer = NULL;
  302. }
  303. /************************************************************************/
  304. /************************************************************************/
  305. void SetXferWindowText (LPSTR lpStr)
  306. {
  307.   SetWindowText (hWndXfer, lpStr);
  308. }
  309. static HWND hWndViewMsg = (HWND) NULL;
  310. static LPSTR *lpMsg;
  311. static int nMaxMsg, nCurMsg, nVertPos, nHorzPos, nHorzMax;
  312. static int nHorzTab = 20;
  313. static int nHorzSiz, nVertSiz;
  314. static LPSTR szNoMem = "Unable to allocate memory!";
  315. static LPSTR szZoomErr = "Zoom Error";
  316. static BOOL bZoomFlag=FALSE;
  317. //*****************************************************************************
  318. //*****************************************************************************
  319. OnCmdZoomInfo (HWND hWnd)
  320. {
  321.   int nI, nMax;
  322.   LPSTR lp;
  323.   
  324.   if (GetStatusLine (0)==NULL) return 0;
  325.   switch (bZoomFlag)
  326.   {
  327.     case FALSE: bZoomFlag = TRUE;
  328.                 ClearZoomInfo();
  329.                 nMax = GetMaxStatusLines();
  330.                 for (nI=0; nI<nMax; nI++)
  331.                 {
  332.                   lp = GetStatusLine (nI);
  333.                   if (lstrlen (lp) > 0) AddMessageToView (lp, "WinFTP: Zoom WinDow");
  334.                 } break;
  335.     case TRUE : bZoomFlag = FALSE;
  336.                 SendMessage (hWndViewMsg, WM_CLOSE, 0, 0L);
  337.   }
  338.   return 0;
  339. }
  340. //*************************************************************************
  341. //*************************************************************************
  342. void AddMessageToView (LPSTR lpBuf, LPSTR lpHdr)
  343. {
  344.   if (lpBuf==NULL) return;
  345.   if (lpBuf[0]=='[') return;
  346.   nMaxMsg = 150; 
  347.   if (lpMsg==NULL)
  348.   {
  349.     lpMsg = (LPSTR *) GlobalAllocPtr (GHND, nMaxMsg * sizeof (LPSTR));
  350.     nCurMsg = 0;
  351.   }
  352.   if (lpMsg==NULL) 
  353.   {
  354.     MessageBox (hWndMain, szNoMem, szZoomErr, MB_OK);
  355.     return;
  356.   }
  357.   if (hWndViewMsg==(HWND) NULL) hWndViewMsg = CreateWindow (szMsgWnd, lpHdr,  
  358.        WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE, 
  359.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
  360.          (HWND) NULL, (HMENU) NULL, hInst, NULL);
  361.   if ((hWndViewMsg!=(HWND) NULL))
  362.   {
  363.     LPSTR lp;
  364.     
  365.     if (nCurMsg>=nMaxMsg)
  366.     {
  367.       GlobalFreePtr (lpMsg[0]);
  368.       memmove (lpMsg, lpMsg+1, (nMaxMsg-1)*sizeof (LPSTR));
  369.       nCurMsg = nMaxMsg-1;
  370.     }
  371.     lp = lpMsg[nCurMsg] = (LPSTR) GlobalAllocPtr (GHND, lstrlen (lpBuf) + 5);
  372.     if (lp!=NULL) 
  373.     {
  374.       HDC hDC;
  375.       SIZE siz;
  376.       
  377.       lstrcpy (lp, lpBuf);
  378.       hDC = GetDC (hWndViewMsg);
  379.       GetTextExtentPoint (hDC, lp, lstrlen (lp), &siz);
  380.       ReleaseDC (hWndViewMsg, hDC);
  381.       nHorzMax = __max (nHorzMax, siz.cx);
  382.       SetScrollRange (hWndViewMsg, SB_HORZ, 0, nHorzMax, TRUE);
  383.       SetScrollRange (hWndViewMsg, SB_VERT, 0, nCurMsg, TRUE);
  384.       InvalidateRect (hWndViewMsg, NULL, TRUE);
  385.       nCurMsg++;
  386.     }
  387.     else 
  388.     {
  389.       MessageBox (hWndMain, szNoMem, szZoomErr, MB_OK);
  390.       return;
  391.     }
  392.   }
  393. }
  394. //*************************************************************************
  395. //*************************************************************************
  396. void ClearZoomInfo()
  397. {
  398.   int nI;
  399.   
  400.   if (lpMsg!=NULL) 
  401.   {
  402.     for (nI=0; nI<nMaxMsg; nI++) 
  403.     {
  404.       if (lpMsg[nI]!=NULL) GlobalFreePtr (lpMsg[nI]);
  405.       lpMsg[nI] = NULL;
  406.     }
  407.   }
  408.   nCurMsg = nVertPos = nHorzPos = nHorzMax = 0;
  409.   SetScrollPos (hWndViewMsg, SB_HORZ, 0, TRUE);
  410.   SetScrollPos (hWndViewMsg, SB_VERT, 0, TRUE);
  411.   SetScrollRange (hWndViewMsg, SB_HORZ, 0, 1, TRUE);
  412.   SetScrollRange (hWndViewMsg, SB_VERT, 0, 1, TRUE);
  413. }
  414. //*************************************************************************
  415. //*************************************************************************
  416. void ReleaseMsgMem()
  417. {
  418.   int nI;
  419.   
  420.   if (lpMsg==NULL) return;
  421.   for (nI=0; nI<nMaxMsg; nI++) if (lpMsg[nI]!=NULL) GlobalFreePtr (lpMsg[nI]);
  422.   GlobalFreePtr (lpMsg);
  423.   lpMsg = NULL;
  424. }
  425. //*************************************************************************
  426. //*************************************************************************
  427. LRESULT PaintViewMessage (HWND hWnd, int nVertPos)
  428. {
  429.   HDC         hDC;
  430.   PAINTSTRUCT ps;
  431.   int         nI, nRows, nLine, nPos, nHt;
  432.   RECT        rRect;
  433.   TEXTMETRIC  tm;
  434.   hDC = BeginPaint (hWnd, &ps);
  435.   GetTextMetrics (hDC,&tm);
  436.   nHt = tm.tmHeight + tm.tmExternalLeading;
  437.   GetClientRect (hWnd, &rRect);
  438.   nHorzSiz = rRect.right;
  439.   nVertSiz = nRows = rRect.bottom/nHt;
  440.   ShowScrollBar (hWnd, SB_VERT, (nRows<nCurMsg));
  441.   nLine = nVertPos;
  442.   if (lpMsg!=NULL)
  443.   {
  444.     for (nI=nPos=0; (nI<nRows) && (nLine<nCurMsg); nI++, nLine++, nPos+=nHt) 
  445.     {
  446.       if (lpMsg[nLine]!=NULL) 
  447.       {
  448.         TextOut (hDC, 20-nHorzPos, nPos, lpMsg[nLine], lstrlen (lpMsg[nLine]));
  449.       }
  450.     }
  451.   }
  452.   EndPaint(hWnd, &ps);
  453.   return 0L;
  454. }
  455. //*************************************************************************
  456. //*************************************************************************
  457. LRESULT CALLBACK WndMsgProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  458. {
  459.   switch (Msg)
  460.   {
  461.     case WM_CREATE: nVertPos = nHorzPos = nHorzMax = 0;
  462.                     return 0L;
  463.     case WM_PAINT:  return PaintViewMessage (hWnd, nVertPos);
  464.     case WM_VSCROLL: switch (wParam)
  465.       {
  466.         case SB_LINEDOWN     : if (nVertPos<(nCurMsg-(nVertSiz>>1))) nVertPos++;  break;
  467.         case SB_LINEUP       : if (nVertPos>0) --nVertPos; break;
  468.         case SB_THUMBPOSITION: nVertPos = __min ((WORD) (nCurMsg-(nVertSiz>>1)), LOWORD (lParam)); break;
  469.         case SB_PAGEUP       : nVertPos = (nVertPos>10) ? (nVertPos-10) : 0; break;
  470.         case SB_PAGEDOWN     : nVertPos = (nVertPos<(nCurMsg-nVertSiz)) ? (nVertPos+nVertSiz) : nCurMsg-(nVertSiz>>1); break;
  471.         default              : return 0L;
  472.       }
  473.       SetScrollPos (hWnd, SB_VERT, nVertPos, TRUE);
  474.       InvalidateRect (hWnd, NULL, TRUE); 
  475.       return 0L;
  476.     
  477.     case WM_HSCROLL: switch (wParam)
  478.       {
  479.         case SB_LINEDOWN     : nHorzPos = (nHorzPos<(nHorzMax-nHorzTab)) ? (nHorzPos+nHorzTab) : nHorzMax; break;
  480.         case SB_LINEUP       : nHorzPos = (nHorzPos>nHorzTab) ? (nHorzPos-nHorzTab) : 0; break;
  481.         case SB_THUMBPOSITION: nHorzPos = __min ((WORD) nHorzMax, LOWORD (lParam)); break;
  482.         case SB_PAGEUP       : nHorzPos = (nHorzPos>nHorzSiz) ? (nHorzPos-nHorzSiz) : 0; break;
  483.         case SB_PAGEDOWN     : nHorzPos = (nHorzPos<(nHorzMax-nHorzSiz)) ? (nHorzPos+nHorzSiz) : nHorzMax; break;
  484.         default              : return 0L;
  485.       }
  486.       SetScrollPos (hWnd, SB_HORZ, nHorzPos, TRUE);
  487.       InvalidateRect (hWnd, NULL, TRUE); 
  488.       return 0L;
  489.     
  490.     case WM_CLOSE  : ReleaseMsgMem();
  491.                      DestroyWindow (hWnd);
  492.                      hWndViewMsg = (HWND) NULL;
  493.                      nMaxMsg = nCurMsg = 0;
  494.                      bZoomFlag = FALSE;
  495.                      return 0;
  496.       
  497.     default        : return DefWindowProc (hWnd, Msg, wParam, lParam);
  498.   }
  499.   return 0L;
  500. }