HRESULT fsFileStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead) { CAutoLock lck(&m_csLock); BOOL bFilled = FALSE; if (m_hIdx1File != INVALID_HANDLE_VALUE) { if (m_uCurPos >= m_idx1.Get_Idx1StartPosition ()) { fsSetFilePointer (m_hIdx1File, m_uCurPos-m_idx1.Get_Idx1StartPosition (), FILE_BEGIN); ReadFile (m_hIdx1File, pbBuffer, dwBytesToRead, pdwBytesRead, 0); bFilled = TRUE; } } if (m_uCurPos + dwBytesToRead > m_uInMaxAvail) { if (m_hIdx1File == INVALID_HANDLE_VALUE || m_uCurPos < m_idx1.Get_Idx1StartPosition ()) { if (pdwBytesRead) *pdwBytesRead = 0; return E_FAIL; } } if (bFilled == FALSE) ReadFile (m_hFile, pbBuffer, dwBytesToRead, pdwBytesRead, NULL); m_uCurPos += dwBytesToRead; return S_OK; }
DWORD WINAPI fsInternetUploader::_threadUploading(LPVOID lp) { fsInternetUploader* pthis = (fsInternetUploader*) lp; LPBYTE pbBuffer = NULL; DWORD dwBuffCapacity = 1000; DWORD dwMaxWrite = dwBuffCapacity; const int BufDivider = 8; fsTicksMgr ticksTrack; pthis->m_speed.Reset (); pthis->Event (IUE_OPENINGFILEONDISK); HANDLE hFile = CreateFile (pthis->m_unp.strFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { pthis->Event (IUE_E_FAILEDTOOPENSRCFILE); goto _lExit; } UINT64 u; u = fsGetFileSize (hFile); if (pthis->m_uFileSize == _UI64_MAX) { pthis->m_uFileSize = u; pthis->m_dwUploadPartSize = (DWORD) (u / 100); pthis->m_dwUploadPartSize = max (pthis->m_dwUploadPartSize, 100 * 1024); pthis->m_dwUploadPartSize = min (pthis->m_dwUploadPartSize, 700 * 1024); pthis->m_uPosition = 0; } else if (pthis->m_uFileSize != u) { pthis->Event (IUE_E_SRCFILESIZEWASCHANGED); goto _lExit; } fsSetFilePointer (hFile, pthis->m_uPosition, FILE_BEGIN); pthis->Event (IUE_FILE_WAS_OPENED); pbBuffer = new BYTE [dwBuffCapacity]; ticksTrack.Now (); DWORD nUploaded; nUploaded = 0; while (pthis->m_bNeedStop == FALSE && pthis->m_uPosition < pthis->m_uFileSize) { if (pthis->m_pInetFile == NULL || nUploaded == pthis->m_dwUploadPartSize) { BOOL bMsgs; if (pthis->m_pInetFile == NULL) pthis->m_speed.Reset (); nUploaded = 0; if (pthis->m_bNeedStop) goto _lExit; fsInternetResult ir = IR_ERROR; for (UINT i = 0; ir != IR_SUCCESS && i < pthis->m_unp.uMaxErrRetries; i++) { bMsgs = pthis->m_pInetFile == NULL; if (bMsgs) pthis->Event (IUE_CONNECTING); ir = pthis->OpenUrl (); if (ir != IR_SUCCESS) { char sz [1000]; _pDllCaller->IRToStr (ir, sz, sizeof (sz)); fsInternetUploaderMessage ium; ium.pszText = sz; ium.enType = EDT_RESPONSE_E; pthis->Event (IUE_MESSAGE, &ium); if (FALSE == pthis->DoSleep ()) goto _lExit; } else { fsSetFilePointer (hFile, pthis->m_uPosition, FILE_BEGIN); if (bMsgs) pthis->Event (IUE_CONNECTED); } } if (ir != IR_SUCCESS) goto _lExit; } DWORD dwToWrite = (DWORD) min (pthis->m_uFileSize - pthis->m_uPosition, dwMaxWrite); dwToWrite = min (dwToWrite, (pthis->m_dwUploadPartSize - nUploaded)); DWORD dw; ReadFile (hFile, pbBuffer, dwToWrite, &dw, NULL); fsInternetResult ir = pthis->m_pInetFile->Write (pbBuffer, dwToWrite, &dw); nUploaded += dw; if (ir != IR_SUCCESS) { char sz [1000]; _pDllCaller->IRToStr (ir, sz, sizeof (sz)); fsInternetUploaderMessage ium; ium.pszText = sz; ium.enType = EDT_RESPONSE_E; pthis->Event (IUE_MESSAGE, &ium); SAFE_DELETE (pthis->m_pInetFile); pthis->m_speed.Reset (); continue; } ASSERT (dwToWrite == dw); pthis->m_uPosition += dw; pthis->m_speed.Done (dw); fsTicksMgr ticksNow; ticksNow.Now (); if (ticksNow - ticksTrack >= 1000) { DWORD dwMaxWrite = pthis->m_speed.GetSpeed () / BufDivider; if (dwMaxWrite < 10) dwMaxWrite = 10; if (dwMaxWrite > 200000) dwMaxWrite = 200000; if (dwBuffCapacity < dwMaxWrite) { delete [] pbBuffer; pbBuffer = new BYTE [dwBuffCapacity = dwMaxWrite]; } } } _lExit: if (pbBuffer) delete [] pbBuffer; pthis->m_speed.Reset (); SAFE_DELETE (pthis->m_pInetFile); if (hFile != INVALID_HANDLE_VALUE) CloseHandle (hFile); pthis->m_bRunning = FALSE; pthis->Event (IUE_UPLOADSTOPPEDORDONE); return 0; }