phonebookui/Phonebook2/CommandsExtension/src/TPbk2CopyContactsUtil.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommandsExtension/src/TPbk2CopyContactsUtil.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,130 @@
+/*
+* 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:  Phonebook 2 copy contacts result diplay utility.
+*
+*/
+
+
+// INCLUDE FILES
+#include "TPbk2CopyContactsUtil.h"
+
+// Phonebook 2
+#include <CPbk2StoreConfiguration.h>
+#include <MPbk2ContactUiControl.h>
+#include <CPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactStore.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <MVPbkContactStoreProperties.h>
+#include <VPbkContactStoreUris.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkBaseContact.h>
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+const TInt KOneStore = 1;
+const TInt KNoContacts = 0;
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// TPbk2CopyContactsUtil::CopyContactTargetStoresLC
+// --------------------------------------------------------------------------
+//
+CVPbkContactStoreUriArray* TPbk2CopyContactsUtil::
+        CopyContactTargetStoresLC(
+            MPbk2ContactUiControl& aControl,
+            CVPbkContactStoreUriArray* aDiscardedUris)
+    {
+    CVPbkContactStoreUriArray* targets = CVPbkContactStoreUriArray::NewLC();
+
+    CPbk2ApplicationServices* appServices = CPbk2ApplicationServices::InstanceLC();
+
+    // Add the number of writable stores
+    CPbk2StoreConfiguration& config = appServices->StoreConfiguration();
+    CVPbkContactStoreUriArray* stores =
+        config.SupportedStoreConfigurationL();
+    CleanupStack::PushL(stores);
+    TInt count = stores->Count();
+    for (TInt i = 0; i < count; ++i)
+        {
+        MVPbkContactStore* store =
+            appServices->ContactManager().
+                ContactStoresL().Find((*stores)[i]);
+        if ( store && !store->StoreProperties().ReadOnly() )
+            {
+            TVPbkContactStoreUriPtr uri = store->StoreProperties().Uri();
+            if ( aDiscardedUris && aDiscardedUris->IsIncluded( uri ) )
+                {
+                // Do not append, the URI needs to be discarded
+                }
+            else
+                {
+                targets->AppendL( uri );
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy(); // stores
+
+    CleanupStack::PopAndDestroy(); // appServices
+
+    // Get the number of selected contacts
+    MVPbkContactLinkArray* selected = 
+        aControl.SelectedContactsOrFocusedContactL();
+    CleanupDeletePushL( selected );
+    if ( selected ) // selected is NULL if the names list is empty
+        {
+        count = selected->Count();
+        }
+    else
+        {
+        count = KNoContacts;
+        }
+
+    // Construct a second URI array for all the writable stores
+    // of selected contacs
+    CVPbkContactStoreUriArray* writablesInSelected =
+        CVPbkContactStoreUriArray::NewLC();
+    for ( TInt i = 0; i < count; ++i )
+        {
+        const MVPbkContactStoreProperties& props =
+            selected->At(i).ContactStore().StoreProperties();
+        // If the store is not readonly and it is not allready in the array,
+        // add it there
+        if ( !props.ReadOnly() && !writablesInSelected->IsIncluded
+                ( props.Uri() ) )
+            {
+            writablesInSelected->AppendL( props.Uri() );
+            }
+        }
+
+    if ( writablesInSelected->Count() == KOneStore )
+        {
+        // The contact selection contains contacts only from one writable
+        // store. Remove that store from the target count.
+        targets->Remove( ( *writablesInSelected )[0] );
+        }
+
+    CleanupStack::PopAndDestroy( 2 ); // selected, writablesInSelected
+    return targets;
+    }
+
+//  End of File