filemanager/src/fmbkupengine/inc/CMMCScBkupIndexWithIdentifier.h
branchRCL_3
changeset 38 491b3ed49290
--- /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<count; i++)
+                {
+                TMMCScBkupArchiveDriveAndVector entry;
+                aStream >> 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<count; i++)
+                {
+                const TMMCScBkupArchiveDriveAndVector& entry = iAssociatedData[i];
+                aStream << entry;
+                }
+            }
+
+    public: // General access
+        
+        inline const TIdentifier& Identifier() const
+            { return iIdentifier; }
+
+        inline void AddEntryL( const TMMCScBkupArchiveDriveAndVector& aEntry )
+            { iAssociatedData.AppendL(aEntry); }
+
+        inline TInt Count() const
+            { return iAssociatedData.Count(); }
+
+        inline const TMMCScBkupArchiveDriveAndVector& Entry(TInt aIndex) const
+            { return iAssociatedData[ aIndex ]; }
+
+        inline const RArray<TMMCScBkupArchiveDriveAndVector>& Entries() const
+            { return iAssociatedData; }
+
+    private:
+
+        /**
+        *
+        */
+        TIdentifier iIdentifier;
+
+        /**
+        *
+        */
+        RArray<TMMCScBkupArchiveDriveAndVector> 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<count; i++)
+                {
+                const CMMCScBkupIndexEntry< TIdentifier > & 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<count; i++)
+                {
+                CMMCScBkupIndexEntry< TIdentifier >* 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