Added ENotifyKeypresses and ECaptureCtrlC flags to CCommandBase.
Commands can now get keypresses and handle ctrl-C via callbacks instead of having to implement custom active objects. As part of this extended the CCommandBase extension interface to MCommandExtensionsV2 for the new virtual functions KeyPressed(TUint aKeyCode, TUint aModifiers) and CtrlCPressed(). sudo now cleans up correctly by using ECaptureCtrlC.
// icc.cpp
//
// Copyright (c) 2009 - 2010 Accenture. All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the "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:
// Accenture - Initial contribution
//
#include <fshell/ioutils.h>
#include <etelmm.h>
#include <commsdattypesv1_1.h>
#include <fshell/ltkutils.h>
#include <cdblen.h>
#define SERVICE_ENTRY(XXX) { XXX, #XXX }
struct SEnumFlag
{
TInt iValue;
const char* iIndentifer;
};
SEnumFlag KSstServices1to8[] =
{
SERVICE_ENTRY(RMobilePhone::KSstPin1Disable),
SERVICE_ENTRY(RMobilePhone::KSstADN),
SERVICE_ENTRY(RMobilePhone::KSstFDN),
SERVICE_ENTRY(RMobilePhone::KSstSMS),
SERVICE_ENTRY(RMobilePhone::KSstAoC),
SERVICE_ENTRY(RMobilePhone::KSstCCP),
SERVICE_ENTRY(RMobilePhone::KSstPLMNSelector)
};
SEnumFlag KSstServices9to16[] =
{
SERVICE_ENTRY(RMobilePhone::KSstMSISDN),
SERVICE_ENTRY(RMobilePhone::KSstExt1),
SERVICE_ENTRY(RMobilePhone::KSstExt2),
SERVICE_ENTRY(RMobilePhone::KSstSMSP),
SERVICE_ENTRY(RMobilePhone::KSstLND),
SERVICE_ENTRY(RMobilePhone::KSstCBMI),
SERVICE_ENTRY(RMobilePhone::KSstGID1),
SERVICE_ENTRY(RMobilePhone::KSstGID2)
};
SEnumFlag KSstServices17to24[] =
{
SERVICE_ENTRY(RMobilePhone::KSstSPName),
SERVICE_ENTRY(RMobilePhone::KSstSDN),
SERVICE_ENTRY(RMobilePhone::KSstExt3),
SERVICE_ENTRY(RMobilePhone::KSstVGCSList),
SERVICE_ENTRY(RMobilePhone::KSstVBSList),
SERVICE_ENTRY(RMobilePhone::KSsteMLPP),
SERVICE_ENTRY(RMobilePhone::KSstAnswereMLPP)
};
SEnumFlag KSstServices25to32[] =
{
SERVICE_ENTRY(RMobilePhone::KSstSmsCbDataDownload),
SERVICE_ENTRY(RMobilePhone::KSstSmsPpDataDownload),
SERVICE_ENTRY(RMobilePhone::KSstMenuSelection),
SERVICE_ENTRY(RMobilePhone::KSstCallControl),
SERVICE_ENTRY(RMobilePhone::KSstProactiveSim),
SERVICE_ENTRY(RMobilePhone::KSstCBMIRanges),
SERVICE_ENTRY(RMobilePhone::KSstBDN),
SERVICE_ENTRY(RMobilePhone::KSstExt4)
};
SEnumFlag KSstServices33to40[] =
{
SERVICE_ENTRY(RMobilePhone::KSstDepersonalisationKeys),
SERVICE_ENTRY(RMobilePhone::KSstCooperativeNetworks),
SERVICE_ENTRY(RMobilePhone::KSstSMStatusReports),
SERVICE_ENTRY(RMobilePhone::KSstNetworkIndAlerting),
SERVICE_ENTRY(RMobilePhone::KSstMoSmControlBySim),
SERVICE_ENTRY(RMobilePhone::KSstGprs),
SERVICE_ENTRY(RMobilePhone::KSstImage),
SERVICE_ENTRY(RMobilePhone::KSstSoLSA)
};
SEnumFlag KSstServices41to48[] =
{
SERVICE_ENTRY(RMobilePhone::KSstUssdStringInCallControl),
SERVICE_ENTRY(RMobilePhone::KSstRunATCommand),
SERVICE_ENTRY(RMobilePhone::KSstPlmnSelectorListWithAccessTechnology),
SERVICE_ENTRY(RMobilePhone::KSstOplmnSelectorListWithAccessTechnology),
SERVICE_ENTRY(RMobilePhone::KSstHplmnAccessTechnology),
SERVICE_ENTRY(RMobilePhone::KSstCpbcchInformation),
SERVICE_ENTRY(RMobilePhone::KSstInvestigationScan),
SERVICE_ENTRY(RMobilePhone::KSstExtendedCcp)
};
SEnumFlag KSstServices49to56[] =
{
SERVICE_ENTRY(RMobilePhone::KSstMExE),
SERVICE_ENTRY(RMobilePhone::KSstRplmnLastUsedAccessTechnology)
};
SEnumFlag KUstServices1to8[] =
{
SERVICE_ENTRY(RMobilePhone::KUstLocalPhBk),
SERVICE_ENTRY(RMobilePhone::KUstFDN),
SERVICE_ENTRY(RMobilePhone::KUstExt2),
SERVICE_ENTRY(RMobilePhone::KUstSDN),
SERVICE_ENTRY(RMobilePhone::KUstExt3),
SERVICE_ENTRY(RMobilePhone::KUstBDN),
SERVICE_ENTRY(RMobilePhone::KUstExt4),
SERVICE_ENTRY(RMobilePhone::KUstOugoingCallInfo)
};
SEnumFlag KUstServices9to16[] =
{
SERVICE_ENTRY(RMobilePhone::KUstIncomingCallInfo),
SERVICE_ENTRY(RMobilePhone::KUstSMS),
SERVICE_ENTRY(RMobilePhone::KUstSMSR),
SERVICE_ENTRY(RMobilePhone::KUstSMSP),
SERVICE_ENTRY(RMobilePhone::KUstAoC),
SERVICE_ENTRY(RMobilePhone::KUstCCP),
SERVICE_ENTRY(RMobilePhone::KUstCBMI),
SERVICE_ENTRY(RMobilePhone::KUstCBMIRanges)
};
SEnumFlag KUstServices17to24[] =
{
SERVICE_ENTRY(RMobilePhone::KUstGID1),
SERVICE_ENTRY(RMobilePhone::KUstGID2),
SERVICE_ENTRY(RMobilePhone::KUstSPN),
SERVICE_ENTRY(RMobilePhone::KUstPLMNSelAccessTech),
SERVICE_ENTRY(RMobilePhone::KUstMSISDN),
SERVICE_ENTRY(RMobilePhone::KUstIMG),
SERVICE_ENTRY(RMobilePhone::KUsteMLPP)
};
SEnumFlag KUstServices25to32[] =
{
SERVICE_ENTRY(RMobilePhone::KUstAnswereMLPP),
SERVICE_ENTRY(RMobilePhone::KUstGSMAccess),
SERVICE_ENTRY(RMobilePhone::KUstSMSPpDataDownload),
SERVICE_ENTRY(RMobilePhone::KUstSMSCbDataDownload),
SERVICE_ENTRY(RMobilePhone::KUstCallControl),
SERVICE_ENTRY(RMobilePhone::KUstMoSmControl),
SERVICE_ENTRY(RMobilePhone::KUstPCmdRunAtCommand)
};
SEnumFlag KUstServices33to40[] =
{
SERVICE_ENTRY(RMobilePhone::KUstAlways),
SERVICE_ENTRY(RMobilePhone::KUstEST),
SERVICE_ENTRY(RMobilePhone::KUstACL),
SERVICE_ENTRY(RMobilePhone::KIstDepersonalisationKeys),
SERVICE_ENTRY(RMobilePhone::KUstCooperativeNetwork),
SERVICE_ENTRY(RMobilePhone::KUstGSMSecurityContext),
SERVICE_ENTRY(RMobilePhone::KUstCPBCCHInfo),
SERVICE_ENTRY(RMobilePhone::KUstInvestigationScan)
};
SEnumFlag KUstServices41to48[] =
{
SERVICE_ENTRY(RMobilePhone::KUstMExE),
SERVICE_ENTRY(RMobilePhone::KUstOperatorPLMNSelector),
SERVICE_ENTRY(RMobilePhone::KUstHPLMNSelAccessTech),
SERVICE_ENTRY(RMobilePhone::KUstExt5),
SERVICE_ENTRY(RMobilePhone::KUstPLMNNetworkName),
SERVICE_ENTRY(RMobilePhone::KUstOperatorPLMNList),
SERVICE_ENTRY(RMobilePhone::KUstMDN),
SERVICE_ENTRY(RMobilePhone::KUstMWISo)
};
SEnumFlag KUstServices49to56[] =
{
SERVICE_ENTRY(RMobilePhone::KUstCFIS),
SERVICE_ENTRY(RMobilePhone::KUstRPLMN),
SERVICE_ENTRY(RMobilePhone::KUstSPDI),
SERVICE_ENTRY(RMobilePhone::KUstMMS),
SERVICE_ENTRY(RMobilePhone::KUstExt8),
SERVICE_ENTRY(RMobilePhone::KUstCConGPRS),
SERVICE_ENTRY(RMobilePhone::KUstMMSUCP)
};
#if defined (FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
SEnumFlag KUstServices57to64[] =
{
SERVICE_ENTRY(RMobilePhone::KUstVGCSGroupIdList),
SERVICE_ENTRY(RMobilePhone::KUstVBSGroupIdList),
SERVICE_ENTRY(RMobilePhone::KUstPseudonym),
SERVICE_ENTRY(RMobilePhone::KUstUserPLMNSelectorWLAN),
SERVICE_ENTRY(RMobilePhone::KUstOperatorPLMNSelectorWLAN),
SERVICE_ENTRY(RMobilePhone::KUstUserWSIDList),
SERVICE_ENTRY(RMobilePhone::KUstOperatorWSIDList),
SERVICE_ENTRY(RMobilePhone::KUstVGCSSecurity)
};
#endif
SEnumFlag KEstServices1to8[] =
{
SERVICE_ENTRY(RMobilePhone::KEstFDN),
SERVICE_ENTRY(RMobilePhone::KEstBDN),
SERVICE_ENTRY(RMobilePhone::KEstACL)
};
#if defined (FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
SEnumFlag KIstServices1to8[] =
{
SERVICE_ENTRY(RMobilePhone::KIstPCSCF),
SERVICE_ENTRY(RMobilePhone::KIstGBA),
SERVICE_ENTRY(RMobilePhone::KIstHTTPDigest)
};
#endif
using namespace IoUtils;
class CCmdIcc : public CCommandBase
{
public:
static CCommandBase* NewLC();
~CCmdIcc();
private:
CCmdIcc();
void OpenPhoneL();
void GetPhoneBookInfoL();
void ApiSupported(TInt aApi, TBool& aIsSupported);
void DisplayAccessCapsL();
void DisplayServiceTablesL();
void DisplayFdnStatusL();
void DisplayPhoneBookInfoL();
void DumpPhoneBookL();
void EditPhoneBookL();
void PrintServices(const TDesC& iTableName, TUint aServices, SEnumFlag aServiceTableDefinitions[], TInt aNumServiceTableDefinitions);
private: // From CCommandBase.
virtual const TDesC& Name() const;
virtual void DoRunL();
virtual void ArgumentsL(RCommandArgumentList& aArguments);
virtual void OptionsL(RCommandOptionList& aOptions);
private:
enum TOperation
{
EAccessCaps,
EServiceTables,
EFdnStatus,
EPhoneBookInfo,
EDumpPhoneBook,
EEditPhoneBook
};
private:
RTelServer iEtelServer;
RMobilePhone iPhone;
RMobilePhoneBookStore iPhoneBookStore;
TBool iVerbose;
HBufC* iTsyName;
TUint iServiceTable;
HBufC* iStoreName;
HBufC* iMode;
TInt iSlot;
HBufC* iData;
TOperation iOperation;
TBool iV5Tsy;
TBool iV2Tsy;
TBool iUsimTsy;
RMobilePhoneBookStore::TMobilePhoneBookInfoV5 iStoreInfo;
};
CCommandBase* CCmdIcc::NewLC()
{
CCmdIcc* self = new(ELeave) CCmdIcc();
CleanupStack::PushL(self);
self->BaseConstructL();
return self;
}
CCmdIcc::~CCmdIcc()
{
iPhoneBookStore.Close();
iPhone.Close();
iEtelServer.Close();
delete iTsyName;
delete iStoreName;
delete iMode;
delete iData;
}
CCmdIcc::CCmdIcc()
{
}
const TDesC& CCmdIcc::Name() const
{
_LIT(KName, "icc");
return KName;
}
void CCmdIcc::DoRunL()
{
OpenPhoneL();
switch (iOperation)
{
case EAccessCaps:
DisplayAccessCapsL();
break;
case EServiceTables:
DisplayServiceTablesL();
break;
case EFdnStatus:
DisplayFdnStatusL();
break;
case EPhoneBookInfo:
DisplayPhoneBookInfoL();
break;
case EDumpPhoneBook:
DumpPhoneBookL();
break;
case EEditPhoneBook:
EditPhoneBookL();
break;
default:
User::Leave(KErrArgument);
}
}
void CCmdIcc::DisplayAccessCapsL()
{
TUint32 iccCaps;
LeaveIfErr(iPhone.GetIccAccessCaps(iccCaps), _L("Couldn't get ICC access capabilities"));
TBool first(ETrue);
if (iccCaps & RMobilePhone::KCapsSimAccessSupported)
{
if (first)
{
first = EFalse;
}
else
{
Write(_L(" | "));
}
Write(_L("KCapsSimAccessSupported"));
}
if (iccCaps & RMobilePhone::KCapsRUimAccessSupported)
{
if (first)
{
first = EFalse;
}
else
{
Write(_L(" | "));
}
Write(_L("KCapsRUimAccessSupported"));
}
if (iccCaps & RMobilePhone::KCapsUSimAccessSupported)
{
if (first)
{
first = EFalse;
}
else
{
Write(_L(" | "));
}
Write(_L("KCapsUSimAccessSupported"));
}
if (!first)
{
Write(_L("\r\n"));
}
}
void CCmdIcc::PrintServices(const TDesC& iTableName, TUint aServices, SEnumFlag aServiceTableDefinitions[], TInt aNumServiceTableDefinitions)
{
Printf(_L("%S "), &iTableName);
TBool first(ETrue);
for (TInt i = 0; i < aNumServiceTableDefinitions; ++i)
{
if (aServices & aServiceTableDefinitions[i].iValue)
{
if (first)
{
first = EFalse;
}
else
{
Printf(_L(" | "));
}
TPtrC8 identifier((const TUint8*)aServiceTableDefinitions[i].iIndentifer);
identifier.Set(identifier.Mid(identifier.Find(_L8("::")) + 2));
Printf(identifier);
}
}
Write(_L("\r\n"));
}
void CCmdIcc::DisplayServiceTablesL()
{
RMobilePhone::TMobilePhoneServiceTableV2 serviceTable;
TRequestStatus status;
if (iV2Tsy)
{
RMobilePhone::TMobilePhoneServiceTableV2Pckg serviceTablePckg(serviceTable);
iPhone.GetServiceTable(status, (RMobilePhone::TMobilePhoneServiceTable)iServiceTable, serviceTablePckg);
}
else
{
RMobilePhone::TMobilePhoneServiceTableV1Pckg serviceTablePckg(serviceTable);
iPhone.GetServiceTable(status, (RMobilePhone::TMobilePhoneServiceTable)iServiceTable, serviceTablePckg);
}
User::WaitForRequest(status);
LeaveIfErr(status.Int(), _L("Unable to get service table %d"), iServiceTable);
switch (iServiceTable)
{
case RMobilePhone::ESIMServiceTable:
PrintServices(_L("1 to 8: "), serviceTable.iServices1To8, KSstServices1to8, sizeof(KSstServices1to8) / sizeof(SEnumFlag));
PrintServices(_L("9 to 16: "), serviceTable.iServices9To16, KSstServices9to16, sizeof(KSstServices9to16) / sizeof(SEnumFlag));
PrintServices(_L("17 to 24:"), serviceTable.iServices17To24, KSstServices17to24, sizeof(KSstServices17to24) / sizeof(SEnumFlag));
PrintServices(_L("25 to 32:"), serviceTable.iServices25To32, KSstServices25to32, sizeof(KSstServices25to32) / sizeof(SEnumFlag));
PrintServices(_L("33 to 40:"), serviceTable.iServices33To40, KSstServices33to40, sizeof(KSstServices33to40) / sizeof(SEnumFlag));
PrintServices(_L("41 to 48:"), serviceTable.iServices41To48, KSstServices41to48, sizeof(KSstServices41to48) / sizeof(SEnumFlag));
PrintServices(_L("49 to 56:"), serviceTable.iServices49To56, KSstServices49to56, sizeof(KSstServices49to56) / sizeof(SEnumFlag));
break;
case RMobilePhone::EUSIMServiceTable:
PrintServices(_L("1 to 8: "), serviceTable.iServices1To8, KUstServices1to8, sizeof(KUstServices1to8) / sizeof(SEnumFlag));
PrintServices(_L("9 to 16: "), serviceTable.iServices9To16, KUstServices9to16, sizeof(KUstServices9to16) / sizeof(SEnumFlag));
PrintServices(_L("17 to 24:"), serviceTable.iServices17To24, KUstServices17to24, sizeof(KUstServices17to24) / sizeof(SEnumFlag));
PrintServices(_L("25 to 32:"), serviceTable.iServices25To32, KUstServices25to32, sizeof(KUstServices25to32) / sizeof(SEnumFlag));
PrintServices(_L("33 to 40:"), serviceTable.iServices33To40, KUstServices33to40, sizeof(KUstServices33to40) / sizeof(SEnumFlag));
PrintServices(_L("41 to 48:"), serviceTable.iServices41To48, KUstServices41to48, sizeof(KUstServices41to48) / sizeof(SEnumFlag));
PrintServices(_L("49 to 56:"), serviceTable.iServices49To56, KUstServices49to56, sizeof(KUstServices49to56) / sizeof(SEnumFlag));
break;
case RMobilePhone::ECDMAServiceTable:
break;
case RMobilePhone::EUSIMEnabledServiceTable:
PrintServices(_L("1 to 8: "), serviceTable.iServices1To8, KEstServices1to8, sizeof(KEstServices1to8) / sizeof(SEnumFlag));
break;
#if defined (FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
case RMobilePhone::EISIMServiceTable:
PrintServices(_L("1 to 8: "), serviceTable.iServices1To8, KIstServices1to8, sizeof(KIstServices1to8) / sizeof(SEnumFlag));
break;
#endif
}
if (iV2Tsy)
{
Write(_L("AID:\r\n"));
LtkUtils::HexDumpToOutput(serviceTable.iAID, Stdout());
}
}
void CCmdIcc::DisplayFdnStatusL()
{
RMobilePhone::TMobilePhoneFdnStatus fdnStatus;
LeaveIfErr(iPhone.GetFdnStatus(fdnStatus), _L("Unable to get FDN status"));
switch (fdnStatus)
{
case RMobilePhone::EFdnNotActive:
Write(_L("EFdnNotActive\r\n"));
break;
case RMobilePhone::EFdnActive:
Write(_L("EFdnActive\r\n"));
break;
case RMobilePhone::EFdnPermanentlyActive:
Write(_L("EFdnPermanentlyActive\r\n"));
break;
case RMobilePhone::EFdnNotSupported:
Write(_L("EFdnNotSupported\r\n"));
break;
case RMobilePhone::EFdnUnknown:
default:
Write(_L("EFdnUnknown\r\n"));
break;
}
}
void CCmdIcc::DisplayPhoneBookInfoL()
{
if (iStoreName == NULL)
{
LeaveIfErr(KErrArgument, _L("The name of the phone store must be specified using -s"));
}
if (iVerbose)
{
Printf(_L("Getting phone store info for phone book \"%S\"...\r\n"), iStoreName);
}
GetPhoneBookInfoL();
Printf(_L("Total number of entries: %d\r\n"), iStoreInfo.iTotalEntries);
Printf(_L("Used number of entries: %d\r\n"), iStoreInfo.iUsedEntries);
Printf(_L("Capabilities: 0x%08x\r\n"), iStoreInfo.iCaps);
Printf(_L("Phone name: %S\r\n"), &iStoreInfo.iName);
Printf(_L("Maximum number length: %d\r\n"), iStoreInfo.iMaxNumLength);
Printf(_L("Maximum text length: %d\r\n"), iStoreInfo.iMaxTextLength);
Write( _L("Store location: "));
switch (iStoreInfo.iLocation)
{
default:
case RMobilePhoneBookStore::ELocationUnknown:
Write(_L("ELocationUnknown"));
break;
case RMobilePhoneBookStore::ELocationIccMemory:
Write(_L("ELocationIccMemory"));
break;
case RMobilePhoneBookStore::ELocationPhoneMemory:
Write(_L("ELocationPhoneMemory"));
break;
case RMobilePhoneBookStore::ELocationExternalMemory:
Write(_L("ELocationExternalMemory"));
break;
case RMobilePhoneBookStore::ELocationCombinedMemory:
Write(_L("ELocationCombinedMemory"));
break;
}
Write(_L("\r\n"));
Printf(_L("Change counter: %d\r\n"), iStoreInfo.iChangeCounter);
Printf(_L8("Phone book identity: %S\r\n"), &iStoreInfo.iIdentity);
if (iV2Tsy)
{
Printf(_L("Mode: %S\r\n"), &iStoreInfo.iPhBkMode);
}
if (iV5Tsy)
{
Printf(_L("Maximum second names: %d\r\n"), iStoreInfo.iMaxSecondNames);
Printf(_L("Maximum text length second names: %d\r\n"), iStoreInfo.iMaxTextLengthSecondName);
Printf(_L("Maximum additional numbers: %d\r\n"), iStoreInfo.iMaxAdditionalNumbers);
Printf(_L("Maximum number length additional number: %d\r\n"), iStoreInfo.iMaxNumLengthAdditionalNumber);
Printf(_L("Maximum text length additional number: %d\r\n"), iStoreInfo.iMaxTextLengthAdditionalNumber);
Printf(_L("Maximum group names: %d\r\n"), iStoreInfo.iMaxGroupNames);
Printf(_L("Maximum text length group name: %d\r\n"), iStoreInfo.iMaxTextLengthGroupName);
Printf(_L("Maximum email address: %d\r\n"), iStoreInfo.iMaxEmailAddr);
Printf(_L("Maximum text length email address: %d\r\n"), iStoreInfo.iMaxTextLengthEmailAddr);
}
}
void CCmdIcc::DumpPhoneBookL()
{
if (iStoreName == NULL)
{
LeaveIfErr(KErrArgument, _L("The name of the phone store must be specified using -s"));
}
if (iVerbose)
{
Printf(_L("Dumping phone book store \"%S\"...\r\n"), iStoreName);
}
GetPhoneBookInfoL();
if (iVerbose)
{
Printf(_L("Phone book store has %d slots\r\n"), iStoreInfo.iTotalEntries);
}
for (TInt slotIndex = 0; slotIndex < iStoreInfo.iTotalEntries; ++slotIndex)
{
if (iVerbose)
{
Printf(_L("Reading slot %d...\r\n"), slotIndex);
}
TBuf8<1024> buf;
TRequestStatus status;
iPhoneBookStore.Read(status, slotIndex, 1, buf);
User::WaitForRequest(status);
if (status.Int() != KErrNone)
{
Printf(_L8("%d: %d\r\n"), slotIndex, status.Int());
}
else
{
Printf(_L8("%d:\r\n"), slotIndex);
LtkUtils::HexDumpToOutput(buf, Stdout());
Write(_L("\r\n"));
}
}
}
void CCmdIcc::EditPhoneBookL()
{
if (iStoreName == NULL)
{
LeaveIfErr(KErrArgument, _L("The name of the phone store must be specified using -s"));
}
if (iData == NULL)
{
LeaveIfErr(KErrArgument, _L("The data to be entered must be specified using -d"));
}
if (!iOptions.IsPresent(&iSlot))
{
LeaveIfErr(KErrArgument, _L("The slot to be edited must be specified using -l"));
}
GetPhoneBookInfoL();
TRequestStatus status;
TPtrC8 data((const TUint8*)iData->Ptr(), iData->Size());
if (iVerbose)
{
Printf(_L("Writing the following to slot %d:\r\n"), iSlot);
LtkUtils::HexDumpToOutput(data, Stdout());
}
iPhoneBookStore.Write(status, data, iSlot);
User::WaitForRequest(status);
LeaveIfErr(status.Int(), _L("Unable to write to phone book store \"%S\""), iStoreName);
Printf(_L("Slot %d edited\r\n"), iSlot);
}
void CCmdIcc::ApiSupported(TInt aApi, TBool& aIsSupported)
{
TInt err = iEtelServer.IsSupportedByModule(*iTsyName, aApi, aIsSupported);
if (err != KErrNone)
{
aIsSupported = EFalse;
}
}
void CCmdIcc::GetPhoneBookInfoL()
{
if (iMode)
{
LeaveIfErr(iPhoneBookStore.Open(iPhone, *iStoreName, *iMode), _L("Unable to open phone book store \"%S\" in mode \"%S\""), iStoreName, iMode);
}
else
{
LeaveIfErr(iPhoneBookStore.Open(iPhone, *iStoreName), _L("Unable to open phone book store \"%S\""), iStoreName);
}
TRequestStatus status;
if (iV5Tsy)
{
TPckg<RMobilePhoneBookStore::TMobilePhoneBookInfoV5> pckg(iStoreInfo);
iPhoneBookStore.GetInfo(status, pckg);
}
else if (iV2Tsy)
{
TPckg<RMobilePhoneBookStore::TMobilePhoneBookInfoV2> pckg(iStoreInfo);
iPhoneBookStore.GetInfo(status, pckg);
}
else
{
TPckg<RMobilePhoneBookStore::TMobilePhoneBookInfoV1> pckg(iStoreInfo);
iPhoneBookStore.GetInfo(status, pckg);
}
User::WaitForRequest(status);
LeaveIfErr(status.Int(), _L("Couldn't get phone book store info"));
}
void CCmdIcc::OpenPhoneL()
{
if (iTsyName == NULL)
{
CommsDat::CMDBSession* db = CommsDat::CMDBSession::NewLC(KCDLatestVersion);
CommsDat::CMDBField<TUint32>* globalSettingField = new(ELeave) CommsDat::CMDBField<TUint32>(CommsDat::KCDTIdModemPhoneServicesSMS);
CleanupStack::PushL(globalSettingField);
globalSettingField->SetRecordId(1);
globalSettingField->LoadL(*db);
TUint32 modemId = *globalSettingField;
CommsDat::CMDBField<TDesC>* tsyField = new(ELeave) CommsDat::CMDBField<TDesC>(CommsDat::KCDTIdTsyName);
CleanupStack::PushL(tsyField);
tsyField->SetRecordId(modemId);
TRAPL(tsyField->LoadL(*db), _L("Unable to read default TSY name"));
TBuf<KCommsDbSvrMaxFieldLength> tsyName;
tsyName = *tsyField;
iTsyName = tsyName.AllocL();
CleanupStack::PopAndDestroy(3, db); // db, tsyField & globalSettingField
}
LeaveIfErr(iEtelServer.Connect(), _L("Unable to connect to the ETel server"));
LeaveIfErr(iEtelServer.LoadPhoneModule(*iTsyName), _L("Unable to load TSY module \"%S\""), iTsyName);
TInt numPhones = 0;
LeaveIfErr(iEtelServer.EnumeratePhones(numPhones), _L("Couldn't enumerate phones"));
TBool matchFound(EFalse);
TInt phoneIndex;
for (phoneIndex = 0; phoneIndex < numPhones; ++phoneIndex)
{
TName thisTsyName;
if ((iEtelServer.GetTsyName(phoneIndex, thisTsyName) == KErrNone) && (iTsyName->CompareF(thisTsyName) == KErrNone))
{
matchFound = ETrue;
break;
}
}
if (!matchFound)
{
LeaveIfErr(KErrNotFound, _L("Couldn't find phone using TSY \"%S\""), iTsyName);
}
RTelServer::TPhoneInfo phoneInfo;
LeaveIfErr(iEtelServer.GetPhoneInfo(phoneIndex, phoneInfo), _L("Couldn't get phone info"));
LeaveIfErr(iPhone.Open(iEtelServer, phoneInfo.iName), _L("Couldn't open phone"));
ApiSupported(KEtelExtMultimodeV5, iV5Tsy);
ApiSupported(KETelExtMultimodeV2, iV2Tsy);
ApiSupported(KEtelFuncMobileUSIMApplications, iUsimTsy);
if (iVerbose)
{
if (iUsimTsy)
{
Write(_L("TSY supports USIM API\r\n"));
}
if (iV2Tsy)
{
Write(_L("TSY supports V2 API\r\n"));
}
if (iV5Tsy)
{
Write(_L("TSY supports V5 API\r\n"));
}
}
}
void CCmdIcc::ArgumentsL(RCommandArgumentList& aArguments)
{
_LIT(KOperationName, "operation");
aArguments.AppendEnumL((TInt&)iOperation, KOperationName);
}
void CCmdIcc::OptionsL(RCommandOptionList& aOptions)
{
_LIT(KOptVerbose, "verbose");
aOptions.AppendBoolL(iVerbose, KOptVerbose);
_LIT(KOptTsyName, "tsy-name");
aOptions.AppendStringL(iTsyName, KOptTsyName);
_LIT(KArgServiceTable, "service-table");
aOptions.AppendUintL(iServiceTable, KArgServiceTable);
_LIT(KArgStoreName, "store-name");
aOptions.AppendStringL(iStoreName, KArgStoreName);
_LIT(KArgMode, "mode");
aOptions.AppendStringL(iMode, KArgMode);
_LIT(KArgSlot, "slot");
aOptions.AppendIntL(iSlot, KArgSlot);
_LIT(KArgData, "data");
aOptions.AppendStringL(iData, KArgData);
}
EXE_BOILER_PLATE(CCmdIcc)