diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/CommonUI/src/CPbk2ContactViewSupplier.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include "CPbk2NonTopContactSelector.h" +#include "Pbk2ContactView.hrh" + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include +#include + +// Debugging headers +#include + +/// 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( 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(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( 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