1
0

FileRecieve.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. // FileRecieve.cpp: implementation of the CFileRecieve class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "cp_main.h"
  6. #include "FileRecieve.h"
  7. #include "RecieveSocket.h"
  8. #include "shared/TextConvert.h"
  9. #include "Path.h"
  10. #include "UnicodeMacros.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. CFileRecieve::CFileRecieve()
  17. {
  18. m_pProgress = NULL;
  19. }
  20. CFileRecieve::~CFileRecieve()
  21. {
  22. }
  23. long CFileRecieve::RecieveFiles(SOCKET sock, CString csIP, CFileTransferProgressDlg *pProgress)
  24. {
  25. CSendInfo Info;
  26. BOOL bBreak = false;
  27. BOOL lRet = FALSE;
  28. int nNumFiles = 0;
  29. int nFilesRecieved = 0;
  30. m_pProgress = pProgress;
  31. m_csRecievingFromIP = csIP;
  32. m_Sock.SetSocket(sock);
  33. m_Sock.SetProgressBar(pProgress);
  34. while(true)
  35. {
  36. if(m_Sock.RecieveCSendInfo(&Info) == FALSE)
  37. break;
  38. switch(Info.m_Type)
  39. {
  40. case MyEnums::START:
  41. nNumFiles = Info.m_lParameter1;
  42. if(m_pProgress != NULL)
  43. {
  44. m_pProgress->SetNumFiles(nNumFiles);
  45. }
  46. LogSendRecieveInfo(StrF(_T("Start recieving files File Count: %d"), nNumFiles));
  47. break;
  48. case MyEnums::DATA_START:
  49. {
  50. CString csFileName;
  51. nFilesRecieved++;
  52. CTextConvert::ConvertFromUTF8(Info.m_cDesc, csFileName);
  53. if(m_pProgress != NULL)
  54. {
  55. m_pProgress->StepAllFiles();
  56. m_pProgress->SetMessage(StrF(_T("Copying File %d of %d"), nFilesRecieved, nNumFiles));
  57. m_pProgress->SetFileMessage(StrF(_T("Copying %s"), csFileName));
  58. m_pProgress->PumpMessages();
  59. if(m_pProgress->Cancelled())
  60. {
  61. lRet = USER_CANCELED;
  62. bBreak = true;
  63. break;
  64. }
  65. }
  66. ULONG lFileSize = (ULONG)Info.m_lParameter1;
  67. LogSendRecieveInfo(StrF(_T("START of recieving the file %s, size: %d, File %d of %d"), csFileName, lFileSize, nFilesRecieved, nNumFiles));
  68. long lRecieveRet = RecieveFileData(lFileSize, csFileName);
  69. if(lRecieveRet == USER_CANCELED)
  70. {
  71. lRet = USER_CANCELED;
  72. bBreak = true;
  73. break;
  74. }
  75. else if(lRecieveRet == FALSE)
  76. {
  77. LogSendRecieveInfo(StrF(_T("Error recieving the file %s"), csFileName));
  78. }
  79. else
  80. {
  81. LogSendRecieveInfo(StrF(_T("END of recieving the file %s, size: %d"), csFileName, lFileSize));
  82. lRet = TRUE;
  83. }
  84. }
  85. break;
  86. case MyEnums::DATA_END:
  87. {
  88. if (Info.m_lParameter1 != 0 &&
  89. Info.m_lParameter2 != 0 &&
  90. m_RecievedFiles.GetCount() > 0)
  91. {
  92. FILETIME lastWriteTime;
  93. lastWriteTime.dwLowDateTime = Info.m_lParameter1;
  94. lastWriteTime.dwHighDateTime = Info.m_lParameter2;
  95. HANDLE filename = CreateFile(m_RecievedFiles[m_RecievedFiles.GetCount() - 1], FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  96. if(filename != NULL)
  97. {
  98. SetFileTime(filename, NULL, NULL, &lastWriteTime);
  99. }
  100. }
  101. }
  102. break;
  103. case MyEnums::END:
  104. bBreak = true;
  105. break;
  106. default:
  107. LogSendRecieveInfo("::ERROR unknown action type exiting");
  108. bBreak = true;
  109. }
  110. if(bBreak || theApp.m_bAppExiting)
  111. break;
  112. }
  113. return lRet;
  114. }
  115. long CFileRecieve::RecieveFileData(ULONG lFileSize, CString csFileName)
  116. {
  117. CString csFile = CGetSetOptions::GetPath(PATH_REMOTE_FILES);
  118. CreateDirectory(csFile, NULL);
  119. csFile += m_csRecievingFromIP + "\\";
  120. CreateDirectory(csFile, NULL);
  121. nsPath::CPath path(csFileName);
  122. csFile += path.GetName();
  123. CFile File;
  124. CFileException ex;
  125. if(File.Open(csFile, CFile::modeWrite|CFile::modeCreate|CFile::typeBinary, &ex) == FALSE)
  126. {
  127. TCHAR szError[200];
  128. ex.GetErrorMessage(szError, 200);
  129. LogSendRecieveInfo(StrF(_T("Error opening file in RequestCopiedFiles, error: %s"), szError));
  130. return FALSE;
  131. }
  132. ULONG lBytesRead = 0;
  133. long lBytesNeeded = 0;
  134. int nPercent = 0;
  135. int nPrevPercent = 0;
  136. char *pBuffer = new char[CHUNK_WRITE_SIZE];
  137. if(pBuffer == NULL)
  138. {
  139. LogSendRecieveInfo("Error creating buffer in RequestCopiedFiles");
  140. return FALSE;
  141. }
  142. BOOL bRet = FALSE;
  143. while(true)
  144. {
  145. lBytesNeeded = CHUNK_WRITE_SIZE;
  146. if(lFileSize - lBytesRead < CHUNK_WRITE_SIZE)
  147. lBytesNeeded = lFileSize - lBytesRead;
  148. if(m_Sock.RecieveExactSize(pBuffer, lBytesNeeded) == FALSE)
  149. {
  150. break;
  151. }
  152. File.Write(pBuffer, lBytesNeeded);
  153. lBytesRead += lBytesNeeded;
  154. if(lBytesRead >= lFileSize)
  155. {
  156. m_pProgress->SetSingleFilePos(100);
  157. bRet = TRUE;
  158. break;
  159. }
  160. if(lBytesNeeded > 0)
  161. {
  162. nPercent = (int)((lBytesRead / (double)lFileSize) * 100);
  163. if((nPercent - nPrevPercent) > 5)
  164. {
  165. m_pProgress->SetSingleFilePos(nPercent);
  166. m_pProgress->PumpMessages();
  167. if(m_pProgress->Cancelled())
  168. {
  169. bRet = USER_CANCELED;
  170. break;
  171. }
  172. nPrevPercent = nPercent;
  173. }
  174. }
  175. }
  176. File.Close();
  177. if(bRet)
  178. {
  179. m_RecievedFiles.Add(csFile);
  180. }
  181. delete []pBuffer;
  182. pBuffer = NULL;
  183. return bRet;
  184. }
  185. HGLOBAL CFileRecieve::CreateCF_HDROPBufferAsString()
  186. {
  187. CString data;
  188. int nFileArraySize = (int) m_RecievedFiles.GetSize();
  189. for (int i = 0; i < nFileArraySize; i++)
  190. {
  191. data += m_RecievedFiles[i];
  192. data += _T("\r\n");
  193. }
  194. HGLOBAL hReturn = NewGlobalP(data.GetBuffer(), (data.GetLength() + 1)*sizeof(TCHAR));
  195. return hReturn;
  196. }
  197. HGLOBAL CFileRecieve::CreateCF_HDROPBuffer()
  198. {
  199. int nFileArraySize = (int)m_RecievedFiles.GetSize();
  200. if(nFileArraySize <= 0)
  201. {
  202. LogSendRecieveInfo(_T("Recieved files array is empty not creating cf_hdrop structure"));
  203. return NULL;
  204. }
  205. TCHAR *pBuff = NULL;
  206. int nBuffSize = 0;
  207. for(int i = 0; i < nFileArraySize; i++)
  208. {
  209. nBuffSize += m_RecievedFiles[i].GetLength()*sizeof(TCHAR)+1;
  210. }
  211. nBuffSize += sizeof(DROPFILES)+2;
  212. nBuffSize = (nBuffSize/32 + 1)*32;
  213. pBuff = new TCHAR[nBuffSize];
  214. ZeroMemory(pBuff, nBuffSize);
  215. ((DROPFILES*)pBuff)->pFiles = sizeof(DROPFILES);
  216. #ifdef _UNICODE
  217. ((DROPFILES*)pBuff)->fWide = TRUE;
  218. #endif
  219. TCHAR* pCurrent = (TCHAR*)(((char*)pBuff) + sizeof(DROPFILES));
  220. for(int n = 0; n < nFileArraySize; n++)
  221. {
  222. STRCPY(pCurrent, (LPCTSTR)m_RecievedFiles[n]);
  223. LogSendRecieveInfo(StrF(_T("CreateCF_HDROPBuffer adding the file '%s' to local cf_hdrop structure"), pCurrent));
  224. pCurrent += m_RecievedFiles[n].GetLength();
  225. *pCurrent = 0;
  226. pCurrent++;
  227. }
  228. HGLOBAL hReturn = NewGlobalP(pBuff, nBuffSize);
  229. delete []pBuff;
  230. pBuff = NULL;
  231. return hReturn;
  232. }