--- /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 <cntfldst.h> // 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<CPersistenceLayer*>(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;
+ }