|
|
/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name: Session.cpp
Abstract: This file contains the implementation of the MPCSession class, that describes the state of a transfer.
Revision History: Davide Massarenti (Dmassare) 04/20/99 created
******************************************************************************/
#include "stdafx.h"
#define BUFFER_SIZE_FILECOPY (512)
static void EncodeBuffer( /*[in]*/ LPWSTR rgBufOut , /*[in]*/ LPCWSTR rgBufIn , /*[in]*/ DWORD iSize ) { int iLen; WCHAR c;
iLen = wcslen( rgBufOut ); iSize -= iLen + 1; rgBufOut += iLen;
while(iSize > 0 && (c = *rgBufIn++)) { if(_istalnum( c )) { if(iSize > 1) { *rgBufOut = c;
rgBufOut += 1; iSize -= 1; } } else { if(iSize > 3) { swprintf( rgBufOut, L"%%%02x", (int)c );
rgBufOut += 3; iSize -= 3; } } }
*rgBufOut = 0; }
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
// Construction/Destruction
//
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
MPCSession::MPCSession( /*[in]*/ MPCClient* mpccParent ) : m_SelfCOM( this ) { __ULT_FUNC_ENTRY("MPCSession::MPCSession");
// MPCSessionCOMWrapper m_SelfCOM;
m_mpccParent = mpccParent; // MPCClient* m_mpccParent;
m_dwID = 0; // DWORD m_dwID;
//
// MPC::wstring m_szJobID;
// MPC::wstring m_szProviderID;
// MPC::wstring m_szUsername;
//
m_dwTotalSize = 0; // DWORD m_dwTotalSize;
m_dwOriginalSize = 0; // DWORD m_dwOriginalSize;
m_dwCRC = 0; // DWORD m_dwCRC;
m_fCompressed = false; // bool m_fCompressed;
//
m_dwCurrentSize = 0; // DWORD m_dwCurrentSize;
// SYSTEMTIME m_stLastModified;
m_fCommitted = false; // bool m_fCommitted;
//
m_dwProviderData = 0; // DWORD m_dwProviderData;
//
m_fDirty = false; // mutable bool m_fDirty;
}
MPCSession::MPCSession( /*[in]*/ MPCClient* mpccParent , /*[in]*/ const UploadLibrary::ClientRequest_OpenSession& crosReq , /*[in]*/ DWORD dwID ) : m_SelfCOM( this ) { __ULT_FUNC_ENTRY("MPCSession::MPCSession");
// MPCSessionCOMWrapper m_SelfCOM;
m_mpccParent = mpccParent; // MPCClient* m_mpccParent;
m_dwID = dwID; // DWORD m_dwID;
//
m_szJobID = crosReq.szJobID; // MPC::wstring m_szJobID;
m_szProviderID = crosReq.szProviderID; // MPC::wstring m_szProviderID;
m_szUsername = crosReq.szUsername; // MPC::wstring m_szUsername;
//
m_dwTotalSize = crosReq.dwSize; // DWORD m_dwTotalSize;
m_dwOriginalSize = crosReq.dwSizeOriginal; // DWORD m_dwOriginalSize;
m_dwCRC = crosReq.dwCRC; // DWORD m_dwCRC;
m_fCompressed = crosReq.fCompressed; // bool m_fCompressed;
//
m_dwCurrentSize = 0; // DWORD m_dwCurrentSize;
m_fCommitted = false; // SYSTEMTIME m_stLastModified;
::GetSystemTime( &m_stLastModified ); // bool m_fCommitted;
//
m_dwProviderData = 0; // DWORD m_dwProviderData;
//
m_fDirty = true; // mutable bool m_fDirty;
}
MPCSession::MPCSession( /*[in]*/ const MPCSession& sess ) : m_SelfCOM( this ) { __ULT_FUNC_ENTRY("MPCSession::MPCSession");
// MPCSessionCOMWrapper m_SelfCOM;
m_mpccParent = sess.m_mpccParent; // MPCClient* m_mpccParent;
m_dwID = sess.m_dwID; // DWORD m_dwID;
//
m_szJobID = sess.m_szJobID; // MPC::wstring m_szJobID;
m_szProviderID = sess.m_szProviderID; // MPC::wstring m_szProviderID;
m_szUsername = sess.m_szUsername; // MPC::wstring m_szUsername;
//
m_dwTotalSize = sess.m_dwTotalSize; // DWORD m_dwTotalSize;
m_dwOriginalSize = sess.m_dwOriginalSize; // DWORD m_dwOriginalSize;
m_dwCRC = sess.m_dwCRC; // DWORD m_dwCRC;
m_fCompressed = sess.m_fCompressed; // bool m_fCompressed;
//
m_dwCurrentSize = sess.m_dwCurrentSize; // DWORD m_dwCurrentSize;
m_stLastModified = sess.m_stLastModified; // SYSTEMTIME m_stLastModified;
m_fCommitted = sess.m_fCommitted; // bool m_fCommitted;
//
m_dwProviderData = sess.m_dwProviderData; // DWORD m_dwProviderData;
//
m_fDirty = sess.m_fDirty; // mutable bool m_fDirty;
}
MPCSession::~MPCSession() { __ULT_FUNC_ENTRY("MPCSession::~MPCSession"); }
MPCClient* MPCSession::GetClient() { return m_mpccParent; }
IULSession* MPCSession::COM() { return &m_SelfCOM; }
//////////////////////////////////////////////////////////////////////
// Persistence
//////////////////////////////////////////////////////////////////////
bool MPCSession::IsDirty() const { __ULT_FUNC_ENTRY("MPCSession::IsDirty");
bool fRes = m_fDirty;
__ULT_FUNC_EXIT(fRes); }
HRESULT MPCSession::Load( /*[in]*/ MPC::Serializer& streamIn ) { __ULT_FUNC_ENTRY("MPCSession::Load");
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_dwID );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_szJobID ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_szProviderID ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_szUsername );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_dwTotalSize ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_dwOriginalSize); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_dwCRC ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_fCompressed );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_dwCurrentSize ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_stLastModified); __MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_fCommitted );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamIn >> m_dwProviderData);
m_fDirty = false; hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
HRESULT MPCSession::Save( /*[in]*/ MPC::Serializer& streamOut ) const { __ULT_FUNC_ENTRY("MPCSession::Save");
HRESULT hr;
__MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_dwID );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_szJobID ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_szProviderID ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_szUsername );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_dwTotalSize ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_dwOriginalSize); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_dwCRC ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_fCompressed );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_dwCurrentSize ); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_stLastModified); __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_fCommitted );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamOut << m_dwProviderData);
m_fDirty = false; hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
//////////////////////////////////////////////////////////////////////
// Operators
//////////////////////////////////////////////////////////////////////
bool MPCSession::operator==( /*[in]*/ const MPC::wstring& rhs ) { __ULT_FUNC_ENTRY("MPCSession::operator==");
bool fRes = (m_szJobID == rhs);
__ULT_FUNC_EXIT(fRes); }
bool MPCSession::MatchRequest( /*[in]*/ const UploadLibrary::ClientRequest_OpenSession& crosReq ) { __ULT_FUNC_ENTRY("MPCSession::MatchRequest");
bool fRes = false;
if(m_szProviderID == crosReq.szProviderID && m_szUsername == crosReq.szUsername && m_dwTotalSize == crosReq.dwSize && m_dwOriginalSize == crosReq.dwSizeOriginal && m_dwCRC == crosReq.dwCRC && m_fCompressed == crosReq.fCompressed ) { fRes = true; }
return fRes; }
bool MPCSession::get_Committed() const { bool fRes = m_fCommitted;
return fRes; }
HRESULT MPCSession::put_Committed( /*[in]*/ bool fState, /*[in]*/ bool fMove ) { __ULT_FUNC_ENTRY("MPCSession::put_Committed");
HRESULT hr;
if(fState) { if(fMove) { CISAPIprovider* isapiProvider; bool fFound;
__MPC_EXIT_IF_METHOD_FAILS(hr, GetProvider( isapiProvider, fFound )); if(fFound) { MPC::wstring szFileDst;
__MPC_EXIT_IF_METHOD_FAILS(hr, SelectFinalLocation( isapiProvider, szFileDst, fFound )); if(fFound == false) { __MPC_SET_ERROR_AND_EXIT(hr, E_FAIL); }
__MPC_EXIT_IF_METHOD_FAILS(hr, MoveToFinalLocation( szFileDst )); }
//
// Make sure we get rid of the file.
//
(void)RemoveFile(); } }
m_fCommitted = fState; m_fDirty = true;
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
/////////////////////////////////////////////////////////////////////////////
void MPCSession::get_JobID( MPC::wstring& szJobID ) const { szJobID = m_szJobID; }
void MPCSession::get_LastModified( SYSTEMTIME& stLastModified ) const { stLastModified = m_stLastModified; }
void MPCSession::get_LastModified( double& dblLastModified ) const { ::SystemTimeToVariantTime( const_cast<SYSTEMTIME*>(&m_stLastModified), &dblLastModified ); }
void MPCSession::get_CurrentSize( DWORD& dwCurrentSize ) const { dwCurrentSize = m_dwCurrentSize; }
void MPCSession::get_TotalSize( DWORD& dwTotalSize ) const { dwTotalSize = m_dwTotalSize; }
//////////////////////////////////////////////////////////////////////
// Methods
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// Method Name : MPCSession::GetProvider
//
// Parameters : CISAPIprovider*& isapiProvider : provider of current session.
// bool& fFound : true if provider exists.
//
// Return : HRESULT : S_OK on success, failed otherwise.
//
// Synopsis :
//
//
/////////////////////////////////////////////////////////////////////////////
HRESULT MPCSession::GetProvider( /*[out]*/ CISAPIprovider*& isapiProvider , /*[out]*/ bool& fFound ) { __ULT_FUNC_ENTRY("MPCSession::GetProvider");
HRESULT hr; CISAPIinstance* isapiInstance; MPC::wstring szURL;
isapiProvider = NULL;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_mpccParent->GetInstance( isapiInstance, fFound )); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, isapiInstance->get_URL( szURL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Config_GetProvider( szURL, m_szProviderID, isapiProvider, fFound )); }
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
/////////////////////////////////////////////////////////////////////////////
//
// Method Name : MPCSession::SelectFinalLocation
//
// Parameters : CISAPIprovider* isapiProvider : provider of current session.
// MPC::wstring& szFileDst : Output file directory
// bool& fFound : true if successful.
//
// Return : HRESULT : S_OK on success, failed otherwise.
//
// Synopsis :
//
//
/////////////////////////////////////////////////////////////////////////////
HRESULT MPCSession::SelectFinalLocation( /*[in] */ CISAPIprovider* isapiProvider , /*[out]*/ MPC::wstring& szFileDst , /*[out]*/ bool& fFound ) { __ULT_FUNC_ENTRY("MPCSession::SelectFinalLocation");
HRESULT hr; CISAPIprovider::PathIter itBegin; CISAPIprovider::PathIter itEnd;
fFound = false;
__MPC_EXIT_IF_METHOD_FAILS(hr, isapiProvider->GetLocations( itBegin, itEnd ));
if(itBegin != itEnd) { WCHAR rgBuf[MAX_PATH+1]; MPC::wstring szID;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_mpccParent->FormatID( szID ));
wcsncpy ( rgBuf, L"U_" , MAX_PATH ); EncodeBuffer( rgBuf, m_szProviderID.c_str(), MAX_PATH ); wcsncat ( rgBuf, L"_" , MAX_PATH ); wcsncat ( rgBuf, szID .c_str(), MAX_PATH ); wcsncat ( rgBuf, L"_" , MAX_PATH ); EncodeBuffer( rgBuf, m_szJobID .c_str(), MAX_PATH ); wcsncat ( rgBuf, L"_" , MAX_PATH ); EncodeBuffer( rgBuf, m_szUsername .c_str(), MAX_PATH );
szFileDst = *itBegin; szFileDst.append( L"\\" ); szFileDst.append( rgBuf );
fFound = true; }
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
/////////////////////////////////////////////////////////////////////////////
//
// Method Name : MPCSession::MoveToFinalLocation
//
// Parameters : MPC::wstring& szFileDst : Output file name
//
// Return : HRESULT : S_OK on success, failed otherwise.
//
// Synopsis :
//
//
/////////////////////////////////////////////////////////////////////////////
HRESULT MPCSession::MoveToFinalLocation( /*[in]*/ const MPC::wstring& szFileDst ) { __ULT_FUNC_ENTRY("MPCSession::MoveToFinalLocation");
HRESULT hr; ULONG dwRes; MPC::wstring szFileSrc; MPC::wstring szFileSrcUncompressed; bool fEnough;
__MPC_EXIT_IF_METHOD_FAILS(hr, GetFileName( szFileSrc ));
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MakeDir( szFileDst ) );
//
// Check for space in the final destination.
//
__MPC_EXIT_IF_METHOD_FAILS(hr, ::Util_CheckDiskSpace( szFileDst, m_dwOriginalSize + DISKSPACE_SAFETYMARGIN, fEnough )); if(fEnough == false) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_DISK_FULL ); }
if(m_fCompressed) { //
// Check for space in the queue directory.
//
__MPC_EXIT_IF_METHOD_FAILS(hr, ::Util_CheckDiskSpace( szFileSrc, m_dwOriginalSize + DISKSPACE_SAFETYMARGIN, fEnough )); if(fEnough == false) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_DISK_FULL ); }
szFileSrcUncompressed = szFileSrc; szFileSrcUncompressed.append( L"_decomp" );
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::DecompressFromCabinet( szFileSrc.c_str(), szFileSrcUncompressed.c_str(), L"PAYLOAD" ));
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MoveFile( szFileSrcUncompressed, szFileDst )); } else { __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MoveFile( szFileSrc, szFileDst )); }
hr = S_OK;
__ULT_FUNC_CLEANUP;
if(szFileSrcUncompressed.length() != 0) { (void)MPC::DeleteFile( szFileSrcUncompressed ); }
//
// Create entry in the Event Log.
//
{ MPC::wstring szURL; (void)m_mpccParent->GetInstance( szURL ); MPC::wstring szID; (void)m_mpccParent->FormatID ( szID ); WCHAR rgSize[16]; (void)swprintf( rgSize, L"%d", m_dwOriginalSize );
if(SUCCEEDED(hr)) { #ifdef DEBUG
(void)g_NTEvents.LogEvent( EVENTLOG_INFORMATION_TYPE, PCHUL_SUCCESS_COMPLETEJOB, szURL .c_str(), // %1 = SERVER
szID .c_str(), // %2 = CLIENT
m_szProviderID.c_str(), // %3 = PROVIDER
rgSize , // %4 = BYTES
szFileDst .c_str(), // %5 = DESTINATION
NULL ); #endif
} else { (void)g_NTEvents.LogEvent( EVENTLOG_ERROR_TYPE, PCHUL_ERR_FINALCOPY, szURL .c_str(), // %1 = SERVER
szID .c_str(), // %2 = CLIENT
m_szProviderID.c_str(), // %3 = PROVIDER
rgSize , // %4 = BYTES
szFileDst .c_str(), // %5 = DESTINATION
NULL ); } }
__ULT_FUNC_EXIT(hr); }
/////////////////////////////////////////////////////////////////////////////
HRESULT MPCSession::GetFileName( /*[out]*/ MPC::wstring& szFile ) { __ULT_FUNC_ENTRY("MPCSession::GetFileName");
HRESULT hr; WCHAR rgBuf[32];
__MPC_EXIT_IF_METHOD_FAILS(hr, m_mpccParent->BuildClientPath( szFile ));
//
// The filename for the Data File is "<ID>-<SEQ>.img"
//
swprintf( rgBuf, SESSION_CONST__IMG_FORMAT, m_dwID ); szFile.append( rgBuf );
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
HRESULT MPCSession::RemoveFile() { __ULT_FUNC_ENTRY("MPCSession::RemoveFile");
HRESULT hr; MPC::wstring szFile;
__MPC_EXIT_IF_METHOD_FAILS(hr, GetFileName( szFile ));
(void)MPC::DeleteFile( szFile );
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
HRESULT MPCSession::OpenFile( /*[out]*/ HANDLE& hfFile , /*[in] */ DWORD dwMinimumFreeSpace , /*[in] */ bool fSeek ) { __ULT_FUNC_ENTRY("MPCSession::OpenFile");
HRESULT hr; MPC::wstring szFile;
__MPC_EXIT_IF_METHOD_FAILS(hr, GetFileName( szFile ));
//
// Check if enough free space is available.
//
if(dwMinimumFreeSpace) { bool fEnough;
__MPC_EXIT_IF_METHOD_FAILS(hr, ::Util_CheckDiskSpace( szFile, dwMinimumFreeSpace, fEnough )); if(fEnough == false) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_DISK_FULL ); } }
//
// Ensure the directory exists.
//
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::MakeDir( szFile ) );
__MPC_EXIT_IF_INVALID_HANDLE__CLEAN(hr, hfFile, ::CreateFileW( szFile.c_str(), GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ));
if(fSeek) { //
// Move to the correct Last Written position.
//
::SetFilePointer( hfFile, m_dwCurrentSize, NULL, FILE_BEGIN );
//
// If current position differs from wanted position, truncate to zero the file.
//
if(::SetFilePointer( hfFile, 0, NULL, FILE_CURRENT ) != m_dwCurrentSize) { ::SetFilePointer( hfFile, 0, NULL, FILE_BEGIN ); ::SetEndOfFile ( hfFile );
m_dwCurrentSize = 0; m_fDirty = true; } }
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
HRESULT MPCSession::Validate( /*[in] */ bool fCheckFile , /*[out]*/ bool& fPassed ) { __ULT_FUNC_ENTRY("MPCSession::Validate");
HRESULT hr; HANDLE hfFile = NULL; CISAPIprovider* isapiProvider; bool fFound;
fPassed = false;
//
// If the related provider doesn't exist, validation fails.
//
__MPC_EXIT_IF_METHOD_FAILS(hr, GetProvider( isapiProvider, fFound )); if(fFound == false) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); }
if(m_fCommitted == true) { fPassed = true;
__MPC_SET_ERROR_AND_EXIT(hr, S_OK); }
/////////////////////////////////////////////////////////
//
// If we reach this point, the session is still not committed.
//
if(fCheckFile) { __MPC_EXIT_IF_METHOD_FAILS(hr, OpenFile( hfFile ));
//
// All the bytes have been received, so try to commit the job (deferred due to low disk probably).
//
if(m_dwCurrentSize >= m_dwTotalSize) { //
// Ignore result, if it fails the session won't be committed.
//
(void)put_Committed( true, true ); } }
fPassed = true; hr = S_OK;
__ULT_FUNC_CLEANUP;
if(hfFile) ::CloseHandle( hfFile );
__ULT_FUNC_EXIT(hr); }
HRESULT MPCSession::CheckUser( /*[in] */ const MPC::wstring& szUser , /*[out]*/ bool& fMatch ) { __ULT_FUNC_ENTRY("MPCSession::CheckUser");
HRESULT hr; CISAPIprovider* isapiProvider; BOOL fAuthenticated; bool fFound;
fMatch = false;
//
// If the related provider doesn't exist, validation fails.
//
__MPC_EXIT_IF_METHOD_FAILS(hr, GetProvider( isapiProvider, fFound )); if(fFound == false) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); }
__MPC_EXIT_IF_METHOD_FAILS(hr, isapiProvider->get_Authenticated( fAuthenticated )); if(fAuthenticated) { if(m_szUsername != szUser) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } }
fMatch = true; // User check is positive.
hr = S_OK;
__ULT_FUNC_CLEANUP;
__ULT_FUNC_EXIT(hr); }
/////////////////////////////////////////////////////////////////////////////
HRESULT MPCSession::CompareCRC( /*[out]*/ bool& fMatch ) { __ULT_FUNC_ENTRY("MPCSession::CompareCRC");
HRESULT hr; HANDLE hfFile = NULL; UCHAR rgBuf[BUFFER_SIZE_FILECOPY]; DWORD dwCRC;
fMatch = false;
MPC::InitCRC( dwCRC );
__MPC_EXIT_IF_METHOD_FAILS(hr, OpenFile( hfFile ));
//
// Move to the beginning.
//
::SetFilePointer( hfFile, 0, NULL, FILE_BEGIN );
//
// Calculate the CRC, reading all the data.
//
while(1) { DWORD dwRead;
__MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::ReadFile( hfFile, rgBuf, sizeof( rgBuf ), &dwRead, NULL ));
if(dwRead == 0) // End of File.
{ break; }
MPC::ComputeCRC( dwCRC, rgBuf, dwRead ); }
fMatch = (dwCRC == m_dwCRC); hr = S_OK;
__ULT_FUNC_CLEANUP;
if(hfFile) ::CloseHandle( hfFile );
__ULT_FUNC_EXIT(hr); }
/////////////////////////////////////////////////////////////////////////////
//
// Method Name : MPCSession::AppendData
//
// Parameters : MPC::Serializer& conn : stream sourcing the data.
// DWORD size : size of the data.
//
// Return : HRESULT : S_OK on success, failed otherwise.
//
// Synopsis : Writes a block of data from the 'conn' stream to the end of
// the Data File for this session.
//
/////////////////////////////////////////////////////////////////////////////
HRESULT MPCSession::AppendData( /*[in]*/ MPC::Serializer& streamConn , /*[in]*/ DWORD dwSize ) { __ULT_FUNC_ENTRY("MPCSession::AppendData");
HRESULT hr; HANDLE hfFile = NULL;
//
// Open file and make sure there's enough free space.
//
__MPC_EXIT_IF_METHOD_FAILS(hr, OpenFile( hfFile, dwSize * 3 ));
{ MPC::Serializer_File streamConnOut( hfFile ); BYTE rgBuf[BUFFER_SIZE_FILECOPY];
hr = S_OK; while(dwSize) { DWORD dwRead = min( BUFFER_SIZE_FILECOPY, dwSize );
__MPC_EXIT_IF_METHOD_FAILS(hr, streamConn .read ( rgBuf, dwRead )); __MPC_EXIT_IF_METHOD_FAILS(hr, streamConnOut.write( rgBuf, dwRead ));
dwSize -= dwRead; m_dwCurrentSize += dwRead;
::GetSystemTime( &m_stLastModified ); m_fDirty = true; } }
hr = S_OK;
__ULT_FUNC_CLEANUP;
if(hfFile) ::CloseHandle( hfFile );
__ULT_FUNC_EXIT(hr); }
|