diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkCntModel/src/CContactStoreDomain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CContactStoreDomain.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2004-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: Maps a Contact Model databases to a virtual Phonebook contact. +* +*/ + + +// INCLUDES +#include "CContactStoreDomain.h" + +#include "CFieldTypeMap.h" +#include "CAsyncContactOperation.h" +#include "CContact.h" +#include "CContactLink.h" +#include "CContactView.h" +#include "CContactStore.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace VPbkCntModel { + +// LOCAL +namespace { + +// CONSTANTS +_LIT(KVPbkCntModelResFile, "VPbkCntModelRes.rsc"); + +} // unnamed namespace + +CContactStoreDomain::CContactStoreDomain(const MVPbkFieldTypeList& aMasterFieldTypeList) : + iMasterFieldTypeList(aMasterFieldTypeList) + { + } + +inline void CContactStoreDomain::ConstructL( + const CVPbkContactStoreUriArray& aURIList, + const TDesC& aURIDomain, + CFieldTypeMap* aFieldTypeMap) + { + User::LeaveIfError(iFs.Connect()); + + RProcess process; + if ( process.HasCapability(ECapabilityReadDeviceData, ECapabilityWriteDeviceData, + __PLATSEC_DIAGNOSTIC_STRING("Virtual Phonebook client missing capabilities to \ + free disk space during compress/delete operations")) ) + { + // Shared data objects have to created after connecting RFs, + // but before reading resources + iSharedDataClient = new (ELeave) RSharedDataClient; + User::LeaveIfError( iSharedDataClient->Connect() ); + } + + if (!aFieldTypeMap) + { + iTextStore = new(ELeave) VPbkEngUtils::CTextStore; + + // load Versit field type mappings + VPbkEngUtils::RLocalizedResourceFile resFile; + + resFile.OpenLC(iFs, KVPbkRomFileDrive, KDC_RESOURCE_FILES_DIR, KVPbkCntModelResFile); + + iFieldTypeMap = VPbkCntModel::CFieldTypeMap::NewL(iMasterFieldTypeList, *iTextStore); + TResourceReader resReader; + // initialize the field type map with versit name mapping data + resReader.SetBuffer(resFile.AllocReadLC(R_VERSIT_NAME_FIELD_TYPE_MAPPINGS)); + iFieldTypeMap->InitVersitNameMappingsL(resReader); + CleanupStack::PopAndDestroy(); // R_VERSIT_NAME_FIELD_TYPE_MAPPINGS buffer + + // initialize the field type map with versit parameter mapping data + resReader.SetBuffer(resFile.AllocReadLC(R_VERSIT_PARAM_FIELD_TYPE_MAPPINGS)); + iFieldTypeMap->InitVersitParameterMappingsL(resReader); + CleanupStack::PopAndDestroy(); // R_VERSIT_PARAM_FIELD_TYPE_MAPPINGS buffer + + // initialize the field type map with non versit field type mapping data + resReader.SetBuffer(resFile.AllocReadLC(R_NONVERSIT_FIELD_TYPE_MAPPINGS)); + iFieldTypeMap->InitNonVersitMappingsL(resReader); + CleanupStack::PopAndDestroy(2); + } + + // Create the store list + iContactStoreList = CVPbkContactStoreList::NewL(); + // Load all Contacts Model stores + TVPbkContactStoreUriPtr defaultDb( KVPbkDefaultCntDbURI ); + const TPtrC domain = defaultDb.Component( + TVPbkContactStoreUriPtr::EContactStoreUriStoreType ); + const TInt uriCount = aURIList.Count(); + for (TInt i = 0; i < uriCount; ++i) + { + if ( aURIList[i].Compare( domain, + TVPbkContactStoreUriPtr::EContactStoreUriStoreType ) == 0 ) + { + LoadContactStoreL( aURIList[i] ); + } + } + + // Create multioperation factory + iOperationFactory = CVPbkContactOperationFactory::NewL( + *iContactStoreList ); + + iDomainDescriptor = aURIDomain.AllocL(); + + // Take ownership of aFieldTypeMap in the end as described in the header. + if (aFieldTypeMap) + { + iFieldTypeMap = aFieldTypeMap; + } + } + +CContactStoreDomain* CContactStoreDomain::NewL + (const CVPbkContactStoreUriArray& aURIList, + const TDesC& aURIDomain, + const MVPbkFieldTypeList& aMasterFieldTypeList, + CFieldTypeMap* aFieldTypeMap) + { + CContactStoreDomain* self = new(ELeave) CContactStoreDomain(aMasterFieldTypeList); + CleanupStack::PushL(self); + self->ConstructL(aURIList, aURIDomain, aFieldTypeMap); + CleanupStack::Pop(self); + return self; + } + +CContactStoreDomain* CContactStoreDomain::NewL( + TAny* aParam) + { + TStoreDomainParam* param = static_cast(aParam); + return NewL(param->iURIList, *param->iURIDomain, *param->iFieldTypeList, NULL); + } + +CContactStoreDomain::~CContactStoreDomain() + { + delete iDomainDescriptor; + delete iOperationFactory; + delete iContactStoreList; + delete iFieldTypeMap; + delete iTextStore; + + if ( iSharedDataClient ) + { + iSharedDataClient->Close(); + } + delete iSharedDataClient; + + iFs.Close(); + } + +const TDesC& CContactStoreDomain::UriDomain() const + { + return *iDomainDescriptor; + } + +void CContactStoreDomain::LoadContactStoreL(const TVPbkContactStoreUriPtr& aUri) + { + if (!Find(aUri)) + { + CContactStore* store = CContactStore::NewL(aUri, *this); + CleanupStack::PushL(store); + iContactStoreList->AppendL(store); + CleanupStack::Pop(store); + } + } + +TInt CContactStoreDomain::Count() const + { + return iContactStoreList->Count(); + } + +MVPbkContactStore& CContactStoreDomain::At(TInt aIndex) const + { + return iContactStoreList->At(aIndex); + } + +MVPbkContactStore* CContactStoreDomain::Find(const TVPbkContactStoreUriPtr& aUri) const + { + return iContactStoreList->Find(aUri); + } + +void CContactStoreDomain::OpenAllL(MVPbkContactStoreListObserver& aObserver) + { + iContactStoreList->OpenAllL(aObserver); + } + +void CContactStoreDomain::CloseAll(MVPbkContactStoreListObserver& aObserver) + { + iContactStoreList->CloseAll(aObserver); + } + +MVPbkContactOperation* CContactStoreDomain::CreateContactRetrieverL + (const MVPbkContactLink& aLink, + MVPbkSingleContactOperationObserver& aObserver) + { + // test if aLink is in fact a instance of this domain + MVPbkContactOperation* operation = NULL; + if (CContactLink::Matches(*iDomainDescriptor, aLink, + TVPbkContactStoreUriPtr::EContactStoreUriStoreType)) + { + operation = iOperationFactory->CreateContactRetrieverL(aLink, aObserver); + } + return operation; + } + +MVPbkContactOperation* CContactStoreDomain::CreateDeleteContactsOperationL( + const MVPbkContactLinkArray& aContactLinks, + MVPbkBatchOperationObserver& aObserver) + { + return iOperationFactory->CreateDeleteContactsOperationL( aContactLinks, + aObserver); + } + +MVPbkContactOperation* CContactStoreDomain::CreateCommitContactsOperationL( + const TArray& aContacts, + MVPbkBatchOperationObserver& aObserver) + { + return iOperationFactory->CreateCommitContactsOperationL( aContacts, + aObserver ); + } + +MVPbkContactOperation* CContactStoreDomain::CreateMatchPhoneNumberOperationL( + const TDesC& aPhoneNumber, + TInt aMaxMatchDigits, + MVPbkContactFindObserver& aObserver) + { + return iOperationFactory->CreateMatchPhoneNumberOperationL( aPhoneNumber, + aMaxMatchDigits, aObserver ); + } + +MVPbkContactOperation* CContactStoreDomain::CreateFindOperationL( + const TDesC& aSearchString, + const MVPbkFieldTypeList& aFieldTypes, + MVPbkContactFindObserver& aObserver) + { + return iOperationFactory->CreateFindOperationL( aSearchString, + aFieldTypes, aObserver ); + } + +MVPbkContactOperation* CContactStoreDomain::CreateFindOperationL( + const MDesC16Array& aSearchStrings, + const MVPbkFieldTypeList& aFieldTypes, + MVPbkContactFindFromStoresObserver& aObserver, + const TCallBack& aWordParserCallBack ) + { + return iOperationFactory->CreateFindOperationL( aSearchStrings, + aFieldTypes, aObserver, aWordParserCallBack ); + } + + +TAny* CContactStoreDomain::ContactOperationFactoryExtension( TUid aExtensionUid ) + { + if ( aExtensionUid == KMVPbkContactOperationFactory2Uid ) + { + return static_cast( this ); + } + return NULL; + } + + +MVPbkContactOperation* CContactStoreDomain::CreateFindOperationL( + const MDesC16Array& aSearchStrings, + const MVPbkFieldTypeList& aFieldTypes, + MVPbkContactFindFromStoresObserver& aObserver, + const TCallBack& aWordParserCallBack, + const CDesC16ArrayFlat& aStoreEntriesArray ) + { + return iOperationFactory->CreateFindOperationL( aSearchStrings, + aFieldTypes, aObserver, aWordParserCallBack, aStoreEntriesArray ); + } + +MVPbkContactOperation* CContactStoreDomain::CreateCompressStoresOperationL( + MVPbkBatchOperationObserver& aObserver) + { + return iOperationFactory->CreateCompressStoresOperationL( aObserver ); + } + +} // namespace VPbkCntModel +//End of file