phonebookui/Phonebook2/UIPolicy/src/CPbk2ContactDuplicatePolicy.cpp
changeset 0 e686773b3f54
child 35 4ae315f230bc
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Phonebook 2 contact duplicate policy.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "CPbk2ContactDuplicatePolicy.h"
       
    20 
       
    21 // Phonebook2
       
    22 #include <CPbk2SortOrderManager.h>
       
    23 #include <Pbk2ContactNameFormatterFactory.h>
       
    24 #include <MPbk2ContactNameFormatter.h>
       
    25 #include <CPbk2DuplicateContactFinder.h>
       
    26 #include <MPbk2DuplicateContactObserver.h>
       
    27 
       
    28 // Virtual Phonebook
       
    29 #include <CVPbkContactManager.h>
       
    30 #include <MVPbkContactOperationBase.h>
       
    31 #include <CVPbkContactLinkArray.h>
       
    32 #include <MVPbkStoreContact.h>
       
    33 
       
    34 /// Unnamed namespace for local definitions
       
    35 namespace {
       
    36 
       
    37 NONSHARABLE_CLASS(CPbk2DuplicateOperation) :
       
    38             public CBase,
       
    39             public MVPbkContactOperationBase,
       
    40             private MPbk2DuplicateContactObserver
       
    41     {
       
    42     public: // Construction and destruction
       
    43 
       
    44         /**
       
    45          * Creates a new instance of this class.
       
    46          *
       
    47          * @param aFinder               Duplicate contact finder.
       
    48          * @param aOwnDuplicates        Array of duplicates.
       
    49          * @param aDuplicates           Array of duplicates.
       
    50          * @param aContact              Contact.
       
    51          * @param aTargetStore          Target store.
       
    52          * @param aObserver             Find observer.
       
    53          * @param aMaxDuplicatesToFind  Maximum amount to find.
       
    54          * @return  A new instance of this class.
       
    55          */
       
    56         static CPbk2DuplicateOperation* NewL(
       
    57                 CPbk2DuplicateContactFinder& aFinder,
       
    58                 RPointerArray<MVPbkStoreContact>& aOwnDuplicates,
       
    59                 RPointerArray<MVPbkStoreContact>& aDuplicates,
       
    60                 const MVPbkBaseContact& aContact,
       
    61                 MVPbkContactStore& aTargetStore,
       
    62                 MVPbkContactFindObserver& aObserver,
       
    63                 TInt aMaxDuplicatesToFind );
       
    64 
       
    65         /**
       
    66          * Destructor.
       
    67          */
       
    68         ~CPbk2DuplicateOperation();
       
    69 
       
    70     private: // From MPbk2DuplicateContactObserver
       
    71         void DuplicateFindComplete();
       
    72         void DuplicateFindFailed(
       
    73                 TInt aError );
       
    74 
       
    75     private: // Implementation
       
    76         CPbk2DuplicateOperation(
       
    77                 CPbk2DuplicateContactFinder& aFinder,
       
    78                 RPointerArray<MVPbkStoreContact>& aOwnDuplicates,
       
    79                 RPointerArray<MVPbkStoreContact>& aDuplicates,
       
    80                 MVPbkContactFindObserver& aObserver );
       
    81         void ConstructL(
       
    82                 const MVPbkBaseContact& aContact,
       
    83                 MVPbkContactStore& aTargetStore,
       
    84                 TInt aMaxDuplicatesToFind );
       
    85         void HandleFindCompleteL();
       
    86 
       
    87     private: // Data
       
    88         /// Ref: Array of duplicates
       
    89         RPointerArray<MVPbkStoreContact>& iDuplicates;
       
    90         /// Ref: Array of duplicates
       
    91         RPointerArray<MVPbkStoreContact>& iOwnDuplicates;
       
    92         /// Ref: Duplicate finder
       
    93         CPbk2DuplicateContactFinder& iFinder;
       
    94         /// Ref: Observer
       
    95         MVPbkContactFindObserver& iObserver;
       
    96     };
       
    97 
       
    98 // --------------------------------------------------------------------------
       
    99 // CPbk2DuplicateOperation::CPbk2DuplicateOperation
       
   100 // --------------------------------------------------------------------------
       
   101 //
       
   102 CPbk2DuplicateOperation::CPbk2DuplicateOperation(
       
   103         CPbk2DuplicateContactFinder& aFinder,
       
   104         RPointerArray<MVPbkStoreContact>& aOwnDuplicates,
       
   105         RPointerArray<MVPbkStoreContact>& aDuplicates,
       
   106         MVPbkContactFindObserver& aObserver ) :
       
   107             iDuplicates( aDuplicates ),
       
   108             iOwnDuplicates( aOwnDuplicates ),
       
   109             iFinder( aFinder ),
       
   110             iObserver( aObserver )
       
   111     {
       
   112     }
       
   113 
       
   114 // --------------------------------------------------------------------------
       
   115 // CPbk2DuplicateOperation::~CPbk2DuplicateOperation
       
   116 // --------------------------------------------------------------------------
       
   117 //
       
   118 CPbk2DuplicateOperation::~CPbk2DuplicateOperation()
       
   119     {
       
   120     }
       
   121 
       
   122 // --------------------------------------------------------------------------
       
   123 // CPbk2DuplicateOperation::NewL
       
   124 // --------------------------------------------------------------------------
       
   125 //
       
   126 CPbk2DuplicateOperation* CPbk2DuplicateOperation::NewL(
       
   127         CPbk2DuplicateContactFinder& aFinder,
       
   128         RPointerArray<MVPbkStoreContact>& aOwnDuplicates,
       
   129         RPointerArray<MVPbkStoreContact>& aDuplicates,
       
   130         const MVPbkBaseContact& aContact,
       
   131         MVPbkContactStore& aTargetStore,
       
   132         MVPbkContactFindObserver& aObserver,
       
   133         TInt aMaxDuplicatesToFind )
       
   134     {
       
   135     CPbk2DuplicateOperation* self = new( ELeave ) CPbk2DuplicateOperation(
       
   136         aFinder, aOwnDuplicates, aDuplicates, aObserver );
       
   137     CleanupStack::PushL( self );
       
   138     self->ConstructL( aContact, aTargetStore, aMaxDuplicatesToFind );
       
   139     CleanupStack::Pop( self );
       
   140     return self;
       
   141     }
       
   142 
       
   143 // --------------------------------------------------------------------------
       
   144 // CPbk2DuplicateOperation::ConstructL
       
   145 // --------------------------------------------------------------------------
       
   146 //
       
   147 void CPbk2DuplicateOperation::ConstructL
       
   148         ( const MVPbkBaseContact& aContact, MVPbkContactStore& aTargetStore,
       
   149           TInt aMaxDuplicatesToFind )
       
   150     {
       
   151     iFinder.StartL( aContact, aTargetStore, *this, aMaxDuplicatesToFind );
       
   152     }
       
   153 
       
   154 // --------------------------------------------------------------------------
       
   155 // CPbk2DuplicateOperation::DuplicateFindComplete
       
   156 // --------------------------------------------------------------------------
       
   157 //
       
   158 void CPbk2DuplicateOperation::DuplicateFindComplete()
       
   159     {
       
   160     TRAPD( res, HandleFindCompleteL() );
       
   161     if ( res != KErrNone )
       
   162         {
       
   163         DuplicateFindFailed( res );
       
   164         }
       
   165     }
       
   166 
       
   167 // --------------------------------------------------------------------------
       
   168 // CPbk2DuplicateOperation::DuplicateFindFailed
       
   169 // --------------------------------------------------------------------------
       
   170 //
       
   171 void CPbk2DuplicateOperation::DuplicateFindFailed( TInt aError )
       
   172     {
       
   173     iObserver.FindFailed( aError );
       
   174     }
       
   175 
       
   176 // --------------------------------------------------------------------------
       
   177 // CPbk2DuplicateOperation::HandleFindCompleteL
       
   178 // --------------------------------------------------------------------------
       
   179 //
       
   180 void CPbk2DuplicateOperation::HandleFindCompleteL()
       
   181     {
       
   182     CVPbkContactLinkArray* links = CVPbkContactLinkArray::NewLC();
       
   183     const TInt count = iOwnDuplicates.Count();
       
   184     for ( TInt i = count - 1; i >= 0; --i )
       
   185         {
       
   186         MVPbkStoreContact* contact = iOwnDuplicates[i];
       
   187 
       
   188         // Create links for results
       
   189         links->AppendL( iOwnDuplicates[i]->CreateLinkLC() );
       
   190         CleanupStack::Pop(); // link
       
   191 
       
   192         // Ownership of the contact changes from
       
   193         // iOwnDuplicates to iDuplicates
       
   194         iDuplicates.InsertL( contact, 0 );
       
   195         iOwnDuplicates.Remove(i);
       
   196         }
       
   197 
       
   198     CleanupStack::Pop( links );
       
   199     // Give ownership to client
       
   200     iObserver.FindCompleteL( links );
       
   201     }
       
   202 
       
   203 } /// namespace
       
   204 
       
   205 // --------------------------------------------------------------------------
       
   206 // CPbk2ContactDuplicatePolicy::CPbk2ContactDuplicatePolicy
       
   207 // --------------------------------------------------------------------------
       
   208 //
       
   209 CPbk2ContactDuplicatePolicy::CPbk2ContactDuplicatePolicy(
       
   210         CVPbkContactManager& aContactManager ) :
       
   211             iContactManager( aContactManager )
       
   212     {
       
   213     }
       
   214 
       
   215 // --------------------------------------------------------------------------
       
   216 // CPbk2ContactDuplicatePolicy::~CPbk2ContactDuplicatePolicy
       
   217 // --------------------------------------------------------------------------
       
   218 //
       
   219 CPbk2ContactDuplicatePolicy::~CPbk2ContactDuplicatePolicy()
       
   220     {
       
   221     iDuplicates.ResetAndDestroy();
       
   222     delete iDuplicateFinder;
       
   223     delete iNameFormatter;
       
   224     delete iSortOrderManager;
       
   225     }
       
   226 
       
   227 // --------------------------------------------------------------------------
       
   228 // CPbk2ContactDuplicatePolicy::NewL
       
   229 // --------------------------------------------------------------------------
       
   230 //
       
   231 CPbk2ContactDuplicatePolicy* CPbk2ContactDuplicatePolicy::NewL
       
   232         ( TParam* aParam )
       
   233     {
       
   234     CPbk2ContactDuplicatePolicy* self =
       
   235         new( ELeave ) CPbk2ContactDuplicatePolicy( aParam->iContactManager );
       
   236     CleanupStack::PushL( self );
       
   237     self->ConstructL( aParam->iFieldTypesForFind );
       
   238     CleanupStack::Pop( self );
       
   239     return self;
       
   240     }
       
   241 
       
   242 // --------------------------------------------------------------------------
       
   243 // CPbk2ContactDuplicatePolicy::ConstructL
       
   244 // --------------------------------------------------------------------------
       
   245 //
       
   246 void CPbk2ContactDuplicatePolicy::ConstructL
       
   247         ( const MVPbkFieldTypeList* aFieldTypeForFind )
       
   248     {
       
   249     iSortOrderManager = CPbk2SortOrderManager::NewL(
       
   250         iContactManager.FieldTypes() );
       
   251     iNameFormatter = Pbk2ContactNameFormatterFactory::CreateL(
       
   252         iContactManager.FieldTypes(), *iSortOrderManager,
       
   253         &iContactManager.FsSession() );
       
   254 
       
   255     const MVPbkFieldTypeList* fieldTypesForFind =
       
   256         &iSortOrderManager->SortOrder();
       
   257     if ( aFieldTypeForFind )
       
   258         {
       
   259         fieldTypesForFind = aFieldTypeForFind;
       
   260         }
       
   261     iDuplicateFinder = CPbk2DuplicateContactFinder::NewL( iContactManager,
       
   262         *iNameFormatter, *fieldTypesForFind, iDuplicates );
       
   263     }
       
   264 
       
   265 // --------------------------------------------------------------------------
       
   266 // CPbk2ContactDuplicatePolicy::FindDuplicatesL
       
   267 // --------------------------------------------------------------------------
       
   268 //
       
   269 MVPbkContactOperationBase* CPbk2ContactDuplicatePolicy::FindDuplicatesL
       
   270         ( const MVPbkBaseContact& aContact,
       
   271           MVPbkContactStore& aTargetStore,
       
   272           RPointerArray<MVPbkStoreContact>& aDuplicates,
       
   273           MVPbkContactFindObserver& aObserver,
       
   274           TInt aMaxDuplicatesToFind )
       
   275     {
       
   276     iDuplicates.ResetAndDestroy();
       
   277     return CPbk2DuplicateOperation::NewL( *iDuplicateFinder, iDuplicates,
       
   278         aDuplicates, aContact, aTargetStore, aObserver,
       
   279         aMaxDuplicatesToFind );
       
   280     }
       
   281 
       
   282 // End of File