telephonyserver/etelmultimode/CETEL/mm_store.cpp
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelmultimode/CETEL/mm_store.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1062 @@
+
+// Copyright (c) 2000-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 methods for all the PtrHolder classes used by the EtelMM
+// subsessions.
+// 
+//
+
+// From core API
+#include <et_clsvr.h>
+#include <etelext.h>
+
+// Multimode header files
+#include <etelmm.h>
+#include <mmlist.h>
+#include <mmretrieve.h>
+
+#include "mm_hold.h"
+
+
+/************************************************************************/
+//
+//  RMobilePhoneStore
+//
+/************************************************************************/
+
+RMobilePhoneStore::RMobilePhoneStore()
+	:iStorePtrHolder(NULL)
+/** Constructor. */
+	{
+	}
+
+EXPORT_C void RMobilePhoneStore::BaseConstruct(CMobilePhoneStorePtrHolder* aPtrHolder)
+/**
+@capability None
+*/
+	{
+	iStorePtrHolder = aPtrHolder;
+	}
+
+EXPORT_C void RMobilePhoneStore::Destruct()
+/** Standard destructor. 
+@capability None
+*/
+	{
+	delete iStorePtrHolder;
+	iStorePtrHolder = NULL;
+	ResetSessionHandle();
+	}
+
+RMobilePhoneStore::TMobilePhoneStoreEntryV1::TMobilePhoneStoreEntryV1()
+:	iIndex(KIndexNotUsed)
+	{
+	iExtensionId = KETelExtMultimodeV1;
+	}
+
+void RMobilePhoneStore::TMobilePhoneStoreEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the generic attributes of a store entry from a stream
+ *
+ * @param aStream The read stream containing the store entry
+ */
+	{
+	TMultimodeType::InternalizeL(aStream);
+	iIndex = aStream.ReadInt32L();
+	}
+
+void RMobilePhoneStore::TMobilePhoneStoreEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the generic attributes of a store entry into a stream
+ *
+ * @param aStream The write stream that will contain the store entry
+ */
+	{
+	TMultimodeType::ExternalizeL(aStream);
+	aStream.WriteInt32L(iIndex);
+	}
+
+EXPORT_C RMobilePhoneStore::TMobilePhoneStoreInfoV1::TMobilePhoneStoreInfoV1()
+:	iType(EPhoneStoreTypeUnknown),
+	iTotalEntries(-1),
+	iUsedEntries(-1),
+	iCaps(0)
+	{
+	iExtensionId=KETelMobilePhoneStoreV1;
+	}
+
+EXPORT_C void RMobilePhoneStore::GetInfo(TRequestStatus& aReqStatus, TDes8& aInfo) const
+/** This member function gets information about the selected store.
+
+This information includes the store's name, the type of thing it stores, the
+total number of storage slots and the number of used slots. It does not give
+information about which slots are filled and which are empty.
+
+Defined in RMobilePhoneBookStore::TMobilePhoneStoreInfoV1::iExtensionId is
+the type of class that is being used. See TMobilePhoneStoreInfoExtId for the
+different possible types.
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreGetInfo) to cancel
+a previously placed asynchronous GetInfo() request.
+
+@param aReqStatus On return, KErrNone if successful.
+@param aInfo On completion, a from RMobilePhoneBookStore::TMobilePhoneBookInfoV1
+derived packaged class. 
+@capability ReadUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	Get(EMobilePhoneStoreGetInfo, aReqStatus, aInfo);
+	}
+
+EXPORT_C void RMobilePhoneStore::Read(TRequestStatus& aReqStatus, TDes8& aEntry) const
+/** This overloaded member function reads the entry in the slot specified.
+
+This member function is implemented using a TDes8 descriptor for aEntry so
+that any kind of store entry can be read from any kind of store using this
+common member function. For example, a client will have opened one of the
+specialised store sub-sessions, e.g. RMobileONStore. The client will read
+a store entry by packaging the specialised store's entry definition into its
+associated packaged version. In the own number store example, the client will
+have a RMobileONStore::TMobileONEntryV1 which it will put into a RMobileONStore::TMobileONEntryV1Pckg.
+The packaged version will be passed to the Read() request.
+
+This function has a specialised version in the RMobilePhoneBookStore
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreRead) to cancel
+a previously placed asynchronous Read() request.
+
+@param aReqStatus On return, KErrNone if successful, KErrNotFound if the slot
+specified by iIndex is empty.
+@param aEntry The iIndex field specifies what entry to read. On completion,
+the entry data will be filled in. 
+@capability ReadUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	Get(EMobilePhoneStoreRead, aReqStatus, aEntry);
+	}
+
+EXPORT_C void RMobilePhoneStore::Write(TRequestStatus& aReqStatus, TDes8& aEntry)  const
+/** This overloaded member function writes the entry into the store.
+
+This member function is implemented using a TDes8 descriptor for aEntry so
+that any kind of store entry can be read from any kind of store using this
+common member function. For example, a client will have opened one of the
+specialised store sub-sessions, eg. RMobileONStore. The client will read a
+store entry by packaging the specialised store's entry definition into its
+associated packaged version. In the own number store example, the client will
+have a RMobileONStore::TMobileONEntryV1 which it will put into a RMobileONStore::TMobileONEntryV1Pckg.
+The packaged version will be passed to the Write() request.
+
+This function has a specialised version in the RMobilePhoneBookStore
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreWrite) to cancel
+a previously placed asynchronous Write() request.
+
+@param aReqStatus On return, KErrNone if successful.
+@param aEntry The packaged entry to write in the store. If aEntry.index==-1
+the TSY will store the entry in the first free location and then return this
+location within aEntry.iIndex when it completes the request 
+@capability WriteUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	Get(EMobilePhoneStoreWrite, aReqStatus, aEntry);
+	}
+
+EXPORT_C void RMobilePhoneStore::Delete(TRequestStatus& aReqStatus, TInt aIndex)  const
+/** This member function deletes the entry in the slot.
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreDelete) to cancel
+a previously placed asynchronous Delete() request.
+
+@param aReqStatus On return, KErrNone if successful, KErrNotFound if the slot
+is empty
+@param aIndex The slot entry to delete. 
+@capability WriteUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	iStorePtrHolder->iDeleteIndex=aIndex;
+	TPtrC8& ptr1=iStorePtrHolder->SetC(CMobilePhoneStorePtrHolder::ESlot1Delete,iStorePtrHolder->iDeleteIndex);
+
+	Set(EMobilePhoneStoreDelete, aReqStatus, ptr1);
+	}
+
+EXPORT_C void RMobilePhoneStore::DeleteAll(TRequestStatus& aReqStatus)  const
+/** This member function deletes all the entries in the store.
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreDeleteAll) to
+cancel a previously placed asynchronous DeleteAll() request.
+
+@param aReqStatus On return, KErrNone if successful, KErrNotFound if the store
+is empty 
+@capability WriteUserData
+*/
+	{
+	Blank(EMobilePhoneStoreDeleteAll, aReqStatus);
+	}
+
+EXPORT_C void RMobilePhoneStore::NotifyStoreEvent(TRequestStatus& aReqStatus, TUint32& aEvent, TInt& aIndex) const
+/** This member functions allows a client to be notified when one or more of the
+events occurs to the store.
+
+These events allow a client to know the overall status of a store (full, empty
+etc.) and also when a slot within a store changes. A slot could change because
+another client or the phone has created, updated or deleted an entry.
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreNotifyStoreEvent)
+to cancel a previously placed asynchronous NotifyStoreEvent() request.
+
+@param aReqStatus On return, KErrNone if successful
+@param aEvent On completion, the TMobileStoreEvent.
+@param aIndex On completion, the index of the changed slot. If multiple entries
+have been added or deleted then it will not be possible to return the indices
+of these entries, so the TSY could trigger the KStoreDoRefresh event. 
+@capability ReadUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TPtr8& ptr1=iStorePtrHolder->Set(CMobilePhoneStorePtrHolder::ESlot1NotifyStoreEvent,aEvent);
+	TPtr8& ptr2=iStorePtrHolder->Set(CMobilePhoneStorePtrHolder::ESlot2NotifyStoreEvent,aIndex);
+	Get(EMobilePhoneStoreNotifyStoreEvent, aReqStatus, ptr1, ptr2);
+	}
+
+/************************************************************************/
+//
+//  RMobileSmsStore
+//
+/************************************************************************/
+
+EXPORT_C RMobileSmsStore::RMobileSmsStore()
+/** Constructor */
+	{
+	}
+
+EXPORT_C TInt RMobileSmsStore::Open(RMobileSmsMessaging& aMessaging, const TDesC& aStoreName)
+/** This member function opens the message store.
+
+@param aMessaging The Sms Messaging sub-session to use.
+@param aStoreName Name of the store to open, the names of the stores can be
+retrieved with RMobileSmsMessaging::GetMessageStoreInfo(). Must be one of
+KETelMeSmsStore, KETelIccSmsStore, KETelCombinedSmsStore
+@return KErrNone if successful.
+@see RMobileSmsMessaging::GetMessageStoreInfo() 
+@capability None
+*/
+	{
+	RSessionBase* session=&aMessaging.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aMessaging.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+	TRAPD(ret,ConstructL());
+	if (ret)
+		return ret;
+	TIpcArgs args(const_cast<TDesC*>(&aStoreName),TIpcArgs::ENothing,subSessionHandle);
+	SetSessionHandle(*session);
+	ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
+	if (ret)
+		Destruct();
+	return ret;
+	}
+
+EXPORT_C void RMobileSmsStore::Close()
+/** This member function closes a message store sub-session. 
+@capability None
+*/
+ 	{
+	CloseSubSession(EEtelClose);
+	Destruct();
+	}
+
+EXPORT_C void RMobileSmsStore::ConstructL()
+/** Constructor. 
+@capability None
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
+	CMobilePhoneStorePtrHolder* ptrHolder = CSmsStorePtrHolder::NewL(CSmsStorePtrHolder::EMaxNumberSmsStorePtrSlots,CSmsStorePtrHolder::EMaxNumberSmsStorePtrCSlots);
+	RMobilePhoneStore::BaseConstruct(ptrHolder);
+	}
+
+RMobileSmsStore::TMobileSmsEntryV1::TMobileSmsEntryV1()
+: iMsgStatus(EStoredMessageUnknownStatus)
+	{
+	iExtensionId=KETelExtMultimodeV1;
+	}
+
+void RMobileSmsStore::TMobileSmsEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the SMS entry from a stream
+ *
+ * @param aStream The read stream containing the SMS fixed size entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::InternalizeL(aStream);
+	iMsgStatus = static_cast<TMobileSmsStoreStatus>(aStream.ReadUint32L());
+	}
+
+void RMobileSmsStore::TMobileSmsEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the SMS entry into a stream
+ *
+ * @param aStream The write stream that will contain the SMS entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::ExternalizeL(aStream);
+	aStream.WriteUint32L(iMsgStatus);
+	}
+
+EXPORT_C RMobileSmsStore::TMobileGsmSmsEntryV1::TMobileGsmSmsEntryV1()
+	{
+	iExtensionId=KETelMobileGsmSmsEntryV1;
+	}
+
+void RMobileSmsStore::TMobileGsmSmsEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the SMS entry from a stream
+ *
+ * @param aStream The read stream containing the SMS fixed size entry
+ */
+	{
+	TMobileSmsEntryV1::InternalizeL(aStream);
+	aStream >> iServiceCentre;
+	aStream >> iMsgData;
+	}
+
+void RMobileSmsStore::TMobileGsmSmsEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the SMS entry into a stream
+ *
+ * @param aStream The write stream that will contain the SMS entry
+ */
+	{
+	TMobileSmsEntryV1::ExternalizeL(aStream);
+	aStream << iServiceCentre;
+	aStream << iMsgData;
+	}
+
+EXPORT_C RMobileSmsStore::TMobileCdmaSmsEntryV1::TMobileCdmaSmsEntryV1()
+: iTeleservice(0), iServiceCategory(0)
+	{
+	iExtensionId=KETelMobileCdmaSmsEntryV1;
+	}
+
+void RMobileSmsStore::TMobileCdmaSmsEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the SMS entry from a stream
+ *
+ * @param aStream The read stream containing the SMS fixed size entry
+ */
+	{
+	TMobileSmsEntryV1::InternalizeL(aStream);
+	iTeleservice = aStream.ReadInt32L();
+	iServiceCategory = aStream.ReadInt32L();
+	aStream >> iRemoteParty;
+	aStream >> iMsgData;
+	}
+
+void RMobileSmsStore::TMobileCdmaSmsEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the SMS entry into a stream
+ *
+ * @param aStream The write stream that will contain the SMS entry
+ */
+	{
+	TMobileSmsEntryV1::ExternalizeL(aStream);
+	aStream.WriteInt32L(iTeleservice);
+	aStream.WriteInt32L(iServiceCategory);
+	aStream << iRemoteParty;
+	aStream << iMsgData;
+	}
+
+
+/************************************************************************/
+//
+//  RMobileNamStore
+//
+/************************************************************************/
+
+
+EXPORT_C RMobileNamStore::RMobileNamStore()
+/** Constructor. */
+	{
+	}
+
+
+EXPORT_C void RMobileNamStore::ConstructL()
+/** Initializes and allocated the members of the RMobileNamStore object.
+
+@leave KErrNoMemory Out of memory 
+@capability None
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
+	CMobilePhoneStorePtrHolder* ptrHolder = CNamStorePtrHolder::NewL(CNamStorePtrHolder::EMaxNumberNamStorePtrSlots,CNamStorePtrHolder::EMaxNumberNamStorePtrCSlots);
+	RMobilePhoneStore::BaseConstruct(ptrHolder);
+	}
+
+EXPORT_C TInt RMobileNamStore::Open(RMobilePhone& aPhone)
+/** This member function opens a RMobileNamStore subsession from RMobilePhone.
+
+@param aPhone The phone subsession to use.
+@return KErrNone if successful, a system-wide error code if not. 
+@capability None
+*/
+	{
+	RSessionBase* session=&aPhone.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aPhone.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TRAPD(ret,ConstructL());
+	if (ret)
+		return ret;
+	TPtrC name(KETelNamStore);
+	TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle);
+	SetSessionHandle(*session);
+	ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
+	if (ret)
+		Destruct();
+	return ret;
+	}
+
+EXPORT_C void RMobileNamStore::Close()
+/** This member function closes a RMobileNamStore subsession. 
+@capability None
+*/
+	{
+	CloseSubSession(EEtelClose);
+	Destruct();
+	}
+
+EXPORT_C RMobileNamStore::TMobileNamStoreInfoV1::TMobileNamStoreInfoV1()
+:	iNamCount(0),
+	iActiveNam(0)
+	{
+	iExtensionId=KETelMobileNamStoreV1;
+	}
+
+EXPORT_C void RMobileNamStore::SetActiveNam(TRequestStatus& aReqStatus, TInt aNamId) const
+/** This member function sets a new value for the active NAM.
+
+@param aReqStatus On return, KErrNone if successful, a system-wide error code
+if not.
+@param aNamId Specifies which NAM to activate. 
+@capability WriteDeviceData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	CNamStorePtrHolder* namStorePtrHolder = static_cast<CNamStorePtrHolder*>(iStorePtrHolder);
+
+	namStorePtrHolder->iSetActiveNamNamId = aNamId;
+	TPtrC8& ptr1=namStorePtrHolder->SetC(CNamStorePtrHolder::ESlot1SetActiveNam,namStorePtrHolder->iSetActiveNamNamId);
+
+	Set(EMobileNamStoreSetActiveNam,aReqStatus,ptr1);
+	}
+
+EXPORT_C RMobileNamStore::TMobileNamEntryV1::TMobileNamEntryV1()
+: 	iNamId(0),
+	iParamIdentifier(0)
+	{
+	}
+
+EXPORT_C RMobileNamStore::TMobileNamEntryV4::TMobileNamEntryV4()
+: 	iNamId(0),
+	iParamIdentifier(0)
+	{
+	iExtensionId = KETelExtMultimodeV4;
+	}
+
+void RMobileNamStore::TMobileNamEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the NAM entry from a stream
+ *
+ * @param aStream The read stream containing the NAM entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::InternalizeL(aStream);
+	iNamId = aStream.ReadInt32L();
+	iParamIdentifier = aStream.ReadUint32L();
+	aStream >> iData;
+	}
+
+void RMobileNamStore::TMobileNamEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the NAM entry into a stream
+ *
+ * @param aStream The write stream that will contain the NAM entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::ExternalizeL(aStream);
+	aStream.WriteInt32L(iNamId);
+	aStream.WriteUint32L(iParamIdentifier);
+	aStream << iData;
+	}
+
+void RMobileNamStore::TMobileNamEntryV4::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the NAM entry from a stream
+ *
+ * @param aStream The read stream containing the NAM entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::InternalizeL(aStream);
+	iNamId = aStream.ReadInt32L();
+	iParamIdentifier = aStream.ReadInt32L();
+	aStream >> iData;
+	}
+
+void RMobileNamStore::TMobileNamEntryV4::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the NAM entry into a stream
+ *
+ * @param aStream The write stream that will contain the NAM entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::ExternalizeL(aStream);
+	aStream.WriteInt32L(iNamId);
+	aStream.WriteInt32L(iParamIdentifier);
+	aStream << iData;
+	}
+
+EXPORT_C void RMobileNamStore::StoreAllL(TRequestStatus& aReqStatus, TInt aNamId, CMobilePhoneNamList* aNamList) const
+/** This member function stores a new version of the NAM list.
+
+@param aReqStatus On return, KErrNone if successful, a system-wide error code
+if not.
+@param aNamId Specifies which NAM to use.
+@param aNamList Pointer to the list containing the NAM entries to store.
+@leave KErrNoMemory Out of memory 
+@capability WriteDeviceData
+*/
+	{
+	__ASSERT_ALWAYS(aNamList!=NULL,PanicClient(EEtelPanicNullHandle));
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	CNamStorePtrHolder* namStorePtrHolder = static_cast<CNamStorePtrHolder*>(iStorePtrHolder);
+
+	delete namStorePtrHolder->iNamBuf;
+	namStorePtrHolder->iNamBuf=NULL;
+
+	namStorePtrHolder->iNamBuf=aNamList->StoreLC();
+	CleanupStack::Pop();
+
+	(namStorePtrHolder->iNamPtr).Set((namStorePtrHolder->iNamBuf)->Ptr(0));
+
+	namStorePtrHolder->iStoreAllNamId = aNamId;
+	TPtrC8& ptr1=namStorePtrHolder->SetC(CNamStorePtrHolder::ESlot1NamListStoreAll,namStorePtrHolder->iStoreAllNamId);
+
+	Set(EMobileNamStoreStoreAll, aReqStatus, ptr1, namStorePtrHolder->iNamPtr);
+	}
+
+EXPORT_C void RMobileNamStore::StoreAllL(TRequestStatus& aReqStatus, TInt aNamId, CMobilePhoneNamListV4* aNamList) const
+/** This member function stores a new version of the NAM list.
+
+@param aReqStatus On return, KErrNone if successful, a system-wide error code
+if not.
+@param aNamId Specifies which NAM to use.
+@param aNamList Pointer to the list containing the NAM entries to store.
+@leave KErrNoMemory Out of memory 
+@capability WriteDeviceData
+*/
+	{
+	__ASSERT_ALWAYS(aNamList!=NULL,PanicClient(EEtelPanicNullHandle));
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	CNamStorePtrHolder* namStorePtrHolder = static_cast<CNamStorePtrHolder*>(iStorePtrHolder);
+
+	delete namStorePtrHolder->iNamBufV4;
+	namStorePtrHolder->iNamBufV4=NULL;
+
+	namStorePtrHolder->iNamBufV4=aNamList->StoreLC();
+	CleanupStack::Pop();
+
+	(namStorePtrHolder->iNamPtrV4).Set((namStorePtrHolder->iNamBufV4)->Ptr(0));
+
+	namStorePtrHolder->iStoreAllNamId = aNamId;
+	TPtrC8& ptr1=namStorePtrHolder->SetC(CNamStorePtrHolder::ESlot1NamListStoreAllV4,namStorePtrHolder->iStoreAllNamId);
+
+	Set(EMobileNamStoreStoreAllV4, aReqStatus, ptr1, namStorePtrHolder->iNamPtrV4);
+	}
+
+/************************************************************************/
+//
+//  RMobileONStore
+//
+/************************************************************************/
+
+
+EXPORT_C RMobileONStore::RMobileONStore()
+/** Constructor. */
+	{
+
+	}
+
+EXPORT_C void RMobileONStore::ConstructL()
+/** Initializes and allocated the members of the RMobileONStore object.
+
+@leave KErrNoMemory Out of memory. 
+@capability None
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
+	CMobilePhoneStorePtrHolder* ptrHolder = CONStorePtrHolder::NewL(CONStorePtrHolder::EMaxNumberONStorePtrSlots, CONStorePtrHolder::EMaxNumberONStorePtrCSlots);
+	RMobilePhoneStore::BaseConstruct(ptrHolder);
+	}
+
+EXPORT_C TInt RMobileONStore::Open(RMobilePhone& aPhone)
+/** This member function opens a RMobileONStore subsession from RMobilePhone.
+
+@param aPhone The phone subsession to use.
+@return KErrNone if successful, a system-wide error code if not. 
+@capability None
+*/
+	{
+	RSessionBase* session=&aPhone.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aPhone.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TRAPD(ret,ConstructL());
+	if (ret)
+		return ret;
+	TPtrC name(KETelOwnNumberStore);
+	TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle);
+	SetSessionHandle(*session);
+	ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
+	if (ret)
+		Destruct();
+	return ret;
+	}
+
+EXPORT_C void RMobileONStore::Close()
+/** This member function closes a RMobileONStore subsession. 
+@capability None
+*/
+	{
+	CloseSubSession(EEtelClose);
+	Destruct();
+	}
+
+
+EXPORT_C RMobileONStore::TMobileONStoreInfoV1::TMobileONStoreInfoV1()
+: 	iNumberLen(0),
+	iTextLen(0)
+	{
+	iExtensionId=KETelMobileONStoreV1;
+	}
+
+EXPORT_C RMobileONStore::TMobileONEntryV1::TMobileONEntryV1()
+: 	iMode(RMobilePhone::ENetworkModeUnknown),
+	iService(RMobilePhone::EServiceUnspecified)
+	{
+	}
+
+void RMobileONStore::TMobileONEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the Own Number entry from a stream
+ *
+ * @param aStream The read stream containing the Own Number entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::InternalizeL(aStream);
+	iMode = static_cast<RMobilePhone::TMobilePhoneNetworkMode>(aStream.ReadUint32L());
+	aStream >> iText;
+	aStream >> iNumber;
+	iService = static_cast<RMobilePhone::TMobileService>(aStream.ReadUint32L());
+	}
+
+void RMobileONStore::TMobileONEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the Own Number entry into a stream
+ *
+ * @param aStream The write stream that will contain the Own Number entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::ExternalizeL(aStream);
+	aStream.WriteUint32L(iMode);
+	aStream << iText;
+	aStream << iNumber;
+	aStream.WriteUint32L(iService);
+	}
+
+EXPORT_C void RMobileONStore::StoreAllL(TRequestStatus& aReqStatus, CMobilePhoneONList* aONList) const
+/** This member function stores a new version of the Own Number list onto the SIM.
+
+@param aReqStatus On return, KErrNone if successful, a system-wide error code
+if not.
+@param aONList Pointer to the list containing the Own Number entries to store.
+@leave KErrNoMemory Out of memory 
+@capability WriteUserData
+*/
+	{
+	__ASSERT_ALWAYS(aONList!=NULL,PanicClient(EEtelPanicNullHandle));
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	CONStorePtrHolder* onStorePtrHolder = static_cast<CONStorePtrHolder*>(iStorePtrHolder);
+
+	delete onStorePtrHolder->iONBuf;
+	onStorePtrHolder->iONBuf=NULL;
+
+	onStorePtrHolder->iONBuf=aONList->StoreLC();
+	CleanupStack::Pop();
+
+	(onStorePtrHolder->iONPtr).Set((onStorePtrHolder->iONBuf)->Ptr(0));
+
+	Set(EMobileONStoreStoreAll, aReqStatus, onStorePtrHolder->iONPtr);
+	}
+
+
+/************************************************************************/
+//
+//  RMobileENStore
+//
+/************************************************************************/
+
+
+EXPORT_C RMobileENStore::RMobileENStore()
+/** Empty constructor. */
+	{
+	}
+
+EXPORT_C void RMobileENStore::ConstructL()
+/** Initializes and allocated the members of the RMobileENStore object.
+
+@leave KErrNoMemory Out of memory. 
+@capability None
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
+	CMobilePhoneStorePtrHolder* ptrHolder = CMobilePhoneStorePtrHolder::NewL(CMobilePhoneStorePtrHolder::EMaxNumberPhoneStorePtrSlots, CMobilePhoneStorePtrHolder::EMaxNumberPhoneStorePtrCSlots);
+	RMobilePhoneStore::BaseConstruct(ptrHolder);
+	}
+
+EXPORT_C TInt RMobileENStore::Open(RMobilePhone& aPhone)
+/** This function member opens a RMobileENStore subsession from RMobilePhone.
+
+@param aPhone The phone subsession to use.
+@return KErrNone if successful, a system-wide error code if not. 
+@capability None
+*/
+	{
+	RSessionBase* session=&aPhone.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aPhone.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TRAPD(ret,ConstructL());
+	if (ret)
+		return ret;
+	TPtrC name(KETelEmergencyNumberStore);
+	TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle);
+	SetSessionHandle(*session);
+	ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
+	if (ret)
+		Destruct();
+	return ret;
+	}
+
+EXPORT_C void RMobileENStore::Close()
+/** This function member closes a RMobileENStore subsession. 
+@capability None
+*/
+	{
+	CloseSubSession(EEtelClose);
+	Destruct();
+	}
+
+EXPORT_C RMobileENStore::TMobileENEntryV1::TMobileENEntryV1()
+: 	iNetworkSpecific(EFalse),
+	iMode(RMobilePhone::ENetworkModeUnknown)
+	{
+	}
+
+void RMobileENStore::TMobileENEntryV1::InternalizeL(RReadStream& aStream)
+/**
+ * This method internalizes the Emergency Number entry from a stream
+ *
+ * @param aStream The read stream containing the Emergency Number entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::InternalizeL(aStream);
+
+	iNetworkSpecific = static_cast<TBool>(aStream.ReadInt32L());
+	iMode = static_cast<RMobilePhone::TMobilePhoneNetworkMode>(aStream.ReadUint32L());
+	aStream >> iCountryCode;
+	aStream >> iIdentity;
+	aStream >> iNumber;
+	aStream >> iAlphaId;
+	iCallType = aStream.ReadInt32L();
+	}
+
+void RMobileENStore::TMobileENEntryV1::ExternalizeL(RWriteStream& aStream) const
+/**
+ * This method externalizes the Emergency Number entry into a stream
+ *
+ * @param aStream The write stream that will contain the Emergency Number entry
+ */
+	{
+	TMobilePhoneStoreEntryV1::ExternalizeL(aStream);
+
+	aStream.WriteInt32L(iNetworkSpecific);
+	aStream.WriteUint32L(iMode);
+	aStream << iCountryCode;
+	aStream << iIdentity;
+	aStream << iNumber;
+	aStream << iAlphaId;
+	aStream.WriteInt32L(iCallType);
+	}
+
+/************************************************************************/
+//
+//  RMobilePhoneBookStore
+//
+/************************************************************************/
+
+
+EXPORT_C RMobilePhoneBookStore::RMobilePhoneBookStore()
+/** Constructor. */
+	{
+	}
+
+EXPORT_C void RMobilePhoneBookStore::ConstructL()
+/** Constructor. 
+@capability None
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
+	CMobilePhoneStorePtrHolder* ptrHolder = CPhoneBookStorePtrHolder::NewL(CPhoneBookStorePtrHolder::EMaxNumberPhoneBookStorePtrSlots, CPhoneBookStorePtrHolder::EMaxNumberPhoneBookStorePtrCSlots);
+	RMobilePhoneStore::BaseConstruct(ptrHolder);
+	}
+
+EXPORT_C TInt RMobilePhoneBookStore::Open(RMobilePhone& aPhone, const TDesC& aStore)
+/** This function opens a RMobilePhoneBookStore sub-session from a previously opened
+RMobilePhone sub-session. The name of the phone book to open is passed in
+the aStore parameter. The type of valid phone books can be obtained by RMobilePhone::GetPhoneStoreInfo().
+
+@param aPhone The opened RMobilePhone sub-session
+@param aStore The name of the phone book to open.
+@return KErrNone if successful, an general error code if not.
+@see RMobilePhone::GetPhoneStoreInfo() 
+@capability None
+*/
+	{
+	RSessionBase* session=&aPhone.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aPhone.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TRAPD(ret,ConstructL());
+	if (ret)
+		return ret;
+	TIpcArgs args(const_cast<TDesC*>(&aStore),TIpcArgs::ENothing,subSessionHandle);
+	SetSessionHandle(*session);
+	ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
+	if (ret)
+		Destruct();
+	return ret;
+	}
+
+EXPORT_C TInt RMobilePhoneBookStore::Open(RMobilePhone& aPhone, const TDesC& aStore,const TDesC& aMode)
+/**
+This method opens a RMobilePhoneBookStore subsession from RMobilePhone.
+
+This API method overloads the normal RMobilePhoneBookStore::Open. The phonebook
+mode is indicated by the aMode parameter, which allows the client to distinguish
+between the different sets of phonebooks that can be present on the ICC or
+ME side. E.g. a client can open both the GSM ADN phonebook and the USIM ADN
+phonebook on a UICC. The client would then be able to switch on the fly between
+the GSM/global phonebook and the (active) USIM Application phonebook.
+
+A UICC can comprise of many USIM applications and a GSM application. Only
+one of application can be active at any one point. The USIM applications contain
+their own phonebooks (ADN, FDN, etc..). To open a USIM Application phonebook,
+the USIM Application must be active. It is not possible to access a phonebook
+of a USIM Application that is not currently active.
+
+This API method opens a RMobilePhoneBookStore sub-session from a previously
+opened RMobilePhone sub-session. The name of the phone book to open is passed
+in the aStore parameter. The names of known and valid phone books for this
+API methods are listed in the table below. The phone may not support all of
+these phone books so clients should check which are available using the method
+in the previous section 4.8.1.
+
+Note for the TSY development: Internally ETel will pass to the TSY one TDesC
+variable containing: the phonebookname as defined in 8.4.1 for GSM and CDMA
+ICCs or the phonebookname followed by a delimiting character (i.e. the PHBOOK_DELIMITER
+defined in ETelMM.h) and the ICC type (i.e. UICC) for UMTS.
+
+@param aPhone The opened RMobilePhone sub-session.
+@param aStore The name of the phone book to open.
+@param aMode The phonebook mode.
+@return KErrNone if successful, an general error code if not. 
+@capability None
+*/
+	{
+	RSessionBase* session=&aPhone.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aPhone.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TRAPD(ret,ConstructL());
+	if (ret)
+		return ret;
+	TIpcArgs args;
+
+	// The TSY should assume that the phonebook type is GSM or CDMA, if the aMode is not
+	// present. In the case of USIM (WCDMA), the "mode" will be appended to the parameter
+	// that is used to pass the phonebook name (using a delimiter to seperate the two params).
+	// The TSY should tokenize this parameter (using the delimiter) and retrieve the phonebook
+	// type (only USim currently) and phonebook name.
+
+	if(aMode.Compare(KEtelUSimPhoneBookType) == 0)
+		{
+			if((aStore.Length()+aMode.Length()+KSizeOfPhbookDelimiter)<=KMaxName)
+			{
+				TName aUmtsStore;
+				aUmtsStore.FillZ();
+				aUmtsStore.Copy(aStore);
+				aUmtsStore.Append(PHBOOK_DELIMITER);
+				aUmtsStore.Append(aMode);
+				args.Set(0,&aUmtsStore);
+			}
+			else
+				return KErrOverflow;
+		}
+	else
+		{
+		args.Set(0,const_cast<TDesC*>(&aStore));
+		}
+	SetSessionHandle(*session);
+	args.Set(1,TIpcArgs::ENothing);
+  	args.Set(2,subSessionHandle);
+	ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
+	if (ret)
+		Destruct();
+	return ret;
+	}
+
+EXPORT_C void RMobilePhoneBookStore::Close()
+/** This member function closes the phone book sub-session. 
+@capability None
+*/
+	{
+	CloseSubSession(EEtelClose);
+	Destruct();
+	}
+
+EXPORT_C RMobilePhoneBookStore::TMobilePhoneBookInfoV1::TMobilePhoneBookInfoV1()
+:	iMaxNumLength(-1),
+	iMaxTextLength(-1),
+	iLocation(ELocationUnknown),
+	iChangeCounter(0)
+	{
+	iExtensionId=KETelMobilePhonebookStoreV1;
+	}
+
+
+
+EXPORT_C RMobilePhoneBookStore::TMobilePhoneBookInfoV2::TMobilePhoneBookInfoV2()
+:	TMobilePhoneBookInfoV1(),
+	iPhBkMode(0)
+/**
+* This is the initialization of the TMobilePhoneBookInfoV2 structured type
+*
+*/
+	{
+	iExtensionId=KETelMobilePhonebookStoreV2;
+	}
+
+EXPORT_C RMobilePhoneBookStore::TMobilePhoneBookInfoV5::TMobilePhoneBookInfoV5()
+:	TMobilePhoneBookInfoV2(),
+	iMaxSecondNames(-1), iMaxTextLengthSecondName(-1), iMaxAdditionalNumbers(-1), 
+	iMaxNumLengthAdditionalNumber(-1), iMaxTextLengthAdditionalNumber(-1), 
+	iMaxGroupNames(-1), iMaxTextLengthGroupName(-1), iMaxEmailAddr(-1), 
+	iMaxTextLengthEmailAddr(-1)
+/**
+* This is the initialization of the TMobilePhoneBookInfoV5 structured type
+*
+*/
+	{
+	iExtensionId=KETelMobilePhonebookStoreV5;
+	}
+
+EXPORT_C void RMobilePhoneBookStore::Read(TRequestStatus& aReqStatus, TInt aIndex, TInt aNumSlots, TDes8& aPBData) const
+/**
+ * This method reads one or more entries from a phonebook store.
+ * The reading will start at the slot specified by aIndex and will stop either after
+ * aNumSlots of slots have been read or no more whole phonebook entries can fit in the
+ * size of the supplied aPBData parameter.
+ *
+ * If there are no used entries in the slots requested then KErrNotFound will be returned.
+ *
+ * Example: If aIndex=1 and aNumSlots=1 then one slot (slot number 1) will be read and
+ * if used, this entry will be returned within aPBData.
+ *
+ * @param aReqStatus returns the result code after the asynchronous call completes
+ * @param  aIndex Specifies the index to start reading from, must be >= 1.
+ * @param  aNumSlots Specifies the number of slots to read, must be >= 1 and <= total number of slots.
+ * @param aPBData A descriptor that will contain the phonebook data in TLV format.
+ 
+@capability ReadUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	CPhoneBookStorePtrHolder* pbStorePtrHolder = static_cast<CPhoneBookStorePtrHolder*>(iStorePtrHolder);
+
+	pbStorePtrHolder->iReadPhoneBookEntry.iIndex = aIndex;
+	pbStorePtrHolder->iReadPhoneBookEntry.iNumSlots = aNumSlots;
+
+	TPtrC8& ptr1=pbStorePtrHolder->SetC(CPhoneBookStorePtrHolder::ESlot1PhoneBookStoreRead, pbStorePtrHolder->iReadPhoneBookEntry);
+	SetAndGet(EMobilePhoneBookStoreRead, aReqStatus, ptr1, aPBData);
+	}
+
+EXPORT_C void RMobilePhoneBookStore::Write(TRequestStatus& aReqStatus, const TDesC8& aPBData, TInt& aIndex) const
+/** This member function writes one phonebook entry to the store. This member function
+is a specialised version of the base class RMobilePhoneStore::Write() and
+all clients of RMobilePhoneBookStore should use this specialised version rather
+than the base class version. The phonebook data will be in aPBData which will
+contain the encoded byte stream of a TLV format phonebook entry.
+
+Note:
+
+Use RTelSubSessionBase::CancelAsyncRequest(EMobilePhoneStoreWrite) to cancel
+a previously placed asynchronous Write request.
+
+@param aReqStatus On return, KErrNone if successful, a system wide error code
+if not.
+@param aPBData The encoded byte stream of TLV formatted phonebook data.
+@param aIndex The slot the TSY will store the entry, or if aIndex=-1 the TSY
+will store the entry in the first free location and then return this location
+within aIndex when it completes the request. 
+@capability WriteUserData
+*/
+	{
+	__ASSERT_ALWAYS(iStorePtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	CPhoneBookStorePtrHolder* pbStorePtrHolder = static_cast<CPhoneBookStorePtrHolder*>(iStorePtrHolder);
+
+	TPtr8& ptr1=pbStorePtrHolder->Set(CPhoneBookStorePtrHolder::ESlot1PhoneBookStoreWrite, aIndex);
+
+	SetAndGet(EMobilePhoneBookStoreWrite, aReqStatus, aPBData, ptr1);
+	}