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

Ftp客户端

开发平台:

Visual C++

  1. // FtpTransmitFile.cpp: implementation of the CFtpTransmitFile 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 "QuickFTP.h"
  14. #include "FtpFunction.h"
  15. #include "InputFileNameDlg.h"
  16. #include "shlwapi.h"
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char THIS_FILE[]=__FILE__;
  20. #define new DEBUG_NEW
  21. #endif
  22. //////////////////////////////////////////////////////////////////////
  23. // Construction/Destruction
  24. //////////////////////////////////////////////////////////////////////
  25. CFtpFunction::CFtpFunction()
  26. {
  27. m_bAskUser = true ;
  28. m_iWhenExistAction = 0 ;
  29. }
  30. CFtpFunction::~CFtpFunction()
  31. {
  32. }
  33. /***********************************************************
  34. ** @Description:
  35. ** Send "ABORrn" command to fpt server, 
  36. abord the current data link .
  37. ** @Parameter:
  38. **
  39. ** @Return: 
  40. ** @Author:    Table.JHM.太子
  41. ** e-mail: tablejiang@21cn.com
  42. ** Date: 2001 3 26
  43. *************************************************************/
  44. BOOL CFtpFunction::AbordThreadFunction()
  45. {
  46. char szCommand[MAX_PATH] ;
  47. memset( szCommand , 0 , MAX_PATH) ;
  48. closesocket( m_hDataSocket ) ;
  49. sprintf( szCommand , "ABORrn" ) ;
  50. SendFtpCommand( szCommand , m_hControlSocket ) ;
  51. ClearUpReceiveBuffer( ) ;
  52. return true ;
  53. }
  54. /***********************************************************
  55. ** @Description:
  56. ** check the ftp server is support broken download.
  57. **
  58. ** @Parameter:
  59. **
  60. ** @Return: if support return true ,else return false .
  61. ** @Author:    Table.JHM.太子
  62. ** e-mail: tablejiang@21cn.com
  63. ** Date: 2001 3 26
  64. *************************************************************/
  65. BOOL CFtpFunction::CheckBrokenDownload()
  66. {
  67. //set type I
  68. UINT nReplyCode = 0 ;
  69. nReplyCode = SendFtpCommand( "TYPE Irn" , m_hControlSocket ) ;
  70. if( nReplyCode != 200 )
  71. return false ;
  72. //reset file pointer.
  73. nReplyCode = SendFtpCommand( "REST 100rn" , m_hControlSocket ) ;
  74. if( nReplyCode >= 400 )
  75. return false ;
  76. if( nReplyCode == 350 )
  77. {
  78. m_SiteInfo.brokendownload = true ; 
  79. sprintf( m_szFtpBuffer , _T("站点支持断点续传") ) ;
  80. SendStatusStr( m_szFtpBuffer ) ;
  81. }
  82. else
  83. {
  84. m_SiteInfo.brokendownload = false ;
  85. sprintf( m_szFtpBuffer , _T("站点不支持断点续传") ) ;
  86. SendStatusStr( m_szFtpBuffer ) ;
  87. }
  88. //reset.
  89. nReplyCode = SendFtpCommand( "REST 0rn" , m_hControlSocket ) ;
  90. if( nReplyCode >= 400 )
  91. return false ;
  92. return true ;
  93. }
  94. /***********************************************************
  95. ** @Description:
  96. ** check the ftp server operate system type .
  97. **
  98. ** @Parameter:
  99. **
  100. ** @Return: if success return true , else return false 
  101. ** @Author:    Table.JHM.太子
  102. ** e-mail: tablejiang@21cn.com
  103. ** Date: 2001 3 26
  104. *************************************************************/
  105. BOOL CFtpFunction::CheckServerType()
  106. {
  107. UINT uReplyCode = 0 ;
  108. char szBuffer[1024] ;
  109. int iLength = 0 ;
  110. //send syst command .
  111. sprintf( szBuffer , "SYSTrn" ) ;
  112. if( send( m_hControlSocket , szBuffer , strlen( szBuffer ) , 0 ) == SOCKET_ERROR ) 
  113. {
  114. int iWinsockErr = WSAGetLastError( ) ;
  115. sprintf( m_szFtpBuffer , " %d error while Send ftp command !" , iWinsockErr ) ;
  116. MessageBox( NULL , m_szFtpBuffer , MSGBOX_TITLE , MB_OK ) ;
  117. return ( ERROR_FTP_CODE ) ;
  118. }
  119. //Send msg to window .
  120. SendMsgToParentWnd( szBuffer , true ) ;
  121. //receive server reply string .
  122. if( ( iLength = recv( m_hControlSocket , szBuffer , 1024 , 0 ) ) == SOCKET_ERROR )
  123. {
  124. int iWinsockErr = WSAGetLastError( ) ;
  125. sprintf( m_szFtpBuffer , " %d error while recv server reply!" , iWinsockErr ) ;
  126. MessageBox( NULL , m_szFtpBuffer , MSGBOX_TITLE , MB_OK ) ;
  127. return ( ERROR_FTP_CODE ) ;
  128. }
  129. if( iLength < MAX_PATH )
  130. szBuffer[ iLength ] = 0 ;
  131. else
  132. szBuffer[ MAX_PATH - 1 ] = 0 ;
  133. //Send msg to window .
  134. SendMsgToParentWnd( szBuffer , false ) ;
  135. UINT nReplyCode = GetReplyCode ( szBuffer ) ;
  136. if( nReplyCode >= 400 || nReplyCode <= 0 )
  137. return false ;
  138. if( strstr( szBuffer , "UNIX" ) != NULL )
  139. {
  140. m_SiteInfo.hosttype = 1 ;
  141. }
  142. else
  143. {
  144. if( strstr( szBuffer , _T("Windows_NT") ) != NULL )
  145. m_SiteInfo.hosttype = 2 ;
  146. else
  147. m_SiteInfo.hosttype = 1 ;
  148. }
  149. return true ;
  150. }
  151. /***********************************************************
  152. ** @Description:
  153. ** Because the receive buffer can leave some message,
  154. so we must clear the receive buffer before 
  155. send another command .
  156. ** @Parameter:
  157. ** void 
  158. **
  159. ** @Return: void
  160. ** @Author:    Table.JHM.太子
  161. ** e-mail: tablejiang@21cn.com
  162. ** Date: 2001 3 26
  163. *************************************************************/
  164. void CFtpFunction::ClearUpReceiveBuffer()
  165. {
  166. while( true ) 
  167. {
  168. if( !IsReadyToRead( m_hControlSocket ) )
  169. {
  170. return ;
  171. }
  172. GetServerReply(  m_hControlSocket ) ;
  173. }
  174. }
  175. /***********************************************************
  176. ** @Description:
  177. ** Create the specify directory in ftp server .
  178. **
  179. ** @Parameter:
  180. ** LPSTR szPath :the directory name which want create.
  181. **
  182. ** @Return: if success return true ,else return false .
  183. ** @Author:    Table.JHM.太子
  184. ** e-mail: tablejiang@21cn.com
  185. ** Date: 2001 3 26
  186. *************************************************************/
  187. BOOL CFtpFunction::CreateFtpDirectory(LPCTSTR szPath)
  188. {
  189. char szCommand[MAX_PATH] ;
  190. UINT nReplyCode = 0 ;
  191. sprintf( szCommand , "MKD %srn" , szPath ) ;
  192. nReplyCode = SendFtpCommand( szCommand , m_hControlSocket ) ;
  193. if( nReplyCode >= 400 )
  194. return false  ;
  195. else
  196. return true ;
  197. }
  198. /***********************************************************
  199. ** @Description:
  200. ** transmit file function . this function download or upload
  201. ** the specify file.
  202. **
  203. ** @Parameter:
  204. ** FTPFILEINFO* pParam : ftp file info.
  205. **
  206. ** @Return: success true ,else false .
  207. ** @Author:    Table.JHM.太子
  208. ** e-mail: tablejiang@21cn.com
  209. ** Date: 2001 3 26
  210. *************************************************************/
  211. BOOL CFtpFunction::PutGetFileFunction(FTPFILEINFO *pParam)
  212. {
  213. FTPFILEINFO FtpFileInfo ;
  214. memcpy( &FtpFileInfo , pParam , sizeof( FTPFILEINFO ) ) ;
  215. UINT nReplyCode ;
  216. SOCKET hDataSocket ;
  217. SOCKET hListenSocket ;
  218. char szCommand[MAX_PATH] ;
  219. //make full path name ;
  220. char szPathName[MAX_PATH] ;
  221. strcpy( szPathName , FtpFileInfo.localpath ) ;
  222. int iLength = strlen( FtpFileInfo.localpath ) ;
  223. if( szPathName[iLength-1 ] != '\' )
  224. {
  225. szPathName[iLength]= '\' ;
  226. szPathName[iLength+1] = '' ;
  227. }
  228. strcat( szPathName , FtpFileInfo.localfilename ) ;
  229. HANDLE hFile ;
  230. //open local file ,and set ftp file info.
  231. hFile = OpenLocalFile( &FtpFileInfo , szPathName ) ;//CreateFile( szPathName , GENERIC_READ | GENERIC_WRITE ,  FILE_SHARE_READ , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0 ) ;
  232. if( hFile == INVALID_HANDLE_VALUE )
  233. {
  234. return false ;
  235. }
  236. //entry the directory .
  237. //sprintf( szCommand , "CWD %srn" , pFtpFileInfo->remotepath ) ;
  238. //nReplyCode = ftp.SendFtpCommand( szCommand , pFtpFileInfo->hSocket ) ;
  239. //if ( nReplyCode >= 400 )
  240. // return false ;
  241. //make the command , is put or get file .
  242. //if put file to server , send command STOR.
  243. //if get file from server , send command RETR.
  244. memset( szCommand , 0 , MAX_PATH );
  245. /*
  246. if( FtpFileInfo.site.brokendownload )
  247. {
  248. char szTemp[MAX_PATH] ;
  249. strcpy( szCommand , "REST " ) ;
  250. _i64toa( FtpFileInfo.startpos , szTemp , 10 ) ;
  251. strcat( szCommand , szTemp ) ;
  252. strcat( szCommand , "rn" ) ;
  253. nReplyCode = SendFtpCommand( szCommand , FtpFileInfo.hSocket ) ;
  254. if( nReplyCode == 350 )
  255. MyFileSeek( hFile , FtpFileInfo.startpos ,  FILE_BEGIN ) ;
  256. }
  257. if( FtpFileInfo.bfileput )
  258. sprintf( szCommand , "STOR %srn" , FtpFileInfo.remotefilename ) ;
  259. else
  260. sprintf( szCommand , "APPE %srn" , FtpFileInfo.remotefilename ) ;
  261. */
  262. //make the broken transmit pos .
  263. MakeBrokenPos( szCommand , &FtpFileInfo , hFile ) ;
  264. //set data type to I.
  265. nReplyCode = SendFtpCommand( "TYPE Irn" , FtpFileInfo.hSocket ) ;
  266. if( nReplyCode >= 400 )
  267. {
  268. CloseHandle( hFile ) ;
  269. hFile = INVALID_HANDLE_VALUE ;
  270. return false ;
  271. }
  272. //make the date link 
  273. hListenSocket = CreateListenCannel( FtpFileInfo.hSocket ) ;
  274. if( hListenSocket == INVALID_SOCKET )
  275. {
  276. CloseHandle( hFile ) ;
  277. hFile = INVALID_HANDLE_VALUE ;
  278. return false ;
  279. }
  280. //send transmit command .
  281. nReplyCode = SendFtpCommand( szCommand , FtpFileInfo.hSocket ) ;
  282. if( nReplyCode >= 400 )
  283. {
  284. CloseHandle( hFile ) ;
  285. hFile = INVALID_HANDLE_VALUE ;
  286. return false ;
  287. }
  288. //accept the connected.
  289. hDataSocket = AcceptDataConnect( hListenSocket ) ;
  290. if( hDataSocket == INVALID_SOCKET )
  291. {
  292. CloseHandle( hFile ) ;
  293. hFile = INVALID_HANDLE_VALUE ;
  294. return false ;
  295. }
  296. //notify the parent wnd .
  297. SendFileNameToParentWnd( FtpFileInfo.remotefilename ) ;
  298. //start transmit.
  299. if( FtpFileInfo.bfileput )
  300. nReplyCode = WriteDataCannelFromFile( FtpFileInfo.hSocket , hDataSocket , hFile ) ;
  301. else
  302. nReplyCode = ReadDataCannelToFile( FtpFileInfo.hSocket , hDataSocket , hFile , FtpFileInfo.filesize ) ;
  303. //clear server reply buffer .
  304. ClearUpReceiveBuffer( ) ;
  305. closesocket( hListenSocket ) ;
  306. if( nReplyCode >= 400 || nReplyCode == 0 )
  307. {
  308. CloseHandle( hFile ) ;
  309. return false ;
  310. }
  311. m_FileQueue.DeleteItem( pParam ) ;
  312. return 1 ;
  313. }
  314. /***********************************************************
  315. ** @Description:
  316. ** this function is upload a directory to ftp server.
  317. ** this function use recursion arithmetic .
  318. **
  319. ** @Parameter:
  320. ** FTPFILEINFO* pFileInfo : the directory info.
  321. **
  322. ** @Return: success true ,else false .
  323. ** @Author:    Table.JHM.太子
  324. ** e-mail: tablejiang@21cn.com
  325. ** Date: 2001 3 26
  326. *************************************************************/
  327. BOOL CFtpFunction::UploadDirectory(FTPFILEINFO *pFileInfo)
  328. {
  329. FTPITEM* pItemQueueHead ;
  330. FTPITEM* pItemCur ;
  331. FTPFILEINFO FtpFileInfo ;
  332. char szPathBak[MAX_PATH] ;
  333. BOOL bRet ;
  334. //copy the dir info.
  335. memcpy( &FtpFileInfo , pFileInfo , sizeof( FTPFILEINFO ) ) ;
  336. //prepare the path .
  337. if( !MakeFtpUploadPath( &FtpFileInfo ) )
  338. return false ;
  339. //backup current path.
  340. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  341. CFileFind find ;
  342. CString Path = FtpFileInfo.localpath ;
  343. if( Path.Right( 1 ) != '\' )
  344. Path += '\' ;
  345. Path += "*.*" ;
  346. BOOL bFind = find.FindFile( Path ) ;
  347. pItemQueueHead = m_ListItem ;
  348. pItemCur = m_ListItem ;
  349. while( bFind )
  350. {
  351. bFind = find.FindNextFile( ) ;
  352. if( find.IsDirectory() && !find.IsDots( ) )
  353. {
  354. //is directory .
  355. FtpFileInfo.bfileput = true ;
  356. FtpFileInfo.bIsDirectory = true ;
  357. FtpFileInfo.endpos = 0 ;
  358. FtpFileInfo.startpos = 0 ;
  359. strcpy( FtpFileInfo.remotefilename , find.GetFileName( ) ) ;
  360. strcpy( FtpFileInfo.localfilename , find.GetFileName( ) ) ;
  361. //FtpFileInfo.hSocket = pFileInfo->hSocket ;
  362. //FtpFileInfo.hWnd = pFileInfo->hWnd ;
  363. UploadDirectory( &FtpFileInfo ) ;
  364. EnterFtpDirectory( szPathBak ) ;
  365. if( !GetCurrentFtpDir() )
  366. return false ;
  367. }
  368. if ( !find.IsDirectory() )
  369. {
  370. //is file .
  371. FtpFileInfo.bfileput = true ;
  372. FtpFileInfo.bIsDirectory = false ;
  373. FtpFileInfo.endpos = 0 ;
  374. //is the file already exist in server?
  375. FtpFileInfo.startpos = FindFileInFileList( find.GetFileName( ) , pItemCur ) ;
  376. strcpy( FtpFileInfo.remotefilename , find.GetFileName( ) ) ;
  377. strcpy( FtpFileInfo.localfilename , find.GetFileName( ) ) ;
  378. //broken transmit .
  379. bRet = BrokenDownload( &FtpFileInfo ) ;
  380. if( !bRet )
  381. return false ;
  382. }
  383. }
  384. //free the ftp file list.
  385. FreeItemList( pItemCur ) ;
  386. m_FileQueue.DeleteItem( pFileInfo ) ;
  387. return true ;
  388. }
  389. /***********************************************************
  390. ** @Description:
  391. ** the function is download a directory from server.
  392. ** this function use recursion arithmetic .
  393. **
  394. ** @Parameter:
  395. **
  396. ** @Return: 
  397. ** @Author:    Table.JHM.太子
  398. ** e-mail: tablejiang@21cn.com
  399. ** Date: 2001 3 26
  400. *************************************************************/
  401. BOOL CFtpFunction::DownLoadDirectory(FTPFILEINFO *pFileInfo)
  402. {
  403. FTPITEM* pItemQueueHead ;
  404. FTPITEM* pItemCur ;
  405. FTPFILEINFO FtpFileInfo ;
  406. char szPathBak[MAX_PATH] ;
  407. BOOL bRet = true ;
  408. memcpy( &FtpFileInfo , pFileInfo , sizeof( FTPFILEINFO ) ) ;
  409. //prepare the directory .
  410. if( !MakeFtpDownloadPath( &FtpFileInfo ) )
  411. return false ;
  412. //get the current dir .
  413. if( !GetCurrentFtpDir() )
  414. return false ;
  415. //backup current directory.
  416. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  417. if( m_ListItem->pNext == NULL )
  418. {
  419. m_FileQueue.DeleteItem( pFileInfo ) ;
  420. return true ;
  421. }
  422. pItemQueueHead = m_ListItem ;
  423. pItemCur = m_ListItem ;
  424. while( pItemCur->pNext != NULL )
  425. {
  426. //is directory .
  427. if( pItemCur->dwType == 1 )
  428. {
  429. //make directory info.
  430. FtpFileInfo.bfileput = false ;
  431. FtpFileInfo.bIsDirectory = true ;
  432. FtpFileInfo.endpos = 0 ;
  433. FtpFileInfo.startpos = 0 ;
  434. strcpy( FtpFileInfo.remotefilename , pItemCur->szName ) ;
  435. strcpy( FtpFileInfo.localfilename , pItemCur->szName ) ;
  436. //download directory.
  437. bRet = DownLoadDirectory( &FtpFileInfo ) ;
  438. //after download directory, we must recover the directory.
  439. EnterFtpDirectory( szPathBak ) ;
  440. if( !bRet )
  441. return false ;
  442. }
  443. else
  444. {
  445. FtpFileInfo.bfileput = false ;
  446. FtpFileInfo.bIsDirectory = false ;
  447. FtpFileInfo.endpos = 0 ;
  448. strcpy( FtpFileInfo.remotefilename , pItemCur->szName ) ;
  449. strcpy( FtpFileInfo.localfilename , pItemCur->szName ) ;
  450. char szFilePathName[MAX_PATH] ;
  451. sprintf( szFilePathName , "%s%s" , FtpFileInfo.localpath , 
  452. FtpFileInfo.localfilename ) ;
  453. FtpFileInfo.filesize = _atoi64( pItemCur->szSize ) ;
  454. //find the start pos.
  455. FtpFileInfo.startpos = FindFileInLocal( szFilePathName ) ;
  456. bRet = BrokenDownload( &FtpFileInfo ) ;
  457. if( !bRet )
  458. return false ;
  459. }
  460. pItemCur = pItemCur->pNext ;
  461. }
  462. //free the list.
  463. FreeItemList( pItemQueueHead ) ;
  464. m_FileQueue.DeleteItem( pFileInfo ) ;
  465. return true ;
  466. }
  467. /***********************************************************
  468. ** @Description:
  469. ** this function is perpare the download path .
  470. **
  471. ** @Parameter:
  472. ** FTPFILEINFO* pFileInfo : the download item info.
  473. **
  474. ** @Return: 
  475. ** @Author:    Table.JHM.太子
  476. ** e-mail: tablejiang@21cn.com
  477. ** Date: 2001 3 26
  478. *************************************************************/
  479. BOOL CFtpFunction::MakeFtpDownloadPath(FTPFILEINFO *pFileInfo)
  480. {
  481. int iLength = strlen( pFileInfo->localpath ) ;
  482. if( pFileInfo->localpath[iLength-1] != '\' )
  483. {
  484. pFileInfo->localpath[iLength] = '\' ;
  485. pFileInfo->localpath[iLength + 1] = '' ;
  486. }
  487. //make local path.
  488. strcat( pFileInfo->localpath , pFileInfo->remotefilename ) ;
  489. strcat( pFileInfo->localpath , "\" ) ;
  490. //create local path .
  491. CreateDirectory( pFileInfo->localpath , NULL ) ;
  492. //make remote path
  493. iLength = strlen( pFileInfo->remotepath ) ;
  494. if( pFileInfo->remotepath[iLength-1] != '/' )
  495. {
  496. pFileInfo->remotepath[iLength] = '/' ;
  497. pFileInfo->remotepath[iLength + 1] = '' ;
  498. }
  499. strcat( pFileInfo->remotepath , pFileInfo->remotefilename ) ;
  500. strcat( pFileInfo->remotepath , "/" ) ;
  501. //enter remote path.
  502. if( !EnterFtpDirectory( pFileInfo->remotepath ) )
  503. return false ;
  504. if( !GetCurrentFtpDir() )
  505. return false ;
  506. ListDirectory( false ) ;
  507. return true  ;
  508. }
  509. /***********************************************************
  510. ** @Description:
  511. ** this function is enter specify remote path .
  512. **
  513. ** @Parameter:
  514. ** LPSTR strPath : the remote path.
  515. **
  516. ** @Return: success return true ,else return false .
  517. ** @Author:    Table.JHM.太子
  518. ** e-mail: tablejiang@21cn.com
  519. ** Date: 2001 3 26
  520. *************************************************************/
  521. BOOL CFtpFunction::EnterFtpDirectory(LPSTR strPath)
  522. {
  523. char szCommand[MAX_PATH] ;
  524. UINT nReplyCode = 0 ;
  525. //make command .
  526. sprintf( szCommand , "CWD %srn" , strPath ) ;
  527. //send command .
  528. nReplyCode = SendFtpCommand( szCommand , m_hControlSocket ) ;
  529. if( nReplyCode >= 400 )
  530. return false  ;
  531. else
  532. return true ;
  533. }
  534. /***********************************************************
  535. ** @Description:
  536. ** this function is free the ftp file queue.
  537. **
  538. ** @Parameter:
  539. ** FTPITEM* pFtpItem :the file queue head pointer.
  540. **
  541. ** @Return: 
  542. ** @Author:    Table.JHM.太子
  543. ** e-mail: tablejiang@21cn.com
  544. ** Date: 2001 3 26
  545. *************************************************************/
  546. BOOL CFtpFunction::FreeItemList(FTPITEM * pFtpItem )
  547. {
  548. FTPITEM * pNextItem = pFtpItem ;
  549. FTPITEM * pCurItem = pFtpItem ;
  550. while( pNextItem != NULL )
  551. {
  552. pCurItem = pNextItem ;
  553. pNextItem = pNextItem->pNext ;
  554. try
  555. {
  556. delete pCurItem ;
  557. }
  558. catch(...)
  559. {
  560. TRACE( "memory delete error!" ) ;
  561. }
  562. pCurItem = NULL ;
  563. }
  564. return true ;
  565. }
  566. /***********************************************************
  567. ** @Description:
  568. ** this function is prepare the upload directory.
  569. **
  570. ** @Parameter:
  571. ** FTPFILEINFO* pFileInfo : the ftp file info.
  572. **
  573. ** @Return: 
  574. ** @Author:    Table.JHM.太子
  575. ** e-mail: tablejiang@21cn.com
  576. ** Date: 2001 3 26
  577. *************************************************************/
  578. BOOL CFtpFunction::MakeFtpUploadPath(FTPFILEINFO* pFileInfo )
  579. {
  580. int iLength = strlen( pFileInfo->localpath ) ;
  581. //make local path.
  582. if( pFileInfo->localpath[iLength-1] != '\' )
  583. {
  584. pFileInfo->localpath[iLength] = '\' ;
  585. pFileInfo->localpath[iLength + 1] = '' ;
  586. }
  587. strcat( pFileInfo->localpath , pFileInfo->localfilename ) ;
  588. iLength = strlen( pFileInfo->remotepath ) ;
  589. //create the fpt directory , 
  590. //we needn't to chech the success or not .
  591. CreateFtpDirectory( pFileInfo->remotefilename ) ;
  592. strcat( pFileInfo->localpath , "\" ) ;
  593. //make remote path.
  594. if( pFileInfo->remotepath[iLength-1] != '/' )
  595. {
  596. pFileInfo->remotepath[iLength] = '/' ;
  597. pFileInfo->remotepath[iLength + 1] = '' ;
  598. }
  599. strcat( pFileInfo->remotepath , pFileInfo->localfilename ) ;
  600. //enter remote path.
  601. if( !EnterFtpDirectory( pFileInfo->remotepath ) )
  602. return false ;
  603. strcat( pFileInfo->remotepath , "/" ) ;
  604. if( !GetCurrentFtpDir() )
  605. return false ;
  606. ListDirectory( false ) ;
  607. return true  ;
  608. }
  609. /***********************************************************
  610. ** @Description:
  611. ** this function list the current directory , and get
  612. ** current directory file list.
  613. ** @Parameter:
  614. ** BOOL bWantSend : is want send list to parent wnd ?
  615. **
  616. ** @Return: 
  617. ** @Author:    Table.JHM.太子
  618. ** e-mail: tablejiang@21cn.com
  619. ** Date: 2001 3 26
  620. *************************************************************/
  621. BOOL CFtpFunction::ListDirectory( BOOL bWantSend )
  622. {
  623. SOCKET hDataSocket ;
  624. SOCKET hListenSocket ;
  625. int nReplyCode = 0 ;
  626. //make the status .
  627. //sprintf( m_szFtpBuffer , "刷新文件列表rn" ) ;
  628. //SendStatusStr( m_szFtpBuffer ) ;
  629. nReplyCode = SendFtpCommand( "TYPE Arn" , m_hControlSocket ) ;
  630. if( nReplyCode >= 400 || nReplyCode <= 0 )
  631. return false ;
  632. hListenSocket = CreateListenCannel( m_hControlSocket ) ;
  633. if( hListenSocket == INVALID_SOCKET )
  634. return false ;
  635. nReplyCode = SendFtpCommand( "LISTrn" , m_hControlSocket ) ;
  636. if( nReplyCode >= 400 || nReplyCode <= 0 )
  637. return false ;
  638. //now let UI wait the thread receive list data complete .
  639. char* pStr ;
  640. pStr = new char[1];
  641. pStr[0] = '' ;
  642. ::PostMessage( m_hWndInfo.hInfoWnd , FTP_SEND_COMMAND_MSG , 0 , (LPARAM)pStr );
  643. //accept the server connect socket .
  644. hDataSocket = AcceptDataConnect( hListenSocket ) ;
  645. m_hDataSocket = hDataSocket ;
  646. if( hDataSocket == INVALID_SOCKET )
  647. return false ;
  648. //send status msg
  649. sprintf( m_szFtpBuffer , "接收文件目录列表....." ) ;
  650. SendStatusStr( m_szFtpBuffer ) ;
  651. //read the data from the data link.
  652. nReplyCode = ReadDataCannel( m_hControlSocket , hDataSocket , bWantSend ) ;
  653. if( nReplyCode >= 400 || nReplyCode <= 0 )
  654. return false ;
  655. closesocket( hListenSocket ) ;
  656. hListenSocket = INVALID_SOCKET ;
  657. //send status msg.
  658. sprintf( m_szFtpBuffer , "接收完毕" ) ;
  659. SendStatusStr( m_szFtpBuffer ) ;
  660. return true ;
  661. }
  662. /***********************************************************
  663. ** @Description:
  664. ** this function is get current ftp directory.
  665. **
  666. ** @Parameter:
  667. ** void
  668. **
  669. ** @Return: 
  670. ** @Author:    Table.JHM.太子
  671. ** e-mail: tablejiang@21cn.com
  672. ** Date: 2001 3 26
  673. *************************************************************/
  674. BOOL CFtpFunction::GetCurrentFtpDir()
  675. {
  676. char szBuffer[MAX_PATH] ;
  677. int iLength = 0 ;
  678. //make command .
  679. sprintf( szBuffer , "PWDrn" ) ;
  680. if( !m_bRun )
  681. return ERROR_FTP_CODE ;
  682. //send command.
  683. if( send( m_hControlSocket , szBuffer , strlen( szBuffer ) , 0 ) == SOCKET_ERROR ) 
  684. {
  685. int iWinsockErr = WSAGetLastError( ) ;
  686. sprintf( m_szFtpBuffer , " %d error while Send ftp command !" , iWinsockErr ) ;
  687. MessageBox( NULL , m_szFtpBuffer , MSGBOX_TITLE , MB_OK ) ;
  688. return ( ERROR_FTP_CODE ) ;
  689. }
  690. SendMsgToParentWnd( szBuffer , true ) ;
  691. //  AfxMessageBox( szBuffer ) ;
  692. //peek the message .
  693. if( ( iLength = recv( m_hControlSocket , szBuffer , 1024 , MSG_PEEK ) ) == SOCKET_ERROR )
  694. {
  695. int iWinsockErr = WSAGetLastError( ) ;
  696. sprintf( m_szFtpBuffer , " %d error while recv server reply!" , iWinsockErr ) ;
  697. MessageBox( NULL , m_szFtpBuffer , MSGBOX_TITLE , MB_OK ) ;
  698. //return ( ERROR_FTP_CODE ) ;
  699. }
  700. int iBuffer = 0 ;
  701. while( szBuffer[iBuffer] != 'n' )
  702. {
  703. iBuffer ++ ;
  704. if( iBuffer >= iLength )
  705. break ;
  706. }
  707. iBuffer ++ ;
  708. //add by table 2001 4 24
  709. //test recv in win98
  710. //iBuffer = MAX_PATH ;
  711. //receive server reply string .
  712. if( ( iLength = recv( m_hControlSocket , szBuffer , iBuffer , 0 ) ) == SOCKET_ERROR )
  713. {
  714. int iWinsockErr = WSAGetLastError( ) ;
  715. sprintf( m_szFtpBuffer , " %d error while recv server reply!" , iWinsockErr ) ;
  716. MessageBox( NULL , m_szFtpBuffer , MSGBOX_TITLE , MB_OK ) ;
  717. return ( ERROR_FTP_CODE ) ;
  718. }
  719. if( iLength < MAX_PATH )
  720. szBuffer[ iLength ] = 0 ;
  721. else
  722. szBuffer[ MAX_PATH - 1 ] = 0 ;
  723. //Send msg to window .
  724. SendMsgToParentWnd( szBuffer , false ) ;
  725. UINT nReplyCode = GetReplyCode ( szBuffer ) ;
  726. if( nReplyCode >= 400 || nReplyCode <= 0 )
  727. return false ;
  728. //Get return path string .
  729. //the server reply string include the current path .
  730. CString strFind = szBuffer ;
  731. int StartPos = 0 ;
  732. int EndPos = 0 ; 
  733. memset( m_CurrentFtpDirectory , 0 , sizeof( m_CurrentFtpDirectory) ) ;
  734. if( ( StartPos =strFind.Find( """ , 0 ) ) == -1 )
  735. return true ;
  736. StartPos ++ ;
  737. if( ( EndPos = strFind.Find ( """ , StartPos ) ) == -1 )
  738. return true ;
  739. strFind = strFind.Mid( StartPos , EndPos - StartPos ) ;
  740. strcpy( m_CurrentFtpDirectory , (LPCTSTR)strFind ) ;
  741. return true  ;
  742. }
  743. /***********************************************************
  744. ** @Description:
  745. ** read data from cannel.
  746. **
  747. ** @Parameter:
  748. **
  749. ** @Return: 
  750. ** @Author:    Table.JHM.太子
  751. ** e-mail: tablejiang@21cn.com
  752. ** Date: 2001 3 26
  753. *************************************************************/
  754. UINT CFtpFunction::ReadDataCannel(SOCKET hControlSocket, SOCKET hDataSocket , BOOL bWantSend )
  755. {
  756. DWORD nByteRec = 0 ;
  757. DWORD lDataNum = 0 ;
  758. char ReceiveBuffer[64] ;
  759. //use CString class to store the data
  760. CString strBuffer ;
  761. strBuffer.Empty() ;
  762. do
  763. {
  764. memset( ReceiveBuffer , 0 , sizeof( ReceiveBuffer ) ) ;
  765. nByteRec = recv( hDataSocket , ReceiveBuffer , 63 , 0 ) ;
  766. if( nByteRec == SOCKET_ERROR )
  767. break ;
  768. if( nByteRec > 0 )
  769. {
  770. ReceiveBuffer[nByteRec] = 0 ;
  771. lDataNum = nByteRec + lDataNum ;
  772. strBuffer += ReceiveBuffer ;
  773. //display the receive bytes .
  774. m_szFtpBuffer[0] = '' ;
  775. sprintf( m_szFtpBuffer , "接收到的字节数: %d" , lDataNum ) ;
  776. //TRACE( "%d - %d rn " , lDataNum , nByteRec ) ;
  777. SendFileNameToParentWnd( m_szFtpBuffer ) ;
  778. }
  779. }
  780. while( nByteRec > 0  );
  781. //clear the display bytes .
  782. sprintf( m_szFtpBuffer , " " ) ;
  783. SendFileNameToParentWnd( m_szFtpBuffer ) ;
  784. SendFileNameToParentWnd( m_szFtpBuffer ) ;
  785. //strBuffer.SetAt( lDataNum , '' ) ;
  786. //parse the directory .
  787. ParseDirectroyInfo( strBuffer , bWantSend );
  788. closesocket( hDataSocket ) ;
  789. hDataSocket = NULL ;
  790. m_hDataSocket = NULL ;
  791. if( nByteRec == SOCKET_ERROR )
  792. return false ;
  793. if( lDataNum == 0 )
  794. return ( GetServerReply( hControlSocket ) ) ;
  795. return ( GetServerReply( hControlSocket ) ) ;
  796. }
  797. /***********************************************************
  798. ** @Description:
  799. **
  800. ** @Parameter:
  801. **
  802. ** @Return: 
  803. ** @Author:    Table.JHM.太子
  804. ** e-mail: tablejiang@21cn.com
  805. ** Date: 2001 3 26
  806. *************************************************************/
  807. void CFtpFunction::ParseDirectroyInfo(CString buffer , BOOL bWantSend )
  808. {
  809. /*
  810. AfxMessageBox( buffer ) ;
  811. CFile file ;
  812. file.Open( "e:\abc.txt" , CFile::modeCreate|CFile::modeWrite ) ;
  813. file.Write( (LPCTSTR)buffer , buffer.GetLength() ) ;
  814. file.Close() ;
  815. */
  816. int EndPos = 0 ;
  817. FTPITEM* pFtpItemHead ;
  818. FTPITEM*    pFtpItem ;
  819. FTPITEM* pCurItem ;
  820. char szBuffer[MAX_PATH] ;
  821. int iRet = 0 ;
  822. pFtpItem = new FTPITEM ;
  823. memset( pFtpItem , 0 , sizeof( FTPITEM ) ) ;
  824. CString pLine ;
  825. pFtpItemHead = pFtpItem ;
  826. pCurItem = pFtpItem ;
  827. //choose the server type .
  828. switch( m_SiteInfo.hosttype )
  829. {
  830. case UNIX_SERVER :
  831. //skip the first line .
  832. while( iRet != 2 && EndPos < buffer.GetLength() )
  833. {
  834. iRet = GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  835. }
  836. while( EndPos < buffer.GetLength() )
  837. {
  838. iRet = 0 ;
  839. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  840. strcpy( pCurItem->szAttrib , szBuffer ) ;
  841. if( szBuffer[0] == 'd' )
  842. pCurItem->dwType = 1 ;
  843. else
  844. pCurItem->dwType = 0 ;
  845. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  846. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  847. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  848. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  849. strcpy( pCurItem->szSize , szBuffer ) ;
  850. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  851. strcpy( pCurItem->szDate , szBuffer ) ;
  852. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  853. strcat( pCurItem->szDate , " " ) ;
  854. strcat( pCurItem->szDate , szBuffer ) ;
  855. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  856. strcpy( pCurItem->szTime , szBuffer ) ;
  857. while( iRet != 2 && EndPos < buffer.GetLength() )
  858. {
  859. iRet = GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  860. strcat( pCurItem->szName , szBuffer ) ;
  861. if( iRet != 2 )
  862. strcat( pCurItem->szName , " " ) ;
  863. }
  864. pFtpItem = new FTPITEM ;
  865. //pFtpItem->pNext = NULL ;
  866. memset ( pFtpItem , 0 , sizeof( FTPITEM ) ) ;
  867. pCurItem->pNext = pFtpItem ;
  868. pCurItem = pFtpItem ;
  869. }
  870. break ;
  871. case WINNT_SERVER :
  872. while( EndPos < buffer.GetLength() )
  873. {
  874. iRet = 0 ;
  875. GetSubItem( &EndPos , szBuffer , MAX_PATH , &buffer ) ;
  876. strcpy( pCurItem->szDate , szBuffer ) ;
  877. GetSubItem( &EndPos , szBuffer , MAX_PATH , &buffer ) ;
  878. strcpy( pCurItem->szTime , szBuffer ) ;
  879. GetSubItem( &EndPos , szBuffer , MAX_PATH , &buffer ) ;
  880. if( strcmp( szBuffer , "<DIR>" ) == 0 )
  881. {
  882. pCurItem->dwType = 1 ;
  883. strcpy( pCurItem->szSize , "" ) ;
  884. }
  885. else
  886. {
  887. pCurItem->dwType = 0 ;
  888. strcpy( pCurItem->szSize , szBuffer ) ;
  889. }
  890. while( iRet != 2 && EndPos < buffer.GetLength() )
  891. {
  892. iRet = GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  893. strcat( pCurItem->szName , szBuffer ) ;
  894. if( iRet != 2 )
  895. strcat( pCurItem->szName , " " ) ;
  896. }
  897. strcpy( pCurItem->szAttrib, "" ) ;
  898. pFtpItem = new FTPITEM ;
  899. //pFtpItem->pNext = NULL ;
  900. memset ( pFtpItem , 0 , sizeof( FTPITEM ) ) ;
  901. pCurItem->pNext = pFtpItem ;
  902. pCurItem = pFtpItem ;
  903. }
  904. break ;
  905. case LINUX_SERVER :
  906. {
  907. iRet = 0 ;
  908. while( iRet != 2 && EndPos < buffer.GetLength() )
  909. {
  910. iRet = GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  911. }
  912. while( EndPos < buffer.GetLength() )
  913. {
  914. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  915. strcpy( pCurItem->szAttrib , szBuffer ) ;
  916. if( szBuffer[0] == 'd' )
  917. pCurItem->dwType = 1 ;
  918. else
  919. pCurItem->dwType = 0 ;
  920. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  921. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  922. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  923. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  924. strcpy( pCurItem->szSize , szBuffer ) ;
  925. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  926. strcpy( pCurItem->szDate , szBuffer ) ;
  927. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  928. strcat( pCurItem->szDate , " " ) ;
  929. strcat( pCurItem->szDate , szBuffer ) ;
  930. GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  931. strcpy( pCurItem->szTime , szBuffer ) ;
  932. while( iRet != 2 && EndPos < buffer.GetLength() )
  933. {
  934. iRet = GetSubItem( &EndPos , szBuffer ,  MAX_PATH , &buffer ) ;
  935. strcat( pCurItem->szName , szBuffer ) ;
  936. if( iRet != 2 )
  937. strcat( pCurItem->szName , " " ) ;
  938. }
  939. pFtpItem = new FTPITEM ;
  940. //pFtpItem->pNext = NULL ;
  941. memset ( pFtpItem , 0 , sizeof( FTPITEM ) ) ;
  942. pCurItem->pNext = pFtpItem ;
  943. pCurItem = pFtpItem ;
  944. }
  945. }
  946. break ;
  947. default:
  948. break;
  949. }
  950. if( bWantSend )
  951. {
  952. ::PostMessage( m_hWndInfo.hFtpDirListWnd , FTP_SERVER_DIR_LIST_MSG , (WPARAM)pFtpItemHead , 0 ) ;
  953. }
  954. else
  955. {
  956. m_ListItem = pFtpItemHead ;
  957. }
  958. }
  959. /***********************************************************
  960. ** @Description:
  961. ** delete a file in ftp server .
  962. **
  963. ** @Parameter:
  964. ** LPSTR szFileName : the delete file name .
  965. **
  966. ** @Return: 
  967. ** @Author:    Table.JHM.太子
  968. ** e-mail: tablejiang@21cn.com
  969. ** Date: 2001 3 26
  970. *************************************************************/
  971. BOOL CFtpFunction::DeleteFtpFile(LPSTR szFileName)
  972. {
  973. char szCommand[MAX_PATH] ;
  974. UINT uReplyCode = 0 ;
  975. sprintf( szCommand , "DELE %srn" , szFileName ) ;
  976. uReplyCode = SendFtpCommand( szCommand , m_hControlSocket ) ;
  977. if( uReplyCode > 400 )
  978. return false ;
  979. return true ;
  980. }
  981. /***********************************************************
  982. ** @Description:
  983. ** this function delete a directory in ftp server .
  984. ** this function use recursion arithmetic .
  985. **
  986. ** @Parameter:
  987. ** FTPFILEINFO* pFileInfo : the delete directory info .
  988. **
  989. ** @Return: 
  990. ** @Author:    Table.JHM.太子
  991. ** e-mail: tablejiang@21cn.com
  992. ** Date: 2001 3 26
  993. *************************************************************/
  994. BOOL CFtpFunction::DeleteFtpDirectory(FTPFILEINFO *pFileInfo)
  995. {
  996. FTPITEM* pItemQueueHead ;
  997. FTPITEM* pItemCur ;
  998. FTPFILEINFO FtpFileInfo ;
  999. char szPathBak[MAX_PATH] ;
  1000. memcpy( &FtpFileInfo , pFileInfo , sizeof( FTPFILEINFO ) ) ;
  1001. if( !MakeFtpDownloadPath( &FtpFileInfo ) )
  1002. return false ;
  1003. if( !GetCurrentFtpDir() )
  1004. return false ;
  1005. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  1006. pItemQueueHead = m_ListItem ;
  1007. pItemCur = m_ListItem ;
  1008. if( m_ListItem->pNext == NULL )
  1009. {
  1010. FreeItemList( pItemQueueHead ) ;
  1011. return false ;
  1012. }
  1013. while( pItemCur->pNext != NULL )
  1014. {
  1015. if( pItemCur->dwType == 1 )
  1016. {
  1017. FtpFileInfo.bfileput = false ;
  1018. FtpFileInfo.bIsDirectory = true ;
  1019. FtpFileInfo.endpos = 0 ;
  1020. FtpFileInfo.startpos = 0 ;
  1021. strcpy( FtpFileInfo.remotefilename , pItemCur->szName ) ;
  1022. strcpy( FtpFileInfo.localfilename , pItemCur->szName ) ;
  1023. //FtpFileInfo.hSocket = pFileInfo->hSocket ;
  1024. //FtpFileInfo.hWnd = pFileInfo->hWnd ;
  1025. DeleteFtpDirectory( &FtpFileInfo ) ;
  1026. EnterFtpDirectory( szPathBak ) ;
  1027. RemoveFtpDirectory( FtpFileInfo.remotefilename ) ;
  1028. }
  1029. else
  1030. {
  1031. DeleteFtpFile( pItemCur->szName ) ;
  1032. }
  1033. pItemCur = pItemCur->pNext ;
  1034. }
  1035. FreeItemList( pItemQueueHead ) ;
  1036. return true ;
  1037. }
  1038. /***********************************************************
  1039. ** @Description:
  1040. ** this function remove a directory in ftp server .
  1041. **
  1042. ** @Parameter:
  1043. ** LPSTR szDirName : the dir name .
  1044. **
  1045. ** @Return: 
  1046. ** @Author:    Table.JHM.太子
  1047. ** e-mail: tablejiang@21cn.com
  1048. ** Date: 2001 3 26
  1049. *************************************************************/
  1050. BOOL CFtpFunction::RemoveFtpDirectory(LPSTR szDirName)
  1051. {
  1052. char szCommand[MAX_PATH] ;
  1053. UINT uReplyCode = 0 ;
  1054. sprintf( szCommand , "RMD %srn" , szDirName ) ;
  1055. uReplyCode = SendFtpCommand( szCommand , m_hControlSocket ) ;
  1056. if( uReplyCode > 400 )
  1057. return false ;
  1058. return true ;
  1059. }
  1060. /****************************************************
  1061. ** @Description
  1062. ** Find file in remote file list .
  1063. **
  1064. ** @Parameter
  1065. ** LPCTSTR szFileName : the file name .
  1066. ** FTPITEM* pFileList : remote file list.
  1067. **
  1068. ** @Return: the broken transmit position .
  1069. ** @Author:    Table.JHM.太子
  1070. ** e-mail: tablejiang@21cn.com
  1071. ** @Date: 2001 3 26
  1072. ****************************************************/
  1073. __int64 CFtpFunction::FindFileInFileList(LPCTSTR szFileName, FTPITEM *pFileList)
  1074. {
  1075. FTPITEM* pCur ;
  1076. __int64 iSize = 0 ;
  1077. if( pFileList == NULL )
  1078. return 0 ;
  1079. pCur = pFileList ;
  1080. while( pCur->pNext != NULL )
  1081. {
  1082. if( strcmp( szFileName , pCur->szName ) == 0 )
  1083. {
  1084. //is want ask user ?
  1085. if( m_bAskUser )
  1086. {
  1087. char szPathName[MAX_PATH] ;
  1088. sprintf( szPathName , "%s/%s" , m_CurrentFtpDirectory , szFileName ) ;
  1089. m_SelActionDlg.m_strPathName = szPathName ;
  1090. m_SelActionDlg.DoModal( ) ;
  1091. m_bAskUser = !m_SelActionDlg.m_bAsk ;
  1092. m_iWhenExistAction = m_SelActionDlg.m_iAction ;
  1093. }
  1094. iSize = _atoi64( pCur->szSize ) ;
  1095. switch( m_iWhenExistAction )
  1096. {
  1097. case 1 :
  1098. //overlay
  1099. {
  1100. iSize = 0 ;
  1101. }
  1102. break ;
  1103. case 2 :
  1104. //resume
  1105. break ;
  1106. case 3 :
  1107. //rename
  1108. iSize = 0 ;
  1109. break ;
  1110. case 4 :
  1111. //skip
  1112. break ;
  1113. default :
  1114. break ;
  1115. }
  1116. return iSize ;
  1117. }
  1118. pCur = pCur->pNext ;
  1119. }
  1120. return 0 ;
  1121. }
  1122. /****************************************************
  1123. ** @Description
  1124. ** find file in local .
  1125. **
  1126. ** @Parameter
  1127. ** LPCTSTR szPathName : the file path name .
  1128. **
  1129. ** @Return: the broken transmit position .
  1130. ** @Author:    Table.JHM.太子
  1131. ** e-mail: tablejiang@21cn.com
  1132. ** @Date: 2001 3 26
  1133. ****************************************************/
  1134. __int64 CFtpFunction::FindFileInLocal(LPCTSTR szPathName)
  1135. {
  1136. __int64 iSize = 0 ;
  1137. TRACE( "%s---%drn" , szPathName , m_bAskUser ) ;
  1138. if( PathFileExists( szPathName ) )
  1139. {
  1140. TRACE( "%s---%drn" , szPathName , m_bAskUser ) ;
  1141. if( m_bAskUser )
  1142. {
  1143. m_SelActionDlg.m_strPathName = szPathName ;
  1144. m_SelActionDlg.DoModal( ) ;
  1145. m_bAskUser = !m_SelActionDlg.m_bAsk ;
  1146. m_iWhenExistAction = m_SelActionDlg.m_iAction ;
  1147. }
  1148. HANDLE hFile = CreateFile( szPathName , GENERIC_READ | GENERIC_WRITE ,  
  1149. FILE_SHARE_READ , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0 ) ;
  1150. if( hFile == INVALID_HANDLE_VALUE )
  1151. return 0 ;
  1152. DWORD dwlSize ;
  1153. DWORD dwhSize ;
  1154. dwlSize = GetFileSize( hFile , &dwhSize ) ;
  1155. iSize = dwhSize ;
  1156. iSize = iSize << 32 ;
  1157. iSize += dwlSize ;
  1158. switch( m_iWhenExistAction )
  1159. {
  1160. case 1 :
  1161. //overlay
  1162. {
  1163. iSize = 0 ;
  1164. }
  1165. break ;
  1166. case 2 :
  1167. //resume
  1168. break ;
  1169. case 3 :
  1170. //rename
  1171. iSize = 0 ;
  1172. break ;
  1173. case 4 :
  1174. //skip
  1175. break ;
  1176. default :
  1177. break ;
  1178. }
  1179. CloseHandle( hFile ) ;
  1180. return iSize ;
  1181. }
  1182. else
  1183. {
  1184. //char dis[500] ;
  1185. //sprintf( 
  1186. //AfxMessageBox( "Can't Find File ! " ) ;
  1187. //AfxMessageBox( szPathName ) ;
  1188. }
  1189. return iSize ;
  1190. }
  1191. /****************************************************
  1192. ** @Description
  1193. **
  1194. **
  1195. ** @Parameter
  1196. **
  1197. **
  1198. ** @Return:
  1199. ** @Author:    Table.JHM.太子
  1200. ** e-mail: tablejiang@21cn.com
  1201. ** @Date: 2001 3 26
  1202. ****************************************************/
  1203. BOOL CFtpFunction::BrokenDownload( FTPFILEINFO *pFile)
  1204. {
  1205. BOOL bRet = true ;
  1206. switch( m_iWhenExistAction )
  1207. {
  1208. case 4 :
  1209. {
  1210. break ;
  1211. }
  1212. case 3 :
  1213. //rename
  1214. {
  1215. CInputFileNameDlg dlg ;
  1216. dlg.DoModal( ) ;
  1217. if( pFile->bfileput )
  1218. strcpy( pFile->remotefilename , dlg.m_strName ) ;
  1219. else
  1220. strcpy( pFile->localfilename , dlg.m_strName ) ;
  1221. }
  1222. case 1 :
  1223. case 2 :
  1224. default :
  1225. {
  1226. //strcpy( pFile->localfilename , pItemCur->szName ) ;
  1227. pFile->iExistAction = m_iWhenExistAction ;
  1228. bRet = PutGetFileFunction( pFile ) ;
  1229. }
  1230. break ;
  1231. }
  1232. return bRet ;
  1233. }
  1234. /****************************************************
  1235. ** @Description
  1236. ** open the file with the specify file info.
  1237. **
  1238. ** @Parameter
  1239. ** FTPFILEINFO* pFile : file info
  1240. ** LPCTSTR szPathName : the file path name .
  1241. **
  1242. ** @Return:
  1243. ** @Author:    Table.JHM.太子
  1244. ** e-mail: tablejiang@21cn.com
  1245. ** @Date: 2001 3 26
  1246. ****************************************************/
  1247. HANDLE CFtpFunction::OpenLocalFile(FTPFILEINFO *pFile, LPCTSTR szPathName)
  1248. {
  1249. HANDLE hFile ;
  1250. if( !pFile->bfileput )
  1251. {
  1252. switch( pFile->iExistAction )
  1253. {
  1254. case 2 ://resume transmit .
  1255. hFile = CreateFile( szPathName , GENERIC_READ | GENERIC_WRITE ,  
  1256. FILE_SHARE_READ , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0 ) ;
  1257. break ;
  1258. default :
  1259. hFile = CreateFile( szPathName , GENERIC_READ | GENERIC_WRITE ,  
  1260. FILE_SHARE_READ , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0 ) ;
  1261. break ;
  1262. }
  1263. }
  1264. else
  1265. {
  1266. hFile = CreateFile( szPathName , GENERIC_READ | GENERIC_WRITE ,  
  1267. FILE_SHARE_READ , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0 ) ;
  1268. if( hFile == INVALID_HANDLE_VALUE )
  1269. {
  1270. DWORD dwErr = GetLastError( ) ;
  1271. }
  1272. }
  1273. return hFile ;
  1274. }
  1275. /****************************************************
  1276. ** @Description
  1277. ** prepare the broken transmit , move to 
  1278. ** broken position .
  1279. **
  1280. ** @Parameter
  1281. **
  1282. **
  1283. ** @Return:
  1284. ** @Author:    Table.JHM.太子
  1285. ** e-mail: tablejiang@21cn.com
  1286. ** @Date: 2001 3 26
  1287. ****************************************************/
  1288. BOOL CFtpFunction::MakeBrokenPos(char *szCommand, FTPFILEINFO *pFile , HANDLE hFile )
  1289. {
  1290. UINT nReplyCode = 0 ;
  1291. if( pFile->site.brokendownload )
  1292. {
  1293. char szTemp[MAX_PATH] ;
  1294. strcpy( szCommand , "REST " ) ;
  1295. _i64toa( pFile->startpos , szTemp , 10 ) ;
  1296. strcat( szCommand , szTemp ) ;
  1297. strcat( szCommand , "rn" ) ;
  1298. //send rest command.
  1299. nReplyCode = SendFtpCommand( szCommand , pFile->hSocket ) ;
  1300. if( nReplyCode == 350 )
  1301. MyFileSeek( hFile , pFile->startpos ,  FILE_BEGIN ) ;
  1302. }
  1303. if( pFile->bfileput )
  1304. {
  1305. switch( pFile->iExistAction )
  1306. {
  1307. case 2 :
  1308. //append the data to exist file .
  1309. sprintf( szCommand , "APPE %srn" , pFile->remotefilename ) ;
  1310. break ;
  1311. default :
  1312. sprintf( szCommand , "STOR %srn" , pFile->remotefilename ) ;
  1313. break ;
  1314. }
  1315. }
  1316. else
  1317. sprintf( szCommand , "RETR %srn" , pFile->remotefilename ) ;
  1318. return true ;
  1319. }
  1320. /****************************************************
  1321. ** @Description
  1322. ** send current transmit file name to parent wnd .
  1323. **
  1324. ** @Parameter
  1325. ** LPCTSTR szName : file name .
  1326. **
  1327. ** @Return:
  1328. ** @Author:    Table.JHM.太子
  1329. ** @e-mail: tablejiang@21cn.com
  1330. ** @Date: 2001 3 26
  1331. ****************************************************/
  1332. BOOL CFtpFunction::SendFileNameToParentWnd(LPCTSTR szName)
  1333. {
  1334. char * pName ;
  1335. int iLength = strlen( szName ) ;
  1336. pName = new char[iLength + 1] ;
  1337. strcpy( pName , szName ) ;
  1338. pName[iLength] = '' ;
  1339. PostMessage( m_hParentWnd , SEND_TRANSMIT_FILENAME_MSG , (WPARAM)pName , 0 ) ;
  1340. return true;
  1341. }
  1342. /****************************************************
  1343. ** @Description
  1344. ** send status info to parent wnd .
  1345. **
  1346. ** @Parameter
  1347. ** char* pText : status string .
  1348. **
  1349. ** @Return:
  1350. ** @Author:    Table.JHM.太子
  1351. ** e-mail: tablejiang@21cn.com
  1352. ** @Date: 2001 3 26
  1353. ****************************************************/
  1354. void CFtpFunction::SendStatusStr(char *pText)
  1355. {
  1356. char* pSend ;
  1357. int iLength = strlen( pText ) ;
  1358. if( pText[iLength-2] != 'r' )
  1359. strcat( pText , "rn" ) ;
  1360. iLength = strlen( pText ) ;
  1361. //the alloc memory will delete in parent window.
  1362. pSend = new char[iLength + 16];
  1363. strcpy( pSend , "STATUS>        " ) ;
  1364. strcat( pSend , pText ) ;
  1365. PostMessage( m_hWndInfo.hInfoWnd , FTP_STATUS_MSG , 0 , (LPARAM)pSend ) ;
  1366. }
  1367. /***********************************************************
  1368. ** @Description:
  1369. ** this public function is used for chech is connected 
  1370. ** with ftp server .
  1371. **
  1372. ** @Note:
  1373. **
  1374. ** @Return: if connected return true ,else return false .
  1375. ** @Author:    Table.JHM.太子
  1376. ** e-mail: tablejiang@21cn.com
  1377. ** Date: 2001 3 26
  1378. *************************************************************/
  1379. BOOL CFtpFunction::IsConnect()
  1380. {
  1381. return m_bIsConnected ;
  1382. }