PageRenderTime 40ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Modules/FileTransfer/FileTransferUIThread.cpp

https://gitlab.com/yoage/TTWinClient
C++ | 233 lines | 192 code | 30 blank | 11 comment | 25 complexity | 2baa0fe278b86a251deba98d29c75773 MD5 | raw file
Possible License(s): LGPL-3.0
  1. /*******************************************************************************
  2. * @file FileTransferUIThread.cpp 2014\9\17 16:32:18 $
  3. * @author 快刀<kuaidao@mogujie.com>
  4. * @brief 包含多个socket的文件传输UI thread
  5. ******************************************************************************/
  6. #include "stdafx.h"
  7. #include "FileTransferUIThread.h"
  8. #include "FileTransferSocket.h"
  9. #include "TransferManager.h"
  10. #include "utility/utilCommonAPI.h"
  11. #include "src/base/ImPduFile.h"
  12. #include "src/base/ImPduClient.h"
  13. #include <algorithm>
  14. /******************************************************************************/
  15. namespace
  16. {
  17. #define LOGIC_EVNET_MSG _T("___LogicEventDisptacherMessageTest")
  18. #define LOGIC_WINDOW_CLASSNAME _T("___LogicEventDisptacherWndClassTest")
  19. #define LOGIC_WINDOW_NAME _T("")
  20. const UInt32 FILE_TRANSFER_BLOCK_SIZE = 1024 * 40;
  21. }
  22. // -----------------------------------------------------------------------------
  23. // FileTransferUIThread: Public, Constructor
  24. FileTransferUIThread::FileTransferUIThread()
  25. :m_hWnd(0)
  26. {
  27. }
  28. // -----------------------------------------------------------------------------
  29. // FileTransferUIThread: Public, Destructor
  30. FileTransferUIThread::~FileTransferUIThread()
  31. {
  32. }
  33. void FileTransferUIThread::Shutdown()
  34. {
  35. ::PostThreadMessage(getThreadId(), WM_QUIT, 0, 0);
  36. if (!wait(5000))
  37. destory();
  38. }
  39. void FileTransferUIThread::_releaseWnd()
  40. {
  41. if (0 != m_hWnd)
  42. {
  43. ::DestroyWindow(m_hWnd);
  44. m_hWnd = 0;
  45. }
  46. }
  47. UInt32 FileTransferUIThread::process()
  48. {
  49. m_hWnd = _createWnd();
  50. util::messagePump();
  51. _closeAllFileSockets();
  52. _releaseWnd();
  53. return 0;
  54. }
  55. HWND FileTransferUIThread::_createWnd()
  56. {
  57. HWND hwnd = 0;
  58. WNDCLASS wc;
  59. wc.style = CS_HREDRAW | CS_VREDRAW;
  60. wc.lpfnWndProc = _WndProc;
  61. wc.cbClsExtra = 0;
  62. wc.cbWndExtra = 0;
  63. wc.hInstance = ::AfxGetInstanceHandle();
  64. wc.hIcon = 0;
  65. wc.hCursor = 0;
  66. wc.hbrBackground = 0;
  67. wc.lpszMenuName = 0;
  68. wc.lpszClassName = LOGIC_WINDOW_CLASSNAME;
  69. if (!::RegisterClass(&wc))
  70. return 0;
  71. hwnd = ::CreateWindowEx(0, LOGIC_WINDOW_CLASSNAME, LOGIC_WINDOW_NAME,
  72. 0, 0, 0, 1, 1, HWND_MESSAGE, 0, 0, 0);
  73. return hwnd;
  74. }
  75. LRESULT _stdcall FileTransferUIThread::_WndProc(HWND hWnd, UINT message, WPARAM wparam, LPARAM lparam)
  76. {
  77. if (WM_FILE_TRANSFER == message)
  78. {
  79. FileTransferSocket* pFileSocket = (FileTransferSocket*)lparam;
  80. pFileSocket->startFileTransLink();
  81. }
  82. return ::DefWindowProc(hWnd, message, wparam, lparam);
  83. }
  84. void FileTransferUIThread::openFileSocketByTaskId(std::string& taskId)
  85. {
  86. FileTransferSocket* pFileSocket = _findFileSocketByTaskId(taskId);
  87. if (!pFileSocket)
  88. {
  89. pFileSocket = new FileTransferSocket(taskId);
  90. m_lstFileTransSockets.push_back(pFileSocket);
  91. ::PostMessage(m_hWnd, WM_FILE_TRANSFER, 0, (LPARAM)pFileSocket);
  92. }
  93. }
  94. void FileTransferUIThread::closeFileSocketByTaskId(std::string& taskId)
  95. {
  96. TTAutoLock lock(&m_lock);
  97. auto fileSockIter = std::remove_if(m_lstFileTransSockets.begin()
  98. ,m_lstFileTransSockets.end()
  99. ,[=](FileTransferSocket* pFileSocket)
  100. {
  101. return(taskId == pFileSocket->m_sTaskId);
  102. });
  103. if (fileSockIter != m_lstFileTransSockets.end())
  104. {
  105. FileTransferSocket* pFileSocket = *fileSockIter;
  106. pFileSocket->stopfileTransLink();
  107. delete pFileSocket;
  108. pFileSocket = 0;
  109. m_lstFileTransSockets.erase(fileSockIter, m_lstFileTransSockets.end());
  110. }
  111. }
  112. BOOL FileTransferUIThread::acceptFileTransfer(const std::string& taskId)
  113. {
  114. FileTransferSocket* pFileSocket = _findFileSocketByTaskId(taskId);
  115. if (pFileSocket)
  116. {
  117. logic::GetLogic()->pushBackOperationWithLambda(
  118. [=]()
  119. {
  120. TransferFileEntity fileEntity;
  121. if (TransferFileEntityManager::getInstance()->getFileInfoByTaskId(taskId, fileEntity))
  122. {
  123. int mode = fileEntity.nClientMode == CLIENT_OFFLINE_DOWNLOAD ? FILE_TYPE_OFFLINE : FILE_TYPE_ONLINE;
  124. CImPduClientFilePullDataReq pduPullDataReq(taskId.c_str(), fileEntity.sToID.c_str()
  125. , mode, 0, FILE_TRANSFER_BLOCK_SIZE);
  126. pFileSocket->sendPacket(&pduPullDataReq);
  127. }
  128. });
  129. }
  130. return FALSE;
  131. }
  132. BOOL FileTransferUIThread::rejectFileTransfer(const std::string& taskId)
  133. {
  134. FileTransferSocket* pFileSocket = _findFileSocketByTaskId(taskId);
  135. if (pFileSocket)
  136. {
  137. logic::GetLogic()->pushBackOperationWithLambda(
  138. [=]()
  139. {
  140. TransferFileEntity fileEntity;
  141. if (TransferFileEntityManager::getInstance()->getFileInfoByTaskId(taskId, fileEntity))
  142. {
  143. CImPduClientFileState pduRejectData(CLIENT_FILE_REFUSE, taskId.c_str(), fileEntity.sToID.c_str());
  144. pFileSocket->sendPacket(&pduRejectData);
  145. }
  146. });
  147. }
  148. return FALSE;
  149. }
  150. BOOL FileTransferUIThread::cancelFileTransfer(const std::string& taskId)
  151. {
  152. FileTransferSocket* pFileSocket = _findFileSocketByTaskId(taskId);
  153. if (pFileSocket)
  154. {
  155. logic::GetLogic()->pushBackOperationWithLambda(
  156. [=]()
  157. {
  158. TransferFileEntity fileEntity;
  159. if (TransferFileEntityManager::getInstance()->getFileInfoByTaskId(taskId, fileEntity))
  160. {
  161. std::string userid;
  162. if (fileEntity.nClientMode == CLIENT_REALTIME_SENDER
  163. || CLIENT_OFFLINE_UPLOAD == fileEntity.nClientMode)
  164. {
  165. userid = fileEntity.sFromID;
  166. }
  167. else
  168. {
  169. userid = fileEntity.sToID;
  170. }
  171. CImPduClientFileState pduRejectData(CLIENT_FILE_CANCEL, taskId.c_str(), userid.c_str());
  172. pFileSocket->sendPacket(&pduRejectData);
  173. }
  174. });
  175. }
  176. return FALSE;
  177. }
  178. FileTransferSocket* FileTransferUIThread::_findFileSocketByTaskId(const std::string& taskId)
  179. {
  180. TTAutoLock lock(&m_lock);
  181. auto iter = std::find_if(m_lstFileTransSockets.begin(),m_lstFileTransSockets.end()
  182. , [=](FileTransferSocket* fileSock)
  183. {
  184. return (taskId == fileSock->m_sTaskId);
  185. });
  186. if (iter != m_lstFileTransSockets.end())
  187. {
  188. FileTransferSocket* fileSocket = *iter;
  189. return fileSocket;
  190. }
  191. return 0;
  192. }
  193. void FileTransferUIThread::_closeAllFileSockets()
  194. {
  195. for (FileTransferSocket* pFileSock : m_lstFileTransSockets)
  196. {
  197. pFileSock->stopfileTransLink();
  198. delete pFileSock;
  199. pFileSock = 0;
  200. }
  201. m_lstFileTransSockets.clear();
  202. }
  203. /******************************************************************************/