diff -r 000000000000 -r ff3b6d0fd310 cbs/CbsServer/ServerInc/CCbsDbImpTopicList.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbs/CbsServer/ServerInc/CCbsDbImpTopicList.h Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,852 @@ +/* +* Copyright (c) 2003 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: This file contains the header file of the CCbsDmImpTopicList class +* +* This class represents the topic list stored in the database. +* +*/ + + +#ifndef CCBSDBIMPTOPICLIST_H +#define CCBSDBIMPTOPICLIST_H + +// INCLUDES +#include + +#ifndef __SECURE_BACKUP__ +#include +#endif + +#include "CbsCommon.h" +#include "CCbsDbImp.H" + +// FORWARD DECLARATIONS +//class CCbsDbImp; +class CCbsDbImpTopicMessages; +class MCbsDbTopicListObserver; +class CFileStore; +// CLASS DECLARATION + +/** +* CCbsDbImpTopicList is the database topic list manager. +* +*/ +class CCbsDbImpTopicList : public CBase +#ifndef __SECURE_BACKUP__ +, public MBackupObserver +#endif + { + #ifndef __SECURE_BACKUP__ + public: // MBackupObserver + /** + * Closes or reopens the settings file if requested by a backup. + * + * @param aFileName The name of the file to close. + * @param aFlags The action to be performed. + * + */ + void ChangeFileLockL( const TDesC& aFileName, TFileLockFlags aFlags ); + #else + + public: + /** + * Closes or reopens the settings file if requested by a backup. + * + * @param aRequest Current request + * + */ + void ChangeFileLockL( const TCbsBackupRequest& aRequest ); + + #endif + + private: + /** + * Check if the server has a file lock. Leaves with + * KErrLocked if not. + */ + void CheckFileLockL() const; + + public: // New functions + + /** + * Creates an instance of the class. + * + * @param aFs Open file server session. + * @param aTopicsFile Name of the file containing topics. + * @param aUnsavedMessagesFile Name of the file containing unsaved + * messages. + * @param aDatabase Reference to database object + * @return Pointer to the created instance. + */ + static CCbsDbImpTopicList* NewL( RFs& aFs, + const TDesC& aTopicsFile, + const TDesC& aUnsavedMessagesFile, + CCbsDbImp& aDatabase ); + + /** + * Destructor. + */ + ~CCbsDbImpTopicList(); + + public: + + /** + * Creates a new topic list + * + * @param aTopicListName Name of the new topic list + * @param aTopicListIndex Returns: Index number of the new list + */ + void CreateNewTopicListL( const TDesC& aTopicListName ); + + + /** + * Deletes old read messages. The clean up interval is set + * by the user. + * + */ + void CleanupReadMessagesL(); + + /** + * Sets the topic messages manager. + * + * Note that this function does not transfer ownership + * of aMessages. + * + * @param aMessages Pointer to the topic messages + * manager. + */ + void SetTopicMessages( CCbsDbImpTopicMessages* aMessages ); + + /** + * Returns pointer to the current store which contains topics + * of the server (i.e., Topics-file) and saved messages. + * Leaves with KErrLocked if the store is locked by backup. + * + * @return Pointer to topics store. + */ + CFileStore* TopicStoreL() const; + + /** + * Returns a pointer to the name of the file, which contains unsaved + * messages of the server. + * + * @return Reference to the file name. + */ + const TDesC& TopicFilename() const; + + /** + * Returns a pointer to the store, which contains unsaved + * messages of the server. + * + * @return Pointer to unsaved messages store. + */ + CFileStore* UnsavedMessagesStore() const; + + /** + * Returns a pointer to the name of the file, which contains unsaved + * messages of the server (Unsaved Messages-file, "cbs4.dat"). + * + * @return Reference to the file name. + */ + const TDesC& UnsavedMessagesFilename() const; + + /** + * Returns the topic messages stream id by topic handle. + * + * @param aNumber Topic number + * @param aId Returns: the stream id to the topic + * messages stream. + */ + void GetTopicMessagesIdL( TCbsDbTopicNumber aNumber, + TStreamId& aId ) const; + + /** + * Updates the topic messages stream id by topic handle. The new + * identifier is expected not to be a null id. + * + * Note that the method will not commit changes to the store. + * It also changes the internal state and thus if the method leaves, + * it is good to reload the whole root stream. + * + * The method will delete the old topic messages stream. + * + * @param aNumber Topic number + * @param aNewId New stream id. + */ + void UpdateTopicMessagesIdL( TCbsDbTopicNumber aNumber, + const TStreamId& aNewId ); + + /** + * Generates a message handle. + * + * Note that it must be checked that the message handle is unique + * in that topic. + * + * @param aNumber Topic number + * @param aRandom Number generated in some way. + * @return New message handle. + */ + TCbsDbMessageHandle GenerateMessageHandle( + const TCbsDbTopicNumber aNumber, TUint16 aRandom ) const; + + /** + * Informs that a new message has been received in a topic. + * + * @param aMessageHandle Handle of the received message. + */ + void InformNewMessageReceivedL( + const TCbsDbMessageHandle& aMessageHandle ); + + /** + * Informs that a message has been set as saved. + * + * @param aMessageHandle Handle of the saved message. + */ + void InformMessageSavedL( const TCbsDbMessageHandle& aMessageHandle ); + + /** + * Informs that an unread message has been read. + * + * @param aMessageHandle Handle of the read message. + */ + void InformUnreadMessageReadL( + const TCbsDbMessageHandle& aMessageHandle ); + + /** + * Informs that a message has been deleted. + * + * @param aMessageHandle Handle of the deleted message. + * @param aPermanent ETrue, if the message was permanent. + * @param aRead ETrue, if the message was read. + */ + void InformMessageDeletedL( + const TCbsDbMessageHandle& aMessageHandle, + TBool aPermanent, TBool aRead ); + + /** + * Extracts topic handle from message handle. + * + * Note that the method does not check that the message exists. + * + * @param aHandle Handle to a message. + * @return Returns the number of the topic to + * which the message belongs. + */ + TCbsDbTopicNumber ExtractTopicNumber( + const TCbsDbMessageHandle& aHandle ) const; + + /** + * Initialises the whole topic list. + */ + void InitializeListL( const TBool aFileOpenFailed ); + + /** + * Returns the total amount of saved messages. + * + * @return Number of saved messages. + */ + TInt TotalSavedMessages() const; + + /** + * Returns the amount of topics the list contains. + * + * @param aCount Returns: number of topics in topic list + */ + void GetTopicCount( TInt& aCount ) const; + + /** + * Returns a topic by index. + * + * Return values: + * KErrNone Parameter aTopic contains the requested + * topic. + * KErrArgument Index out of bounds. + * + * Leaves if file read fails. + * + * @param aIndex Index to the topic. + * @param aTopic Returns: topic information. + */ + void GetTopicL( TInt aIndex, TCbsDbTopic& aTopic ); + + /** + * Returns a topic by topic number. + * + * Leaves with KErrNotFound, if a topic with the given number + * is not found. + * + * @param aNumber Number of the topic. + * @param aTopic Returns: topic information. + */ + void FindTopicByNumberL( TCbsDbTopicNumber aNumber, + TCbsDbTopic& aTopic ); + + /** + * Reads the name of the index topic from resource. + * + * @return Name of the index topic + */ + HBufC* ReadIndexTopicNameLC(); + + /** + * Adds a new topic to the list. + * + * @param aTopic Topic information. + * @param aDetected Was the topic detected automatically + */ + void AddTopicL( TCbsDbTopic& aTopic, const TBool aDetected ); + + /** + * Updates the topic name and number. + * + * @param aOldNumber Old number of the topic. + * @param aNewNumber New number of the topic. + * @param aName New name of the topic. + */ + void UpdateTopicNameAndNumberL( + TCbsDbTopicNumber aOldNumber, + TCbsDbTopicNumber aNewNumber, + const TCbsDbTopicName& aName ); + + /** + * Updates the topic subscription status. + * + * @param aNumber Topic number + * @param aStatus New subscription status. + */ + void UpdateTopicSubscriptionStatusL( + TCbsDbTopicNumber aNumber, + TBool aStatus ); + + /** + * Updates the topic hotmark status. + * + * @param aNumber Topic number + * @param aStatus New hotmark status. + */ + void UpdateTopicHotmarkStatusL( + TCbsDbTopicNumber aNumber, + TBool aStatus ); + + /** + * Deletes an existing topic and all its messages. + * + * @param aNumber Number of the topic to be deleted. + */ + void DeleteTopicL( TCbsDbTopicNumber aNumber ); + + /** + * Gets the total amount of unread messages. + * + * @param aCount Returns: number of unread topics. + */ + void GetUnreadMessageCount( TInt& aCount ) const; + + /** + * Returns the handle to the latest hotmarked message. + * + * The method leaves if there is no such message. + * + * @param aMessage Returns: Handle to a message that has + * been received under a hotmarked topic + */ + void GetHotmarkedMessageHandleL( TCbsDbMessageHandle& aMessage ); + + /** + * Adds a topic list observer. + * + * After an observer is added to the topic list, it will be notified + * whenever an event occurs. + * + * @param aObserver New observer for the list. + */ + void AddObserverL( MCbsDbTopicListObserver* aObserver ); + + /** + * Removes a topic list observer. + * + * If aObserver is not in the list, the method will panic. + * + * @param aObserver Pointer to the observer to be removed. + */ + void RemoveObserver( const MCbsDbTopicListObserver* aObserver ); + + /** + * Adds numbers of subscribed topics to the given array. + * + * @param aSubscriptions Dynamic array into which the topic + * numbers are inserted. + */ + void AppendSubscribedTopicsL( CArrayFixFlat< TUint16 >& aSubscriptions ) + const; + + /** + * Reverts all changes made to three datafiles handled by this + * class. + */ + void RevertFilesL(); + + /** + * Commits all changes made to three datafiles handled by this + * class. + */ + void CommitFilesL(); + + /** + * Returns the number of the topic that was added last + * to the database by topic detection feature. + * + * Result code KErrNotFound indicates that no topic has ever + * been added to the database. + * + * @param aNumber Returns: topic number + * @return Result code + */ + TInt GetLatestTopicNumber( TCbsTopicNumber& aNumber ) const; + + /** + * Finds the index of the topic matching the given topic number + * in the topic list. + * + * @param aNumber Topic number + * @return Index to the position of topic in + * the topic list. + */ + TInt TopicIndexInList( TCbsDbTopicNumber aNumber ) const; + + /** + * Returns the number of unread messages in hotmarked topics. + */ + TInt UnreadHotmarkedMessageCount() const; + + /** + * Retrieves numbers of topics that precede and succeed the topic + * with number aCurrentTopic. + * + * @param aCurrentTopic Topic number of current topic + * @param aNextTopic Topic number of next topic + * @param aPrevTopic Topic number of previous topic + * @param aPosition Position of topic in the topic list + */ + void GetNextAndPrevTopicNumberL( const TCbsTopicNumber& aCurrentTopic, + TCbsTopicNumber& aNextTopic, TCbsTopicNumber& aPrevTopic, + TInt& aPosition ); + + /** + * Notifies each observer that a new message has arrived to a topic. + * + * @param aHandle Handle to the topic. + */ + void NotifyNewMessageArrivedL( const TCbsDbMessageHandle& aHandle ); + + /** + * Notifies each observer that a topic has been modified. + * + * @param aNumber Topic number + */ + void NotifyTopicModifiedL( TCbsDbTopicNumber aNumber ); + + /** + * Loads the topic stream to the memory. + * + */ + void LoadDefaultTopicStreamL(); + + private: + + /** + * Constructor. + * + * @param aFs Open file server session. + * @param aDatabase Reference to database object + */ + CCbsDbImpTopicList( RFs& aFs, CCbsDbImp& aDatabase ); + + /** + * Returns the total amount of topics the list contains. + * + * @return The total amount of topics in the list. + */ + TInt TopicCount() const; + + /** + * Returns the total amount of topic lists. + * + * @return The total amount of topic lists. + */ + TInt TopicListCount() const; + + /** + * Finalizes the construction. + * + * @param aTopicFile File name of the topic file + * @param aUnsavedMessagesFile File name of the unsaved messages file. + */ + void ConstructL( const TDesC& aTopicsFile, + const TDesC& aUnsavedMessagesFile ); + + /** + * Loads the root stream to the memory. + * + * Root stream contains stream ids for each topic list and the total + * count of topic lists. + */ + void LoadRootStreamL(); + + /** + * Reloads the root stream to the memory. + */ + void ReloadRootStreamL(); + + /** + * Reads all information on topic list found with stream ID. + * + * @param aId Stream id to the topic information + * @param aTopicList Returns: topic list information + */ + void ReadTopicListInformationL(const TStreamId& aId, + TCbsDbImpTopicList& aTopicList ) const; + + /** + * Reads all information on topic found in stream aId + * into aTopic. + * + * This function is called when details of a topic are needed. + * + * @param aId Stream id to the topic information + * @param aTopic Returns: topic information. + */ + void ReadTopicInformationL( const TStreamId& aId, TCbsDbImpTopic& aTopic ) const; + + /** + * Adds a topic to the database. + * + * @param aTopic Information on added topic. + */ + void DoAddTopicL( const TCbsDbTopic& aTopic ); + + /** + * Updates a topic information. + * + * @param aTopic Contains topic information. + * @param aNeedToChange Indicates whether or not it is required + * to change position in the array + * @param aOldPosition Old position. + * @param aDeleting Whether the call is due to a deletion. + */ + void DoUpdateTopicL( const TCbsDbTopic& aTopic, + TBool aNeedToChange, TInt aOldPosition, TBool aDeleting ); + + /** + * Deletes an existing topic. + * + * @param aPosition Position of the topic to be deleted. + */ + void DoDeleteTopicL( TInt aPosition ); + + /** + * Updates a topic list information. + * + * @param aTopicList Contains topic list information. + * @param aDeleting Info if we are deleting an entry. + */ + void UpdateTopicListStreamL( TCbsDbImpTopicList& aTopicList, + TBool aDeleting ); + + /** + * Updates the root stream. + * If required, it will create a new stream. + * + * @param aDeleting Info if we are deleting an entry. + */ + void UpdateRootStreamL( TBool aDeleting ); + + /** + * Updates the topic information. + * + * @param aTopic Updated topic information. + */ + void UpdateTopicL( TCbsDbTopicNumber aTopicNumber, + TCbsDbTopic& aTopic ); + + /** + * Checks that the topic number is valid. + * + * @param aNumber The topic number. + * @return Boolean value indicating if number + * is ok. + */ + TBool CheckTopicNumber( TCbsDbTopicNumber aNumber ) const; + + /** + * Write the root stream. + * + * @param aOut The stream to which the data is + * written. + */ + void WriteRootStreamL( RWriteStream& aOut ) const; + + /** + * Write the Topic list stream + * + * @param aOut The stream to which the data is + * written. + */ + void WriteTopicListStreamL( RWriteStream& aOut, TCbsDbImpTopicList& aTopicList ) const; + + /** + * Notifies each observer that the topic list has been initialized. + */ + void NotifyTopicListInitializedL(); + + /** + * Notifies each observer that a topic has been added. + * + * @param aNumber Topic number + */ + void NotifyTopicAddedL( TCbsDbTopicNumber aNumber ); + + /** + * Notifies each observer that a topic has been deleted. + * + * @param aNumber Topic number + */ + void NotifyTopicDeletedL( TCbsDbTopicNumber aNumber ); + + /** + * Sets the hotmarked message handle. + * + * @param aMessageHandle Handle to the message. + */ + void SetHotmarkedMessage( const TCbsDbMessageHandle& aMessageHandle ); + + /** + * Creates a default root stream. + * + * The method may leave, if the creation or writing fails. + * + * @param aStore The stream to to which the root + * stream is written. + * @return Returns the stream identifier to + * that created stream. + */ + TStreamId CreateDefaultRootStreamL( CStreamStore& aStore ) const; + + /** + * Writes topic information to the stream. + * + * @param aOutstream The stream to which the data is written. + * @param aTopic Topic information. + * @param aTopicMessagesId The stream identifier to the + * topic messages. + */ + void WriteTopicInformationL( RWriteStream& aOutstream, + const TCbsDbTopic& aTopic, const TStreamId& aTopicMessagesId ) const; + + /** + * Extracts topic information (name, number, subscription and + * hotmark status) from a factory defaults topics line + * and adds that topic to the topic list. + * + * @param aLine Factory defaults line. + */ + void AddDefaultTopicL( const TDesC& aLine ); + + /** + * After a call to this function, the file stores can be assumed + * to be open and initialized. + * + * @param aDeleteExistingFiles A flag whether to recreate and + * initialize the files or not + * @param aCreateNewTopicList ETrue, if the first topic list + * needs to be created + */ + void OpenFilesL( TBool aDeleteExistingFiles, TBool aCreateNewTopicList ); + + /** + * Creates CBS files, if appropriate. + * + * @param aUnsavedMsgFileExisted Returns ETrue if unsaved messages + * file already existed. + */ + void CreateFilesIfNecessaryL( TBool& aUnsavedMsgFileExisted ); + + /** + * Tries to open topic and unsaved messages files. + * + * @param aDeleteUnsavedMsgStreamIds ETrue, if unsaved msg file + * has been deleted + * @param aCreateNewTopicList ETrue, if the first topic list + * needs to be created + */ + void TryToOpenFilesL( TBool aDeleteUnsavedMsgStreamIds, TBool aCreateNewTopicList ); + + /** + * Adds index topic to topic list. + */ + void AddIndexTopicL(); + + /** + * Creates an empty file store with the given filename. + * + * @param aFilename Filename to be created. + */ + void DoCreateStoreL( const TDesC& aFilename ); + + /** + * Deletes the unsaved messages' store and rebuilds it. + */ + void RebuildUnsavedMessageStoreL(); + + /** + * Deletes the topics' and unsaved messages' store and rebuilds them. + */ + void RebuildTopicAndUnsavedStoresL(); + + /** + * Called to repair the database when Unsaved messages -file + * has been deleted, but Topics-file still contains information + * on unsaved messages. + * + * Things that are done here: + * - Reset unread message counters, because a saved message + * is always also read. + * - Remove stream ids to unsaved messages from + * Topic messages -streams. + */ + void HandleDeletionOfUnsavedMessagesFileL(); + + /** + * Called by HandleDeletionOfUnsavedMessagesFileL(). + * Executes the necessary file operations. + */ + void DoHandleDeletionOfUnsavedMessagesFileL(); + + /** + * Replaces the given Topic message -stream with a stream which + * contains all ids of saved messages but no ids of unsaved messages. + * + * @param aMsgStreamId Topic messages -stream id + */ + void DeleteUnsavedMessageStreamIdsL( const TStreamId& aMsgStreamId ) const; + + /** + * Resolves the topic position in topic list and uses this information + * to call DoUpdateTopicL. Changes to stores are NOT commited. + * Call to DoUpdateTopicL is not trapped. + * + * @param aTopic Topic to be written into stream. + * @param aDeleting Whether the call is due to a deletion. + */ + void UpdateTopicCountersL( const TCbsDbTopic& aTopic, + const TBool aDeleting ); + + /** + * Creates a standard topic list, which has it's topics and other settings + * stored in Shared Data. + * + */ + void CreateStandardTopicListL(); + + /** + * Load the topic IDs belonging to a specified topic list + * + * @param aTopicListStreamId Stream ID of the topic list + */ + void LoadTopicsIdsL( const TStreamId& aTopicListStreamId ); + + /** + * Load the topics specified by the topic list stream ID + * + * @param aTopicListStreamId Stream ID of the topic list + */ + void LoadTopicsL( const TStreamId& aTopicListStreamId ); + + /** + * Updates the topic stream IDs in topic lists + * + * @param aTopicNumber The topic number + */ + void UpdateTopicStreamIdsL( const TCbsDbTopicNumber aTopicNumber ); + + private: // Data + + // Ref: Database + CCbsDbImp& iDatabase; + + // Ref: Topic messages manager. + CCbsDbImpTopicMessages* iMessages; + + // Session to the file server. + RFs& iFs; + + // Own: Store which contains topics. + CFileStore* iTopicStore; + + // Own: Store which contains unsaved messages. + CFileStore* iUnsavedMessageStore; + + // The last time iTopicStore and iUnsavedMessageStore were compacted + TTime iPreviousCompact; + + // Current topic list in use + TCbsDbImpTopicList iCurrentTopicList; + + // Own: Cached topic information. + CArrayFixFlat< TCbsDbImpTopic >* iTopics; + + // Own: Registered topic list observers. + CArrayFixFlat< MCbsDbTopicListObserver* >* iObservers; + + // Last topic added to topic list with topic detection. + TCbsTopicNumber iLastTopicNumber; + + // Indicates whether there is a hotmarked message + TBool iIsHotmarkedMessage; + + // Handle to the hotmarked message. + TCbsDbMessageHandle iMessageHandle; + + // Own: Buffer containing the filename of topics file + HBufC* iTopicsFilename; + + // Own: Buffer containing the filename of unsaved messages file + HBufC* iUnsavedMessagesFilename; + + // Own: Cached topic list information. + CArrayFixFlat< TCbsDbImpTopicList >* iTopicLists; + + // Own: Cached topic IDs + CArrayFixFlat< TStreamId >* iTopicIds; + + // Global topic count + TInt iTopicCount; + + // Are we initializing Standard Topic list + TBool iInitializing; + + // Are we deleting all topics from current topic list + TBool iDeleteAllTopics; + + // Local variation bits + TInt iLVBits; + + __DECLARE_TEST; + }; + +#endif // CCBSDBIMPTOPICLIST_H + +// End of File + +