--- /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 <e32base.h>
+#include <favouritesdbobserver.h>
+#include "BrowserBookmarksOrder.h"
+#include <favouritesdb.h>
+#include <favouritesfile.h>
+#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<TInt>& 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<TInt>* 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<TInt>* 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<MBrowserFavouritesModelObserver>* iObservers;
+ /// Database state.
+ TState iState;
+
+ MApiProvider& iApiProvider;
+ };
+
+#include "BrowserFavouritesModel.inl"
+
+#endif
+
+// End of file
\ No newline at end of file