TransferSocket.cpp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483
  1. // FileZilla - a Windows ftp client
  2. // Copyright (C) 2002-2004 - Tim Kosse <[email protected]>
  3. // This program is free software; you can redistribute it and/or
  4. // modify it under the terms of the GNU General Public License
  5. // as published by the Free Software Foundation; either version 2
  6. // of the License, or (at your option) any later version.
  7. // This program is distributed in the hope that it will be useful,
  8. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. // GNU General Public License for more details.
  11. // You should have received a copy of the GNU General Public License
  12. // along with this program; if not, write to the Free Software
  13. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. // TransferSocket.cpp: Implementierungsdatei
  15. //
  16. #include "stdafx.h"
  17. #ifndef MPEXT
  18. #include "filezilla.h"
  19. #endif
  20. #include "TransferSocket.h"
  21. #include "mainthread.h"
  22. #include "AsyncProxySocketLayer.h"
  23. #ifndef MPEXT_NO_GSS
  24. #include "AsyncGssSocketLayer.h"
  25. #endif
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. #define BUFSIZE 16384
  32. #define STATE_WAITING 0
  33. #define STATE_STARTING 1
  34. #define STATE_STARTED 2
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CTransferSocket
  37. CTransferSocket::CTransferSocket(CFtpControlSocket *pOwner, int nMode)
  38. {
  39. ASSERT(pOwner);
  40. InitLog(pOwner);
  41. m_pOwner = pOwner;
  42. m_nMode = nMode;
  43. m_nTransferState = STATE_WAITING;
  44. m_bCheckTimeout = FALSE;
  45. m_pBuffer = 0;
  46. #ifndef MPEXT_NO_ZLIB
  47. m_pBuffer2 = 0;
  48. #endif
  49. m_bufferpos = 0;
  50. m_ReadPos = 0;
  51. m_ReadBuffer = 0;
  52. m_ReadSize = 0;
  53. m_cLastChar = 0;
  54. m_pFile = 0;
  55. m_bListening = FALSE;
  56. m_bSentClose = FALSE;
  57. m_nInternalMessageID = 0;
  58. m_transferdata.transfersize = 0;
  59. m_transferdata.transferleft = 0;
  60. m_transferdata.nTransferStart = 0;
  61. m_nNotifyWaiting = 0;
  62. m_bShutDown = FALSE;
  63. UpdateStatusBar(true);
  64. for (int i = 0; i < SPEED_SECONDS; i++)
  65. {
  66. m_Transfered[i] = 0;
  67. m_UsedForTransfer[i] = 0;
  68. }
  69. m_pProxyLayer = NULL;
  70. #ifndef MPEXT_NO_SSL
  71. m_pSslLayer = NULL;
  72. #endif
  73. #ifndef MPEXT_NO_GSS
  74. m_pGssLayer = NULL;
  75. #endif
  76. if (m_nMode & CSMODE_LIST)
  77. {
  78. m_pListResult = new CFtpListResult(pOwner->m_CurrentServer, &pOwner->m_bUTF8);
  79. m_pListResult->InitLog(this);
  80. }
  81. else
  82. m_pListResult = 0;
  83. m_LastUpdateTime.QuadPart = 0;
  84. #ifndef MPEXT_NO_ZLIB
  85. memset(&m_zlibStream, 0, sizeof(m_zlibStream));
  86. m_useZlib = false;
  87. #endif
  88. }
  89. CTransferSocket::~CTransferSocket()
  90. {
  91. LogMessage(__FILE__, __LINE__, this,FZ_LOG_DEBUG, _T("~CTransferSocket()"));
  92. delete [] m_pBuffer;
  93. #ifndef MPEXT_NO_ZLIB
  94. delete [] m_pBuffer2;
  95. #endif
  96. if (m_ReadBuffer)
  97. {
  98. delete [] m_ReadBuffer;
  99. m_ReadBuffer = 0;
  100. }
  101. PostMessage(m_pOwner->m_pOwner->m_hOwnerWnd, m_pOwner->m_pOwner->m_nReplyMessageID, FZ_MSG_MAKEMSG(FZ_MSG_TRANSFERSTATUS, 0), 0);
  102. Close();
  103. RemoveAllLayers();
  104. delete m_pProxyLayer;
  105. #ifndef MPEXT_NO_SSL
  106. delete m_pSslLayer;
  107. #endif
  108. #ifndef MPEXT_NO_GSS
  109. delete m_pGssLayer;
  110. #endif
  111. m_pOwner->RemoveActiveTransfer();
  112. delete m_pListResult;
  113. #ifndef MPEXT_NO_ZLIB
  114. if (m_useZlib)
  115. {
  116. if (m_nMode & CSMODE_UPLOAD)
  117. deflateEnd(&m_zlibStream);
  118. else
  119. inflateEnd(&m_zlibStream);
  120. }
  121. #endif
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // Member-Funktion CTransferSocket
  125. void CTransferSocket::OnReceive(int nErrorCode)
  126. {
  127. if (GetState() != connected && GetState() != attached && GetState() != closed)
  128. return;
  129. if (m_nTransferState == STATE_WAITING)
  130. {
  131. m_nNotifyWaiting |= FD_READ;
  132. return;
  133. }
  134. if (m_bSentClose)
  135. return;
  136. if (m_bListening)
  137. return;
  138. if (m_nMode&CSMODE_LIST)
  139. {
  140. if (m_nTransferState == STATE_STARTING)
  141. OnConnect(0);
  142. char *buffer = new char[BUFSIZE];
  143. int numread = CAsyncSocketEx::Receive(buffer, BUFSIZE);
  144. if (numread != SOCKET_ERROR && numread)
  145. {
  146. m_LastActiveTime = CTime::GetCurrentTime();
  147. UpdateRecvLed();
  148. #ifndef MPEXT_NO_ZLIB
  149. if (m_useZlib)
  150. {
  151. m_zlibStream.next_in = (Bytef *)buffer;
  152. m_zlibStream.avail_in = numread;
  153. char *out = new char[BUFSIZE];
  154. m_zlibStream.next_out = (Bytef *)out;
  155. m_zlibStream.avail_out = BUFSIZE;
  156. int res = inflate(&m_zlibStream, 0);
  157. while (res == Z_OK)
  158. {
  159. m_pListResult->AddData(out, BUFSIZE - m_zlibStream.avail_out);
  160. out = new char[BUFSIZE];
  161. m_zlibStream.next_out = (Bytef *)out;
  162. m_zlibStream.avail_out = BUFSIZE;
  163. res = inflate(&m_zlibStream, 0);
  164. }
  165. delete [] buffer;
  166. if (res == Z_STREAM_END)
  167. m_pListResult->AddData(out, BUFSIZE - m_zlibStream.avail_out);
  168. else if (res != Z_OK && res != Z_BUF_ERROR)
  169. {
  170. delete [] out;
  171. Close();
  172. if (!m_bSentClose)
  173. {
  174. m_nMode |= CSMODE_TRANSFERERROR;
  175. m_bSentClose = TRUE;
  176. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  177. }
  178. return;
  179. }
  180. else
  181. delete [] out;
  182. }
  183. else
  184. #endif
  185. m_pListResult->AddData(buffer, numread);
  186. m_transferdata.transfersize += numread;
  187. CTimeSpan timespan = CTime::GetCurrentTime() - m_StartTime;
  188. int elapsed = (int)timespan.GetTotalSeconds();
  189. //TODO
  190. //There are servers which report the total number of
  191. //bytes in the list response message, but yet it is not supported by FZ.
  192. /*double leftmodifier=(transfersize-transferstart-transferleft);
  193. leftmodifier*=100;
  194. leftmodifier/=(transfersize-transferstart);
  195. if (leftmodifier==0)
  196. leftmodifier=1;
  197. double leftmodifier2=100-leftmodifier;
  198. int left=(int)((elapsed/leftmodifier)*leftmodifier2);
  199. int percent=MulDiv(100,transfersize-transferleft,transfersize);*/
  200. int transferrate=static_cast<int>( (elapsed && m_transferdata.transfersize)?m_transferdata.transfersize/elapsed:0 );
  201. t_ffam_transferstatus *status = new t_ffam_transferstatus;
  202. status->bFileTransfer = FALSE;
  203. #ifdef MPEXT
  204. status->transfersize = -1;
  205. #endif
  206. status->bytes = m_transferdata.transfersize;
  207. status->percent = -1;
  208. status->timeelapsed = elapsed;
  209. status->timeleft = -1;
  210. status->transferrate = transferrate;
  211. PostMessage(m_pOwner->m_pOwner->m_hOwnerWnd, m_pOwner->m_pOwner->m_nReplyMessageID, FZ_MSG_MAKEMSG(FZ_MSG_TRANSFERSTATUS, 0), (LPARAM)status);
  212. }
  213. else
  214. delete [] buffer;
  215. if (!numread)
  216. {
  217. Close();
  218. if (!m_bSentClose)
  219. {
  220. m_bSentClose = TRUE;
  221. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  222. }
  223. }
  224. if (numread == SOCKET_ERROR)
  225. {
  226. int nError = GetLastError();
  227. if (nError == WSAENOTCONN)
  228. {
  229. //Not yet connected
  230. return;
  231. }
  232. #ifndef MPEXT_NO_SSL
  233. else if (m_pSslLayer && nError == WSAESHUTDOWN)
  234. {
  235. // Do nothing, wait for shutdown complete notification.
  236. return;
  237. }
  238. #endif
  239. else if (nError != WSAEWOULDBLOCK)
  240. {
  241. Close();
  242. if (!m_bSentClose)
  243. {
  244. m_nMode |= CSMODE_TRANSFERERROR;
  245. m_bSentClose = TRUE;
  246. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  247. }
  248. }
  249. }
  250. }
  251. else if (m_nMode & CSMODE_DOWNLOAD)
  252. {
  253. if (m_nTransferState == STATE_STARTING)
  254. OnConnect(0);
  255. bool beenWaiting = false;
  256. _int64 ableToRead;
  257. if (GetState() != closed)
  258. ableToRead = m_pOwner->GetAbleToTransferSize(CControlSocket::download, beenWaiting);
  259. else
  260. ableToRead = BUFSIZE;
  261. if (!beenWaiting)
  262. ASSERT(ableToRead);
  263. else if (!ableToRead)
  264. {
  265. TriggerEvent(FD_READ);
  266. return;
  267. }
  268. if (!m_pBuffer)
  269. m_pBuffer = new char[BUFSIZE];
  270. int numread = CAsyncSocketEx::Receive(m_pBuffer, static_cast<int>(ableToRead));
  271. if (numread!=SOCKET_ERROR)
  272. {
  273. Transfered( numread, CTime::GetCurrentTime());
  274. m_pOwner->SpeedLimitAddTransferredBytes(CControlSocket::download, numread);
  275. }
  276. if (!numread)
  277. {
  278. Close();
  279. if (!m_bSentClose)
  280. {
  281. m_bSentClose = TRUE;
  282. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  283. }
  284. return;
  285. }
  286. if (numread == SOCKET_ERROR)
  287. {
  288. int nError = GetLastError();
  289. if (nError == WSAENOTCONN)
  290. {
  291. //Not yet connected
  292. return;
  293. }
  294. #ifndef MPEXT_NO_SSL
  295. else if (m_pSslLayer && nError == WSAESHUTDOWN)
  296. {
  297. // Do nothing, wait for shutdown complete notification.
  298. return;
  299. }
  300. #endif
  301. else if (nError != WSAEWOULDBLOCK)
  302. {
  303. Close();
  304. if (!m_bSentClose)
  305. {
  306. m_nMode |= CSMODE_TRANSFERERROR;
  307. m_bSentClose = TRUE;
  308. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  309. }
  310. }
  311. UpdateStatusBar(false);
  312. return;
  313. }
  314. int written = 0;
  315. m_LastActiveTime = CTime::GetCurrentTime();
  316. UpdateRecvLed();
  317. TRY
  318. {
  319. #ifndef MPEXT_NO_ZLIB
  320. if (m_useZlib)
  321. {
  322. if (!m_pBuffer2)
  323. m_pBuffer2 = new char[BUFSIZE];
  324. m_zlibStream.next_in = (Bytef *)m_pBuffer;
  325. m_zlibStream.avail_in = numread;
  326. m_zlibStream.next_out = (Bytef *)m_pBuffer2;
  327. m_zlibStream.avail_out = BUFSIZE;
  328. int res = inflate(&m_zlibStream, 0);
  329. while (res == Z_OK)
  330. {
  331. m_pFile->Write(m_pBuffer2, BUFSIZE - m_zlibStream.avail_out);
  332. written += BUFSIZE - m_zlibStream.avail_out;
  333. m_zlibStream.next_out = (Bytef *)m_pBuffer2;
  334. m_zlibStream.avail_out = BUFSIZE;
  335. res = inflate(&m_zlibStream, 0);
  336. }
  337. if (res == Z_STREAM_END)
  338. {
  339. m_pFile->Write(m_pBuffer2, BUFSIZE - m_zlibStream.avail_out);
  340. written += BUFSIZE - m_zlibStream.avail_out;
  341. }
  342. else if (res != Z_OK && res != Z_BUF_ERROR)
  343. {
  344. Close();
  345. if (!m_bSentClose)
  346. {
  347. m_nMode |= CSMODE_TRANSFERERROR;
  348. m_bSentClose = TRUE;
  349. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  350. }
  351. return;
  352. }
  353. }
  354. else
  355. #endif
  356. {
  357. m_pFile->Write(m_pBuffer, numread);
  358. written = numread;
  359. }
  360. }
  361. CATCH(CFileException,e)
  362. {
  363. LPTSTR msg = new TCHAR[BUFSIZE];
  364. if (e->GetErrorMessage(msg, BUFSIZE))
  365. m_pOwner->ShowStatus(msg, 1);
  366. delete [] msg;
  367. Close();
  368. if (!m_bSentClose)
  369. {
  370. m_nMode |= CSMODE_TRANSFERERROR;
  371. m_bSentClose = TRUE;
  372. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  373. }
  374. return;
  375. }
  376. END_CATCH;
  377. m_transferdata.transferleft -= written;
  378. UpdateStatusBar(false);
  379. }
  380. }
  381. void CTransferSocket::OnAccept(int nErrorCode)
  382. {
  383. LogMessage(__FILE__, __LINE__, this,FZ_LOG_DEBUG, _T("OnAccept(%d)"), nErrorCode);
  384. m_bListening=FALSE;
  385. CAsyncSocketEx tmp;
  386. Accept(tmp);
  387. SOCKET socket=tmp.Detach();
  388. CAsyncSocketEx::Close();
  389. Attach(socket);
  390. /* Set internal socket send buffer to twice the programs buffer size
  391. * this should fix the speed problems some users have reported
  392. */
  393. DWORD value;
  394. int len = sizeof(value);
  395. GetSockOpt(SO_SNDBUF, &value, &len);
  396. if (value < (BUFSIZE*2))
  397. {
  398. value = BUFSIZE * 2;
  399. SetSockOpt(SO_SNDBUF, &value, sizeof(value));
  400. }
  401. if (m_nTransferState == STATE_STARTING)
  402. {
  403. m_nTransferState = STATE_STARTED;
  404. #ifndef MPEXT_NO_SSL
  405. if (m_pSslLayer)
  406. {
  407. AddLayer(m_pSslLayer);
  408. int res = m_pSslLayer->InitSSLConnection(true);
  409. #ifndef MPEXT_NO_SSLDLL
  410. if (res == SSL_FAILURE_LOADDLLS)
  411. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
  412. else
  413. #endif
  414. if (res == SSL_FAILURE_INITSSL)
  415. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTINITSSL, 1);
  416. if (res)
  417. {
  418. Close();
  419. if (!m_bSentClose)
  420. {
  421. m_nMode |= CSMODE_TRANSFERERROR;
  422. m_bSentClose = TRUE;
  423. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  424. }
  425. return;
  426. }
  427. }
  428. #endif
  429. #ifndef MPEXT_NO_GSS
  430. if (m_pGssLayer)
  431. {
  432. AddLayer(m_pGssLayer);
  433. }
  434. #endif
  435. m_TransferedFirst = m_StartTime = CTime::GetCurrentTime();
  436. m_LastActiveTime = CTime::GetCurrentTime();
  437. }
  438. }
  439. void CTransferSocket::OnConnect(int nErrorCode)
  440. {
  441. LogMessage(__FILE__, __LINE__, this,FZ_LOG_DEBUG, _T("OnConnect(%d)"), nErrorCode);
  442. if (nErrorCode)
  443. {
  444. TCHAR buffer[1000];
  445. memset(buffer,0,1000);
  446. FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErrorCode, 0, buffer, 999, 0);
  447. CString str;
  448. str.Format(IDS_ERRORMSG_CANTOPENTRANSFERCHANNEL,buffer);
  449. str.Replace( _T("\n"), _T("\0") );
  450. str.Replace( _T("\r"), _T("\0") );
  451. m_pOwner->ShowStatus(str, 1);
  452. Close();
  453. if (!m_bSentClose)
  454. {
  455. m_nMode|=CSMODE_TRANSFERERROR;
  456. m_bSentClose=TRUE;
  457. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  458. }
  459. }
  460. else
  461. {
  462. /* Set internal socket send buffer to twice the programs buffer size
  463. * this should fix the speed problems some users have reported
  464. */
  465. DWORD value;
  466. int len = sizeof(value);
  467. GetSockOpt(SO_SNDBUF, &value, &len);
  468. if (value < (BUFSIZE*2))
  469. {
  470. value = BUFSIZE * 2;
  471. SetSockOpt(SO_SNDBUF, &value, sizeof(value));
  472. }
  473. }
  474. if (m_nTransferState == STATE_STARTING)
  475. {
  476. m_nTransferState = STATE_STARTED;
  477. m_TransferedFirst = m_StartTime = CTime::GetCurrentTime();
  478. m_LastActiveTime=CTime::GetCurrentTime();
  479. #ifndef MPEXT_NO_SSL
  480. if (m_pSslLayer)
  481. {
  482. AddLayer(m_pSslLayer);
  483. int res = m_pSslLayer->InitSSLConnection(true);
  484. #ifndef MPEXT_NO_SSLDLL
  485. if (res == SSL_FAILURE_LOADDLLS)
  486. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
  487. else
  488. #endif
  489. if (res == SSL_FAILURE_INITSSL)
  490. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTINITSSL, 1);
  491. if (res)
  492. {
  493. Close();
  494. if (!m_bSentClose)
  495. {
  496. m_nMode |= CSMODE_TRANSFERERROR;
  497. m_bSentClose = TRUE;
  498. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  499. }
  500. return;
  501. }
  502. }
  503. #endif
  504. #ifndef MPEXT_NO_GSS
  505. if (m_pGssLayer)
  506. {
  507. AddLayer(m_pGssLayer);
  508. }
  509. #endif
  510. }
  511. }
  512. void CTransferSocket::OnClose(int nErrorCode)
  513. {
  514. LogMessage(__FILE__, __LINE__, this, FZ_LOG_DEBUG, _T("OnClose(%d)"), nErrorCode);
  515. if (m_nTransferState == STATE_WAITING)
  516. {
  517. m_nNotifyWaiting |= FD_CLOSE;
  518. return;
  519. }
  520. OnReceive(0);
  521. Close();
  522. if (!m_bSentClose)
  523. {
  524. m_bSentClose=TRUE;
  525. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  526. }
  527. }
  528. int CTransferSocket::CheckForTimeout(int delay)
  529. {
  530. UpdateStatusBar(false);
  531. if (!m_bCheckTimeout)
  532. {
  533. // we are closed, so make sure the FTP control socket is itself checking for
  534. // timeout as we are not
  535. return 0;
  536. }
  537. CTimeSpan span = CTime::GetCurrentTime()-m_LastActiveTime;
  538. if (span.GetTotalSeconds()>=delay)
  539. {
  540. m_pOwner->ShowStatus(IDS_ERRORMSG_TIMEOUT, 1);
  541. Close();
  542. if (!m_bSentClose)
  543. {
  544. m_nMode |= CSMODE_TRANSFERTIMEOUT;
  545. m_bSentClose = TRUE;
  546. VERIFY(m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode));
  547. }
  548. return 2;
  549. }
  550. return 1;
  551. }
  552. void CTransferSocket::SetActive()
  553. {
  554. LogMessage(__FILE__, __LINE__, this, FZ_LOG_DEBUG, _T("SetActive()"));
  555. if (m_nTransferState == STATE_WAITING)
  556. m_nTransferState = STATE_STARTING;
  557. m_bCheckTimeout = TRUE;
  558. m_LastActiveTime = CTime::GetCurrentTime();
  559. if (m_nNotifyWaiting & FD_READ)
  560. OnReceive(0);
  561. if (m_nNotifyWaiting & FD_WRITE)
  562. OnSend(0);
  563. if (m_nNotifyWaiting & FD_CLOSE)
  564. OnClose(0);
  565. }
  566. void CTransferSocket::OnSend(int nErrorCode)
  567. {
  568. if (m_nTransferState == STATE_WAITING)
  569. {
  570. m_nNotifyWaiting |= FD_WRITE;
  571. return;
  572. }
  573. if (m_bSentClose)
  574. {
  575. return;
  576. }
  577. if (m_bListening)
  578. {
  579. return;
  580. }
  581. if (!(m_nMode&CSMODE_UPLOAD))
  582. {
  583. return;
  584. }
  585. if (m_nTransferState == STATE_STARTING)
  586. {
  587. OnConnect(0);
  588. }
  589. #ifndef MPEXT_NO_ZLIB
  590. if (m_useZlib)
  591. {
  592. if (!m_pBuffer)
  593. {
  594. m_pBuffer = new char[BUFSIZE];
  595. m_bufferpos = 0;
  596. m_zlibStream.next_out = (Bytef *)m_pBuffer;
  597. m_zlibStream.avail_out = BUFSIZE;
  598. }
  599. if (!m_pBuffer2)
  600. {
  601. m_pBuffer2 = new char[BUFSIZE];
  602. m_zlibStream.next_in = (Bytef *)m_pBuffer2;
  603. }
  604. bool beenWaiting = false;
  605. while (true)
  606. {
  607. int numsend;
  608. if (!m_zlibStream.avail_in)
  609. {
  610. if (m_pFile)
  611. {
  612. DWORD numread;
  613. numread = ReadDataFromFile(m_pBuffer2, BUFSIZE);
  614. if (numread < 0)
  615. {
  616. return;
  617. }
  618. m_transferdata.transferleft -= numread;
  619. m_zlibStream.next_in = (Bytef *)m_pBuffer2;
  620. m_zlibStream.avail_in = numread;
  621. if (numread < BUFSIZE)
  622. m_pFile = 0;
  623. }
  624. }
  625. if (!m_zlibStream.avail_out)
  626. {
  627. if (m_bufferpos >= BUFSIZE)
  628. {
  629. m_bufferpos = 0;
  630. m_zlibStream.next_out = (Bytef *)m_pBuffer;
  631. m_zlibStream.avail_out = BUFSIZE;
  632. }
  633. }
  634. int res = Z_OK;
  635. if (m_zlibStream.avail_out)
  636. {
  637. res = deflate(&m_zlibStream, m_pFile ? 0 : Z_FINISH);
  638. if (res != Z_OK && (!m_pFile && res != Z_STREAM_END))
  639. {
  640. m_pOwner->ShowStatus("ZLib error", 1);
  641. Close();
  642. if (!m_bSentClose)
  643. {
  644. m_nMode |= CSMODE_TRANSFERERROR;
  645. m_bSentClose = TRUE;
  646. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  647. }
  648. return;
  649. }
  650. }
  651. numsend = BUFSIZE;
  652. int len = BUFSIZE - m_bufferpos - m_zlibStream.avail_out;
  653. if (!len && !m_pFile)
  654. {
  655. break;
  656. }
  657. if (len < BUFSIZE)
  658. numsend = len;
  659. int nLimit = (int)m_pOwner->GetAbleToTransferSize(CControlSocket::upload, beenWaiting);
  660. if (nLimit != -1 && GetState() != closed && numsend > nLimit)
  661. numsend = nLimit;
  662. if (!numsend)
  663. {
  664. TriggerEvent(FD_WRITE);
  665. return;
  666. }
  667. int numsent = Send(m_pBuffer + m_bufferpos, numsend);
  668. if (numsent == SOCKET_ERROR)
  669. {
  670. int nError = GetLastError();
  671. if (nError == WSAENOTCONN)
  672. {
  673. //Not yet connected
  674. return;
  675. }
  676. #ifndef MPEXT_NO_SSL
  677. else if (m_pSslLayer && nError == WSAESHUTDOWN)
  678. {
  679. // Do nothing, wait for shutdown complete notification.
  680. return;
  681. }
  682. #endif
  683. else if (nError != WSAEWOULDBLOCK)
  684. {
  685. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  686. {
  687. Close();
  688. if (!m_bSentClose)
  689. {
  690. m_nMode |= CSMODE_TRANSFERERROR;
  691. m_bSentClose = TRUE;
  692. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  693. }
  694. }
  695. }
  696. UpdateStatusBar(false);
  697. return;
  698. }
  699. Transfered( numsent, CTime::GetCurrentTime());
  700. m_pOwner->SpeedLimitAddTransferredBytes(CControlSocket::upload, numsent);
  701. m_LastActiveTime = CTime::GetCurrentTime();
  702. UpdateSendLed();
  703. m_bufferpos += numsent;
  704. UpdateStatusBar(false);
  705. if (!m_zlibStream.avail_in && !m_pFile && m_zlibStream.avail_out &&
  706. m_zlibStream.avail_out + m_bufferpos == BUFSIZE && res == Z_STREAM_END)
  707. {
  708. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  709. {
  710. Close();
  711. if (!m_bSentClose)
  712. {
  713. m_bSentClose = TRUE;
  714. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  715. }
  716. }
  717. return;
  718. }
  719. //Check if there are other commands in the command queue.
  720. MSG msg;
  721. if (PeekMessage(&msg,0, 0, 0, PM_NOREMOVE))
  722. {
  723. TriggerEvent(FD_WRITE);
  724. return;
  725. }
  726. }
  727. }
  728. else
  729. #endif
  730. {
  731. if (!m_pFile)
  732. {
  733. return;
  734. }
  735. if (!m_pBuffer)
  736. m_pBuffer = new char[BUFSIZE];
  737. int numread;
  738. bool beenWaiting = false;
  739. _int64 currentBufferSize;
  740. if (GetState() != closed)
  741. currentBufferSize = m_pOwner->GetAbleToTransferSize(CControlSocket::upload, beenWaiting);
  742. else
  743. currentBufferSize = BUFSIZE;
  744. if (!currentBufferSize && !m_bufferpos)
  745. {
  746. // Not allowed to send yet, try later
  747. TriggerEvent(FD_WRITE);
  748. return;
  749. }
  750. else if (m_bufferpos < currentBufferSize)
  751. {
  752. numread = ReadDataFromFile(m_pBuffer + m_bufferpos, static_cast<int>(currentBufferSize - m_bufferpos));
  753. if (numread < 0 )
  754. {
  755. return;
  756. }
  757. else if (!numread && !m_bufferpos)
  758. {
  759. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  760. {
  761. Close();
  762. if (!m_bSentClose)
  763. {
  764. m_bSentClose = TRUE;
  765. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  766. }
  767. }
  768. return;
  769. }
  770. }
  771. else
  772. numread = 0;
  773. ASSERT((numread+m_bufferpos) <= BUFSIZE);
  774. ASSERT(numread>=0);
  775. ASSERT(m_bufferpos>=0);
  776. if (numread+m_bufferpos <= 0)
  777. {
  778. if (ShutDown() || GetLastError()!=WSAEWOULDBLOCK)
  779. {
  780. Close();
  781. if (!m_bSentClose)
  782. {
  783. m_bSentClose=TRUE;
  784. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  785. }
  786. }
  787. return;
  788. }
  789. int numsent = Send(m_pBuffer, numread + m_bufferpos);
  790. while (TRUE)
  791. {
  792. if (numsent != SOCKET_ERROR)
  793. {
  794. Transfered(numsent, CTime::GetCurrentTime());
  795. m_pOwner->SpeedLimitAddTransferredBytes(CControlSocket::upload, numsent);
  796. m_LastActiveTime = CTime::GetCurrentTime();
  797. UpdateSendLed();
  798. m_transferdata.transferleft -= numsent;
  799. }
  800. if (numsent==SOCKET_ERROR || !numsent)
  801. {
  802. int nError = GetLastError();
  803. if (nError == WSAENOTCONN)
  804. {
  805. //Not yet connected
  806. m_bufferpos += numread;
  807. return;
  808. }
  809. else if (nError == WSAEWOULDBLOCK)
  810. m_bufferpos += numread;
  811. #ifndef MPEXT_NO_SSL
  812. else if (m_pSslLayer && nError == WSAESHUTDOWN)
  813. {
  814. m_bufferpos += numread;
  815. // Do nothing, wait for shutdown complete notification.
  816. return;
  817. }
  818. #endif
  819. else
  820. {
  821. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  822. {
  823. Close();
  824. if (!m_bSentClose)
  825. {
  826. m_nMode |= CSMODE_TRANSFERERROR;
  827. m_bSentClose = TRUE;
  828. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  829. }
  830. }
  831. }
  832. UpdateStatusBar(false);
  833. return;
  834. }
  835. else
  836. {
  837. int pos = numread + m_bufferpos - numsent;
  838. if (pos < 0 || (numsent + pos) > BUFSIZE)
  839. {
  840. LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Index out of range"));
  841. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  842. {
  843. Close();
  844. if (!m_bSentClose)
  845. {
  846. m_nMode |= CSMODE_TRANSFERERROR;
  847. m_bSentClose = TRUE;
  848. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  849. }
  850. }
  851. return;
  852. }
  853. else if (!pos && numread < (currentBufferSize-m_bufferpos) && m_bufferpos != currentBufferSize)
  854. {
  855. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  856. {
  857. Close();
  858. if (!m_bSentClose)
  859. {
  860. m_bSentClose = TRUE;
  861. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  862. }
  863. }
  864. return;
  865. }
  866. else if (!pos)
  867. m_bufferpos = 0;
  868. else
  869. {
  870. memmove(m_pBuffer, m_pBuffer+numsent, pos);
  871. m_bufferpos=pos;
  872. }
  873. }
  874. //Check if there are other commands in the command queue.
  875. MSG msg;
  876. if (PeekMessage(&msg, 0, m_nInternalMessageID, m_nInternalMessageID, PM_NOREMOVE))
  877. {
  878. //Send resume message
  879. LogMessage(__FILE__, __LINE__, this, FZ_LOG_DEBUG, _T("Message waiting in queue, resuming later"));
  880. TriggerEvent(FD_WRITE);
  881. UpdateStatusBar(false);
  882. return;
  883. }
  884. UpdateStatusBar(false);
  885. if (GetState() != closed)
  886. currentBufferSize = m_pOwner->GetAbleToTransferSize(CControlSocket::upload, beenWaiting);
  887. else
  888. currentBufferSize = BUFSIZE;
  889. if (m_bufferpos < currentBufferSize)
  890. {
  891. numread = ReadDataFromFile(m_pBuffer + m_bufferpos, static_cast<int>(currentBufferSize - m_bufferpos));
  892. if (numread < 0 )
  893. {
  894. return;
  895. }
  896. else if (!numread && !m_bufferpos)
  897. {
  898. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  899. {
  900. Close();
  901. if (!m_bSentClose)
  902. {
  903. m_bSentClose = TRUE;
  904. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  905. }
  906. }
  907. return;
  908. }
  909. }
  910. else
  911. numread = 0;
  912. if (!currentBufferSize && !m_bufferpos)
  913. {
  914. // Not allowed to send yet, try later
  915. TriggerEvent(FD_WRITE);
  916. return;
  917. }
  918. ASSERT(numread>=0);
  919. ASSERT(m_bufferpos>=0);
  920. numsent = Send(m_pBuffer, numread+m_bufferpos);
  921. }
  922. }
  923. }
  924. void CTransferSocket::UpdateStatusBar(bool forceUpdate)
  925. {
  926. if (m_nTransferState != STATE_STARTED)
  927. return;
  928. if (!forceUpdate)
  929. {
  930. //Don't flood the main window with messages
  931. //Else performance would be really low
  932. LARGE_INTEGER curtime;
  933. LARGE_INTEGER freq;
  934. QueryPerformanceFrequency(&freq);
  935. QueryPerformanceCounter(&curtime);
  936. if (((curtime.QuadPart-m_LastUpdateTime.QuadPart) < (freq.QuadPart/15) ) )
  937. return;
  938. m_LastUpdateTime = curtime;
  939. }
  940. //Update the statusbar
  941. CTimeSpan timespan=CTime::GetCurrentTime()-m_StartTime;
  942. int elapsed=(int)timespan.GetTotalSeconds();
  943. t_ffam_transferstatus *status=new t_ffam_transferstatus;
  944. status->bFileTransfer = m_nMode & (CSMODE_DOWNLOAD | CSMODE_UPLOAD);
  945. #ifdef MPEXT
  946. status->transfersize = m_transferdata.transfersize;
  947. #endif
  948. status->timeelapsed=elapsed;
  949. status->bytes=m_transferdata.transfersize-m_transferdata.transferleft;
  950. if (m_transferdata.transfersize>0 && !(m_nMode&CSMODE_LIST))
  951. {
  952. double leftmodifier=static_cast<double>(m_transferdata.transfersize-m_transferdata.nTransferStart-m_transferdata.transferleft);
  953. leftmodifier*=100;
  954. if (m_transferdata.transfersize-m_transferdata.nTransferStart)
  955. leftmodifier /= (m_transferdata.transfersize-m_transferdata.nTransferStart);
  956. else
  957. leftmodifier = 1;
  958. if (leftmodifier == 0)
  959. leftmodifier = 1;
  960. double leftmodifier2 = 100 - leftmodifier;
  961. int left=static_cast<int>((elapsed/leftmodifier)*leftmodifier2);
  962. double percent=100*static_cast<double>(m_transferdata.transfersize-m_transferdata.transferleft);
  963. percent/=m_transferdata.transfersize;
  964. status->percent=static_cast<int>(percent);
  965. if (status->percent>100)
  966. status->percent=100;
  967. if (left < 0)
  968. left = -1;
  969. status->timeleft=left;
  970. }
  971. else
  972. {
  973. status->percent=-1;
  974. status->timeleft=-1;
  975. }
  976. int count = 0;
  977. status->transferrate = 0;
  978. for ( int i = 0; i < SPEED_SECONDS; i++)
  979. {
  980. if ( m_UsedForTransfer[ i])
  981. {
  982. status->transferrate += m_Transfered[ i];
  983. count++;
  984. }
  985. }
  986. if ( count > 0)
  987. status->transferrate = status->transferrate / count;
  988. else if (m_Transfered[0])
  989. status->transferrate = m_Transfered[0];
  990. else
  991. status->timeleft=-1;
  992. PostMessage(m_pOwner->m_pOwner->m_hOwnerWnd, m_pOwner->m_pOwner->m_nReplyMessageID, FZ_MSG_MAKEMSG(FZ_MSG_TRANSFERSTATUS, 0), (LPARAM)status);
  993. }
  994. void CTransferSocket::UpdateSendLed()
  995. {
  996. //Don't flood the main window with messages
  997. //Else performance would be really low
  998. LARGE_INTEGER curtime;
  999. LARGE_INTEGER freq;
  1000. QueryPerformanceFrequency(&freq);
  1001. QueryPerformanceCounter(&curtime);
  1002. static LARGE_INTEGER oldtime={0};
  1003. if ( ( (curtime.QuadPart-oldtime.QuadPart) < (freq.QuadPart/15) ) )
  1004. return;
  1005. oldtime=curtime;
  1006. PostMessage(m_pOwner->m_pOwner->m_hOwnerWnd, m_pOwner->m_pOwner->m_nReplyMessageID, FZ_MSG_MAKEMSG(FZ_MSG_SOCKETSTATUS, FZ_SOCKETSTATUS_SEND), 0);
  1007. }
  1008. void CTransferSocket::UpdateRecvLed()
  1009. {
  1010. //Don't flood the main window with messages
  1011. //Else performance would be really low
  1012. LARGE_INTEGER curtime;
  1013. LARGE_INTEGER freq;
  1014. QueryPerformanceFrequency(&freq);
  1015. QueryPerformanceCounter(&curtime);
  1016. static LARGE_INTEGER oldtime={0};
  1017. if ( ( (curtime.QuadPart-oldtime.QuadPart) < (freq.QuadPart/15) ) )
  1018. return;
  1019. oldtime=curtime;
  1020. PostMessage(m_pOwner->m_pOwner->m_hOwnerWnd, m_pOwner->m_pOwner->m_nReplyMessageID, FZ_MSG_MAKEMSG(FZ_MSG_SOCKETSTATUS, FZ_SOCKETSTATUS_RECV), 0);
  1021. }
  1022. BOOL CTransferSocket::Create(
  1023. #ifndef MPEXT_NO_SSL
  1024. BOOL bUseSsl
  1025. #endif
  1026. )
  1027. {
  1028. #ifndef MPEXT_NO_SSL
  1029. if (bUseSsl)
  1030. m_pSslLayer = new CAsyncSslSocketLayer;
  1031. #endif
  1032. if (!m_pOwner->m_CurrentServer.fwbypass)
  1033. {
  1034. int nProxyType = COptions::GetOptionVal(OPTION_PROXYTYPE);
  1035. if (nProxyType != PROXYTYPE_NOPROXY)
  1036. {
  1037. USES_CONVERSION;
  1038. m_pProxyLayer = new CAsyncProxySocketLayer;
  1039. if (nProxyType == PROXYTYPE_SOCKS4)
  1040. m_pProxyLayer->SetProxy(PROXYTYPE_SOCKS4, T2CA(COptions::GetOption(OPTION_PROXYHOST)), COptions::GetOptionVal(OPTION_PROXYPORT));
  1041. else if (nProxyType == PROXYTYPE_SOCKS4A)
  1042. m_pProxyLayer->SetProxy(PROXYTYPE_SOCKS4A, T2CA(COptions::GetOption(OPTION_PROXYHOST)), COptions::GetOptionVal(OPTION_PROXYPORT));
  1043. else if (nProxyType == PROXYTYPE_SOCKS5)
  1044. if (COptions::GetOptionVal(OPTION_PROXYUSELOGON))
  1045. m_pProxyLayer->SetProxy(PROXYTYPE_SOCKS5, T2CA(COptions::GetOption(OPTION_PROXYHOST)),
  1046. COptions::GetOptionVal(OPTION_PROXYPORT),
  1047. T2CA(COptions::GetOption(OPTION_PROXYUSER)),
  1048. T2CA(CCrypt::decrypt(COptions::GetOption(OPTION_PROXYPASS))));
  1049. else
  1050. m_pProxyLayer->SetProxy(PROXYTYPE_SOCKS5, T2CA(COptions::GetOption(OPTION_PROXYHOST)),
  1051. COptions::GetOptionVal(OPTION_PROXYPORT));
  1052. else if (nProxyType == PROXYTYPE_HTTP11)
  1053. if (COptions::GetOptionVal(OPTION_PROXYUSELOGON))
  1054. m_pProxyLayer->SetProxy(PROXYTYPE_HTTP11, T2CA(COptions::GetOption(OPTION_PROXYHOST)), COptions::GetOptionVal(OPTION_PROXYPORT),
  1055. T2CA(COptions::GetOption(OPTION_PROXYUSER)),
  1056. T2CA(CCrypt::decrypt(COptions::GetOption(OPTION_PROXYPASS))));
  1057. else
  1058. m_pProxyLayer->SetProxy(PROXYTYPE_HTTP11, T2CA(COptions::GetOption(OPTION_PROXYHOST)), COptions::GetOptionVal(OPTION_PROXYPORT));
  1059. else
  1060. ASSERT(FALSE);
  1061. AddLayer(m_pProxyLayer);
  1062. }
  1063. }
  1064. if (!COptions::GetOptionVal(OPTION_LIMITPORTRANGE))
  1065. {
  1066. if (!CAsyncSocketEx::Create(0, SOCK_STREAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, 0, GetFamily()))
  1067. return FALSE;
  1068. return TRUE;
  1069. }
  1070. else
  1071. {
  1072. int min=COptions::GetOptionVal(OPTION_PORTRANGELOW);
  1073. int max=COptions::GetOptionVal(OPTION_PORTRANGEHIGH);
  1074. if (min>=max)
  1075. {
  1076. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTCREATEDUETOPORTRANGE,1);
  1077. return FALSE;
  1078. }
  1079. int startport=static_cast<int>(min+((double)rand()*(max-min))/(RAND_MAX+1));
  1080. int port=startport;
  1081. while (!CAsyncSocketEx::Create(port, SOCK_STREAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, 0, GetFamily()))
  1082. {
  1083. port++;
  1084. if (port>max)
  1085. port=min;
  1086. if (port==startport)
  1087. {
  1088. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTCREATEDUETOPORTRANGE,1);
  1089. return FALSE;
  1090. }
  1091. }
  1092. }
  1093. return TRUE;
  1094. }
  1095. void CTransferSocket::Close()
  1096. {
  1097. LogMessage(__FILE__, __LINE__, this,FZ_LOG_DEBUG, _T("Close()"));
  1098. m_bCheckTimeout = FALSE;
  1099. CAsyncSocketEx::Close();
  1100. }
  1101. int CTransferSocket::OnLayerCallback(std::list<t_callbackMsg>& callbacks)
  1102. {
  1103. for (std::list<t_callbackMsg>::iterator iter = callbacks.begin(); iter != callbacks.end(); iter++)
  1104. {
  1105. if (iter->nType == LAYERCALLBACK_STATECHANGE)
  1106. {
  1107. if (iter->pLayer == m_pProxyLayer)
  1108. LogMessage(__FILE__, __LINE__, this, FZ_LOG_INFO, _T("m_pProxyLayer changed state from %d to %d"), iter->nParam2, iter->nParam1);
  1109. #ifndef MPEXT_NO_SSL
  1110. else if (iter->pLayer == m_pSslLayer)
  1111. LogMessage(__FILE__, __LINE__, this, FZ_LOG_INFO, _T("m_pSslLayer changed state from %d to %d"), iter->nParam2, iter->nParam1);
  1112. #endif
  1113. #ifndef MPEXT_NO_GSS
  1114. else if (iter->pLayer == m_pGssLayer)
  1115. LogMessage(__FILE__, __LINE__, this, FZ_LOG_INFO, _T("m_pGssLayer changed state from %d to %d"), iter->nParam2, iter->nParam1);
  1116. #endif
  1117. else
  1118. LogMessage(__FILE__, __LINE__, this, FZ_LOG_INFO, _T("Layer @ %d changed state from %d to %d"), iter->pLayer, iter->nParam2, iter->nParam1);
  1119. }
  1120. else if (iter->nType == LAYERCALLBACK_LAYERSPECIFIC)
  1121. {
  1122. if (iter->pLayer == m_pProxyLayer)
  1123. {
  1124. switch (iter->nParam1)
  1125. {
  1126. case PROXYERROR_NOCONN:
  1127. m_pOwner->ShowStatus(IDS_ERRORMSG_PROXY_NOCONN, 1);
  1128. break;
  1129. case PROXYERROR_REQUESTFAILED:
  1130. m_pOwner->ShowStatus(IDS_ERRORMSG_PROXY_REQUESTFAILED, 1);
  1131. break;
  1132. case PROXYERROR_AUTHTYPEUNKNOWN:
  1133. m_pOwner->ShowStatus(IDS_ERRORMSG_PROXY_AUTHTYPEUNKNOWN, 1);
  1134. break;
  1135. case PROXYERROR_AUTHFAILED:
  1136. m_pOwner->ShowStatus(IDS_ERRORMSG_PROXY_AUTHFAILED, 1);
  1137. break;
  1138. case PROXYERROR_AUTHNOLOGON:
  1139. m_pOwner->ShowStatus(IDS_ERRORMSG_PROXY_AUTHNOLOGON, 1);
  1140. break;
  1141. case PROXYERROR_CANTRESOLVEHOST:
  1142. m_pOwner->ShowStatus(IDS_ERRORMSG_PROXY_CANTRESOLVEHOST, 1);
  1143. break;
  1144. default:
  1145. LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Unknown proxy error"));
  1146. }
  1147. }
  1148. #ifndef MPEXT_NO_SSL
  1149. else if (iter->pLayer == m_pSslLayer)
  1150. {
  1151. switch (iter->nParam1)
  1152. {
  1153. case SSL_INFO:
  1154. switch(iter->nParam2)
  1155. {
  1156. case SSL_INFO_SHUTDOWNCOMPLETE:
  1157. Close();
  1158. if (!m_bSentClose)
  1159. {
  1160. m_bSentClose=TRUE;
  1161. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  1162. }
  1163. break;
  1164. case SSL_INFO_ESTABLISHED:
  1165. m_pOwner->ShowStatus(IDS_STATUSMSG_SSLESTABLISHEDTRANSFER, 0);
  1166. TriggerEvent(FD_FORCEREAD);
  1167. break;
  1168. }
  1169. break;
  1170. case SSL_FAILURE:
  1171. switch (iter->nParam2)
  1172. {
  1173. case SSL_FAILURE_ESTABLISH:
  1174. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTESTABLISHSSLCONNECTION, 1);
  1175. break;
  1176. #ifndef MPEXT_NO_SSLDLL
  1177. case SSL_FAILURE_LOADDLLS:
  1178. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
  1179. break;
  1180. #endif
  1181. case SSL_FAILURE_INITSSL:
  1182. m_pOwner->ShowStatus(IDS_ERRORMSG_CANTINITSSL, 1);
  1183. break;
  1184. }
  1185. if (!m_bSentClose)
  1186. {
  1187. m_nMode |= CSMODE_TRANSFERERROR;
  1188. m_bSentClose = TRUE;
  1189. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  1190. }
  1191. break;
  1192. case SSL_VERIFY_CERT:
  1193. t_SslCertData data;
  1194. if (m_pSslLayer->GetPeerCertificateData(data))
  1195. m_pSslLayer->SetNotifyReply(data.priv_data, SSL_VERIFY_CERT, 1);
  1196. else
  1197. {
  1198. Close();
  1199. if (!m_bSentClose)
  1200. {
  1201. m_nMode |= CSMODE_TRANSFERERROR;
  1202. m_bSentClose = TRUE;
  1203. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  1204. }
  1205. }
  1206. break;
  1207. }
  1208. }
  1209. #endif
  1210. #ifndef MPEXT_NO_GSS
  1211. else if (iter->pLayer == m_pGssLayer)
  1212. {
  1213. USES_CONVERSION;
  1214. switch (iter->nParam1)
  1215. {
  1216. case GSS_INFO:
  1217. LogMessageRaw(FZ_LOG_INFO, A2CT(iter->str));
  1218. break;
  1219. case GSS_ERROR:
  1220. LogMessageRaw(FZ_LOG_APIERROR, A2CT(iter->str));
  1221. break;
  1222. case GSS_SHUTDOWN_COMPLETE:
  1223. Close();
  1224. if (!m_bSentClose)
  1225. {
  1226. m_bSentClose = TRUE;
  1227. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  1228. }
  1229. break;
  1230. }
  1231. }
  1232. #endif
  1233. }
  1234. delete [] iter->str;
  1235. }
  1236. return 0;
  1237. }
  1238. void CTransferSocket::Transfered(int count, CTime time)
  1239. {
  1240. CTimeSpan ts = time - m_TransferedFirst;
  1241. int diff = (int)ts.GetTotalSeconds();
  1242. if (diff < 0)
  1243. diff = 0;
  1244. if ( diff >= SPEED_SECONDS)
  1245. {
  1246. int move = diff - SPEED_SECONDS + 1;
  1247. int start = SPEED_SECONDS - move;
  1248. if ( start <= 0)
  1249. start = 0;
  1250. else
  1251. {
  1252. for ( int i = 0; i < SPEED_SECONDS - move; i++)
  1253. {
  1254. m_Transfered[ i] = m_Transfered[ i + move];
  1255. m_UsedForTransfer[ i] = m_UsedForTransfer[ i + move];
  1256. }
  1257. }
  1258. for ( int i = start; i < SPEED_SECONDS; i++)
  1259. {
  1260. m_Transfered[ i] = 0;
  1261. m_UsedForTransfer[ i] = false;
  1262. }
  1263. if (move >= SPEED_SECONDS)
  1264. {
  1265. m_TransferedFirst = time;
  1266. diff = 0;
  1267. }
  1268. else
  1269. {
  1270. m_TransferedFirst += CTimeSpan( move);
  1271. ts = time - m_TransferedFirst;
  1272. diff = (int)(ts.GetTotalSeconds() % 60);
  1273. }
  1274. }
  1275. m_Transfered[ diff] += count;
  1276. for ( int i = 0; i < diff - 1; i++)
  1277. m_UsedForTransfer[ i] = true;
  1278. }
  1279. #ifndef MPEXT_NO_GSS
  1280. void CTransferSocket::UseGSS(CAsyncGssSocketLayer *pGssLayer)
  1281. {
  1282. m_pGssLayer = new CAsyncGssSocketLayer;
  1283. m_pGssLayer->InitTransferChannel(pGssLayer);
  1284. }
  1285. #endif
  1286. #ifndef MPEXT_NO_ZLIB
  1287. bool CTransferSocket::InitZlib(int level)
  1288. {
  1289. int res;
  1290. if (m_nMode & CSMODE_UPLOAD)
  1291. res = deflateInit2(&m_zlibStream, level, Z_DEFLATED, 15, 8, Z_DEFAULT_STRATEGY);
  1292. else
  1293. res = inflateInit2(&m_zlibStream, 15);
  1294. if (res == Z_OK)
  1295. m_useZlib = true;
  1296. return res == Z_OK;
  1297. }
  1298. #endif
  1299. int CTransferSocket::ReadDataFromFile(char *buffer, int len)
  1300. {
  1301. TRY
  1302. {
  1303. #ifndef MPEXT
  1304. if (!m_transferdata.bType)
  1305. #endif
  1306. return m_pFile->Read(buffer, len);
  1307. #ifndef MPEXT
  1308. else
  1309. { //Read the file as ASCII file with CRLF line end
  1310. if (!m_ReadBuffer)
  1311. m_ReadBuffer = new char[BUFSIZE];
  1312. if (!m_ReadSize)
  1313. m_ReadSize = m_pFile->Read(m_ReadBuffer, len);
  1314. int numread = 0;
  1315. while (numread < len)
  1316. {
  1317. if (m_ReadPos >= m_ReadSize)
  1318. {
  1319. m_ReadSize = m_pFile->Read(m_ReadBuffer, len);
  1320. m_ReadPos = 0;
  1321. if (!m_ReadSize)
  1322. break;
  1323. }
  1324. if (m_ReadBuffer[m_ReadPos] == '\n' && m_cLastChar != '\r')
  1325. {
  1326. buffer[numread++] = '\r';
  1327. m_cLastChar = '\r';
  1328. if (numread == len)
  1329. break;
  1330. }
  1331. buffer[numread] = m_ReadBuffer[m_ReadPos];
  1332. m_cLastChar = buffer[numread];
  1333. numread++;
  1334. m_ReadPos++;
  1335. }
  1336. ASSERT(numread <= len);
  1337. return numread;
  1338. }
  1339. #endif
  1340. }
  1341. CATCH_ALL(e)
  1342. {
  1343. TCHAR error[BUFSIZE];
  1344. if (e->GetErrorMessage(error, BUFSIZE))
  1345. m_pOwner->ShowStatus(error, 1);
  1346. if (ShutDown() || GetLastError() != WSAEWOULDBLOCK)
  1347. {
  1348. Close();
  1349. if (!m_bSentClose)
  1350. {
  1351. m_nMode |= CSMODE_TRANSFERERROR;
  1352. m_bSentClose = TRUE;
  1353. m_pOwner->m_pOwner->PostThreadMessage(m_nInternalMessageID, FZAPI_THREADMSG_TRANSFEREND, m_nMode);
  1354. }
  1355. }
  1356. return -1;
  1357. }
  1358. END_CATCH_ALL;
  1359. }