FtpObject.cpp
上传用户:tjfeida
上传日期:2013-03-10
资源大小:1917k
文件大小:26k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // FtpObject.cpp: implementation of the CFtpObject class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. /*********************************************
  5. **该文件是属于WolfFTP工程中的。如果有什么问题
  6. **请联系
  7. **         tablejiang@21cn.com
  8. **或者访问
  9. **         http://wolfftp.51.net
  10. **以得到最新的支持。
  11. *********************************************/
  12. #include "stdafx.h"
  13. #include "FtpObject.h"
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[]=__FILE__;
  17. #define new DEBUG_NEW
  18. #endif
  19. //////////////////////////////////////////////////////////////////////
  20. // Construction/Destruction
  21. //////////////////////////////////////////////////////////////////////
  22. CFtpObject::CFtpObject()
  23. {
  24. m_bIsConnected = FALSE ;
  25. m_hEvent = NULL ;
  26. m_CurrentFtpDirectory[0] = 0 ;
  27. memset( &m_SiteInfo , 0 , sizeof( m_SiteInfo ) ) ;
  28. m_ListItem = NULL ;
  29. m_hDataSocket = NULL ;
  30. }
  31. CFtpObject::~CFtpObject()
  32. {
  33. }
  34. /***********************************************************
  35. ** @Description:
  36. ** This is thread function . Start the thread message queue .
  37. **
  38. ** @Parameter:
  39. **
  40. ** @Return: 
  41. ** @Author: Table.JHM.太子
  42. ** @e-mail: tablejiang@21cn.com
  43. ** Date:  2001 3 26
  44. *************************************************************/
  45. UINT FtpThreadFunction( LPVOID pParam )
  46. {
  47. CFtpObject* pFtp = ( CFtpObject *)pParam ;
  48. pFtp->StartCommunication( ) ;
  49. return 1 ;
  50. }
  51. /***********************************************************
  52. ** @Description:
  53. ** Start the ftp communication .
  54. **
  55. ** @Parameter:
  56. ** void
  57. **
  58. ** @Return: Start success return true , else return false .
  59. ** @Author: Table.JHM.太子
  60. ** @e-mail: tablejiang@21cn.com
  61. ** Date:  2001 3 26
  62. *************************************************************/
  63. BOOL CFtpObject::StartFtpCommunication()
  64. {
  65. m_hEvent = CreateEvent( NULL , FALSE , FALSE , "CreateThreadEvent" ) ;
  66. CWinThread* pThread = AfxBeginThread( FtpThreadFunction , this ) ;
  67. m_ControlThread.thread = pThread->m_hThread ;
  68. m_ControlThread.threadid = pThread->m_nThreadID ;
  69. WaitForSingleObject( m_hEvent , INFINITE ) ;
  70. CloseHandle( m_hEvent ) ;
  71. m_hEvent = NULL ;
  72. return true ;
  73. }
  74. /***********************************************************
  75. ** @Description:
  76. ** Start the connect ftp server and check the ftp server
  77. ** status .
  78. **
  79. ** @Parameter:
  80. ** void
  81. **
  82. ** @Return: if start success return true , else return false .
  83. ** @Author: Table.JHM.太子
  84. ** @e-mail: tablejiang@21cn.com
  85. ** Date:  2001 3 26
  86. *************************************************************/
  87. BOOL CFtpObject::Start()
  88. {
  89. SetEvent( m_hEvent ) ;
  90. //disable ftp dirlist window.
  91. PostMessage( m_hWndInfo.hFtpDirListWnd , ENABLE_FTP_LIST_MSG , 0/*disable*/ , 0 ) ;
  92. if( !InitSocket ( ) )
  93. {
  94. return false ;
  95. }
  96. //send status msg .
  97. sprintf( m_szFtpBuffer , _T("欢迎使用 WolfFTP 传输工具!rn") ) ;
  98. SendStatusStr( m_szFtpBuffer ) ;
  99. sprintf( m_szFtpBuffer , _T("有问题请联系tablejiang@21cn.comrn") ) ;
  100. SendStatusStr( m_szFtpBuffer ) ;
  101. sprintf( m_szFtpBuffer , _T("开始连接 %s 站点........") , m_SiteInfo.host ) ;
  102. SendStatusStr( m_szFtpBuffer ) ;
  103. //connect with server.
  104. m_hControlSocket = ConnectServer( m_SiteInfo.host ) ;
  105. if( m_hControlSocket == INVALID_SOCKET )
  106. {
  107. //MessageBox( NULL , "Can't connect server !" , "error" , MB_OK ) ;
  108. //send status msg .
  109. sprintf( m_szFtpBuffer , _T("连接错误!") , m_SiteInfo.host ) ;
  110. SendStatusStr( m_szFtpBuffer ) ;
  111. return false ;
  112. }
  113. //login server .
  114. if( m_SiteInfo.logintype == 0 )
  115. {
  116. if( !UserLogin( m_hControlSocket , m_SiteInfo.user , m_SiteInfo.pass ) )
  117. {
  118. sprintf( m_szFtpBuffer , _T("登录错误!") , m_SiteInfo.host ) ;
  119. SendStatusStr( m_szFtpBuffer ) ;
  120. return false ;
  121. }
  122. }
  123. else
  124. {
  125. if( !AnonymousLogin( m_hControlSocket ) )
  126. {
  127. //MessageBox( NULL , "Login failed ! " , "error" , MB_OK ) ;
  128. sprintf( m_szFtpBuffer , _T("登录错误!") , m_SiteInfo.host ) ;
  129. SendStatusStr( m_szFtpBuffer ) ;
  130. return false ;
  131. }
  132. }
  133. //send login success msg .
  134. sprintf( m_szFtpBuffer , _T("成功登录Ftp服务器") ) ;
  135. SendStatusStr( m_szFtpBuffer ) ;
  136. //test : 2001 4 24
  137. //test pwd command .
  138. char pwdcom[MAX_PATH] ;
  139. sprintf( pwdcom , "PWDrn" ) ;
  140. //SendFtpCommand( pwdcom , m_hControlSocket ) ;
  141. //check the broken download. 
  142. if( !CheckBrokenDownload( ) ) 
  143. return false ;
  144. //what's operate system in server ?
  145. if( !CheckServerType() )
  146. return false ;
  147. //set connected tag .
  148. m_bIsConnected = TRUE ;
  149. //enable ftp dir list window .
  150. PostMessage( m_hWndInfo.hFtpDirListWnd , ENABLE_FTP_LIST_MSG , 1 /*enable*/ , 0 ) ;
  151. //enter the init ftp directory 
  152. EnterInitFtpDirectory( ) ;
  153. //display the current directory.
  154. GetCurrentFtpDir( ) ;
  155. //Init complete.Notify user.
  156. sprintf( m_szFtpBuffer , _T("初始化完毕,等待命令") ) ;
  157. SendStatusStr( m_szFtpBuffer ) ;
  158. //bulid the thread message queue .
  159. StartMessageCycle( );
  160. return true ;
  161. }
  162. /***********************************************************
  163. ** @Description:
  164. ** Enter the ftp init directory .
  165. **
  166. ** @Parameter:
  167. **
  168. ** @Return: if success return true ,else return false .
  169. ** @Author: Table.JHM.太子
  170. ** @e-mail: tablejiang@21cn.com
  171. ** Date:  2001 3 26
  172. *************************************************************/
  173. BOOL CFtpObject::EnterInitFtpDirectory()
  174. {
  175. UINT nReplyCode = 0 ;
  176. char szCommand[MAX_PATH] ;
  177. memset( szCommand , 0 , MAX_PATH ) ;
  178. if( strlen( m_SiteInfo.remotepath ) != 0 )
  179. {
  180. sprintf( szCommand , "CWD %srn" , m_SiteInfo.remotepath ) ;
  181. nReplyCode = SendFtpCommand( szCommand , m_hControlSocket ) ;
  182. if( nReplyCode >= 400 )
  183. return false ;
  184. }
  185. return true ;
  186. }
  187. /***********************************************************
  188. ** @Description:
  189. ** The message cycle queue .
  190. **
  191. ** @Parameter:
  192. **
  193. ** @Return: if success return true ,else return false .
  194. ** @Author: Table.JHM.太子
  195. ** @e-mail: tablejiang@21cn.com
  196. ** Date:  2001 3 26
  197. *************************************************************/
  198. BOOL CFtpObject::StartMessageCycle()
  199. {
  200. MSG msg ;
  201. char* pCommand ;
  202. while( true )
  203. {
  204. //we must sleep , i don't know why , but
  205. //if not , the thread will be Killed by system .
  206. Sleep( 10 ) ;
  207. if( PeekMessage( &msg , NULL , 0 , 0 , PM_REMOVE ) )
  208. {
  209. if( msg.message == FTP_SERVER_COMMAND_MSG )
  210. {
  211. //disable ftp dirlist window.
  212. PostMessage( m_hWndInfo.hFtpDirListWnd , ENABLE_FTP_LIST_MSG , 0/*disable*/ , 0 ) ;
  213. switch( msg.wParam )
  214. {
  215. case FTP_COMM_EXIT:
  216. //case 0: want quit the ftp communication .
  217. PostMessage( m_hWndInfo.hFtpDirListWnd , ENABLE_FTP_LIST_MSG , 1 /*enable*/ , 0 ) ;
  218. return true ;
  219. break ;
  220. case FTP_COMM_NORMAL_COMMAND:
  221. //case 1: send the normal command .
  222. pCommand = ( char * )msg.lParam ;
  223. SendFtpCommand( pCommand , m_hControlSocket ) ;
  224. try
  225. {
  226. delete pCommand ;
  227. }
  228. catch( ... )
  229. {
  230. TRACE( "can't delete point! %s " , pCommand ) ;
  231. }
  232. pCommand = NULL ;
  233. if( m_hEvent != NULL )
  234. SetEvent( m_hEvent ) ;
  235. break ;
  236. case FTP_COMM_LIST_DIR:
  237. //case 2: want list current ftp directory .
  238. ListDirectory( true ) ;
  239. break ;
  240. case FTP_COMM_GET_CUR_DIR:
  241. //case 3: want get current ftp directory .
  242. GetCurrentFtpDir() ;
  243. break;
  244. case FTP_COMM_DOWN_UP_FILE:
  245. //case 4: want download or upload file .
  246. {
  247. FTPFILEINFO* pFile = ( FTPFILEINFO* )msg.lParam ;
  248. DownUpFtpItem( pFile ) ;
  249. if( pFile != NULL )
  250. delete pFile ;
  251. break ;
  252. }
  253. break ;
  254. case FTP_COMM_DEL_FILE :
  255. {
  256. FTPFILEINFO* pFile = ( FTPFILEINFO* )msg.lParam ;
  257. DeleteItem( pFile ) ;
  258. delete pFile ;
  259. }
  260. break ;
  261. default:
  262. break ;
  263. }
  264. //enable ftp dir list window.
  265. PostMessage( m_hWndInfo.hFtpDirListWnd , ENABLE_FTP_LIST_MSG , 1 /*enable*/ , 0 ) ;
  266. m_bRun = true ;
  267. }
  268. }
  269. }
  270. TRACE( "rn********Thread Exit******** rn" ) ;
  271. return true ;
  272. }
  273. /***********************************************************
  274. ** @Description:
  275. ** this function is send the message to thread cycle
  276. ** let the thread send command to ftp server .
  277. **
  278. ** @Parameter:
  279. ** LPSTR szCommand : the command string .
  280. **
  281. ** @Return: 
  282. ** @Author: Table.JHM.太子
  283. ** @e-mail: tablejiang@21cn.com
  284. ** Date:  2001 3 26
  285. *************************************************************/
  286. void CFtpObject::SendCommand(LPSTR szCommand)
  287. {
  288. if( !IsConnect () )
  289. return ;
  290. if( m_ControlThread.thread == NULL )
  291. {
  292. MessageBox( m_hWndInfo.hInfoWnd , "Can't send command, not connected." , "error" , MB_OK ) ;
  293. return ;
  294. }
  295. //make command string .
  296. char *pCommand ;
  297. pCommand = new char[strlen( szCommand ) + 1 ] ;
  298. strcpy( pCommand , szCommand ) ;
  299. pCommand[strlen( szCommand )] = '' ;
  300. //post command message to thread queue .
  301. BOOL bRet = PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , 
  302. FTP_COMM_NORMAL_COMMAND , (LPARAM)pCommand ) ;
  303. }
  304. /***********************************************************
  305. ** @Description:
  306. ** this public function is set the site info .and windows
  307. ** info handle .
  308. **
  309. ** @Parameter:
  310. ** SITEINFO* pSite:the site pointer.
  311. ** HWNDINFO* pWndInfo: The windows handle info pointer .
  312. **
  313. ** @Return: if success return true ,else return false .
  314. ** @Author: Table.JHM.太子
  315. ** @e-mail: tablejiang@21cn.com
  316. ** Date:  2001 3 26
  317. *************************************************************/
  318. BOOL CFtpObject::SetSiteInfo(SITEINFO *pSite , HWNDINFO* pWndInfo )
  319. {
  320. memset( &m_SiteInfo , 0 , sizeof( m_SiteInfo ) ) ;
  321. strcpy( m_SiteInfo.sitename , pSite->sitename ) ;
  322. strcpy( m_SiteInfo.host , pSite->host ) ;
  323. m_SiteInfo.hosttype = pSite->hosttype ;
  324. strcpy( m_SiteInfo.user , pSite->user ) ;
  325. strcpy( m_SiteInfo.pass , pSite->pass ) ;
  326. strcpy( m_SiteInfo.remotepath , pSite->remotepath ) ;
  327. strcpy( m_SiteInfo.localpath , pSite->localpath ) ;
  328. m_SiteInfo.logintype = pSite->logintype ;
  329. m_SiteInfo.transfertype = pSite->transfertype ;
  330. /*
  331. ZeroMemory( &m_hWndInfo , sizeof( HWNDINFO ) ) ;
  332. m_hWndInfo.hInfoWnd = pWndInfo->hInfoWnd ;
  333. m_hWndInfo.hFtpDirListWnd = pWndInfo->hFtpDirListWnd ;
  334. m_hWndInfo.hWndJobWnd = pWndInfo->hWndJobWnd ;
  335. m_hWndInfo.hMultiDownUpWnd = pWndInfo->hMultiDownUpWnd ;
  336. */
  337. return true ;
  338. }
  339. /***********************************************************
  340. ** @Description:
  341. ** this public function is used for logout ftp server .
  342. ** and abort the message thread cycle .
  343. **
  344. ** @Parameter:
  345. ** void
  346. **
  347. ** @Return: 
  348. ** @Author: Table.JHM.太子
  349. ** @e-mail: tablejiang@21cn.com
  350. ** Date:  2001 3 26
  351. *************************************************************/
  352. void CFtpObject::Logout()
  353. {
  354. if( !IsConnect( ) )
  355. return ;
  356. //StopNowCommand( ) ;
  357. //m_hEvent = CreateEvent( NULL , FALSE , FALSE , "LogoutEvent"  ) ;
  358. ::PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , FTP_COMM_EXIT , 0 ) ;
  359. DWORD dwRet = WaitForSingleObject( m_ControlThread.thread , 2000 ) ;
  360. if( dwRet == WAIT_TIMEOUT )
  361. {
  362. TerminateThread( m_ControlThread.thread , 0 )  ;
  363. CloseHandle( m_ControlThread.thread ) ;
  364. }
  365. closesocket (m_hControlSocket ) ;
  366. //CloseHandle( m_hEvent ) ;
  367. //m_hEvent = NULL ;
  368. }
  369. /***********************************************************
  370. ** @Description:
  371. ** this public function is used for list current directory.
  372. **
  373. ** @Parameter:
  374. ** void 
  375. **
  376. ** @Return:  void
  377. ** @Author: Table.JHM.太子
  378. ** @e-mail: tablejiang@21cn.com
  379. ** Date:  2001 3 26
  380. *************************************************************/
  381. void CFtpObject::ListCurrentDirectory()
  382. {
  383. if( m_ControlThread.thread != NULL )
  384. PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , FTP_COMM_LIST_DIR , 0 ) ;
  385. }
  386. /***********************************************************
  387. ** @Description:
  388. **
  389. ** @Parameter:
  390. **
  391. ** @Return: 
  392. ** @Author: Table.JHM.太子
  393. ** @e-mail: tablejiang@21cn.com
  394. ** Date:  2001 3 26
  395. *************************************************************/
  396. /*
  397. UINT PutGetFileThread( LPVOID pParam )
  398. {
  399. FTPFILEINFO* pFtpFileInfo = ( FTPFILEINFO *)pParam ;
  400. CFtpLib ftp ;
  401. UINT nReplyCode ;
  402. SOCKET hDataSocket ;
  403. SOCKET hListenSocket ;
  404. char szCommand[MAX_PATH] ;
  405. ftp.m_hWndInfo.hInfoWnd = pFtpFileInfo->hWnd ;
  406. //entry the directory .
  407. //sprintf( szCommand , "CWD %srn" , pFtpFileInfo->remotepath ) ;
  408. //nReplyCode = ftp.SendFtpCommand( szCommand , pFtpFileInfo->hSocket ) ;
  409. //if ( nReplyCode >= 400 )
  410. // return false ;
  411. //make the command , is put or get file .
  412. //if put file to server , send command STOR.
  413. //if get file from server , send command RETR.
  414. memset( szCommand , 0 , MAX_PATH );
  415. if( pFtpFileInfo->bfileput )
  416. sprintf( szCommand , "STOR %srn" , pFtpFileInfo->remotefilename ) ;
  417. else
  418. sprintf( szCommand , "RETR %srn" , pFtpFileInfo->remotefilename ) ;
  419. //set data type to I.
  420. nReplyCode = ftp.SendFtpCommand( "TYPE Irn" , pFtpFileInfo->hSocket ) ;
  421. if( nReplyCode >= 400 )
  422. return false ;
  423. //make the date link 
  424. hListenSocket = ftp.CreateListenCannel( pFtpFileInfo->hSocket ) ;
  425. if( hListenSocket == INVALID_SOCKET )
  426. return false ;
  427. nReplyCode = ftp.SendFtpCommand( szCommand , pFtpFileInfo->hSocket ) ;
  428. if( nReplyCode >= 400 )
  429. return false ;
  430. hDataSocket = ftp.AcceptDataConnect( hListenSocket ) ;
  431. if( hDataSocket == INVALID_SOCKET )
  432. return false ;
  433. if( pFtpFileInfo->bfileput )
  434. nReplyCode = ftp.WriteDataCannelFromFile( pFtpFileInfo->hSocket , hDataSocket , pFtpFileInfo->localpath ) ;
  435. else
  436. nReplyCode = ftp.ReadDataCannelToFile( pFtpFileInfo->hSocket , hDataSocket , pFtpFileInfo->localpath ) ;
  437. if( nReplyCode >= 400 || nReplyCode == 0 )
  438. return false ;
  439. delete pFtpFileInfo ;
  440. return 1 ;
  441. }
  442. */
  443. /***********************************************************
  444. ** @Description:
  445. ** this public function is used for put or get file with 
  446. ** ftp server .
  447. **
  448. ** @Parameter:
  449. ** FTPFILEINFO* pFtpFile :the file info .
  450. **
  451. ** @Return: void
  452. ** @Author: Table.JHM.太子
  453. ** @e-mail: tablejiang@21cn.com
  454. ** Date:  2001 3 26
  455. *************************************************************/
  456. void CFtpObject::PutGetFileToServer( FTPFILEINFO* pFtpFile )
  457. {
  458. FTPFILEINFO* pFtpFileInfo ;
  459. pFtpFileInfo = new FTPFILEINFO ;
  460. memset( pFtpFileInfo , 0 , sizeof( FTPFILEINFO ) ) ;
  461. memcpy( pFtpFileInfo , pFtpFile , sizeof( FTPFILEINFO ) ) ;
  462. pFtpFileInfo->hSocket = m_hControlSocket ;
  463. pFtpFile->hSocket = m_hControlSocket ;
  464. //add it to file queue .
  465. //we must add it before post message to thread .
  466. m_FileQueue.AddItem( pFtpFile ) ;
  467. //CWinThread* pThread = AfxBeginThread( PutGetFileThread , pFtpFileInfo ) ;
  468. ::PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , FTP_COMM_DOWN_UP_FILE , (LPARAM)pFtpFileInfo ) ;
  469. }
  470. /***********************************************************
  471. ** @Description:
  472. ** enter the specify directory
  473. **
  474. ** @Parameter:
  475. ** LPSTR RemotePath : Remote path which want enter.
  476. **
  477. ** @Return: void
  478. ** @Author: Table.JHM.太子
  479. ** @e-mail: tablejiang@21cn.com
  480. ** Date:  2001 3 26
  481. *************************************************************/
  482. void CFtpObject::EnterDirectory(LPSTR RemotePath)
  483. {
  484. char szCommand[MAX_PATH] ;
  485. memset( szCommand , 0 , MAX_PATH ) ;
  486. sprintf( szCommand , "CWD %srn" , RemotePath ) ;
  487. SendCommand( szCommand ) ;
  488. GetCurrentDir( ) ;
  489. }
  490. /***********************************************************
  491. ** @Description:
  492. ** enter the father directory .
  493. **
  494. ** @Parameter:
  495. ** void
  496. **
  497. ** @Return: void
  498. ** @Author: Table.JHM.太子
  499. ** @e-mail: tablejiang@21cn.com
  500. ** Date:  2001 3 26
  501. *************************************************************/
  502. void CFtpObject::EnterParentDir()
  503. {
  504. char szCommand[MAX_PATH] ;
  505. memset( szCommand , 0 , MAX_PATH ) ;
  506. sprintf( szCommand , "CDUPrn" ) ;
  507. SendCommand( szCommand ) ;
  508. GetCurrentDir ( ) ;
  509. }
  510. /***********************************************************
  511. ** @Description:
  512. ** abort current command .
  513. **
  514. ** @Parameter:
  515. **
  516. ** @Return: 
  517. ** @Author: Table.JHM.太子
  518. ** @e-mail: tablejiang@21cn.com
  519. ** Date:  2001 3 26
  520. *************************************************************/
  521. UINT AbordThread( LPVOID pParam )
  522. {
  523. CFtpObject* pFtp = (CFtpObject*)pParam ;
  524. pFtp->AbordThreadFunction ( ) ;
  525. return 1;
  526. }
  527. /***********************************************************
  528. ** @Description:
  529. ** This is use for abort current communication command .
  530. **
  531. ** @Parameter:
  532. ** void
  533. **
  534. ** @Return: if success return true , else return false . 
  535. ** @Author: Table.JHM.太子
  536. ** @e-mail: tablejiang@21cn.com
  537. ** Date:  2001 3 26
  538. *************************************************************/
  539. BOOL CFtpObject::StopNowCommand()
  540. {
  541. if( !IsConnect( ) )
  542. return false ;
  543. CWinThread* pThread = AfxBeginThread( AbordThread , this ) ;
  544. m_AbordThread.thread = pThread->m_hThread ;
  545. m_AbordThread.threadid = pThread->m_nThreadID ;
  546. //WaitForSingleObject( m_AbordThread.thread , 1000 ) ;
  547. if( m_hDataSocket )
  548. {
  549. closesocket( m_hDataSocket ) ;
  550. m_hDataSocket = NULL ;
  551. }
  552. return true ;
  553. }
  554. /***********************************************************
  555. ** @Description:
  556. ** Init the ftp class data .
  557. **
  558. ** @Parameter:
  559. **
  560. ** @Return: 
  561. ** @Author: Table.JHM.太子
  562. ** @e-mail: tablejiang@21cn.com
  563. ** Date:  2001 3 26
  564. *************************************************************/
  565. BOOL CFtpObject::InitDate()
  566. {
  567. return true ;
  568. }
  569. /***********************************************************
  570. ** @Description:
  571. ** This function is start the ftp communication connect , 
  572. ** and build the message queue .
  573. **
  574. ** @Parameter:
  575. ** void
  576. **
  577. ** @Return: the function will return after user quit ftp communication .
  578. ** @Author: Table.JHM.太子
  579. ** @e-mail: tablejiang@21cn.com
  580. ** Date:  2001 3 26
  581. *************************************************************/
  582. BOOL CFtpObject::StartCommunication()
  583. {
  584. // InitSocket( ) ;
  585. int iRetryTime = DEFAULT_RETRY_TIME ;
  586. while( !Start( ) && iRetryTime )
  587. {
  588. iRetryTime -- ;
  589. if( !iRetryTime )
  590. {
  591. sprintf( m_szFtpBuffer , _T("与服务器通讯失败!rn") ) ;
  592. SendStatusStr( m_szFtpBuffer ) ;
  593. sprintf( m_szFtpBuffer , _T("请检查服务器信息是否正确!或者是服务器连接已满!rn") ) ;
  594. SendStatusStr( m_szFtpBuffer ) ;
  595. sprintf( m_szFtpBuffer , _T("请稍候再尝试!rn") ) ;
  596. SendStatusStr( m_szFtpBuffer ) ;
  597. }
  598. }
  599. if( IsConnect( ) )
  600. {
  601. //exit the current ftp communication .
  602. char szCommand[MAX_PATH] ;
  603. sprintf( szCommand , "QUITrn" ) ;
  604. SendFtpCommand( szCommand , m_hControlSocket ) ;
  605. }
  606. CloseFtpConnect( m_hControlSocket ) ;
  607. m_hControlSocket = INVALID_SOCKET ;
  608. m_bIsConnected = FALSE ;
  609. if( m_hEvent != NULL )
  610. SetEvent( m_hEvent ) ;
  611. TRACE( "rn********Thread Exit******** rn" ) ;
  612. //enable ftp dir list window.
  613. PostMessage( m_hWndInfo.hFtpDirListWnd , ENABLE_FTP_LIST_MSG , 1 /*enable*/ , 0 ) ;
  614. UnInitSocket() ;
  615. return true ;
  616. }
  617. /***********************************************************
  618. ** @Description:
  619. ** down or up load a item .
  620. **
  621. ** @Parameter:
  622. **
  623. ** @Return: 
  624. ** @Author: Table.JHM.太子
  625. ** @e-mail: tablejiang@21cn.com
  626. ** Date:  2001 3 26
  627. *************************************************************/
  628. BOOL CFtpObject::DownUpFtpItem(FTPFILEINFO *pFile)
  629. {
  630. int iDownUpFile = 0 ;
  631. BOOL bRet = false ;
  632. FTPITEM* pItemCur ;
  633. pItemCur = NULL ;
  634. if( !m_FileQueue.IsEmpty() )
  635. {
  636. ListDirectory( false ) ;
  637. pItemCur = m_ListItem ;
  638. }
  639. if( pFile != NULL )
  640. {
  641. if( m_FileQueue.IsInFileQueue( pFile ) && pFile->state == FILE_STATE_READY )
  642. {
  643. DownUpSingleItem( pFile , pItemCur ) ;
  644. //::PostMessage( m_hWndInfo.hWndJobWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  645. iDownUpFile ++ ;
  646. }
  647. }
  648. //when transmit current file , 
  649. //transmit queue file .
  650. while( !m_FileQueue.IsEmpty() )
  651. {
  652. FTPFILEINFO* pItem ;
  653. pItem = m_FileQueue.GetNextItem( );
  654. if( pItem == NULL )
  655. break ;
  656. DownUpSingleItem( pItem , pItemCur ) ;
  657. iDownUpFile ++ ;
  658. }
  659. FreeItemList( pItemCur ) ;
  660. m_bAskUser = true ;
  661. if( iDownUpFile )
  662. ListDirectory( true ) ;
  663. return true ;
  664. }
  665. /***********************************************************
  666. ** @Description:
  667. ** send a delete file command to server.
  668. **
  669. ** @Parameter:
  670. **
  671. ** @Return: 
  672. ** @Author: Table.JHM.太子
  673. ** @e-mail: tablejiang@21cn.com
  674. ** Date:  2001 3 26
  675. *************************************************************/
  676. void CFtpObject::DeleteFile(FTPFILEINFO *pFtpFile)
  677. {
  678. FTPFILEINFO* pFtpFileInfo ;
  679. pFtpFileInfo = new FTPFILEINFO ;
  680. memset( pFtpFileInfo , 0 , sizeof( FTPFILEINFO ) ) ;
  681. memcpy( pFtpFileInfo , pFtpFile , sizeof( FTPFILEINFO ) ) ;
  682. pFtpFileInfo->hSocket = m_hControlSocket ;
  683. pFtpFile->hSocket = m_hControlSocket ;
  684. // add it to file queue .
  685. //we must add it before post message to thread .
  686. m_DeleteFileQueue.AddItem( pFtpFile ) ;
  687. //CWinThread* pThread = AfxBeginThread( PutGetFileThread , pFtpFileInfo ) ;
  688. ::PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , FTP_COMM_DEL_FILE , (LPARAM)pFtpFileInfo ) ;
  689. }
  690. /***********************************************************
  691. ** @Description:
  692. ** Delete a item ( file or directory ) .
  693. **
  694. ** @Parameter:
  695. **
  696. ** @Return: 
  697. ** @Author: Table.JHM.太子
  698. ** @e-mail: tablejiang@21cn.com
  699. ** Date:  2001 3 26
  700. *************************************************************/
  701. BOOL CFtpObject::DeleteItem(FTPFILEINFO *pFile)
  702. {
  703. int iDelItem = 0 ;
  704. if( m_DeleteFileQueue.IsInFileQueue( pFile ) )
  705. {
  706. DeleteSingleItem( pFile ) ;
  707. iDelItem ++ ;
  708. }
  709. //when transmit current file complete , 
  710. //transmit queue file .
  711. while( !m_DeleteFileQueue.IsEmpty() )
  712. {
  713. FTPFILEINFO* pItem ;
  714. //get next item .
  715. pItem = m_DeleteFileQueue.GetNextItem( );
  716. DeleteSingleItem( pItem ) ; 
  717. iDelItem ++ ;
  718. }
  719. //refresh the file list .
  720. if( iDelItem != 0 )
  721. ListDirectory( true ) ;
  722. return true ;
  723. }
  724. /****************************************************
  725. ** @Description
  726. ** send rename file command to server.
  727. **
  728. ** @Parameter
  729. **
  730. **
  731. ** @Return:
  732. ** @Author: Table.JHM.太子
  733. ** @e-mail: tablejiang@21cn.com
  734. ** Date:  2001 3 26
  735. ****************************************************/
  736. void CFtpObject::RenameFile(LPSTR szSrc, LPSTR szDes)
  737. {
  738. char szCommand[MAX_PATH] ;
  739. sprintf( szCommand , "RNFR %srn" , szSrc ) ;
  740. SendCommand( szCommand ) ;
  741. sprintf( szCommand , "RNTO %srn" , szDes ) ;
  742. SendCommand( szCommand ) ;
  743. }
  744. /****************************************************
  745. ** @Description
  746. ** run the list task.
  747. **
  748. ** @Parameter
  749. **
  750. **
  751. ** @Return:
  752. ** @Author: Table.JHM.太子
  753. ** @e-mail: tablejiang@21cn.com
  754. ** Date:  2001 3 26
  755. ****************************************************/
  756. BOOL CFtpObject::RunJobList()
  757. {
  758. ::PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , FTP_COMM_DOWN_UP_FILE , NULL ) ;
  759. return true ;
  760. }
  761. /****************************************************
  762. ** @Description
  763. ** send a make dir command to ftp server.
  764. **
  765. ** @Parameter
  766. **
  767. **
  768. ** @Return:
  769. ** @Author: Table.JHM.太子
  770. ** @e-mail: tablejiang@21cn.com
  771. ** Date:  2001 3 26
  772. ****************************************************/
  773. void CFtpObject::CreateDirectory(LPCTSTR szPath)
  774. {
  775. char szCommand[MAX_PATH] ;
  776. sprintf( szCommand , "MKD %srn" , szPath ) ;
  777. SendCommand( szCommand ) ;
  778. }
  779. /****************************************************
  780. ** @Description
  781. ** download a ftp item .
  782. **
  783. ** @Parameter
  784. **
  785. **
  786. ** @Return:
  787. ** @Author: Table.JHM.太子
  788. ** @e-mail: tablejiang@21cn.com
  789. ** Date:  2001 3 26
  790. ****************************************************/
  791. BOOL CFtpObject::DownUpSingleItem(FTPFILEINFO *pFile , FTPITEM* pItemCur )
  792. {
  793. //first ,we transmit the current file , after complete this ,
  794. //we will transmit the task queue.
  795. pFile->hSocket = m_hControlSocket ;
  796. m_FileQueue.SetItemState( FILE_STATE_RUNNING , pFile ) ;
  797. //is upload 
  798. if( pFile->bfileput )
  799. {
  800. //is directory.
  801. if( pFile->bIsDirectory )
  802. {
  803. //backup current ftp path .
  804. //because transmit directory will change the dir.
  805. char szPathBak[MAX_PATH] ;
  806. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  807. //upload.
  808. if( !UploadDirectory( pFile ) )
  809. //if error , set status.
  810. m_FileQueue.SetItemState( FILE_STATE_ERROR , pFile ) ;
  811. //restore the directory.
  812. EnterFtpDirectory( szPathBak ) ;
  813. if( !GetCurrentFtpDir() )
  814. return false ;
  815. }
  816. else
  817. {
  818. //is file already exist in ftp server .
  819. pFile->startpos = FindFileInFileList( pFile->remotefilename , pItemCur ) ;
  820. if( !BrokenDownload( pFile ) )
  821. m_FileQueue.SetItemState( FILE_STATE_ERROR , pFile ) ;
  822. }
  823. }
  824. //download.
  825. else
  826. {
  827. if( pFile->bIsDirectory )
  828. {
  829. //backup directory.
  830. char szPathBak[MAX_PATH] ;
  831. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  832. if( !DownLoadDirectory( pFile ) )
  833. m_FileQueue.SetItemState( FILE_STATE_ERROR , pFile ) ;
  834. EnterFtpDirectory( szPathBak ) ;
  835. if( !GetCurrentFtpDir() )
  836. return false ;
  837. }
  838. else
  839. {
  840. char szFilePathName[MAX_PATH] ;
  841. sprintf( szFilePathName , "%s%s" , pFile->localpath , 
  842. pFile->localfilename ) ;
  843. pFile->startpos = FindFileInLocal( szFilePathName ) ;
  844. if( !BrokenDownload( pFile ) )
  845. m_FileQueue.SetItemState( FILE_STATE_ERROR , pFile ) ;
  846. }
  847. }
  848. return true ;
  849. }
  850. /****************************************************
  851. ** @Description
  852. **
  853. **
  854. ** @Parameter
  855. **
  856. **
  857. ** @Return:
  858. ** @Author: Table.JHM.太子
  859. ** @e-mail: tablejiang@21cn.com
  860. ** @Date: 2001 3 26
  861. ****************************************************/
  862. void CFtpObject::GetCurrentDir()
  863. {
  864. if( !IsConnect() )
  865. return ;
  866. PostThreadMessage( m_ControlThread.threadid , FTP_SERVER_COMMAND_MSG , FTP_COMM_GET_CUR_DIR , 0 ) ;
  867. }
  868. /****************************************************
  869. ** @Description
  870. **
  871. **
  872. ** @Parameter
  873. **
  874. **
  875. ** @Return:
  876. ** @Author: Table.JHM.太子
  877. ** @e-mail: tablejiang@21cn.com
  878. ** @Date: 2001 3 26
  879. ****************************************************/
  880. BOOL CFtpObject::DeleteSingleItem(FTPFILEINFO *pItem)
  881. {
  882. if( pItem == NULL )
  883. return false ;
  884. if( pItem->bIsDirectory )
  885. {
  886. //backup current directory .
  887. char szPathBak[MAX_PATH] ;
  888. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  889. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  890. //first we must clear the dir.
  891. DeleteFtpDirectory( pItem ) ;
  892. EnterFtpDirectory( szPathBak ) ;
  893. if( !GetCurrentFtpDir() )
  894. return false ;
  895. //after clear the directory , remove it.
  896. RemoveFtpDirectory( pItem->remotefilename ) ;
  897. }
  898. else
  899. DeleteFtpFile( pItem->remotefilename ) ;
  900. //remove the queue item .
  901. m_DeleteFileQueue.DeleteItem( pItem );
  902. return true ;
  903. }