--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommonUI/src/CPbk2ContactViewSupplier.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,454 @@
+/*
+* 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: Phonebook 2 store manager.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2ContactViewSupplier.h"
+
+// Phonebook 2
+#include "CPbk2CompressPolicyManager.h"
+#include <CPbk2StoreConfiguration.h>
+#include <CPbk2SortOrderManager.h>
+#include <CPbk2ContactViewBuilder.h>
+#include <RPbk2LocalizedResourceFile.h>
+#include <Pbk2CommonUi.rsg>
+#include <Pbk2DataCaging.hrh>
+#include <CPbk2GroupFeaturePlugin.h>
+#include <Pbk2ViewId.hrh>
+#include "CPbk2NonTopContactSelector.h"
+#include "Pbk2ContactView.hrh"
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactViewBase.h>
+#include <CVPbkContactViewDefinition.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <CVPbkSortOrder.h>
+#include <MVPbkFieldType.h>
+#include <CVPbkSortOrderAcquirer.h>
+#include <VPbkSortOrderAcquirerUid.h>
+#include <MVPbkContactViewBaseChildAccessExtension.h>
+
+// System includes
+#include <barsread.h>
+#include <coemain.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_LIT( KGroupSortOrderDisplayName, "AllGroups" );
+
+/**
+ * Custom cleanup function.
+ *
+ * @param aObj Object to clean.
+ */
+void CleanupResetAndDestroy( TAny* aObj )
+ {
+ if ( aObj )
+ {
+ static_cast<RImplInfoPtrArray*>( aObj )->ResetAndDestroy();
+ }
+ }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::CPbk2ContactViewSupplier
+// --------------------------------------------------------------------------
+//
+inline CPbk2ContactViewSupplier::CPbk2ContactViewSupplier
+ ( CVPbkContactManager& aContactManager,
+ CPbk2SortOrderManager& aSortOrderManager,
+ CPbk2StoreConfiguration& aStoreConfiguration,
+ CPbk2StorePropertyArray& aStoreProperties ) :
+ iContactManager( aContactManager ),
+ iSortOrderManager( aSortOrderManager ),
+ iStoreConfiguration( aStoreConfiguration ),
+ iStoreProperties( aStoreProperties )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::~CPbk2ContactViewSupplier
+// --------------------------------------------------------------------------
+//
+CPbk2ContactViewSupplier::~CPbk2ContactViewSupplier()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::~CPbk2ContactViewSupplier(0x%x)"), this);
+
+ if ( iAllContactsView )
+ {
+ iAllContactsView->RemoveObserver( *this );
+ }
+ delete iAllContactsView;
+
+ if ( iAllGroupsView )
+ {
+ iAllGroupsView->RemoveObserver( *this );
+ }
+ delete iAllGroupsView;
+
+ delete iOldContactsView;
+ delete iOldGroupsView;
+ delete iSortOrderAcquirer;
+ delete iNonTopContactSelector;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2ContactViewSupplier::ConstructL
+ ( TBool aActOnConfigurationEvents )
+ {
+ if ( aActOnConfigurationEvents )
+ {
+ // We must be the first observer for the store configuration
+ // in Phonebook 2 framework. That is because all other observers
+ // might ask for a new contact view after the configuration has
+ // changed and since we are the first observer we get the event
+ // last and can control contact views better.
+ iStoreConfiguration.AddObserverL( *this );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2ContactViewSupplier* CPbk2ContactViewSupplier::NewL
+ ( CVPbkContactManager& aContactManager,
+ CPbk2SortOrderManager& aSortOrderManager,
+ CPbk2StoreConfiguration& aStoreConfiguration,
+ CPbk2StorePropertyArray& aStoreProperties,
+ TBool aActOnConfigurationEvents )
+ {
+ CPbk2ContactViewSupplier* self = new (ELeave) CPbk2ContactViewSupplier
+ ( aContactManager, aSortOrderManager, aStoreConfiguration,
+ aStoreProperties );
+ CleanupStack::PushL( self );
+ self->ConstructL( aActOnConfigurationEvents );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::AllContactsViewL
+// --------------------------------------------------------------------------
+//
+MVPbkContactViewBase* CPbk2ContactViewSupplier::AllContactsViewL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::AllContactsViewL"));
+
+ // Creates the view lazyly when the first client needs it
+ if ( !iAllContactsView )
+ {
+ iAllContactsView = CreateAllContactsViewL();
+
+ // Give the view to the sort order manager
+ iSortOrderManager.SetContactViewL( *iAllContactsView );
+ }
+
+ return iAllContactsView;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::TopContactsViewL
+// --------------------------------------------------------------------------
+//
+MVPbkContactViewBase* CPbk2ContactViewSupplier::TopContactsViewL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::TopContactsViewL"));
+
+ MVPbkContactViewBase* topContactsView = NULL;
+ MVPbkContactViewBase* allContactsView = AllContactsViewL();
+ TAny* extAny = allContactsView->ContactViewBaseExtension(
+ TUid::Uid( KVPbkViewBaseExtChildAccess ) );
+ if ( extAny )
+ {
+ MVPbkContactViewBaseChildAccessExtension* ext =
+ static_cast<MVPbkContactViewBaseChildAccessExtension*>(extAny);
+ topContactsView = ext->GetChildViewById(
+ EPbk2MergedTopContactsListPlaceHolder ); // not owned here
+ }
+ return topContactsView;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::AllGroupsViewL
+// --------------------------------------------------------------------------
+//
+MVPbkContactViewBase* CPbk2ContactViewSupplier::AllGroupsViewL()
+ {
+ // Creates the view lazyly when the first client needs it
+ if ( !iAllGroupsView )
+ {
+ iAllGroupsView = CreateAllGroupsViewL();
+ }
+
+ return iAllGroupsView;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::MPbk2ContactViewSupplierExtension
+// --------------------------------------------------------------------------
+//
+TAny* CPbk2ContactViewSupplier::MPbk2ContactViewSupplierExtension(
+ TUid aExtensionUid )
+ {
+ if ( aExtensionUid == KMPbk2ContactViewSupplierExtension2Uid )
+ {
+ return static_cast<MPbk2ContactViewSupplier2*>( this );
+ }
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ContactViewReady
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ContactViewReady
+ ( MVPbkContactViewBase& aView )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::ContactViewReady(0x%x)"), &aView);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ContactViewUnavailable
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ContactViewUnavailable
+ ( MVPbkContactViewBase& aView )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::ContactViewUnavailable(0x%x)"), &aView);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ContactAddedToView
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ContactAddedToView
+ ( MVPbkContactViewBase& aView, TInt aIndex,
+ const MVPbkContactLink& aContactLink )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::ContactAddedToView(0x%x,%d,0x%x)"),
+ &aView, aIndex, &aContactLink);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ContactRemovedFromView
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ContactRemovedFromView
+ ( MVPbkContactViewBase& aView, TInt aIndex,
+ const MVPbkContactLink& aContactLink )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::ContactRemovedFromView(0x%x,%d,0x%x)"),
+ &aView, aIndex, &aContactLink);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ContactViewError
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ContactViewError
+ ( MVPbkContactViewBase& aView,
+ TInt aError, TBool /*aErrorNotified*/ )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::ContactViewError(0x%x,%d)"),
+ &aView, aError);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ConfigurationChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ConfigurationChanged()
+ {
+ TRAPD( err, HandleConfigurationChangedL() );
+ if ( err != KErrNone )
+ {
+ CCoeEnv::Static()->HandleError( err );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::ConfigurationChangedComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::ConfigurationChangedComplete()
+ {
+ delete iOldContactsView;
+ iOldContactsView = NULL;
+ delete iOldGroupsView;
+ iOldGroupsView = NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::HandleConfigurationChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactViewSupplier::HandleConfigurationChangedL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::HandleConfigurationChangedL(0x%x)"),
+ this);
+
+ MVPbkContactViewBase* allContactsView = CreateAllContactsViewL();
+ CleanupDeletePushL( allContactsView );
+ iSortOrderManager.SetContactViewL( *allContactsView );
+
+ MVPbkContactViewBase* allGroupsView = NULL;
+ if ( iAllGroupsView )
+ {
+ allGroupsView = CreateAllGroupsViewL();
+ }
+
+ CleanupStack::Pop(); // allContactsView
+
+ // All leaving stuff done, switch the views
+
+ if ( iAllContactsView )
+ {
+ iAllContactsView->RemoveObserver( *this );
+ delete iOldContactsView;
+ iOldContactsView = iAllContactsView;
+ }
+ iAllContactsView = allContactsView;
+
+ if ( iAllGroupsView )
+ {
+ iAllGroupsView->RemoveObserver( *this );
+ delete iOldGroupsView;
+ iOldGroupsView = iAllGroupsView;
+ }
+ iAllGroupsView = allGroupsView;
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ( "CPbk2ContactViewSupplier::HandleConfigurationChangedL(0x%x) end" ),
+ this );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::CreateAllContactsViewL
+// --------------------------------------------------------------------------
+//
+MVPbkContactViewBase* CPbk2ContactViewSupplier::CreateAllContactsViewL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::CreateAllContactsViewL(0x%x)"), this);
+
+ CPbk2ContactViewBuilder* viewBuilder = CPbk2ContactViewBuilder::NewLC
+ ( iContactManager, iStoreProperties );
+
+ CVPbkContactStoreUriArray* currentConfig =
+ iStoreConfiguration.CurrentConfigurationL();
+
+ CleanupStack::PushL( currentConfig );
+
+
+ if ( !iNonTopContactSelector )
+ {
+ iNonTopContactSelector = CPbk2NonTopContactSelector::NewL();
+ }
+ MVPbkContactViewBase* result = viewBuilder->CreateTopNonTopContactViewForStoresLC
+ ( *currentConfig, *this, iSortOrderManager.SortOrder(), NULL, EVPbkContactViewFlagsNone, *iNonTopContactSelector );
+ CleanupStack::Pop(); // result
+ CleanupStack::PopAndDestroy( 2 ); // currentConfig, viewBuilder
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2ContactViewSupplier::CreateAllContactsViewL(0x%x) end"), this);
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewSupplier::CreateAllGroupsViewL
+// --------------------------------------------------------------------------
+//
+MVPbkContactViewBase* CPbk2ContactViewSupplier::CreateAllGroupsViewL()
+ {
+ MVPbkContactViewBase* result = NULL;
+ const MVPbkFieldTypeList* sortOrder = NULL;
+
+ // Acquire group sort order
+ RImplInfoPtrArray implementations;
+ REComSession::ListImplementationsL
+ ( TUid::Uid( KVPbkSortOrderAcquirerInterfaceUID ), implementations );
+ CleanupStack::PushL( TCleanupItem
+ ( CleanupResetAndDestroy, &implementations ) );
+
+ TBool found = EFalse;
+ const TInt count = implementations.Count();
+ for ( TInt i = count - 1; i >= 0 && !found ; --i )
+ {
+ CImplementationInformation* implInfo = implementations[i];
+
+ if ( implInfo->DisplayName().
+ CompareC( KGroupSortOrderDisplayName ) == 0 )
+ {
+ TUid implUid = implInfo->ImplementationUid();
+
+ CVPbkSortOrderAcquirer::TSortOrderAcquirerParam param
+ ( iContactManager.FieldTypes() );
+
+ delete iSortOrderAcquirer;
+ iSortOrderAcquirer = NULL;
+ iSortOrderAcquirer = CVPbkSortOrderAcquirer::NewL
+ ( implUid, param );
+ sortOrder = &iSortOrderAcquirer->SortOrder();
+ found = ETrue;
+ }
+
+ }
+ CleanupStack::PopAndDestroy(); // implementations
+
+ if ( sortOrder )
+ {
+ CPbk2ContactViewBuilder* viewBuilder = CPbk2ContactViewBuilder::NewLC
+ ( iContactManager, iStoreProperties );
+
+ CVPbkContactStoreUriArray* currentConfig =
+ iStoreConfiguration.CurrentConfigurationL();
+ CleanupStack::PushL( currentConfig );
+
+ result = viewBuilder->CreateGroupViewForStoresLC
+ ( *currentConfig, *this, *sortOrder, NULL,
+ EVPbkContactViewFlagsNone );
+
+ CleanupStack::Pop(); // result
+ CleanupStack::PopAndDestroy( 2 ); // currentConfig, viewBuilder
+ }
+
+ return result;
+ }
+
+// End of File