// 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:
// Phase 1 - variable name change only - still compiles
//
//
/**
@file
*/
#include <e32test.h>
#include <etelmm.h>
#include <mpbutil.h>
#include "Te_LoopBackcphoneBook.h"
#include "../../hayes/TSYCONFG.H" // for KInternetAccessPoint
// Entries to write to the iPhone book
_LIT(KMuddyWatersText,"MuddyW");
_LIT(KArethaFText,"ArethaF");
_LIT(KMuddyWatersPhoneNum,"02220111");
_LIT(KArethaFPhoneNum,"03334567");
//
// Test-side class
// With the assistance of the base class, this class must start the emulator
// and drive the ETel API.
//
CTestDrivePhoneBook* CTestDrivePhoneBook::NewL(const TScriptList aScriptListEntry)
{
CTestDrivePhoneBook* phBk=new(ELeave) CTestDrivePhoneBook(aScriptListEntry);
CleanupStack::PushL(phBk);
phBk->ConstructL();
CleanupStack::Pop();
return phBk;
}
CTestDrivePhoneBook::CTestDrivePhoneBook(const TScriptList aScriptListEntry) :
iMESupported(EFalse), iScriptListEntry(aScriptListEntry)
{}
TInt CTestDrivePhoneBook::RunTestL()
{
iCurrentScript=iScriptListEntry;
return StartEmulatorL();
}
TInt CTestDrivePhoneBook::DriveETelApiL()
//
// This function contains the real meat of the Client-side test code
//
{
_LIT(KMmPhoneName,"GsmPhone1");
// Open and Initialise the iPhone
TESTL(iMmPhone.Open(iServer,KMmPhoneName)==KErrNone);
TRequestStatus reqStatus;
RMobilePhone::TMMTableSettings tableSettings;
tableSettings.iLocId=KInternetAccessPoint;
RMobilePhone::TMMTableSettingsPckg tableSettingsPckg(tableSettings);
iMmPhone.InitialiseMM(reqStatus , tableSettingsPckg);
User::WaitForRequest(reqStatus);
TESTL(reqStatus == KErrNone);
ERR_PRINTF1(_L("Phone Id, Available Phone books and Get Info"));
GetPhoneInfoL();
ERR_PRINTF1(_L("Get PhoneBook Capabilities and Information"));
testGetPhBkCapsAndInfoL();
ERR_PRINTF1(_L("Deleting the 1st 5 entries in the SM and ME (if supported) phonebooks"));
TInt ret;
ret=testClearPhBkL(KETelIccAdnPhoneBook);
TESTL(ret==KErrNone);
if (iMESupported)
{
ret=testClearPhBkL(KETelMeAdnPhoneBook);
TESTL(ret==KErrNone);
}
ERR_PRINTF1(_L("Phone book Read and Write"));
testPhoneBookReadAndWrite(); // New method using CPhoneBookBuffer
ERR_PRINTF1(_L("Advanced Phone book tests"));
testAdvancedPhoneBook(); // New method using CPhoneBookBuffer
ERR_PRINTF1(_L("Phone book Notifications"));
testPhoneBookNotifications(); // New method using CPhoneBookBuffer
ERR_PRINTF1(_L("Phone book Read Cancel Requests"));
testPhoneBookReadCancel(); // New method using CPhoneBookBuffer
ERR_PRINTF1(_L("Phone book Read & Write International Numbers"));
testPhoneBookReadAndWriteInternationalL();
ERR_PRINTF1(_L("Phone book Multithread Write"));
testPhoneBookMultiWriteL();
iMmPhone.Close();
return KErrNone;
}
void CTestDrivePhoneBook::GetPhoneInfoL()
/**
* Retrieve iPhone Information
*/
{
TRequestStatus stat;
RMobilePhone::TMobilePhoneIdentityV1 phoneId;
iMmPhone.GetPhoneId(stat,phoneId);
User::WaitForRequest(stat);
TESTL(stat == KErrNone);
// check version id ?
INFO_PRINTF2(_L("Extension ID : %d"), phoneId.ExtensionId());
INFO_PRINTF2(_L("\nManufacturer ID : %S"), &phoneId.iManufacturer);
INFO_PRINTF2(_L("Model ID : %S"), &phoneId.iModel);
INFO_PRINTF2(_L("Revision ID : %S"), &phoneId.iRevision);
INFO_PRINTF2(_L("Serial number : %S\n"), &phoneId.iSerialNumber);
// common mode
TInt numAvail=0; // counts number of phonebooks
IsPhoneBookAvailable (KETelMeAdnPhoneBook, numAvail);
IsPhoneBookAvailable (KETelMeDialledPhoneBook, numAvail);
IsPhoneBookAvailable (KETelMeMissedPhoneBook, numAvail);
IsPhoneBookAvailable (KETelMeReceivedPhoneBook, numAvail);
IsPhoneBookAvailable (KETelCombinedAdnPhoneBook, numAvail);
IsPhoneBookAvailable (KETelIccAdnPhoneBook, numAvail);
IsPhoneBookAvailable (KETelIccFdnPhoneBook, numAvail);
IsPhoneBookAvailable (KETelIccSdnPhoneBook, numAvail);
// gsm mode
IsPhoneBookAvailable (KETelTaAdnPhoneBook, numAvail);
IsPhoneBookAvailable (KETelIccBdnPhoneBook, numAvail);
IsPhoneBookAvailable (KETelIccVoiceMailBox, numAvail);
INFO_PRINTF2(_L("%d Phonebooks available.\n"), numAvail);
}
TRequestStatus CTestDrivePhoneBook::IsPhoneBookAvailable(const TDesC& aPhoneBook,
TInt &aCount)
{
TRequestStatus stat;
RMobilePhoneStore::TMobilePhoneStoreInfoV1 info;
RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg infoPkg(info);
iMmPhone.GetPhoneStoreInfo(stat,infoPkg,aPhoneBook);
User::WaitForRequest(stat);
if (stat == KErrNone) // available
{
INFO_PRINTF2(_L("%S Phone Book is available.\n"), &aPhoneBook);
aCount++;
}
else
{
INFO_PRINTF3(_L("%S Phone Book is NOT available. Status %d.\n"), &aPhoneBook, stat.Int());
}
return stat;
}
void CTestDrivePhoneBook::testGetPhBkCapsAndInfoL()
/**
* This function:
* Gets the SIM and ME iPhone books static capabilities,
* Information associated with the iPhone books,
* and also Validates the obtained information.
*/
{
// SIM iPhone book - mandatory
TInt ret=KErrNone;
RMobilePhoneBookStore simPhBk;
ret=simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook);
TESTL(ret==KErrNone);
// Get SM Phone book Capabilities
TRequestStatus stat=0;
RMobilePhoneStore::TMobilePhoneStoreInfoV1 info;
RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg infoPkg(info);
simPhBk.GetInfo(stat,infoPkg);
User::WaitForRequest(stat);
TESTL(stat == KErrNone);
info = infoPkg();
// Need to Read entries
TESTL((info.iCaps & RMobilePhoneStore::KCapsWriteAccess)!=0);
TESTL(info.iName == KETelIccAdnPhoneBook);
TESTL(info.iType == RMobilePhoneStore::EPhoneBookStore);
TESTL(info.iTotalEntries > 0);
simPhBk.Close();
RMobilePhoneBookStore mePhBk;
ret=mePhBk.Open(iMmPhone,KETelMeAdnPhoneBook);
if (ret==KErrNone)
{
INFO_PRINTF1(_L("ME phonebook supported\n"));
iMESupported=ETrue;
mePhBk.GetInfo(stat,infoPkg);
User::WaitForRequest(stat);
TESTL(stat == KErrNone);
info = infoPkg();
TESTL((info.iCaps & RMobilePhoneStore::KCapsWriteAccess)!=0);
// Need to read entries
TESTL(info.iName == KETelMeAdnPhoneBook);
TESTL(info.iType == RMobilePhoneStore::EPhoneBookStore);
TESTL(info.iTotalEntries > 0);
// GetInfo Cancel Request
INFO_PRINTF1(_L("GetInfo Cancel Request..."));
mePhBk.GetInfo(stat,infoPkg);
mePhBk.CancelAsyncRequest(EMobilePhoneStoreGetInfo);
User::WaitForRequest(stat);
INFO_PRINTF2(_L("GetInfo Cancel Status = %d"), stat.Int());
TESTL(stat==KErrNone || stat==KErrCancel);
mePhBk.Close();
}
else
INFO_PRINTF1(_L("ME phonebook is NOT supported"));
}
TInt CTestDrivePhoneBook::testClearPhBkL(const TDesC& aPhoneBookName)
/**
* This function deletes the first 5 entries in the SM and ME (if supported) phonebooks.
*/
{
TInt ret=KErrNone;
RMobilePhoneBookStore thePhBk;
TRequestStatus stat;
// Open the SM iPhone book
ret=thePhBk.Open(iMmPhone,aPhoneBookName);
TESTL(ret==KErrNone);
INFO_PRINTF2(_L("Deleting %S phonebook entries..."), &aPhoneBookName);
TInt i;
for (i=1; i<=5; i++)
{
thePhBk.Delete(stat,i);
User::WaitForRequest(stat);
if (stat!=KErrNone && stat!=KErrNotFound)
break;
}
// Check that KErrNotFound is returned when reading an empty phonebook.
TBuf8<50> buf;
thePhBk.Read(stat,1,99,buf);
User::WaitForRequest(stat);
TESTL(stat==KErrNotFound);
thePhBk.Close();
return ret;
}
void CTestDrivePhoneBook::ReadAndWriteL()
/**
* This function writes a few entries to the SM phonebook and then reads them back.
*/
{
TInt ret=KErrNone;
RMobilePhoneBookStore simPhBk;
// Open the SM iPhone book
ret=simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook);
TESTL(ret==KErrNone);
simPhBk.Close();
}
void CTestDrivePhoneBook::testAdvancedPhBkL()
/**
* This function opens an Advanced GSM ME PhoneBook, writes a few entries to it, and then
* deletes these entries.
*/
{
TInt ret=KErrNone;
RMobilePhoneBookStore mePhBk;
ret=mePhBk.Open(iMmPhone,KETelMeAdnPhoneBook);
TESTL(ret==KErrNone);
mePhBk.Close();
}
void CTestDrivePhoneBook::testPhBkNotificationsL()
/**
* This function opens the ME phonebook and posts a request for notification when an
* entry is modified.
*/
{
RMobilePhoneBookStore mePhBk;
const TInt Pause=2000000; // 2 second pause
TRequestStatus writeStatus = KErrNone;
TESTL(mePhBk.Open(iMmPhone,KETelMeAdnPhoneBook)==KErrNone);
TRequestStatus status;
TInt index=KErrNone;
TUint32 eventChange;
// Post a notification request
//mePhBk.EntryChangedNotification(status,index);
mePhBk.NotifyStoreEvent(status,eventChange,index);
if (writeStatus==KErrCancel)
{
INFO_PRINTF1(_L("This is unexpected!!!. If the test carries on, this means that\n"));
INFO_PRINTF1(_L("the Write request has been transmitted to the iPhone regardless of\n"));
INFO_PRINTF1(_L("of the apparent success of the Write cancel request.\n\n"));
}
else
TESTL(writeStatus==KErrNone); // The Cancel request was not successful
// Completion of the notification request posted earlier
User::WaitForRequest(status);
TESTL(status==KErrNone);
TESTL(index==1);
// Post another notification request
mePhBk.NotifyStoreEvent(status,eventChange,index);
// Delete and DeleteCancel Request. Wait 2 seconds before posting the Cancel request.
// Enables the request to get through to the TSY (simplifies the script).
INFO_PRINTF1(_L("Delete Cancel Request..."));
TRequestStatus deleteStatus;
mePhBk.Delete(deleteStatus,index);
User::After(Pause); // Wait 2s, give the request time to get through to the TSY.
mePhBk.CancelAsyncRequest(EMobilePhoneStoreDelete);
User::WaitForRequest(deleteStatus);
INFO_PRINTF2(_L("Delete Cancel Status = %d"), deleteStatus.Int());
if (deleteStatus==KErrCancel)
{
INFO_PRINTF1(_L("This is unexpected!!!. If the test carries on, this means that"));
INFO_PRINTF1(_L("the Delete request has been transmitted to the iPhone regardless"));
INFO_PRINTF1(_L("of the apparent success of the Delete cancel request."));
}
else
{
TESTL(deleteStatus==KErrNone); // The Cancel request was not successful
}
// Completion of the 2nd notification request posted, (dependent on the Delete request above)
User::WaitForRequest(status);
TESTL(status==KErrNone);
TESTL(index==1);
// EntryChangedNotificationCancel Request
mePhBk.NotifyStoreEvent(status,eventChange,index);
mePhBk.CancelAsyncRequest(EMobilePhoneStoreNotifyStoreEvent);
User::WaitForRequest(status);
TESTL(status==KErrCancel || status==KErrNone);
INFO_PRINTF2(_L("EntryChangedNotificationCancel Status = %d"), status.Int());
mePhBk.Close();
}
void CTestDrivePhoneBook::testPhBkReadCancelL()
/**
* This function writes a few entries to the SM phonebook, and then does some Read Requests
* which are cancelled.
*/
{
TInt ret=KErrNone;
RMobilePhoneBookStore simPhBk;
// Open the SM iPhone book
ret=simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook);
TESTL(ret==KErrNone);
// Close the iPhone book
simPhBk.Close();
}
//****************************************************************************
// NEW Methods based on CPhoneBookBuffer class
//****************************************************************************
// testing the PhoneBook ReadAndWrite
void CTestDrivePhoneBook::testPhoneBookReadAndWrite()
{
TRAP_IGNORE(DotestPhoneBookReadAndWriteL()); // trap but ignore error
}
void CTestDrivePhoneBook::DotestPhoneBookReadAndWriteL()
{
TInt ret=KErrNone;
TRequestStatus aStatus;
RMobilePhoneBookStore simPhBk;
TBuf8<(RMobileSmsMessaging::KGsmTpduSize*3)> pbData, pbReadData1;
TInt requestedIndex(0), numOfEntries(1);
TESTL(simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook()) == KErrNone);
const TText16* names[]={(TText16*)KMuddyWatersText.iBuf, (TText16*)KArethaFText.iBuf};
const TText16* numbers[]={(TText16*)KMuddyWatersPhoneNum.iBuf, (TText16*)KArethaFPhoneNum.iBuf};
const TInt KBufSize=20;
TBuf16<KBufSize> entryNumber(numbers[0]);
TBuf16<KBufSize> entryName(names[0]);
CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer();
pbBuffer->Set(&pbData); // Set it to point to the Client buffer
// Write the entries to the SIM Phone Book
TInt writeIndex(0);
TUint i(0), size(2); // Only entries are written
for (i=1; i<=size; ++i)
{
//first reset the following three local buffers to delete any existing data
entryNumber.FillZ();
entryNumber.Zero();
entryName.FillZ();
entryName.Zero();
pbData.FillZ();
pbData.Zero();
entryNumber=numbers[i-1];
entryName=names[i-1];
// First specify starting index and set iNumofEntries to 1, since it is only
// possible to write one entry at a time
writeIndex = i; // Note that TSY will overwrite any existing data. It is up to
// the Sync to check whether it is the first available entry
// convert number into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber, entryNumber);
TESTL(ret == KErrNone) ;
// convert type into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi, (TUint8)129/****RMobilePhone::EUnknownNumber***/);
TESTL(ret == KErrNone) ;
// convert text into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText, entryName);
TESTL(ret == KErrNone) ;
simPhBk.Write(aStatus,pbData,writeIndex);
User::WaitForRequest(aStatus);
TESTL(aStatus==KErrNone);
}
/* Read the entries back */
TPtrC16 number(NULL,0);
TPtrC16 text(NULL,0);
TUint8 aTagValue(0);
CPhoneBookBuffer::TPhBkTagType aDataType;
TPtrC16 field(NULL,0);
TInt counter(0);
/* Reads Forwards and to read all entries individually */
for(i=1; i<=size; ++i)
{
//first reset the following three local buffers to delete any existing data
entryNumber.FillZ();
entryNumber.Zero();
entryName.FillZ();
entryName.Zero();
pbData.FillZ();
pbData.Zero();
// reset all loop variables
counter = 0;
aTagValue = 0;
requestedIndex = i;
simPhBk.Read(aStatus, requestedIndex, numOfEntries, pbReadData1);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()== KErrNone) ;
entryNumber=numbers[i-1];
entryName=names[i-1];
// now decode PB data received in TLV format
pbBuffer->Set(&pbReadData1); // Set pbBuffer to point to received phonebook data
pbBuffer->StartRead(); // Start reading received phonebook data
while(counter < pbReadData1.Length())
{
TInt ret = pbBuffer->GetTagAndType(aTagValue, aDataType);
if(ret==KErrNotFound) // Reached the end of phonebook data
break;
TESTL(ret == KErrNone) ;
switch(aDataType)
{
case CPhoneBookBuffer::EPhBkTypeInt8:
{
TUint8 int8(0);
counter = counter + 1; // add tag-field only in case that is beginning of new field
if(aTagValue == RMobilePhoneBookStore::ETagPBAdnIndex)
{
pbBuffer->GetValue(int8); //
counter = counter + 1; // 1-byte integer
}
}
break;
case CPhoneBookBuffer::EPhBkTypeInt16:
{
TUint16 int16(0);
pbBuffer->GetValue(int16);
counter = counter + 3; // 2-byte integer + tag-field
if(aTagValue == RMobilePhoneBookStore::ETagPBTonNpi)
{
}
}
break;
case CPhoneBookBuffer::EPhBkTypeInt32:
{
TUint32 int32(0);
pbBuffer->GetValue(int32);
counter = counter + 5; // 4-byte integer + tag-field
}
break;
case CPhoneBookBuffer::EPhBkTypeDes8:
{
pbBuffer->GetValue(field);
counter = counter + field.Length() + 1; // add desc length + length-field + tag-field
if(aTagValue == RMobilePhoneBookStore::ETagPBText)
{
text.Set(field);
}
else if(aTagValue == RMobilePhoneBookStore::ETagPBNumber)
{
number.Set(field);
}
}
break;
case CPhoneBookBuffer::EPhBkTypeDes16:
{
pbBuffer->GetValue(field);
counter = counter + field.Length() + 3; // add desc length + length-field + tag-field
if(aTagValue == RMobilePhoneBookStore::ETagPBText)
{
text.Set(field);
}
else if(aTagValue == RMobilePhoneBookStore::ETagPBNumber)
{
number.Set(field);
}
}
break;
default:
break;
} // end switch aDataType
} // end while
TBuf<128> pName;
TBuf<128> pNumber;
pName = text;
pNumber = number;
INFO_PRINTF2(_L("Reading \'%S\'"),&pName);
INFO_PRINTF2(_L("Reading \'%S\'\n"),&pNumber);
} // end for
simPhBk.Close();
delete pbBuffer;
}
// testing Advanced Phone book Read Write
void CTestDrivePhoneBook::testAdvancedPhoneBook()
{
TRAP_IGNORE(DotestAdvancedPhoneBookL()); // trap but ignore error
}
void CTestDrivePhoneBook::DotestAdvancedPhoneBookL()
{
/**
* This function opens an Advanced GSM ME PhoneBook, writes a few entries to it, and then
* deletes these entries.
*/
const TInt KFillTo=2;
TInt ret=KErrNone;
TRequestStatus aStatus;
RMobilePhoneBookStore::TMobilePhoneBookInfoV1 aPhoneStoreInfob;
RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg aPhoneStoreInfoPckgb(aPhoneStoreInfob);
RMobilePhoneBookStore simPhBk;
TBuf8<(RMobileSmsMessaging::KGsmTpduSize*3)> pbData; // Client reserved space for phonebook data
_LIT(KTel,"0123456789%02d");
_LIT(KText,"Tel %02d");
TBuf<15> text(KTel), number(KText);
TInt index(1);
TESTL(simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook()) == KErrNone);
// Write the entries
INFO_PRINTF1(_L("\nFill the 1st 30 locations in the SIM phonebook..."));
simPhBk.GetInfo(aStatus, aPhoneStoreInfoPckgb);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()== KErrNone) ;
aPhoneStoreInfob = aPhoneStoreInfoPckgb();
TESTL(aPhoneStoreInfob.iTotalEntries>0);
TInt used=aPhoneStoreInfob.iUsedEntries ;
CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer(); // used to write phonebook data
pbBuffer->Set(&pbData); // Set it to point to the Client buffer
// Fields supported by this phonebook are returned to client as capabilities
// in aPhoneStoreInfoPckgb. It is assumed that all GSM phonebook fields (index, tel num,
// type and name) are supported even though that part of the code has to be tested as well.
while (used<KFillTo)
{
// First specify starting index and set iNumofEntries to 1, since it is only
// possible to write one entry at a time
number.FillZ(); // Reset previous values
number.Zero();
text.FillZ();
text.Zero();
pbData.FillZ();
pbData.Zero();
// convert number into TLV format and append it to allocated buffer
number.Format(KTel(), index);
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber, number);
TESTL(ret == KErrNone) ;
// convert number type into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi, (TUint8)129);
TESTL(ret == KErrNone) ;
text.Format(KText(), index);
INFO_PRINTF2(_L("Writing \'%S\'\n"),&text);
// convert text into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText, text);
TESTL(ret == KErrNone) ;
simPhBk.Write(aStatus, pbData,index);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()== KErrNone);
used++;
index++;
} // end while
simPhBk.Close();
delete pbBuffer;
// Delete the entries //
INFO_PRINTF1(_L("Re-opening phonebook...")) ;
TESTL(simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook()) == KErrNone);
simPhBk.GetInfo(aStatus, aPhoneStoreInfoPckgb);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()== KErrNone);
aPhoneStoreInfob = aPhoneStoreInfoPckgb();
INFO_PRINTF1(_L("Deleting the entries..."));
for (int iy=1;iy<=KFillTo;++iy)
{
INFO_PRINTF2(_L("Deleting %03d\n"),iy);
simPhBk.Delete(aStatus, iy);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()== KErrNone );
}
simPhBk.Close();
}
// testing PhoneBook Notifications
void CTestDrivePhoneBook::testPhoneBookNotifications()
{
TRAP_IGNORE(DotestPhoneBookNotificationsL()); // trap but ignore erorr
}
void CTestDrivePhoneBook::DotestPhoneBookNotificationsL()
{
/**
* This function opens the ME phonebook and posts a request for notification when an
* entry is modified.
*/
RMobilePhoneBookStore simPhBk;//, combPhBk;
TBuf8<(RMobileSmsMessaging::KGsmTpduSize*3)> pbData; // Client reserved space for phonebook data
TInt index(0), ret(0);
CPhoneBookBuffer* pbBuffer=new(ELeave) CPhoneBookBuffer(); // used to read/write phonebook entries
pbBuffer->Set(&pbData); // Set it to point to the Client buffer
TESTL(simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook)==KErrNone);
TRequestStatus aStatus, status1;//, status2;
TInt index1 = 0;
TUint32 eventToReturn;
simPhBk.NotifyStoreEvent(status1, eventToReturn,index1); // Will Notify if an entry is added
index = 1; // write to the first slot
// convert number into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber, KMuddyWatersPhoneNum);
TESTL(ret == KErrNone) ;
// convert number type into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi,(TUint8)129);
TESTL(ret == KErrNone) ;
// convert text into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText, KMuddyWatersText);
TESTL(ret == KErrNone) ;
simPhBk.Write(aStatus,pbData,index);
User::WaitForRequest(aStatus); // Write request
TESTL(aStatus.Int()== KErrNone) ;
User::WaitForRequest(status1); // Notification
TEST(status1==KErrNotSupported);
if (status1==KErrNotSupported)
{
// Notification is not supported by phonebook store - as expected
INFO_PRINTF1(_L("Phonebook Store Write Notification is NOT Supported - as expected\n"));
}
else
{
// This should not happen since this notification is not supported by phonebook store
INFO_PRINTF1(_L("Phonebook Store Write Notification IS Supported - not expected\n"));
}
status1= KErrNone; // reset status variable
simPhBk.NotifyStoreEvent(status1, eventToReturn, index1);
// Now delete that entry
simPhBk.Delete(aStatus, 1);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()== KErrNone);
User::WaitForRequest(status1);
TEST(status1==KErrNotSupported);
if (status1==KErrNotSupported)
{
// Notification is not supported by phonebook store - as expected
INFO_PRINTF1(_L("Phonebook Store Delete Notification is NOT Supported - as expected\n"));
}
else
{
// This should not happen since this notification is not supported by phonebook store
INFO_PRINTF1(_L("Phonebook Store Delete Notification IS Supported - not expected\n"));
}
// EntryChangedNotificationCancel Request
status1= KErrNone; // reset status variable
simPhBk.NotifyStoreEvent(status1, eventToReturn, index1);
simPhBk.CancelAsyncRequest(EMobilePhoneStoreNotifyStoreEvent);
User::WaitForRequest(status1);
TEST(status1==KErrNotSupported);
if (status1==KErrNotSupported)
{
// Notification is not supported by phonebook store - as expected
INFO_PRINTF1(_L("Phonebook Store Notification is NOT Supported - as expected\n"));
}
else
{
// This should not happen since this notification is not supported by phonebook store
INFO_PRINTF1(_L("Phonebook Store Notification cancelled - not expected\n"));
}
// Cancel Notification Request after 2 seconds
status1= KErrNone; // reset status variable
simPhBk.NotifyStoreEvent(status1, eventToReturn, index1);
// Now write the same entry again
simPhBk.Write(aStatus,pbData, index);
User::WaitForRequest(aStatus);
TESTL(aStatus.Int()==KErrNone) ;
User::After(2000000L);
simPhBk.CancelAsyncRequest(EMobilePhoneStoreNotifyStoreEvent);
User::WaitForRequest(status1);
INFO_PRINTF2(_L("Cancel Status = %d\n"), status1.Int());
TESTL(status1==KErrCancel || status1==KErrNotSupported || status1==KErrNone);
simPhBk.Delete(aStatus, 1); // Deleting the last added entry so that the test ends "clean".
User::WaitForRequest(aStatus);
simPhBk.Close();
delete pbBuffer;
}
// Testing Phonebook Read cancel
void CTestDrivePhoneBook::testPhoneBookReadCancel()
{
TRAP_IGNORE(DotestPhoneBookReadCancelL()); // trap but ignore error
}
void CTestDrivePhoneBook::DotestPhoneBookReadCancelL()
{
/**
* This function writes a few entries to the SM phonebook, and then does some Read Requests
* which are cancelled.
*/
TInt ret=KErrNone;
TRequestStatus aStatus;
RMobilePhoneBookStore simPhBk;
TBuf8<(RMobileSmsMessaging::KGsmTpduSize*3)> pbData, pbReadData1;//, pbReadData2, pbReadEmpty; // Client reserved space for phonebook data
TInt requestedIndex(0), numOfEntries(1);
TESTL(simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook()) == KErrNone);
const TText16* names[]={(TText16*)KMuddyWatersText.iBuf, (TText16*)KArethaFText.iBuf};
const TText16* numbers[]={(TText16*)KMuddyWatersPhoneNum.iBuf, (TText16*)KArethaFPhoneNum.iBuf};
const TInt KBufSize=20;
TBuf16<KBufSize> entryNumber(numbers[0]);
TBuf16<KBufSize> entryName(names[0]);
CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer();
pbBuffer->Set(&pbData); // Set it to point to the Client buffer
// Write the entries to the SIM Phone Book
TInt writeIndex(0);
TUint i(0), size(2);
for (i=1; i<=size; ++i)
{
//first reset the following three local buffers to delete any existing data
entryNumber.FillZ();
entryNumber.Zero();
entryName.FillZ();
entryName.Zero();
pbData.FillZ();
pbData.Zero();
entryNumber=numbers[i-1];
entryName=names[i-1];
// First specify starting index and set iNumofEntries to 1, since it is only
// possible to write one entry at a time
writeIndex = i; // Note that TSY will overwrite any existing data. It is up to
// the Sync to check whether it is the first available entry
// convert number into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber, entryNumber);
TESTL(ret == KErrNone) ;
// convert type into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi, (TUint8)129);
TESTL(ret == KErrNone) ;
// convert text into TLV format and append it to allocated buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText, entryName);
TESTL(ret == KErrNone) ;
simPhBk.Write(aStatus,pbData,writeIndex);
User::WaitForRequest(aStatus);
TESTL(aStatus==KErrNone);
}
/* Read the entries back */
TPtrC16 number(NULL,0);
TPtrC16 text(NULL,0);
TUint8 aTagValue(0);
CPhoneBookBuffer::TPhBkTagType aDataType;
TPtrC16 field(NULL,0);
TInt counter(0);
/* Reads 1 entry */
//first reset the following three local buffers to delete any existing data
entryNumber.FillZ();
entryNumber.Zero();
entryName.FillZ();
entryName.Zero();
pbData.FillZ();
pbData.Zero();
// reset all loop variables
counter = 0;
aTagValue = 0;
requestedIndex = 1;
simPhBk.Read(aStatus, requestedIndex, numOfEntries, pbReadData1);
// Cancel the Read
simPhBk.CancelAsyncRequest(EMobilePhoneBookStoreRead);
User::WaitForRequest(aStatus);
INFO_PRINTF2(_L("Read First Entry Cancel Status = %d\n\n"), aStatus.Int());
// If the request was successfully cancelled, then do read the first entry, 'want
// the phonebook pointer to point to a valid entry for the ReadNext() operation.
TESTL(aStatus == KErrCancel || aStatus == KErrNone);
if (aStatus==KErrCancel)
{
INFO_PRINTF1(_L("Read First Entry Cancel Successful. Read First Entry Again.\n"));
simPhBk.Read(aStatus, requestedIndex, 1, pbReadData1);
User::WaitForRequest(aStatus);
TESTL(aStatus==KErrNone);
}
// reset all loop variables
counter = 0;
aTagValue = 0;
// now decode PB data received in TLV format
pbBuffer->Set(&pbReadData1); // Set pbBuffer to point to received phonebook data
pbBuffer->StartRead(); // Start reading received phonebook data
while(counter < pbReadData1.Length())
{
TInt ret = pbBuffer->GetTagAndType(aTagValue, aDataType);
if(ret==KErrNotFound) // Reached the end of phonebook data
break;
TESTL(ret == KErrNone) ;
switch(aDataType)
{
case CPhoneBookBuffer::EPhBkTypeInt8:
{
TUint8 int8(0);
counter = counter + 1; // add tag-field only in case that is beginning of new field
if(aTagValue == RMobilePhoneBookStore::ETagPBAdnIndex)
{
pbBuffer->GetValue(int8); //
counter = counter + 1; // 1-byte integer
}
}
break;
case CPhoneBookBuffer::EPhBkTypeInt16:
{
TUint16 int16(0);
pbBuffer->GetValue(int16);
counter = counter + 3; // 2-byte integer + tag-field
if(aTagValue == RMobilePhoneBookStore::ETagPBTonNpi)
{
}
}
break;
case CPhoneBookBuffer::EPhBkTypeInt32:
{
TUint32 int32(0);
pbBuffer->GetValue(int32);
counter = counter + 5; // 4-byte integer + tag-field
}
break;
case CPhoneBookBuffer::EPhBkTypeDes8:
{
pbBuffer->GetValue(field);
counter = counter + field.Length() + 1; // add desc length + length-field + tag-field
if(aTagValue == RMobilePhoneBookStore::ETagPBText)
{
text.Set(field);
}
else if(aTagValue == RMobilePhoneBookStore::ETagPBNumber)
{
number.Set(field);
}
}
break;
case CPhoneBookBuffer::EPhBkTypeDes16:
{
pbBuffer->GetValue(field);
counter = counter + field.Length() + 3; // add desc length + length-field + tag-field
if(aTagValue == RMobilePhoneBookStore::ETagPBText)
{
text.Set(field);
}
else if(aTagValue == RMobilePhoneBookStore::ETagPBNumber)
{
number.Set(field);
}
}
break;
default:
break;
} // end switch aDataType
} // end while
TBuf<128> pName;
TBuf<128> pNumber;
pName = text;
pNumber = number;
INFO_PRINTF2(_L("Reading \'%S\'"),&pName);
INFO_PRINTF2(_L("Reading \'%S\'\n"),&pNumber);
simPhBk.Close();
delete pbBuffer;
}
void CTestDrivePhoneBook::testPhoneBookReadAndWriteInternationalL()
{
TInt ret=KErrNone;
TRequestStatus status;
RMobilePhoneBookStore simPhBk;
TBuf8<200> writeBuf,readBuf;
_LIT(KInterNum1,"441234");
_LIT(KInterName1,"ABCD");
_LIT(KInterNum2,"445678");
_LIT(KInterName2,"EFGH");
TESTL(simPhBk.Open(iMmPhone,KETelIccAdnPhoneBook()) == KErrNone);
/* Write entries */
CPhoneBookBuffer* pbBuffer=NULL;
TRAP_IGNORE(pbBuffer = new(ELeave) CPhoneBookBuffer()); // TRAP but ignore error
TESTL(pbBuffer!=NULL);
pbBuffer->Set(&writeBuf); // Set it to point to the Client buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber, KInterNum1);
TESTL(ret == KErrNone) ;
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi, (TUint8)145);
TESTL(ret == KErrNone) ;
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText, KInterName1);
TESTL(ret == KErrNone) ;
TInt writeIndex=1;
simPhBk.Write(status,writeBuf,writeIndex);
User::WaitForRequest(status);
TESTL(status==KErrNone);
pbBuffer->Set(&writeBuf); // Set it to point to the Client buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber, KInterNum2);
TESTL(ret == KErrNone) ;
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi, (TUint8)145);
TESTL(ret == KErrNone) ;
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText, KInterName2);
TESTL(ret == KErrNone) ;
writeIndex=2;
simPhBk.Write(status,writeBuf,writeIndex);
User::WaitForRequest(status);
TESTL(status==KErrNone);
/* Read the entries back */
simPhBk.Read(status, 1, 2, readBuf);
User::WaitForRequest(status);
TESTL(status.Int()==KErrNone);
TInt index=0;
pbBuffer->Set(&readBuf); // Set pbBuffer to point to received phonebook data
pbBuffer->StartRead(); // Start reading received phonebook data
for(;;)
{
TUint8 tagValue;
CPhoneBookBuffer::TPhBkTagType dataType;
ret=pbBuffer->GetTagAndType(tagValue,dataType);
if(ret!=KErrNone)
break;
switch(tagValue)
{
case RMobilePhoneBookStore::ETagPBNewEntry:
index++;
break;
case RMobilePhoneBookStore::ETagPBAdnIndex:
{
TUint16 val;
pbBuffer->GetValue(val);
TESTL(val==index);
}
break;
case RMobilePhoneBookStore::ETagPBText:
{
TPtrC text;
pbBuffer->GetValue(text);
if(index==1)
{
TESTL(text==KInterName1);
}
else
{
TESTL(text==KInterName2);
}
}
break;
case RMobilePhoneBookStore::ETagPBNumber:
{
TPtrC number;
pbBuffer->GetValue(number);
if(index==1)
{
TESTL(number==KInterNum1);
}
else
{
TESTL(number==KInterNum2);
}
}
break;
case RMobilePhoneBookStore::ETagPBTonNpi:
{
TUint8 ton;
pbBuffer->GetValue(ton);
TESTL(ton==145);
}
break;
default:
TESTL(KErrGeneral);
break;
}
}
simPhBk.Close();
delete pbBuffer;
}
void CTestDrivePhoneBook::testPhoneBookMultiWriteL()
{
_LIT(KThreadName,"MultiPhBkWriteTest%d");
const TInt KStackSize=0x4000;
const TInt KHeapSize=0x4000;
const TInt KMaxHeapSize=0x8000;
const TInt KNumThreads=2;
RThread thread[KNumThreads];
TRequestStatus status[KNumThreads];
TInt ret=KErrNone;
TInt i=0;
for(i=0;i<KNumThreads;i++)
{
TName name;
name.Format(KThreadName,i);
ret=thread[i].Create(name,CTestDrivePhoneBook::ThreadFnWritePhoneBookEntry,KStackSize,KHeapSize,KMaxHeapSize,NULL);
if(ret!=KErrNone)
break;
}
if(ret!=KErrNone)
{
for(i=0;i<KNumThreads;i++)
thread[i].Close();
TESTL(ret==KErrNone);
return;
}
for(i=0;i<KNumThreads;i++)
thread[i].Logon(status[i]);
for(i=0;i<KNumThreads;i++)
thread[i].Resume();
for(i=0;i<KNumThreads;i++)
{
User::WaitForRequest(status[i]);
TESTL(status[i]==KErrNone);
}
}
TInt CTestDrivePhoneBook::ThreadFnWritePhoneBookEntry(TAny*)
{
_LIT(KNum1,"12345678");
_LIT(KName1,"ABCDEFGH");
_LIT(KPhoneName,"GsmPhone1");
CTrapCleanup* cleanup=CTrapCleanup::New();
if(cleanup==NULL)
return KErrNoMemory;
RTelServer telServer;
TInt ret=telServer.Connect();
if(ret!=KErrNone)
return ret;
RMobilePhone mmPhone;
ret=mmPhone.Open(telServer,KPhoneName);
if(ret!=KErrNone)
return ret;
RMobilePhoneBookStore simPhBk;
ret=simPhBk.Open(mmPhone,KETelIccAdnPhoneBook());
if(ret!=KErrNone)
return ret;
CPhoneBookBuffer* pbBuffer = new CPhoneBookBuffer();
if(pbBuffer==NULL)
return KErrNoMemory;
TBuf8<200> writeBuf;
pbBuffer->Set(&writeBuf); // Set it to point to the Client buffer
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBNumber,KNum1);
if(ret!=KErrNone)
return ret;
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBTonNpi,(TUint8)129);
if(ret!=KErrNone)
return ret;
ret=pbBuffer->PutTagAndValue((TUint8)RMobilePhoneBookStore::ETagPBText,KName1);
if(ret!=KErrNone)
return ret;
TInt writeIndex=1;
TRequestStatus status;
simPhBk.Write(status,writeBuf,writeIndex);
User::WaitForRequest(status);
if(status!=KErrNone)
return status.Int();
delete pbBuffer;
delete cleanup;
simPhBk.Close();
mmPhone.Close();
telServer.Close();
return KErrNone;
}
//
// Emulator-side class
// With the assistance of the base class, this class must run the designated script
//
CTestPhoneBook* CTestPhoneBook::NewL(const TScript* aScript)
{
CTestPhoneBook* phBk=new(ELeave) CTestPhoneBook(aScript);
CleanupStack::PushL(phBk);
phBk->ConstructL();
CleanupStack::Pop();
return phBk;
}
CTestPhoneBook::CTestPhoneBook(const TScript* aScript) : iScript(aScript)
{}
void CTestPhoneBook::ConstructL()
{
CATScriptEng::ConstructL();
}
TInt CTestPhoneBook::Start()
{
StartScript(iScript);
return KErrNone;
}
void CTestPhoneBook::SpecificAlgorithmL(TInt /* aParam */)
{
}
void CTestPhoneBook::Complete(TInt aError)
{
iReturnValue=aError;
CActiveScheduler::Stop();
}