myftpDlg.cpp
上传用户:kkaqas
上传日期:2007-01-07
资源大小:38k
文件大小:21k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // myftpDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "myftp.h"
  5. #include "myftpDlg.h"
  6. #include "..\share\tcp.h"
  7. #include "..\share\ftp.h"
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <io.h>
  11. #include <direct.h>
  12. #include <errno.h>
  13. #include "extern.h"
  14. #include "SetupDlg.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. extern char *GetFileName(char *);
  21. int reconnect(char *host, char *user, char *pass, char *remote_dir);
  22. #define SETSTATUS(msg) SetDlgItemText(IDC_STATUS, msg)
  23. char *del_lr_spaces(char *pbuf);  /* 删除左右的空格 */
  24. BOOL g_stop =FALSE;
  25. HWND g_hMainDlg =NULL;
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CAboutDlg dialog used for App About
  28. class CAboutDlg : public CDialog
  29. {
  30. public:
  31. CAboutDlg();
  32. // Dialog Data
  33. //{{AFX_DATA(CAboutDlg)
  34. enum { IDD = IDD_ABOUTBOX };
  35. //}}AFX_DATA
  36. // ClassWizard generated virtual function overrides
  37. //{{AFX_VIRTUAL(CAboutDlg)
  38. protected:
  39. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  40. //}}AFX_VIRTUAL
  41. // Implementation
  42. protected:
  43. //{{AFX_MSG(CAboutDlg)
  44. //}}AFX_MSG
  45. DECLARE_MESSAGE_MAP()
  46. };
  47. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  48. {
  49. //{{AFX_DATA_INIT(CAboutDlg)
  50. //}}AFX_DATA_INIT
  51. }
  52. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  53. {
  54. CDialog::DoDataExchange(pDX);
  55. //{{AFX_DATA_MAP(CAboutDlg)
  56. //}}AFX_DATA_MAP
  57. }
  58. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  59. //{{AFX_MSG_MAP(CAboutDlg)
  60. // No message handlers
  61. //}}AFX_MSG_MAP
  62. END_MESSAGE_MAP()
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CMyftpDlg dialog
  65. CMyftpDlg::CMyftpDlg(CWnd* pParent /*=NULL*/)
  66. : CDialog(CMyftpDlg::IDD, pParent)
  67. {
  68. //{{AFX_DATA_INIT(CMyftpDlg)
  69. // NOTE: the ClassWizard will add member initialization here
  70. //}}AFX_DATA_INIT
  71. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  72. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  73. }
  74. void CMyftpDlg::DoDataExchange(CDataExchange* pDX)
  75. {
  76. CDialog::DoDataExchange(pDX);
  77. //{{AFX_DATA_MAP(CMyftpDlg)
  78. DDX_Control(pDX, IDL_LOCAL, m_listLocal);
  79. DDX_Control(pDX, IDL_REMOTE, m_listRemote);
  80. //}}AFX_DATA_MAP
  81. }
  82. BEGIN_MESSAGE_MAP(CMyftpDlg, CDialog)
  83. //{{AFX_MSG_MAP(CMyftpDlg)
  84. ON_WM_SYSCOMMAND()
  85. ON_WM_PAINT()
  86. ON_WM_QUERYDRAGICON()
  87. ON_WM_CLOSE()
  88. ON_NOTIFY(NM_DBLCLK, IDL_LOCAL, OnDblClickLocal)
  89. ON_NOTIFY(NM_DBLCLK, IDL_REMOTE, OnDblClickRemote)
  90. //}}AFX_MSG_MAP
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CMyftpDlg message handlers
  94. BOOL CMyftpDlg::OnInitDialog()
  95. {
  96. CDialog::OnInitDialog();
  97. g_hMainDlg =m_hWnd;
  98. GetCurrentDirectory(sizeof(g_cur_path), g_cur_path);
  99. // IDM_ABOUTBOX must be in the system command range.
  100. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  101. ASSERT(IDM_ABOUTBOX < 0xF000);
  102. CMenu* pSysMenu = GetSystemMenu(FALSE);
  103. if (pSysMenu != NULL)
  104. {
  105. CString strAboutMenu;
  106. strAboutMenu.LoadString(IDS_ABOUTBOX);
  107. if (!strAboutMenu.IsEmpty())
  108. {
  109. pSysMenu->AppendMenu(MF_SEPARATOR);
  110. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  111. }
  112. }
  113. // Set the icon for this dialog.  The framework does this automatically
  114. //  when the application's main window is not a dialog
  115. SetIcon(m_hIcon, TRUE); // Set big icon
  116. SetIcon(m_hIcon, FALSE); // Set small icon
  117. if(tcp_init()<0)
  118. {
  119. MessageBox("tcp_init failed");
  120. EndDialog(0);
  121. return FALSE;
  122. }
  123. SetDlgItemText(IDE_LOCAL_DIR, "d:\myweb\downloads\sourcecode");
  124. SetDlgItemText(IDE_REMOTE_DIR, "/public_html/downloads/sourcecode");
  125. SetDlgItemText(IDE_HOST, "www.nease.net");
  126. SetDlgItemText(IDE_USER, "inetsoft");
  127. m_listLocal.InsertColumn(0, "名称", LVCFMT_LEFT, 80);
  128. m_listLocal.InsertColumn(1, "大小", LVCFMT_RIGHT, 80);
  129. m_listRemote.InsertColumn(0, "名称", LVCFMT_LEFT, 80);
  130. m_listRemote.InsertColumn(1, "大小", LVCFMT_RIGHT, 80);
  131. return TRUE;  // return TRUE  unless you set the focus to a control
  132. }
  133. void CMyftpDlg::OnSysCommand(UINT nID, LPARAM lParam)
  134. {
  135. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  136. {
  137. CAboutDlg dlgAbout;
  138. dlgAbout.DoModal();
  139. }
  140. else
  141. {
  142. CDialog::OnSysCommand(nID, lParam);
  143. }
  144. }
  145. // If you add a minimize button to your dialog, you will need the code below
  146. //  to draw the icon.  For MFC applications using the document/view model,
  147. //  this is automatically done for you by the framework.
  148. void CMyftpDlg::OnPaint() 
  149. {
  150. if (IsIconic())
  151. {
  152. CPaintDC dc(this); // device context for painting
  153. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  154. // Center icon in client rectangle
  155. int cxIcon = GetSystemMetrics(SM_CXICON);
  156. int cyIcon = GetSystemMetrics(SM_CYICON);
  157. CRect rect;
  158. GetClientRect(&rect);
  159. int x = (rect.Width() - cxIcon + 1) / 2;
  160. int y = (rect.Height() - cyIcon + 1) / 2;
  161. // Draw the icon
  162. dc.DrawIcon(x, y, m_hIcon);
  163. }
  164. else
  165. {
  166. CDialog::OnPaint();
  167. }
  168. }
  169. // The system calls this to obtain the cursor to display while the user drags
  170. //  the minimized window.
  171. HCURSOR CMyftpDlg::OnQueryDragIcon()
  172. {
  173. return (HCURSOR) m_hIcon;
  174. }
  175. int g_sd_ftp =-1;
  176. char g_host[60], g_user[60], g_pass[20], g_local_dir[128], g_remote_dir[128],
  177. g_cur_remote_dir[128], g_cur_local_dir[128];
  178. BOOL CMyftpDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
  179. {
  180. struct _finddata_t fileinfo;
  181. char filesize[50], *pfilename, filename[128], rfilesize[50], temp[256];
  182. long hfind =0;
  183. int i, j, count, from_login =0, item_num;
  184. switch(wParam)
  185. {
  186. case ID_LOGIN:
  187. g_stop =FALSE;
  188. from_login =1;
  189. if(GetDlgItemText(IDE_HOST, g_host, sizeof(g_host)) ==0)
  190. return FALSE;
  191. if(GetDlgItemText(IDE_USER, g_user, sizeof(g_user)) ==0)
  192. return FALSE;
  193. if(GetDlgItemText(IDE_PASS, g_pass, sizeof(g_pass)) ==0)
  194. return FALSE;
  195. if(g_sd_ftp >0) tcp_close(g_sd_ftp);
  196. ::EnableWindow(::GetDlgItem(m_hWnd, ID_LOGIN), FALSE);
  197. SetDlgItemText(IDC_STATUS, "login host...");
  198. if((g_sd_ftp =ftp_login(g_host, g_user, g_pass)) <0)
  199. {
  200. SetDlgItemText(IDC_STATUS, "ftp login failed");
  201. ::EnableWindow(::GetDlgItem(m_hWnd, ID_LOGIN), TRUE);
  202. return FALSE;
  203. }
  204. SetDlgItemText(IDE_PASS, NULL);
  205. SetDlgItemText(IDC_STATUS, "ftp login success");
  206. ::EnableWindow(::GetDlgItem(m_hWnd, ID_LOGIN), TRUE);
  207. case ID_CHDIR:
  208. g_stop =FALSE;
  209. m_listLocal.DeleteAllItems();
  210. GetDlgItemText(IDE_LOCAL_DIR, g_local_dir, sizeof(g_local_dir));
  211. if(chdir(g_local_dir) !=0)
  212. {
  213. SetDlgItemText(IDC_STATUS, "cd local dir failed");
  214. return FALSE;
  215. }
  216. strcpy(g_cur_local_dir, g_local_dir);
  217. memset(&fileinfo, 0, sizeof(fileinfo));
  218. if((hfind =_findfirst("*", &fileinfo)) <0)
  219. {
  220. if(errno ==EINVAL) return FALSE;
  221. return 0;
  222. }
  223. while(1)
  224. {
  225. if((pfilename =GetFileName(fileinfo.name)) ==NULL)
  226. goto next;
  227. if(!strcmp(pfilename, "_vti_cnf")
  228. || !strcmp(pfilename, "listtmp.txt"))
  229. goto next;
  230. if((fileinfo.attrib & _A_HIDDEN) ==_A_HIDDEN)
  231. goto next;
  232. if((fileinfo.attrib & _A_SUBDIR) == _A_SUBDIR)
  233. {
  234. strcpy(filesize, "-");
  235. wsprintf(filename, ">%s",pfilename);
  236. }
  237. else
  238. {
  239. wsprintf(filesize, "%d", fileinfo.size);
  240. strcpy(filename, pfilename);
  241. }
  242. item_num =m_listLocal.InsertItem(m_listLocal.GetItemCount(), filename);
  243. m_listLocal.SetItemText(item_num, 1, filesize);
  244. next:
  245. if(_findnext(hfind, &fileinfo) <0) break;
  246. if(fileinfo.name[0] ==0) break;
  247. }
  248. _findclose(hfind);
  249. count =m_listLocal.GetItemCount();
  250. for(i =0; i<count; i++)
  251. {
  252. for(j =0; j<i; j++)
  253. {
  254. }
  255. }
  256. if(from_login ==0 || g_sd_ftp <0) break;
  257. case ID_REMOTE_CHDIR:
  258. g_stop =FALSE;
  259. GetDlgItemText(IDE_REMOTE_DIR, g_remote_dir, sizeof(g_remote_dir));
  260. SetDlgItemText(IDC_STATUS, "cd remote dir...");
  261. if(ftp_chdir(g_sd_ftp, g_remote_dir) <0)
  262. {
  263. SetDlgItemText(IDC_STATUS, "cd remote dir failed");
  264. return FALSE;
  265. }
  266. else SetDlgItemText(IDC_STATUS, "cd remote dir success");
  267. strcpy(g_cur_remote_dir, g_remote_dir);
  268. m_listRemote.DeleteAllItems();
  269. SetDlgItemText(IDC_STATUS, "list remote dir...");
  270. int ret;
  271. if((ret =ftp_list(g_sd_ftp, "listtmp.txt")) <0)
  272. SetDlgItemText(IDC_STATUS, "list remote dir failed");
  273. else SetDlgItemText(IDC_STATUS, "list remote dir success");
  274. if(ret ==0)
  275. {
  276. SETSTATUS("no file list");
  277. break;
  278. }
  279. FILE *fp;
  280. char type;
  281. if((fp =fopen("listtmp.txt", "r")) ==NULL)
  282. {
  283. SetDlgItemText(IDC_STATUS, "open listtmp.txt failed");
  284. return FALSE;
  285. }
  286. while(!feof(fp))
  287. {
  288. if(fscanf(fp, "%c%*s %*s %*s %*s %s %*s %*s %*s", &type, filesize) !=2)
  289. break;
  290. if(fgets(filename, sizeof(filename), fp) ==NULL)
  291. break;
  292. strtok(filename, "rn");
  293. del_lr_spaces(filename);
  294. if(type =='d')
  295. {
  296. wsprintf(temp, ">%s", filename);
  297. strcpy(filename, temp);
  298. }
  299. item_num =m_listRemote.InsertItem(m_listRemote.GetItemCount(), filename);
  300. m_listRemote.SetItemText(item_num, 1, filesize);
  301. }
  302. fclose(fp);
  303. //remove("listtmp.txt");
  304. break;
  305. case ID_PUT:
  306. g_stop =FALSE;
  307. POSITION pos;
  308. pos =m_listLocal.GetFirstSelectedItemPosition();
  309. if(pos ==NULL) break;
  310. int nitem, re_put_times;
  311. put_next:
  312. nitem =m_listLocal.GetNextSelectedItem(pos);
  313. if(nitem <0) break;
  314. m_listLocal.GetItemText(nitem, 0, filename, sizeof(filename));
  315. if(filename[0] =='>') goto put_next;
  316. m_listLocal.GetItemText(nitem, 1, filesize, sizeof(filesize));
  317. LVFINDINFO findinfo;
  318. memset(&findinfo, 0, sizeof(findinfo));
  319. findinfo.flags =LVFI_STRING;
  320. findinfo.psz =filename;
  321. if((nitem =m_listRemote.FindItem(&findinfo)) >=0)
  322. {
  323. m_listRemote.GetItemText(nitem, 1, rfilesize, sizeof(rfilesize));
  324. if(!strcmp(rfilesize, filesize)) goto put_next;
  325. }
  326. else strcpy(rfilesize, "-");
  327. re_put_times =0;
  328. re_put:
  329. if(g_stop)
  330. {
  331. SETSTATUS("put file break ok");
  332. break;
  333. }
  334. wsprintf(temp, "put file %s, size:%s, rsize:%s ...", filename, filesize, rfilesize);
  335. SetDlgItemText(IDC_STATUS, temp);
  336. if(ftp_put_file(g_sd_ftp, filename, 0, filename) <0)
  337. {
  338. ftp_quit(g_sd_ftp);
  339. for(i =0; i<g_max_reconnect; i++)
  340. {
  341. if(g_stop)
  342. {
  343. SETSTATUS("reconnect break ok");
  344. break;
  345. }
  346. if((g_sd_ftp =reconnect(g_host, g_user, g_pass, g_remote_dir)) <0)
  347. {
  348. SetDlgItemText(IDC_STATUS, "reconnect failed");
  349. Sleep(5000);
  350. }
  351. else if(re_put_times++ <g_max_retry) goto re_put;
  352. }
  353. if(i ==g_max_reconnect)
  354. {
  355. SetDlgItemText(IDC_STATUS, "put file failed for max times");
  356. break;
  357. }
  358. }
  359. else
  360. {
  361. wsprintf(temp, "success put %s...", filename);
  362. SetDlgItemText(IDC_STATUS, temp);
  363. m_listRemote.SetItemText(nitem, 1, filesize);
  364. goto put_next;
  365. }
  366. break;
  367. case ID_PUT_ALL:
  368. g_stop =FALSE;
  369. put_dir(g_local_dir, g_remote_dir);
  370. break;
  371. case ID_REMOTE_MKDIR:
  372. g_stop =FALSE;
  373. if(g_sd_ftp <0) break;
  374. GetDlgItemText(IDE_REMOTE_DIR, g_remote_dir, sizeof(g_remote_dir));
  375. SETSTATUS("remote mkdir ...");
  376. if(ftp_mkdir(g_sd_ftp, g_remote_dir) <0)
  377. SETSTATUS("remote mkdir failed");
  378. else SETSTATUS("success remote mkdir");
  379. break;
  380. case ID_SETUP:
  381. CSetupDlg *pdlg;
  382. pdlg =new CSetupDlg();
  383. pdlg->DoModal();
  384. delete pdlg;
  385. break;
  386. case ID_STOP:
  387. g_stop =TRUE;
  388. break;
  389. case IDCANCEL:
  390. if(MessageBox("您是否确定退出MyFtp?", "Paladinchina.com", MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2) ==IDNO)
  391. return TRUE;
  392. g_stop =TRUE;
  393. if(g_sd_ftp >0) tcp_close(g_sd_ftp);
  394. g_sd_ftp =0;
  395. EndDialog(0);
  396. break;
  397. case IDOK:
  398. return TRUE;
  399. }
  400. return CDialog::OnCommand(wParam, lParam);
  401. }
  402. int reconnect(char *host, char *user, char *pass, char *remote_dir)
  403. {
  404. int sd;
  405. if(g_sd_ftp >0) tcp_close(g_sd_ftp);
  406. g_sd_ftp =-1;
  407. if((sd =ftp_login(host, user, pass)) <0)
  408. return -1;
  409. if(remote_dir ==NULL) return sd;
  410. if(ftp_chdir(sd, remote_dir) <0)
  411. {
  412. ftp_quit(sd);
  413. return -1;
  414. }
  415. strcpy(g_cur_remote_dir, remote_dir);
  416. return sd;
  417. }
  418. char *del_lr_spaces(char *pbuf)  /* 删除左右的空格 */
  419. {
  420.   char *p =pbuf;
  421.   int i =0;
  422.   i =0;
  423.   while(*p ==' ') p++;
  424.   strcpy(pbuf, p);
  425.   i =strlen(pbuf);
  426.   while(i >=0 && *(p + i-1) ==' ') i--;
  427.   *(p+i) =0;
  428.   return pbuf;
  429. }
  430. int CMyftpDlg::list_local_dir(char *local_dir)
  431. {
  432. struct _finddata_t fileinfo;
  433. char filesize[50], *pfilename, filename[128];
  434. long hfind =0;
  435. int count, from_login =0, item_num;
  436. if(chdir(local_dir) !=0)
  437. {
  438. SETSTATUS("cd local dir failed");
  439. return -1;
  440. }
  441. strcpy(g_cur_local_dir, local_dir);
  442. SetDlgItemText(IDE_LOCAL_DIR, local_dir);
  443. memset(&fileinfo, 0, sizeof(fileinfo));
  444. m_listLocal.DeleteAllItems();
  445. if((hfind =_findfirst("*", &fileinfo)) <0)
  446. {
  447. if(errno ==EINVAL) return FALSE;
  448. return 0;
  449. }
  450. count =0;
  451. while(1)
  452. {
  453. if((pfilename =GetFileName(fileinfo.name)) ==NULL)
  454. goto next;
  455. if(!strcmp(pfilename, "_vti_cnf")
  456. || !strcmp(pfilename, "listtmp.txt"))
  457. goto next;
  458. if((fileinfo.attrib & _A_HIDDEN) ==_A_HIDDEN)
  459. goto next;
  460. if((fileinfo.attrib & _A_SUBDIR) == _A_SUBDIR)
  461. {
  462. strcpy(filesize, "-");
  463. wsprintf(filename, ">%s",pfilename);
  464. }
  465. else
  466. {
  467. wsprintf(filesize, "%d", fileinfo.size);
  468. strcpy(filename, pfilename);
  469. }
  470. item_num =m_listLocal.InsertItem(m_listLocal.GetItemCount(), filename);
  471. m_listLocal.SetItemText(item_num, 1, filesize);
  472. count ++;
  473. next:
  474. if(_findnext(hfind, &fileinfo) <0) break;
  475. if(fileinfo.name[0] ==0) break;
  476. }
  477. _findclose(hfind);
  478. return count;
  479. }
  480. int CMyftpDlg::list_remote_dir(char *remote_dir, BOOL from_cache)
  481. {
  482. char filesize[50], filename[128], temp[256];
  483. long hfind =0;
  484. int count, from_login =0, ret;
  485. FILE *fp;
  486. char type;
  487. int i, re_chdir_times =0, re_list_times =0, item_num;
  488. BOOL f_create_ok =-1;
  489. if(g_sd_ftp <0) return -1;
  490. re_chdir:
  491. if(g_stop)
  492. {
  493. SETSTATUS("cd remote dir stopped");
  494. return -1;
  495. }
  496. SETSTATUS("cd remote dir");
  497. if(ftp_chdir(g_sd_ftp, remote_dir) <0)
  498. {
  499. if(++re_chdir_times <g_max_retry)
  500. {
  501. if(f_create_ok <0 && (f_create_ok =ftp_create_path(g_sd_ftp, remote_dir)) >=0)
  502. goto re_chdir;
  503. Sleep(1000);
  504. for(i =0; i<g_max_reconnect; i++)
  505. {
  506. if(g_stop)
  507. {
  508. SETSTATUS("reconnect stopped");
  509. return -1;
  510. }
  511. SETSTATUS("reconnect host");
  512. if((g_sd_ftp =reconnect(g_host, g_user, g_pass, remote_dir)) <0)
  513. {
  514. SETSTATUS("reconnect host failed!");
  515. Sleep(2000);
  516. }
  517. else break;
  518. }
  519. if(i <g_max_reconnect) goto re_chdir;
  520. }
  521. SetDlgItemText(IDC_STATUS, "cd remote dir failed");
  522. return -1;
  523. }
  524. else SetDlgItemText(IDC_STATUS, "cd remote dir success");
  525. strcpy(g_cur_remote_dir, remote_dir);
  526. SetDlgItemText(IDE_REMOTE_DIR, remote_dir);
  527. m_listRemote.DeleteAllItems();
  528. if(!from_cache)
  529. {
  530. re_list:
  531. if(g_stop)
  532. {
  533. SETSTATUS("list remote dir stopped");
  534. return -1;
  535. }
  536. SetDlgItemText(IDC_STATUS, "list remote dir...");
  537. if((ret =ftp_list(g_sd_ftp, "listtmp.txt")) <0)
  538. {
  539. if(++re_list_times <g_max_retry)
  540. {
  541. Sleep(1000);
  542. for(i =0; i<g_max_reconnect; i++)
  543. {
  544. if(g_stop)
  545. {
  546. SETSTATUS("reconnect stopped");
  547. return -1;
  548. }
  549. SETSTATUS("reconnect host...");
  550. if((g_sd_ftp =reconnect(g_host, g_user, g_pass, remote_dir)) <0)
  551. {
  552. SETSTATUS("reconnect host failed!");
  553. Sleep(2000);
  554. }
  555. else break;
  556. }
  557. if(i <g_max_reconnect) goto re_list;
  558. }
  559. SetDlgItemText(IDC_STATUS, "list remote dir failed");
  560. }
  561. else SetDlgItemText(IDC_STATUS, "list remote dir success");
  562. if(ret ==0)
  563. {
  564. SETSTATUS("no file list");
  565. return 0;
  566. }
  567. }
  568. if((fp =fopen("listtmp.txt", "r")) ==NULL)
  569. {
  570. SetDlgItemText(IDC_STATUS, "open listtmp.txt failed");
  571. goto re_list;
  572. }
  573. count =0;
  574. while(!feof(fp))
  575. {
  576. if(fscanf(fp, "%c%*s %*s %*s %*s %s %*s %*s %*s", &type, filesize) !=2)
  577. break;
  578. if(fgets(filename, sizeof(filename), fp) ==NULL)
  579. break;
  580. strtok(filename, "rn");
  581. del_lr_spaces(filename);
  582. if(type =='d')
  583. {
  584. wsprintf(temp, ">%s", filename);
  585. strcpy(filename, temp);
  586. }
  587. item_num =m_listRemote.InsertItem(m_listRemote.GetItemCount(), filename);
  588. m_listRemote.SetItemText(item_num, 1, filesize);
  589. count ++;
  590. }
  591. fclose(fp);
  592. //remove("listtmp.txt");
  593. return count;
  594. }
  595. int CMyftpDlg::put_dir(char *local_dir, char *remote_dir)
  596. {
  597. char filesize[50], filename[128], rfilesize[50], temp[256];
  598. long hfind =0;
  599. int i, from_login =0, item_count;
  600. char local_dir1[128], remote_dir1[128];
  601. list_local_dir(local_dir);
  602. list_remote_dir(remote_dir, FALSE);
  603. strcpy(local_dir1, local_dir);
  604. strcpy(remote_dir1, remote_dir);
  605. //POSITION pos;
  606. //pos =m_listLocal.GetFirstSelectedItemPosition();
  607. //if(pos ==NULL) return 0;
  608. int nitem, nitem_remote, re_put_times;
  609. nitem =-1;
  610. item_count =m_listLocal.GetItemCount();
  611. put_next:
  612. if(g_stop)
  613. {
  614. SETSTATUS("put next stopped");
  615. return -1;
  616. }
  617. nitem ++;
  618. if(nitem >=item_count) goto f_exit;
  619. //nitem =m_listLocal.GetNextSelectedItem(pos);
  620. //if(nitem <0) return 0;
  621. m_listLocal.GetItemText(nitem, 0, filename, sizeof(filename));
  622. if(!strcmp(filename, "listtmp.txt")
  623. || !strcmp(filename, "_vti_cnf"))
  624. goto put_next;
  625. if(filename[0] =='>')
  626. {
  627. if(filename[1] =='.') goto put_next;
  628. if(local_dir[strlen(local_dir)-1] =='\' || local_dir[strlen(local_dir)-1] =='/')
  629. local_dir[strlen(local_dir)-1] =0;
  630. if(remote_dir[strlen(remote_dir)-1] =='/' || remote_dir[strlen(remote_dir)-1] =='\')
  631. remote_dir[strlen(remote_dir)-1] =0;
  632. wsprintf(local_dir1, "%s\%s", local_dir, &filename[1]);
  633. wsprintf(remote_dir1, "%s/%s", remote_dir, &filename[1]);
  634. put_dir(local_dir1, remote_dir1);
  635. goto put_next;
  636. }
  637. m_listLocal.GetItemText(nitem, 1, filesize, sizeof(filesize));
  638. if(g_max_file_size >0)
  639. {
  640. if(g_max_file_size < atoi(filesize))
  641. {
  642. log_msg("file %s size %s too large", filename, filesize);
  643. goto put_next;
  644. }
  645. }
  646. LVFINDINFO findinfo;
  647. memset(&findinfo, 0, sizeof(findinfo));
  648. findinfo.flags =LVFI_STRING;
  649. findinfo.psz =filename;
  650. if((nitem_remote =m_listRemote.FindItem(&findinfo)) >=0)
  651. {
  652. m_listRemote.GetItemText(nitem_remote, 1, rfilesize, sizeof(rfilesize));
  653. if(!strcmp(rfilesize, filesize)) goto put_next;
  654. }
  655. else strcpy(rfilesize, "-");
  656. re_put_times =0;
  657. re_put:
  658. if(g_stop)
  659. {
  660. SETSTATUS("put file stopped");
  661. return -1;
  662. }
  663. wsprintf(temp, "put file %s, size:%s, rsize:%s ...", filename, filesize, rfilesize);
  664. SetDlgItemText(IDC_STATUS, temp);
  665. if(ftp_put_file(g_sd_ftp, filename, 0, filename) <0)
  666. {
  667. ftp_quit(g_sd_ftp);
  668. for(i =0; i<g_max_reconnect; i++)
  669. {
  670. if(g_stop)
  671. {
  672. SETSTATUS("reconnect stopped");
  673. return -1;
  674. }
  675. SETSTATUS("put failed,reconnect host...");
  676. if((g_sd_ftp =reconnect(g_host, g_user, g_pass, remote_dir)) <0)
  677. {
  678. SetDlgItemText(IDC_STATUS, "reconnect failed");
  679. Sleep(5000);
  680. }
  681. else if(re_put_times++ <g_max_retry) goto re_put;
  682. }
  683. if(i ==g_max_reconnect)
  684. {
  685. SetDlgItemText(IDC_STATUS, "put file failed for max reconnect times");
  686. return -1;
  687. }
  688. }
  689. else
  690. {
  691. wsprintf(temp, "success put %s...", filename);
  692. SetDlgItemText(IDC_STATUS, temp);
  693. m_listRemote.SetItemText(nitem_remote, 1, filesize);
  694. goto put_next;
  695. }
  696. f_exit:
  697. int len;
  698. len =strlen(local_dir);
  699. for(i =len-1; i>=0; i--)
  700. {
  701. if(local_dir[i] =='/' || local_dir[i] =='\')
  702. {
  703. local_dir[i+1] =0;
  704. break;
  705. }
  706. }
  707. len =strlen(remote_dir);
  708. for(i =len-1; i>=0; i--)
  709. {
  710. if(remote_dir[i] =='/' || remote_dir[i] =='\')
  711. {
  712. if(i ==0) remote_dir[i+1] =0;
  713. else remote_dir[i] =0;
  714. break;
  715. }
  716. }
  717. list_local_dir(local_dir);
  718. list_remote_dir(remote_dir, TRUE);
  719. return nitem;
  720. }
  721. void CMyftpDlg::OnClose() 
  722. {
  723. CDialog::OnClose();
  724. }
  725. void CMyftpDlg::OnDblClickLocal(NMHDR* pNMHDR, LRESULT* pResult) 
  726. {
  727. *pResult = 0;
  728. POSITION pos;
  729. pos =m_listLocal.GetFirstSelectedItemPosition();
  730. if(pos ==NULL) return;
  731. int nitem;
  732. char filename[80], path[128];
  733. nitem =m_listLocal.GetNextSelectedItem(pos);
  734. if(nitem <0) return;
  735. m_listLocal.GetItemText(nitem, 0, filename, sizeof(filename));
  736. if(filename[0] !='>') return;
  737. if(strcmp(filename, ">.") ==0) return;
  738. wsprintf(path, "%s\%s", g_cur_local_dir, &filename[1]);
  739. list_local_dir(path);
  740. }
  741. void CMyftpDlg::OnDblClickRemote(NMHDR* pNMHDR, LRESULT* pResult) 
  742. {
  743. *pResult = 0;
  744. POSITION pos;
  745. pos =m_listRemote.GetFirstSelectedItemPosition();
  746. if(pos ==NULL) return;
  747. int nitem;
  748. char filename[80], path[128];
  749. nitem =m_listRemote.GetNextSelectedItem(pos);
  750. if(nitem <0) return;
  751. m_listRemote.GetItemText(nitem, 0, filename, sizeof(filename));
  752. if(filename[0] !='>') return;
  753. if(strcmp(filename, ">.") ==0) return;
  754. wsprintf(path, "%s/%s", g_cur_remote_dir, &filename[1]);
  755. list_remote_dir(path, FALSE);
  756. }