remotestoragefw/remotefileengine/inc/rsfwfiletable.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:07:59 +0200
changeset 0 3ad9d5175a89
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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