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

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 "FtpTransmitFile.h"
  15. #ifdef _DEBUG
  16. #undef THIS_FILE
  17. static char THIS_FILE[]=__FILE__;
  18. #define new DEBUG_NEW
  19. #endif
  20. //////////////////////////////////////////////////////////////////////
  21. // Construction/Destruction
  22. //////////////////////////////////////////////////////////////////////
  23. CFtpTransmitFile::CFtpTransmitFile()
  24. {
  25. m_pFileQueue = NULL ;
  26. }
  27. CFtpTransmitFile::~CFtpTransmitFile()
  28. {
  29. }
  30. /****************************************************
  31. ** @Description
  32. ** thread function .
  33. **
  34. ** @Parameter
  35. **
  36. **
  37. ** @Return:
  38. ** @Author: JHM
  39. ** @e-mail: tablejiang@21cn.com
  40. ** @Date: 2001 3 26
  41. ****************************************************/
  42. UINT StartTransmitThread( LPVOID pParam )
  43. {
  44. CFtpTransmitFile* pFtp = ( CFtpTransmitFile * )pParam  ;
  45. pFtp->StartTransmitFunction( ) ;
  46. return 1 ;
  47. }
  48. /****************************************************
  49. ** @Description
  50. **
  51. **
  52. ** @Parameter
  53. **
  54. **
  55. ** @Return:
  56. ** @Author: JHM
  57. ** @e-mail: tablejiang@21cn.com
  58. ** @Date: 2001 3 26
  59. ****************************************************/
  60. BOOL CFtpTransmitFile::StartTransmit( HWND hWnd )
  61. {
  62. CWinThread* pThread = AfxBeginThread( StartTransmitThread , this ) ;
  63. m_TransmitThread.thread = pThread->m_hThread ;
  64. m_TransmitThread.threadid = pThread->m_nThreadID ;
  65. return true ;
  66. }
  67. /****************************************************
  68. ** @Description
  69. **
  70. **
  71. ** @Parameter
  72. **
  73. **
  74. ** @Return:
  75. ** @Author: JHM
  76. ** @e-mail: tablejiang@21cn.com
  77. ** @Date: 2001 3 26
  78. ****************************************************/
  79. BOOL CFtpTransmitFile::StartTransmitFunction()
  80. {
  81. if( m_pFileQueue == NULL )
  82. return false ;
  83. m_bRun = true ;
  84. while( !m_pFileQueue->IsEmpty() )
  85. {
  86. m_pCurFile = m_pFileQueue->GetNextItem ( ) ;
  87. if( m_pCurFile == NULL )
  88. return true ;
  89. SetFileState( m_pCurFile , FILE_STATE_RUNNING ) ;
  90. if( !SetTransmitFileSiteInfo ( ) )
  91. {
  92. SetFileState( m_pCurFile , FILE_STATE_ERROR ) ;
  93. continue ;
  94. }
  95. if( !LoginAndCheckServer( ) )
  96. {
  97. SetFileState( m_pCurFile , FILE_STATE_ERROR ) ;
  98. continue ;
  99. }
  100. TransmitFileFunction( m_pCurFile ) ;
  101. SendFtpCommand( "QUITrn" , m_hControlSocket ) ;
  102. closesocket( m_hControlSocket ) ;
  103. }
  104. return true ;
  105. }
  106. /****************************************************
  107. ** @Description
  108. **
  109. **
  110. ** @Parameter
  111. **
  112. **
  113. ** @Return:
  114. ** @Author: JHM
  115. ** @e-mail: tablejiang@21cn.com
  116. ** @Date: 2001 3 26
  117. ****************************************************/
  118. BOOL CFtpTransmitFile::LoginAndCheckServer()
  119. {
  120. if( !InitSocket ( ) )
  121. {
  122. return false ;
  123. }
  124. //connect with server.
  125. m_hControlSocket = ConnectServer( m_SiteInfo.host ) ;
  126. if( m_hControlSocket == INVALID_SOCKET )
  127. {
  128. //MessageBox( NULL , "Can't connect server !" , "error" , MB_OK ) ;
  129. return false ;
  130. }
  131. //login server .
  132. if( m_SiteInfo.logintype == 0 )
  133. {
  134. if( !UserLogin( m_hControlSocket , m_SiteInfo.user , m_SiteInfo.pass ) )
  135. {
  136. //MessageBox( NULL , "Login failed ! " , "error" , MB_OK ) ;
  137. return false ;
  138. }
  139. }
  140. else
  141. {
  142. if( !AnonymousLogin( m_hControlSocket ) )
  143. {
  144. //MessageBox( NULL , "Login failed ! " , "error" , MB_OK ) ;
  145. return false ;
  146. }
  147. }
  148. //check the broken download. 
  149. if( !CheckBrokenDownload( ) ) 
  150. return false ;
  151. if( !CheckServerType() )
  152. return false ;
  153. if( !EnterFtpDirectory( m_pCurFile->remotepath ) )
  154. return false ;
  155. return true ;
  156. }
  157. /****************************************************
  158. ** @Description
  159. **
  160. **
  161. ** @Parameter
  162. **
  163. **
  164. ** @Return:
  165. ** @Author: JHM
  166. ** @e-mail: tablejiang@21cn.com
  167. ** @Date: 2001 3 26
  168. ****************************************************/
  169. BOOL CFtpTransmitFile::SetTransmitFileSiteInfo()
  170. {
  171. if( m_pCurFile == NULL )
  172. return false ;
  173. memcpy( &m_SiteInfo , &m_pCurFile->site , sizeof( SITEINFO ) ) ;
  174. return true ;
  175. }
  176. /****************************************************
  177. ** @Description
  178. **
  179. **
  180. ** @Parameter
  181. **
  182. **
  183. ** @Return:
  184. ** @Author: JHM
  185. ** @e-mail: tablejiang@21cn.com
  186. ** @Date: 2001 3 26
  187. ****************************************************/
  188. void CFtpTransmitFile::SetFileQueue(CFileQueue *pFileQueue)
  189. {
  190. m_pFileQueue = pFileQueue ;
  191. }
  192. /****************************************************
  193. ** @Description
  194. **
  195. **
  196. ** @Parameter
  197. **
  198. **
  199. ** @Return:
  200. ** @Author: JHM
  201. ** @e-mail: tablejiang@21cn.com
  202. ** @Date: 2001 3 26
  203. ****************************************************/
  204. void CFtpTransmitFile::SetFileState(FTPFILEINFO *pInfo, int iState)
  205. {
  206. m_pFileQueue->SetItemState( iState , pInfo ) ;
  207. // m_pFileQueue->LockTheFileList( ) ;
  208. // m_pCurFile->state = iState ;
  209. // m_pFileQueue->UnLockTheFileList() ;
  210. }
  211. /****************************************************
  212. ** @Description
  213. **
  214. **
  215. ** @Parameter
  216. **
  217. **
  218. ** @Return:
  219. ** @Author: JHM
  220. ** @e-mail: tablejiang@21cn.com
  221. ** @Date: 2001 3 26
  222. ****************************************************/
  223. BOOL CFtpTransmitFile::TransmitFileFunction( FTPFILEINFO* pFile )
  224. {
  225. int iDownUpFile = 0 ;
  226. BOOL bRet = false ;
  227. FTPFILEINFO FtpFile ;
  228. GetCurrentFtpDir( ) ;
  229. pFile->hSocket = m_hControlSocket ;
  230. FTPITEM* pItemCur ;
  231. if( !m_pFileQueue->IsEmpty() )
  232. {
  233. ListDirectory( false ) ;
  234. pItemCur = m_ListItem ;
  235. }
  236. else
  237. {
  238. pItemCur = NULL ;
  239. }
  240. SetFileState( pFile , FILE_STATE_RUNNING ) ;
  241. if( pFile->bfileput )
  242. {
  243. if( pFile->bIsDirectory )
  244. {
  245. char szPathBak[MAX_PATH] ;
  246. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  247. if( !UploadDirectory( pFile ) )
  248. {
  249. SetFileState( pFile , FILE_STATE_ERROR ) ;
  250. }
  251. EnterFtpDirectory( szPathBak ) ;
  252. if( !GetCurrentFtpDir() )
  253. return false ;
  254. }
  255. else
  256. pFile->startpos = FindFileInFileList( pFile->remotefilename , pItemCur ) ;
  257. if( !BrokenDownload( pFile ) )
  258. m_FileQueue.SetItemState( FILE_STATE_ERROR , pFile ) ;
  259. }
  260. }
  261. else
  262. {
  263. if( pFile->bIsDirectory )
  264. {
  265. char szPathBak[MAX_PATH] ;
  266. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  267. if( !DownLoadDirectory( pFile ) )
  268. SetFileState( pFile , FILE_STATE_ERROR ) ;
  269. EnterFtpDirectory( szPathBak ) ;
  270. if( !GetCurrentFtpDir() )
  271. return false ;
  272. }
  273. else
  274. {
  275. char szFilePathName[MAX_PATH] ;
  276. sprintf( szFilePathName , "%s%s" , pFile->localpath , 
  277. pFile->localfilename ) ;
  278. pFile->startpos = FindFileInLocal( szFilePathName ) ;
  279. if( !BrokenDownload( pFile ) )
  280. m_FileQueue.SetItemState( FILE_STATE_ERROR , pFile ) ;
  281. }
  282. }
  283. // ::PostMessage( m_hWndInfo.hWndJobWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  284. // ::PostMessage( m_hRefWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  285. iDownUpFile ++ ;
  286. memcpy( &FtpFile , pFile , sizeof( FTPFILEINFO ) ) ;
  287. m_pFileQueue->DeleteItem( pFile ) ;
  288. //when transmit current file , 
  289. //transmit queue file .
  290. while( !m_pFileQueue->IsEmpty() )
  291. {
  292. FTPFILEINFO* pItem ;
  293. pItem = m_pFileQueue->GetSameSiteFile( &FtpFile ) ;
  294. if( pItem == NULL )
  295. break ;
  296. pItem->hSocket = m_hControlSocket ;
  297. SetFileState( pItem , FILE_STATE_RUNNING ) ;
  298. if( !EnterFtpDirectory( pItem->remotepath ) )
  299. SetFileState( pItem , FILE_STATE_ERROR ) ;
  300. GetCurrentFtpDir( ) ;
  301. if( pItem->bfileput )
  302. {
  303. if( pItem->bIsDirectory )
  304. {
  305. char szPathBak[MAX_PATH] ;
  306. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  307. if( !UploadDirectory( pItem ) )
  308. SetFileState( pItem , FILE_STATE_ERROR ) ;
  309. EnterFtpDirectory( szPathBak ) ;
  310. if( !GetCurrentFtpDir() )
  311. return false ;
  312. }
  313. else
  314. {
  315. pItem->startpos = FindFileInFileList( pItem->remotefilename , pItemCur ) ;
  316. if( !BrokenDownload( pItem ) )
  317. m_FileQueue.SetItemState( FILE_STATE_ERROR , pItem ) ;
  318. }
  319. }
  320. else
  321. {
  322. if( pItem->bIsDirectory )
  323. {
  324. char szPathBak[MAX_PATH] ;
  325. strcpy( szPathBak , m_CurrentFtpDirectory ) ;
  326. if( !DownLoadDirectory( pItem ) )
  327. SetFileState( pItem , FILE_STATE_ERROR ) ;
  328. EnterFtpDirectory( szPathBak ) ;
  329. if( !GetCurrentFtpDir() )
  330. return false ;
  331. }
  332. else
  333. {
  334. char szFilePathName[MAX_PATH] ;
  335. sprintf( szFilePathName , "%s%s" , pItem->localpath , 
  336. pItem->localfilename ) ;
  337. pItem->startpos = FindFileInLocal( szFilePathName ) ;
  338. if( !BrokenDownload( pItem ) )
  339. m_FileQueue.SetItemState( FILE_STATE_ERROR , pItem ) ;
  340. }
  341. }
  342. // ::PostMessage( m_hRefWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  343. iDownUpFile ++ ;
  344. if( m_bRun == 1 ) 
  345. m_pFileQueue->DeleteItem( pItem ) ;
  346. m_bRun = 1 ;
  347. }
  348. FreeItemList( pItemCur ) ;
  349. if( iDownUpFile )
  350. ListDirectory( true ) ;
  351. return true ;
  352. }
  353. void CFtpTransmitFile::SetParentWnd(HWND hWnd)
  354. {
  355. m_hRefWnd = hWnd ;
  356. }
  357. UINT AbordThread2( LPVOID pParam )
  358. {
  359. CFtpTransmitFile* pFtp = (CFtpTransmitFile*)pParam ;
  360. pFtp->AbordThreadFunction ( ) ;
  361. return 1;
  362. }
  363. void CFtpTransmitFile::StopNowCommand()
  364. {
  365. if( !IsConnect( ) )
  366. return ;
  367. CWinThread* pThread = AfxBeginThread( AbordThread2 , this ) ;
  368. m_AbordThread.thread = pThread->m_hThread ;
  369. m_AbordThread.threadid = pThread->m_nThreadID ;
  370. //WaitForSingleObject( m_AbordThread.thread , 1000 ) ;
  371. if( m_hDataSocket )
  372. {
  373. closesocket( m_hDataSocket ) ;
  374. m_hDataSocket = NULL ;
  375. }
  376. }