remotestoragefw/remotefileengine/inc/rsfwfiletable.h
branchRCL_3
changeset 20 1aa8c82cb4cb
parent 0 3ad9d5175a89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/remotefileengine/inc/rsfwfiletable.h	Wed Sep 01 12:15:08 2010 +0100
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2003-2006 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:  data struct for remote files metadata
+*
+*/
+
+
+#ifndef C_RSFWFILETABLE_H
+#define C_RSFWFILETABLE_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include "rsfwmetadatastore.h"
+
+class CRsfwVolume;
+class CRsfwFileEntry;
+class TFid;
+class TMetaDataEvent;
+
+/**  file where permanent metadata is stored */
+_LIT(KMetaDataFileName, "M.dat");
+
+/**  an entry has been added */
+const TInt KNotifyNodeAdded    = 1;  
+
+/** an entry has been modified  */
+const TInt KNotifyNodeModified = 2; 
+
+/**  an entry has been deleted */
+const TInt KNotifyNodeRemoved  = 3; 
+ 
+/**  size of the buffer used when writing file entry to permanent metadata */
+const TInt KMaxExternalizedFileEntrySize = 1024;
+
+/**  internal state bits */
+
+/** local changes (eg caching bits) */
+const TUint KNodeLocallyDirty      = 0x0001; 
+/** remote changes */
+const TUint KNodeRemotelyDirty     = 0x0002; 
+/** temp mark for various purposes */
+const TUint KNodeMarked            = 0x0004; 
+
+const TUint KNodeHasValidLock      = 0x0008;
+const TUint KNodeOpenedForWriting  = 0x0010;
+
+const TUint KNodeWritingCancelled  = 0x0020;
+
+const TUint KNodePartlyCached      = 0x0100;
+
+/** indicates that a file that has been
+opened has been created (instead of opening
+an already existing file). This affects
+logic when closing the file (PUT + RENAME
+trick to protect the existing file in case  of
+cancelled PUT is not used)
+ **/
+const TUint KNodeNewlyCreated      = 0x0200;
+
+
+class TMetaDataEvent
+    {
+public:
+    TInt        iEvent;    // notified event
+    TInt        iNodeId;   // node id
+    CRsfwFileEntry* iEntry;    // file entry
+    };
+
+
+class CRsfwFileTable: public CBase
+    {
+private:
+    enum TMetaDataState
+        {
+        EMetaDataSaveNone = 0,  // meta data saving has not started yet
+        EMetaDataSaveStarted,   // meta data saving has been started
+        EMetaDataSaveFailed     // meta data saving has failed
+        };
+
+    class TMetaDataSlot
+        {
+    public:
+        TInt        iNodeId;       // node id
+        TInt        iSlotId;       // slot index
+        };
+
+public: 
+    static CRsfwFileTable* NewL(CRsfwVolume* aVolume, TFileName& aCachePath);
+
+    inline CRsfwVolume* Volume();
+    inline CRsfwFileEntry* Root();
+
+    ~CRsfwFileTable();
+    
+    // add node to three
+    void AddL(CRsfwFileEntry* aFep);
+    
+    // remove node from thee
+    void RemoveL(CRsfwFileEntry* aFep);
+    
+    // lookup three
+    CRsfwFileEntry *Lookup(const TFid& aFid);
+    void DumpL(TBool aAll);
+    inline const TBool Permanence() const;
+    void SetPermanenceL(TBool aPermanence);
+    void HandleMetaDataEvent(TInt aEvent, CRsfwFileEntry* aFep);
+    CRsfwFileEntry* LoadMetaDataL();
+    TInt SaveMetaDataDelta();
+    void SetupCacheL();
+    TInt TotalCachedSize();
+    TInt TotalEntryCount();
+    inline TInt OpenFileCount();
+    inline void UpdateOpenFileCount(TInt aDelta);
+    void ResolveDirtyFilesL();
+    void ResolveDirtyFileL(CRsfwFileEntry* aFep);
+
+
+private:
+    void ConstructL(CRsfwVolume* aVolume, TFileName& aCachePath);
+    void ClearCacheL();
+    void ConstructL(RReadStream& aStream);
+    TMetaDataEvent* NodeEvent(TInt aNodeId);
+    void AddEvent(TInt aEvent, CRsfwFileEntry* aFep);
+    void RemoveEvent(TInt aNodeId);
+    void LoadNodeL(CRsfwFileEntry*& aFep, TInt &aSlot);
+    void SaveNodeL(CRsfwFileEntry* aFep, TInt &aSlot);
+    void SaveMetaDataDeltaL();
+
+private:
+    RFs           iFs;                      // inherited from RFE environment
+    TInt          iNodeId;                  // next node id to assign
+    CRsfwVolume*      iVolume;                  // volume info
+    CRsfwFileEntry*   iRootFep;                 // root file entry
+    TFileName     iCachePath;               // cache directory path
+    TBool         iPermanence;              // permanent meta data
+    RArray<TMetaDataEvent> iMetaDataEvents; // dirty entries since last flush
+    CRsfwMetaDataStore* iMetaDataStore;         // permanent store for metadata
+    RArray<TMetaDataSlot> iMetaDataSlots;   // maps file slot to node ids
+    TFileName     iMetaDataFilePath;        // meta data file path
+    TInt          iMetaDataSaveState;       // the state of meta data saving
+    CRsfwFileEntry*   iCurrentParent;           // parent of last looked up entry
+    TInt          iOpenFileCount;           // count of open files
+    };
+
+#include "rsfwfiletable.inl"
+
+#endif
\ No newline at end of file