pimprotocols/phonebooksync/Server/PhonebookManager.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/phonebooksync/Server/PhonebookManager.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1711 @@
+// Copyright (c) 2002-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:
+// Contains method implementations for Phonebook Synchroniser's
+// CPhoneBookManager class which manages the parameters for the phone and
+// each phonebook, including the Look-Up Tables, Phonebook store handles
+// and flags for the synchroniser engine.
+// This class can be accessed from either the server side or engine side.
+// All applicable functions are mutex protected to prevent corruption from
+// being accessed simutantiously from two threads. CPhoneBook is not protected
+// hence why CPhoneBookManager does not give out the CPhoneBook object pointers,
+// but performs all operations itself, with mutex protection.
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "phbksync.h"
+#include "PhonebookManager.h"
+#include "SyncContactICCEntry.h"
+#include "phbksyncsvr.h"
+#include "phbksynclog.h"
+
+
+/**
+ *  Static factory method used to create a CPhoneBookManager object.
+ *
+ *  @param aICCCaps  The capabilities of the ICC.
+ *
+ *  @return  Pointer to the created CPhoneBookManager object, or NULL.
+ */
+CPhoneBookManager* CPhoneBookManager::NewL(TUint32 aICCCaps)
+	{
+	CPhoneBookManager*  ptr = new (ELeave) CPhoneBookManager();
+	CleanupStack::PushL(ptr);
+	ptr->ConstructL(aICCCaps);
+	CleanupStack::Pop(ptr);
+	return ptr;
+	} // CPhoneBookManager::NewL
+
+
+/**
+ *  Standard constructor.
+ */
+CPhoneBookManager::CPhoneBookManager()
+  : iMutex(),
+  	iPhonebookList(),
+  	iIniFile(NULL),
+	iIsPuk1Verified(ETrue),
+	iPin1LockStatus(RMobilePhone::EStatusLockUnknown),
+	iPin2LockStatus(RMobilePhone::EStatusLockUnknown),
+	iHiddenKeyLockStatus(RMobilePhone::EStatusLockUnknown),
+	iUsimAppLockStatus(RMobilePhone::EStatusLockUnknown),
+	iUsimUniversalPinLockStatus(RMobilePhone::EStatusLockUnknown)
+	{
+	// NOP
+	} // CPhoneBookManager::CPhoneBookManager
+
+
+/**
+ *  Standard denstructor.
+ */
+CPhoneBookManager::~CPhoneBookManager()
+	{
+	delete iIniFile;
+	iPhonebookList.ResetAndDestroy();
+	iMutex.Close();
+	} // CPhoneBookManager::~CPhoneBookManager
+
+
+/**
+ *  Construct the list containing a table of parameters associated with each
+ *  supported phonebook.  The list is constructed according to the type of the
+ *  ICC specified by the aICCCaps parameter.
+ *
+ *  @note  The tables for supported phonebooks are created and added in the
+ *         priority order. Therefore the global ADN will be synchronised first
+ *         if its auto-sync setting is set.
+ *
+ *  @param aICCCaps  ICC caps indicating the type of ICC. 
+ */
+void CPhoneBookManager::ConstructL(TUint32 aICCCaps)
+	{
+	LOGPARAMS2(_L8("ConstructL(0x%08x)"), aICCCaps);
+	
+	//
+	// Create the mutex which will protect the shared data...
+	//
+	iMutex.CreateLocal();
+	
+	//
+	// By default following phonebook types are supported for all ICC types (SIM, R-UIM and USIM)
+	//
+	CPhoneBook*  ADNphonebook = CPhoneBook::NewL(KUidIccGlobalAdnPhonebook);
+	iPhonebookList.Append(ADNphonebook);
+
+	CPhoneBook*  SDNphonebook = CPhoneBook::NewL(KUidIccGlobalSdnPhonebook);
+	iPhonebookList.Append(SDNphonebook);
+
+	CPhoneBook*  LNDphonebook = CPhoneBook::NewL(KUidIccGlobalLndPhonebook);
+	iPhonebookList.Append(LNDphonebook);
+
+	// 3GPP USIM specific phonebook 
+	if (aICCCaps & RMobilePhone::KCapsUSimAccessSupported)
+		{
+		CPhoneBook*  USIMphonebook = CPhoneBook::NewL(KUidUsimAppAdnPhonebook);
+		iPhonebookList.Append(USIMphonebook);
+		}
+
+	CPhoneBook*  FDNphonebook = CPhoneBook::NewL(KUidIccGlobalFdnPhonebook);
+	iPhonebookList.Append(FDNphonebook);
+
+	//
+	// Create the INI File class...
+	//
+	iIniFile = CPhoneBookIniFile::NewL(iPhonebookList);
+	} // CPhoneBookManager::ConstructL
+
+
+/**
+ *  Gets the phonebook UID for the phonebook that contains the supplied
+ *  Contact UID. Phonebooks are searched in order.
+ *
+ *  @param aContactId  Contact ID to search for.
+ *
+ *  @return The phonebook UID of the containing phonebook, or
+ *          KUidIccPhonebookNotSpecified.
+ */
+TUid CPhoneBookManager::GetPhonebookUidFromContactId(TContactItemId aContactId)
+	{
+	LOGPARAMS2(_L8("GetPhonebookUidFromContactId(0x%08x)"), aContactId);
+
+	TInt  count(iPhonebookList.Count());
+	TUid  result(KUidIccPhonebookNotSpecified);
+	
+	AcquireMutex();
+
+	for (TInt index = 0;  index < count;  index++)
+		{
+		TInt  slotNum = iPhonebookList[index]->GetSlotNumFromContactId(aContactId);
+		
+		if (slotNum > 0)
+			{
+			result = iPhonebookList[index]->GetPhonebookUid();
+			break;
+			}
+		}
+
+	ReleaseMutex();
+		
+	return result;
+	} // CPhoneBookManager::GetPhonebookUidFromContactId
+
+
+/**
+ *  Return the phonebook type for the given template ID.
+ *
+ *  @param aTemplateId  The template ID associated with the phonebook.
+ *
+ *  @return TUid  UID for the phonebook or KUidIccPhonebookNotSpecified.
+ */
+TUid CPhoneBookManager::GetPhonebookUidFromTemplateId(TContactItemId aTemplateId)
+	{
+	LOGPARAMS2(_L8("GetPhonebookUidFromTemplateId(0x%08x)"), aTemplateId);
+
+	TInt  count(iPhonebookList.Count());
+	TUid  result(KUidIccPhonebookNotSpecified);
+	
+	AcquireMutex();
+
+	for (TInt index = 0;  index < count;  index++)
+		{
+		if (iPhonebookList[index]->GetTemplateId() == aTemplateId)
+			{
+			result = iPhonebookList[index]->GetPhonebookUid();
+			break;
+			}
+		}
+
+	ReleaseMutex();
+		
+	return result;
+	} // CPhoneBookManager::GetPhonebookUidFromTemplateId
+
+
+/**
+ *  Returns the stored PIN1 lock status.
+ *
+ *  @param aLockStatus  Filled on return with the stored value.
+ */
+void CPhoneBookManager::GetPin1LockStatus(RMobilePhone::TMobilePhoneLockStatus& aLockStatus)
+	{
+	LOGPARAMS1(_L8("GetPin1LockStatus()"));
+
+	AcquireMutex();
+	aLockStatus = iPin1LockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::GetPin1LockStatus
+
+
+/**
+ *  Sets the stored PIN1 lock status.
+ *
+ *  @param aLockStatus  Value of the lock to store.
+ */
+void CPhoneBookManager::SetPin1LockStatus(RMobilePhone::TMobilePhoneLockStatus aLockStatus)
+	{
+	LOGPARAMS1(_L8("SetPin1LockStatus()"));
+
+	AcquireMutex();
+	iPin1LockStatus = aLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::SetPin1LockStatus
+
+
+/**
+ *  Returns the stored PIN2 lock status.
+ *
+ *  @param aLockStatus  Filled on return with the stored value.
+ */
+void CPhoneBookManager::GetPin2LockStatus(RMobilePhone::TMobilePhoneLockStatus& aLockStatus)
+	{
+	LOGPARAMS1(_L8("GetPin2LockStatus()"));
+
+	AcquireMutex();
+	aLockStatus = iPin2LockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::GetPin2LockStatus
+
+
+/**
+ *  Sets the stored PIN2 lock status.
+ *
+ *  @param aLockStatus  Value of the lock to store.
+ */
+void CPhoneBookManager::SetPin2LockStatus(RMobilePhone::TMobilePhoneLockStatus aLockStatus)
+	{
+	LOGPARAMS1(_L8("SetPin2LockStatus()"));
+
+	AcquireMutex();
+	iPin2LockStatus = aLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::SetPin2LockStatus
+
+
+/**
+ *  Returns the stored Hidden Key lock status.
+ *
+ *  @param aLockStatus  Filled on return with the stored value.
+ */
+void CPhoneBookManager::GetHiddenKeyLockStatus(RMobilePhone::TMobilePhoneLockStatus& aLockStatus)
+	{
+	LOGPARAMS1(_L8("GetHiddenKeyLockStatus()"));
+
+	AcquireMutex();
+	aLockStatus = iHiddenKeyLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::GetHiddenKeyLockStatus
+
+
+/**
+ *  Sets the stored Hidden Key lock status.
+ *
+ *  @param aLockStatus  Value of the lock to store.
+ */
+void CPhoneBookManager::SetHiddenKeyLockStatus(RMobilePhone::TMobilePhoneLockStatus aLockStatus)
+	{
+	LOGPARAMS1(_L8("SetHiddenKeyLockStatus()"));
+
+	AcquireMutex();
+	iHiddenKeyLockStatus = aLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::SetHiddenKeyLockStatus
+
+
+/**
+ *  Returns the stored USIM App lock status.
+ *
+ *  @param aLockStatus  Filled on return with the stored value.
+ */
+void CPhoneBookManager::GetUsimAppLockStatus(RMobilePhone::TMobilePhoneLockStatus& aLockStatus)
+	{
+	LOGPARAMS1(_L8("GetUsimAppLockStatus()"));
+
+	AcquireMutex();
+	aLockStatus = iUsimAppLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::GetUsimAppLockStatus
+
+
+/**
+ *  Sets the stored USIM App lock status.
+ *
+ *  @param aLockStatus  Value of the lock to store.
+ */
+void CPhoneBookManager::SetUsimAppLockStatus(RMobilePhone::TMobilePhoneLockStatus aLockStatus)
+	{
+	LOGPARAMS1(_L8("SetUsimAppLockStatus()"));
+
+	AcquireMutex();
+	iUsimAppLockStatus = aLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::SetPin2UsimAppLockStatus
+
+
+/**
+ *  Returns the stored Universal PIN lock status.
+ *
+ *  @param aLockStatus  Filled on return with the stored value.
+ */
+void CPhoneBookManager::GetUsimUniversalPinLockStatus(RMobilePhone::TMobilePhoneLockStatus& aLockStatus)
+	{
+	LOGPARAMS1(_L8("GetUsimUniversalPinLockStatus()"));
+
+	AcquireMutex();
+	aLockStatus = iUsimUniversalPinLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::GetUsimUniversalPinLockStatus
+
+
+/**
+ *  Sets the stored USIM Universal PIN lock status.
+ *
+ *  @param aLockStatus  Value of the lock to store.
+ */
+void CPhoneBookManager::SetUsimUniversalPinLockStatus(RMobilePhone::TMobilePhoneLockStatus aLockStatus)
+	{
+	LOGPARAMS1(_L8("SetUsimUniversalPinLockStatus()"));
+
+	AcquireMutex();
+	iUsimUniversalPinLockStatus = aLockStatus;
+	ReleaseMutex();
+	} // CPhoneBookManager::SetUsimUniversalPinLockStatus
+
+
+/**
+ *  Records a security event. Since events are stateless, the event is not actually
+ *  stored for retrieval but an internal state is updated.
+ *
+ *  @param aSecurityEvent  Security event to store.
+ */
+void CPhoneBookManager::RecordSecurityEvent(RMobilePhone::TMobilePhoneSecurityEvent aSecurityEvent)
+	{
+	LOGPARAMS2(_L8("RecordSecurityEvent(%d)"), aSecurityEvent);
+
+	if (aSecurityEvent == RMobilePhone::ENoICCFound  ||
+		aSecurityEvent == RMobilePhone::EICCTerminated  ||
+		aSecurityEvent == RMobilePhone::EPuk1Required)
+		{
+		iIsPuk1Verified = EFalse;
+		}
+	else if (aSecurityEvent == RMobilePhone::EPuk1Verified)
+		{
+		iIsPuk1Verified = ETrue;
+		}
+	} // CPhoneBookManager::RecordSecurityEvent
+
+
+/**
+ *  Returns the current state of access to PIN 1 priviledged facilities.
+ *
+ *  @return ETrue if the ICC is in a usable state with PIN 1 access, otherwise
+ *          return EFalse.
+ */
+TBool CPhoneBookManager::IsPin1Valid()
+	{
+	LOGPARAMS1(_L8("IsPin1Valid()"));
+	
+	AcquireMutex();
+
+	//
+	// Return true if all of the following conditions are true.  Note that we
+	// only look for specific statuses, and ignore unknowns.  Thus if the TSY
+	// doesn't implement some locks, then the default expected behaviour will
+	// occur.
+	//
+	TBool  result = (iIsPuk1Verified  &&
+					 iPin1LockStatus != RMobilePhone::EStatusLocked  &&
+					 iPin1LockStatus != RMobilePhone::EStatusBlocked  &&
+					 iHiddenKeyLockStatus != RMobilePhone::EStatusLocked  &&
+					 iHiddenKeyLockStatus != RMobilePhone::EStatusBlocked);
+
+	ReleaseMutex();
+		
+	return result;
+	} // CPhoneBookManager::IsPin1Valid
+
+
+/**
+ *  Returns the current state of access to PIN 2 priviledged facilities.
+ *
+ *  @return ETrue if the ICC is in a usable state with PIN 2 access, otherwise
+ *          return EFalse.
+ */
+TBool CPhoneBookManager::IsPin2Valid()
+	{
+	LOGPARAMS1(_L8("IsPin2Valid()"));
+	
+	AcquireMutex();
+
+	//
+	// Return true if PIN2 is unlocked.  Note that we only look for specific
+	// statuses, and ignore unknowns.  Thus if the TSY doesn't implement some
+	// locks, then the default expected behaviour will occur.
+	//
+	TBool  result = (iPin2LockStatus == RMobilePhone::EStatusUnlocked);
+
+	ReleaseMutex();
+		
+	return result;
+	} // CPhoneBookManager::IsPin2Valid
+
+
+/**
+ *  Returns the current state of access to USIM App priviledged facilities.
+ *
+ *  @return ETrue if the USIM App is in a usable state with PIN access, otherwise
+ *          return EFalse.
+ */
+TBool CPhoneBookManager::IsUsimAppPinValid()
+	{
+	LOGPARAMS1(_L8("IsUsimAppPinValid()"));
+	
+	AcquireMutex();
+
+	//
+	// Return true if all of the following conditions are true.  Note that we
+	// only look for specific statuses, and ignore unknowns.  Thus if the TSY
+	// doesn't implement some locks, then the default expected behaviour will
+	// occur.
+	//
+	TBool  result = (iUsimAppLockStatus != RMobilePhone::EStatusLocked  &&
+					 iUsimAppLockStatus != RMobilePhone::EStatusBlocked  &&
+					 iUsimUniversalPinLockStatus != RMobilePhone::EStatusLocked  &&
+					 iUsimUniversalPinLockStatus != RMobilePhone::EStatusBlocked);
+
+	ReleaseMutex();
+		
+	return result;
+	} // CPhoneBookManager::IsUsimAppPinValid
+
+
+/**
+ *  Returns the result for the given phonebook which specifies whether the
+ *  PhBkInfo data has been stored or if the phonebook is not supported.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aErrorCode     Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the result is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetPhBkInfoRetrievedResult(TUid aPhonebookUid,
+											       TInt& aErrorCode)
+	{
+	LOGPARAMS2(_L8("GetPhBkInfoRetrievedResult(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Get the PhBkInfo retrieved flag from the phonebook parameters.
+	//
+	AcquireMutex();
+	aErrorCode = phonebook->GetPhBkInfoRetrievedResult();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetPhBkInfoRetrievedResult
+
+
+/**
+ *  Sets the result for the given phonebook which specifies whether the
+ *  PhBkInfo data has been stored or if it is not supported.
+ *
+ *  @param aPhonebookUid  Phonebook UID to set the value on.
+ *  @param aErrorCode     Value to set.
+ *
+ *  @return KErrNone if the flag is set, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetPhBkInfoRetrievedResult(TUid aPhonebookUid,
+											       TInt aErrorCode)
+	{
+	LOGPARAMS3(_L8("SetPhBkInfoRetrievedResult(0x%08x, %d)"),
+			   aPhonebookUid, aErrorCode);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Set the PhBkInfo retrieved flag in the phonebook parameters.
+	//
+	AcquireMutex();
+	phonebook->SetPhBkInfoRetrievedResult(aErrorCode);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::SetPhBkInfoRetrievedResult
+
+
+/**
+ *  Returns the sync mode for the given phonebook which specifies how the
+ *  synchroniser should handle a phonebook at startup.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aSyncMode      Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the mode is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetSyncMode(TUid aPhonebookUid,
+									RPhoneBookSession::TPhonebookSyncMode& aSyncMode)
+	{
+	LOGPARAMS2(_L8("GetSyncMode(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Get the Sync Mode from the phonebook parameters.
+	//
+	AcquireMutex();
+	aSyncMode = phonebook->GetSyncMode();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetSyncMode
+
+
+/**
+ *  Sets the sync mode for the given phonebook which specifies how the
+ *  synchroniser should handle a phonebook at startup.
+ *
+ *  @param aPhonebookUid  Phonebook UID to set the value on.
+ *  @param aSyncMode      The value to set.
+ *
+ *  @return KErrNone if the mode is set, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetSyncMode(TUid aPhonebookUid,
+									RPhoneBookSession::TPhonebookSyncMode aSyncMode)
+	{
+	LOGPARAMS3(_L8("SetSyncMode(0x%08x, %d)"),
+			   aPhonebookUid, (TInt) aSyncMode);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Set the Sync Mode for the phonebook...
+	//
+	AcquireMutex();
+	RPhoneBookSession::TPhonebookSyncMode  oldSyncMode(phonebook->GetSyncMode());
+	
+	phonebook->SetSyncMode(aSyncMode);
+	result = iIniFile->WriteIniFileSettingsIfNeeded();
+	if (result != KErrNone)
+		{
+		phonebook->SetSyncMode(oldSyncMode);
+		}
+	ReleaseMutex();
+	
+	return result;
+	} // CPhoneBookManager::SetSyncMode
+
+
+/**
+ *  Returns the sync state for the given phonebook which specifies if the
+ *  phonebook has been syncronhised.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aSyncState     Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the state is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetSyncState(TUid aPhonebookUid,
+									 RPhoneBookSession::TSyncState& aSyncState)
+	{
+	LOGPARAMS2(_L8("GetSyncState(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Get the Sync State from the phonebook parameters.
+	//
+	AcquireMutex();
+	aSyncState = phonebook->GetSyncState();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetSyncState
+
+
+/**
+ *  Sets the sync state for the given phonebook which specifies if the
+ *  phonebook has been syncronhised.
+ *
+ *  @param aPhonebookUid  Phonebook UID to set the value on.
+ *  @param aSyncState     The value to set.
+ *
+ *  @return KErrNone if the state is set, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetSyncState(TUid aPhonebookUid,
+									RPhoneBookSession::TSyncState aSyncState)
+	{
+	LOGPARAMS3(_L8("SetSyncState(0x%08x, %d)"),
+			   aPhonebookUid, (TInt) aSyncState);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Set the Sync State for the phonebook...
+	//
+	AcquireMutex();
+	RPhoneBookSession::TSyncState  oldSyncState(phonebook->GetSyncState());
+	
+	phonebook->SetSyncState(aSyncState);
+	result = iIniFile->WriteIniFileSettingsIfNeeded();
+	if (result != KErrNone)
+		{
+		phonebook->SetSyncState(oldSyncState);
+		}
+	ReleaseMutex();
+	
+	return result;
+	} // CPhoneBookManager::SetSyncState
+
+
+/**
+ *  Returns the last sync error for the given phonebook which specifies the last
+ *  error seen whist synchronising the phonebook.
+ *
+ *  @param aPhonebookUid   Phonebook UID to get the value from.
+ *  @param aLastSyncError  Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the last error is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetLastSyncError(TUid aPhonebookUid,
+										 TInt& aLastSyncError)
+	{
+	LOGPARAMS2(_L8("GetLastSyncError(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Acquire the mutex to protect shared data. This must be released
+	// before the function returns.
+	//
+	AcquireMutex();
+
+	//
+	// Get the last sync error from the phonebook parameters.
+	//
+	aLastSyncError = phonebook->GetLastSyncError();
+
+	//
+	// Release the mutex now that we have finished.
+	//
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetLastSyncError
+
+
+/**
+ *  Sets the last sync error for the given phonebook which specifies the last
+ *  error seen whist synchronising the phonebook.
+ *
+ *  @param aPhonebookUid   Phonebook UID to set the value on.
+ *  @param aLastSyncError  The value to set.
+ *
+ *  @return KErrNone if the last error is set, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetLastSyncError(TUid aPhonebookUid,
+										 TInt aLastSyncError)
+	{
+	LOGPARAMS3(_L8("SetLastSyncError(0x%08x, %d)"),
+			   aPhonebookUid, aLastSyncError);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Set the last sync error for the phonebook...
+	//
+	AcquireMutex();
+	phonebook->SetLastSyncError(aLastSyncError);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::SetLastSyncError
+
+
+/**
+ *  Returns the template ID for the given phonebook which specifies the
+ *  Contacts record template used as a base for records on this phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aTemplateId    Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the template ID is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetTemplateId(TUid aPhonebookUid,
+									  TContactItemId& aTemplateId)
+	{
+	LOGPARAMS2(_L8("GetTemplateId(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And return the template ID...
+	//
+	AcquireMutex();
+	aTemplateId = phonebook->GetTemplateId();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetTemplateId
+
+
+/**
+ *  Sets the template ID for the given phonebook which specifies the
+ *  Contacts record template used as a base for records on this phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to set the value on.
+ *  @param aTemplateId    The value to set.
+ *
+ *  @return KErrNone if the template ID is set, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetTemplateId(TUid aPhonebookUid,
+									  TContactItemId aTemplateId)
+	{
+	LOGPARAMS3(_L8("SetTemplateId(0x%08x, 0x%08x)"),
+			   aPhonebookUid, aTemplateId);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And set the template ID...
+	//
+	AcquireMutex();
+	TContactItemId  oldTemplateId = phonebook->GetTemplateId();
+
+	phonebook->SetTemplateId(aTemplateId);
+	result = iIniFile->WriteIniFileSettingsIfNeeded();
+	if (result != KErrNone)
+		{
+		phonebook->SetTemplateId(oldTemplateId);
+		}
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::SetTemplateId
+
+
+/**
+ *  Returns the group ID for the given phonebook which specifies the
+ *  Contacts record group used as an association for records on this
+ *  phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aGroupId       Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the group ID is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetGroupId(TUid aPhonebookUid,
+								   TContactItemId& aGroupId)
+	{
+	LOGPARAMS2(_L8("GetGroupId(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And return the group ID...
+	//
+	AcquireMutex();
+	aGroupId = phonebook->GetGroupId();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetGroupId
+
+
+/**
+ *  Sets the group ID for the given phonebook which specifies the
+ *  Contacts record group used as an association for records on this
+ *  phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to set the value on.
+ *  @param aGroupId       The value to set.
+ *
+ *  @return KErrNone if the group ID is set, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetGroupId(TUid aPhonebookUid,
+								   TContactItemId aGroupId)
+	{
+	LOGPARAMS3(_L8("SetGroupId(0x%08x, 0x%08x)"), aPhonebookUid, aGroupId);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And set the group ID...
+	//
+	AcquireMutex();
+	TContactItemId  oldGroupId = phonebook->GetGroupId();
+
+	phonebook->SetGroupId(aGroupId);
+	result = iIniFile->WriteIniFileSettingsIfNeeded();
+	if (result != KErrNone)
+		{
+		phonebook->SetGroupId(oldGroupId);
+		}
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::SetGroupId
+
+
+/**
+ *  Returns the contact fields format for the given phonebook which
+ *  specifies the format of contacts on this phonebook.
+ *
+ *  @param aPhonebookUid   Phonebook UID to get the value from.
+ *  @param aContactFields  Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the contact fields format is retrieved, otherwise a
+ *          system error code.
+ */
+TInt CPhoneBookManager::GetContactFields(TUid aPhonebookUid,
+										 RPhoneBookSession::TContactFieldsV3& aContactFields)
+	{
+	LOGPARAMS2(_L8("GetContactFields(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And return the Contact Fields...
+	//
+	AcquireMutex();
+	aContactFields = phonebook->GetContactFields();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetContactFields
+
+
+/**
+ *  Sets the contact fields format for the given phonebook which
+ *  specifies the format of contacts on this phonebook.
+ *
+ *  @param aPhonebookUid   Phonebook UID to set the value on.
+ *  @param aContactFields  The value to set.
+ *
+ *  @return KErrNone if the contact fields format is retrieved, otherwise a
+ *          system error code.
+ */
+TInt CPhoneBookManager::SetContactFields(TUid aPhonebookUid,
+										 const RPhoneBookSession::TContactFieldsV3& aContactFields)
+	{
+	LOGPARAMS2(_L8("SetContactFields(0x%08x)"), aPhonebookUid);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Set the Contact Fields...
+	//
+	AcquireMutex();
+	phonebook->SetContactFields(aContactFields);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::SetContactFields
+
+
+/**
+ *  Returns the phonebook store handle for the given phonebook which
+ *  provides access to the ICC phonebook.
+ *
+ *  @param aPhonebookUid    Phonebook UID to get the handle from.
+ *  @param aPhone           Handle to the ETel phone.
+ *  @param aPhonebookStore  Filled with the handle on successful exit.
+ *
+ *  @return KErrNone if the handle is retrieved, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetPhoneBookStore(TUid aPhonebookUid,
+										  RMobilePhone& aPhone,
+										  RMobilePhoneBookStore& aPhonebookStore)
+	{
+	LOGPARAMS2(_L8("GetPhoneBookStore(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And return the phone store handle...
+	//
+	AcquireMutex();
+	aPhonebookStore = phonebook->GetPhoneBookStore(aPhone);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetPhoneBookStore
+
+
+/**
+ *  Closes the phonebook ICC handle for each phonebook.
+ */
+TInt CPhoneBookManager::ClosePhoneBookStores()
+	{
+	LOGPARAMS1(_L8("ClosePhoneBookStores()"));
+
+	//
+	// Acquire the mutex before we start...
+	//
+	AcquireMutex();
+
+	//
+	// Now loop through the phonebooks and close each one... 
+	//
+	TInt  count(iPhonebookList.Count());
+	
+	for (TInt index = 0;  index < count;  index++)
+		{
+		iPhonebookList[index]->ClosePhoneBookStore();
+		}
+
+	//
+	// Release the mutex...
+	//
+	ReleaseMutex();
+		
+	return KErrNone;
+	} // CPhoneBookManager::ClosePhoneBookStores
+
+
+/**
+ *  Returns the PhBkInfo data for the given phonebook which
+ *  specifies information about the phonebook and its contents.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aPhBkInfo      Filled with the value on successful exit.
+ *
+ *  @return KErrNone if the PhBkInfo data is retrieved, otherwise a
+ *          system error code.
+ */
+TInt CPhoneBookManager::GetPhoneBookInfo(TUid aPhonebookUid,
+										 RMobilePhoneBookStore::TMobilePhoneBookInfoV5& aPhBkInfo)
+	{
+	LOGPARAMS2(_L8("GetPhoneBookInfo(0x%08x)"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// And return the Phone Book Info...
+	//
+	AcquireMutex();
+	aPhBkInfo = phonebook->GetPhoneBookInfo();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetPhoneBookInfo
+
+
+/**
+ *  Sets the PhBkInfo data for the given phonebook which
+ *  specifies information about the phonebook and its contents.
+ *
+ *  @param aPhonebookUid  Phonebook UID to set the value to.
+ *  @param aPhBkInfo      The value to set.
+ *
+ *  @return KErrNone if the PhBkInfo data is set, otherwise a system error
+ *          code.
+ */
+TInt CPhoneBookManager::SetPhoneBookInfo(TUid aPhonebookUid,
+										 const RMobilePhoneBookStore::TMobilePhoneBookInfoV5& aPhBkInfo)
+	{
+	LOGPARAMS2(_L8("SetPhoneBookInfo(0x%08x)"), aPhonebookUid);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Set the Phone Book Info Fields...
+	//
+	AcquireMutex();
+	phonebook->SetPhoneBookInfo(aPhBkInfo);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::SetPhoneBookInfo
+
+
+/**
+ *  Adjusted the count of used entries in the PhBkInfo data for a phonebook.
+ *  This is the same as performing a get and set combination, but quicker and
+ *  more efficent.
+ *
+ *  @note The data can only be updated if the phone TSY supports it in the
+ *        first place.
+ *
+ *  @param aPhonebookUid  Phonebook UID to adjust the value on.
+ *  @param aChange        The modification value (e.g. -1 or 1).
+ *
+ *  @return KErrNone if the PhBkInfo data is updated, otherwise a system error
+ *          code.
+ */
+TInt CPhoneBookManager::AdjustPhoneBookInfoUsedEntries(TUid aPhonebookUid,
+													   TInt aChange)
+	{
+	LOGPARAMS3(_L8("AdjustPhoneBookInfoUsedEntries(0x%08x, %d)"),
+			   aPhonebookUid, aChange);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Adjust the Phone Book Info Used Entries Field...
+	//
+	AcquireMutex();
+	phonebook->AdjustPhoneBookInfoUsedEntries(aChange);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::AdjustPhoneBookInfoUsedEntries
+
+
+/**
+ *  Returns the current size of the Look-Up Table for a particular phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aSize          Filled on successful exit with the table size.
+ *
+ *  @return KErrNone if the size is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetLookUpTableSize(TUid aPhonebookUid, TInt& aSize)
+	{
+	LOGPARAMS2(_L8("GetLookUpTableSize(): 0x%08x"), aPhonebookUid);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Get the Look-Up Table size...
+	//
+	AcquireMutex();
+	aSize = phonebook->GetLookUpTableSize();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetLookUpTableSize
+
+
+/**
+ *  Sets the current size of the Look-Up Table for a particular phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to perform the operation on.
+ *  @param aSize          The new table size.
+ *
+ *  @return KErrNone if the size is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::SetLookUpTableSize(TUid aPhonebookUid, TInt aSize)
+	{
+	LOGPARAMS3(_L8("SetLookUpTableSize(): 0x%08x %d"), aPhonebookUid, aSize);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Change the Look-Up Table size...
+	//
+	AcquireMutex();
+	TRAPD(leaveCode, phonebook->SetLookUpTableSizeL(aSize));
+	ReleaseMutex();
+	
+	return leaveCode;
+	} // CPhoneBookManager::SetLookUpTableSize
+
+
+/**
+ *  Clears the Look-Up Table for a particular phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to perform the operation on.
+ *
+ *  @return KErrNone if the operation is successful, otherwise a system
+ *          error code.
+ */
+TInt CPhoneBookManager::ClearLookUpTable(TUid aPhonebookUid)
+	{
+	LOGPARAMS2(_L8("ClearLookUpTable(): 0x%08x"), aPhonebookUid);
+	
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Clear the Look-Up Table...
+	//
+	AcquireMutex();
+	phonebook->ClearLookUpTable();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::ClearLookUpTable
+
+
+/**
+ *  Check whether an entry with the given Contacts UID exists in the
+ *  look-up-table and whether that entry has already been flagged as
+ *  being used.
+ *
+ *  @param aPhonebookUid  Phonebook UID of the Look-Up Table to examine.
+ *  @param aContactId     Contacts ICC entry UID
+ *
+ *  @return KErrNone if entry found, otherwise KErrNotFound.
+ */
+TInt CPhoneBookManager::IsEntryInTable(TUid aPhonebookUid,
+									   TContactItemId aContactId)
+	{
+	LOGPARAMS3(_L8("IsEntryInTable(): 0x%08x 0x%08x"),
+			   aPhonebookUid, aContactId);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to look this up in the Look-Up-Table...
+	//
+	AcquireMutex();
+	result = phonebook->IsEntryInTable(aContactId);
+	ReleaseMutex();
+	
+	return result;
+	} // CPhoneBookManager::IsEntryInTable
+
+
+/**
+ *  Update the Contact UID parameter for a phonebook entry in a phonebook's
+ *  Look-Up Table. The entry is identified by the slot number.
+ *
+ *  @param aPhonebookUid  Phonebook UID of the Look-Up Table to update.
+ *  @param aSlotNum       Phonebook entry slot number
+ *  @param aContactId    The new contacts ICC entry UID.
+ *
+ *  @return KErrNone if the update is successful, otherwise a system error code.
+ */
+TInt CPhoneBookManager::UpdateEntryInTable(TUid aPhonebookUid, TInt aSlotNum,
+										   TContactItemId aContactId)
+	{
+	LOGPARAMS4(_L8("UpdateEntryInTable(): 0x%08x %d 0x%08x"),
+			   aPhonebookUid, aSlotNum, aContactId);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to edit this entry in the Look-Up-Table...
+	//
+	AcquireMutex();
+	result = phonebook->UpdateEntryInTable(aSlotNum, aContactId);
+	ReleaseMutex();
+	
+	return result;
+	} // CPhoneBookManager::UpdateEntryInTable
+
+
+/**
+ *  Update the Contact UID and slot state parameters for a phonebook entry
+ *  in a phonebook's Look-Up Table. The entry is identified by the slot number.
+ *
+ *  @param aPhonebookUid  Phonebook UID of the Look-Up Table to update.
+ *  @param aSlotNum       Phonebook entry slot number
+ *  @param aContactId     The new contacts ICC entry UID.
+ *  @param aSlotState     The new slot state.
+ *
+ *  @return KErrNone if the update is successful, otherwise a system error code.
+ */
+TInt CPhoneBookManager::UpdateEntryInTable(TUid aPhonebookUid, TInt aSlotNum,
+										   TContactItemId aContactId,
+										   TPhonebookSlotState aSlotState)
+	{
+	LOGPARAMS5(_L8("UpdateEntryInTable(): 0x%08x %d 0x%08x %d"),
+			   aPhonebookUid, aSlotNum, aContactId, aSlotState);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to edit this entry in the Look-Up-Table...
+	//
+	AcquireMutex();
+	result = phonebook->UpdateEntryInTable(aSlotNum, aContactId, aSlotState);
+	ReleaseMutex();
+	
+	return result;
+	} // CPhoneBookManager::UpdateEntryInTable
+
+
+/**
+ *  Returns the Contact ID for the entry in the Look-Up Table for a particular
+ *  phonebook. The entry is identified by slot number.
+ *
+ *  @param aPhonebookUid   Phonebook UID to get the value from.
+ *  @param aSlotNum        Slot number to search.
+ *  @param aContactItemId  Filled on successful exit with the Contact ID.
+ *
+ *  @return KErrNone if the ID is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetContactIdFromSlotNum(TUid aPhonebookUid,
+												TInt aSlotNum,
+												TContactItemId& aContactItemId)
+	{
+	LOGPARAMS3(_L8("GetContactIdFromSlotNum(): 0x%08x %d"),
+			   aPhonebookUid, aSlotNum);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to get the contact UID from the Look-Up-Table...
+	//
+	AcquireMutex();
+	aContactItemId = phonebook->GetContactIdFromSlotNum(aSlotNum);
+	ReleaseMutex();
+	
+	if (aContactItemId == KNullContactId  ||  aContactItemId == KGoldenTemplateId)
+		{
+		return KErrNotFound;
+		}
+
+	return KErrNone;
+	} // CPhoneBookManager::GetContactIdFromSlotNum
+
+
+/**
+ *  Returns the slot number for the entry in the Look-Up Table for a particular
+ *  phonebook. The entry is identified by Contact ID.
+ *
+ *  @param aPhonebookUid   Phonebook UID to get the value from.
+ *  @param aContactItemId  The Contact ID to search.
+ *  @param aSlotNum        Filled on successful exit with the slot number.
+ *
+ *  @return KErrNone if the slot number is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetSlotNumFromContactId(TUid aPhonebookUid,
+												TContactItemId aContactItemId,
+												TInt& aSlotNum)
+	{
+	LOGPARAMS3(_L8("GetSlotNumFromContactId(): 0x%08x 0x%08x"),
+			   aPhonebookUid, aContactItemId);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to get the slot number from the Look-Up-Table...
+	//
+	AcquireMutex();
+	aSlotNum = phonebook->GetSlotNumFromContactId(aContactItemId);
+	ReleaseMutex();
+	
+	if (aSlotNum < 0)
+		{
+		return KErrNotFound;
+		}
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetSlotNumFromContactId
+
+
+/**
+ *  Returns the number of free slots for a particular phonebook.
+ *
+ *  @param aPhonebookUid    Phonebook UID to get the value from.
+ *  @param aNumOfFreeSlots  Filled on successful exit with the number of
+ *                          free slots.
+ *
+ *  @return KErrNone if the number is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetNumFreeSlots(TUid aPhonebookUid,
+										TInt& aNumOfFreeSlots)
+	{
+	LOGPARAMS2(_L8("GetNumFreeSlots(): 0x%08x"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to edit this entry in the Look-Up-Table...
+	//
+	AcquireMutex();
+	aNumOfFreeSlots = phonebook->GetNumFreeSlots();
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetNumFreeSlots
+
+
+/**
+ *  Returns the first free slot for a particular phonebook.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the value from.
+ *  @param aSlotNum       Filled on successful exit with the first free
+ *                        slot number.
+ *
+ *  @return KErrNone if the number is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetFirstEmptySlot(TUid aPhonebookUid,
+										  TInt& aSlotNum)
+	{
+	LOGPARAMS2(_L8("GetFirstEmptySlot(): 0x%08x"), aPhonebookUid);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to find the first free slot in the Look-Up-Table...
+	//
+	AcquireMutex();
+	result = phonebook->GetFirstEmptySlot();
+	ReleaseMutex();
+	
+	if (result < 0)
+		{
+		return result;
+		}
+		
+	aSlotNum = result;
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetFirstEmptySlot
+
+
+/**
+ *  Returns a list of slot numbers for a particular phonebook that match a
+ *  given slot state.
+ *
+ *  @param aPhonebookUid  Phonebook UID to get the list from.
+ *  @param aSlotState     Slot state to search for.
+ *  @param aEntries       Filled on successful exit with the list of slots.
+ *
+ *  @return KErrNone if the list is returned, otherwise a system error code.
+ */
+TInt CPhoneBookManager::GetMatchingEntries(TUid aPhonebookUid,
+										   TPhonebookSlotState aSlotState,
+										   RArray<TInt>& aEntries)
+	{
+	LOGPARAMS3(_L8("GetMatchingEntries(): 0x%08x %d"), aPhonebookUid, aSlotState);
+
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to the slot numbers from the Look-Up-Table...
+	//
+	AcquireMutex();
+	phonebook->GetMatchingEntries(aSlotState, aEntries);
+	ReleaseMutex();
+	
+	return KErrNone;
+	} // CPhoneBookManager::GetMatchingEntries
+
+
+/**
+ *  Outputs the Look-Up Table for a particular phonebook to the logging file.
+ *
+ *  @note This function works only in debug mode.
+ *
+ *  @param aPhonebookUid  Phonebook UID of of the phonebook to log.
+ *
+ *  @return KErrNone if the table is logged, otherwise a system error code.
+ */
+TInt CPhoneBookManager::LogLookUpTable(TUid aPhonebookUid)
+	{
+	LOGPARAMS2(_L8("LogLookUpTable(): 0x%08x"), aPhonebookUid);
+	
+#ifdef _DEBUG
+	//	
+	// Get the pointer to the object containing parameters associated
+	// with this phonebook.
+	//
+	CPhoneBook*  phonebook;
+	TInt  result = GetPhonebook(aPhonebookUid, phonebook);
+
+	if (result != KErrNone)
+		{
+		return result;
+		}
+
+	//
+	// Call the phonebook to log the Look-Up-Table...
+	//
+	AcquireMutex();
+	phonebook->LogLookUpTable();
+	ReleaseMutex();
+#else
+	(void) aPhonebookUid;
+#endif
+	
+	return KErrNone;
+	} // CPhoneBookManager::LogLookUpTable
+
+
+/**
+ *  Returns a pointer to the class containing the parameters for the
+ *  phonebook specified by the aPhonebook parameter.
+ *
+ *  @param aPhonebookUid  The phonebook specified.
+ *
+ *  @return Standard error code.
+ */
+TInt CPhoneBookManager::GetPhonebook(TUid aPhonebookUid,
+									 CPhoneBook*& aPhoneBookPtr) const
+	{
+	LOGPARAMS2(_L8("GetPhonebook(0x%08x)"), aPhonebookUid);
+
+	TInt  phonebooks(iPhonebookList.Count());
+	
+	for (TInt index = 0;  index < phonebooks;  index++)
+		{
+		CPhoneBook*  phonebook = iPhonebookList[index];
+		
+		if (phonebook->GetPhonebookUid() == aPhonebookUid)
+			{
+			aPhoneBookPtr = phonebook;
+			return KErrNone;
+			}
+		}
+
+	return KErrNotSupported;
+	} // CPhoneBookManager::GetPhonebook
+