phonebookengines/VirtualPhonebook/VPbkCntModel/inc/CContactStore.h
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/inc/CContactStore.h	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,411 @@
+/*
+* Copyright (c) 2002-2007 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:  Contacts Model store contact store implementation.
+*
+*/
+
+
+#ifndef VPBKCNTMODEL_CCONTACTSTORE_H
+#define VPBKCNTMODEL_CCONTACTSTORE_H
+
+// INCLUDES
+#include <e32base.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStore2.h>
+#include <MVPbkContactOperationFactory.h>
+#include <VPbkFieldType.hrh>
+#include <MVPbkContactStoreObserver.h>
+#include <cntdb.h>
+#include <cntviewbase.h>
+#include "CContactStoreDomain.h"
+
+// FORWARD DECLARATIONS
+class MVPbkFieldType;
+class CVPbkContactStoreUri;
+class MVPbkContactLink;
+class MVPbkContactObserver;
+class CVPbkContactStoreProperties;
+class MVPbkContactBookmark;
+template<typename MVPbkContactStoreObserver> class CVPbkAsyncObjectOperation;
+
+namespace VPbkEngUtils {
+class CVPbkDiskSpaceCheck;
+} /// namespace
+
+namespace VPbkCntModel {
+
+// FORWARD DECLARATIONS
+class CFieldTypeMap;
+class CContact;
+class CFieldFactory;
+class CAsyncContactOperation;
+class CFieldsInfo;
+class CContactStoreInfo;
+class CNamedRemoteViewHandle;
+class CContactStoreOpenOperation;
+
+#ifdef _DEBUG
+enum TContactStorePanic
+	{
+	EPreCond_NativeDatabase,
+	EPreCond_ContactDestroyed,
+	EPreCond_CreateNewContactGroupLC,
+	EPreCond_ContactGroupsLC,
+	EPreCond_OwnContactLinkL,
+	EPreCond_OpenOperationState
+	};
+
+void ContactStorePanic( TContactStorePanic aPanic );
+#endif // _DEBUG
+
+
+// CLASS DECLARATIONS
+
+/**
+ * Maps a Contact Model database to a virtual Phonebook contact store.
+ */
+NONSHARABLE_CLASS( CContactStore ): public CBase,
+                                    public MVPbkContactStore,
+                                    public MVPbkContactStore2,
+                                    private MContactDbObserver
+    {
+    public: // Constructor and destructor
+        /**
+         * Creates a new instance of this class.
+         *
+         * @param aURI          Filename URI of the Contacts Model
+         *                      database to map.
+         * @param aStoreDomain  Contact store domain.
+         * @return  A new instance of this class.
+         */
+        static CContactStore* NewL(
+                const TVPbkContactStoreUriPtr& aURI,
+                CContactStoreDomain& aStoreDomain );
+
+        /**
+         * Destructor.
+         */
+        ~CContactStore();
+
+    public: // Interface
+        /**
+         * Returns the field type map to use for mapping Contact Model field
+         * types to Virtual Phonebook field types.
+         *
+         * @return  Field type map.
+         */
+        const CFieldTypeMap& FieldTypeMap() const;
+
+        /**
+         * Returns the field factory.
+         *
+         * @return  Field factory.
+         */
+        const CFieldFactory& FieldFactory() const;
+
+        /**
+         * Returns the master field type list of Virtual Phonebook.
+         *
+         * @return  Master field type list.
+         */
+        const MVPbkFieldTypeList& MasterFieldTypeList() const;
+
+        /**
+         * Creates and returns a new Contacts Model field based on Virtual
+         * Phonebook generic field type.
+         *
+         * @param aFieldType    Field type.
+         * @return  Contacts Model field.
+         */
+        CContactItemField* CreateFieldLC(
+                const MVPbkFieldType& aFieldType ) const;
+
+        /**
+         * Reads a contact from the database.
+         *
+         * @param aContactId    Id of the contact to read.
+         * @param aObserver     Observer.
+         */
+        void ReadContactL(
+                TContactItemId aContactId,
+                MVPbkContactObserver& aObserver );
+
+        /**
+         * Locks a contact in the database.
+         *
+         * @param aClient   The contact to lock.
+         * @param aObserver Observer.
+         */
+        void LockContactL(
+                const CContact& aClient,
+                MVPbkContactObserver& aObserver );
+
+        /**
+         * Reads and locks a contact in the database.
+         *
+         * @param aContactId    Id of the contact to read and lock.
+         * @param aObserver     Observer.
+         */
+        void ReadAndLockContactL(
+                TContactItemId aContactId,
+                MVPbkContactObserver& aObserver );
+
+        /**
+         * Deletes a contact from the database.
+         *
+         * @param aContactId    Id of the contact to delete.
+         * @param aObserver     Observer.
+         */
+        void DeleteContactL(
+                TContactItemId aContactId,
+                MVPbkContactObserver& aObserver );
+
+        /**
+         * Commits changes to a contact to the database.
+         *
+         * @param aContactItem  The contact to commit.
+         * @param aObserver     Observer.
+         */
+        void CommitContactL(
+                const CContact& aContactItem,
+                MVPbkContactObserver& aObserver );
+
+        /**
+         * Creates a contact link.
+         *
+         * @param aContactId    Id of the contact to link.
+         * @return  Contact link.
+         */
+        MVPbkContactLink* CreateLinkLC(
+                TContactItemId aContactId ) const;
+
+        /**
+         * Called from CContact destructor. aCloseContact should be
+         * set for contacts that were locked. Read-only contacts
+         * should provide EFalse for aCloseContact in order to avoid
+         * resetting lock of another CContact instance for the same
+         * contact model item.
+         *
+         * @param aContactItem  The destroyed contact.
+         * @param aCloseContact Indicates that contact should be closed,
+         * 						necessary for locked contacts.
+         */
+        void ContactDestroyed(
+                CContactItem* aContactItem, TBool aCloseContact );
+
+        /**
+         * Returns the native contacts database that
+         * this store is connected to.
+         *
+         * @return  Contact database.
+         */
+        CContactDatabase& NativeDatabase() const;
+
+        /**
+         * Compares contact stores.
+         *
+         * @param aContactStoreUri  The URI to compare.
+         * @return  ETrue if this is the same store.
+         */
+        TBool MatchContactStore(
+                const TDesC& aContactStoreUri ) const;
+
+        /**
+         * Compares contact store domains.
+         *
+         * @param aContactStoreDomain   The domain to compare.
+         * @return  ETrue if this store is in the same domain.
+         */
+        TBool MatchContactStoreDomain(
+                const TDesC& aContactStoreDomain ) const;
+
+        /**
+         * Creates a contact bookmark
+         *
+         * @param aContactId    Id of the contact to bookmark.
+         * @return  Contact bookmark.
+         */
+        MVPbkContactBookmark* CreateBookmarkLC(
+                TContactItemId aContactId ) const;
+
+        /**
+         * Set contact as the store's current own contact.
+         *
+         * @param aContactItem  The contact to set as own.
+         * @param aObserver     Observer.
+         */
+        void SetAsOwnL(
+                const CContact& aContactItem,
+                MVPbkContactObserver& aObserver );
+
+        /**
+         * Asynchronous store opening is complete. 
+         * 
+         * @see CContactStoreOpenOperation.
+         * @param aDB Opened native contacts store database.
+         */
+        void StoreOpenedL( CContactDatabase* aDB );
+        
+        /**
+         * Asynchronous store opening has failed.
+         * 
+         * @see CContactStoreOpenOperation.
+         * @param aError Generic synbian error code.
+         */
+        void StoreOpenFailed( TInt aError );
+        
+        /**
+         * Request free disk space.
+         * NOTE: Request is put on cleanupstack only if return value is ETrue.
+         * 
+         * @param aSpace Amount of free space requested.
+         * @return ETrue if request was successful. 
+         */
+        TBool RequestFreeDiskSpaceLC( TInt aSpace );
+        
+    public: // From MVPbkContactStore
+        const MVPbkContactStoreProperties& StoreProperties() const;
+        void OpenL(
+                MVPbkContactStoreObserver& aObserver );
+        void ReplaceL(
+                MVPbkContactStoreObserver& aObserver );
+        void Close(
+                MVPbkContactStoreObserver& aObserver );
+        MVPbkStoreContact* CreateNewContactLC();
+        MVPbkContactGroup* CreateNewContactGroupLC();
+        MVPbkContactView* CreateViewLC(
+                const CVPbkContactViewDefinition& aViewDefinition,
+                MVPbkContactViewObserver& aObserver,
+                const MVPbkFieldTypeList& aSortOrder );
+        MVPbkContactLinkArray* ContactGroupsLC() const;
+        const MVPbkContactStoreInfo& StoreInfo() const;
+        MVPbkContactLink* CreateLinkFromInternalsLC(
+                RReadStream& aStream ) const;
+        TAny* ContactStoreExtension( TUid aExtensionUid );
+
+    public: // From MVPbkContactStore2
+        MVPbkContactOperationBase* OwnContactLinkL(
+               MVPbkSingleContactLinkOperationObserver& aObserver) const;
+        
+    public: // Contact operations (MVPbkContactOperationFactory)
+        MVPbkContactOperation* CreateContactRetrieverL(
+                const MVPbkContactLink& aLink,
+                MVPbkSingleContactOperationObserver& aObserver );
+        MVPbkContactOperation* CreateDeleteContactsOperationL(
+                const MVPbkContactLinkArray& aContactLinks,
+                MVPbkBatchOperationObserver& aObserver );
+        MVPbkContactOperation* CreateCommitContactsOperationL(
+                const TArray<MVPbkStoreContact*>& aContacts,
+                MVPbkBatchOperationObserver& aObserver );
+        MVPbkContactOperation* CreateMatchPhoneNumberOperationL(
+                const TDesC& aPhoneNumber,
+                TInt aMaxMatchDigits,
+                MVPbkContactFindObserver& aObserver );
+        MVPbkContactOperation* CreateFindOperationL(
+                const TDesC& aSearchString,
+                const MVPbkFieldTypeList& aFieldTypes,
+                MVPbkContactFindObserver& aObserver );
+        MVPbkContactOperation* CreateFindOperationL(
+                const MDesC16Array& aSearchStrings,
+                const MVPbkFieldTypeList& aFieldTypes,
+                MVPbkContactFindFromStoresObserver& aObserver,
+                const TCallBack& aWordParserCallBack );
+        MVPbkContactOperation* CreateCompressStoresOperationL(
+			    MVPbkBatchOperationObserver& aObserver );
+
+
+    public: // Interface for VPbkCntModel component
+        void AddObserverL(
+                MVPbkContactStoreObserver& aObserver );
+        void RemoveObserver(
+                MVPbkContactStoreObserver& aObserver );
+        TBool IsOpened() const;
+        RFs& ContactStoreDomainFsSession();
+
+    private: // From MContactDbObserver
+        void HandleDatabaseEventL(
+                TContactDbObserverEvent aEvent );
+
+    private:  // Implementation
+        CContactStore(
+                CContactStoreDomain& aStoreDomain );
+        void ConstructL(
+                const TVPbkContactStoreUriPtr& aURI );
+        void DoOpenL(
+                MVPbkContactStoreObserver& aObserver,
+                TBool aReplace );
+        void OpenError(
+                MVPbkContactStoreObserver& aObserver,
+                TInt aError );
+        void SetStaticPropertiesL();
+        void DoAddFieldTypesL();
+        void CloseSystemTemplate(
+                CContactDatabase* aContactDb );
+        CContactDatabase* OpenInternalL();
+        void DoActivateRemoteViewsL();
+        RContactViewSortOrder CreateSortOrderL(
+                const MVPbkFieldTypeList& aSortOrder) const;
+        TContactViewPreferences ConvertViewPrefsL(const TDesC8& aData);
+
+    private:  // Data
+        /// Ref: Store domain
+        CContactStoreDomain& iStoreDomain;
+        /// Own: URI of this store
+        CVPbkContactStoreUri* iStoreURI;
+        /// Own: Store properties
+        CVPbkContactStoreProperties* iProperties;
+        /// Own: Stores asynchronous operation
+        CVPbkAsyncObjectOperation<MVPbkContactStoreObserver>* iAsyncOpenOp;
+        /// Own: Store observers
+        RPointerArray<MVPbkContactStoreObserver> iObservers;
+        /// Own: Contact database for this store
+        CContactDatabase* iContactDb;
+        /// Own: Contact database change notifier
+        CContactChangeNotifier* iDbNotifier;
+        /// Own: Virtual Phonebook to contact model field type mapping
+        CFieldFactory* iFieldFactory;
+        /// Own: Asynchronous operation
+        CAsyncContactOperation* iAsyncContactOperation;
+        /// Own: Field info of Contacts Model fields
+        CFieldsInfo* iFieldsInfo;
+        /// Own: the store info
+        CContactStoreInfo* iStoreInfo;
+        /// Own: Golden template contact item
+        CContactItem* iSysTemplate;
+        /// Own: Disk space checker
+        VPbkEngUtils::CVPbkDiskSpaceCheck* iDiskSpaceCheck;
+        /// Own: named remote view container
+        RPointerArray<CNamedRemoteViewHandle> iNamedViewContainer;
+        /// Own: Contact store open operation
+        CContactStoreOpenOperation* iOpenOperation;
+        /// Has golden template been updated
+        TBool iGoldenTemplateUpdated;
+    };
+
+
+// INLINE FUNCTIONS
+
+inline CContactDatabase& CContactStore::NativeDatabase() const
+    {
+    __ASSERT_DEBUG( iContactDb, ContactStorePanic( EPreCond_NativeDatabase ) );
+    return *iContactDb;
+    }
+
+} /// namespace VPbkCntModel
+
+#endif  // VPBKCNTMODEL_CCONTACTSTORE_H
+
+//End of File
+
+