diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ServerApplication/src/CPbk2ServerAppStoreManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2ServerAppStoreManager.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,421 @@ +/* +* 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 server application contact store manager. +* +*/ + + +#include "CPbk2ServerAppStoreManager.h" + +// Phonebook 2 +#include "mpbk2serverappstartupobserver.h" +#include "CPbk2ServerAppMonitor.h" +#include "CPbk2ServerAppAppUi.h" +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::CPbk2ServerAppStoreManager +// -------------------------------------------------------------------------- +// +CPbk2ServerAppStoreManager::CPbk2ServerAppStoreManager + ( CPbk2StoreManager& aStoreManager, + CVPbkContactManager& aContactManager ) : + iStoreManager( aStoreManager ), + iContactManager( aContactManager ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::~CPbk2ServerAppStoreManager +// -------------------------------------------------------------------------- +// +CPbk2ServerAppStoreManager::~CPbk2ServerAppStoreManager() + { + iStoreManager.DeregisterStoreEvents( *this ); + iOpenedStores.Reset(); + iOpenedStores.Close(); + delete iSortOrderAcquirer; + delete iMonitor; + delete iFetchView; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ConstructL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::ConstructL() + { + iStoreManager.RegisterStoreEventsL( *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::NewL +// -------------------------------------------------------------------------- +// +CPbk2ServerAppStoreManager* CPbk2ServerAppStoreManager::NewL + ( CPbk2StoreManager& aStoreManager, + CVPbkContactManager& aContactManager ) + { + CPbk2ServerAppStoreManager* self = + new ( ELeave ) CPbk2ServerAppStoreManager + ( aStoreManager, aContactManager ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::LoadAndOpenContactStoresL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::LoadAndOpenContactStoresL + ( CVPbkContactStoreUriArray& aStoreUris, + MPbk2ServerAppStartupObserver& aObserver, + TBool aLoadSavingMemoriesAlways ) + { + if ( aLoadSavingMemoriesAlways ) + { + TVPbkContactStoreUriPtr ptr + ( VPbkContactStoreUris::DefaultCntDbUri() ); + if ( !aStoreUris.IsIncluded( ptr ) ) + { + iContactManager.LoadContactStoreL( ptr ); + } + iStoreManager.EnsureDefaultSavingStoreIncludedL(); + } + + const TInt count( aStoreUris.Count() ); + for ( TInt i = 0; i < count; ++i ) + { + iContactManager.LoadContactStoreL( aStoreUris[i] ); + } + + iMonitor = CPbk2ServerAppMonitor::NewL + ( iContactManager.ContactStoresL(), aObserver ); + iMonitor->RegisterEventsL( aObserver ); + iMonitor->StartupBeginsL(); + + iStoreManager.OpenStoresL(); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::BuildFetchViewL +// -------------------------------------------------------------------------- +// +MVPbkContactViewBase* CPbk2ServerAppStoreManager::BuildFetchViewL + ( TVPbkContactViewType aViewType, + const CVPbkContactStoreUriArray& aStoreUris, + CVPbkFieldTypeSelector* aViewFilter, + CPbk2StorePropertyArray& aStoreProperties, + const CPbk2SortOrderManager& aSortOrderManager, + const TUint32 aFlags ) + { + MVPbkContactViewBase* result = NULL; + + CPbk2ContactViewBuilder* viewBuilder = CPbk2ContactViewBuilder::NewLC + ( iContactManager, aStoreProperties ); + + if ( aViewType == EVPbkContactsView ) + { + result = viewBuilder->CreateContactViewForStoresLC + ( aStoreUris, *this, aSortOrderManager.SortOrder(), + aViewFilter, aFlags ); + CleanupStack::Pop(); // result + } + else if ( aViewType == EVPbkGroupsView ) + { + 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 + + result = viewBuilder->CreateGroupViewForStoresLC + ( aStoreUris, *this, *sortOrder, + aViewFilter, aFlags ); + CleanupStack::Pop(); // result + } + + CleanupStack::PopAndDestroy(); // viewBuilder + + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::RemoveReadOnlyStoreUris +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::RemoveReadOnlyStoreUris + ( CVPbkContactStoreUriArray& aStoreUriArray, + CPbk2StorePropertyArray& aStoreProperties ) const + { + // Browse the list backwards + for ( TInt i( aStoreUriArray.Count()-1 ); i >= 0; --i ) + { + const CPbk2StoreProperty* storeProperty = + aStoreProperties.FindProperty( aStoreUriArray[i] ); + + if ( storeProperty && !( storeProperty->Flags() & KPbk2DefaultSavingStorageItem ) ) + { + // Remove read only URI from the array + aStoreUriArray.Remove( aStoreUriArray[i] ); + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::IsContactIncludedInCurrentConfigurationL +// -------------------------------------------------------------------------- +// +TBool CPbk2ServerAppStoreManager::IsContactIncludedInCurrentConfigurationL + ( const MVPbkStoreContact& aContact, + const CPbk2StoreConfiguration& aStoreConfiguration ) const + { + TBool result = EFalse; + + TVPbkContactStoreUriPtr contactUri = + aContact.ParentStore().StoreProperties().Uri(); + + CVPbkContactStoreUriArray* currentConfig = + aStoreConfiguration.CurrentConfigurationL(); + CleanupStack::PushL( currentConfig ); + + if ( currentConfig->IsIncluded( contactUri ) ) + { + result = ETrue; + } + + CleanupStack::PopAndDestroy( currentConfig ); + + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ContactsAvailableL +// -------------------------------------------------------------------------- +// +TBool CPbk2ServerAppStoreManager::ContactsAvailableL + ( const MVPbkContactLinkArray& aContactLinks ) const + { + TBool ret = ETrue; + + CVPbkContactStoreUriArray* validStores = CurrentlyValidStoresL(); + + for ( TInt i = 0; i < aContactLinks.Count(); ++ i ) + { + const MVPbkContactLink& link = aContactLinks.At( i ); + if ( !validStores->IsIncluded + ( link.ContactStore().StoreProperties().Uri() ) ) + { + ret = EFalse; + break; + } + } + + delete validStores; + return ret; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::CurrentlyValidStoresL +// -------------------------------------------------------------------------- +// +CVPbkContactStoreUriArray* + CPbk2ServerAppStoreManager::CurrentlyValidStoresL() const + { + CVPbkContactStoreUriArray* uris = CVPbkContactStoreUriArray::NewLC(); + + const TInt count = iOpenedStores.Count(); + for ( TInt i = 0 ; i < count; ++i ) + { + uris->AppendL( iOpenedStores[i]->StoreProperties().Uri() ); + } + + CleanupStack::Pop( uris ); + return uris; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ContactViewReady +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::ContactViewReady + ( MVPbkContactViewBase& /*aView*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ContactViewUnavailable +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::ContactViewUnavailable + ( MVPbkContactViewBase& /*aView*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ContactAddedToView +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::ContactAddedToView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ContactRemovedFromView +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::ContactRemovedFromView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::ContactViewError +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::ContactViewError + ( MVPbkContactViewBase& /*aView*/, TInt /*aError*/, + TBool /*aErrorNotified*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::StoreReady +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::StoreReady + ( MVPbkContactStore& aContactStore ) + { + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPbk2ServerAppStoreManager::StoreReady(0x%x)"), + &aContactStore); + + // Add the store to the open stores list + if ( iOpenedStores.Find( &aContactStore ) == KErrNotFound ) + { + iOpenedStores.Append( &aContactStore ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::StoreUnavailable +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::StoreUnavailable + ( MVPbkContactStore& aContactStore, TInt aReason ) + { + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPbk2ServerAppStoreManager::StoreUnavailable(0x%x,%d)"), + &aContactStore, aReason); + + // Remove the store from the open store list if it is there + const TInt index = iOpenedStores.Find( &aContactStore ); + if ( index != KErrNotFound ) + { + iOpenedStores.Remove( index ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppStoreManager::HandleStoreEventL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppStoreManager::HandleStoreEventL + ( MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent /*aEvent*/ ) + { + // Do nothing + } + +// End of File