diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/FavouritesInc/BrowserFavouritesModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/FavouritesInc/BrowserFavouritesModel.h Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,445 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Declaration of class CBrowserFavouritesModel. +* +* +*/ + +#ifndef BROWSER_FAVOURITES_MODEL_H +#define BROWSER_FAVOURITES_MODEL_H + +// INCLUDES + +#include +#include +#include "BrowserBookmarksOrder.h" +#include +#include +#include "ApiProvider.h" + +// FORWARD DECLARATION + +class CFavouritesItemList; +class CActiveFavouritesDbNotifier; +class MBrowserFavouritesModelObserver; +class CFavouritesItem; + +// CLASS DECLARATION + +/** +* Model for the Favourites Views of the WML Browser. +* This is a layer above the actual engines that do the data manipulation; +* and provides UI support for that (i.e. dialogs, notes etc.) +* Pure virtual. +*/ +class CBrowserFavouritesModel: public CBase, public MFavouritesDbObserver + { + + public: // types + + /** + * Answer for database queries. + */ + enum TDbQuery + { + EYes, ///< Answer to query is yes. + ENo, ///< Answer to query is no. + EError ///< Could not get answer (i.e. database is busy etc.). + }; + + /** + * Rename mode for adding / updating items (what to do if an item + * to be added / updated in the database has a conflicting name). + */ + enum TRenameMode + { + EAutoRename, ///< Rename silently. + EDontRename, ///< Do not rename (quit operation). + EAskIfRename ///< Ask user. + }; + + public: // construction + + /** + * Destructor. + */ + virtual ~CBrowserFavouritesModel(); + + public: // string resources + + /** + * Resource selector type for strings. + */ + enum TTextResourceType + { + EDefaultName, ///< Default name (e.g. "New Bookmark"). + ERenamePrompt, ///< Rename prompt (e.g. "New Folder:"). + ENewPrompt, ///< New prompt (e.g. "Folder name:"). + ESaved, ///< Saved note (e.g. "Bookmark saved"). + ENotSaved ///< Not saved note (e.g. "Bookmark not saved"). + }; + + /** + * Get resource id of some text for an item. + * @param aItem The item to get resource id for. + * @param aType Type of resource text. + * @return Resource id of the text. + */ + virtual TInt StringResourceId + ( + const CFavouritesItem& aItem, + TTextResourceType aType + ) const = 0; + + /** + * Set the name of this item to default (e.g. "New Bookmark", + * "New Folder" etc.). The name that is set is read from resource, + * the resource id is StringResourceId( EDefaultName ). + * @param aItem The item to set default name for. + */ + void SetNameToDefaultL( CFavouritesItem& aItem ) const; + + public: // database opening / closing / access + + /** + * Open the database. + * After succesful open, notifications to observer may come. + * Safe to call if already open. + * @param aDbErrorNote If ETrue, unsuccesful open will bring up an + * error note. + * @return Error code. + */ + TInt OpenDbL( TBool aDbErrorNote = ETrue ); + + /** + * Close the database. No further notification may come to the + * observer. + */ + void CloseDb(); + + /** + * Start a transaction. + * @param aWrite If ETrue, the table is opened with write-lock on. + * @param aDbErrorNote If ETrue, unsuccesful open will bring up an + * error note. + * @param aLffsCheck If ETrue (the default), free disk space is + * checked to be above critical level (only if aWrite==ETrue). + * Always use the default (except for deleting)! + * @return Error code. + */ + TInt BeginL + ( TBool aWrite, TBool aDbErrorNote, TBool aLffsCheck = ETrue); + + /** + * Commit the transaction. + * Safe to call if not open. + */ + void CommitL(); + + /** + * Add an observer. + * @param aObserver Observer to be notified about database-related + * events. + */ + void AddObserverL( MBrowserFavouritesModelObserver& aObserver ); + + /** + * Remove an observer. Panic if not added. + * @param aObserver The observer. + */ + void RemoveObserver( MBrowserFavouritesModelObserver& aObserver ); + + /** + * Get the database. + * @return The actual database. + */ + inline RFavouritesDb Database() const; + + /** + * Opens an item associated with aUid in aFavFile. + * @return Error code. + */ + + TInt OpenFavouritesFile ( RFavouritesFile & aFavFile, TInt aUid ); + + /** + * Opens an item associated with aUid in aFavFile for replacement. + * @return Error code. + */ + + TInt ReplaceFavouritesFile ( RFavouritesFile & aFavFile, TInt aUid ); + + + public: // database query / update + + /** + * Add an item (folder or bookmark) to the database. + * @param aItem Item to add. + * @param aDbErrorNote If ETrue, unsuccesful database open will bring up an + * error note. + * @param aRenameMode What to do in case of the name is conflicting. + * @return Error code. + */ + TInt AddL + ( + CFavouritesItem& aItem, + TBool aDbErrorNote, + TRenameMode aRenameMode + ); + + /** + * Update an item (folder or bookmark) in the database. + * @param aItem Item data. + * @param aUid Uid of item to be updated. + * @param aDbErrorNote If ETrue, unsuccesful database open will bring up + * an error note. + * @param aRenameMode What to do in case of the name is conflicting. + * @return Error code. + */ + TInt UpdateL + ( + CFavouritesItem& aItem, + TInt aUid, + TBool aDbErrorNote, + TRenameMode aRenameMode + ); + + /** + * Set Homepage. + * @param aItem Item containing Homepage data. + * @param aDbErrorNote If ETrue, unsuccesful database open will bring up an + * error note. + * @param aRenameMode What to do in case of the name is conflicting. + * @return Error code. + */ + TInt SetHomepageL + ( + CFavouritesItem& aItem, + TBool aDbErrorNote, + TRenameMode aRenameMode + ); + + /** + * Set Last Visited Page. + * @param aItem Item containing Homepage data. + * @param aDbErrorNote If ETrue, unsuccesful database open will bring up + * an error note. + * @param aRenameMode What to do in case of the name is conflicting. + * @return Error code. + */ + TInt SetLastVisitedL + ( + CFavouritesItem& aItem, + TBool aDbErrorNote, + TRenameMode aRenameMode + ); + + /** + * Check if there are any folders (except the root). + * @return EYes, ENo or EError (if could not access the database). + */ + TDbQuery AnyFoldersL(); + + /** + * Check if the given list of uids contains + * any folders that are not empty. + * @param aUids List of Uids to check. + * @return EYes if there are non-empty folder(s), ENo if not, + * EError if could not access the database. + */ + TDbQuery AnyNonEmptyFoldersL( CArrayFix& aUids ); + + /** + * Get the ordinal number of this folder in the alphabetically sorted + * list of folders. Expects a transaction. + * @param aFolder The folder to find. + * @param aFolderCount On successful return, this will be set to the + * number of folders. + * @param On successful return, this will be set to the ordinal number + * of the given folder. + * @return Error code. + */ + TInt FolderInfoL + ( TInt aFolder, TInt& aFolderCount, TInt& aFolderIndex ); + + /** + * In the alphabetically sorted list of folders, get Uid of folder next + * to aFolder. Expects a transaction. + * @param aFolder Folder to start from. + * @param aForward If ETrue, get next; if EFalse, get previous. + * @return Uid of the next folder or KFavouritesNullUid in case of any + * error. + */ + TInt NextFolderL( TInt aFolder, TBool aForward ); + + /** + * Display a query for renaming this item. If the query is accepted, + * the item is renamed. + * @param aItem The item to rename. + * @param aItem New item, we do not rename. + * @return ETrue if the query is accepted and the item is renamed. + */ + TBool RenameQueryL( CFavouritesItem& aItem, TBool aNewItem ); + + /** + * Sort items in a list. + * @param aList List to sort. + */ + void SortL( CFavouritesItemList& aList ); + + public: // convenience methods + + /** + * Check if aItem has a unique name (in its parent folder), and if + * not, make its name unique. + * @param aItem Item to set a unique name for. + * @return Error code. + */ + TInt MakeUniqueNameL( CFavouritesItem& aItem ); + + protected: // new functions + + //MApiProvider& ApiProvider() const; + + public: // from MFavouritesDbObserver + + /** + * Handle database event. + * @param aEvent Database event. + */ + void HandleFavouritesDbEventL( RDbNotifier::TEvent aEvent ); + + void ManualSortL(TInt aFolder, CBrowserBookmarksOrder* aBMOrder, CArrayFixFlat* aOrderArray, CFavouritesItemList* aItems); + + /** + * Adds the given uid to the last place in bookmarks list + * @param aUid The uid to add + * @param aOrderArray the array that stores uids in manual order + * @param aCurrentOrder the object that stores manual sorting data + */ + + void AddUidToLastPlaceL( TInt aUid , CArrayFixFlat* aOrderArray, CBrowserBookmarksOrder* aCurrentOrder); + + protected : // construction + + /** + * Constructor. + */ + CBrowserFavouritesModel( MApiProvider& aApiProvider ); + + /** + * Second phase constructor. Leaves on failure. + */ + void ConstructL(); + + /** + * Returns with the underlying database's name. + * Derived classes must provide this method. + * @return The Database Engine's name. + */ + virtual const TDesC& GetDBName(); + + private: // implementation details + + /** + * Open the database. If unsuccesful, retry two more times in + * 0.2 secs interval. + * @return Error code. + */ + TInt TimedOpenDbL(); + + /** + * Start a transaction. If unsuccesful, retry two more times in + * 0.2 secs interval. + * @param aWrite If ETrue, the table is opened with write-lock on. + * @return Error code. + */ + TInt TimedBeginL( TBool aWrite ); + + /** + * Add/update an item (folder or item) in the database; factoring out + * the common code. + * @param aItem Item data. + * @param aUid + * - When KFavouritesNullUid, the item is added. + * - Otherwise, Uid of the item to be updated. + * @param aDbErrorNote If ETrue, unsuccesful database open will bring up + * an error note. + * @param aRenameMode What to do in case of the name is conflicting. + * @return Error code. + */ + TInt AddUpdateL + ( + CFavouritesItem& aItem, + TInt aUid, + TBool aDbErrorNote, + TRenameMode aRenameMode + ); + + /** + * Compare two descriptors (case insensitive). + * @since 3.2 + * @param aFirst first descriptor + * @param aSecond second descriptor + * @return ETrue if strings match, EFalse otherwise + */ + TBool CompareIgnoreCase( const TDesC& aFirst, const TDesC& aSecond ); + + + protected: + /** + * Get all folders in the root, sorted, and push it on the cleanup + * stack. No sanity check. Expects a transaction. + * @return List of folders. Owner is the caller. + */ + virtual CFavouritesItemList* GetFoldersSortedLC(); + + private: // observer support + + /** + * Call each observer's HandleFavouritesModelChangeL(). + */ + void NotifyObserversL(); + + private: // types + + enum TState ///< Database state. + { + EClosed, ///< Database is closed. + EOpen, ///< Database is open. + ECorrupt ///< Database is corrupted (and is closed) + }; + + private: // data + + /// Used database object. Owned. + + RFavouritesDb iDb; + RFavouritesSession iFavouritesSess; + /// Notifier object. Owned. + CActiveFavouritesDbNotifier* iNotifier; + /// Observers. Array owned, contents not. + CArrayPtrFlat* iObservers; + /// Database state. + TState iState; + + MApiProvider& iApiProvider; + }; + +#include "BrowserFavouritesModel.inl" + +#endif + +// End of file \ No newline at end of file