diff -r 000000000000 -r 6a9f87576119 filemanager/bkupengine/src/CMMCScBkupArchiveDataManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/bkupengine/src/CMMCScBkupArchiveDataManager.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,647 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0"" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CMMCScBkupArchiveDataManager Implementation +* +* +*/ + +#include "CMMCScBkupArchiveDataManager.h" + +// System includes +#include +#include + +// User includes +#include "MMCScBkupLogger.h" +#include "RMMCScBkupArchiveStreams.h" +#include "MMCScBkupOperations.h" + + + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::CMMCScBkupArchiveDataManager() +// +// C++ constructor. +// --------------------------------------------------------------------------- +CMMCScBkupArchiveDataManager::CMMCScBkupArchiveDataManager( RFs& aFsSession, RFile64& aFile, MMMCScBkupProgressObserver& aProgressManager ) +: CActive( CActive::EPriorityIdle ), iFsSession( aFsSession ), iFile( aFile ), iProgressManager( aProgressManager ) + { + __LOG1("CMMCScBkupArchiveDataManager::CMMCScBkupArchiveDataManager() - START - aFile: 0x%08x", aFile.SubSessionHandle() ); + CActiveScheduler::Add(this); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::~CMMCScBkupArchiveDataManager() +// +// Destructor. +// --------------------------------------------------------------------------- +CMMCScBkupArchiveDataManager::~CMMCScBkupArchiveDataManager() + { + Cancel(); + // + iWriteStream.Close(); + // + delete iCompressor; + delete iDecompressor; + delete iBufferManager; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ConstructL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ConstructL() + { + TInt64 size = 0; + User::LeaveIfError( iFile.Size( size ) ); + // + iOverallArchiveVectorInfo.SetOffset( 0 ); + iOverallArchiveVectorInfo.SetLength( size ); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::NewL() +// +// +// --------------------------------------------------------------------------- +CMMCScBkupArchiveDataManager* CMMCScBkupArchiveDataManager::NewL( RFs& aFsSession, RFile64& aFile, MMMCScBkupProgressObserver& aProgressManager ) + { + CMMCScBkupArchiveDataManager* self = new(ELeave) CMMCScBkupArchiveDataManager( aFsSession, aFile, aProgressManager ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::CurrentOffsetL() +// +// +// --------------------------------------------------------------------------- +TInt CMMCScBkupArchiveDataManager::CurrentOffsetL() const + { + TInt offset = CurrentOffset(); + User::LeaveIfError(offset); + return offset; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::CurrentOffset() +// +// +// --------------------------------------------------------------------------- +TInt CMMCScBkupArchiveDataManager::CurrentOffset() const + { + TInt64 offsetOrError = 0; + TInt error = iFile.Seek( ESeekCurrent, offsetOrError ); + // + if (error != KErrNone) + { + offsetOrError = error; + } + // + return offsetOrError; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::SetCurrentVector() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::SetCurrentVector( const TMMCScBkupArchiveVector& aVector ) + { + iCurrentVectorInfo = aVector; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIFsSession() +// +// +// --------------------------------------------------------------------------- +RFs& CMMCScBkupArchiveDataManager::ADIFsSession() const + { + return iFsSession; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIRawArchiveFile() +// +// +// --------------------------------------------------------------------------- +RFile64& CMMCScBkupArchiveDataManager::ADIRawArchiveFile() const + { + return iFile; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADICurrentArchiveVectorInfo() +// +// +// --------------------------------------------------------------------------- +const TMMCScBkupArchiveVector& CMMCScBkupArchiveDataManager::ADICurrentArchiveVectorInfo() const + { + return iCurrentVectorInfo; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIOverallArchiveVectorInfo() +// +// +// --------------------------------------------------------------------------- +const TMMCScBkupArchiveVector& CMMCScBkupArchiveDataManager::ADIOverallArchiveVectorInfo() const + { + return iOverallArchiveVectorInfo; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIWriteStreamUncompressedLC() +// +// +// --------------------------------------------------------------------------- +RWriteStream& CMMCScBkupArchiveDataManager::ADIWriteStreamUncompressedLC( TInt aPos ) + { + __LOG1("CMMCScBkupArchiveDataManager::ADIWriteStreamUncompressedLC() - START - aPos: %d", aPos ); + // + __ASSERT_ALWAYS( !iWriteStream.IsOpen(), User::Invariant() ); + TInt offset = aPos; + if (offset == KMMCScBkupArchiveWriteStreamCurrentPos) + { + offset = CurrentOffsetL(); + __LOG1("CMMCScBkupArchiveDataManager::ADIWriteStreamUncompressedLC() - current offset is: %d", offset ); + } + // + iWriteStream.OpenLC(*this, iFile, offset); + + __LOG("CMMCScBkupArchiveDataManager::ADIWriteStreamUncompressedLC() - END - stream opened and pushed"); + + iCurrentVectorInfo.Reset(); + return iWriteStream; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIReadStreamUncompressedLC() +// +// +// --------------------------------------------------------------------------- +RReadStream& CMMCScBkupArchiveDataManager::ADIReadStreamUncompressedLC( TInt aPos ) + { + __ASSERT_ALWAYS( !iReadStream.IsOpen(), User::Invariant() ); + TInt offset = aPos; + if (offset == KMMCScBkupArchiveReadStreamCurrentPos) + { + offset = CurrentOffsetL(); + } + // + iReadStream.OpenLC(*this, iFile, offset); + iCurrentVectorInfo.Reset(); + return iReadStream; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIWriteL() +// +// +// --------------------------------------------------------------------------- +const TMMCScBkupArchiveVector& CMMCScBkupArchiveDataManager::ADIWriteL( const TDesC8& aData ) + { + const TInt offset = CurrentOffsetL(); + const TInt error = iFile.Write( aData ); + User::LeaveIfError(error); + +#ifdef RD_FILE_MANAGER_BACKUP + CalculateCrc(aData.Ptr(), aData.Length()); +#endif + // + iCurrentVectorInfo.SetOffset( offset ); + iCurrentVectorInfo.SetLength( aData.Length() ); + // + return iCurrentVectorInfo; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIReadL() +// +// +// --------------------------------------------------------------------------- +const TMMCScBkupArchiveVector& CMMCScBkupArchiveDataManager::ADIReadL( TDes8& aSink, const TMMCScBkupArchiveVector& aInfo ) + { + TMMCScBkupArchiveVector readInfo(aInfo); + + // Read straight into aSink. + const TInt maxLength = aSink.MaxLength(); + if (aInfo.Length() > maxLength) + { + readInfo.SetLength( maxLength ); + } + + aSink.Zero(); + const TInt error = iFile.Read( static_cast(readInfo.Offset()), aSink, readInfo.Length() ); + User::LeaveIfError( error ); + // + iCurrentVectorInfo.SetOffset( readInfo.Offset() ); + iCurrentVectorInfo.SetLength( aSink.Length() ); + // + return iCurrentVectorInfo; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIWriteFileL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ADIWriteFileL( const TDesC& aSourceFileName, TRequestStatus& aStatus ) + { + __LOG1("CMMCScBkupArchiveDataManager::ADIWriteFileL() - START - file: %S", &aSourceFileName); + + if (!iBufferManager || iBufferManager->Type() != CMMCScBkupBufferManagerBase::ETypeFileToArchive) + { + CMMCScBkupBufferManagerBase* bm = + CMMCScBkupBufferManagerBase::NewByTypeL( + CMMCScBkupBufferManagerBase::ETypeFileToArchive, + iProgressManager, + *this, + (TAny*) &aSourceFileName); + // + delete iBufferManager; + iBufferManager = bm; + } + else + { + iBufferManager->InitializeL( (TAny*) &aSourceFileName ); + } + + // Setup our observer & op + SetOperation(EOperationCompressing); + SetObserver(aStatus); + + // Compressing aData to the archive file + EnsureCompressorExistsL(*iBufferManager); + + // Do the compression asynchronously + CompleteSelf(); + + __LOG("CMMCScBkupArchiveDataManager::ADIWriteFileL() - END"); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIReadFileL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ADIReadFileL( const TDesC& aDestinationFileName, const TMMCScBkupArchiveVector& aInfo, TRequestStatus& aStatus ) + { + __LOG3("CMMCScBkupArchiveDataManager::ADIReadFileL() - START - file: %S, offset: %8d, length: %8d", &aDestinationFileName, aInfo.Offset(), aInfo.Length()); + + if (!iBufferManager || iBufferManager->Type() != CMMCScBkupBufferManagerBase::ETypeArchiveToFile) + { + CMMCScBkupBufferManagerBase* bm = + CMMCScBkupBufferManagerBase::NewByTypeL( + CMMCScBkupBufferManagerBase::ETypeArchiveToFile, + iProgressManager, + *this, + (TAny*) &aDestinationFileName, + (TAny*) &aInfo ); + // + delete iBufferManager; + iBufferManager = bm; + } + else + { + iBufferManager->InitializeL( (TAny*) &aDestinationFileName, (TAny*) &aInfo ); + } + + // Setup our observer & op + SetOperation(EOperationDecompressing); + SetObserver(aStatus); + + // Compressing aData to the archive file + EnsureDecompressorExistsL(*iBufferManager); + + // Do the compression asynchronously + CompleteSelf(); + + __LOG("CMMCScBkupArchiveDataManager::ADIReadFileL() - END"); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIWriteCompressedL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ADIWriteCompressedL( const TDesC8& aData, TRequestStatus& aStatus ) + { + if (!iBufferManager || iBufferManager->Type() != CMMCScBkupBufferManagerBase::ETypeDescriptorToArchive) + { + CMMCScBkupBufferManagerBase* bm = + CMMCScBkupBufferManagerBase::NewByTypeL( + CMMCScBkupBufferManagerBase::ETypeDescriptorToArchive, + iProgressManager, + *this, + (TAny*) &aData ); + // + delete iBufferManager; + iBufferManager = bm; + } + else + { + iBufferManager->InitializeL( (TAny*) &aData ); + } + + // Setup our observer & op + SetOperation(EOperationCompressing); + SetObserver(aStatus); + + // Compressing aData to the archive file + EnsureCompressorExistsL(*iBufferManager); + + // Do the compression asynchronously + CompleteSelf(); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIReadDecompressedL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ADIReadDecompressedL( TDes8& aSink, const TMMCScBkupArchiveVector& aInfo, TRequestStatus& aStatus ) + { + if (!iBufferManager || iBufferManager->Type() != CMMCScBkupBufferManagerBase::ETypeArchiveToDescriptor) + { + CMMCScBkupBufferManagerBase* bm = + CMMCScBkupBufferManagerBase::NewByTypeL( + CMMCScBkupBufferManagerBase::ETypeArchiveToDescriptor, + iProgressManager, + *this, + (TAny*) &aSink, + (TAny*) &aInfo ); + // + delete iBufferManager; + iBufferManager = bm; + } + else + { + iBufferManager->InitializeL( (TAny*) &aSink, (TAny*) &aInfo ); + } + + // Setup our observer & op + SetOperation(EOperationDecompressing); + SetObserver(aStatus); + + // Compressing aData to the archive file + EnsureDecompressorExistsL(*iBufferManager); + + // Do the compression asynchronously + CompleteSelf(); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIAsynchronousCancel() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ADIAsynchronousCancel() + { + Cancel(); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::ADIResetResources() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::ADIResetResources(TMMCScBkupOperationType /* aType */) + { + __LOG("CMMCScBkupArchiveDataManager::ADIResetResources()"); + + delete iCompressor; + iCompressor = NULL; + delete iDecompressor; + iDecompressor = NULL; + delete iBufferManager; + iBufferManager = NULL; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::EnsureCompressorExistsL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::EnsureCompressorExistsL( MEZBufferManager& aBufferManager ) + { + delete iDecompressor; + iDecompressor = NULL; + // + if (iCompressor == NULL) + { + iCompressor = CEZCompressor::NewL( aBufferManager ); + } + else + { + iCompressor->ResetL(aBufferManager); + } + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::EnsureDecompressorExistsL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::EnsureDecompressorExistsL( MEZBufferManager& aBufferManager ) + { + delete iCompressor; + iCompressor = NULL; + // + if (iDecompressor == NULL) + { + iDecompressor = CEZDecompressor::NewL( aBufferManager ); + } + else + { + iDecompressor->ResetL(aBufferManager); + } + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::SetObserver() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::SetObserver( TRequestStatus& aStatus ) + { + __ASSERT_DEBUG(iObserverStatus == NULL, User::Invariant()); + iObserverStatus = &aStatus; + *iObserverStatus = KRequestPending; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::CompleteSelf() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::CompleteSelf( TInt aCompletionCode ) + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, aCompletionCode); + } + + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::CompleteObserver(() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::CompleteObserver( TInt aCompletionCode ) + { + __ASSERT_ALWAYS(iObserverStatus != NULL, User::Invariant()); + User::RequestComplete(iObserverStatus, aCompletionCode); + + // Implicitly, we must be finished + SetOperation(EOperationIdle); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::SetOperation() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::SetOperation( TOperation aOperation ) + { + iOperation = aOperation; + } + + +#ifdef RD_FILE_MANAGER_BACKUP +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::CalculateCrc() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::CalculateCrc( const TAny* aPtr,TInt aLength ) + { + if(iCrcCalcActivated) + { +#if defined(__MMCSCBKUPLOGGING_ENABLED__) + TUint32 startTime = User::NTickCount(); +#endif + Mem::Crc32(iCrc, aPtr, aLength); +#if defined(__MMCSCBKUPLOGGING_ENABLED__) + iTotalTickCount += (User::NTickCount() - startTime); + //__LOG5("CMMCScBkupArchiveDataManager::CalculateCrc() - crc %u, addr 0x%08x, len %d, offset %d, ticks in ms %u", + // iCrc, aPtr, aLength, CurrentOffset(), iTotalTickCount); +#endif + } + } +#endif + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::RunL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::RunL() + { + User::LeaveIfError(iStatus.Int()); + TBool moreToDo = EFalse; + // + switch(iOperation) + { + case EOperationIdle: + ASSERT( EFalse ); + break; + case EOperationCompressing: + __LOG("CMMCScBkupArchiveDataManager::RunL() - START - EOperationCompressing"); + moreToDo = iCompressor->DeflateL(); + break; + case EOperationDecompressing: + __LOG("CMMCScBkupArchiveDataManager::RunL() - START - EOperationDecompressing"); + moreToDo = iDecompressor->InflateL(); + break; + } + // + if (moreToDo) + { + CompleteSelf(); + } + else + { + // Update current offset & length info based upon buffer manager indications + const TMMCScBkupArchiveVector& finalInfo = iBufferManager->Info(); + iCurrentVectorInfo = finalInfo; + + // Ensure we set the state back to idle, ready for next operation... + iOperation = EOperationIdle; + + __LOG2("CMMCScBkupArchiveDataManager::RunL() - operation complete - offset: %8d, length: %8d", iCurrentVectorInfo.Offset(), iCurrentVectorInfo.Length()); + CompleteObserver(); + } + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::DoCancel() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupArchiveDataManager::DoCancel() + { + __ASSERT_DEBUG(iOperation != EOperationIdle, User::Invariant()); + // + CompleteObserver(KErrCancel); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupArchiveDataManager::RunError() +// +// +// --------------------------------------------------------------------------- +TInt CMMCScBkupArchiveDataManager::RunError( TInt aError ) + { + __LOG1("CMMCScBkupArchiveDataManager::RunError() - START - aError: %d", aError); + CompleteObserver(aError); + // + return KErrNone; + } +