diff -r 000000000000 -r 6a9f87576119 filemanager/bkupengine/src/CMMCScBkupStateArchiveOpDataOwners.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/bkupengine/src/CMMCScBkupStateArchiveOpDataOwners.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,272 @@ +/* +* Copyright (c) 2005-2008 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: CMMCScBkupStateArchiveOpDataOwners implementation +* +* +*/ + +#include "CMMCScBkupStateArchiveOpDataOwners.h" + +// System includes +#include +#include +#include + +// User includes +#include "MMCScBkupLogger.h" +#include "CMMCScBkupArchive.h" +#include "RMMCScBkupProgressSizer.h" +#include "CMMCScBkupArchiveFooter.h" +#include "CMMCScBkupDataOwnerInfo.h" +#include "CMMCScBkupIndexDataOwners.h" +#include "MMMCScBkupProgressObserver.h" +#include "CMMCScBkupDataOwnerCollection.h" +#include "MMMCScBkupArchiveDataInterface.h" + + + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::CMMCScBkupStateArchiveOpDataOwners() +// +// C++ constructor. +// --------------------------------------------------------------------------- +CMMCScBkupStateArchiveOpDataOwners::CMMCScBkupStateArchiveOpDataOwners( MMMCScBkupDriver& aDriver ) +: CMMCScBkupStateOpAware( aDriver ), iIndexValueCurrent( -1 ) + { + __LOG1("CMMCScBkupStateArchiveOpDataOwners::CMMCScBkupStateArchiveOpDataOwners() - 0x%08x", StateId().iUid ); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::~CMMCScBkupStateArchiveOpDataOwners() +// +// Destructor. +// --------------------------------------------------------------------------- +CMMCScBkupStateArchiveOpDataOwners::~CMMCScBkupStateArchiveOpDataOwners() + { + Cancel(); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::NewL() +// +// +// --------------------------------------------------------------------------- +CMMCScBkupStateArchiveOpDataOwners* CMMCScBkupStateArchiveOpDataOwners::NewL( MMMCScBkupDriver& aDriver ) + { + CMMCScBkupStateArchiveOpDataOwners* self = new(ELeave) CMMCScBkupStateArchiveOpDataOwners( aDriver ); + return self; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::StateId() +// +// +// --------------------------------------------------------------------------- +TMMCScBkupStateId CMMCScBkupStateArchiveOpDataOwners::StateId() const + { + return KMMCScBkupStateIdArchiveOpDataOwners; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::NextStateBackupId() +// +// +// --------------------------------------------------------------------------- +TMMCScBkupStateId CMMCScBkupStateArchiveOpDataOwners::NextStateBackupId( TBool /*aPartial*/ ) const + { + return KMMCScBkupStateIdArchiveOpArchiveFooter; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::NextStateRestoreId() +// +// +// --------------------------------------------------------------------------- +TMMCScBkupStateId CMMCScBkupStateArchiveOpDataOwners::NextStateRestoreId( TBool /*aPartial*/ ) const + { + return KMMCScBkupStateIdValidateDiskSpace; + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformStateInitBackupL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupStateArchiveOpDataOwners::PerformStateInitBackupL( TBool /*aPartial*/ ) + { + // Work is carried out inside asynchronous step + CompleteSelf(); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformStateInitRestoreL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupStateArchiveOpDataOwners::PerformStateInitRestoreL( TBool /*aPartial*/ ) + { + // Restore each data owner asynchronously + CompleteSelf(); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepBackupL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepBackupL( TBool /*aPartial*/ ) + { + CMMCScBkupDataOwnerCollection& dataOwners = Driver().DrvDataOwners(); + CMMCScBkupArchiveFooter& footer = Driver().DrvArchive().Footer(); + CMMCScBkupIndexBase& indexBase = footer.IndexByType(EMMCScBkupOwnerDataTypeDataOwner); + CMMCScBkupIndexDataOwners& index = static_cast< CMMCScBkupIndexDataOwners& >( indexBase ); + const TInt count = dataOwners.Count(); + // + if ( ++iIndexValueCurrent < count ) + { + CMMCScBkupDataOwnerInfo& owner = dataOwners.Owner( iIndexValueCurrent ); + + // Externalise + MMMCScBkupArchiveDataInterface& archiveDataInterface = ADI(); + RWriteStream stream( archiveDataInterface.ADIWriteStreamUncompressedLC() ); + stream << owner; + stream.CommitL(); + CleanupStack::PopAndDestroy(); // stream + + + // Save the offset of the data owner + const TMMCScBkupArchiveVector& info = archiveDataInterface.ADICurrentArchiveVectorInfo(); + index.AddIndexRecordL( info ); + + // Now move on to the next data owner + CompleteSelf(); + } + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepRestoreL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepRestoreL( TBool /*aPartial*/ ) + { + CMMCScBkupDataOwnerCollection& dataOwners = Driver().DrvDataOwners(); + CMMCScBkupArchiveFooter& footer = Driver().DrvArchive().Footer(); + CMMCScBkupIndexBase& indexBase = footer.IndexByType( EMMCScBkupOwnerDataTypeDataOwner ); + CMMCScBkupIndexDataOwners& index = static_cast< CMMCScBkupIndexDataOwners& >( indexBase ); + const TInt count = index.Count(); + __LOG1( "CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepRestoreL() - %d data owner index records...", count ); + // + if ( ++iIndexValueCurrent < count ) + { + const TMMCScBkupArchiveVector& entry = index.At( iIndexValueCurrent ); + __LOG3( "CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepRestoreL() - entry[%03d] at offset: 0x%08x, length: %4d", iIndexValueCurrent, entry.Offset(), entry.Length() ); + + MMMCScBkupArchiveDataInterface& archiveDataInterface = ADI(); + RReadStream stream( archiveDataInterface.ADIReadStreamUncompressedLC( entry.Offset() ) ); + + // Internalize a new entry and add it to the data owner collection + CMMCScBkupDataOwnerInfo* dataOwner = CMMCScBkupDataOwnerInfo::NewLC( stream ); + dataOwners.AppendL( dataOwner ); + CleanupStack::Pop( dataOwner ); + + // Tidy up & check that we didn't read too much - oops + const TMMCScBkupArchiveVector& readInfo = archiveDataInterface.ADICurrentArchiveVectorInfo(); + if ( readInfo.Length() > entry.Length() ) + { + __LOG( "CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousStateStepRestoreL() - ERROR - Read too much data! -> leave with KErrCorrupt" ); + User::Leave( KErrCorrupt ); + } + CleanupStack::PopAndDestroy(); // stream + + // Continue to next entry + CompleteSelf(); + } + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformLastRightsBackupL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupStateArchiveOpDataOwners::PerformLastRightsBackupL( TBool /*aPartial*/ ) + { + CMMCScBkupIndexBase& index = Driver().DrvArchive().Footer().IndexByType( EMMCScBkupOwnerDataTypeDataOwner ); + index.StoreL( Driver() ); + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformLastRightsRestoreL() +// +// +// --------------------------------------------------------------------------- +void CMMCScBkupStateArchiveOpDataOwners::PerformLastRightsRestoreL( TBool /*aPartial*/ ) + { + // Calculate restore byte size (for all drives) + CMMCScBkupDataOwnerCollection& dataOwners = Driver().DrvDataOwners(); + const TInt64 totalDataRestoreSize = dataOwners.TotalOperationalSizeL(); + + // Inform progress manager + if(Driver().DrvLastCategory()) + { + __LOG2("CMMCScBkupStateArchiveOpDataOwners::PerformLastRightsRestoreL() - report progress understood (%Ld + %Ld)", + totalDataRestoreSize, Driver().DrvTotalProgress()); + Driver().DrvProgressHandler().MMCScBkupHandleProgressDomainUnderstood( totalDataRestoreSize + Driver().DrvTotalProgress()); + } + else + { + __LOG2("CMMCScBkupStateArchiveOpDataOwners::PerformLastRightsRestoreL() - adding progress amount %Ld to existing %Ld)", + totalDataRestoreSize, Driver().DrvTotalProgress()); + Driver().DrvStoreTotalProgress( totalDataRestoreSize ); + } + } + + +// --------------------------------------------------------------------------- +// CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousErrorCleanupRestore() +// +// +// --------------------------------------------------------------------------- +TBool CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousErrorCleanupRestore( TBool /*aPartial*/, TInt aError ) + { + (void) aError; + __LOGFILE1("CMMCScBkupStateArchiveOpDataOwners::PerformAsynchronousErrorCleanupRestore() - **** - error: %d", aError ); + + // Just try to skip the data owner. + CompleteSelf(); + return ETrue; + } + + + + + + + + + +