phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/cntplsql/src/cplpersistencebroker.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -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;
+	}