diff -r 000000000000 -r f979ecb2b13e pimappservices/calendar/server/inc/agsfilemanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappservices/calendar/server/inc/agsfilemanager.h Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,359 @@ +// Copyright (c) 1997-2009 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: +// + +#ifndef __AGSFILEMANAGER_H__ +#define __AGSFILEMANAGER_H__ + +#include "agmfilter.h" +#include "calasynctask.h" +#include "calchangecallback.h" + +#include +#include + +class CAgnCategoryList; +class CAgnEntryManager; +class CAgnEntryModel; +class CAgnPermanentData; +class CAgnServer; +class CAgnServerSession; +class CAgnTlsProxy; +class CCalAsyncDelete; +class CFileStore; +class RFile; +class RFs; +class TAgnChangeFilter; +class TAgnVersion; +class CAgnServFileShutdownDelayTimer; +class CAgnTzRuleIndex; +class CAgnCalendarInfo; + +const TUid KUidAgnCategoryList = {0x101FA9E1}; +const TUid KUidAgnCalendarInfo = {0x101FA9E2}; + +const TInt KAgnPercentageComplete = 100; +//Working calendar filename length 220 chars (excluding private path) +//Restricted filename length to 200 chars = 220 - 12(attachment doc name)-2(_a added at last of every filename) -2 ( folder number) - 4 (for sperators "\\" "\\") +const TInt KCalMaxFilePath = 200; + +// for model index filenames +_LIT (KIdxFilePostFix, "Idx"); //add to filename to ensure 1 idx per calendar file +const TInt KIdxFilePostFixLength = 3; + +/** +Class to store details about the current asynchronous operation. +These are held in an array in @see CAgnServFile. +*/ +class TAgnMessageToComplete + { +public: + TAgnMessageToComplete(RMessage2& aMessage, TBool aReportProgress, CAgnServerSession& aSession); + RMessage2 Message() const; + TBool ReportProgress() const; + CAgnServerSession& Session() const; + +private: + TAgnMessageToComplete(const TAgnMessageToComplete& ); // not implemented + void operator=(const TAgnMessageToComplete& ); // not implemented + +private: + RMessage2 iMessage; + TBool iReportProgress; + CAgnServerSession& iSession; + }; + +/* +Class to control access to a Calendar file. +All operations requiring file access should come through here (open/close file, commit changes, etc.) + +This class is also the active object which controls asynchronous operations. +*/ +class CAgnServFile : public CActive + { +public: + static CAgnServFile* NewL(RFs& aFs, CAgnServer& aAgnServer); + ~CAgnServFile(); + + // File functions + CFileStore* CreateAgendaFileLC(const TDesC& aFileName); + void OpenAgendaL(const TDesC& aFilename, CalCommon::TCalFileVersionSupport& status); + static void CloseAgenda(TAny* aFile); + void CloseAgenda(TBool aCloseImmediately); + + void DoCloseAgenda(); + + + TBool IsReadOnly() const; + const TDesC& FileName() const; + TBool IsLocked() const; + + void OpenFileL(RFile& aFileHandle, const TDesC& aFileName); + void CreateNewFileL(RFile& aFileHandle, const TDesC& aFileName); + + TBool FileExistsL(const TDesC& aFileName) const; + TBool FileIsReadOnlyL(const TDesC& aFileName) const; + void CreateDirL(const TDesC& aDirectory) const; + void DeleteFileL(const TDesC& aFileName) const; + void MoveFileL(const TDesC& aSource, const TDesC& aDestination) const; + void CopyFileL(const TDesC& aSource, const TDesC& aDestination) const; + + static TBool FileExistsL(RFs& aFs, const TDesC& aFileName); + static void CreateDirL(RFs& aFs, const TDesC& aDirectory); + static void DeleteFileL(RFs& aFs, const TDesC& aFileName); + + void GetAttachmentFolderNameL(TDes& aFolderName); + static void GetAttachmentFolderNameL(const TDesC& aFileName, TDes& aFolderName); + + // Compaction functions + void CompactFileL(); + + // Index building functions + void StartBuildIndex(TAgnMessageToComplete& aMessageToComplete); + void DoStartBuildIndex(); + TBool AreIndexesBuilt() const; + + // Tidy functions + void TidyByDateSetup(CAgnServerSession& aSession, + const TAgnFilter& aFilter, + const TTime& aTodaysDate, + const TTime& aStartDate, + const TTime& aEndDate); + + void TidyByDateStartL(TAgnMessageToComplete& aMessageToComplete, TAgnChangeFilter& aChangeFilter); + TBool HasServerSession() const; + TBool IsInterestedSession(CAgnServerSession* aSession); + + // Accessor functions. + CAgnEntryModel* Model() const; + CFileStore* StoreL() const; + CStreamDictionary* Dictionary() const; + CAgnCategoryList& CategoryList() const; + CAgnServer& Server() const; + CAgnServerSession* ServerSession(); + CAgnTlsProxy* TimeZoneConverter() const; + TUint32 FileNameHash() const; + const TDesC& PrivatePath() const; + + // Asynchronous operation functions + void RequestProgressL(TAgnMessageToComplete& aMessageToComplete); + void CategoryTaskStartL(TAgnMessageToComplete& aMessageToComplete, CCalAsyncTaskManager::TAsyncAction aTask); + TBool DoTaskCompleteL(TInt aErr, CAgnServerSession* aSession); + + // File version functions + void ReplaceConvertedAgendaFileL(CAgnEntryManager& aEntryManager, CAgnTzRuleIndex& aTzRuleIndex); + void GetFileVersionSupportStatusL(TAgnVersion& aFileVersion, CalCommon::TCalFileVersionSupport& aStatus); + + // Misc. functions. + void AddReference(); + + TInt ReferenceCount() const; + void ExternalizeCategoryListL(); + TStreamId WriteCategoryListL(CStreamStore& aStore) const; + void AddStreamToDictionaryL(const TUid& aStreamUid, const TStreamId& aStreamId, CStreamDictionary& aDictionary, CPersistentStore& aStore) const; + void CloseAgendaImmediately(); + CAgnServFileShutdownDelayTimer& FileShutdownDelayTimer() const; + void TzRulesHaveChangedL(); + void SetCollectionId(TCalCollectionId aFileId); + TCalCollectionId CollectionId()const; + TInt BackupReStoreChanged(MCalChangeCallBack2::TChangeType aChangeType); + void BackupRestoreLock(TBool aLock); + TBool IsBackupRestoreLock() const; + void CancelTaskL(CAgnServerSession* aSession); + void SetRefreshTzRules(TBool aSetRefresjTzRule); + TBool RefreshTzRules() const; + + HBufC8* GetPropertyValueLC(TStreamId aStreamId); + TBool SetCalendarInfoL(const CAgnCalendarInfo& aCalendarInfo); + CAgnCalendarInfo* GetCalendarInfoLC() const; + TBool IsCalendarInfoExistL()const; + TBool IsFileDisabled(); + +#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT + void QueueAlarmsImmediately(); + void SetShutdownFlag(TBool aNotificationFlag); + void DeleteAlarmsAndRequeueSessionAlarm(); +#endif + +private: + CAgnServFile(RFs& aFs, CAgnServer& aAgnServer); + void ConstructL(); + + void RunL(); // from CActive + void DoCancel(); // from CActive + + // category functions + void CreateCategoryListL() const; + void SaveCategoryListL(); + void InternalizeCategoryListL(const TStreamId& aStreamId); + + // asynchronous operations + void Start(); + void SetActiveAndMakeRequest(); + void AddAsyncRequesterL(TAgnMessageToComplete& aMessageToComplete); + void CompleteRequests(TBool aIsCompleted, TInt aCompleteCode, CAgnServerSession* aSession); + + // AO state machine functions. + TBool DoStepL(); + TInt DoBuildIndexStepL(); + TInt AddAsyncRequester(TAgnMessageToComplete& aMessageToComplete); + + // miscellaneous functions + void DoCompactFileL(); + TBool DoCompactL(); + TBool DoCompactorStepL(); + void SetFileNameHashL(); + void CreateModelForFileL(); + + TStreamId DictionaryLookup(TUid aUid) const; + void AddStreamToDictionaryL(const TUid& aStreamUid, const TStreamId& aStreamId) const; + + void DoSaveIndexFile(); + void SetLock(TBool aToLock); + void CreateFileStoreL(const TDesC& aFilename); + void ReopenAgendaAfterRestoreL(); + + +private: + + TStreamId iModelStreamId; + CAgnServer& iAgnServer; + HBufC* iFileName; + TUint32 iFileNameHash; + CFileStore* iStore; + TInt iRefCount; + CAgnEntryModel* iModel; + CStreamDictionary* iDictionary; + RFs& iFs; + TBool iReadOnly; + TInt iActiveStep; // active object step + + CArrayFixFlat* iMessageVector; + CAgnServerSession* iSession; + + // Progress of current operation. + TInt iProgressTotal; + + // Build index data. + TBool iIndexesBuilt; +#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT + TBool iShutdownNotification; +#endif + // Tidy by Todo list and Date data. + TAgnFilter iTidyByDateFilter; + TTime iTidyByDateUndatedTodoDate; + TTime iTidyByDateStartDate; + TTime iTidyByDateEndDate; + + // Compaction data. + TInt iNextCompactEffort; + enum + { + ENothing, + ECompacting, + EReclaiming + } iCompactionStage; + RStoreReclaim iCompactor; + CAgnCategoryList* iCategoryList; + CCalAsyncDelete* iAsyncDelete; + + CAgnServFileShutdownDelayTimer* iFileShutdownDelayTimer; + TCalCollectionId iCollectionId; + TBool iLocked; + TBool iRefreshTzRules; + TBool iIsFileDisabled; + TBool iBackupRestoreLock; + }; + + +/** +Class to control general file access to Calendar files. +For access to a specific Calendar file, use @see CAgnServFile. +*/ +class CAgnServFileMgr : public CBase + { +public: + static CAgnServFileMgr* NewL(RFs& aFs, CAgnServer& aAgnServer); + ~CAgnServFileMgr(); + + CAgnServFile& OpenAgendaL(const TDesC& aFilename, CAgnServer& aAgnServer, CalCommon::TCalFileVersionSupport& status); + TInt CloseAgenda(CAgnServFile& aStore, TBool aCloseAgendaWithDelay); + CFileStore* CreateAgendaFileLC(const TDesC& aFileName); + void DeleteAgendaFileL(const TDesC& aFilename); + + const TDesC& PrivatePath() const; + CDesCArray* ListAgendaFilesL() const; + HBufC* ParseFilenameLC(const TDesC& aFileName) const; + TBool AgendaFileExistsL(const TDesC& aFileName) const; + + void CreatePermanentDataL(); + + TBool FileCloseTimersRunning() const; + void CloseScheduledFilesImmediately(); + void CloseAgendaFile(CAgnServFile* aServFile); + + CAgnServFile* GetFile(const TDesC& aFilename) const; + CAgnServFile* GetFileL(TInt64 aFileId) const; + CAgnServFile* GetFileL(TCalCollectionId aCollectionId) const; + + TInt64 GetLongFileIdL(TCalCollectionId aCollectionId) const; + void BackupReStoreChanged(MCalChangeCallBack2::TChangeType aChangeType); + + // iterate through files + TInt Count(); + CAgnServFile* File(TInt aIndex); + +#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT + void QueueAlarmsImmediatelyForShutdown(); + void RequeueAlarmsForShutdownCancellation(); +#endif +private: + CAgnServFileMgr(RFs& aFs, CAgnServer& aAgnServer); + void ConstructL(); + +private: + CAgnServer& iAgnServer; + CArrayFixFlat* iFileList; + RFs& iFs; + TFileName iPrivatePath; + CAgnPermanentData* iPermanentData; + }; + + +// Delay period before the calendar file is closed on the server side +const TInt KServerShutdownDelay = 5000000; + +/** +* Class representing the calendar file close delay timer. An agenda server calendar file can be closed either immediately or after a delay on the server side +* The delay is triggered using a timer owned by the calendar file and represented by this class. +* If a session tries to access the calendar file during the course of the delay, the delay is cancelled and the file is not closed +*/ +class CAgnServFileShutdownDelayTimer : public CTimer + { +public: + // aServFile is not owned + static CAgnServFileShutdownDelayTimer* NewL(CAgnServFile& aServFile); + void Start(); + void DoCloseAgenda(); + void CloseAgenda(); +private: + CAgnServFileShutdownDelayTimer (CAgnServFile& aServFile); + void ConstructL(); + void RunL(); + +private: + CAgnServFile& iServFile; + }; + +#endif