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

Ftp客户端

开发平台:

Visual C++

  1. // FileQueue.cpp: implementation of the CFileQueue 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 "FileQueue.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. CFileQueue::CFileQueue()
  24. {
  25. InitializeCriticalSection( &m_cs );
  26. m_pFileTransmitQueue = NULL ;
  27. m_bLetRun = true ;
  28. //m_SaveFileName[0] = 0 ;
  29. //strcpy( m_SaveFileName , "FileQueue.QFQ" ) ;
  30. m_hParentWnd = NULL ;
  31. }
  32. CFileQueue::~CFileQueue()
  33. {
  34. DeleteAllFileQueue( ) ;
  35. DeleteCriticalSection( &m_cs );
  36. }
  37. /****************************************************
  38. ** @Description
  39. **
  40. **
  41. ** @Parameter
  42. **
  43. **
  44. ** @Return:
  45. ** @Author: JHM
  46. ** e-mail: tablejiang@21cn.com
  47. ** @Date: 2001 3 26
  48. ****************************************************/
  49. BOOL CFileQueue::AddItem(FTPFILEINFO *pFileInfo)
  50. {
  51. EnterCriticalSection( &m_cs ) ;
  52. if( pFileInfo == NULL )
  53. return true ;
  54. FTPFILEINFO* pFileItem ;
  55. FTPFILEINFO*    pCurItem ;
  56. FTPFILEINFO* pPreItem ;
  57. BOOL bFind = false ;
  58. pFileItem = new FTPFILEINFO ;
  59. memcpy( pFileItem , pFileInfo , sizeof( FTPFILEINFO ) ) ;
  60. if( pFileItem->state == FILE_STATE_RUNNING )
  61. pFileItem->state = FILE_STATE_READY ;
  62. pFileItem->pNext = NULL ;
  63. if( m_pFileTransmitQueue == NULL )
  64. {
  65. m_pFileTransmitQueue = pFileItem ;
  66. SaveQueue( ) ;
  67. LeaveCriticalSection( &m_cs ) ;
  68. ::PostMessage( m_hParentWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  69. return true ;
  70. }
  71. pCurItem = m_pFileTransmitQueue ;
  72. pPreItem = m_pFileTransmitQueue ;
  73. while( pCurItem != NULL )
  74. {
  75. if( strcmp( pFileInfo->site.host , pCurItem->site.host ) == 0 )
  76. {
  77. if( strcmp( pFileInfo->remotefilename , pCurItem->remotefilename ) == 0 )
  78. {
  79. if( strcmp( pFileInfo->remotepath , pCurItem->remotepath ) == 0 )
  80. {
  81. if( pFileInfo->bfileput == pCurItem->bfileput )
  82. {
  83. if( pFileInfo->bIsDirectory == pCurItem->bIsDirectory )
  84. {
  85. if(strcmp(  pFileInfo->site.user , pFileInfo->site.user ) == 0 )
  86. {
  87. bFind = true ;
  88. break ;
  89. }
  90. }
  91. }
  92. }
  93. }
  94. }
  95. pPreItem = pCurItem ;
  96. pCurItem = pCurItem->pNext ;
  97. }
  98. if( bFind )
  99. {
  100. delete pFileItem ;
  101. return true ;
  102. }
  103. else
  104. pPreItem->pNext = pFileItem ;
  105. SaveQueue( ) ;
  106. LeaveCriticalSection( &m_cs ) ;
  107. if( m_hParentWnd )
  108. ::PostMessage( m_hParentWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  109. return true ;
  110. }
  111. /****************************************************
  112. ** @Description
  113. **
  114. **
  115. ** @Parameter
  116. **
  117. **
  118. ** @Return:
  119. ** @Author: JHM
  120. ** e-mail: tablejiang@21cn.com
  121. ** @Date: 2001 3 26
  122. ****************************************************/
  123. BOOL CFileQueue::DeleteItem(FTPFILEINFO *pFileInfo)
  124. {
  125. FTPFILEINFO* pFront ;
  126. FTPFILEINFO* pCurrent ;
  127. BOOL  bFind = false ;
  128. EnterCriticalSection( &m_cs ) ;
  129. if( m_pFileTransmitQueue == NULL )
  130. {
  131. LeaveCriticalSection( &m_cs ) ;
  132. return true ;
  133. }
  134. pCurrent = m_pFileTransmitQueue ;
  135. pFront = m_pFileTransmitQueue ;
  136. while( pCurrent != NULL )
  137. {
  138. if( FtpFileCmp( pFileInfo , pCurrent ) )
  139. {
  140. bFind = true ;
  141. break ;
  142. }
  143. pFront = pCurrent ;
  144. pCurrent = pCurrent->pNext ;
  145. }
  146. if( bFind == false )
  147. {
  148. LeaveCriticalSection( &m_cs ) ;
  149. return false ;
  150. }
  151. if( pCurrent == m_pFileTransmitQueue )
  152. {
  153. m_pFileTransmitQueue = pCurrent->pNext ;
  154. }
  155. else
  156. {
  157. pFront->pNext = pCurrent->pNext ;
  158. }
  159. delete pCurrent ;
  160. SaveQueue( ) ;
  161. LeaveCriticalSection( &m_cs ) ;
  162. if( m_hParentWnd )
  163. ::PostMessage( m_hParentWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  164. return true ;
  165. }
  166. /****************************************************
  167. ** @Description
  168. **
  169. **
  170. ** @Parameter
  171. **
  172. **
  173. ** @Return:
  174. ** @Author: JHM
  175. ** e-mail: tablejiang@21cn.com
  176. ** @Date: 2001 3 26
  177. ****************************************************/
  178. BOOL CFileQueue::IsInFileQueue(FTPFILEINFO *pFileInfo)
  179. {
  180. FTPFILEINFO* pFront ;
  181. FTPFILEINFO* pCurrent ;
  182. BOOL  bFind = false ;
  183. EnterCriticalSection( &m_cs ) ;
  184. if( m_pFileTransmitQueue == NULL )
  185. {
  186. LeaveCriticalSection( &m_cs ) ;
  187. return false ;
  188. }
  189. pCurrent = m_pFileTransmitQueue ;
  190. pFront = m_pFileTransmitQueue ;
  191. while( pCurrent != NULL )
  192. {
  193. if( FtpFileCmp( pFileInfo , pCurrent ) )
  194. {
  195. bFind = true ;
  196. break ;
  197. }
  198. pFront = pCurrent ;
  199. pCurrent = pCurrent->pNext ;
  200. }
  201. LeaveCriticalSection( &m_cs ) ;
  202. return bFind ;
  203. }
  204. /****************************************************
  205. ** @Description
  206. **
  207. **
  208. ** @Parameter
  209. **
  210. **
  211. ** @Return:
  212. ** @Author: JHM
  213. ** e-mail: tablejiang@21cn.com
  214. ** @Date: 2001 3 26
  215. ****************************************************/
  216. BOOL CFileQueue::DeleteAllFileQueue()
  217. {
  218. FTPFILEINFO* pCurrent ;
  219. EnterCriticalSection( &m_cs ) ;
  220. if( m_pFileTransmitQueue== NULL)
  221. {
  222. LeaveCriticalSection( &m_cs ) ;
  223. return true ;
  224. }
  225. pCurrent = m_pFileTransmitQueue ;
  226. while( m_pFileTransmitQueue != NULL)
  227. {
  228. m_pFileTransmitQueue = pCurrent->pNext ;
  229. delete pCurrent ;
  230. pCurrent = m_pFileTransmitQueue ;
  231. }
  232. m_pFileTransmitQueue = NULL ;
  233. LeaveCriticalSection( &m_cs ) ;
  234. if( m_hParentWnd )
  235. ::PostMessage( m_hParentWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  236. return true ;
  237. }
  238. /****************************************************
  239. ** @Description
  240. **
  241. **
  242. ** @Parameter
  243. **
  244. **
  245. ** @Return:
  246. ** @Author: JHM
  247. ** e-mail: tablejiang@21cn.com
  248. ** @Date: 2001 3 26
  249. ****************************************************/
  250. BOOL CFileQueue::IsEmpty()
  251. {
  252. EnterCriticalSection( &m_cs ) ;
  253. if( m_pFileTransmitQueue == NULL )
  254. {
  255. LeaveCriticalSection( &m_cs ) ;
  256. return true ;
  257. }
  258. else
  259. {
  260. LeaveCriticalSection( &m_cs ) ;
  261. return false ;
  262. }
  263. }
  264. /****************************************************
  265. ** @Description
  266. **
  267. **
  268. ** @Parameter
  269. **
  270. **
  271. ** @Return:
  272. ** @Author: JHM
  273. ** e-mail: tablejiang@21cn.com
  274. ** @Date: 2001 3 26
  275. ****************************************************/
  276. FTPFILEINFO* CFileQueue::GetNextItem()
  277. {
  278. if( IsEmpty( ) )
  279. return NULL ;
  280. EnterCriticalSection( &m_cs ) ;
  281. FTPFILEINFO* pCur ;
  282. pCur = m_pFileTransmitQueue ;
  283. while( pCur != NULL )
  284. {
  285. if( pCur->state == FILE_STATE_READY )
  286. break ;
  287. pCur = pCur->pNext ;
  288. }
  289. LeaveCriticalSection( &m_cs ) ;
  290. return pCur ;
  291. }
  292. /****************************************************
  293. ** @Description
  294. **
  295. **
  296. ** @Parameter
  297. **
  298. **
  299. ** @Return:
  300. ** @Author: JHM
  301. ** e-mail: tablejiang@21cn.com
  302. ** @Date: 2001 3 26
  303. ****************************************************/
  304. BOOL CFileQueue::SaveQueue()
  305. {
  306. CFile file ;
  307. if( !file.Open( m_SaveFileName , CFile::modeCreate|CFile::modeWrite ) )
  308. return false ;
  309. EnterCriticalSection( &m_cs ) ;
  310. FTPFILEINFO* pCur ;
  311. pCur = m_pFileTransmitQueue ;
  312. try
  313. {
  314. while( pCur != NULL )
  315. {
  316. file.Write( pCur , sizeof( FTPFILEINFO ) ) ;
  317. pCur = pCur->pNext ;
  318. }
  319. }
  320. catch(...)
  321. {
  322. TRACE( "file error!" ) ;
  323. }
  324. LeaveCriticalSection( &m_cs ) ;
  325. file.Close() ;
  326. return true ;
  327. }
  328. /****************************************************
  329. ** @Description
  330. **
  331. **
  332. ** @Parameter
  333. **
  334. **
  335. ** @Return:
  336. ** @Author: JHM
  337. ** e-mail: tablejiang@21cn.com
  338. ** @Date: 2001 3 26
  339. ****************************************************/
  340. BOOL CFileQueue::SetItemState(int iState , FTPFILEINFO* pFileInfo )
  341. {
  342. FTPFILEINFO* pFront ;
  343. FTPFILEINFO* pCurrent ;
  344. BOOL  bFind = false ;
  345. EnterCriticalSection( &m_cs ) ;
  346. if( m_pFileTransmitQueue == NULL )
  347. {
  348. LeaveCriticalSection( &m_cs ) ;
  349. return false ;
  350. }
  351. pCurrent = m_pFileTransmitQueue ;
  352. pFront = m_pFileTransmitQueue ;
  353. while( pCurrent != NULL )
  354. {
  355. if( FtpFileCmp( pFileInfo , pCurrent ) )
  356. {
  357. pCurrent->state = iState ;
  358. bFind = true ;
  359. break ;
  360. }
  361. pFront = pCurrent ;
  362. pCurrent = pCurrent->pNext ;
  363. }
  364. if( bFind == false )
  365. {
  366. LeaveCriticalSection( &m_cs ) ;
  367. return false ;
  368. }
  369. SaveQueue( ) ;
  370. LeaveCriticalSection( &m_cs ) ;
  371. if( m_hParentWnd )
  372. ::PostMessage( m_hParentWnd , REFRESH_WND_MSG , 0 , 0 ) ;
  373. return true ;
  374. }
  375. /****************************************************
  376. ** @Description
  377. **
  378. **
  379. ** @Parameter
  380. **
  381. **
  382. ** @Return:
  383. ** @Author: JHM
  384. ** e-mail: tablejiang@21cn.com
  385. ** @Date: 2001 3 26
  386. ****************************************************/
  387. void CFileQueue::LockTheFileList()
  388. {
  389. EnterCriticalSection( &m_cs ) ;
  390. }
  391. /****************************************************
  392. ** @Description
  393. **
  394. **
  395. ** @Parameter
  396. **
  397. **
  398. ** @Return:
  399. ** @Author: JHM
  400. ** e-mail: tablejiang@21cn.com
  401. ** @Date: 2001 3 26
  402. ****************************************************/
  403. void CFileQueue::UnLockTheFileList()
  404. {
  405. LeaveCriticalSection( &m_cs ) ;
  406. }
  407. /****************************************************
  408. ** @Description
  409. **
  410. **
  411. ** @Parameter
  412. **
  413. **
  414. ** @Return:
  415. ** @Author: JHM
  416. ** e-mail: tablejiang@21cn.com
  417. ** @Date: 2001 3 26
  418. ****************************************************/
  419. FTPFILEINFO* CFileQueue::GetSameSiteFile(FTPFILEINFO *pFile)
  420. {
  421. EnterCriticalSection( &m_cs ) ;
  422. FTPFILEINFO* pCur ;
  423. if( m_pFileTransmitQueue == NULL )
  424. {
  425. LeaveCriticalSection( &m_cs ) ;
  426. return NULL ;
  427. }
  428. pCur = m_pFileTransmitQueue ;
  429. while( pCur != NULL )
  430. {
  431. if( pCur->state == FILE_STATE_READY )
  432. {
  433. if( strcmp( pCur->site.host , pFile->site.host ) == 0 )
  434. {
  435. if( strcmp( pCur->site.user , pFile->site.user ) == 0 )
  436. {
  437. if( strcmp( pCur->site.pass , pFile->site.pass ) == 0 )
  438. {
  439. break ;
  440. }
  441. }
  442. }
  443. }
  444. pCur = pCur->pNext ;
  445. }
  446. LeaveCriticalSection( &m_cs ) ;
  447. return pCur ;
  448. }
  449. /****************************************************
  450. ** @Description
  451. **
  452. **
  453. ** @Parameter
  454. **
  455. **
  456. ** @Return:
  457. ** @Author: JHM
  458. ** e-mail: tablejiang@21cn.com
  459. ** @Date: 2001 3 26
  460. ****************************************************/
  461. BOOL CFileQueue::LoadQueue()
  462. {
  463. CFile file ;
  464. if( !file.Open( m_SaveFileName , CFile::modeRead ) )
  465. return false ;
  466. EnterCriticalSection( &m_cs ) ;
  467. FTPFILEINFO FtpFile ;
  468. UINT iRead ;
  469. try
  470. {
  471. while( iRead )
  472. {
  473. iRead = file.Read( &FtpFile , sizeof( FTPFILEINFO ) ) ;
  474. if( iRead == sizeof( FTPFILEINFO ) )
  475. {
  476. AddItem( &FtpFile ) ;
  477. }
  478. }
  479. }
  480. catch(...)
  481. {
  482. TRACE( "file error!" ) ;
  483. }
  484. LeaveCriticalSection( &m_cs ) ;
  485. file.Close() ;
  486. return true ;
  487. }
  488. /****************************************************
  489. ** @Description
  490. **
  491. **
  492. ** @Parameter
  493. **
  494. **
  495. ** @Return:
  496. ** @Author: JHM
  497. ** e-mail: tablejiang@21cn.com
  498. ** @Date: 2001 3 26
  499. ****************************************************/
  500. BOOL CFileQueue::SetSaveFileName(LPCTSTR filename)
  501. {
  502. strcpy( m_SaveFileName , filename ) ;
  503. DeleteAllFileQueue( ) ;
  504. LoadQueue( ) ;
  505. return true ;
  506. }
  507. /****************************************************
  508. ** @Description
  509. **
  510. **
  511. ** @Parameter
  512. **
  513. **
  514. ** @Return:
  515. ** @Author: JHM
  516. ** e-mail: tablejiang@21cn.com
  517. ** @Date: 2001 3 26
  518. ****************************************************/
  519. BOOL CFileQueue::FtpFileCmp(FTPFILEINFO *pItem1, FTPFILEINFO *pItem2)
  520. {
  521. //if( pItem1->bfileput == pItem2->bfileput )
  522. //{
  523. if( pItem1->filesize == pItem2->filesize )
  524. {
  525. if( strcmp( pItem1->site.host , pItem2->site.host ) == 0 )
  526. {
  527. if( strcmp( pItem1->remotefilename , pItem2->remotefilename ) == 0 )
  528. {
  529. if( strcmp( pItem1->remotepath , pItem2->remotepath ) == 0 )
  530. {
  531. if( strcmp( pItem1->site.user , pItem2->site.user ) == 0 )
  532. {
  533. return true ;
  534. }
  535. }
  536. }
  537. }
  538. }
  539. //}
  540. return false ;
  541. }