DownloadManagerImpl.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include "StdAfx.h"
  2. #include "DownloadManagerImpl.h"
  3. #include <boost/make_shared.hpp>
  4. #define BUFFER_STEP_SIZE 1024
  5. #define MSG_COMPLETE_FILE WM_USER + 100
  6. #define MSG_COMPLETE_BUFFER WM_USER + 101
  7. #define MSG_ERROR WM_USER + 102
  8. DownloadManagerImpl::~DownloadManagerImpl(void)
  9. {
  10. }
  11. void DownloadManagerImpl::init(HWND hWnd)
  12. {
  13. m_hParent = hWnd;
  14. mspTaskManager = UEFactory::getTaskManager(emProtocol_Http);
  15. mspTaskManager->initTaskManager();
  16. }
  17. void DownloadManagerImpl::uninit( void )
  18. {
  19. mspTaskManager->uninitTaskManager();
  20. mspTaskManager.reset();
  21. m_hParent = NULL;
  22. }
  23. TaskID DownloadManagerImpl::CreateTask( TaskInitData* pInit )
  24. {
  25. if (!mspTaskManager)
  26. {
  27. return NULL;
  28. }
  29. nsURLEngine::IUETaskPtr spNewTask = mspTaskManager->getNewTask();
  30. TaskID taskID = reinterpret_cast<TaskID>(spNewTask.get());
  31. TaskDataPtr spTaskData = boost::make_shared<TaskData>();
  32. spNewTask->setCallback(static_cast<IUETaskCallback*>(this));
  33. spNewTask->setURL(pInit->strRequestURL.c_str());
  34. spNewTask->setMethod(pInit->hm == HM_POST ? emMethod_Post : emMethod_Get);
  35. spNewTask->setParam(pInit->strParam.c_str());
  36. //TaskInitData::ParamList::iterator itParam = pInit->lsParams.begin();
  37. //while (itParam != pInit->lsParams.end())
  38. //{
  39. // spNewTask->addParam(itParam->first.c_str(),itParam->second.c_str());
  40. // itParam++;
  41. //}
  42. if (!pInit->strFilename.empty())
  43. {
  44. spNewTask->setLocalFile(pInit->strFilename.c_str());
  45. spTaskData->strFile = pInit->strFilename;
  46. }
  47. else
  48. {
  49. spTaskData->vecData.reserve(BUFFER_STEP_SIZE);
  50. }
  51. spTaskData->spTask = spNewTask;
  52. TaskDataMap::iterator it = mmTasks.find(taskID);
  53. if (it != mmTasks.end())
  54. {
  55. mmTasks.erase(it);
  56. }
  57. mmTasks.insert(std::make_pair(taskID,spTaskData));
  58. return taskID;
  59. }
  60. bool DownloadManagerImpl::StartTask( TaskID taskID )
  61. {
  62. TaskDataMap::iterator it = mmTasks.find(taskID);
  63. if (it != mmTasks.end())
  64. {
  65. mspTaskManager->startTask(it->second->spTask);
  66. return true;
  67. }
  68. return false;
  69. }
  70. void* DownloadManagerImpl::AllocCompleteBuffer( TaskID taskID )
  71. {
  72. TaskDataMap::iterator it = mmTasks.find(taskID);
  73. if (it == mmTasks.end())
  74. {
  75. return NULL;
  76. }
  77. DownloadData* pData = new DownloadData();
  78. if (it->second->strFile.empty())
  79. {
  80. pData->nLen = it->second->vecData.size();
  81. pData->ptr = new char[pData->nLen];
  82. memcpy(pData->ptr,&(it->second->vecData[0]),pData->nLen);
  83. }
  84. else
  85. {
  86. pData->nLen = it->second->strFile.size() + 1;
  87. pData->ptr = new char[pData->nLen];
  88. memcpy(pData->ptr,it->second->strFile.c_str(),pData->nLen);
  89. }
  90. return reinterpret_cast<void*>(pData);
  91. }
  92. void DownloadManagerImpl::OnTaskProgress( double fNow,double fTotal,UETaskID taskid )
  93. {
  94. }
  95. void DownloadManagerImpl::OnTaskEvent( emTaskEvent event,emEngineErrCode errCode,UETaskID taskid )
  96. {
  97. if (event == emEvent_Complete)
  98. {
  99. TaskDataMap::iterator it = mmTasks.find(taskid);
  100. if (it != mmTasks.end())
  101. {
  102. try{
  103. ParamConstructor* pConstructor = static_cast<ParamConstructor*>(this);
  104. DownloadData* pData = NULL;
  105. pConstructor->ParamAlloc(it->second->strFile.empty() ? MSG_COMPLETE_BUFFER : MSG_COMPLETE_FILE,0,&taskid,reinterpret_cast<void**>(&pData));
  106. PostMessage(m_hParent, it->second->strFile.empty() ? MSG_COMPLETE_BUFFER : MSG_COMPLETE_FILE,
  107. (WPARAM)taskid, (LPARAM)pData);
  108. /* eventMgr->postEvent(
  109. EVENT_DOWNLOADMANAGER_COMPLETE,
  110. it->second->strFile.empty() ? DOWNLOADCOMPLETE_BUFFER : DOWNLOADCOMPLETE_FILE,
  111. taskid,
  112. pData,
  113. pConstructor
  114. );*/
  115. }
  116. catch(...)
  117. {
  118. PostMessage(m_hParent, MSG_ERROR, (WPARAM)&taskid, NULL);
  119. //eventMgr->postEvent(EVENT_DOWNLOADMANAGER_ERROR,0,taskid,NULL);
  120. }
  121. }
  122. mmTasks.erase(taskid);
  123. }
  124. else if (event == emEvent_Error)
  125. {
  126. //eventMgr->postEvent(EVENT_DOWNLOADMANAGER_ERROR,0,taskid,NULL);
  127. mmTasks.erase(taskid);
  128. }
  129. }
  130. void DownloadManagerImpl::OnTaskData( UEVoidPtr ptr,unsigned int nLen,UETaskID taskid )
  131. {
  132. TaskDataMap::iterator it = mmTasks.find(taskid);
  133. if (it != mmTasks.end())
  134. {
  135. if (it->second->strFile.empty())
  136. {
  137. std::vector<unsigned char>::size_type nSize = it->second->vecData.size();
  138. std::vector<unsigned char>::size_type nCaps = it->second->vecData.capacity();
  139. if (nSize + nLen > nCaps)
  140. {
  141. it->second->vecData.reserve(nSize + nLen + BUFFER_STEP_SIZE);
  142. }
  143. it->second->vecData.resize(nSize + nLen);
  144. memcpy(&(it->second->vecData[nSize]),ptr,nLen);
  145. }
  146. }
  147. }
  148. bool DownloadManagerImpl::StopTask( TaskID taskID )
  149. {
  150. TaskDataMap::iterator it = mmTasks.find(taskID);
  151. if (it != mmTasks.end())
  152. {
  153. if (it->second->spTask)
  154. {
  155. it->second->spTask->cancel();
  156. return true;
  157. }
  158. }
  159. return false;
  160. }
  161. void DownloadManagerImpl::ParamAlloc( unsigned int nEvent, unsigned int nSubEvent, void** param1, void** param2 )
  162. {
  163. switch (nEvent)
  164. {
  165. //case EVENT_DOWNLOADMANAGER_PROGRESS:
  166. // *param2 = reinterpret_cast<void*>(new DownloadProgress());
  167. // break;
  168. case MSG_COMPLETE_BUFFER:
  169. *param2 = AllocCompleteBuffer(*param1);
  170. break;
  171. case MSG_COMPLETE_FILE:
  172. *param2 = AllocCompleteBuffer(*param1);
  173. break;
  174. }
  175. }
  176. void DownloadManagerImpl::ParamFree( unsigned int nEvent, unsigned int nSubEvent, void* param1, void* param2 )
  177. {
  178. switch (nEvent)
  179. {
  180. //case EVENT_DOWNLOADMANAGER_PROGRESS:
  181. // if (param2)
  182. // {
  183. // delete param2;
  184. // }
  185. // break;
  186. case MSG_COMPLETE_BUFFER || MSG_COMPLETE_FILE:
  187. {
  188. DownloadData* pData = reinterpret_cast<DownloadData*>(param2);
  189. if (pData)
  190. {
  191. if (pData->ptr)
  192. {
  193. delete []pData;
  194. }
  195. delete pData;
  196. }
  197. }
  198. break;
  199. }
  200. }
  201. DownloadManagerImpl::DownloadManagerImpl( void )
  202. {
  203. }