phonebookengines/VirtualPhonebook/VPbkCntModel/src/CContactStoreDomain.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /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