phonebookui/Phonebook2/inc/CPbk2DuplicateContactFinder.h
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/inc/CPbk2DuplicateContactFinder.h	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,191 @@
+/*
+* Copyright (c) 2005-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:  Utility class for finding duplicate contacts
+*                from the stores.
+*
+*/
+
+
+#ifndef CPBK2DUPLICATECONTACTFINDER_H
+#define CPBK2DUPLICATECONTACTFINDER_H
+
+#include <e32base.h>
+#include <MVPbkContactFindObserver.h>
+#include <MVPbkSingleContactOperationObserver.h>
+
+class CVPbkContactManager;
+class MVPbkContactStore;
+class MVPbkBaseContact;
+class MVPbkContactLinkArray;
+class MVPbkContactOperationBase;
+class MVPbkFieldTypeList;
+class MPbk2ContactNameFormatter;
+class MPbk2DuplicateContactObserver;
+class MVPbkBaseContactField;
+
+/**
+ * Utility class for finding duplicate contacts from the stores.
+ * Finds duplicates from stores by using the name formatter.
+ */
+class CPbk2DuplicateContactFinder : public CActive,
+                                    private MVPbkContactFindObserver,
+                                    private MVPbkSingleContactOperationObserver
+    {
+    public: // Construction and destruction
+
+        /**
+         * Constructs a duplicate finder that finds duplicate contacts
+         * from all the stores.
+         *
+         * @param aContactManager       Virtual Phonebook contact manager
+         *                              that owns the field types and can
+         *                              be used for finding the stores.
+         * @param aNameFormatter        Name formatter for recognizing
+         *                              duplicate contacts.
+         * @param aFieldTypesForFind    These are the field types that are
+         *                              usedfor the find. Most probably the
+         *                              same field types as are in the sort
+         *                              order. These define also the order
+         *                              for getting the find text.
+         *                              E.g if last name is the first in
+         *                              the list and first name is the second
+         *                              one then the last name is taken from
+         *                              the given contact and that text is
+         *                              used for the find. If there was no
+         *                              last name in the contact then the
+         *                              first name text is taken.
+         * @param aDuplicateContacts    The result array for
+         *                              duplicate contacts.
+         * @return  A new instance of this class.
+         */
+        IMPORT_C static CPbk2DuplicateContactFinder* NewL(
+                CVPbkContactManager& aContactManager,
+                MPbk2ContactNameFormatter& aNameFormatter,
+                const MVPbkFieldTypeList& aFieldTypesForFind,
+                RPointerArray<MVPbkStoreContact>& aDuplicateContacts );
+
+        /**
+         * Destructor.
+         */
+        virtual ~CPbk2DuplicateContactFinder();
+
+    public: // Interface
+
+        /**
+         * Starts asynchronous duplicate find from the given store.
+         *
+         * @param aContact              The source contact whose duplicates
+         *                              are searched for.
+         * @param aStore                A store for creating find operation.
+         * @param aObserver             An observer to notify after the
+         *                              checking has been done.
+         * @param aMaxDuplicatesToFind  Finder stops if the it finds more
+         *                              than max amount of duplicates.
+         */
+        IMPORT_C void StartL(
+                const MVPbkBaseContact& aContact,
+                MVPbkContactStore& aStore,
+                MPbk2DuplicateContactObserver& aObserver,
+                TInt aMaxDuplicatesToFind );
+        /**
+         * Starts asynchronous duplicate find from all the stores.
+         *
+         * @param aContact              The source contact whose duplicates
+         *                              are searched for.
+         * @param aObserver             An observer to notify after the
+         *                              checking has been done.
+         * @param aMaxDuplicatesToFind  Finder stops if the it finds more
+         *                              than max amount of duplicates.
+         */
+        IMPORT_C void StartL(
+                const MVPbkBaseContact& aContact,
+                MPbk2DuplicateContactObserver& aObserver,
+                TInt aMaxDuplicatesToFind );
+
+    private: // From CActive
+        void RunL();
+        void DoCancel();
+        TInt RunError(
+                TInt aError );
+
+    private: // From MVPbkContactFindObserver
+        void FindCompleteL(
+                MVPbkContactLinkArray* aResults );
+        void FindFailed(
+                TInt aError );
+
+    private: // From MVPbkSingleContactOperationObserver
+        void VPbkSingleContactOperationComplete(
+                MVPbkContactOperationBase& aOperation,
+                MVPbkStoreContact* aContact );
+        void VPbkSingleContactOperationFailed(
+                MVPbkContactOperationBase& aOperation,
+                TInt aError );
+
+    private: // Implementation
+        CPbk2DuplicateContactFinder(
+                CVPbkContactManager& aContactManager,
+                MPbk2ContactNameFormatter& aNameFormatter,
+                const MVPbkFieldTypeList& aFieldTypesForFind,
+                RPointerArray<MVPbkStoreContact>& aDuplicateContacts );
+        void ConstructL();
+        void IssueRequest();
+        TPtrC FindText();
+        MVPbkContactOperationBase* FindOperationL(
+                const TDesC& aFindText );
+        void StartFindL();
+        void RetrieveContactL();
+        void CompleteL();
+        TBool LastContactRetrieved();
+        void DestroyOperation();
+        void CheckDuplicateL(
+                MVPbkStoreContact* aContact );
+        TBool IsFieldMatched( const MVPbkBaseContact* aContact, TInt aFieldId );
+        const MVPbkBaseContactField* FindFieldById( const MVPbkBaseContact* aContact, 
+                TInt aFieldId );
+
+    private: // Data
+        /// Ref: Virtual Phonebook contact manager
+        CVPbkContactManager& iContactManager;
+        /// ReF: Name formatter
+        MPbk2ContactNameFormatter& iNameFormatter;
+        /// Ref: These are the field types that are used for find
+        const MVPbkFieldTypeList& iFieldTypesForFind;
+        /// Own: A pointer to find text
+        TPtrC iFindText;
+        /// Ref: A store for single store check
+        MVPbkContactStore* iStore;
+        /// Ref: Observer
+        MPbk2DuplicateContactObserver* iObserver;
+        /// Ref:: A contact whose duplicates are searched for
+        const MVPbkBaseContact* iContactToCompare;
+        /// Own: a title of iContactToCompare
+        HBufC* iContactTitle;
+        /// Own: Find operation
+        MVPbkContactOperationBase* iContactOperation;
+        /// Own: Results of the find
+        MVPbkContactLinkArray* iFindResults;
+        /// Ref: Duplicate contacts
+        RPointerArray<MVPbkStoreContact>& iDuplicates;
+        /// An index in iFindResults for retrieving.
+        TInt iContactIndex;
+        /// Internal state of the finder
+        TInt iState;
+        /// The maximum amount of duplicates to find
+        TInt iMaxDuplicatesToFind;
+    };
+
+#endif // CPBK2DUPLICATECONTACTFINDER_H
+
+// End of File