diff -r 95243422089a -r 491b3ed49290 filemanager/src/fmbkupengine/inc/CMMCScBkupIndexWithIdentifier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/src/fmbkupengine/inc/CMMCScBkupIndexWithIdentifier.h Tue Aug 31 15:06:05 2010 +0300 @@ -0,0 +1,329 @@ +/* +* 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: Declaration for CMMCScBkupIndexWithIdentifier +* +* +*/ + +#ifndef __CMMCSCBKUPINDEXWITHIDENTIFIER_H__ +#define __CMMCSCBKUPINDEXWITHIDENTIFIER_H__ + +// User includes +#include "CMMCScBkupIndexBase.h" +#include "TMMCScBkupOwnerDataType.h" +#include "TMMCScBkupArchiveVector.h" +#include "MMMCScBkupArchiveDataInterface.h" + + + +/** +* +* +* @since 3.0 +*/ +template < class TIdentifier > +class CMMCScBkupIndexEntry : public CBase + { + public: + inline static CMMCScBkupIndexEntry* NewLC( const TIdentifier& aIdentifier ) + { + CMMCScBkupIndexEntry* self = new(ELeave) CMMCScBkupIndexEntry( aIdentifier ); + CleanupStack::PushL( self ); + return self; + } + + inline static CMMCScBkupIndexEntry* NewLC( RReadStream& aStream ) + { + CMMCScBkupIndexEntry* self = new(ELeave) CMMCScBkupIndexEntry(); + CleanupStack::PushL( self ); + aStream >> *self; + return self; + } + + inline ~CMMCScBkupIndexEntry() + { + iAssociatedData.Close(); + } + + private: + + inline CMMCScBkupIndexEntry() + { + } + + inline CMMCScBkupIndexEntry( const TIdentifier& aIdentifier ) + : iIdentifier( aIdentifier ) + { + } + + private: // Internal enumerations + enum + { + EStreamFormatVersion1 = 1 + }; + + public:// Store & Restore + + inline void InternalizeL( RReadStream& aStream ) + { + aStream.ReadInt32L(); // EStreamFormatVersion1 + aStream.ReadInt32L(); // spare1 + aStream.ReadInt32L(); // spare2 + aStream.ReadInt32L(); // spare3 + // + iIdentifier = aStream.ReadInt32L(); + // + const TInt count = aStream.ReadInt32L(); + for(TInt i=0; i> entry; + // + iAssociatedData.AppendL( entry ); + } + } + + inline void ExternalizeL( RWriteStream& aStream ) const + { + aStream.WriteInt32L( EStreamFormatVersion1 ); + aStream.WriteInt32L( 0 ); // spare1 + aStream.WriteInt32L( 0 ); // spare2 + aStream.WriteInt32L( 0 ); // spare3 + // + aStream.WriteInt32L( iIdentifier ); + // + const TInt count = iAssociatedData.Count(); + aStream.WriteInt32L(count); + // + for(TInt i=0; i& Entries() const + { return iAssociatedData; } + + private: + + /** + * + */ + TIdentifier iIdentifier; + + /** + * + */ + RArray iAssociatedData; + }; + + + + + + +/** +* +* +* @since 3.0 +*/ +template < class TIdentifier > +class CMMCScBkupIndexWithIdentifier : public CMMCScBkupIndexBase + { + + public: + + /** + * C++ destructor + */ + inline ~CMMCScBkupIndexWithIdentifier() + { + iEntries.Close(); + } + + protected: + + /** + * C++ default constructor + */ + inline CMMCScBkupIndexWithIdentifier( TMMCScBkupOwnerDataType aType ) + : CMMCScBkupIndexBase( aType ) + { + } + + private: // Internal enumerations + enum + { + EStreamFormatVersion1 = 1 + }; + + public: // API + + /** + * + */ + inline void AddIndexRecordL( const TMMCScBkupArchiveVector& aInfo, TDriveNumber aDrive, const TIdentifier& aIdentifier ) + { + // Locate the parent + CMMCScBkupIndexEntry< TIdentifier >& entry = EntryByIdentifierL( aIdentifier ); + + // Create new sub-entry + TMMCScBkupArchiveDriveAndVector subItem; + subItem.iDrive = aDrive; + subItem.iVector = aInfo; + + // Add it to our index + entry.AddEntryL( subItem ); + } + + /** + * + */ + inline TInt Count() const + { return iEntries.Count(); } + + /** + * + */ + inline const CMMCScBkupIndexEntry< TIdentifier >& At( TInt aIndex ) const + { return *iEntries[ aIndex ]; } + + /** + * + */ + inline void StoreL(MMMCScBkupDriver& aDriver) + { + MMMCScBkupArchiveDataInterface& archiveDataInterface = aDriver.DrvADI(); + RWriteStream stream( archiveDataInterface.ADIWriteStreamUncompressedLC() ); + // + stream.WriteInt32L( EStreamFormatVersion1 ); + stream.WriteInt32L( 0 ); // spare1 + stream.WriteInt32L( 0 ); // spare2 + stream.WriteInt32L( 0 ); // spare3 + + const TInt count = iEntries.Count(); + stream.WriteInt32L( count ); + // + for(TInt i=0; i & entry = *iEntries[ i ]; + stream << entry; + } + // + stream.CommitL(); + CleanupStack::PopAndDestroy(); // stream + + // Update our base class info with the offset to the index + SetVector( archiveDataInterface.ADICurrentArchiveVectorInfo() ); + } + + /** + * + */ + inline void RestoreL(MMMCScBkupDriver& aDriver) + { + MMMCScBkupArchiveDataInterface& archiveDataInterface = aDriver.DrvADI(); + RReadStream stream( archiveDataInterface.ADIReadStreamUncompressedLC( Vector().Offset() ) ); + // + stream.ReadInt32L(); // EStreamFormatVersion1 + stream.ReadInt32L(); // spare1 + stream.ReadInt32L(); // spare2 + stream.ReadInt32L(); // spare3 + // + const TInt count = stream.ReadInt32L(); + for(TInt i=0; i* entry = CMMCScBkupIndexEntry< TIdentifier >::NewLC( stream ); + iEntries.AppendL( entry ); + CleanupStack::Pop( entry ); + } + // + CleanupStack::PopAndDestroy(); // stream + // + if ( archiveDataInterface.ADICurrentArchiveVectorInfo().Length() > Vector().Length() ) + { + // We've read too much! + User::Leave( KErrCorrupt ); + } + } + + private: // Internal methods + + /** + * + */ + inline CMMCScBkupIndexEntry< TIdentifier >* EntryByIdentifier( const TIdentifier& aIdentifier ) + { + CMMCScBkupIndexEntry< TIdentifier >* ret = NULL; + // + const TInt count = iEntries.Count(); + for( TInt i=count-1; i>=0; i-- ) + { + CMMCScBkupIndexEntry< TIdentifier >* entry = iEntries[ i ]; + if ( entry->Identifier() == aIdentifier ) + { + ret = entry; + break; + } + } + // + return ret; + } + + /** + * + */ + inline CMMCScBkupIndexEntry< TIdentifier >& EntryByIdentifierL( const TIdentifier& aIdentifier ) + { + CMMCScBkupIndexEntry< TIdentifier >* ret = EntryByIdentifier( aIdentifier ); + if ( !ret ) + { + // Need to make a new entry + ret = CMMCScBkupIndexEntry< TIdentifier >::NewLC( aIdentifier ); + iEntries.AppendL( ret ); + CleanupStack::Pop( ret ); + } + // + return *ret; + } + + private: // Member Data + + // + RMMCScBkupPointerArray< CMMCScBkupIndexEntry< TIdentifier > > iEntries; + }; + + + + + + +#endif // __CMMCSCBKUPINDEXWITHIDENTIFIER_H__ + +//End of File