browserutilities/favouritesengine/ClientServer/srvinc/FavouritesSrvDb.h
changeset 0 dd21522fd290
child 25 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/favouritesengine/ClientServer/srvinc/FavouritesSrvDb.h	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,647 @@
+/*
+* Copyright (c) 2004 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 CFavouritesSrvDb.
+*      
+*
+*/
+
+
+#ifndef FAVOURITES_SRV_DB_H
+#define FAVOURITES_SRV_DB_H
+
+//  INCLUDES
+
+#include <e32base.h>
+#include <d32dbms.h>
+#include <f32file.h>
+#include <FavouritesLimits.h>
+#include "FavouritesSrvTable.h"
+#include "UnicodeFile.h"
+#include <FavouritesDb.h>
+
+
+// FORWARD DECLARATIONS
+
+class CFavouritesItemImpl;
+class CFavouritesItemImplList;
+class MFavouritesItemData;
+class TFavouritesFilter;
+class MStreamBuf;
+class CUidMap;
+class CFavouritesFolder;
+
+// CLASS DECLARATION
+
+/**
+* Server side favourites database.
+*/
+NONSHARABLE_CLASS(CFavouritesSrvDb): public CBase
+    {
+
+    public:     // Constructors and destructor
+    
+        /**
+        * Two-phased constructor. Leaves on failure.
+        * @param aFs File server session handle.
+        * @param aDbs DBMS session handle.
+        * @param aPath Database path.
+        * @param aDBName Database name.        
+        * @return The constructed db.
+        */
+        static CFavouritesSrvDb* NewL
+            ( RFs& aFs, RDbs& aDbs, const TDesC& aPath, const TDesC& aDBName );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CFavouritesSrvDb();
+
+    public:     // Adminstration
+        
+        /**
+        * Check if the database has to be recovered to be
+        * fully functional.
+        * @return ETrue if recovery is needed; EFalse otherwise.
+        */
+        TBool IsDamagedL();
+
+        /**
+        * Perform synchronous recovery. Requires exclusive access
+        * to the database.
+        */
+        void RecoverL();
+
+        /**
+        * Perform synchronous compaction. Requires exclusive access
+        * to the database.
+        */
+        void CompactL();
+
+        /**
+        * Get available database size.
+        * @return Database size.
+        */
+        RDbDatabase::TSize Size() const;
+
+        /**
+        * Update database statistics.
+        */
+        void UpdateStatsL();
+
+        /**
+        * Check transaction.
+        */
+        inline TBool InTransaction();
+    
+    public:     // Transaction support
+
+        /**
+        * Explicitly begin a transaction.
+        * @param aWrite If ETrue, write-lock is placed immediately.
+        */
+        void BeginL( TBool aWrite = EFalse );
+
+        /**
+        * Commit the transaction.
+        */
+        void CommitL();
+
+        /**
+        * Roll back the transaction.
+        */
+        void Rollback();
+
+    public:     // Data access / update / delete
+
+        /**
+        * Get the item having this Uid.
+        * @param aUid Uid or item to get.
+        * @param aItem placeholder for the returned item data. Must be of type
+        * what is returned by CreateItemL().
+        */
+        void GetL( TInt aUid, CFavouritesItemImpl& aItem );
+
+        /**
+        * Get all items matching the supplied criteria.
+        * @param aItemList placeholder for the returned item data. Existing
+        * items remain (new ones appended).
+        * @param aFilter Filters.
+        */
+        void GetAllL
+            (
+            CFavouritesItemImplList& aItemList,
+            const TFavouritesFilter& aFilter
+            );
+
+        /**
+        * Get uids of all items matching the supplied criteria.
+        * @param aUids placeholder for the returned item data. Existing
+        * items remain (new ones appended).
+        * @param aFilter Filters.
+        * @return Error code.
+        */
+        void GetUidsL
+            ( CArrayFix<TInt>& aUids, const TFavouritesFilter& aFilter );
+
+        /**
+        * Get preferred Uid for a folder.
+        * @param aFolder Folder Uid.
+        * @return - Uid of preferred item in folder aFolder, or
+        *         - KFavouritesNullUid if no preferred item or in case of any
+        *           errors (aFolder does not exist, is not a folder etc.).
+        */
+        TInt PreferredUidL( TInt aFolder );
+
+        /**
+        * Delete item. If this is a folder, all descendants and the contents
+        * of them are deleted. Homepage or root cannot be deleted.
+        * @param aUid Uid of item to delete.
+        */
+        void DeleteL( TInt aUid );
+
+        /**
+        * Update item. Homapage or Last Visited Page cannot be updated using
+        * this method.
+        * @param aItem Contents from this item (except Uid) will be used to
+        * update the item. Must be of type what is returned by CreateItemL().
+        * If successful, its Uid, Last-Mod-Time (and possibly its name) is
+        * updated on return.
+        * @param aUid Update this item.
+        * @param aAutoRename If this is ETrue, and the name already exists,
+        * the item will be renamed to a non-conflicting name.
+        */
+        void UpdateL
+            ( CFavouritesItemImpl& aItem, TInt aUid, TBool aAutoRename );
+
+        /**
+        * Add a new item to the database.
+        * If successful, its Uid, Last-Mod-Time (and possibly its name) is
+        * updated on return.
+        * @param aItem The item to add.
+        * @param aAutoRename If this is ETrue, and the name already exists,
+        * the item will be renamed to a non-conflicting name.
+        */
+        void AddL( CFavouritesItemImpl& aItem, TBool aAutoRename );
+
+        /**
+        * Set Homepage / Last Visited Page.
+        * If successful, its Uid and Last-Mod-Time is updated on return.
+        * Name needs not be unique. The cursor is left on the
+        * added / updated row.
+        * @param aItem Item data.
+        * @param aUid Uid of the item to be set. Must be
+        * KFavouritesHomepageUid or KFavouritesLastVisitedUid.
+        */
+        void SetSpecialItemL( CFavouritesItemImpl& aItem, TInt aUid );
+
+        /**
+        * Set factory item flag on an item.
+        * (Item with this flag set will be deleted if RFS is executed.)
+        * @param aUid Uid of item.
+        * @param aFactoryItem Flag value to set.
+        */
+        void SetFactoryItemL( TInt aUid, TBool aFactoryItem );
+
+        /**
+        * Set read-only flag on an item.
+        * @param aUid Uid of item.
+        * @param aReadOnly Flag value to set.
+        */
+        void SetReadOnlyL( TInt aUid, TBool aReadOnly );
+
+        /**
+        * Manual setting of Last Modification Time of an item.
+        * Note that the Last Modification Time is automatically set by any
+        * edit, so this method need not be used in usual circumstances. It is
+        * provided for administration purposes only.
+        * @param aUid Uid of item.
+        * @param aModified Last Modification Time to set.
+        */
+        void SetModifiedL( TInt aUid, TTime aModified );
+
+        /**
+        * Set preferred Uid for a folder.
+        * @param aFolder Folder Uid.
+        * @param aUid Uid to be set as preferred. Not checked to exist in the
+        * folder.
+        */
+        void SetPreferredUidL( TInt aFolder, TInt aUid );
+
+        /**
+        * Check if we have this item.
+        * @param aUid The item to check.
+        * @return
+        *   - ETrue if we have this item;
+        *   - EFalse if no such uid, or in case of any error.
+        */
+        TBool ItemExistsL( TInt aUid );
+
+        /**
+        * Check if we have this folder.
+        * @param aFolder The folder to check.
+        * @return
+        *   - ETrue if we have this folder;
+        *   - EFalse if no such uid; not a folder; or in case of any error.
+        */
+        TBool FolderExistsL( TInt aFolder );
+
+        /**
+        * Count all items matching the supplied criteria.
+        * @param aFilter Filters.
+        * @return Item count.
+        */
+        TInt CountL( const TFavouritesFilter& aFilter );
+
+    public:     // extra data
+
+        /**
+        * Set data associated with an item. Any existing data, belonging to
+        * item having aUid, is now replaced. The item itself is not changed.
+        * In case of any errors, the data is not saved.
+        * @param aUid The uid of the item, to which the data belongs.
+        * @param aSource Data source.
+        */
+        void SetDataL( TInt aUid, MStreamBuf& aSource );
+
+        /**
+        * Get data associated with an item.
+        * @param aUid The uid of the item, to which the data belongs.
+        * @param aSink Data sink.
+        */
+        void GetDataL( TInt aUid, MStreamBuf& aSink );
+
+    public:     // Browser data
+
+        /**
+        * Set Browser data associated with an item. Any existing data,
+        * belonging to  item having aUid, is now replaced. The item itself is
+        * not changed.
+        * This data is for Browser's dedicated use, do not tamper.
+        * In case of any errors, the data is not saved.
+        * @param aUid The uid of the item, to which the data belongs.
+        * @param aSource Data source.
+        */
+        void SetBrowserDataL( TInt aUid, MStreamBuf& aSource );
+
+        /**
+        * Get Browser associated with an item.
+        * This data is for Browser's dedicated use, do not tamper.
+        * @param aUid The uid of the item, to which the data belongs.
+        * @param aSink Data sink.
+        */
+        void GetBrowserDataL( TInt aUid, MStreamBuf& aSink );
+
+    public:     // unique name support
+
+        /**
+        * Check if aName is unique in aFolder; and if not, change to
+        * an unique one, appending a number. In case of any errors, aName is
+        * unchanged. Names of special items (Start Page etc.) are not
+        * considered (can have conflicting names).
+        * @param aName Descriptor containing the original name and receiving
+        * the resulting unique name. Must be large enough to accomodate the
+        * result. (The appended text is KFavouritesMaxPostfix characters at
+        * most; the resulting length is KFavouritesMaxName at most.)
+        * @param aFolder Folder to be used for uniqueness-checking.
+        */
+        void MakeUniqueNameL( TDes& aName, TInt aFolder );
+
+    public:     // new methods
+
+        /**
+        * User-level Restore Factory Settings operation.
+        * Delete all items that has "factory item" flag set, then add new
+        * ones from reference database. In case of name conflicts, new
+        * names are generated. Leaves on any error.
+        * @param aReferenceDbPath Full pathname of reference database.
+        * @param aApMap AP map. After AP mapping is done, SetAccessPointsL
+        * is to be called.
+        * Expects a transaction.
+        */
+        void RestoreFactorySettingsL
+            ( const TDesC& aReferenceDbPath, CUidMap& aApMap );
+
+        /**
+        * Get filename for uid.
+        * @param aUid Uid.
+        * @param aParse Filename is returned here.
+        */
+
+        void InitSavedFilePathL(const TDesC&  aDBName );    
+        
+        
+
+        void FilenameL( TInt aUid, TParse& aParse );
+      
+    protected:      // Constructors
+
+        /**
+        * Constructor.
+        * @param aFs File server session handle.
+        * @param aDbs DBMS session handle.
+        */
+        CFavouritesSrvDb( RFs& aFs, RDbs& aDbs );
+
+
+        /**
+        * Second-phase constructor.
+        * @param aPath Database path.
+        * @param aDBName Database name.
+        */
+        void ConstructL( const TDesC& aPath, const TDesC&  aDBName  );
+
+
+    protected:  // types
+
+        /**
+        * What to do with conflicting names in Add or Update operations.
+        */
+        enum TRenameType
+            {
+            EDontRename,    ///< Reject update.
+            EAutoRename,    ///< Rename automatically.
+            ESuppressCheck  ///< Suppress name conflict checking (accept any).
+            };
+
+    protected:  // custom cleanup
+
+        /**
+        * Orphaned files cleanup: delete files that has the proper format name
+        * but do not have an item associated to them.
+        */
+        void DeleteOrphanedFilesL();
+
+    protected:  // new methods
+
+        /**
+        * BeginL an explicit transaction if there is none in progress.
+        * @param aWrite If ETrue, write-lock is placed immediately.
+        * @param aOwnTransaction Placeholder for result. If the value is
+        * ETrue on return, a transaction was started. To be used as the
+        * input parameter for the corresponding CommitIfNeeded(...) call.
+        */
+        void BeginIfNeededL( TBool aWrite, TBool& aOwnTransaction );
+
+        /**
+        * Commit the transaction if aOwnTransaction is ETrue.
+        * @param aOwnTransaction If ETrue, Commit will be performed.
+        * @return Error code.
+        */
+        void CommitIfNeededL( TBool aOwnTransaction );
+
+    private:    // new methods
+
+        /**
+        * Create the database file, make the database, and the root
+        * folder. If anything goes wrong during this, leave. This method
+        * expects everything to exist and be open/ready for use.
+        * @param aDbFile Parsed filename to use.
+        */
+        void CreateDatabaseL( TParse& aDbFile, TBool aDoImport );
+
+        /**
+        * Create the root entry. Expects the database to be
+        * open and not used by anyone else.
+        */
+        void CreateRootFolderL();
+
+        /**
+        * Get the used database. Friend classes use this method.
+        * @return Reference to the used database.
+        */
+        inline RDbDatabase& Database();
+
+        /**
+        * Delete the item under the cursor. If it is a folder, delete contents
+        * also.
+        * Expects a transaction; expects a valid row.
+        * @param aDeletedUids Uids of deleted items will be appended to this
+        * list.
+        */
+        void DeleteCurrentL( CArrayFix<TInt>& aDeletedUids );
+
+        /**
+        * Update the item under the cursor.
+        * Expects a transaction; expects a valid row. Row data not gotten.
+        * @param aItem Contents from this item (except Uid) will be used to
+        * update the item. Must be of type what is returned by CreateItemL().
+        * If successful, its Uid, Last-Mod-Time (and possibly its name) is
+        * updated on return.
+        * The cursor is left on the updated row.
+        * @param aRenameType What to do in case of name conflict.
+        */
+        void UpdateCurrentL
+            ( CFavouritesItemImpl& aItem, TRenameType aRenameType );
+
+        /**
+        * Add a new item to the database. Expects a transaction.
+        * If successful, its Uid, Last-Mod-Time (and possibly its name) is
+        * updated on return.
+        * The cursor is left on the added row.
+        * @param aItem The item to add.
+        * @param aRenameType What to do in case of name conflict.
+        * @param aFactoryItem If ETrue, "Factory item" flag will be set.
+        * @param aReadOnly If ETrue, "Read-only" flag will be set.
+        */
+        void DoAddL
+            (
+            CFavouritesItemImpl& aItem,
+            TRenameType aRenameType,
+            TBool aFactoryItem = EFalse,
+            TBool aReadOnly = EFalse
+            );
+
+        /**
+        * Check that aName (which has not yet been added/modified in the
+        * database) is unique name in aFolder.
+        * No sanity check. Expects the folder to exist. Expects a transaction.
+        * Overwrites filters.
+        * @param aName Name to check. Must be OK.
+        * @param aFolder Folder to check in. Must exist.
+        * @param aAcceptUid This uid is accepted (in case of update, this is
+        * the existing item's own uid).
+        * @return ETrue if aName is unique.
+        */
+        TBool IsUniqueNameL
+            ( const TDesC& aName, TInt aFolder, TInt aAcceptUid );
+
+        /**
+        * Make a unique name. No sanity checks. Expects a transaction.
+        * Expects the name be really conflicting (with some item other than
+        * aAcceptUid). Overwrites filters.
+        * @param aName Descriptor containing the original name and receiving
+        * the resulting unique name.
+        * @param aFolder Folder to be used for uniqueness-checking. Must exist.
+        * @param aAcceptUid Exclude this item from checking (used when
+        * updating aAcceptUid).
+        */
+        void MakeUniqueNameL( TDes& aName, TInt aFolder, TInt aAcceptUid );
+
+        /**
+        * Allocate a buffer and make a unique name in it. No sanity checks.
+        * Expects a transaction. Expects the name be really conflicting
+        * (with some item other than aAcceptUid). Overwrites filters.
+        * @param aName Descriptor containing the original name.
+        * @param aFolder Folder to be used for uniqueness-checking. Must exist.
+        * @param aAcceptUid Exclude this item from checking (used when
+        * updating aAcceptUid).
+        * @return A newly allocated buffer, containing the new name. Caller
+        * must free this.
+        */
+        HBufC* AllocUniqueNameLC
+            ( const TDesC& aName, TInt aFolder, TInt aAcceptUid );
+
+        /**
+        * Static wrapper arounf Rollback().
+        * @param aDb The database (CFavouritesDb*) as TAny*.
+        */
+        static void StaticRollback( TAny* aDb );
+
+    protected:  // RFS support
+
+        /**
+        * User-level Restore Factory Settings operation.
+        * Delete all items that has "factory item" flag set, then add new
+        * ones from reference database. In case of name conflicts, new
+        * names are generated. Leaves on any error.
+        * @param aRefTable Reference data table.
+        * @param aApMap AP map. Filled with AP data: iUid1 = UID of item;
+        * iUid2 = current AP id. These AP-s are to be mapped, then
+        * SetAccessPointsL is to be called to update.
+        * Expects a transaction.
+        */
+        void RestoreFactorySettingsL
+            ( RFavouritesSrvTable& aReferenceTable, CUidMap& aApMap );
+
+    public:     // RFS support
+
+        /**
+        * "Batch" setting of Access points - RFS part 2.
+        * @param aApMap Access Point map: iUid1 = UID of item; iUid2 = AP id.
+        * Expects a transaction.
+        */
+        void SetAccessPointsL( const CUidMap& aApMap );
+
+    private:    // friends
+        
+        /// Access to iDbs is granted for this.
+        friend class CFavouritesSrvDbNotifier;
+        /// Access to iDbs is granted for this.
+        friend class CFavouritesSrvDbIncremental;
+
+    private:        // Data
+
+        RFs& iFs;                       ///< File server sess. handle. Not own.
+        RDbs& iDbs;                     ///< DBMS session handle. Not own.
+        RDbNamedDatabase iDatabase;     ///< Database handle. Own.
+        RFavouritesSrvTable iTable;     ///< Database table handle. Own.
+        TBool iOpen;                    ///< ETrue if opened.
+        TBool iInTransaction;           ///< ETrue in transaction.
+        TInt iUpdatesSinceLastCompact;  ///< Updates since last compaction.
+        HBufC* iPath;                   ///< Database path. Own.
+        HBufC* iSavedFilePath;                   ///< Saved File  path. Own.        
+        RBuf iSecureDbFormat;
+// -----------------------------------------
+// New methods from Bookmarks import utility
+// -----------------------------------------
+    public:     // New methods
+
+        /**
+        * Import bookmarks from Unicode file (comma-separated list).
+        * @param aFileName File Name.
+        */
+        void ImportL( const TDesC& aFileName );
+
+    private:    
+
+        /**
+        * Get next character and store it in iCurCh.
+        */
+        inline void GetCharL();
+
+        /**
+        * Process next line.
+        * @return ETrue if more lines to go, EFalse on EOF.
+        */
+        TBool NextLineL();
+
+        /**
+        * Parse next token. Next token spans from current character up to (but
+        * excluding) to the next stop character.
+        * @param aStopCharSet Stop characters (terminate the token).
+        * @return Pointer to token. This may be empty string. Note that the
+        * returned pointer is valid until next call (consecutive calls reuse
+        * the same buffer).
+        */
+        TPtrC NextTokenL( const TDesC& aStopCharSet );
+
+        /**
+        * Parse next token, which expected to be an integer.
+        * @param aStopCharSet Stop characters (terminate the token).
+        * @return Numeric value of token (0 for empty token).
+        */
+        TInt NextIntTokenL( const TDesC& aStopCharSet );
+
+        /**
+        * Parse next token, which expected to be a hexadecimal number.
+        * @param aStopCharSet Stop characters (terminate the token).
+        * @return Numeric value of token (0 for empty token).
+        */
+        TInt32 NextHexTokenL( const TDesC& aStopCharSet );
+
+        /**
+        * @param aStopCharSet Stop characters (terminate the token).
+        */
+        void SkipL( const TDesC& aStopCharSet );
+
+        /**
+        * Parse comma separated list of bookmark values; create and add a
+        * bookmark to the bookmark database.
+        */
+        void AttrsL();
+
+        /**
+        * Lookup uid of folder by name.
+        * @param aName Name of folder to be found.
+        * @return Uid of folder with name aName.
+        */
+        TInt FolderByNameL( const TDesC& aName );
+        
+        /**
+         * Lookup IAP id by name.
+         * @param aName Name of IAP
+         * @aIapId contain return value of IAP id
+         * @return error status.
+         */ 
+        TInt IAPIdByNameL( TDesC& aName, TInt& aIapId );
+
+    private:    // data added with integration of bookmark import capability
+
+        RFavouritesSession iSess;   ///< Favourites Engine session.
+        RFavouritesDb iDb;          ///< Favourites database. Owned.
+        CArrayFixFlat<CFavouritesFolder>*  iFolderNames; // pointer to struct of array of folder name and UID
+
+        RUnicodeFile iFile;         ///< Input file. Owned.
+        TUint iCurCh;               ///< Current (lookahead) character.
+        TText16* iBuf;              ///< Token buffer.
+        TText16* iNextCh;           ///< Next character is stored here.
+        TText16* iMaxCh;            ///< Points past the buffer.
+    };
+
+#include "FavouritesSrvDb.inl"
+
+#endif
+            
+// End of File