pimprotocols/phonebooksync/Server/PhonebookManager.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 12:45:19 +0300
changeset 37 fd64c38c277d
parent 0 e686773b3f54
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

// 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