--- /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 <CVPbkContactStoreList.h>
+#include <cvpbkcontactoperationfactory.h>
+#include <CVPbkContactStoreUri.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <CVPbkAsyncOperation.h>
+#include <MVPbkContactStoreObserver.h>
+#include <RLocalizedResourceFile.h>
+#include <VPbkUtil.h>
+#include <VPbkDataCaging.hrh>
+#include <VPbkCntModelRes.rsg>
+#include <VPbkStoreUriLiterals.h>
+
+#include <cntdb.h>
+#include <cntitem.h>
+#include <barsc.h>
+#include <barsread.h>
+#include <shareddataclient.h>
+
+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<TStoreDomainParam*>(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<MVPbkStoreContact*>& 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<MVPbkContactOperationFactory2*>( 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