--- a/telephonyserverplugins/multimodetsy/Multimode/mPHBKCOM.CPP Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/Multimode/mPHBKCOM.CPP Thu May 06 15:10:38 2010 +0100
@@ -1,708 +1,708 @@
-// Copyright (c) 1997-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:
-// Multimode TSY Phone book Implementation file.
-// This file contains the implementation of the CATPhoneBookCommands, CATPhoneBookInit,
-// CATPhoneBookWrite and CATPhoneBookDelete classes.
-//
-//
-
-/**
- @file
-*/
-
-#include "Mphbkcom.h"
-#include "mSLOGGER.H"
-#include "mPHBOOK.H"
-#include "NOTIFY.H"
-#include "ATIO.H"
-#include "Matstd.h"
-
-// AT commands
-
-_LIT8(KPhoneBookReadAll,"AT+CPBR="); // Modified from "AT+CPBR=1,n; 1 is not always the starting index
-_LIT8(KPhoneBookReadResponse,"+CPBR:*");
-
-_LIT8(KPhoneBookWriteWithIndex,"AT+CPBW=%d,\"%S\",%d,\"%S\"");
-_LIT8(KPhoneBookWriteWithIndexPrependedPlus,"AT+CPBW=%d,\"+%S\",%d,\"%S\"");
-_LIT8(KPhoneBookDelete,"AT+CPBW=%d");
-_LIT8(KPhoneBookAlternativeDelete,"AT+CPBW=%d,\"\",,\"\"");
-
-
-const TInt KPhoneBookTimeForExtraRxData=100;
-
-// Time-outs
-
-const TInt KPhoneBookReadTimeout=30; //< Time-out used when reading the phone books (in seconds). For sizeable phonebooks, this can be large.
- //< The Siemens S25 is the slowest phone observed. The Nokia 8210 can take 14s to read an empty 200 entry phonebook.
-
-//
-// CATPhoneBookCommands definitions
-//
-
-CATPhoneBookCommands::CATPhoneBookCommands(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
- : CATCommands(aIo,aTelObject,aInit,aPhoneGlobals), iState(EATPhoneBookCommandIdle)
- {}
-
-CATPhoneBookCommands::~CATPhoneBookCommands()
-/**
- * Destructor.
- */
- {
- iIo->RemoveExpectStrings(this);
- }
-
-void CATPhoneBookCommands::EventSignal(TEventSource aEventSource)
-/**
- * This function contains the State machine for the phonebook commands whose classes
- * inherit from the CATPhoneBookCommands class.
- *
- * Note: The cases EATPhoneBookCommandWaitForReadComplete & EATPhoneBookCommandWait-
- * ForAlternativeReadComplete are overriden by similar cases in CATPhoneBookInit::
- * EventSignal and CATPhoneBookRead::EventSignal.
- */
- {
- if (aEventSource==ETimeOutCompletion && iState!=EATPhoneBookCommandExtendedRead)
- {
- LOGTEXT(_L8("Timeout Error during phone book command"));
- RemoveStdExpectStrings();
- Complete(KErrTimedOut,aEventSource);
- return;
- }
-
- TInt ret=KErrNone;
- switch (iState)
- {
- case EATPhoneBookStorageSelectWaitForWriteComplete:
- __ASSERT_ALWAYS(aEventSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
- AddStdExpectStrings();
- iIo->SetTimeOut(this);
- iState=EATPhoneBookStorageSelectWaitForReadComplete;
- return;
-
- case EATPhoneBookStorageSelectWaitForReadComplete:
- __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
- {
- ret=ValidateExpectString();
- RemoveStdExpectStrings();
- if (ret!=KErrNone)
- {
- Complete(ret,aEventSource);
- return;
- }
- CMobilePhonebookStore* phoneBook=REINTERPRET_CAST(CMobilePhonebookStore*,iTelObject);
- iPhoneGlobals->iPhoneStatus.iLastAccessedPhoneBook=phoneBook->StorageType();
- }
- StartThisCommand();
- return;
-
- case EATPhoneBookCommandWaitForWriteComplete:
- __ASSERT_ALWAYS(aEventSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
- iIo->SetTimeOut(this);
- AddStdExpectStrings();
- iState=EATPhoneBookCommandWaitForReadComplete;
- return;
-
- case EATPhoneBookCommandWaitForReadComplete:
- case EATPhoneBookCommandWaitForAlternativeReadComplete:
- __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
- ret=ValidateExpectString();
- RemoveStdExpectStrings();
- if (ret!=KErrNone)
- {
- Complete(ret,aEventSource);
- return;
- }
- iIo->SetTimeOut(this,KPhoneBookTimeForExtraRxData);
- iState=EATPhoneBookCommandExtendedRead;
- return;
-
- case EATPhoneBookCommandWaitForAlternativeWriteComplete:
- __ASSERT_ALWAYS(aEventSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
- iIo->SetTimeOut(this,KPhoneBookReadTimeout*KOneSecondPause);
- AddStdExpectStrings();
- iState=EATPhoneBookCommandWaitForAlternativeReadComplete;
- return;
-
- case EATPhoneBookCommandExtendedRead:
- __ASSERT_ALWAYS(aEventSource==ETimeOutCompletion,Panic(EATCommand_IllegalCompletionWaitExpected));
- Complete(ret,aEventSource);
- return;
-
- case EATPhoneBookCommandIdle:
- default:
- return;
- }
- }
-
-void CATPhoneBookCommands::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
-/**
- * This function is called if an error occurs. It cancels the relevant timer and
- * completes the request before setting the state to Idle.
- */
- {
- if (iState!=EATPhoneBookCommandIdle)
- {
- iIo->WriteAndTimerCancel(this);
- iTelObject->ReqCompleted(iReqHandle,aStatus);
- iState=EATPhoneBookCommandIdle;
- }
- }
-
-void CATPhoneBookCommands::StartStorageSelect()
-/**
- * This function finds out which phone book memory to set and then transmits the
- * set command ("AT+CPBS=xx") to the relevant phone book.
- */
- {
- LOGTEXT(_L8("Starting AT+CPBS= Command"));
-
- CMobilePhonebookStore* phoneBook=REINTERPRET_CAST(CMobilePhonebookStore*,iTelObject);
- if (iPhoneGlobals->iPhoneStatus.iLastAccessedPhoneBook==phoneBook->StorageType())
- {
- StartThisCommand();
- }
- else
- {
- TBuf8<KGenericBufferSize> buf;
- TStorageType storageType(phoneBook->StorageType());
- buf.Format(KPhoneBookStorageSet,&storageType);
- WriteExpectingResults(buf,3);
- __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
- iState=EATPhoneBookStorageSelectWaitForWriteComplete;
- }
- }
-
-void CATPhoneBookCommands::Stop(TTsyReqHandle aTsyReqHandle)
-/**
- * This function is used to prematurely stop the state machine. This would usually
- * occur following a client cancel request.
- */
- {
- __ASSERT_ALWAYS(aTsyReqHandle == iReqHandle,Panic(EIllegalTsyReqHandle));
- LOGTEXT(_L8("Cancelling phone book command"));
-
- switch (iState)
- {
- case EATPhoneBookStorageSelectWaitForWriteComplete:
- case EATPhoneBookCommandWaitForWriteComplete:
- case EATPhoneBookCommandWaitForAlternativeWriteComplete:
- Complete(KErrCancel,EWriteCompletion);
- return;
-
- case EATPhoneBookStorageSelectWaitForReadComplete:
- case EATPhoneBookCommandWaitForReadComplete:
- case EATPhoneBookCommandWaitForAlternativeReadComplete:
- Complete(KErrCancel,EReadCompletion);
- return;
-
- case EATPhoneBookCommandExtendedRead:
- Complete(KErrCancel,ETimeOutCompletion);
- return;
-
- case EATPhoneBookCommandIdle:
- default:
- return;
- }
- }
-
-void CATPhoneBookCommands::Complete(TInt aError,TEventSource aSource)
-/**
- * This function completes a client request. Sets the state machine to Idle.
- */
- {
- iIo->WriteAndTimerCancel(this);
- iIo->RemoveExpectStrings(this);
- if (aSource==EWriteCompletion)
- iIo->Read();
- iState=EATPhoneBookCommandIdle;
- CATCommands::Complete(aError,aSource);
- iTelObject->ReqCompleted(iReqHandle,aError);
- }
-
-//
-// CATPhoneBookRead definitions
-//
-
-CATPhoneBookRead::CATPhoneBookRead(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals,CATPhoneBookInfo *aInfo)
- : CATPhoneBookCommands(aIo,aTelObject,aInit,aPhoneGlobals),
- iInfo(aInfo)
-/**
- * C++ constructor
- */
- {}
-
-CATPhoneBookRead::~CATPhoneBookRead()
-/**
- * Destructor.
- */
- {
- delete iPbBuffer;
- }
-
-CATPhoneBookRead* CATPhoneBookRead::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals,CATPhoneBookInfo *aInfo)
-/**
- * Standard 2 phase constructor.
- * This method creats an instance of the CATPhoneBookRead class.
- */
- {
- CATPhoneBookRead* r=new(ELeave) CATPhoneBookRead(aIo,aTelObject,aInit,aPhoneGlobals,aInfo);
- CleanupStack::PushL(r);
- r->ConstructL();
- CleanupStack::Pop();
- return r;
- }
-
-void CATPhoneBookRead::ConstructL()
-/**
- * Standard 2nd phase constructor.
- * Creates phonebook buffer object used to populate client buffer
- */
- {
- CATCommands::ConstructL();
- iPbBuffer = new(ELeave) CPhoneBookBuffer();
- }
-
-void CATPhoneBookRead::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
-/**
- * Start function. Its calls the StartStorageSelect() function to select
- * the phone book memory.
- */
- {
- iReqHandle=aTsyReqHandle;
- iRead = static_cast<RMobilePhoneBookStore::TPBIndexAndNumEntries*>(aParams);
- StartStorageSelect();
- }
-
-void CATPhoneBookRead::StartThisCommand()
-/**
- * This function starts the "AT+CPBR=minimum index, maximum index" command, i.e,
- * Read one or a number of entries in the selected phone book. It constructs the command
- * using the starting index and the number of entries that are to be read. It
- * then sets the state machine going.
- */
- {
- LOGTEXT(_L8("Starting AT+CPBR=minIndex,maxIndex Command (Read one or more entries)"));
-
- // Construct the AT+CPBR=a,z command. The starting index is not necessarily 1
- TBuf8<KGenericBufferSize> buf(KPhoneBookReadAll);
- buf.AppendNum(iRead->iIndex); // starting location in the phonebook from which to read
-
- if (iRead->iNumSlots>1)
- {
- // If more than one entry to be read also put finishing index
- buf.Append(KCommaChar);
- buf.AppendNum(iRead->iIndex + iRead->iNumSlots -1); // last location from which to read
- }
-
- iNumReadEntries=0;
- WriteExpectingResults(buf,3);
- __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
- iCPBRResponse=iIo->AddExpectString(this,KPhoneBookReadResponse);
- iState=EATPhoneBookCommandWaitForAlternativeWriteComplete;
- }
-
-void CATPhoneBookRead::ParseResponseL()
-/**
- * This function parses a line of response to the "AT+CBPR=minimum index, maximum index"
- * command and converts the phonebook data into the TLV format. Note that the minimum
- * index of the phone book memory need not necessarily
- * start at 1 (e.g the phonebook could use range [100 to 150].
- */
- {
- ParseBufferLC(EFalse, ':');
-
- TDblQueIter<CATParamListEntry> iter(iRxResults);
- CATParamListEntry* entry=iter++; //Assume discarded CPBR string
- if (entry==NULL)
- User::Leave(KErrGeneral);
- TInt ret(KErrNone);
- TBuf16<KGenericBufferSize> buffer;
-
- // new entry so append the new entry tag first
- if(iPbBuffer->AddNewEntryTag() == KErrNone)
- {
- // convert index into TLV format and append it to the supplied buffer
- entry=iter++;
- if(!entry)
- User::Leave(KErrGeneral);
- TInt index=CATParamListEntry::EntryValL(entry);
-
- if (iInfo->Completed())
- {
- LOGTEXT(_L8("CATPhoneBookRead::ParseResponseL Mapping phone index to client index"));
- iInfo->MapPhoneIndexToClientIndex(index);
- }
-
- ret = iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBAdnIndex, static_cast<TUint16>(index));
-
- if(ret == KErrNone) // only continue if the previous field successfully appended
- {
- // convert number into TLV format and append it to the supplied buffer
- entry=iter++;
- if (!entry)
- User::Leave(KErrGeneral);
- buffer.Copy(entry->iResultPtr);
-// If the number has a leading "+" then remove it. Note: in this case, we assume that the TON will be international.
- if((buffer.Length()>0)&&(buffer[0]=='+'))
- buffer.Delete(0,1);
-
- TPtrC16 numberPtr(buffer);
- ret=iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, numberPtr);
-
- if(ret == KErrNone) // only continue if the previous field successfully appended
- {
- // convert type into TLV format and append it to the supplied buffer
- entry=iter++;
- TInt type=CATParamListEntry::EntryValL(entry);
- ret=iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBTonNpi, static_cast<TUint8>(type));
-
- if(ret == KErrNone) // only continue if the previous field successfully appended
- {
- // convert text into TLV format and append it to the supplied buffer
- entry=iter++;
- if (!entry)
- User::Leave(KErrGeneral);
- buffer.Copy(entry->iResultPtr);
- TPtrC16 textPtr(buffer);
- ret=iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBText, textPtr);
- if(ret==KErrNone)
- iNumReadEntries++;
- }
- }
- }
- } // end if AddNewEntryTag
-
- // one of the fields could not be appended so remove previous fields from the buffer
- if(ret != KErrNone)
- {
- (void)iPbBuffer->RemovePartialEntry();
- }
- CleanupStack::PopAndDestroy(); // parsed buffer
- }
-
-void CATPhoneBookRead::EventSignal(TEventSource aEventSource)
-/**
- * State machine. Replaces CATPhoneBookCommands implementation to use second command
- * state.
- */
- {
- if ((aEventSource!=ETimeOutCompletion) && (iState==EATPhoneBookCommandWaitForAlternativeReadComplete))
- {
- __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
- // may be a entry, OK, or ERROR
- if (iIo->FoundChatString()==iCPBRResponse)
- {
- TRAPD(ret,ParseResponseL());
- if (ret!=KErrNone)
- {
- Complete(ret,EReadCompletion);
- return;
- }
- // wait for another one
- iIo->SetTimeOut(this,KPhoneBookReadTimeout*KOneSecondPause);
- }
- else
- {
- TInt ret(ValidateExpectString());
- RemoveStdExpectStrings();
- if((ret==KErrNone)&&(iNumReadEntries==0))
- {
-// No entries read, so buffer will be empty and KErrNotFound must be returned.
- ret=KErrNotFound;
- }
- Complete(ret,EReadCompletion);
- }
- }
- else
- CATPhoneBookCommands::EventSignal(aEventSource);
- }
-
-
-void CATPhoneBookRead::CompleteWithIOError(TEventSource,TInt aError)
-/**
- * This function is called if an error occurs. It cancels the relevant timer and
- * completes the request.
- */
- {
- if (iState!=EATPhoneBookCommandIdle)
- {
- iIo->WriteAndTimerCancel(this);
- iCPBRResponse=0;
- iState=EATPhoneBookCommandIdle;
- iTelObject->ReqCompleted(iReqHandle,aError);
- }
- }
-
-
-//
-// CATPhoneBookWrite definitions
-//
-
-CATPhoneBookWrite* CATPhoneBookWrite::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
-/**
- * Standard 2 phase constructor.
- * This method creats an instance of the CATPhoneBookWrite class.
- */
- {
- CATPhoneBookWrite* r=new(ELeave) CATPhoneBookWrite(aIo,aTelObject,aInit,aPhoneGlobals);
- CleanupStack::PushL(r);
- r->ConstructL();
- CleanupStack::Pop();
- return r;
- }
-
-CATPhoneBookWrite::CATPhoneBookWrite(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
- : CATPhoneBookCommands(aIo,aTelObject,aInit,aPhoneGlobals)
-/**
- * C++ constructor
- */
- {}
-
-void CATPhoneBookWrite::ConstructL()
-/**
- * Standard 2nd phase constructor.
- * Creates phonebook buffer object used to extract data from client buffer
- */
- {
- CATCommands::ConstructL();
- iPbBuffer = new(ELeave) CPhoneBookBuffer();
- }
-
-CATPhoneBookWrite::~CATPhoneBookWrite()
-/**
- * Destructor.
- */
- {
- delete iPbBuffer;
- }
-
-void CATPhoneBookWrite::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
-/**
- * Start function. Its calls the StartStorageSelect() function to select
- * the phone book memory.
- */
- {
- iReqHandle=aTsyReqHandle;
- iIndex = *(static_cast<TInt*>(aParams)); // aParams will contain an index
- StartStorageSelect();
- }
-
-void CATPhoneBookWrite::StartThisCommand()
-/**
- * This function starts the Write command. It decodes the phonebook data supplied by the
- * client from the TLV format into the AT+CPBW= format, builds the command and
- * starts the state machine to write the entry to the phone. It can only write
- * one entry at a time.
- */
- {
- LOGTEXT(_L8("Starting AT+CPBW= Command"));
-
- TBuf8<KGenericBufferSize> atbuf; // used for 8-bit AT command characters
- TBuf8<KGenericBufferSize> name;
- TBuf8<KGenericBufferSize> number;
-
- TBuf16<KGenericBufferSize> des16Buf; // used for 16-bit name field
- TPtrC16 des16Ptr(des16Buf);
-
- TUint8 tonNpi(0);
-
- TUint8 aTagValue(0);
- CPhoneBookBuffer::TPhBkTagType aDataType;
-
- TInt ret=KErrNone;
- iPbBuffer->StartRead();
- while ((ret=iPbBuffer->GetTagAndType(aTagValue, aDataType))==KErrNone)
- {
- if (aTagValue==RMobilePhoneBookStore::ETagPBTonNpi)
- {
- (void)iPbBuffer->GetValue(tonNpi);
- }
- else if (aTagValue==RMobilePhoneBookStore::ETagPBText)
- {
- (void)iPbBuffer->GetValue(des16Ptr);
-
- if (des16Ptr.Length() > KGenericBufferSize)
- {
- Complete(KErrOverflow, EWriteCompletion);
- return;
- }
-
- name.Copy(des16Ptr);
- }
- else if (aTagValue==RMobilePhoneBookStore::ETagPBNumber)
- {
- (void)iPbBuffer->GetValue(des16Ptr);
-
- if (des16Ptr.Length() > KGenericBufferSize)
- {
- Complete(KErrOverflow, EWriteCompletion);
- return;
- }
-
- number.Copy(des16Ptr);
- }
- else
- {
- // An unsupported field type - just skip this value
- iPbBuffer->SkipValue(aDataType);
- }
- }
-
- if(ret==KErrNotFound) // This is to ensure the TLV conversion worked
- {
-// If the ton is international, but the number doesn't start with a '+' then prepend one.
- if((tonNpi==145)&&(number.Length()>0)&&(number[0]!='+'))
- atbuf.Format(KPhoneBookWriteWithIndexPrependedPlus,iIndex,&number,tonNpi,&name);
- else
- atbuf.Format(KPhoneBookWriteWithIndex,iIndex,&number,tonNpi,&name);
- }
-
- WriteExpectingResults(atbuf,3);
- __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
- iState=EATPhoneBookCommandWaitForWriteComplete;
- }
-
-
-TUint CATPhoneBookWrite::NumberTypefromMMToGSM(TUint aTypeOfNumberMM)
-/** Maping from MM Number Type To GSM Number Type
- * This method maps the MM way of representing a type of telefon number
- * to the GSM standard.
- */
- {
- switch (aTypeOfNumberMM)
- {
- case 0: // EUnknownNumber (MM)
- return 129; // Nationality unknown (GSM)
- case 1: // EInternationalNumber (MM)
- return 145; // International Number (GSM)
- case 2: // ENationalNumber (MM)
- return 161; // National Number (GSM)
- default:
- return 129; // Nationality unknown (GSM)
- }
- }
-
-
-void CATPhoneBookWrite::ParseResponseL()
- {
- }
-
-
-//
-// CATPhoneBookDelete definitions
-//
-CATPhoneBookDelete* CATPhoneBookDelete::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
-/**
- * Standard 2 phase constructor.
- * This method creats an instance of the CATPhoneBookDelete class.
- */
- {
- CATPhoneBookDelete* r=new(ELeave) CATPhoneBookDelete(aIo,aTelObject,aInit,aPhoneGlobals);
- CleanupStack::PushL(r);
- r->ConstructL();
- CleanupStack::Pop();
- return r;
- }
-
-CATPhoneBookDelete::CATPhoneBookDelete(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
- : CATPhoneBookCommands(aIo,aTelObject,aInit,aPhoneGlobals)
-/**
- * C++ constructor
- */
- {}
-
-CATPhoneBookDelete::~CATPhoneBookDelete()
- {}
-
-void CATPhoneBookDelete::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
-/**
- * Start function. Its calls the StartStorageSelect() function to select
- * the phone book memory.
- */
- {
- iReqHandle=aTsyReqHandle;
- iIndex=*(TInt*)aParams;
-
- StartStorageSelect();
- }
-
-void CATPhoneBookDelete::StartThisCommand()
-/**
- * Start of the Delete command. This function constructs and then sends the Delete
- * command (the Delete command is the same as the write command with just the index to
- * delete specified e.g "AT+CPBW=2" command will delete the entry in index location 2).
- */
- {
- LOGTEXT(_L8("Starting AT+CPBW= Command"));
-
- TBuf8<KGenericBufferSize> buf;
-
- buf.Format(KPhoneBookDelete,iIndex);
- WriteExpectingResults(buf,3);
- __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
- iState=EATPhoneBookCommandWaitForWriteComplete;
- }
-
-void CATPhoneBookDelete::StartAlternativeDelete()
-/**
- * Alternative Delete command. The same principles as the normal delete apply.
- */
- {
- LOGTEXT(_L8("Starting alternative AT+CPBW= Command"));
-
- TBuf8<KGenericBufferSize> buf;
-
- buf.Format(KPhoneBookAlternativeDelete,iIndex);
- WriteExpectingResults(buf,3);
- __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
- iState=EATPhoneBookCommandWaitForAlternativeWriteComplete;
- }
-
-
-void CATPhoneBookDelete::EventSignal(TEventSource aEventSource)
-/**
- * State machine for the Delete command.
- */
- {
- if (iState==EATPhoneBookCommandWaitForReadComplete &&
- aEventSource!=ETimeOutCompletion)
- {
- __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
- TInt ret(ValidateExpectString());
- RemoveStdExpectStrings();
- if (ret==KErrGeneral)
- {
- StartAlternativeDelete();
- return;
- }
- if (ret!=KErrNone)
- {
- Complete(ret,aEventSource);
- return;
- }
- iIo->SetTimeOut(this,KTimeForExtraRxData);
- iState=EATPhoneBookCommandExtendedRead;
- }
- else
- CATPhoneBookCommands::EventSignal(aEventSource);
- }
-
-void CATPhoneBookDelete::ParseResponseL()
-/**
- *
- */
- {
- }
-
-
+// Copyright (c) 1997-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:
+// Multimode TSY Phone book Implementation file.
+// This file contains the implementation of the CATPhoneBookCommands, CATPhoneBookInit,
+// CATPhoneBookWrite and CATPhoneBookDelete classes.
+//
+//
+
+/**
+ @file
+*/
+
+#include "Mphbkcom.h"
+#include "mSLOGGER.H"
+#include "mPHBOOK.H"
+#include "NOTIFY.H"
+#include "ATIO.H"
+#include "Matstd.h"
+
+// AT commands
+
+_LIT8(KPhoneBookReadAll,"AT+CPBR="); // Modified from "AT+CPBR=1,n; 1 is not always the starting index
+_LIT8(KPhoneBookReadResponse,"+CPBR:*");
+
+_LIT8(KPhoneBookWriteWithIndex,"AT+CPBW=%d,\"%S\",%d,\"%S\"");
+_LIT8(KPhoneBookWriteWithIndexPrependedPlus,"AT+CPBW=%d,\"+%S\",%d,\"%S\"");
+_LIT8(KPhoneBookDelete,"AT+CPBW=%d");
+_LIT8(KPhoneBookAlternativeDelete,"AT+CPBW=%d,\"\",,\"\"");
+
+
+const TInt KPhoneBookTimeForExtraRxData=100;
+
+// Time-outs
+
+const TInt KPhoneBookReadTimeout=30; //< Time-out used when reading the phone books (in seconds). For sizeable phonebooks, this can be large.
+ //< The Siemens S25 is the slowest phone observed. The Nokia 8210 can take 14s to read an empty 200 entry phonebook.
+
+//
+// CATPhoneBookCommands definitions
+//
+
+CATPhoneBookCommands::CATPhoneBookCommands(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+ : CATCommands(aIo,aTelObject,aInit,aPhoneGlobals), iState(EATPhoneBookCommandIdle)
+ {}
+
+CATPhoneBookCommands::~CATPhoneBookCommands()
+/**
+ * Destructor.
+ */
+ {
+ iIo->RemoveExpectStrings(this);
+ }
+
+void CATPhoneBookCommands::EventSignal(TEventSource aEventSource)
+/**
+ * This function contains the State machine for the phonebook commands whose classes
+ * inherit from the CATPhoneBookCommands class.
+ *
+ * Note: The cases EATPhoneBookCommandWaitForReadComplete & EATPhoneBookCommandWait-
+ * ForAlternativeReadComplete are overriden by similar cases in CATPhoneBookInit::
+ * EventSignal and CATPhoneBookRead::EventSignal.
+ */
+ {
+ if (aEventSource==ETimeOutCompletion && iState!=EATPhoneBookCommandExtendedRead)
+ {
+ LOGTEXT(_L8("Timeout Error during phone book command"));
+ RemoveStdExpectStrings();
+ Complete(KErrTimedOut,aEventSource);
+ return;
+ }
+
+ TInt ret=KErrNone;
+ switch (iState)
+ {
+ case EATPhoneBookStorageSelectWaitForWriteComplete:
+ __ASSERT_ALWAYS(aEventSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
+ AddStdExpectStrings();
+ iIo->SetTimeOut(this);
+ iState=EATPhoneBookStorageSelectWaitForReadComplete;
+ return;
+
+ case EATPhoneBookStorageSelectWaitForReadComplete:
+ __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+ {
+ ret=ValidateExpectString();
+ RemoveStdExpectStrings();
+ if (ret!=KErrNone)
+ {
+ Complete(ret,aEventSource);
+ return;
+ }
+ CMobilePhonebookStore* phoneBook=REINTERPRET_CAST(CMobilePhonebookStore*,iTelObject);
+ iPhoneGlobals->iPhoneStatus.iLastAccessedPhoneBook=phoneBook->StorageType();
+ }
+ StartThisCommand();
+ return;
+
+ case EATPhoneBookCommandWaitForWriteComplete:
+ __ASSERT_ALWAYS(aEventSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
+ iIo->SetTimeOut(this);
+ AddStdExpectStrings();
+ iState=EATPhoneBookCommandWaitForReadComplete;
+ return;
+
+ case EATPhoneBookCommandWaitForReadComplete:
+ case EATPhoneBookCommandWaitForAlternativeReadComplete:
+ __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+ ret=ValidateExpectString();
+ RemoveStdExpectStrings();
+ if (ret!=KErrNone)
+ {
+ Complete(ret,aEventSource);
+ return;
+ }
+ iIo->SetTimeOut(this,KPhoneBookTimeForExtraRxData);
+ iState=EATPhoneBookCommandExtendedRead;
+ return;
+
+ case EATPhoneBookCommandWaitForAlternativeWriteComplete:
+ __ASSERT_ALWAYS(aEventSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
+ iIo->SetTimeOut(this,KPhoneBookReadTimeout*KOneSecondPause);
+ AddStdExpectStrings();
+ iState=EATPhoneBookCommandWaitForAlternativeReadComplete;
+ return;
+
+ case EATPhoneBookCommandExtendedRead:
+ __ASSERT_ALWAYS(aEventSource==ETimeOutCompletion,Panic(EATCommand_IllegalCompletionWaitExpected));
+ Complete(ret,aEventSource);
+ return;
+
+ case EATPhoneBookCommandIdle:
+ default:
+ return;
+ }
+ }
+
+void CATPhoneBookCommands::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
+/**
+ * This function is called if an error occurs. It cancels the relevant timer and
+ * completes the request before setting the state to Idle.
+ */
+ {
+ if (iState!=EATPhoneBookCommandIdle)
+ {
+ iIo->WriteAndTimerCancel(this);
+ iTelObject->ReqCompleted(iReqHandle,aStatus);
+ iState=EATPhoneBookCommandIdle;
+ }
+ }
+
+void CATPhoneBookCommands::StartStorageSelect()
+/**
+ * This function finds out which phone book memory to set and then transmits the
+ * set command ("AT+CPBS=xx") to the relevant phone book.
+ */
+ {
+ LOGTEXT(_L8("Starting AT+CPBS= Command"));
+
+ CMobilePhonebookStore* phoneBook=REINTERPRET_CAST(CMobilePhonebookStore*,iTelObject);
+ if (iPhoneGlobals->iPhoneStatus.iLastAccessedPhoneBook==phoneBook->StorageType())
+ {
+ StartThisCommand();
+ }
+ else
+ {
+ TBuf8<KGenericBufferSize> buf;
+ TStorageType storageType(phoneBook->StorageType());
+ buf.Format(KPhoneBookStorageSet,&storageType);
+ WriteExpectingResults(buf,3);
+ __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
+ iState=EATPhoneBookStorageSelectWaitForWriteComplete;
+ }
+ }
+
+void CATPhoneBookCommands::Stop(TTsyReqHandle aTsyReqHandle)
+/**
+ * This function is used to prematurely stop the state machine. This would usually
+ * occur following a client cancel request.
+ */
+ {
+ __ASSERT_ALWAYS(aTsyReqHandle == iReqHandle,Panic(EIllegalTsyReqHandle));
+ LOGTEXT(_L8("Cancelling phone book command"));
+
+ switch (iState)
+ {
+ case EATPhoneBookStorageSelectWaitForWriteComplete:
+ case EATPhoneBookCommandWaitForWriteComplete:
+ case EATPhoneBookCommandWaitForAlternativeWriteComplete:
+ Complete(KErrCancel,EWriteCompletion);
+ return;
+
+ case EATPhoneBookStorageSelectWaitForReadComplete:
+ case EATPhoneBookCommandWaitForReadComplete:
+ case EATPhoneBookCommandWaitForAlternativeReadComplete:
+ Complete(KErrCancel,EReadCompletion);
+ return;
+
+ case EATPhoneBookCommandExtendedRead:
+ Complete(KErrCancel,ETimeOutCompletion);
+ return;
+
+ case EATPhoneBookCommandIdle:
+ default:
+ return;
+ }
+ }
+
+void CATPhoneBookCommands::Complete(TInt aError,TEventSource aSource)
+/**
+ * This function completes a client request. Sets the state machine to Idle.
+ */
+ {
+ iIo->WriteAndTimerCancel(this);
+ iIo->RemoveExpectStrings(this);
+ if (aSource==EWriteCompletion)
+ iIo->Read();
+ iState=EATPhoneBookCommandIdle;
+ CATCommands::Complete(aError,aSource);
+ iTelObject->ReqCompleted(iReqHandle,aError);
+ }
+
+//
+// CATPhoneBookRead definitions
+//
+
+CATPhoneBookRead::CATPhoneBookRead(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals,CATPhoneBookInfo *aInfo)
+ : CATPhoneBookCommands(aIo,aTelObject,aInit,aPhoneGlobals),
+ iInfo(aInfo)
+/**
+ * C++ constructor
+ */
+ {}
+
+CATPhoneBookRead::~CATPhoneBookRead()
+/**
+ * Destructor.
+ */
+ {
+ delete iPbBuffer;
+ }
+
+CATPhoneBookRead* CATPhoneBookRead::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals,CATPhoneBookInfo *aInfo)
+/**
+ * Standard 2 phase constructor.
+ * This method creats an instance of the CATPhoneBookRead class.
+ */
+ {
+ CATPhoneBookRead* r=new(ELeave) CATPhoneBookRead(aIo,aTelObject,aInit,aPhoneGlobals,aInfo);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+void CATPhoneBookRead::ConstructL()
+/**
+ * Standard 2nd phase constructor.
+ * Creates phonebook buffer object used to populate client buffer
+ */
+ {
+ CATCommands::ConstructL();
+ iPbBuffer = new(ELeave) CPhoneBookBuffer();
+ }
+
+void CATPhoneBookRead::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
+/**
+ * Start function. Its calls the StartStorageSelect() function to select
+ * the phone book memory.
+ */
+ {
+ iReqHandle=aTsyReqHandle;
+ iRead = static_cast<RMobilePhoneBookStore::TPBIndexAndNumEntries*>(aParams);
+ StartStorageSelect();
+ }
+
+void CATPhoneBookRead::StartThisCommand()
+/**
+ * This function starts the "AT+CPBR=minimum index, maximum index" command, i.e,
+ * Read one or a number of entries in the selected phone book. It constructs the command
+ * using the starting index and the number of entries that are to be read. It
+ * then sets the state machine going.
+ */
+ {
+ LOGTEXT(_L8("Starting AT+CPBR=minIndex,maxIndex Command (Read one or more entries)"));
+
+ // Construct the AT+CPBR=a,z command. The starting index is not necessarily 1
+ TBuf8<KGenericBufferSize> buf(KPhoneBookReadAll);
+ buf.AppendNum(iRead->iIndex); // starting location in the phonebook from which to read
+
+ if (iRead->iNumSlots>1)
+ {
+ // If more than one entry to be read also put finishing index
+ buf.Append(KCommaChar);
+ buf.AppendNum(iRead->iIndex + iRead->iNumSlots -1); // last location from which to read
+ }
+
+ iNumReadEntries=0;
+ WriteExpectingResults(buf,3);
+ __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
+ iCPBRResponse=iIo->AddExpectString(this,KPhoneBookReadResponse);
+ iState=EATPhoneBookCommandWaitForAlternativeWriteComplete;
+ }
+
+void CATPhoneBookRead::ParseResponseL()
+/**
+ * This function parses a line of response to the "AT+CBPR=minimum index, maximum index"
+ * command and converts the phonebook data into the TLV format. Note that the minimum
+ * index of the phone book memory need not necessarily
+ * start at 1 (e.g the phonebook could use range [100 to 150].
+ */
+ {
+ ParseBufferLC(EFalse, ':');
+
+ TDblQueIter<CATParamListEntry> iter(iRxResults);
+ CATParamListEntry* entry=iter++; //Assume discarded CPBR string
+ if (entry==NULL)
+ User::Leave(KErrGeneral);
+ TInt ret(KErrNone);
+ TBuf16<KGenericBufferSize> buffer;
+
+ // new entry so append the new entry tag first
+ if(iPbBuffer->AddNewEntryTag() == KErrNone)
+ {
+ // convert index into TLV format and append it to the supplied buffer
+ entry=iter++;
+ if(!entry)
+ User::Leave(KErrGeneral);
+ TInt index=CATParamListEntry::EntryValL(entry);
+
+ if (iInfo->Completed())
+ {
+ LOGTEXT(_L8("CATPhoneBookRead::ParseResponseL Mapping phone index to client index"));
+ iInfo->MapPhoneIndexToClientIndex(index);
+ }
+
+ ret = iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBAdnIndex, static_cast<TUint16>(index));
+
+ if(ret == KErrNone) // only continue if the previous field successfully appended
+ {
+ // convert number into TLV format and append it to the supplied buffer
+ entry=iter++;
+ if (!entry)
+ User::Leave(KErrGeneral);
+ buffer.Copy(entry->iResultPtr);
+// If the number has a leading "+" then remove it. Note: in this case, we assume that the TON will be international.
+ if((buffer.Length()>0)&&(buffer[0]=='+'))
+ buffer.Delete(0,1);
+
+ TPtrC16 numberPtr(buffer);
+ ret=iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, numberPtr);
+
+ if(ret == KErrNone) // only continue if the previous field successfully appended
+ {
+ // convert type into TLV format and append it to the supplied buffer
+ entry=iter++;
+ TInt type=CATParamListEntry::EntryValL(entry);
+ ret=iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBTonNpi, static_cast<TUint8>(type));
+
+ if(ret == KErrNone) // only continue if the previous field successfully appended
+ {
+ // convert text into TLV format and append it to the supplied buffer
+ entry=iter++;
+ if (!entry)
+ User::Leave(KErrGeneral);
+ buffer.Copy(entry->iResultPtr);
+ TPtrC16 textPtr(buffer);
+ ret=iPbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBText, textPtr);
+ if(ret==KErrNone)
+ iNumReadEntries++;
+ }
+ }
+ }
+ } // end if AddNewEntryTag
+
+ // one of the fields could not be appended so remove previous fields from the buffer
+ if(ret != KErrNone)
+ {
+ (void)iPbBuffer->RemovePartialEntry();
+ }
+ CleanupStack::PopAndDestroy(); // parsed buffer
+ }
+
+void CATPhoneBookRead::EventSignal(TEventSource aEventSource)
+/**
+ * State machine. Replaces CATPhoneBookCommands implementation to use second command
+ * state.
+ */
+ {
+ if ((aEventSource!=ETimeOutCompletion) && (iState==EATPhoneBookCommandWaitForAlternativeReadComplete))
+ {
+ __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+ // may be a entry, OK, or ERROR
+ if (iIo->FoundChatString()==iCPBRResponse)
+ {
+ TRAPD(ret,ParseResponseL());
+ if (ret!=KErrNone)
+ {
+ Complete(ret,EReadCompletion);
+ return;
+ }
+ // wait for another one
+ iIo->SetTimeOut(this,KPhoneBookReadTimeout*KOneSecondPause);
+ }
+ else
+ {
+ TInt ret(ValidateExpectString());
+ RemoveStdExpectStrings();
+ if((ret==KErrNone)&&(iNumReadEntries==0))
+ {
+// No entries read, so buffer will be empty and KErrNotFound must be returned.
+ ret=KErrNotFound;
+ }
+ Complete(ret,EReadCompletion);
+ }
+ }
+ else
+ CATPhoneBookCommands::EventSignal(aEventSource);
+ }
+
+
+void CATPhoneBookRead::CompleteWithIOError(TEventSource,TInt aError)
+/**
+ * This function is called if an error occurs. It cancels the relevant timer and
+ * completes the request.
+ */
+ {
+ if (iState!=EATPhoneBookCommandIdle)
+ {
+ iIo->WriteAndTimerCancel(this);
+ iCPBRResponse=0;
+ iState=EATPhoneBookCommandIdle;
+ iTelObject->ReqCompleted(iReqHandle,aError);
+ }
+ }
+
+
+//
+// CATPhoneBookWrite definitions
+//
+
+CATPhoneBookWrite* CATPhoneBookWrite::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+/**
+ * Standard 2 phase constructor.
+ * This method creats an instance of the CATPhoneBookWrite class.
+ */
+ {
+ CATPhoneBookWrite* r=new(ELeave) CATPhoneBookWrite(aIo,aTelObject,aInit,aPhoneGlobals);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CATPhoneBookWrite::CATPhoneBookWrite(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+ : CATPhoneBookCommands(aIo,aTelObject,aInit,aPhoneGlobals)
+/**
+ * C++ constructor
+ */
+ {}
+
+void CATPhoneBookWrite::ConstructL()
+/**
+ * Standard 2nd phase constructor.
+ * Creates phonebook buffer object used to extract data from client buffer
+ */
+ {
+ CATCommands::ConstructL();
+ iPbBuffer = new(ELeave) CPhoneBookBuffer();
+ }
+
+CATPhoneBookWrite::~CATPhoneBookWrite()
+/**
+ * Destructor.
+ */
+ {
+ delete iPbBuffer;
+ }
+
+void CATPhoneBookWrite::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
+/**
+ * Start function. Its calls the StartStorageSelect() function to select
+ * the phone book memory.
+ */
+ {
+ iReqHandle=aTsyReqHandle;
+ iIndex = *(static_cast<TInt*>(aParams)); // aParams will contain an index
+ StartStorageSelect();
+ }
+
+void CATPhoneBookWrite::StartThisCommand()
+/**
+ * This function starts the Write command. It decodes the phonebook data supplied by the
+ * client from the TLV format into the AT+CPBW= format, builds the command and
+ * starts the state machine to write the entry to the phone. It can only write
+ * one entry at a time.
+ */
+ {
+ LOGTEXT(_L8("Starting AT+CPBW= Command"));
+
+ TBuf8<KGenericBufferSize> atbuf; // used for 8-bit AT command characters
+ TBuf8<KGenericBufferSize> name;
+ TBuf8<KGenericBufferSize> number;
+
+ TBuf16<KGenericBufferSize> des16Buf; // used for 16-bit name field
+ TPtrC16 des16Ptr(des16Buf);
+
+ TUint8 tonNpi(0);
+
+ TUint8 aTagValue(0);
+ CPhoneBookBuffer::TPhBkTagType aDataType;
+
+ TInt ret=KErrNone;
+ iPbBuffer->StartRead();
+ while ((ret=iPbBuffer->GetTagAndType(aTagValue, aDataType))==KErrNone)
+ {
+ if (aTagValue==RMobilePhoneBookStore::ETagPBTonNpi)
+ {
+ (void)iPbBuffer->GetValue(tonNpi);
+ }
+ else if (aTagValue==RMobilePhoneBookStore::ETagPBText)
+ {
+ (void)iPbBuffer->GetValue(des16Ptr);
+
+ if (des16Ptr.Length() > KGenericBufferSize)
+ {
+ Complete(KErrOverflow, EWriteCompletion);
+ return;
+ }
+
+ name.Copy(des16Ptr);
+ }
+ else if (aTagValue==RMobilePhoneBookStore::ETagPBNumber)
+ {
+ (void)iPbBuffer->GetValue(des16Ptr);
+
+ if (des16Ptr.Length() > KGenericBufferSize)
+ {
+ Complete(KErrOverflow, EWriteCompletion);
+ return;
+ }
+
+ number.Copy(des16Ptr);
+ }
+ else
+ {
+ // An unsupported field type - just skip this value
+ iPbBuffer->SkipValue(aDataType);
+ }
+ }
+
+ if(ret==KErrNotFound) // This is to ensure the TLV conversion worked
+ {
+// If the ton is international, but the number doesn't start with a '+' then prepend one.
+ if((tonNpi==145)&&(number.Length()>0)&&(number[0]!='+'))
+ atbuf.Format(KPhoneBookWriteWithIndexPrependedPlus,iIndex,&number,tonNpi,&name);
+ else
+ atbuf.Format(KPhoneBookWriteWithIndex,iIndex,&number,tonNpi,&name);
+ }
+
+ WriteExpectingResults(atbuf,3);
+ __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
+ iState=EATPhoneBookCommandWaitForWriteComplete;
+ }
+
+
+TUint CATPhoneBookWrite::NumberTypefromMMToGSM(TUint aTypeOfNumberMM)
+/** Maping from MM Number Type To GSM Number Type
+ * This method maps the MM way of representing a type of telefon number
+ * to the GSM standard.
+ */
+ {
+ switch (aTypeOfNumberMM)
+ {
+ case 0: // EUnknownNumber (MM)
+ return 129; // Nationality unknown (GSM)
+ case 1: // EInternationalNumber (MM)
+ return 145; // International Number (GSM)
+ case 2: // ENationalNumber (MM)
+ return 161; // National Number (GSM)
+ default:
+ return 129; // Nationality unknown (GSM)
+ }
+ }
+
+
+void CATPhoneBookWrite::ParseResponseL()
+ {
+ }
+
+
+//
+// CATPhoneBookDelete definitions
+//
+CATPhoneBookDelete* CATPhoneBookDelete::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+/**
+ * Standard 2 phase constructor.
+ * This method creats an instance of the CATPhoneBookDelete class.
+ */
+ {
+ CATPhoneBookDelete* r=new(ELeave) CATPhoneBookDelete(aIo,aTelObject,aInit,aPhoneGlobals);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CATPhoneBookDelete::CATPhoneBookDelete(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+ : CATPhoneBookCommands(aIo,aTelObject,aInit,aPhoneGlobals)
+/**
+ * C++ constructor
+ */
+ {}
+
+CATPhoneBookDelete::~CATPhoneBookDelete()
+ {}
+
+void CATPhoneBookDelete::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
+/**
+ * Start function. Its calls the StartStorageSelect() function to select
+ * the phone book memory.
+ */
+ {
+ iReqHandle=aTsyReqHandle;
+ iIndex=*(TInt*)aParams;
+
+ StartStorageSelect();
+ }
+
+void CATPhoneBookDelete::StartThisCommand()
+/**
+ * Start of the Delete command. This function constructs and then sends the Delete
+ * command (the Delete command is the same as the write command with just the index to
+ * delete specified e.g "AT+CPBW=2" command will delete the entry in index location 2).
+ */
+ {
+ LOGTEXT(_L8("Starting AT+CPBW= Command"));
+
+ TBuf8<KGenericBufferSize> buf;
+
+ buf.Format(KPhoneBookDelete,iIndex);
+ WriteExpectingResults(buf,3);
+ __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
+ iState=EATPhoneBookCommandWaitForWriteComplete;
+ }
+
+void CATPhoneBookDelete::StartAlternativeDelete()
+/**
+ * Alternative Delete command. The same principles as the normal delete apply.
+ */
+ {
+ LOGTEXT(_L8("Starting alternative AT+CPBW= Command"));
+
+ TBuf8<KGenericBufferSize> buf;
+
+ buf.Format(KPhoneBookAlternativeDelete,iIndex);
+ WriteExpectingResults(buf,3);
+ __ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString) != NULL, Panic(EGeneral));
+ iState=EATPhoneBookCommandWaitForAlternativeWriteComplete;
+ }
+
+
+void CATPhoneBookDelete::EventSignal(TEventSource aEventSource)
+/**
+ * State machine for the Delete command.
+ */
+ {
+ if (iState==EATPhoneBookCommandWaitForReadComplete &&
+ aEventSource!=ETimeOutCompletion)
+ {
+ __ASSERT_ALWAYS(aEventSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+ TInt ret(ValidateExpectString());
+ RemoveStdExpectStrings();
+ if (ret==KErrGeneral)
+ {
+ StartAlternativeDelete();
+ return;
+ }
+ if (ret!=KErrNone)
+ {
+ Complete(ret,aEventSource);
+ return;
+ }
+ iIo->SetTimeOut(this,KTimeForExtraRxData);
+ iState=EATPhoneBookCommandExtendedRead;
+ }
+ else
+ CATPhoneBookCommands::EventSignal(aEventSource);
+ }
+
+void CATPhoneBookDelete::ParseResponseL()
+/**
+ *
+ */
+ {
+ }
+
+