remotestoragefw/remotefileengine/inc/rsfwvolumetable.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 all volumes
*
*/

#ifndef C_RSFWVOLUMETABLE_H
#define C_RSFWVOLUMETABLE_H

#include <e32property.h>
#include <f32file.h>

#include "rsfwlruprioritylist.h"

class CRsfwRfeServer;
class CRsfwConfig;
class TRsfwMountInfo;
class TRsfwMountConfig;
class TRsfwMountStatus;
class CRsfwVolume;
class TTime;
class CRsfwMountStateMachine;
class CRsfwWaitNoteManager;
class CRsfwMountStore;
class CRsfwDormantMountLoader;

/** caching mode */
enum TCachingMode 
    {
    EWholeFileCaching,
    EMetadataIfa,
    EFullIfa
    };

/** theoretical maximum number of volumes - A to Z */    
const TInt KMaxVolumes = 26; 


/** Shutdown after all mounts have become dormant/disconnected */
const TInt KRsfwDormantShutdownTimeout = 120;

class CRsfwVolumeTable: public CBase
    {
public:
    static CRsfwVolumeTable* NewL(CRsfwRfeServer* aRfeServer,
                              CRsfwConfig* aRsfwConfig);
    ~CRsfwVolumeTable();

    void DispatchL(TAny* aIp, TAny* aOp);
    TInt VolumeIdByDriveLetter(TChar aDriveLetter);
    CRsfwVolume* VolumeByVolumeId(TInt aVolumeId);
    CRsfwVolume* VolumeByDriveLetter(TChar aDriveLetter);
    void RestoreDormantMountsL();
    TUint RecoverVolumeL(const TRsfwMountConfig& aMountConfig,
                        CRsfwMountStateMachine* aCaller);
    TInt MountState(TChar aDriveLetter);
    TInt GetMountConfigL(TRsfwMountConfig& aMountConfig);
    void RestoreVolumesL();
    void DismountByVolumeIdL(TInt aVolumeId, TBool aDiscardPermanentData);
    void DismountByDriveLetterL(TChar aDriveLetter,
                                TBool aDiscardPermanentData);
    void GetMountList(TDriveList& aMountList);
    TInt GetMountInfo(TRsfwMountInfo& aMountInfo);
    void GetMimeTypeSpecificLimits();

    // Cache management functions
    TBool EnsureCacheCanBeAddedL(TInt aBytes);
    TBool EnsureMetadataCanBeAddedL(CRsfwFileEntry* aParent);
    TBool IsRoot(const CRsfwFileEntry* aEntry);
    TInt TotalCachedSize();
    TInt TotalEntryCount();
    void AddToLRUPriorityListL(CRsfwFileEntry *aFe, TInt aPriority);
    void RemoveFromLRUPriorityList(CRsfwFileEntry *aFe);
    void AddToMetadataLRUPriorityListL(CRsfwFileEntry *aFe, TInt aPriority);
    void RemoveFromMetadataLRUPriorityList(CRsfwFileEntry *aFe);
    void MoveToTheBackOfMetadataLRUPriorityListL(CRsfwFileEntry *aFe);
    void WillLRUPriorityListBeInternalized();
    TBool CheckAndAddProcessStartMarker();
    void DeleteTheMarker();
    void CleanupCorruptedCacheL();
    void OperationCompleted(CRsfwVolume* aVolume);
    void VolumeStateChanged(CRsfwVolume* aVolume);
    CRsfwWaitNoteManager* WaitNoteManager();    
    TBool IsCachedDataStillValid(TTime aCachedTime);
    TBool IsCachedAttrStillValid(TTime aCachedTime);
    
    // removes from cache all the data for certain path
    // this is "refresh", i.e to ensure that next readdir fetches the data 
    // form server
    TInt PurgeFromCache(TDesC& aCachePath);
    
    TInt CancelTransferL(TDesC& aFilePath);
    
    void MountDormantL(const TRsfwMountConfig& aMountConfig, TInt aVolumeId);

    void PublishConnectionStatus(CRsfwVolume* aVolume);

private:
    void ConstructL(CRsfwRfeServer* aRfeServer, CRsfwConfig* aRsfwConfig);
    TBool IsCacheStillValid(TTime aCachedTime, TTimeIntervalSeconds aValidity);
    void ExternalizeLRUPriorityList();
    void ExternalizeLRUPriorityListL();
    void InternalizeLRUPriorityListL();
    TBool IsMountIdle(TRsfwMountStatus& aMountStatus);

public:
    // configuration parameters read from the configuration file
    TInt iMaxCacheSize;       // maximum allowed cache size (global)
    TInt iMaxEntryCount;      // maximum number of cached entries (global)
   
    TCachingMode iCachingMode;
    TInt iRecognizerLimit;
    TInt iImageJpegLimit;
    TInt iAudioMpegLimit;
    TInt iInactivityTimeout;

public:
    CRsfwVolume* iVolumes[KMaxVolumes];  // alphabet
    TInt iLastVolumeId;
    CRsfwConfig* iRsfwConfig;        // RSC configuration

    TBool iPermanence;               // use permanent meta data
    CRsfwMountStore* iMountStore;        // mount configuration repository
    CRsfwLruPriorityList iLRUPriorityList;
    CRsfwLruPriorityList iMetadataLRUPriorityList;
    CRsfwRfeServer* iRfeServer;
    TBool iUseExternalizedLRUList; // whether to use externalized LRU list data or not
    TBool iDormantMountRestorePending; // true when, after server startup, we start to restore mounts

private:
    CRsfwDormantMountLoader* iDormantMountLoader; // loads dormant mounts asynchronously shortly after server start
 	CRsfwWaitNoteManager* iWaitNoteManager; // Implements handling of global wait notes
	// associated with this class because when we come to Connect(), not much else is available
	
    TBool iAllEnginesIdle;          // are all the engines idle
    RProperty iMountStateProperty;   // property for connection state signaling
    TInt iFileCacheTimeout;   // how long cached files are assumed to be valid
    TInt iDirCacheTimeout;    // how long cached dirs are assumed to be valid
    
    // these are also available from TRfeEnv, but they are used so many times
    // by this class that an own pointer is justified
    RFs iFs; // handle to RFs session, owned by RfeServer
    TFileName* iCacheRoot; // pointer to cacheroot, owned by RfeServer
    };


#endif