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

Ftp客户端

开发平台:

Visual C++

  1. // DeleteFileQueue.cpp: implementation of the CDeleteFileQueue 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 "DeleteFileQueue.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. CDeleteFileQueue::CDeleteFileQueue()
  24. {
  25. //init the critical section tag .
  26. InitializeCriticalSection( &m_cs );
  27. //set file queue null.
  28. m_pFileTransmitQueue = NULL ;
  29. }
  30. CDeleteFileQueue::~CDeleteFileQueue()
  31. {
  32. //clear the file queue .
  33. DeleteAllFileQueue( ) ;
  34. //delete tag .
  35. DeleteCriticalSection( &m_cs );
  36. }
  37. /****************************************************
  38. ** @Description
  39. ** add a delete file to queue.
  40. **
  41. ** @Parameter
  42. ** FTPFILEINFO* pFileInfo : the ftp file info .
  43. **
  44. ** @Return: true 
  45. ** @Author: Table.JHM.太子
  46. ** e-mail: tablejiang@21cn.com
  47. ** @Date: 2001 3 26
  48. ****************************************************/
  49. BOOL CDeleteFileQueue::AddItem(FTPFILEINFO *pFileInfo)
  50. {
  51. //set enter tag .
  52. EnterCriticalSection( &m_cs ) ;
  53. FTPFILEINFO* pFileItem ;
  54. FTPFILEINFO*    pCurItem ;
  55. BOOL bFind = false ;
  56. //create a new object .
  57. pFileItem = new FTPFILEINFO ;
  58. memcpy( pFileItem , pFileInfo , sizeof( FTPFILEINFO ) ) ;
  59. //new add item always set state to FILE_STATE_READY.
  60. pFileItem->state = FILE_STATE_READY ;
  61. pFileItem->pNext = NULL ;
  62. //is the head item ?
  63. if( m_pFileTransmitQueue == NULL )
  64. {
  65. m_pFileTransmitQueue = pFileItem ;
  66. LeaveCriticalSection( &m_cs ) ;
  67. return true ;
  68. }
  69. pCurItem = m_pFileTransmitQueue ;
  70. //find the item is file queue .if the item is already add in
  71. //this file queue , don't add it .
  72. while( pCurItem->pNext != NULL )
  73. {
  74. if( strcmp( pFileInfo->site.host , pCurItem->site.host ) == 0 )
  75. {
  76. if( strcmp( pFileInfo->remotefilename , pCurItem->remotefilename ) == 0 )
  77. {
  78. if( strcmp( pFileInfo->remotepath , pCurItem->remotepath ) == 0 )
  79. {
  80. if( pFileInfo->bfileput == pCurItem->bfileput )
  81. {
  82. if( pFileInfo->bIsDirectory == pCurItem->bIsDirectory )
  83. {
  84. if(strcmp(  pFileInfo->site.user , pFileInfo->site.user ) == 0 )
  85. {
  86. bFind = true ;
  87. break ;
  88. }
  89. }
  90. }
  91. }
  92. }
  93. }
  94. pCurItem = pCurItem->pNext ;
  95. }
  96. if( !bFind )
  97. pCurItem->pNext = pFileItem ;
  98. //set leave tag .
  99. LeaveCriticalSection( &m_cs ) ;
  100. return true ;
  101. }
  102. /****************************************************
  103. ** @Description
  104. ** delete a file from queue .( delete a item from 
  105. single chain .)
  106. **
  107. ** @Parameter
  108. ** FTPFILEINFO* pFileInfo : the delete file info.
  109. **
  110. ** @Return: if delete success return true ,else false .
  111. ** @Author: Table.JHM.太子
  112. ** e-mail: tablejiang@21cn.com
  113. ** @Date: 2001 3 26
  114. ****************************************************/
  115. BOOL CDeleteFileQueue::DeleteItem(FTPFILEINFO *pFileInfo)
  116. {
  117. FTPFILEINFO* pFront ;
  118. FTPFILEINFO* pCurrent ;
  119. BOOL  bFind = false ;
  120. //set enter tag.
  121. EnterCriticalSection( &m_cs ) ;
  122. if( m_pFileTransmitQueue == NULL )
  123. {
  124. LeaveCriticalSection( &m_cs ) ;
  125. return true ;
  126. }
  127. pCurrent = m_pFileTransmitQueue ;
  128. pFront = m_pFileTransmitQueue ;
  129. while( pCurrent != NULL )
  130. {
  131. if( strcmp( pFileInfo->site.host , pCurrent->site.host ) == 0 )
  132. {
  133. if( strcmp( pFileInfo->remotefilename , pCurrent->remotefilename ) == 0 )
  134. {
  135. if( strcmp( pFileInfo->remotepath , pCurrent->remotepath ) == 0 )
  136. {
  137. bFind = true ;
  138. break ;
  139. }
  140. }
  141. }
  142. pFront = pCurrent ;
  143. pCurrent = pCurrent->pNext ;
  144. }
  145. //no this item , return false .
  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. LeaveCriticalSection( &m_cs ) ;
  161. return true ;
  162. }
  163. /****************************************************
  164. ** @Description
  165. ** is specify file in this file queue .
  166. ( search a item in single chain )
  167. **
  168. ** @Parameter
  169. **
  170. ** @Return:
  171. ** @Author: Table.JHM.太子
  172. ** e-mail: tablejiang@21cn.com
  173. ** @Date: 2001 3 26
  174. ****************************************************/
  175. BOOL CDeleteFileQueue::IsInFileQueue(FTPFILEINFO *pFileInfo)
  176. {
  177. FTPFILEINFO* pFront ;
  178. FTPFILEINFO* pCurrent ;
  179. BOOL  bFind = false ;
  180. EnterCriticalSection( &m_cs ) ;
  181. if( m_pFileTransmitQueue == NULL )
  182. {
  183. LeaveCriticalSection( &m_cs ) ;
  184. return false ;
  185. }
  186. pCurrent = m_pFileTransmitQueue ;
  187. pFront = m_pFileTransmitQueue ;
  188. while( pCurrent != NULL )
  189. {
  190. if( strcmp( pFileInfo->site.host , pCurrent->site.host ) == 0 )
  191. {
  192. if( strcmp( pFileInfo->remotefilename , pCurrent->remotefilename ) == 0 )
  193. {
  194. if( strcmp( pFileInfo->remotepath , pCurrent->remotepath ) == 0 )
  195. {
  196. bFind = true ;
  197. break ;
  198. }
  199. }
  200. }
  201. pFront = pCurrent ;
  202. pCurrent = pCurrent->pNext ;
  203. }
  204. LeaveCriticalSection( &m_cs ) ;
  205. return bFind ;
  206. }
  207. /****************************************************
  208. ** @Description
  209. ** clear the file queue .
  210. **
  211. ** @Parameter
  212. ** void
  213. **
  214. ** @Return:
  215. ** @Author: Table.JHM.太子
  216. ** e-mail: tablejiang@21cn.com
  217. ** @Date: 2001 3 26
  218. ****************************************************/
  219. BOOL CDeleteFileQueue::DeleteAllFileQueue()
  220. {
  221. FTPFILEINFO* pCurrent ;
  222. EnterCriticalSection( &m_cs ) ;
  223. if( m_pFileTransmitQueue== NULL)
  224. {
  225. LeaveCriticalSection( &m_cs ) ;
  226. return true ;
  227. }
  228. pCurrent = m_pFileTransmitQueue ;
  229. while( m_pFileTransmitQueue != NULL)
  230. {
  231. m_pFileTransmitQueue = pCurrent->pNext ;
  232. delete pCurrent ;
  233. pCurrent = m_pFileTransmitQueue ;
  234. }
  235. m_pFileTransmitQueue = NULL ;
  236. LeaveCriticalSection( &m_cs ) ;
  237. return true ;
  238. }
  239. /****************************************************
  240. ** @Description
  241. ** Is file queue empty.
  242. **
  243. ** @Parameter
  244. ** void
  245. **
  246. ** @Return:
  247. ** @Author: Table.JHM.太子
  248. ** e-mail: tablejiang@21cn.com
  249. ** @Date: 2001 3 26
  250. ****************************************************/
  251. BOOL CDeleteFileQueue::IsEmpty()
  252. {
  253. EnterCriticalSection( &m_cs ) ;
  254. if( m_pFileTransmitQueue == NULL )
  255. {
  256. LeaveCriticalSection( &m_cs ) ;
  257. return true ;
  258. }
  259. else
  260. {
  261. LeaveCriticalSection( &m_cs ) ;
  262. return false ;
  263. }
  264. }
  265. /****************************************************
  266. ** @Description
  267. ** get next ready item .
  268. **
  269. ** @Parameter
  270. **
  271. **
  272. ** @Return:
  273. ** @Author: Table.JHM.太子
  274. ** e-mail: tablejiang@21cn.com
  275. ** @Date: 2001 3 26
  276. ****************************************************/
  277. FTPFILEINFO* CDeleteFileQueue::GetNextItem()
  278. {
  279. if( IsEmpty( ) )
  280. return NULL ;
  281. EnterCriticalSection( &m_cs ) ;
  282. FTPFILEINFO* pCur ;
  283. pCur = m_pFileTransmitQueue ;
  284. while( pCur != NULL )
  285. {
  286. if( pCur->state == FILE_STATE_READY )
  287. break ;
  288. pCur = pCur->pNext ;
  289. }
  290. LeaveCriticalSection( &m_cs ) ;
  291. return pCur ;
  292. }