Exemple #1
0
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;
}