diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,265 @@ +// Copyright (c) 2004-2009 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: +// + +/** + @file + @internalComponent + @released +*/ + +#include "persistencelayerimpl.h" +#include // for ccontactfieldstorage. +#include "clplcontactproperties.h" +#include "clplanalyserproxy.h" +#include "cntpplviewmanager.h" + +/** +CLplTester constructor. +*/ +CLplTester::CLplTester(CLplContactProperties& aProps, CPplContactsFile& aFile) + : + iProps(aProps), + iFile(aFile) + { + } + +/** +Merging pure (minimal) contact with the template should be out of scope of the +Persistence Layer. The only reason to have this functions in the test interface +is that CContactItem::RestoreTemplateFieldsL() is not exported. +*/ +void CLplTester::MergeContactWithTemplateL(CContactItem& aContact, const CContactItem& aTempl, const CContactItemViewDef& aView) const + { + if (aContact.TemplateRefId()!=KNullContactId && aContact.Type() != KUidContactCardTemplate) + { + aContact.RestoreTemplateFieldsL(iProps.SystemTemplateL().CardFields(), aTempl.CardFields(), aView); + } + } + +/** +CPersistenceLayer object factory. +*/ +EXPORT_C CPersistenceLayer* CPersistenceLayer::NewLC(RFs& aFs, MIniFileManager* aIniFileManager, MContactDbObserver* aObserver) + { + CPersistenceLayer* self = new (ELeave) CPersistenceLayer(aFs, aIniFileManager, aObserver); + CleanupStack::PushL(self); + return self; + } + + +/** +CPersistenceLayer first phase constructor. +*/ +CPersistenceLayer::CPersistenceLayer(RFs& aFs, MIniFileManager* aIniFileManager, MContactDbObserver* aObserver) + : + iFs(aFs), + iCntDbObserver(aObserver), + iIniManager(aIniFileManager) + { + } + + + +/** +CPersistenceLayer destructor. +*/ +CPersistenceLayer::~CPersistenceLayer() + { + if (iFactory) + { + delete iFactory; + } + if (iContactProperties) + { + delete iContactProperties; + } + if (iAnalyserProxy) + { + delete iAnalyserProxy; + } + if (iTester) + { + delete iTester; + } + + // May not be a file opened by Persistence Layer. + if (iContactsFile) + { + // Don't call iContactsFile.Close() since the destructor does it. + delete iContactsFile; + } + } + + +/** +Set the database observer. +*/ +EXPORT_C void CPersistenceLayer::RegisterDbObserver(MContactDbObserver& aDbObserver) + { + // Note the callback interface supplied. + iCntDbObserver = &aDbObserver; + + // Contacts file should always exist. + iContactsFile->RegisterDbObserver(aDbObserver); + + // If the ini manager exists and the analyser proxy does not yet exist then + // create the proxy. + if (iIniManager && !iAnalyserProxy) + { + // This used to call new (ELeave). We don't check for NULL afterwards as we + // can't do anything about it. If an allocation failure occurs and the users + // of iAnalyserProxy do not check for NULL, cntsrv.exe will now panic. + iAnalyserProxy = new CLplAnalyserProxy(*iIniManager, + *iCntDbObserver, iContactsFile->PersistenceBroker(), + iContactsFile->TransactionManager(), *iContactProperties); + } + } + + +EXPORT_C MLplContactsFile& CPersistenceLayer::ContactsFileL() + { + if (!iContactsFile) + { + iContactProperties = new (ELeave) CLplContactProperties(iFs); + CleanupStack::PushL(TCleanupItem(CleanupOperation, this)); + iContactsFile = CPplContactsFile::NewL(*iContactProperties, iCntDbObserver); + CleanupStack::PushL(TCleanupItem(CleanupOperation, this)); + + if (iIniManager && iCntDbObserver) // Callback interfaces supplied? + { + iAnalyserProxy = new (ELeave) CLplAnalyserProxy(*iIniManager, + *iCntDbObserver, iContactsFile->PersistenceBroker(), + iContactsFile->TransactionManager(), *iContactProperties); + } + CleanupStack::Pop(2); + } + return *iContactsFile; + } + +void CPersistenceLayer::CleanupOperation(TAny* aObject) + { + CPersistenceLayer* persitenceLayer = static_cast(aObject); + if (persitenceLayer->iContactProperties) + { + delete persitenceLayer->iContactProperties; + persitenceLayer->iContactProperties = NULL; + } + if (persitenceLayer->iContactsFile) + { + delete persitenceLayer->iContactsFile; + persitenceLayer->iContactsFile = NULL; + } + } + +EXPORT_C MLplPersistenceBroker& CPersistenceLayer::PersistenceBroker() + { + // Use analyser proxy if it exists. + if (iAnalyserProxy) + { + return *iAnalyserProxy; + } + else + { + return iContactsFile->PersistenceBroker(); + } + } + + +EXPORT_C MLplTransactionManager& CPersistenceLayer::TransactionManager() + { + // In order to use the Persistence Broker you must open the database first. + __ASSERT_ALWAYS(iContactsFile && iContactsFile->IsOpened(), User::Leave(KErrNotReady)); + + // Use analyser proxy if it exists. + if (iAnalyserProxy) + { + return *iAnalyserProxy; + } + else + { + return iContactsFile->TransactionManager(); + } + } + + +EXPORT_C MLplContactProperties& CPersistenceLayer::ContactProperties() + { + // In order to use Contact Properties you must open the database first. + __ASSERT_ALWAYS(iContactProperties, User::Leave(KErrNotReady)); + + // If contacts file is created iContactProperties is also created. + return *iContactProperties; + } + + +EXPORT_C MLplPersistenceLayerFactory& CPersistenceLayer::FactoryL() + { + if(iFactory == NULL) + { + iFactory = new (ELeave) CLplPersistenceLayerFactory( + *iContactsFile,*iContactProperties); + } + return *iFactory; + } + + +CLplPersistenceLayerFactory::~CLplPersistenceLayerFactory() + { + delete iCollection; + delete iManager; + } + + +CLplPersistenceLayerFactory::CLplPersistenceLayerFactory(CPplContactsFile& aContactsFile,CLplContactProperties& aContactProperties) : + iContactsFile(aContactsFile), + iContactProperties(aContactProperties) + { + } + + +MLplViewIteratorManager& CLplPersistenceLayerFactory::GetViewIteratorManagerL() + { + if(iManager == NULL) + { + iManager = CCntPplViewManager::NewL(iContactsFile, iContactProperties); + } + return *iManager; + } + + +MContactSynchroniser& CLplPersistenceLayerFactory::GetContactSynchroniserL(TUint aSessionId) + { + return iContactProperties.ContactSynchroniserL(aSessionId); + } + + +MLplCollection& CLplPersistenceLayerFactory::GetCollectorL() + { + if(iCollection == NULL) + { + iCollection = CPlCollection::NewL(iContactsFile); + } + return *iCollection; + } + + +EXPORT_C MLplPersistenceLayerTest& CPersistenceLayer::PersistenceLayerTestL() + { + if (!iTester) + { + iTester = new (ELeave) CLplTester(*iContactProperties, *iContactsFile); + } + return *iTester; + }