// Copyright (c) 2001-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:+ −
// This file contains the implementation for the Simulator Phone class 'CSimPhone'+ −
// + −
//+ −
+ −
/**+ −
@file+ −
*/+ −
+ −
#include <testconfigfileparser.h>+ −
#include "CSimPhone.h"+ −
#include "CSimCall.h"+ −
#include "csimsmsmess.h"+ −
#include "CSimPhBkStore.h"+ −
#include "CSimPhBkUsimStore.h"+ −
#include "CSimONStore.h"+ −
#include "CSimSignalStrength.h"+ −
#include "CSimNetworkStatus.h"+ −
#include "CSimDtmf.h"+ −
#include "CSimIndicator.h"+ −
#include "utils.h"+ −
#include "Simlog.h"+ −
#include "CSimPacketService.h"+ −
#include "CSimSat.h"+ −
#include "CSimBatteryCharger.h"+ −
#include "CSimCallBarring.h"+ −
#include "CSimCallForwarding.h"+ −
#include "CSimCallWaiting.h"+ −
#include "CSimPhoneInitialise.h"+ −
#include "CSimPhoneIMSAuth.h"+ −
#include "CSimTsyMode.h"+ −
#include "csimsmartcardauth.h"+ −
#include "csimsmartcardeap.h"+ −
+ −
#include "simtsyglobalproperties.h"+ −
#include "et_struct.h"+ −
+ −
+ −
#define PDD_NAME _L("ECDRV") // < Name of the WINS Serial Physical Device Driver+ −
#define LDD_NAME _L("ECOMM") // < Name of the WINS Serial Logical Device Driver+ −
+ −
const TInt KPhBkUSimStoreGranularity=5; // < The granularity of the phonebook store list array.+ −
const TInt KPhonebookStoreGranularity=2; // < The granularity of the phonebook store list array.+ −
+ −
GLDEF_C void SimPanic(TSimPanic aPanicNumber, TInt aLineNumber)+ −
{+ −
LOGPHONE3("SMS.TSY Panic %d Line %d", aPanicNumber, aLineNumber);+ −
(void) aLineNumber;+ −
_LIT(panicText,"SIM.TSY");+ −
User::Panic(panicText,aPanicNumber);+ −
}+ −
+ −
//+ −
// CSimPhone+ −
//+ −
void CSimPhone::CloseObj(TAny* aObj)+ −
/**+ −
* A utility function for cleaning up the stack.+ −
*+ −
* @param aObj a pointer to the CObject to close+ −
*/+ −
{+ −
((CObject*)aObj)->Close();+ −
}+ −
+ −
CSimPhone* CSimPhone::NewL(CPhoneBase*& aPhoneBaseRef)+ −
/**+ −
* Standard two phase constructor.+ −
*+ −
* @return CSimPhone pointer to the phone object created+ −
* @leave Leaves if no memory or object is not created for any reason+ −
*/+ −
{+ −
CSimPhone* phone=new(ELeave) CSimPhone(aPhoneBaseRef);+ −
TCleanupItem newPhoneClose(CloseObj,phone);+ −
CleanupStack::PushL(newPhoneClose);+ −
phone->ConstructL();+ −
CleanupStack::Pop();+ −
+ −
aPhoneBaseRef = phone;+ −
+ −
return phone;+ −
}+ −
+ −
CSimPhone::CSimPhone(CPhoneBase*& aPhoneBaseRef)+ −
: iPhoneBaseRef(aPhoneBaseRef),+ −
iAPNServiceOffset(4),+ −
iUSIMServiceTable(NULL),+ −
iUSIMEnabledServiceTable(NULL),+ −
iSIMServiceTable(NULL),+ −
iModemDetection(RPhone::EDetectedPresent),+ −
iMode(RPhone::EModeIdle), + −
iNtwkMode(RMobilePhone::ENetworkModeUnknown)+ −
{+ −
iPhoneId.iError = KErrNotSupported;+ −
}+ −
+ −
/**+ −
* A utility function for reading the service tables and setting them up+ −
*+ −
* @param aMaxSupported size of table supported by etelmm+ −
* @param aLookup config file reference to the table to be looked up+ −
* @param pTable pointer to the table to be constructed for the config file table+ −
* @return void does not return anything+ −
*/ + −
void CSimPhone::PopulateServiceTableL( TInt aMaxSupported, + −
const TDesC8& aLookup, + −
RMobilePhone::TMobilePhoneServiceTableV1** aTable)+ −
{+ −
+ −
RMobilePhone::TMobilePhoneServiceTableV1* pTable = NULL;+ −
pTable = new(ELeave) RMobilePhone::TMobilePhoneServiceTableV1();+ −
+ −
// USIM Supported entry's+ −
const CTestConfigItem* item=CfgFile()->Item(aLookup);+ −
if (item)+ −
{ + −
TInt count = CTestConfig::CountElements(item->Value(),KStdDelimiter);+ −
for (TInt i= 0; i< count; i++)+ −
{+ −
TInt entry = 0; + −
TUint8* pTableEntry = &(pTable->iServices1To8); + −
+ −
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,entry);+ −
if(ret == KErrNone && entry < (aMaxSupported+1)) // This is the maximum supported services by etelmm.h+ −
{+ −
TUint8 basic = 0x01;+ −
pTableEntry += ((entry-1)/8);+ −
*pTableEntry |= (basic << ((entry-1)%8));+ −
}+ −
}+ −
*aTable = pTable; + −
LOGPHONE2("Successfully populated %s table in simtsy", &aLookup); + −
}+ −
else + −
{+ −
delete(pTable);+ −
pTable = NULL;+ −
LOGPHONE2("Failed to populat %s table in simtsy", &aLookup); + −
}+ −
}+ −
+ −
/**+ −
* A utility function for reading the USIM V8 service tables and setting them up+ −
*+ −
* @param aTableV8 pointer to the table to be constructed for the config file table+ −
* @param aLookup config file reference to the table to be looked up+ −
* @return void does not return anything+ −
*/ + −
void CSimPhone::PopulateServiceTableV8L(const TDesC8& aLookup,RMobilePhone::TMobilePhoneServiceTableV8** aTableV8)+ −
{+ −
+ −
RMobilePhone::TMobilePhoneServiceTableV8* pTable = NULL;+ −
pTable = new(ELeave) RMobilePhone::TMobilePhoneServiceTableV8();+ −
+ −
TInt aMaxSupportedV1 = 56;+ −
TInt aMaxSupportedV8 = 72;+ −
// USIM Supported entry's for V8+ −
+ −
const CTestConfigItem* item=CfgFile()->Item(aLookup);+ −
if (item)+ −
{ + −
TInt count = CTestConfig::CountElements(item->Value(),KStdDelimiter);+ −
for (TInt i= 0; i< count; i++)+ −
{+ −
TInt entry = 0; + −
TUint8* pTableEntry = &(pTable->iServices57To64); + −
+ −
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,entry);+ −
if(ret == KErrNone && entry > (aMaxSupportedV1) && entry < (aMaxSupportedV8 +1)) // This is the maximum supported services by etelmm.h+ −
{+ −
entry -= aMaxSupportedV1;+ −
TUint8 basic = 0x01;+ −
pTableEntry += ((entry-1)/8);+ −
*pTableEntry |= (basic << ((entry-1)%8));+ −
}+ −
}+ −
*aTableV8 = pTable; + −
LOGPHONE2("Successfully populated %s table in simtsy", &aLookup); + −
}+ −
else + −
{+ −
delete(pTable);+ −
pTable = NULL;+ −
LOGPHONE2("Failed to populate %s table in simtsy", &aLookup); + −
}+ −
}+ −
+ −
+ −
+ −
void CSimPhone::SetTestNumberAndReadConfigurationFileL()+ −
{+ −
TInt testNumber;+ −
User::LeaveIfError(GetTestNumber(testNumber));+ −
iSectionName.Format(KSectionNameFormat,testNumber);+ −
+ −
delete iConfigFile;+ −
iConfigFile = NULL;+ −
+ −
TRAPD(err, iConfigFile = CTestConfig::NewLC(iFs, KConfigFileDir, KConfigFilename); CleanupStack::Pop(iConfigFile));+ −
if( err == KErrNone && iConfigFile->Section(iSectionName) != NULL )+ −
{+ −
iConfigSection = iConfigFile->Section(iSectionName);+ −
}+ −
else+ −
{+ −
LOGPHONE2("Section for requested test number (%d) not found in the Config File",testNumber);+ −
delete iConfigFile;+ −
iConfigFile = NULL;+ −
+ −
User::Leave(KErrNotFound);+ −
}+ −
+ −
User::LeaveIfError(SetTestNumberInUse(testNumber));+ −
}+ −
+ −
void CSimPhone::ConstructL()+ −
/**+ −
* 2 Phase Construction (Second phase)+ −
* Loads the WINS Physical and Logical Serial Device Drivers. C32 loads the non-WINS+ −
* serial drivers, so we don't have to worry about these.+ −
* Creates Voice (CSimVoiceLine) and Data lines (CSimDataLine), CConfigReader objects,+ −
* CSimSysAgent objects, CSimSmsMessaging object, CSimPhoneStore object,+ −
* CSimPhoneBook object, and CSimPacketService object.+ −
*/+ −
{+ −
#if defined (__WINS__)+ −
TInt r=User::LoadPhysicalDevice(PDD_NAME);+ −
r=User::LoadLogicalDevice(LDD_NAME);+ −
#endif+ −
+ −
LOGPHONE1("Starting to Load and Parse the Config File");+ −
+ −
User::LeaveIfError(iFs.Connect());+ −
+ −
SetTestNumberAndReadConfigurationFileL();+ −
+ −
CSimTsyMode::InitL(this);+ −
+ −
iReduceTimers = CSimReduceTimers::NewL();+ −
+ −
InitPhoneStatus();+ −
iSimPhoneInitialise = CSimPhoneInitialise::NewL(this);+ −
+ −
if (CSimTsyMode::GetMode() != CSimTsyMode::ECdmaV1)+ −
{+ −
iVoiceLine = CSimVoiceLine::NewL(this,KVoiceLineName);+ −
iDataLine = CSimDataLine::NewL(this,KDataLineName);+ −
iSmsMessaging = CSimSmsMessaging::NewL(this);+ −
iPhoneSecurity = CSimPhoneSecurity::NewL(this);+ −
iPhoneUSimApp = CSimPhoneUSimApp::NewL(this);+ −
iPhoneSmartCardApp = CSimPhoneSmartCardApp::NewL(this);+ −
iPhoneScAuth = CSimSmartCardAuth::NewL(this);+ −
+ −
iPhBkStores=new(ELeave) CArrayFixFlat<CSimPhBkStore*>(KPhonebookStoreGranularity);+ −
iPhBkUSimStores=new(ELeave) CArrayFixFlat<CSimPhBkUSimStore*>(KPhBkUSimStoreGranularity);+ −
+ −
FindAndCreatePhBkStoresL();+ −
CreateONStoreL();+ −
+ −
iSignalStrength=CSimSignalStrength::NewL(this);+ −
iNetworkStatus=CSimNetworkStatus::NewL(this);+ −
iDtmf=CSimDtmf::NewL(this);+ −
+ −
}+ −
+ −
const TInt capacityServiceTable = 56;+ −
PopulateServiceTableL(capacityServiceTable,KUSIMServiceTableSupportedEntrys(), &iUSIMServiceTable);+ −
PopulateServiceTableL(capacityServiceTable,USIMServiceTableEnabledEntrys(), &iUSIMEnabledServiceTable);+ −
PopulateServiceTableL(capacityServiceTable,KSIMServiceTable(), &iSIMServiceTable);+ −
+ −
/* Updating the V8 features */+ −
PopulateServiceTableV8L(KUSIMServiceTableSupportedEntrys(),&iUSIMServiceTableV8);+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
TInt entries = 0;+ −
const CTestConfigItem* aPNListItem=CfgFile()->Item(KAccessPointNameList);+ −
if (aPNListItem)+ −
{+ −
TInt ret=CTestConfig::GetElement(aPNListItem->Value(),KStdDelimiter,0,entries);+ −
if(ret == KErrNone && entries > 0)+ −
{+ −
for (TInt i= 0;i< entries;i++)+ −
{+ −
RMobilePhone::TAPNEntryV3 entry;+ −
entry.iApn.Zero();+ −
TPtrC8 startupAPNList;+ −
ret=CTestConfig::GetElement(aPNListItem->Value(),KStdDelimiter,i+1,startupAPNList);+ −
entry.iApn.Copy(startupAPNList);+ −
iAPNList.Append(entry); + −
}+ −
}+ −
} + −
}+ −
+ −
TPtrC8 IMSI;+ −
iSubscriberId.iError = KErrNone;+ −
const CTestConfigItem* itemSubscriberId=CfgFile()->Item(KSubscriberId);+ −
if( itemSubscriberId != NULL )+ −
{+ −
TInt ret=CTestConfig::GetElement(itemSubscriberId->Value(),KStdDelimiter,0,IMSI);+ −
if( ret != KErrNone )+ −
{+ −
LOGPARSERR("IMSI",ret,0,&KSubscriberId);+ −
}+ −
// coverity[check_return]+ −
CTestConfig::GetElement(itemSubscriberId->Value(),KStdDelimiter,1,iSubscriberId.iError);+ −
iSubscriberId.iIMSI.Copy(IMSI);+ −
}+ −
else+ −
{+ −
iSubscriberId.iIMSI.Copy(KSubscriberIdDefault);+ −
}+ −
+ −
iNtwkMode=(RMobilePhone::TMobilePhoneNetworkMode)CfgFile()->ItemValue(KNetworkMode,KNetworkModeDefault);+ −
//get phone id from config file+ −
GetPhoneIdAndCaps();+ −
+ −
LOGPHONE1("Loading the version configuration");+ −
iSimTsyVersion = CfgFile()->ItemValue(KTsyVersionNumber,KSimTsyDefaultVersion);+ −
LOGPHONE2("Simulated SIMTSY version: %d", iSimTsyVersion);+ −
+ −
iPacketService = CSimPacketService::NewL(this);+ −
iBatteryCharger = CSimBatteryCharger::NewL(this);+ −
iSat = CSimSat::NewL(this);+ −
iIndicator = CSimIndicator::NewL(this);+ −
iPhoneIMSAuth = CSimPhoneIMSAuth::NewL(this);+ −
+ −
iCallBarring=CSimCallBarring::NewL(this);+ −
iCallForwarding=CSimCallForwarding::NewL(this);+ −
iCallWaiting=CSimCallWaiting::NewL(this);+ −
iUsimRelease6=CSimUsimR6::NewL(this);+ −
+ −
iNetworkModeArray = new (ELeave) CArrayFixFlat<TNetworkModeBundle>(KGranularity);+ −
+ −
iPhoneScEapMan = CSimSmartCardEapManager::NewL(this);+ −
+ −
iNetworkModeTimer = CSimTimer::NewL(this);+ −
//< Read in all network mode data+ −
TInt count = CfgFile()->ItemCount(KNetworkMode);+ −
const CTestConfigItem* item = NULL;+ −
for (TInt i = 0; i < count; ++i)+ −
{+ −
item = CfgFile()->Item(KNetworkMode,i);+ −
if (!item)+ −
break;+ −
+ −
TInt duration(0); + −
TInt networkMode(0);+ −
TInt ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);+ −
if (ret != KErrNone)+ −
break;+ −
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,networkMode);+ −
if (ret != KErrNone)+ −
break;+ −
RMobilePhone::TMobilePhoneNetworkMode mode;+ −
if(networkMode == 1)+ −
{+ −
mode = RMobilePhone::ENetworkModeUnregistered;+ −
}+ −
else if(networkMode == 2)+ −
{+ −
mode = RMobilePhone::ENetworkModeGsm;+ −
}+ −
else if(networkMode == 3)+ −
{+ −
mode = RMobilePhone::ENetworkModeAmps;+ −
}+ −
else if(networkMode == 6)+ −
{+ −
mode = RMobilePhone::ENetworkModeWcdma;+ −
}+ −
else if(networkMode == 7)+ −
{+ −
mode = RMobilePhone::ENetworkModeTdcdma;+ −
}+ −
else+ −
{+ −
mode = RMobilePhone::ENetworkModeUnknown;+ −
}+ −
TNetworkModeBundle networkModeData;+ −
networkModeData.iDuration = duration;+ −
networkModeData.iNetworkMode = mode;+ −
+ −
TRAP_IGNORE(iNetworkModeArray->AppendL(networkModeData));+ −
}+ −
+ −
if (iNetworkModeArray->Count() != 0)+ −
{+ −
iNetworkModeIndex = 0;+ −
TNetworkModeBundle initialNetworkMode = iNetworkModeArray->At(0);+ −
iNtwkMode = initialNetworkMode.iNetworkMode; // set to new value if NetworkMode present in config.txt file+ −
iTimerCallBackNetworkMode.SetHandle(this);+ −
iNetworkModeTimer->Start(initialNetworkMode.iDuration, &iTimerCallBackNetworkMode);+ −
}+ −
// end of network mode simulation setup+ −
iTestNumberObserver = CSimTestNumberObserver::NewL(*this);+ −
+ −
LOGPHONE1("Completed Loading and Parsing the Config File");+ −
}+ −
+ −
CSimReduceTimers* CSimPhone::GetReduceTimersSubject()+ −
{+ −
return iReduceTimers;+ −
}+ −
+ −
TInt CSimPhone::GetTestNumber(TInt& aTestNumber)+ −
/**+ −
* Retrieve the test number.+ −
*/+ −
{+ −
TInt ret = RProperty::Get(KUidPSSimTsyCategory, KPSSimTsyTestNumber, aTestNumber);+ −
+ −
if (ret == KErrNone && aTestNumber >= 0)+ −
{+ −
LOGPHONE2("Got system property KUidPSSimTsyCategory/KPSSimTsyTestNumber. testNumber=%d", aTestNumber);+ −
}+ −
else+ −
{+ −
aTestNumber = KDefaultTestNumber;+ −
LOGPHONE2("Using the default test number. testNumber=%d", aTestNumber);+ −
}+ −
+ −
return KErrNone;+ −
}+ −
+ −
+ −
TInt CSimPhone::SetTestNumberInUse(TInt aTestNumber)+ −
/**+ −
* Set the test number that is actually used by the TSY+ −
*/+ −
{+ −
TInt ret = RProperty::Set(KUidPSSimTsyCategory, KPSSimTsyTestNumberInUse, aTestNumber);+ −
+ −
if (ret == KErrNone)+ −
{+ −
LOGPHONE2("Set system property KUidPSSimTsyCategory/KPSSimTsyTestNumberInUse. testNumber=%d", aTestNumber);+ −
}+ −
+ −
return ret;+ −
}+ −
+ −
+ −
CSimPhone::~CSimPhone()+ −
/**+ −
* Standard destructor.+ −
* Any objects created by the ::ConstructL() function should be destroyed here.+ −
* The objects to be destroyed are:+ −
* CSimVoiceLine, CSimDataLine, CConfigReader, CSimSysAgent, CSimSmsMessaging+ −
* CSimPhoneStore, CSimPhoneBook, CSimPacketService+ −
*/+ −
{+ −
iPhoneBaseRef = NULL;+ −
+ −
delete iNetworkModeTimer;+ −
+ −
delete iDtmf;+ −
delete iNetworkStatus;+ −
delete iSignalStrength;+ −
delete iIndicator;+ −
delete iBatteryCharger;+ −
delete iPhoneIMSAuth;+ −
delete iPhoneScEapMan;+ −
delete iPhoneScAuth;+ −
delete iUsimRelease6;+ −
+ −
iFs.Close();+ −
if(iDataLine)+ −
iDataLine->Close();+ −
if(iVoiceLine)+ −
iVoiceLine->Close();+ −
if(iSmsMessaging)+ −
iSmsMessaging->Close();+ −
if(iPhoneSecurity)+ −
iPhoneSecurity->Close();+ −
if(iPhoneUSimApp)+ −
iPhoneUSimApp->Close();+ −
if(iPhoneSmartCardApp)+ −
iPhoneSmartCardApp->Close();+ −
+ −
if (iUSIMServiceTable != NULL) + −
delete(iUSIMServiceTable);+ −
if (iUSIMEnabledServiceTable != NULL) + −
delete(iUSIMEnabledServiceTable); + −
if (iSIMServiceTable != NULL) + −
delete(iSIMServiceTable);+ −
if (iUSIMServiceTableV8 != NULL) + −
delete(iUSIMServiceTableV8);+ −
+ −
if( iPhBkStores != NULL )+ −
{+ −
TInt storeCount=iPhBkStores->Count();+ −
for(TInt i=0;i<storeCount;i++)+ −
{+ −
iPhBkStores->At(i)->Close();+ −
}+ −
delete iPhBkStores;+ −
}+ −
if( iPhBkUSimStores != NULL )+ −
{+ −
TInt storeCount=iPhBkUSimStores->Count();+ −
for(TInt i=0;i<storeCount;i++)+ −
{+ −
iPhBkUSimStores->At(i)->Close();+ −
}+ −
delete iPhBkUSimStores;+ −
}+ −
+ −
if(iONStore)+ −
{+ −
iONStore->Close();+ −
iONStore = NULL;+ −
}+ −
if( iNetworkModeArray != NULL )+ −
{+ −
iNetworkModeArray->Delete(0,iNetworkModeArray->Count());+ −
delete iNetworkModeArray;+ −
}+ −
if( iPacketService!= NULL )+ −
{+ −
iPacketService->Close();+ −
}+ −
if( iSat != NULL )+ −
{+ −
iSat->Close();+ −
}+ −
if( iConfigFile == NULL)+ −
{+ −
// In this case if iConfigSection exists then it is not owned+ −
// by iConfigFile - this is cos there was no config file for+ −
// this SIM TSY.+ −
delete iConfigSection;+ −
}+ −
delete iConfigFile;+ −
delete iCallBarring;+ −
delete iCallForwarding;+ −
delete iCallWaiting;+ −
+ −
if (iSetCallProcessingSuspendStateTimer)+ −
{+ −
iSetCallProcessingSuspendStateTimer->Cancel();+ −
delete iSetCallProcessingSuspendStateTimer; + −
}+ −
delete iSimPhoneInitialise;+ −
+ −
delete iReduceTimers;+ −
delete iTestNumberObserver;+ −
+ −
CSimTsyMode::FreeMode();+ −
LOGPHONE1("CSimPhone Destroyed");+ −
}+ −
+ −
void CSimPhone::InitPhoneStatus()+ −
{+ −
const CTestConfigItem* item = NULL;+ −
TInt ret = KErrNone;+ −
+ −
LOGPHONE1("Starting to Load and Parse Phone Config parameters");+ −
+ −
item = CfgFile()->Item(KPhoneStatus);+ −
if(!item)+ −
return;+ −
+ −
TInt modemDetection, mode;+ −
ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, modemDetection);+ −
if (ret == KErrNone)+ −
{+ −
iModemDetection = (RPhone::TModemDetection)modemDetection;+ −
}+ −
ret=CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, mode);+ −
if (ret != KErrNone)+ −
{+ −
iMode = (RPhone::TMode)mode;+ −
}+ −
}+ −
+ −
void CSimPhone::FindAndCreatePhBkStoresL()+ −
{+ −
TInt count=CfgFile()->ItemCount(KPhBkStore);+ −
const CTestConfigItem* item=NULL;+ −
TInt ret=KErrNone;+ −
+ −
LOGPHONE1("Starting to Load and Parse PhoneBookStore Config parameters");+ −
TInt i;+ −
for(i=0;i<count;i++)+ −
{+ −
item=CfgFile()->Item(KPhBkStore,i);+ −
if(!item)+ −
break;+ −
+ −
TPtrC8 phonebookName;+ −
TInt maxNumSlots, telNumMaxLen, alphaTagMaxLen;+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,phonebookName);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("phonebookName",ret,0,&KPhBkStore);+ −
continue;+ −
}+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,maxNumSlots);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("maxNumSlots",ret,1,&KPhBkStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,telNumMaxLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("telNumMaxLen",ret,2,&KPhBkStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,alphaTagMaxLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("alphaTagMaxLen",ret,3,&KPhBkStore);+ −
continue;+ −
}+ −
+ −
+ −
CSimPhBkStore* phBkStore=CSimPhBkStore::NewL(this,phonebookName,maxNumSlots,telNumMaxLen,alphaTagMaxLen);+ −
TCleanupItem newObjClose(CloseObj,phBkStore);+ −
CleanupStack::PushL(newObjClose);+ −
iPhBkStores->AppendL(phBkStore);+ −
CleanupStack::Pop();+ −
}+ −
+ −
+ −
count=CfgFile()->ItemCount(KPhBkUSimStore);+ −
+ −
LOGPHONE1("Starting to Load and Parse USim PhoneBookStore Config parameters");+ −
+ −
for(i=0;i<count;i++)+ −
{+ −
item=CfgFile()->Item(KPhBkUSimStore,i);+ −
if(!item)+ −
break;+ −
+ −
TPtrC8 phonebookName, phonebookStore;+ −
TInt maxNumSlots, telNumMaxLen, alphaTagMaxLen;+ −
TInt additional, maxEmail, maxAdditionalTelNumLen, maxAdditionalTextLen;+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,phonebookStore);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("phonebookStore",ret,0,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,phonebookName);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("phonebookName",ret,1,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,maxNumSlots);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("maxNumSlots",ret,2,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,telNumMaxLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("telNumMaxLen",ret,3,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,alphaTagMaxLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("alphaTagMaxLen",ret,4,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,additional);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("additional",ret,5,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,maxEmail);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("maxEmail",ret,6,&KPhBkUSimStore);+ −
continue;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,maxAdditionalTelNumLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPHONE1("WARNING maxAdditionalTelNumLen missing, defaulting to telNumMaxLen");+ −
maxAdditionalTelNumLen = telNumMaxLen;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,maxAdditionalTextLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPHONE1("WARNING maxAdditionalTextLen missing, defaulting to alphaTagMaxLen");+ −
maxAdditionalTextLen = alphaTagMaxLen;+ −
}+ −
+ −
TInt countStores = iPhBkUSimStores->Count();+ −
TBool found=EFalse;+ −
+ −
if(phonebookName.Compare(KGsmPhoneBook) == KErrNone)+ −
{+ −
TInt countShort = iPhBkStores->Count();+ −
TBool foundShort=EFalse;+ −
+ −
for(TInt j=0; i < countShort; j++)+ −
{+ −
CSimPhBkStore* phBkStore = iPhBkStores->At(j);+ −
if((phBkStore->Name().Compare(phonebookName) == KErrNone))+ −
{+ −
foundShort=ETrue;+ −
break;+ −
}+ −
}+ −
if(foundShort) //warn but not fail!+ −
{+ −
LOGPHONE1("WARNING! PhBkUSimStore and PhBkStore duplicate phonebook configuration");+ −
}+ −
}+ −
for(TInt j=0; j < countStores; j++)+ −
{+ −
CSimPhBkUSimStore* phBkStore = iPhBkUSimStores->At(j);+ −
if((phBkStore->Name().Compare(phonebookName) == KErrNone)&&+ −
(phBkStore->PhBkStore().Compare(phonebookStore) == KErrNone))+ −
{+ −
found=ETrue;+ −
break;+ −
}+ −
}+ −
+ −
if(found) //This store already exists!!!+ −
continue;+ −
+ −
CSimPhBkUSimStore* phBkStore=CSimPhBkUSimStore::NewL(this,phonebookStore,phonebookName,maxNumSlots,telNumMaxLen,alphaTagMaxLen,additional,maxEmail,maxAdditionalTelNumLen,maxAdditionalTextLen);+ −
TCleanupItem newObjClose(CloseObj,phBkStore);+ −
CleanupStack::PushL(newObjClose);+ −
iPhBkUSimStores->AppendL(phBkStore);+ −
CleanupStack::Pop();+ −
}+ −
+ −
+ −
// Populate the Phonebook Stores after construction, so as not to disturb the config file's+ −
// search pointer+ −
for(i=0;i<iPhBkStores->Count();i++)+ −
{+ −
iPhBkStores->At(i)->PopulateStoreFromConfigFileL();+ −
}+ −
for(i=0;i<iPhBkUSimStores->Count();i++)+ −
{+ −
iPhBkUSimStores->At(i)->PopulateStoreFromConfigFileL();+ −
}+ −
LOGPHONE1("Finished parsing PhBkStores config parameters");+ −
}+ −
+ −
void CSimPhone::CreateONStoreL()+ −
{+ −
const CTestConfigItem* item=NULL;+ −
TInt ret=KErrNone;+ −
+ −
LOGPHONE1("Starting to Load and Parse Own Number Config parameters");+ −
+ −
TInt i=0;+ −
item=CfgFile()->Item(KONStore,i);+ −
if(!item)+ −
return;+ −
+ −
TInt maxNumSlots, telNumMaxLen, alphaTagMaxLen;+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,maxNumSlots);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("maxNumSlots",ret,1,&KONStore);+ −
return;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,telNumMaxLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("telNumMaxLen",ret,2,&KONStore);+ −
return;+ −
}+ −
+ −
ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,alphaTagMaxLen);+ −
if(ret!=KErrNone)+ −
{+ −
LOGPARSERR("alphaTagMaxLen",ret,3,&KONStore);+ −
return;+ −
}+ −
+ −
iONStore=CSimONStore::NewL(this,maxNumSlots,telNumMaxLen,alphaTagMaxLen);+ −
+ −
// Populate the Own Number Store + −
iONStore->PopulateStoreFromConfigFileL();+ −
+ −
LOGPHONE1("Finished parsing Own Number Store config parameters");+ −
}+ −
+ −
TInt CSimPhone::ExtFunc(const TTsyReqHandle aReqHandle, const TInt aIpc, const TDataPackage& aPckg)+ −
/**+ −
* ExtFunc is called by the server when it has a "extended", i.e. non-core ETel request+ −
* for the TSY to process.+ −
* A request handle, request type and request data are passed to the TSY.+ −
*/+ −
{+ −
TAny* dataPtr = aPckg.Ptr1();+ −
+ −
TAny* dataPtr2 = aPckg.Ptr2();+ −
+ −
TInt functionValue;+ −
+ −
switch (aIpc)+ −
{+ −
case EMobilePhoneGetMultimodeCaps:+ −
return GetMultimodeCaps(aReqHandle, reinterpret_cast<TUint32*>(dataPtr));+ −
+ −
case EMobilePhoneGetIccAccessCaps:+ −
return GetIccAccessCaps(aReqHandle,+ −
REINTERPRET_CAST(TUint32*,dataPtr));+ −
+ −
case EMobilePhoneGetPhoneStoreInfo:+ −
switch(aPckg.Type())+ −
{+ −
// Switch between the alternative implementations of GetPhoneStoreInfo+ −
case TDataPackage::EPackage1n2u:+ −
return GetPhoneStoreInfo(aReqHandle,+ −
aPckg.Des1n(),aPckg.Des2u());+ −
case TDataPackage::EPackage1n2n:+ −
return GetPhoneStoreInfo(aReqHandle, aPckg.Des2n(),+ −
REINTERPRET_CAST(RMobilePhone::TPhoneStoreNameAndIccType*, dataPtr));+ −
default:+ −
return NULL;+ −
}+ −
+ −
+ −
// return GetPhoneStoreInfo(aReqHandle,aPckg.Des1n(),aPckg.Des2u());+ −
+ −
// Signal Strength+ −
case EMobilePhoneGetSignalCaps:+ −
return iSignalStrength->GetSignalCaps(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetSignalStrength:+ −
return iSignalStrength->GetSignalStrength(aReqHandle,aPckg.Des1n(),aPckg.Des2n());+ −
+ −
case EMobilePhoneNotifySignalStrengthChange:+ −
return iSignalStrength->NotifySignalStrengthChange(aReqHandle,aPckg.Des1n(),aPckg.Des2n());+ −
+ −
// Indicators+ −
case EMobilePhoneGetIndicator:+ −
return iIndicator->GetIndicator(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyIndicatorChange:+ −
return iIndicator->NotifyIndicatorChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetIndicatorCaps:+ −
return iIndicator->GetIndicatorCaps(aReqHandle,aPckg.Des1n(), aPckg.Des2n());+ −
+ −
// Battery Charger+ −
case EMobilePhoneGetBatteryInfo:+ −
return iBatteryCharger->GetBatteryInfo(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyBatteryInfoChange:+ −
return iBatteryCharger->NotifyBatteryInfoChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetBatteryCaps:+ −
return iBatteryCharger->GetBatteryCaps(aReqHandle,aPckg.Des1n());+ −
+ −
// Network Information+ −
case EMobilePhoneGetNetworkCaps:+ −
return iNetworkStatus->GetNetworkCaps(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetCurrentMode:+ −
return GetCurrentMode(aReqHandle,aPckg.Des1n());+ −
+ −
+ −
case EMobilePhoneNotifyModeChange:+ −
return NotifyModeChange(aReqHandle,reinterpret_cast<RMobilePhone::TMobilePhoneNetworkMode*>(dataPtr)); + −
+ −
+ −
case EMobilePhoneGetHomeNetwork:+ −
return iNetworkStatus->GetHomeNetwork(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetCurrentNetwork:+ −
return iNetworkStatus->GetCurrentNetwork(aReqHandle,aPckg.Des1n(),aPckg.Des2n());+ −
+ −
case EMobilePhoneGetCurrentNetworkNoLocation:+ −
return iNetworkStatus->GetCurrentNetworkNoLocation(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyCurrentNetworkChange:+ −
return iNetworkStatus->NotifyCurrentNetworkChange(aReqHandle,aPckg.Des1n(),aPckg.Des2n());+ −
+ −
case EMobilePhoneNotifyCurrentNetworkNoLocationChange:+ −
return iNetworkStatus->NotifyCurrentNetworkNoLocationChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetNetworkRegistrationStatus:+ −
return iNetworkStatus->GetNetworkRegistrationStatus(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyNetworkRegistrationStatusChange:+ −
return iNetworkStatus->NotifyNetworkRegistrationStatusChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetServiceProviderName:+ −
return iNetworkStatus->GetCurrentServiceProvider(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetNetworkName:+ −
return iNetworkStatus->GetCurrentNetworkName(aReqHandle,aPckg.Des1n(), aPckg.Des2n());+ −
+ −
//USIM Release6 Infomration+ −
case EMobilePhoneGetMailboxNumbers:+ −
return iUsimRelease6->GetMailboxNumbers(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyMailboxNumbersChange:+ −
return iUsimRelease6->NotifyMailboxNumbersChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyMessageWaiting:+ −
return iUsimRelease6->NotifyMessageWaiting(aReqHandle,REINTERPRET_CAST(TInt*, dataPtr));+ −
+ −
case EMobilePhoneGetIccMessageWaitingIndicators:+ −
return iUsimRelease6->GetIccMessageWaitingIndicators(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneSetIccMessageWaitingIndicators:+ −
return iUsimRelease6->SetIccMessageWaitingIndicators(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyIccMessageWaitingIndicatorsChange:+ −
return iUsimRelease6->NotifyIccMessageWaitingIndicatorsChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyWlanDataChange:+ −
return iUsimRelease6->NotifyWlanDataChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyPreferredWlanSIDListChange:+ −
return iUsimRelease6->NotifyPreferredWlanSIDListChange(aReqHandle);+ −
+ −
case EMobilePhoneGetWlanData:+ −
return iUsimRelease6->GetWlanData(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneSetWlanData:+ −
return iUsimRelease6->SetWlanData(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneGetPreferredWlanSIDsPhase1:+ −
return iUsimRelease6->GetPreferredWlanSIDsPhase1(aReqHandle, + −
REINTERPRET_CAST(RMobilePhone::TClientId*, dataPtr), + −
REINTERPRET_CAST(TInt*, dataPtr2));+ −
+ −
case EMobilePhoneGetPreferredWlanSIDsPhase2:+ −
return iUsimRelease6->GetPreferredWlanSIDsPhase2(aReqHandle, + −
REINTERPRET_CAST(RMobilePhone::TClientId*, dataPtr), aPckg.Des2n()); + −
+ −
case EMobilePhoneStorePreferredWlanSIDList:+ −
return iUsimRelease6->StorePreferredWlanSIDList(aReqHandle, aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyStorePreferredNetworksListChange:+ −
return iUsimRelease6->NotifyStorePreferredNetworksListChange(aReqHandle);+ −
+ −
case EMobilePhoneGetPreferredNetworksPhase1:+ −
return iUsimRelease6->GetPreferredNetworksPhase1(aReqHandle, + −
REINTERPRET_CAST(RMobilePhone::TClientId*, dataPtr), + −
REINTERPRET_CAST(TInt*, dataPtr2));+ −
+ −
case EMobilePhoneGetPreferredNetworksPhase2:+ −
return iUsimRelease6->GetPreferredNetworksPhase2(aReqHandle, + −
REINTERPRET_CAST(RMobilePhone::TClientId*, dataPtr), aPckg.Des2n()); + −
+ −
case EMobilePhoneStorePreferredNetworksList:+ −
return iUsimRelease6->StorePreferredNetworksList(aReqHandle, aPckg.Des1n());+ −
+ −
case EMobilePhoneSetGbaBootstrapParams:+ −
return iUsimRelease6->SetGbaBootstrapParams(aReqHandle, aPckg.Des1n(),+ −
reinterpret_cast<RMobilePhone::TAID*>(dataPtr2));+ −
+ −
case EMobilePhoneNotifyAuthenticateDataChange:+ −
return iUsimRelease6->NotifyAuthenticateDataChange(aReqHandle, aPckg.Des1n());+ −
+ −
case EMobilePhoneGetAuthenticationParams:+ −
return iUsimRelease6->GetAuthenticationParams(aReqHandle, aPckg.Des1n(),+ −
aPckg.Des2n());+ −
+ −
case EMobilePhoneAuthenticationListPhase1:+ −
return iUsimRelease6->GetAuthenticationListPhase1(aReqHandle,+ −
REINTERPRET_CAST(CRetrieveMobilePhoneAuthenticationIds::TAuthRequestData*, dataPtr),+ −
REINTERPRET_CAST(TInt*, dataPtr2));+ −
+ −
case EMobilePhoneAuthenticationListPhase2:+ −
return iUsimRelease6->GetAuthenticationListPhase2(aReqHandle, + −
REINTERPRET_CAST(RMobilePhone::TClientId*, dataPtr),+ −
aPckg.Des2n());+ −
+ −
// NITZ Network Information+ −
case EMobilePhoneGetNITZInfo:+ −
return iNetworkStatus->GetNITZInfo(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyNITZInfoChange:+ −
return iNetworkStatus->NotifyNITZInfoChange(aReqHandle,aPckg.Des1n());+ −
+ −
// Cell Information+ −
case EMobilePhoneGetCellInfo:+ −
return iNetworkStatus->GetCellInfo(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyCellInfoChange:+ −
return iNetworkStatus->NotifyCellInfoChange(aReqHandle,aPckg.Des1n());+ −
+ −
// Get Subscriber Info+ −
case EMobilePhoneGetSubscriberId:+ −
return GetSubscriberInfo(aReqHandle,aPckg.Des1n());+ −
+ −
// DTMF Tx+ −
case EMobilePhoneGetDTMFCaps:+ −
return iDtmf->GetDtmfCaps(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyDTMFCapsChange:+ −
return iDtmf->NotifyDtmfCapsChange(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneSendDTMFTones:+ −
return iDtmf->SendDTMFTones(aReqHandle,aPckg.Des1u());+ −
+ −
case EMobilePhoneStartDTMFTone:+ −
return iDtmf->StartDTMFTone(aReqHandle,aPckg.Des1n());+ −
+ −
case EMobilePhoneStopDTMFTone:+ −
return iDtmf->StopDTMFTone(aReqHandle);+ −
+ −
case EMobilePhoneNotifyStopInDTMFString:+ −
return iDtmf->NotifyStopInDTMFString(aReqHandle);+ −
+ −
case EMobilePhoneContinueDTMFStringSending:+ −
return iDtmf->ContinueDtmfStringSending(aReqHandle,aPckg.Des1n());+ −
// Phone ID+ −
case EMobilePhoneGetIdentityCaps:+ −
return GetIdentityCaps(aReqHandle,*REINTERPRET_CAST(TUint32*, dataPtr));+ −
+ −
case EMobilePhoneGetPhoneId:+ −
return GetPhoneId(aReqHandle,REINTERPRET_CAST(RMobilePhone::TMobilePhoneIdentityV1*, dataPtr));+ −
+ −
// Security (ICC)+ −
+ −
case EMobilePhoneGetSecurityCaps:+ −
case EMobilePhoneNotifySecurityCapsChange:+ −
case EMobilePhoneGetLockInfo:+ −
case EMobilePhoneNotifyLockInfoChange:+ −
case EMobilePhoneSetLockSetting:+ −
case EMobilePhoneChangeSecurityCode:+ −
case EMobilePhoneNotifySecurityEvent:+ −
case EMobilePhoneVerifySecurityCode:+ −
case EMobilePhoneAbortSecurityCode:+ −
case EMobilePhoneGetSecurityCodeInfo:+ −
case EMobilePhoneNotifySecurityCodeInfoChange:+ −
return iPhoneSecurity->ExtFunc(aReqHandle, aIpc, aPckg);+ −
+ −
//USim Application Support+ −
case EMobilePhoneEnumerateUSimApplications:+ −
case EMobilePhoneSetUSimApplicationStatus:+ −
case EMobilePhoneGetUSimApplicationsInfo:+ −
case EMobilePhoneNotifyUSimApplicationsInfoChange:+ −
if(iPhoneUSimApp->FoundUSimAppTags())+ −
{+ −
return iPhoneUSimApp->ExtFunc(aReqHandle, aIpc, aPckg);+ −
}+ −
else+ −
{+ −
return iPhoneSmartCardApp->ExtFunc(aReqHandle, aIpc, aPckg);+ −
}+ −
+ −
//SmartCard Application Support+ −
case EMobilePhoneEnumerateSmartCardApplications:+ −
case EMobilePhoneGetSmartCardApplicationInfo:+ −
case EMobilePhoneSetSmartCardApplicationStatus:+ −
case EMobilePhoneNotifySmartCardApplicationInfoChange:+ −
case EMobilePhoneGetScFileInfo:+ −
case EMobilePhoneReadScFile:+ −
case EMobilePhoneUpdateScFile:+ −
if(iPhoneSmartCardApp->FoundScAppTags())+ −
{+ −
return iPhoneSmartCardApp->ExtFunc(aReqHandle, aIpc, aPckg);+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle, KErrNotSupported);+ −
return KErrNone;+ −
}+ −
+ −
+ −
//USim/SmartCard Application Supoprt+ −
case EMobilePhoneGetCurrentActiveUSimApplication:+ −
case EMobilePhoneGetUSimAppsSelectionMode:+ −
case EMobilePhoneSetUSimAppsSelectionMode:+ −
case EMobilePhoneNotifyUSimAppsSelectionModeChange:+ −
if(iPhoneUSimApp->FoundUSimAppTags())+ −
{+ −
return iPhoneUSimApp->ExtFunc(aReqHandle, aIpc, aPckg);+ −
}+ −
else+ −
{+ −
return iPhoneSmartCardApp->ExtFunc(aReqHandle, aIpc, aPckg);+ −
} + −
+ −
// CallBarring+ −
case EMobilePhoneSetCallBarringStatus:+ −
case EMobilePhoneSetCallBarringPassword:+ −
case EMobilePhoneNotifyCallBarringStatusChange:+ −
case EMobilePhoneGetBarringStatusPhase1:+ −
case EMobilePhoneGetBarringStatusPhase2:+ −
return iCallBarring->ExtFunc(aReqHandle, aIpc, aPckg);+ −
+ −
// CallForwarding+ −
case EMobilePhoneSetCallForwardingStatus:+ −
case EMobilePhoneNotifyCallForwardingStatusChange:+ −
case EMobilePhoneGetIdentityServiceStatus:+ −
case EMobilePhoneGetCallForwardingStatusPhase1:+ −
case EMobilePhoneGetCallForwardingStatusPhase2:+ −
return iCallForwarding->ExtFunc(aReqHandle, aIpc, aPckg);+ −
+ −
// CallWaiting+ −
case EMobilePhoneSetCallWaitingStatus:+ −
case EMobilePhoneNotifyCallWaitingStatusChange:+ −
case EMobilePhoneGetWaitingStatusPhase1:+ −
case EMobilePhoneGetWaitingStatusPhase2:+ −
{+ −
functionValue = 0;+ −
TRAPD(leaveValue, functionValue = iCallWaiting->ExtFuncL(aReqHandle, aIpc, aPckg));+ −
if (leaveValue != KErrNone)+ −
{+ −
return leaveValue;+ −
}+ −
else+ −
{+ −
return functionValue;+ −
} + −
}+ −
+ −
// IMS Auth+ −
case EMobilePhoneAuthorizationInfoPhase1:+ −
return iPhoneIMSAuth->GetAuthorizationInfoPhase1(aReqHandle,+ −
reinterpret_cast<RMobilePhone::TClientId*>(dataPtr),+ −
reinterpret_cast<TInt*>(dataPtr2));+ −
+ −
case EMobilePhoneAuthorizationInfoPhase2:+ −
return iPhoneIMSAuth->GetAuthorizationInfoPhase2(aReqHandle,+ −
reinterpret_cast<RMobilePhone::TClientId*>(dataPtr), aPckg.Des2n());+ −
+ −
case EMobilePhoneIMSAuthenticate:+ −
return iPhoneIMSAuth->GetAuthenticationData(aReqHandle, aPckg.Des1n());+ −
+ −
case EMobilePhoneNotifyImsAuthorizationInfoChanged:+ −
return iPhoneIMSAuth->NotifyImsAuthorizationInfoChanged(aReqHandle);+ −
+ −
// Generic Smart Card Authentication+ −
case EMobilePhoneSmartCardAuthenticate:+ −
return iPhoneScAuth->GetScAuthenticationData(aReqHandle, aPckg.Des1n(),+ −
reinterpret_cast<RMobilePhone::TAID*>(dataPtr2));+ −
+ −
// Access Point Name (APN)+ −
case EMobilePhoneEnumerateAPNEntries:+ −
{+ −
TUint32* count = static_cast<TUint32*>(dataPtr);+ −
return EnumerateAPNEntries(aReqHandle,count);+ −
}+ −
+ −
case EMobilePhoneGetAPNname:+ −
{+ −
TUint32 index = *static_cast<TUint32*>(dataPtr);+ −
+ −
RMobilePhone::TAPNEntryV3Pckg* entryToReturnPckg = + −
static_cast<RMobilePhone::TAPNEntryV3Pckg*> (aPckg.Des2n());+ −
+ −
return GetAPNname(aReqHandle, index, *entryToReturnPckg);+ −
}+ −
+ −
case EMobilePhoneAppendAPNName:+ −
{+ −
RMobilePhone::TAPNEntryV3 entryToAppend = + −
*static_cast<RMobilePhone::TAPNEntryV3*>(dataPtr);+ −
+ −
RMobilePhone::TAPNEntryV3Pckg entryToAppendPckg(entryToAppend); + −
return AppendAPNName(aReqHandle,entryToAppendPckg);+ −
}+ −
+ −
case EMobilePhoneDeleteAPNName:+ −
{+ −
TUint32 tmp = *static_cast<TUint32*>(dataPtr);+ −
+ −
return DeleteAPNName(aReqHandle,tmp);+ −
}+ −
+ −
case EMobilePhoneNotifyAPNListChanged:+ −
return NotifyAPNListChanged(aReqHandle);+ −
+ −
case EMobilePhoneSetAPNControlListServiceStatus:+ −
return SetAPNControlListServiceStatus(aReqHandle,+ −
*static_cast<RMobilePhone::TAPNControlListServiceStatus*>(dataPtr));+ −
+ −
case EMobilePhoneGetAPNControlListServiceStatus:+ −
return GetAPNControlListServiceStatus(aReqHandle,+ −
*static_cast<RMobilePhone::TAPNControlListServiceStatus*>(dataPtr));+ −
+ −
case EMobilePhoneNotifyAPNControlListServiceStatusChange:+ −
return NotifyAPNControlListServiceStatusChange(aReqHandle,+ −
*static_cast<RMobilePhone::TAPNControlListServiceStatus*>(dataPtr));+ −
+ −
case EMobilePhoneGetServiceTable:+ −
return GetServiceTable(aReqHandle, + −
*static_cast<RMobilePhone::TMobilePhoneServiceTable*>(dataPtr), + −
(aPckg.Des2n())); + −
default:+ −
ReqCompleted(aReqHandle, KErrNotSupported);+ −
return KErrNone; // Real error value returned in completion of clients request+ −
}+ −
+ −
}+ −
+ −
TInt CSimPhone::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)+ −
/**+ −
* Cancel an outstanding request.+ −
* @param aIpc The IPC number of the request that must be cancelled. Note: this is not the+ −
* IPC number of the cancel request itself.+ −
* @param aTsyReqHandle The TSY Request Handle of the request to be cancelled.+ −
*/+ −
{+ −
switch(aIpc)+ −
{+ −
case EMobilePhoneNotifyIndicatorChange:+ −
iIndicator->NotifyIndicatorChangeCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifyBatteryInfoChange:+ −
iBatteryCharger->NotifyBatteryInfoCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifySignalStrengthChange:+ −
iSignalStrength->NotifySignalStrengthChangeCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifyNetworkRegistrationStatusChange:+ −
iNetworkStatus->NotifyNetworkRegistrationStatusChangeCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifyCurrentNetworkChange:+ −
iNetworkStatus->NotifyCurrentNetworkChangeCancel(aTsyReqHandle);+ −
break;+ −
+ −
case EMobilePhoneNotifyCurrentNetworkNoLocationChange:+ −
iNetworkStatus->NotifyCurrentNetworkNoLocationChangeCancel(aTsyReqHandle);+ −
break; + −
+ −
case EMobilePhoneNotifyNITZInfoChange:+ −
iNetworkStatus->NotifyNITZInfoChangeCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifyCellInfoChange:+ −
iNetworkStatus->NotifyCellInfoChangeCancel(aTsyReqHandle);+ −
break;+ −
+ −
case EMobilePhoneNotifyModeChange:+ −
NotifyModeChangeCancel(aTsyReqHandle);+ −
break;+ −
+ −
+ −
// Get Subscriber Info+ −
case EMobilePhoneSendDTMFTones:+ −
iDtmf->SendDTMFTonesCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifyStopInDTMFString:+ −
iDtmf->NotifyStopInDTMFStringCancel();+ −
break;+ −
+ −
case EMobilePhoneNotifyDTMFCapsChange:+ −
iDtmf->NotifyDtmfCapsChangeCancel(aTsyReqHandle);+ −
break;+ −
+ −
case EMobilePhoneNotifySecurityCapsChange:+ −
case EMobilePhoneGetLockInfo:+ −
case EMobilePhoneNotifyLockInfoChange:+ −
case EMobilePhoneSetLockSetting:+ −
case EMobilePhoneChangeSecurityCode:+ −
case EMobilePhoneNotifySecurityEvent:+ −
case EMobilePhoneVerifySecurityCode:+ −
case EMobilePhoneAbortSecurityCode:+ −
case EMobilePhoneGetSecurityCodeInfo:+ −
case EMobilePhoneNotifySecurityCodeInfoChange:+ −
return iPhoneSecurity->CancelService(aIpc,aTsyReqHandle);+ −
+ −
//USim Application Support+ −
case EMobilePhoneEnumerateUSimApplications:+ −
case EMobilePhoneSetUSimApplicationStatus:+ −
case EMobilePhoneGetUSimApplicationsInfo:+ −
case EMobilePhoneNotifyUSimApplicationsInfoChange:+ −
if(iPhoneUSimApp->FoundUSimAppTags())+ −
{+ −
return iPhoneUSimApp->CancelService(aIpc,aTsyReqHandle);+ −
}+ −
else+ −
{+ −
return iPhoneSmartCardApp->CancelService(aIpc,aTsyReqHandle);+ −
}+ −
+ −
//SmartCard Application Support+ −
case EMobilePhoneEnumerateSmartCardApplications:+ −
case EMobilePhoneGetSmartCardApplicationInfo:+ −
case EMobilePhoneSetSmartCardApplicationStatus:+ −
case EMobilePhoneNotifySmartCardApplicationInfoChange:+ −
case EMobilePhoneGetScFileInfo:+ −
case EMobilePhoneReadScFile:+ −
case EMobilePhoneUpdateScFile:+ −
if(iPhoneSmartCardApp->FoundScAppTags())+ −
{+ −
return iPhoneSmartCardApp->CancelService(aIpc,aTsyReqHandle);+ −
}+ −
else+ −
{+ −
return CPhoneBase::CancelService(aIpc,aTsyReqHandle);;+ −
}+ −
+ −
+ −
//USim/SmartCard Application Supoprt+ −
case EMobilePhoneGetCurrentActiveUSimApplication:+ −
case EMobilePhoneGetUSimAppsSelectionMode:+ −
case EMobilePhoneSetUSimAppsSelectionMode:+ −
case EMobilePhoneNotifyUSimAppsSelectionModeChange:+ −
if(iPhoneUSimApp->FoundUSimAppTags())+ −
{+ −
return iPhoneUSimApp->CancelService(aIpc,aTsyReqHandle);+ −
}+ −
else+ −
{+ −
return iPhoneSmartCardApp->CancelService(aIpc,aTsyReqHandle);+ −
}+ −
+ −
+ −
// CallBarring+ −
case EMobilePhoneSetCallBarringStatus:+ −
case EMobilePhoneSetCallBarringPassword:+ −
case EMobilePhoneNotifyCallBarringStatusChange:+ −
case EMobilePhoneGetBarringStatusPhase1:+ −
case EMobilePhoneGetBarringStatusPhase2:+ −
return iCallBarring->CancelService(aIpc, aTsyReqHandle);+ −
+ −
// CallForwarding+ −
case EMobilePhoneSetCallForwardingStatus:+ −
case EMobilePhoneNotifyCallForwardingStatusChange:+ −
case EMobilePhoneGetIdentityServiceStatus:+ −
case EMobilePhoneGetCallForwardingStatusPhase1:+ −
case EMobilePhoneGetCallForwardingStatusPhase2:+ −
return iCallForwarding->CancelService(aIpc, aTsyReqHandle);+ −
+ −
// CallWaiting+ −
case EMobilePhoneSetCallWaitingStatus:+ −
case EMobilePhoneNotifyCallWaitingStatusChange:+ −
case EMobilePhoneGetWaitingStatusPhase1:+ −
case EMobilePhoneGetWaitingStatusPhase2:+ −
return iCallWaiting->CancelService(aIpc, aTsyReqHandle);+ −
+ −
//IMS Auth+ −
case EMobilePhoneNotifyImsAuthorizationInfoChanged:+ −
return iPhoneIMSAuth->NotifyImsAuthorizationInfoChangedCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneAuthorizationInfoPhase1:+ −
case EMobilePhoneAuthorizationInfoPhase2:+ −
return iPhoneIMSAuth->GetAuthorizationInfoCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneIMSAuthenticate:+ −
return iPhoneIMSAuth->GetAuthenticationDataCancel(aTsyReqHandle);+ −
+ −
// Generic Smart Card Authenticate cancel+ −
case EMobilePhoneSmartCardAuthenticate:+ −
return iPhoneScAuth->GetScAuthenticationDataCancel(aTsyReqHandle);+ −
+ −
// Access Point Name (APN)+ −
case EMobilePhoneEnumerateAPNEntries: + −
case EMobilePhoneGetAPNname:+ −
case EMobilePhoneAppendAPNName:+ −
case EMobilePhoneDeleteAPNName:+ −
ReqCompleted(aTsyReqHandle, KErrNone);+ −
return KErrNone; + −
case EMobilePhoneNotifyAPNListChanged:+ −
if (iAPNListNotify.iNotifyPending == TRUE)+ −
{+ −
iAPNListNotify.iNotifyPending = EFalse;+ −
ReqCompleted(iAPNListNotify.iNotifyHandle, KErrCancel);+ −
}+ −
return KErrNone;+ −
case EMobilePhoneSetAPNControlListServiceStatus:+ −
case EMobilePhoneGetAPNControlListServiceStatus:+ −
ReqCompleted(aTsyReqHandle, KErrNone);+ −
return KErrNone;+ −
case EMobilePhoneNotifyAPNControlListServiceStatusChange: + −
if (iAPNStatusNotify.iNotifyPending == TRUE)+ −
{+ −
iAPNStatusNotify.iNotifyPending = EFalse;+ −
ReqCompleted(iAPNStatusNotify.iNotifyHandle, KErrCancel);+ −
}+ −
return KErrNone;+ −
case EMobilePhoneGetServiceTable:+ −
ReqCompleted(aTsyReqHandle, KErrNone);+ −
return KErrNone; + −
+ −
+ −
case EMobilePhoneNotifyMessageWaiting:+ −
return iUsimRelease6->NotifyMessageWaitingCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneNotifyIccMessageWaitingIndicatorsChange:+ −
return iUsimRelease6->NotifyIccMessageWaitingIndicatorsChangeCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneNotifyMailboxNumbersChange:+ −
return iUsimRelease6->NotifyMailboxNumbersChangeCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneNotifyWlanDataChange:+ −
return iUsimRelease6->NotifyWlanDataChangeCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneNotifyPreferredWlanSIDListChange:+ −
return iUsimRelease6->NotifyPreferredWlanSIDListChangeCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneNotifyStorePreferredNetworksListChange:+ −
return iUsimRelease6->NotifyStorePreferredNetworksListChangeCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneGetPreferredNetworksPhase1:+ −
case EMobilePhoneGetPreferredNetworksPhase2:+ −
return iUsimRelease6->GetPreferredNetworksCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneGetPreferredWlanSIDsPhase1:+ −
case EMobilePhoneGetPreferredWlanSIDsPhase2:+ −
return iUsimRelease6->GetPreferredWlanSIDsCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneSetGbaBootstrapParams:+ −
return iUsimRelease6->SetGbaBootstrapParamsCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneNotifyAuthenticateDataChange:+ −
return iUsimRelease6->NotifyAuthenticateDataChangeCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneGetAuthenticationParams:+ −
return iUsimRelease6->GetAuthenticationParamsCancel(aTsyReqHandle);+ −
+ −
case EMobilePhoneAuthenticationListPhase1:+ −
case EMobilePhoneAuthenticationListPhase2:+ −
return iUsimRelease6->GetAuthenticationListCancel(aTsyReqHandle);+ −
+ −
// Default+ −
default:+ −
return CPhoneBase::CancelService(aIpc,aTsyReqHandle);+ −
}+ −
return KErrNone;+ −
}+ −
+ −
CTelObject* CSimPhone::OpenNewObjectByNameL(const TDesC& aName)+ −
/**+ −
* This function will open a new LINE by name.+ −
* In reality the lines should be pre-constructed in the phone's two phase constructor,+ −
* so this will just return a pointer to the relevant line.+ −
*+ −
* @param aName the name of the line object to be opened+ −
* @return CTelObject pointer to the phone object created+ −
* @leave Leaves if incorrect phone name+ −
*/+ −
{+ −
LOGPHONE1(">>CSimPhone::OpenNewObjectByNameL");+ −
+ −
// Is it a voice line?+ −
if (aName.CompareF(KVoiceLineName) == 0)+ −
{+ −
__ASSERT_ALWAYS(iVoiceLine!=NULL,SimPanic(ELineNotPreInstantiated));+ −
// Base class open.+ −
(void)iVoiceLine->Open();+ −
return iVoiceLine;+ −
}+ −
+ −
// Is it a data line?+ −
else if (aName.CompareF(KDataLineName) == 0)+ −
{+ −
__ASSERT_ALWAYS(iDataLine!=NULL,SimPanic(ESubsessionNotPreInstantiated));+ −
// Base class open.+ −
(void)iDataLine->Open();+ −
return iDataLine;+ −
}+ −
+ −
// Is it an SMS messaging class?+ −
else if (aName.CompareF(KETelSmsMessaging) == 0)+ −
{+ −
__ASSERT_ALWAYS(iSmsMessaging!=NULL,SimPanic(ESubsessionNotPreInstantiated));+ −
// Base class open.+ −
(void)iSmsMessaging->Open();+ −
return iSmsMessaging;+ −
}+ −
+ −
else if (aName.CompareF(KPacketName) == 0)+ −
{+ −
__ASSERT_ALWAYS(iPacketService!=NULL,SimPanic(ESubsessionNotPreInstantiated));+ −
// Base class open.+ −
(void)iPacketService->Open();+ −
return iPacketService;+ −
}+ −
else if (aName.CompareF(KSatName) == 0)+ −
{+ −
__ASSERT_ALWAYS(iSat!=NULL,SimPanic(ESubsessionNotPreInstantiated));+ −
// Base class open.+ −
(void)iSat->Open();+ −
return iSat;+ −
}+ −
else if (aName.Left(SCEAP_SSN_LENGTH).Compare(KETelSmartCardEapSession) == 0)+ −
{+ −
// "num" is used for both lengths and error codes! saves on stack! :)+ −
+ −
// Extracting AID+ −
RMobilePhone::TAID tempAID;+ −
// get number of AID bytes (each byte uses two chars)+ −
TInt num = CharToSeptNumL(aName[SCEAP_SSN_LENGTH]) * 2;+ −
// get the segment containing the AID+ −
TPtrC ptrAid = aName.Mid(SCEAP_SSN_LENGTH + 1, num);+ −
// convert AID to its correct binary value+ −
ConvertTextToBinary(ptrAid, tempAID);+ −
+ −
// Extracting EapType+ −
RMobileSmartCardEap::TEapType eapType;+ −
// get position of EAP type's length+ −
TInt posTypeLength = SCEAP_SSN_LENGTH + num + 1;+ −
// get the value of the length of EAP type+ −
num = CharToSeptNumL(aName[posTypeLength]);+ −
// get the segment containing the EAP type+ −
TPtrC ptrEapT = aName.Mid(posTypeLength + 1, num);+ −
eapType.Copy(ptrEapT);+ −
+ −
CTelObject* phoneScEap = iPhoneScEapMan->CreateScEapSubSessionL(tempAID, eapType);+ −
+ −
if (phoneScEap == NULL)+ −
{+ −
LOGPHONE1("ERROR CSimSmartCardEap object not created, returning KErrGeneral");+ −
User::Leave(KErrGeneral);+ −
}+ −
+ −
LOGPHONE2("CSimPhone::OpenNewObjectByNameL CSimSmartCardEap object created [0x%08x]", phoneScEap);+ −
return phoneScEap;+ −
} // End of opening Smart Card EAP sub-session+ −
else if (aName.CompareF(KETelOwnNumberStore) == 0)+ −
{+ −
if(iONStore==NULL)+ −
{+ −
LOGPHONE1("ERROR CSimONStore object not found. Please check config file.");+ −
User::Leave(KErrNotFound);+ −
}+ −
else+ −
{+ −
(void)iONStore->Open();+ −
return iONStore;+ −
}+ −
}+ −
// Is it a phonebook store?+ −
else+ −
{+ −
TInt i = 0;+ −
TBuf8<KMaxName> name;+ −
TInt tLength;+ −
TPtrC remain(aName);+ −
name.Copy(aName); // Do simple 16 bit to 8 bit conversion+ −
+ −
if ((tLength=remain.Find(PHBOOK_DELIMITER))==KErrNotFound)+ −
{+ −
for(i=0;i<iPhBkStores->Count();i++)+ −
{+ −
if(name.MatchF(iPhBkStores->At(i)->Name())==0)+ −
{+ −
// Base class open.+ −
(void)iPhBkStores->At(i)->Open();+ −
return iPhBkStores->At(i);+ −
}+ −
}+ −
for(i=0;i<iPhBkUSimStores->Count();i++)+ −
{+ −
if((name.MatchF(iPhBkUSimStores->At(i)->Name())==0) &&+ −
(iPhBkUSimStores->At(i)->PhBkStore().Compare(KGsmPhoneBook)==0))+ −
+ −
{+ −
(void)iPhBkUSimStores->At(i)->Open();+ −
return iPhBkUSimStores->At(i);+ −
}+ −
+ −
}+ −
}+ −
else+ −
{+ −
TBuf8<KMaxName> PhBkName;+ −
TBuf8<KMaxName> PhBkStore;+ −
PhBkName.Copy(aName.Left(tLength));+ −
PhBkStore.Copy(aName.Right(aName.Length()-tLength-2));+ −
+ −
for(TInt i=0;i<iPhBkUSimStores->Count();i++)+ −
{+ −
if((PhBkName.MatchF(iPhBkUSimStores->At(i)->Name())==0) &&+ −
(PhBkStore.MatchF(iPhBkUSimStores->At(i)->PhBkStore())==0))+ −
+ −
{+ −
(void)iPhBkUSimStores->At(i)->Open();+ −
return iPhBkUSimStores->At(i);+ −
}+ −
+ −
}+ −
}+ −
}+ −
// Not matched...+ −
User::Leave(KErrNotFound);+ −
return NULL;+ −
}+ −
+ −
+ −
CTelObject* CSimPhone::OpenNewObjectL(TDes& /*aNewName*/)+ −
/**+ −
* This function would open a new unnamed object,+ −
* but this functionality is not supported at the phone level.+ −
* All lines must be opened by name.+ −
*+ −
* @param aNewName a reference to the name of the phone object created+ −
* @return CTelObject a pointer to the phone object created+ −
* @leave Leaves if no memory is available+ −
*/+ −
{+ −
User::Leave(KErrNotSupported);+ −
return NULL;+ −
}+ −
+ −
CTelObject::TReqMode CSimPhone::ReqModeL(const TInt aIpc)+ −
/**+ −
* This function returns the Request Mode for the request with the passed IPC value.+ −
* The ETel Server provides a function for returning the standard request modes for+ −
* the Core API requests.+ −
*/+ −
{+ −
TReqMode reqMode=0;+ −
switch(aIpc)+ −
{+ −
case EMobilePhoneGetPhoneStoreInfo:+ −
case EMobilePhoneGetSignalCaps:+ −
case EMobilePhoneGetSignalStrength:+ −
case EMobilePhoneGetNetworkCaps:+ −
case EMobilePhoneGetCurrentMode:+ −
+ −
case EMobilePhoneNotifyModeChange:+ −
+ −
case EMobilePhoneGetHomeNetwork:+ −
case EMobilePhoneGetCurrentNetwork:+ −
case EMobilePhoneGetCurrentNetworkNoLocation:+ −
case EMobilePhoneGetNetworkRegistrationStatus:+ −
case EMobilePhoneGetNITZInfo:+ −
case EMobilePhoneGetCellInfo:+ −
case EMobilePhoneGetSubscriberId:+ −
case EMobilePhoneGetDTMFCaps:+ −
case EMobilePhoneSendDTMFTones:+ −
case EMobilePhoneStartDTMFTone:+ −
case EMobilePhoneStopDTMFTone:+ −
case EMobilePhoneContinueDTMFStringSending:+ −
case EMobilePhoneGetMultimodeCaps:+ −
case EMobilePhoneGetIndicator:+ −
case EMobilePhoneGetIndicatorCaps:+ −
case EMobilePhoneGetBatteryInfo:+ −
case EMobilePhoneGetBatteryCaps:+ −
case EMobilePhoneGetIccAccessCaps:+ −
case EMobilePhoneGetSecurityCaps:+ −
case EMobilePhoneGetLockInfo:+ −
case EMobilePhoneSetLockSetting:+ −
case EMobilePhoneGetSecurityCodeInfo:+ −
case EMobilePhoneChangeSecurityCode:+ −
case EMobilePhoneVerifySecurityCode:+ −
case EMobilePhoneAbortSecurityCode:+ −
case EMobilePhoneEnumerateUSimApplications:+ −
case EMobilePhoneGetCurrentActiveUSimApplication:+ −
case EMobilePhoneSetUSimApplicationStatus:+ −
case EMobilePhoneGetUSimApplicationsInfo:+ −
case EMobilePhoneGetUSimAppsSelectionMode:+ −
case EMobilePhoneSetUSimAppsSelectionMode:+ −
case EMobilePhoneEnumerateSmartCardApplications:+ −
case EMobilePhoneGetSmartCardApplicationInfo:+ −
case EMobilePhoneSetSmartCardApplicationStatus:+ −
case EMobilePhoneGetScFileInfo:+ −
case EMobilePhoneReadScFile:+ −
case EMobilePhoneUpdateScFile:+ −
case EMobilePhoneSetCallBarringStatus:+ −
case EMobilePhoneSetCallBarringPassword:+ −
case EMobilePhoneGetBarringStatusPhase1:+ −
case EMobilePhoneGetBarringStatusPhase2:+ −
case EMobilePhoneSetCallForwardingStatus:+ −
case EMobilePhoneGetIdentityServiceStatus:+ −
case EMobilePhoneGetCallForwardingStatusPhase1:+ −
case EMobilePhoneGetCallForwardingStatusPhase2:+ −
case EMobilePhoneGetIdentityCaps:+ −
case EMobilePhoneGetPhoneId:+ −
case EMobilePhoneGetServiceProviderName:+ −
case EMobilePhoneGetNetworkName:+ −
case EMobilePhoneSetCallWaitingStatus:+ −
case EMobilePhoneGetWaitingStatusPhase1:+ −
case EMobilePhoneGetWaitingStatusPhase2:+ −
case EMobilePhoneAuthorizationInfoPhase1:+ −
case EMobilePhoneAuthorizationInfoPhase2:+ −
case EMobilePhoneIMSAuthenticate:+ −
case EMobilePhoneSmartCardAuthenticate:+ −
case EMobilePhoneGetMailboxNumbers:+ −
case EMobilePhoneGetIccMessageWaitingIndicators:+ −
case EMobilePhoneSetIccMessageWaitingIndicators:+ −
case EMobilePhoneGetWlanData:+ −
case EMobilePhoneSetWlanData:+ −
case EMobilePhoneGetPreferredWlanSIDsPhase1:+ −
case EMobilePhoneGetPreferredWlanSIDsPhase2:+ −
case EMobilePhoneStorePreferredWlanSIDList: + −
case EMobilePhoneGetPreferredNetworksPhase1:+ −
case EMobilePhoneGetPreferredNetworksPhase2:+ −
case EMobilePhoneStorePreferredNetworksList:+ −
case EMobilePhoneSetGbaBootstrapParams:+ −
case EMobilePhoneGetAuthenticationParams:+ −
case EMobilePhoneNotifyAuthenticateDataChange:+ −
case EMobilePhoneAuthenticationListPhase1:+ −
case EMobilePhoneAuthenticationListPhase2:+ −
break;+ −
+ −
// Service Tables+ −
case EMobilePhoneEnumerateAPNEntries:+ −
case EMobilePhoneGetAPNname:+ −
case EMobilePhoneAppendAPNName:+ −
case EMobilePhoneDeleteAPNName:+ −
case EMobilePhoneNotifyAPNListChanged:+ −
case EMobilePhoneSetAPNControlListServiceStatus:+ −
case EMobilePhoneGetAPNControlListServiceStatus:+ −
case EMobilePhoneNotifyAPNControlListServiceStatusChange:+ −
case EMobilePhoneGetServiceTable:+ −
break;+ −
+ −
case EMobilePhoneNotifyIndicatorChange:+ −
case EMobilePhoneNotifyBatteryInfoChange:+ −
case EMobilePhoneNotifySignalStrengthChange:+ −
case EMobilePhoneNotifyNetworkRegistrationStatusChange:+ −
case EMobilePhoneNotifyCurrentNetworkChange:+ −
case EMobilePhoneNotifyCurrentNetworkNoLocationChange:+ −
case EMobilePhoneNotifyNITZInfoChange:+ −
case EMobilePhoneNotifyCellInfoChange:+ −
case EMobilePhoneNotifyDTMFCapsChange:+ −
case EMobilePhoneNotifyStopInDTMFString:+ −
case EMobilePhoneNotifySecurityEvent:+ −
case EMobilePhoneNotifySecurityCapsChange:+ −
case EMobilePhoneNotifyUSimApplicationsInfoChange:+ −
case EMobilePhoneNotifySmartCardApplicationInfoChange:+ −
case EMobilePhoneNotifyUSimAppsSelectionModeChange:+ −
case EMobilePhoneNotifyCallBarringStatusChange:+ −
case EMobilePhoneNotifyCallWaitingStatusChange:+ −
case EMobilePhoneNotifyCallForwardingStatusChange:+ −
case EMobilePhoneNotifyImsAuthorizationInfoChanged:+ −
case EMobilePhoneNotifyMailboxNumbersChange:+ −
case EMobilePhoneNotifyIccMessageWaitingIndicatorsChange:+ −
case EMobilePhoneNotifyMessageWaiting:+ −
case EMobilePhoneNotifyWlanDataChange:+ −
case EMobilePhoneNotifyPreferredWlanSIDListChange:+ −
case EMobilePhoneNotifyStorePreferredNetworksListChange:+ −
reqMode=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;+ −
break;+ −
case EMobilePhoneNotifyLockInfoChange:+ −
case EMobilePhoneNotifySecurityCodeInfoChange:+ −
reqMode=KReqModeMultipleCompletionEnabled;+ −
break;+ −
default:+ −
reqMode=CPhoneBase::ReqModeL(aIpc);+ −
break;+ −
}+ −
return reqMode;+ −
}+ −
+ −
TInt CSimPhone::RegisterNotification(const TInt /*aIpc*/)+ −
/**+ −
* The ETel Server calls this function when the first client makes a notification request.+ −
* If supported by the underlying protocol controlling the signalling stack,+ −
* this can be used to start requesting updates for the relevant service.+ −
* This function does nothing in this TSY.+ −
*+ −
* @param aIpc The Ipc representing the client notification request+ −
* @return KErrNone+ −
*/+ −
{+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::DeregisterNotification(const TInt /*aIpc*/)+ −
/**+ −
* The ETel Server calls this function when the last client that had previously+ −
* made a notification request closes its ETel Server handle. If supported by+ −
* the underlying protocol controlling the signalling stack, this can be used+ −
* to stop requesting updates for the relevant service.+ −
*+ −
* @param aIpc The Ipc representing the client notification request+ −
* @return KErrNone+ −
*/+ −
{+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::NumberOfSlotsL(const TInt aIpc)+ −
{+ −
switch(aIpc)+ −
{+ −
case EMobilePhoneNotifyIndicatorChange:+ −
case EMobilePhoneNotifyBatteryInfoChange:+ −
case EMobilePhoneNotifySignalStrengthChange:+ −
case EMobilePhoneNotifyCurrentNetworkChange:+ −
case EMobilePhoneNotifyCurrentNetworkNoLocationChange:+ −
case EMobilePhoneNotifyNetworkRegistrationStatusChange:+ −
case EMobilePhoneNotifyNITZInfoChange:+ −
case EMobilePhoneNotifyCellInfoChange:+ −
case EMobilePhoneNotifyStopInDTMFString:+ −
case EMobilePhoneNotifySecurityEvent:+ −
case EMobilePhoneNotifyUSimApplicationsInfoChange:+ −
case EMobilePhoneNotifySmartCardApplicationInfoChange:+ −
case EMobilePhoneNotifyUSimAppsSelectionModeChange:+ −
case EMobilePhoneNotifySecurityCapsChange:+ −
case EMobilePhoneNotifyCallBarringStatusChange:+ −
case EMobilePhoneNotifyCallForwardingStatusChange:+ −
case EMobilePhoneNotifyCallWaitingStatusChange:+ −
case EMobilePhoneNotifyImsAuthorizationInfoChanged:+ −
case EMobilePhoneNotifyMailboxNumbersChange:+ −
case EMobilePhoneNotifyIccMessageWaitingIndicatorsChange:+ −
case EMobilePhoneNotifyMessageWaiting:+ −
case EMobilePhoneNotifyWlanDataChange:+ −
case EMobilePhoneNotifyPreferredWlanSIDListChange:+ −
case EMobilePhoneNotifyStorePreferredNetworksListChange:+ −
return KDefaultNumberOfSlots;+ −
default:+ −
break;+ −
}+ −
return CPhoneBase::NumberOfSlotsL(aIpc);+ −
}+ −
+ −
void CSimPhone::Init()+ −
/**+ −
* This function can be used to perform any necessary synchronous initialisation.+ −
*/+ −
{+ −
}+ −
+ −
TInt CSimPhone::ControlledInitialisation(const TTsyReqHandle aTsyReqHandle)+ −
/**+ −
* This function can be used to start any necessary asynchronous initialisation.+ −
* In this TSY, there are no asynchronous initialisation procedures, so its empty.+ −
*/+ −
{+ −
iSimPhoneInitialise->Start(aTsyReqHandle);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::ControlledInitialisationCancel(const TTsyReqHandle /*aTsyReqHandle*/)+ −
/**+ −
* Request to cancel the ::ControlledInitialisation function.+ −
* Since this TSY has no asynchronous initialisation procedures,+ −
* this function should never be called.+ −
*/+ −
{+ −
iSimPhoneInitialise->Cancel();+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::NotifyCapsChange(const TTsyReqHandle aTsyReqHandle, RPhone::TCaps* /*aCaps*/)+ −
/**+ −
* The phone caps will not change dynamically in this TSY as it is hardcoded,+ −
* so there is no chance of completing this request.+ −
*+ −
* @param aTsyReqHandle+ −
* @param aCaps a pointer to the phone capability+ −
* @return KErrNone+ −
*/+ −
{+ −
ReqCompleted(aTsyReqHandle, KErrNotSupported);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::NotifyCapsChangeCancel(const TTsyReqHandle /*aTsyReqHandle*/)+ −
/**+ −
* Cancel the NotifyCapsChange request.+ −
*+ −
* @param aTsyReqHandle+ −
* @return KErrNone+ −
*/+ −
{+ −
return KErrNone;+ −
}+ −
+ −
+ −
+ −
TInt CSimPhone::NotifyModemDetected(const TTsyReqHandle aTsyReqHandle, RPhone::TModemDetection* /*aDetection*/)+ −
/**+ −
* This request will be completed when the phone's connection status changes.+ −
* This function is not supported in this version of the TSY+ −
*/+ −
{+ −
ReqCompleted(aTsyReqHandle,KErrNotSupported);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::NotifyModemDetectedCancel(const TTsyReqHandle /*aTsyReqHandle*/)+ −
/**+ −
* Cancel outstanding modem detection notification, by TSY handle+ −
* Returns KErrNone+ −
*/+ −
{+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetInfo(const TTsyReqHandle aTsyReqHandle, RPhone::TPhoneInfo* aPhoneInfo)+ −
/**+ −
* Retrieve the Phone Information+ −
* It should always return TModemDetection::EDetectedPresent+ −
*+ −
* @param aTsyReqHandle+ −
* @param aPhoneInfo pointer to the phone information to be returned to client+ −
* @return KErrNone+ −
*/+ −
{+ −
aPhoneInfo->iDetection=iModemDetection;+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
void CSimPhone::UpdateNetworkMode(RMobilePhone::TMobilePhoneNetworkMode aNetworkMode)+ −
{+ −
iNtwkMode = aNetworkMode;+ −
}+ −
+ −
RMobilePhone::TMobilePhoneNetworkMode CSimPhone::NetworkMode()+ −
{+ −
return iNtwkMode;+ −
}+ −
+ −
TInt CSimPhone::GetCurrentMode(TTsyReqHandle aReqHandle,TDes8* aPckg1)+ −
/**+ −
* Retrieve the Current Mode.+ −
* @param aReqHandle The request handle associated with this request.+ −
* @param aPckg1 The first parameter package. This will be populated with the+ −
* mode setting to be returned.+ −
* @return TInt Standard error value.+ −
*/+ −
{+ −
TPckg<RMobilePhone::TMobilePhoneNetworkMode>* modePckg=(TPckg<RMobilePhone::TMobilePhoneNetworkMode>*)aPckg1;+ −
RMobilePhone::TMobilePhoneNetworkMode& mode=(*modePckg)();+ −
+ −
mode=iNtwkMode;+ −
ReqCompleted(aReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetCaps(const TTsyReqHandle aTsyReqHandle, RPhone::TCaps* aCaps)+ −
/**+ −
* Retrieve the phone capabilities+ −
*+ −
* @param aTsyReqHandle+ −
* @param aCaps a pointer to the Phone capability+ −
* @return KErrNone+ −
*/+ −
{+ −
aCaps->iFlags= RPhone::KCapsVoice | RPhone::KCapsData;+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetStatus(const TTsyReqHandle aTsyReqHandle, RPhone::TStatus* aStatus)+ −
/**+ −
* Retrieve the phone status.+ −
*+ −
* @param aTsyReqHandle+ −
* @param aStatus pointer to the phone status info.+ −
* @return KErrNone+ −
*/+ −
{+ −
aStatus->iModemDetected=iModemDetection;+ −
aStatus->iMode=iMode;+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::EnumerateLines(const TTsyReqHandle aTsyReqHandle, TInt* aParams)+ −
/**+ −
* Enumerate the lines+ −
* Returns 2 (for the voice and data lines) in the integer reference passed in+ −
* through its function argument.+ −
*+ −
* @param aTsyReqHandle+ −
* @param aParams pointer to the number of lines supported+ −
* @return KErrNone+ −
*/+ −
{+ −
*aParams = KNumberOfLines;+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetLineInfo(const TTsyReqHandle aTsyReqHandle, TLineInfoIndex* aParams)+ −
/**+ −
* Gets the line info on the particular CSimLine object required.+ −
* Returns the current hook status, the current line status, name of last call created on+ −
* that line and the name of the call to which a new incoming call will be directed.+ −
* TLineInfoIndex specifies which lines' info is requested.+ −
*+ −
* @param aTsyReqHandle+ −
* @param aParam pointer to the line info+ −
* @return KErrNone+ −
*/+ −
{+ −
if (aParams->iIndex==KVoiceLineIndex)+ −
{+ −
aParams->iInfo.iStatus = (RCall::TStatus)iVoiceLine->iState;+ −
aParams->iInfo.iName = iVoiceLine->iLineName;+ −
aParams->iInfo.iLineCapsFlags = (RLine::KCapsVoice|RLine::KCapsEventIncomingCall);+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
}+ −
else if (aParams->iIndex==KDataLineIndex)+ −
{+ −
aParams->iInfo.iStatus = (RCall::TStatus)iDataLine->iState;+ −
aParams->iInfo.iName = iDataLine->iLineName;+ −
aParams->iInfo.iLineCapsFlags = (RLine::KCapsData|RLine::KCapsEventIncomingCall);+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
}+ −
else+ −
{+ −
ReqCompleted(aTsyReqHandle,KErrNotFound);+ −
}+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetPhoneStoreInfo(TTsyReqHandle aReqHandle,TDes8* aPckg1,TDes16* aPckg2)+ −
/**+ −
* Retrieve information about a named Phonebook Store.+ −
* @param aReqHandle The TSY request handle associated with this request.+ −
* @param aPckg1 The parameter package containing the index of the SMS Store for which+ −
* information is going to be retrieved.+ −
* @param aPckg2 The parameter package in which the retrieved SMS Store information will+ −
* be passed back to the client.+ −
* @return TInt Standard error value.+ −
*/+ −
{+ −
TPckg<RMobilePhoneStore::TMobilePhoneStoreInfoV1>* infoPckg=(TPckg<RMobilePhoneStore::TMobilePhoneStoreInfoV1>*)aPckg1;+ −
RMobilePhoneStore::TMobilePhoneStoreInfoV1& info=(*infoPckg)();+ −
+ −
// Check that the data structure is supported by the simulated TSY version+ −
TInt err = CheckSimTsyVersion(info);+ −
if(err != KErrNone)+ −
{+ −
ReqCompleted(aReqHandle, err);+ −
return KErrNone;+ −
}+ −
+ −
TInt i;+ −
for(i=0;i<iPhBkStores->Count();i++)+ −
{+ −
TBuf8<KMaxName> nBuf;+ −
nBuf.Copy(*aPckg2);+ −
if(iPhBkStores->At(i)->Name().MatchF(nBuf)==0)+ −
break;+ −
}+ −
+ −
if(i==iPhBkStores->Count())+ −
{+ −
ReqCompleted(aReqHandle,KErrNotFound);+ −
return KErrNone;+ −
}+ −
+ −
iPhBkStores->At(i)->PopulatePhBkStoreInfo(&info);+ −
ReqCompleted(aReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetPhoneStoreInfo(TTsyReqHandle aReqHandle,TDes8* aPckg1,+ −
RMobilePhone::TPhoneStoreNameAndIccType* aTable)+ −
/**+ −
* Retrieve information about a named Phonebook Store.+ −
* @param aReqHandle The TSY request handle associated with this request.+ −
* @param aPckg1 The parameter package containing the index of the PhoneBook Store for which+ −
* information is going to be retrieved.+ −
* @param aTable The parameter package in which the retrieved PhoneBook Store name and type information will+ −
* be passed from the client.+ −
* @return TInt Standard error value.+ −
*/+ −
{+ −
TBool found = EFalse;+ −
TPckg<RMobilePhoneStore::TMobilePhoneStoreInfoV1>* infoPckg=(TPckg<RMobilePhoneStore::TMobilePhoneStoreInfoV1>*)aPckg1;+ −
RMobilePhoneStore::TMobilePhoneStoreInfoV1& info=(*infoPckg)();+ −
+ −
// Check that the data structure is supported by the simulated TSY version+ −
TInt err = CheckSimTsyVersion(info);+ −
if(err != KErrNone)+ −
{+ −
ReqCompleted(aReqHandle, err);+ −
return KErrNone;+ −
}+ −
+ −
TBuf8<KMaxName> n1Buf,n2Buf;+ −
+ −
n1Buf.Copy(aTable->iStoreName);+ −
n2Buf.Copy(aTable->iMode);+ −
+ −
TInt i;+ −
+ −
for(i=0;i<iPhBkUSimStores->Count();i++)+ −
{+ −
if((iPhBkUSimStores->At(i)->Name().MatchF(n1Buf)==0) &&+ −
(iPhBkUSimStores->At(i)->PhBkStore().MatchF(n2Buf)==0))+ −
{+ −
found = ETrue;+ −
break;+ −
}+ −
}+ −
+ −
if(!found)+ −
{+ −
for(i=0;i<iPhBkStores->Count();i++)+ −
{+ −
if((iPhBkStores->At(i)->Name().MatchF(n1Buf)==0) &&+ −
n2Buf != KUSimPhoneBook)+ −
{+ −
found = ETrue;+ −
break;+ −
}+ −
}+ −
if(!found)+ −
{+ −
ReqCompleted(aReqHandle,KErrNotFound);+ −
return KErrNone;+ −
}+ −
else+ −
{+ −
iPhBkStores->At(i)->PopulatePhBkStoreInfo(&info);+ −
ReqCompleted(aReqHandle,KErrNone);+ −
}+ −
}+ −
else+ −
{+ −
if(iPhBkUSimStores->At(i)->CheckAndSwitchUSimApps()!=KErrNone)+ −
{+ −
ReqCompleted(aReqHandle, KErrNotFound);+ −
return KErrNone;+ −
}+ −
+ −
iPhBkUSimStores->At(i)->PopulatePhBkStoreInfo(&info);+ −
ReqCompleted(aReqHandle,KErrNone);+ −
}+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetMultimodeCaps(const TTsyReqHandle aTsyReqHandle,TUint32* aCaps)+ −
/**+ −
* Retrieve the multimode capabilities of this TSY. This is hardcoded to support GSM, GPRS and CDMA.+ −
* @param aTsyReqHandle TSY Request Handle associated with this request.+ −
* @param aCaps The multimode capability structure to be populated with the result.+ −
* @return TInt Standard error value.+ −
*/+ −
{+ −
*aCaps = RMobilePhone::KCapsGsmSupported |+ −
RMobilePhone::KCapsGprsSupported |+ −
RMobilePhone::KCapsEapSupported | + −
RMobilePhone::KCapsWcdmaSupported;+ −
+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetIccAccessCaps(const TTsyReqHandle aTsyReqHandle,TUint32* aCaps)+ −
/**+ −
* Retrieve the access capabilities of this ICC using SimTSY. This is hardcoded to support SIM, RUIM and USIM.+ −
* @param aTsyReqHandle TSY Request Handle associated with this request.+ −
* @param aCaps The multimode capability structure to be populated with the result.+ −
* @return TInt Standard error value.+ −
*/+ −
{+ −
*aCaps = RMobilePhone::KCapsSimAccessSupported | RMobilePhone::KCapsRUimAccessSupported | RMobilePhone::KCapsUSimAccessSupported;+ −
ReqCompleted(aTsyReqHandle,KErrNone);+ −
+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetSubscriberInfo(TTsyReqHandle aReqHandle,TDes8* aPckg1)+ −
/**+ −
* Retrieve the Subscriber Identifier.+ −
* @param aReqHandle The TSY request handle associated with this request.+ −
* @param aPckg1 The first parameter package. This will be populated with the+ −
* subscriber information.+ −
* @return TInt Standard error value.+ −
*/+ −
{+ −
TPckg<RMobilePhone::TMobilePhoneSubscriberId>* subscribePckg=(TPckg<RMobilePhone::TMobilePhoneSubscriberId>*)aPckg1;+ −
RMobilePhone::TMobilePhoneSubscriberId& subscribe=(*subscribePckg)();+ −
TInt ret = KErrNone;+ −
if (iSubscriberId.iError == KErrNone)+ −
{+ −
if(iSubscriberId.iIMSI.Length()>RMobilePhone::KIMSISize)+ −
{+ −
subscribe.Copy(iSubscriberId.iIMSI.Left(RMobilePhone::KIMSISize));+ −
}+ −
else+ −
{+ −
subscribe.Copy(iSubscriberId.iIMSI);+ −
}+ −
}+ −
else+ −
{+ −
ret = iSubscriberId.iError;+ −
}+ −
ReqCompleted(aReqHandle,ret);+ −
return KErrNone;+ −
}+ −
+ −
const CTestConfigSection* CSimPhone::CfgFile()+ −
/**+ −
* Return a pointer to the Configuration File Section+ −
*+ −
* @return CTestConfigSection pointer to the configuration file section+ −
*/+ −
{+ −
return iConfigSection;+ −
}+ −
+ −
const CTestConfigSection* CSimPhone::DefaultCfgFile()+ −
/**+ −
* Return a pointer to the Default Configuration File Section+ −
*+ −
* @return CTestConfigSection pointer to the default configuration file section+ −
*/+ −
{+ −
if( iConfigFile == NULL )+ −
{+ −
return NULL;+ −
}+ −
return iConfigFile->Section(KScriptDefaults);+ −
}+ −
+ −
TInt CSimPhone::ValidateChangeState(CSimLine* aOriginatingLine, RMobileCall::TMobileCallStatus aState)+ −
/**+ −
* This function validates the proposed state change by using the iActiveLine+ −
* pointer member variable. If the proposed change of state would clash with+ −
* an existing call, the change is errored.+ −
* The function also updates the iMode state to reflect the new call state.+ −
*+ −
* @param aOriginatingLine pointer to the line requesting for the change of state+ −
* @param aState the state the aOriginatingLine wants to change to+ −
* @return Error indicates whether the change of state is successful or not+ −
*/+ −
{+ −
__ASSERT_ALWAYS(iMode!=RPhone::EModeUnknown,SimPanic(EPhoneModeUnknownIllegal));+ −
__ASSERT_ALWAYS(iNtwkMode!=RMobilePhone::ENetworkModeUnknown,SimPanic(ENetworkModeUnknownIllegal));+ −
+ −
// If there is no active line defined, then any state changes are fine. However,+ −
// we need to watch for a shift to an "active" status.+ −
LOGPHONE1(">>CSimPhone::ValidateChangeState");+ −
if(!iActiveLine)+ −
{+ −
iMode=ConvertStateToMode(aState);+ −
if(IsStateActive(aState))+ −
iActiveLine=aOriginatingLine;+ −
// If a call is in progress, we may need to trigger NotifyIndicatorChange+ −
CheckIndicatorNotification();+ −
return KErrNone;+ −
}+ −
+ −
// If this state change request is coming from the active line then any state changes+ −
// are ok, but we must watch for a change that would "deactivate" the line.+ −
if(iActiveLine==aOriginatingLine)+ −
{+ −
iMode=ConvertStateToMode(aState);+ −
if(!IsStateActive(aState))+ −
iActiveLine=NULL;+ −
// If a call is in progress, we may need to trigger NotifyIndicatorChange+ −
CheckIndicatorNotification();+ −
return KErrNone;+ −
}+ −
+ −
// If we have got this far, then there is an active line, but this state change+ −
// request has not come from it. If this is the case, then a change to ringing+ −
// or Idle are the only valid state changes.+ −
+ −
if((aState==RMobileCall::EStatusRinging) ||+ −
(aState==RMobileCall::EStatusIdle))+ −
return KErrNone;+ −
+ −
LOGPHONE1("<<CSimPhone::ValidateChangeState");+ −
return KErrGeneral;+ −
}+ −
+ −
TInt CSimPhone::FindActiveVoiceCall(CSimVoiceCall*& aCall)+ −
/**+ −
* Find an active voice call. Return KErrNotFound if no voice calls active.+ −
* @param aCall Pointer to active voice call.+ −
* @return TInt Standard return error.+ −
*/+ −
{+ −
return iVoiceLine->FindActiveVoiceCall(aCall);+ −
}+ −
+ −
TInt CSimPhone::ValidateChangeState(RPacketService::TStatus aState)+ −
/**+ −
* This function validates the proposed state change by using the iActiveLine+ −
* pointer member variable. If the proposed change of state would clash with+ −
* an existing call, the change is errored.+ −
* The function also updates the iMode state to reflect the new call state.+ −
*+ −
* @param aOriginatingLine pointer to the line requesting for the change of state+ −
* @param aState the state the aOriginatingLine wants to change to+ −
* @return Error indicates whether the change of state is successful or not+ −
*/+ −
{+ −
LOGPHONE1(">>CSimPhone::ValidateChangeState packet");+ −
__ASSERT_ALWAYS(iMode!=RPhone::EModeUnknown,SimPanic(EPhoneModeUnknownIllegal));+ −
__ASSERT_ALWAYS(iNtwkMode!=RMobilePhone::ENetworkModeUnknown,SimPanic(ENetworkModeUnknownIllegal));+ −
__ASSERT_ALWAYS(iPacketService->MSClass()!=RPacketService::EMSClassUnknown,SimPanic(EPacketMSClassUnKnown));+ −
+ −
//we must know the type of class the phone supports in order to determine what action to take.+ −
switch(iPacketService->MSClass())+ −
{+ −
case RPacketService::EMSClassDualMode: //< Active Simultaneous PS & CS calls supported (ClassA)+ −
return KErrNone;+ −
case RPacketService::EMSClassSuspensionRequired: //< Active CS & Suspended PS simultaneous calls supported (ClassB)+ −
if(iMode == RPhone::EModeIdle)+ −
return KErrNone;+ −
else if((aState == RPacketService::EStatusUnattached) || (aState == RPacketService::EStatusSuspended))+ −
return KErrNone;+ −
else return KErrNotSupported; //Should actually force a suspend of the packet context and service+ −
case RPacketService::EMSClassAlternateMode: //< Active CS or Active PS only call supported (ClassC)+ −
if(iMode == RPhone::EModeIdle)+ −
return KErrNone;+ −
else if(aState == RPacketService::EStatusUnattached)+ −
return KErrNone;+ −
else return KErrNotSupported;+ −
case RPacketService::EMSClassCircuitSwitchedOnly: //< Active CS only call supported (ClassC)+ −
return KErrNotSupported; //Should actually force a detach from the network if not in unattached state already+ −
case RPacketService::EMSClassPacketSwitchedOnly: //< Active PS only call supported (ClassC)+ −
return KErrNone; //Should disconnect all active calls if mode is not Idle.+ −
default:+ −
return KErrNotSupported;+ −
}+ −
}+ −
+ −
RMobilePhone::TMobilePhoneBatteryStatus CSimPhone::BatteryStatus()+ −
{+ −
return iBatteryCharger->Status();+ −
}+ −
+ −
RMobilePhone::TMobilePhoneRegistrationStatus CSimPhone::RegistrationStatus()+ −
{+ −
return iNetworkStatus->RegistrationStatus();+ −
}+ −
+ −
void CSimPhone::CheckIndicatorNotification()+ −
{+ −
iIndicator->CheckNotification();+ −
}+ −
+ −
/**+ −
* A utility function for checking whether the first pin on the phone + −
* requires authentication + −
*+ −
* @return TBool true if required and false if not + −
*/+ −
TBool CSimPhone::IsICCLocked()+ −
{+ −
return iPhoneSecurity->IsICCLocked();+ −
}+ −
+ −
/**+ −
* A utility function for checking whether the second pin on the phone + −
* requires authentication + −
*+ −
* @return TBool true if required and false if not + −
*/+ −
TBool CSimPhone::IsPIN2Locked()+ −
{+ −
return iPhoneSecurity->IsPIN2Locked();+ −
}+ −
+ −
TBool CSimPhone::IsHiddenEnabled()+ −
{+ −
return iPhoneSecurity->IsHiddenEnabled();+ −
}+ −
+ −
void CSimPhone::SecurityEvent(RMobilePhone::TMobilePhoneSecurityEvent aEvent)+ −
{+ −
iPhoneSecurity->SecurityEvent(aEvent);+ −
}+ −
+ −
RMobilePhone::TAID CSimPhone::GetActiveUSim()+ −
{+ −
if(iPhoneUSimApp->FoundUSimAppTags())+ −
{+ −
return iPhoneUSimApp->GetActiveUSim();+ −
}+ −
else+ −
{+ −
return iPhoneSmartCardApp->GetActiveUSim();+ −
}+ −
+ −
}+ −
+ −
RMobilePhone::TMobilePhoneSubscriberId CSimPhone::GetImsi()+ −
{+ −
return iSubscriberId.iIMSI;+ −
}+ −
void CSimPhone::GetPhoneIdAndCaps()+ −
{+ −
TPtrC8 imei, model, manufacturer, revision;+ −
const CTestConfigItem* item=CfgFile()->Item(KPhoneId);+ −
if (item)+ −
{+ −
TInt ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,manufacturer);+ −
if(ret!=KErrNone)+ −
LOGPARSERR("manufacturer",ret,0,&KPhoneId);+ −
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,1,model);+ −
if(ret!=KErrNone)+ −
LOGPARSERR("model",ret,1,&KPhoneId);+ −
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,2,revision);+ −
if(ret!=KErrNone)+ −
LOGPARSERR("revision",ret,2,&KPhoneId);+ −
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,3,imei);+ −
if(ret!=KErrNone)+ −
LOGPARSERR("imei",ret,3,&KPhoneId);+ −
ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,4,iPhoneId.iError);+ −
+ −
iPhoneId.iManufacturerId.Copy(manufacturer);+ −
iPhoneId.iModelId.Copy(model);+ −
iPhoneId.iRevisionId.Copy(revision);+ −
iPhoneId.iSerialId.Copy(imei);+ −
}+ −
else+ −
{+ −
//set to default+ −
iPhoneId.iManufacturerId.Copy(KPhoneManufacturerDefault);+ −
iPhoneId.iModelId.Copy(KPhoneModelDefault);+ −
iPhoneId.iRevisionId.Copy(KPhoneRevesionDefault);+ −
iPhoneId.iSerialId.Copy(KPhoneSerialNumberDefault);+ −
iPhoneId.iError = KErrNone;+ −
}+ −
+ −
//Set Phone Identity Caps+ −
iPhoneIdCaps = 0;+ −
if(iPhoneId.iManufacturerId.Length() > 0)+ −
iPhoneIdCaps |= RMobilePhone::KCapsGetManufacturer;+ −
+ −
if(iPhoneId.iModelId.Length() > 0)+ −
iPhoneIdCaps |= RMobilePhone::KCapsGetModel;+ −
+ −
if(iPhoneId.iRevisionId.Length() > 0)+ −
iPhoneIdCaps |= RMobilePhone::KCapsGetRevision;+ −
+ −
if(iPhoneId.iSerialId.Length() > 0)+ −
iPhoneIdCaps |= RMobilePhone:: KCapsGetSerialNumber;+ −
+ −
if(iSubscriberId.iIMSI.Length() > 0)+ −
iPhoneIdCaps |= RMobilePhone::KCapsGetSubscriberId;+ −
}+ −
+ −
TInt CSimPhone::GetIdentityCaps(TTsyReqHandle aReqHandle, TUint32& aCaps)+ −
{+ −
aCaps = iPhoneIdCaps;+ −
ReqCompleted(aReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
/**+ −
* A utility function for checking whether a service is active in the service table+ −
*+ −
* @param aTable pointer to the table to be tested for active service+ −
* @param aOffset to pointer in the service table+ −
* @param aModifier which service to be tested for in the table+ −
* @return TBool true if active and false if not enabled+ −
*/ + −
TBool CSimPhone::ServiceEnabled(RMobilePhone::TMobilePhoneServiceTableV1* aTable, + −
TInt aOffset, + −
TUint8 aModifier)+ −
{+ −
if (aTable)+ −
{+ −
TUint8* pService = &(aTable->iServices1To8);+ −
TUint8 service = *(pService+aOffset); + −
if (service & aModifier)+ −
{+ −
return true;+ −
}+ −
}+ −
return false;+ −
}+ −
+ −
/**+ −
* An IPC support function for counting the number of entries in the Acces Point Name (APN) List+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aIndex a pointer to some memory for storing the number of entries+ −
* @return TInt always returns KErrNone+ −
*/+ −
TInt CSimPhone::EnumerateAPNEntries(TTsyReqHandle aReqHandle, TUint32* aIndex)+ −
{+ −
if (IsICCLocked())+ −
{+ −
SYMBIAN_REQEXTERR(aReqHandle, KErrGsm0707SimPin1Required, KErrAccessDenied);+ −
return KErrNone;+ −
}+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
if (ServiceEnabled(iUSIMEnabledServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
*aIndex = iAPNList.Count();+ −
ReqCompleted(aReqHandle,KErrNone);+ −
}+ −
else+ −
{+ −
SYMBIAN_REQEXTERR(aReqHandle,KErrMMEtelAPNEnabledServicesTableNotFound,KErrNotFound);+ −
} + −
}+ −
else+ −
{+ −
SYMBIAN_REQEXTERR(aReqHandle,KErrMMEtelAPNNameACLNotFound,KErrNotSupported);+ −
}+ −
+ −
return KErrNone;+ −
}+ −
+ −
/**+ −
* An IPC support function for retrieving a name in the Acces Point Name (APN) List+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aIndex a index into the APN List for the name to be retrieved+ −
* @param aRetrieved a TAPNEntryV3Pckg to store the name from the APN List+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::GetAPNname( TTsyReqHandle aReqHandle, + −
TUint32& aIndex, + −
RMobilePhone::TAPNEntryV3Pckg& aRetrieved)+ −
{+ −
if (IsICCLocked())+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrGsm0707SimPin1Required, KErrAccessDenied)); + −
return KErrNone;+ −
}+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
if (ServiceEnabled(iUSIMEnabledServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{ + −
if (aIndex < iAPNList.Count() )+ −
{+ −
RMobilePhone::TAPNEntryV3& tAPNEntryV3 = aRetrieved();+ −
+ −
tAPNEntryV3.iApn.Zero();+ −
tAPNEntryV3.iApn.Insert(0,iAPNList[aIndex].iApn);+ −
+ −
ReqCompleted(aReqHandle,KErrNone);+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR(KErrMMEtelAPNNameInvalidIndex,KErrNotFound));+ −
}+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotFound));+ −
} + −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNNameACLNotFound,+ −
KErrNotSupported));+ −
}+ −
return KErrNone; + −
}+ −
+ −
/**+ −
* An IPC support function for adding a name to the Acces Point Name (APN) List+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aIndex a index into the APN List for the name to be retrieved+ −
* @param aEntry a TAPNEntryV3Pckg to add to the end of the APN List+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::AppendAPNName(TTsyReqHandle aReqHandle, RMobilePhone::TAPNEntryV3Pckg& aEntry)+ −
{+ −
if (IsPIN2Locked())+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrGsm0707SimPin2Required, KErrAccessDenied)); + −
return KErrNone;+ −
}+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
if (ServiceEnabled(iUSIMEnabledServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{ + −
RMobilePhone::TAPNEntryV3& entry = (aEntry)();+ −
iAPNList.Append(entry);+ −
+ −
ReqCompleted(aReqHandle,KErrNone);+ −
+ −
if (iAPNListNotify.iNotifyPending == TRUE)+ −
{+ −
iAPNListNotify.iNotifyPending = EFalse;+ −
ReqCompleted(iAPNListNotify.iNotifyHandle,KErrNone);+ −
}+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotFound));+ −
} + −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNNameACLNotFound,+ −
KErrNotSupported));+ −
}+ −
+ −
return KErrNone;+ −
} + −
+ −
/**+ −
* An IPC support function for removing a name from the Acces Point Name (APN) List+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aIndex a index into the APN List for the name to be deleted+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::DeleteAPNName(TTsyReqHandle aReqHandle, TUint32& aIndex)+ −
{+ −
if (IsPIN2Locked())+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrGsm0707SimPin2Required, KErrAccessDenied)); + −
return KErrNone;+ −
}+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
if (ServiceEnabled(iUSIMEnabledServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{ + −
if (aIndex < iAPNList.Count())+ −
{+ −
iAPNList.Remove(aIndex);+ −
iAPNList.Compress();+ −
ReqCompleted(aReqHandle,KErrNone);+ −
if (iAPNListNotify.iNotifyPending == TRUE)+ −
{+ −
iAPNListNotify.iNotifyPending = EFalse;+ −
ReqCompleted(iAPNListNotify.iNotifyHandle,KErrNone);+ −
}+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR(KErrMMEtelAPNNameInvalidIndex,KErrNotFound)); + −
}+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotFound));+ −
} + −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNNameACLNotFound,+ −
KErrNotSupported));+ −
}+ −
return KErrNone;+ −
}+ −
+ −
/**+ −
* An IPC support function for registering interest in APN List changes+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::NotifyAPNListChanged(TTsyReqHandle aReqHandle)+ −
{+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
if (ServiceEnabled(iUSIMEnabledServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
iAPNListNotify.iNotifyPending = ETrue;+ −
iAPNListNotify.iNotifyHandle = aReqHandle;+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotFound));+ −
} + −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNNameACLNotFound,+ −
KErrNotSupported));+ −
}+ −
return KErrNone; + −
}+ −
+ −
/**+ −
* An IPC support function for switching the Acces Point Name (APN) List to enabled or disabled+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aAPNControlListServiceStatus service status to be set+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::SetAPNControlListServiceStatus(TTsyReqHandle aReqHandle, + −
RMobilePhone::TAPNControlListServiceStatus& aAPNControlListServiceStatus) + −
{+ −
if (IsPIN2Locked())+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrGsm0707SimPin2Required, KErrAccessDenied)); + −
return KErrNone;+ −
}+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
switch (aAPNControlListServiceStatus)+ −
{+ −
case RMobilePhone::EAPNControlListServiceDisabled:+ −
{+ −
if (iUSIMEnabledServiceTable)+ −
{+ −
iUSIMEnabledServiceTable->iServices33To40 = + −
(iUSIMEnabledServiceTable->iServices33To40 & RMobilePhone::KUstACL) + −
^ iUSIMEnabledServiceTable->iServices33To40;+ −
+ −
ReqCompleted(aReqHandle,KErrNone);+ −
if (iAPNStatusNotify.iNotifyPending == TRUE)+ −
{+ −
*static_cast<RMobilePhone::TAPNControlListServiceStatus*>(iAPNStatusNotify.iNotifyData) = + −
RMobilePhone::EAPNControlListServiceDisabled;+ −
iAPNStatusNotify.iNotifyPending = EFalse;+ −
ReqCompleted(iAPNStatusNotify.iNotifyHandle,KErrNone);+ −
} + −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotSupported)); + −
}+ −
}+ −
break; + −
case RMobilePhone::EAPNControlListServiceEnabled:+ −
{+ −
if (iUSIMEnabledServiceTable)+ −
{+ −
iUSIMEnabledServiceTable->iServices33To40 |= RMobilePhone::KUstACL;+ −
ReqCompleted(aReqHandle,KErrNone);+ −
if (iAPNStatusNotify.iNotifyPending == TRUE)+ −
{+ −
*static_cast<RMobilePhone::TAPNControlListServiceStatus*>(iAPNStatusNotify.iNotifyData) = + −
RMobilePhone::EAPNControlListServiceEnabled; + −
iAPNStatusNotify.iNotifyPending = EFalse;+ −
ReqCompleted(iAPNStatusNotify.iNotifyHandle,KErrNone);+ −
}+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotSupported)); + −
} + −
}+ −
break; + −
default:+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelFormatNotSupported,+ −
KErrNotFound)); + −
}+ −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotSupported)); + −
}+ −
return KErrNone; + −
}+ −
+ −
/**+ −
* An IPC support function for retrieving the Acces Point Name (APN) List enabled/ disabled+ −
* status+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aAPNControlListServiceStatus memory for storing the current status for the user+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::GetAPNControlListServiceStatus(TTsyReqHandle aReqHandle, + −
RMobilePhone::TAPNControlListServiceStatus& aAPNControlListServiceStatus)+ −
{+ −
if (IsICCLocked())+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrGsm0707SimPin1Required, KErrAccessDenied)); + −
return KErrNone;+ −
}+ −
+ −
if (ServiceEnabled(iUSIMServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
if (ServiceEnabled(iUSIMEnabledServiceTable,iAPNServiceOffset,RMobilePhone::KUstACL))+ −
{+ −
aAPNControlListServiceStatus = RMobilePhone::EAPNControlListServiceEnabled;+ −
}+ −
else+ −
{+ −
aAPNControlListServiceStatus = RMobilePhone::EAPNControlListServiceDisabled;+ −
} + −
ReqCompleted(aReqHandle,KErrNone); + −
}+ −
else+ −
{+ −
ReqCompleted(aReqHandle,SYMBIAN_EXTERR( KErrMMEtelAPNEnabledServicesTableNotFound,+ −
KErrNotSupported)); + −
}+ −
return KErrNone; + −
}+ −
+ −
/**+ −
* An IPC support function for registering interest in the Acces Point Name (APN) List + −
* enabled/ disabled status changing+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aAPNControlListServiceStatus memory for storing the current status for the user+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::NotifyAPNControlListServiceStatusChange(TTsyReqHandle aReqHandle, + −
RMobilePhone::TAPNControlListServiceStatus& aAPNControlListServiceStatus)+ −
{+ −
iAPNStatusNotify.iNotifyPending = ETrue;+ −
iAPNStatusNotify.iNotifyHandle = aReqHandle;+ −
iAPNStatusNotify.iNotifyData = &aAPNControlListServiceStatus;+ −
return KErrNone; + −
}+ −
+ −
/**+ −
* A utility function for checking table availabilty and performing a copy on it+ −
*+ −
* @param aFrom The TMobilePhoneServiceTableV1 table to copied out of+ −
* @param aTo The TMobilePhoneServiceTableV1 table to copied into+ −
* @return TInt returns KErrNone for success and KErrNotSupported if the table aren't + −
* valid+ −
*/ + −
TInt CSimPhone::CopyServiceTable(RMobilePhone::TMobilePhoneServiceTableV1* aFrom, + −
RMobilePhone::TMobilePhoneServiceTableV1* aTo)+ −
{+ −
if (aFrom && aTo)+ −
{+ −
*aTo = *aFrom;+ −
return KErrNone;+ −
}+ −
else + −
{+ −
// This value is returned because this function tests the existance of the table + −
// not just that the args are OK.+ −
return SYMBIAN_EXTERR(KErrMMEtelAPNEnabledServicesTableNotFound, KErrNotSupported);+ −
}+ −
}+ −
+ −
/**+ −
* A utility function for checking table availabilty and performing a copy on it+ −
*+ −
* @param aFrom The TMobilePhoneServiceTableV8 table to copied out of+ −
* @param aTo The TMobilePhoneServiceTableV8 table to copied into+ −
* @return TInt returns KErrNone for success and KErrNotSupported if the table aren't + −
* valid+ −
*/ + −
TInt CSimPhone::CopyServiceTableV8(RMobilePhone::TMobilePhoneServiceTableV8* aFrom, + −
RMobilePhone::TMobilePhoneServiceTableV8* aTo)+ −
{+ −
if (aFrom && aTo)+ −
{+ −
*aTo = *aFrom;+ −
return KErrNone;+ −
}+ −
else + −
{+ −
// This value is returned because this function tests the existance of the table + −
// not just that the args are OK.+ −
return SYMBIAN_EXTERR(KErrMMEtelAPNEnabledServicesTableNotFound, KErrNotSupported);+ −
}+ −
}+ −
+ −
/**+ −
* An IPC support function for retrieving one of the service tables+ −
*+ −
* @param aReqHandle handle to the IPC call used for completing the round trip+ −
* @param aTable the type of table the user has interest in+ −
* @param aPCmd memory to store the retrieved table+ −
* @return TInt always returns KErrNone+ −
*/ + −
TInt CSimPhone::GetServiceTable(TTsyReqHandle aReqHandle, + −
RMobilePhone::TMobilePhoneServiceTable aTable, + −
TDes8* aPCmd) + −
{+ −
TInt ret = KErrNone;+ −
RMobilePhone::TMobilePhoneServiceTableV1Pckg *pTablePckg = (RMobilePhone::TMobilePhoneServiceTableV1Pckg*) aPCmd;+ −
RMobilePhone::TMobilePhoneServiceTableV1 &aSst = (*pTablePckg)();+ −
+ −
switch (aTable)+ −
{+ −
+ −
/** Retrieve SIM service table from active SIM application on UICC.+ −
Modes: GSM/WCDMA */+ −
case RMobilePhone::ESIMServiceTable:+ −
ret = CopyServiceTable (iSIMServiceTable, &aSst);+ −
break;+ −
/** Retrieve USIM service table from active USIM application on UICC.+ −
+ −
Modes: WCDMA */+ −
case RMobilePhone::EUSIMServiceTable:+ −
if ( aSst.ExtensionId ()== KEtelExtMultimodeV8)+ −
{+ −
RMobilePhone::TMobilePhoneServiceTableV8Pckg* pTableV8Pckg = (RMobilePhone::TMobilePhoneServiceTableV8Pckg*) aPCmd;+ −
RMobilePhone::TMobilePhoneServiceTableV8 &pTableV8 = (*pTableV8Pckg) ();+ −
ret = CopyServiceTableV8 (iUSIMServiceTableV8, &pTableV8);+ −
}+ −
else+ −
{+ −
ret = CopyServiceTable (iUSIMServiceTable, &aSst);+ −
}+ −
break;+ −
/** USIM Enabled Services Table to be used in conjunction with the USIM Service Table.+ −
+ −
Modes: WCDMA */+ −
case RMobilePhone::EUSIMEnabledServiceTable:+ −
ret = CopyServiceTable (iUSIMEnabledServiceTable, &aSst);+ −
break;+ −
default:+ −
ReqCompleted (aReqHandle, SYMBIAN_EXTERR( KErrMMEtelFormatNotSupported,+ −
KErrArgument));+ −
return KErrNone;+ −
}+ −
// Extended error codes are handled here by the CopyServiceTable() func.+ −
ReqCompleted(aReqHandle,ret);+ −
return KErrNone;+ −
}+ −
+ −
TInt CSimPhone::GetPhoneId(TTsyReqHandle aReqHandle,RMobilePhone::TMobilePhoneIdentityV1* aPhoneId)+ −
{+ −
+ −
//complete with error if error specified.+ −
if(iPhoneId.iError != KErrNone)+ −
{+ −
ReqCompleted(aReqHandle,iPhoneId.iError);+ −
return KErrNone;+ −
}+ −
//fill out phone identity.+ −
if(iPhoneIdCaps & RMobilePhone:: KCapsGetManufacturer)+ −
{+ −
if(iPhoneId.iManufacturerId.Length() > RMobilePhone::KPhoneManufacturerIdSize)+ −
aPhoneId->iManufacturer.Copy(iPhoneId.iManufacturerId.Left(RMobilePhone::KPhoneManufacturerIdSize));+ −
else+ −
aPhoneId->iManufacturer.Copy(iPhoneId.iManufacturerId);+ −
}+ −
+ −
if(iPhoneIdCaps & RMobilePhone::KCapsGetModel)+ −
{+ −
if(iPhoneId.iModelId.Length() > RMobilePhone::KPhoneModelIdSize)+ −
aPhoneId->iModel.Copy(iPhoneId.iModelId.Left(RMobilePhone::KPhoneModelIdSize));+ −
else+ −
aPhoneId->iModel.Copy(iPhoneId.iModelId);+ −
}+ −
+ −
if(iPhoneIdCaps & RMobilePhone::KCapsGetRevision)+ −
{+ −
if(iPhoneId.iRevisionId.Length() > RMobilePhone::KPhoneRevisionIdSize)+ −
aPhoneId->iRevision.Copy(iPhoneId.iRevisionId.Left(RMobilePhone::KPhoneRevisionIdSize));+ −
else+ −
aPhoneId->iRevision.Copy(iPhoneId.iRevisionId);+ −
}+ −
+ −
if(iPhoneIdCaps & RMobilePhone::KCapsGetSerialNumber)+ −
{+ −
if(iPhoneId.iSerialId.Length() > RMobilePhone::KPhoneSerialNumberSize)+ −
aPhoneId->iSerialNumber.Copy(iPhoneId.iSerialId.Left(RMobilePhone::KPhoneSerialNumberSize));+ −
else+ −
aPhoneId->iSerialNumber.Copy(iPhoneId.iSerialId);+ −
}+ −
+ −
ReqCompleted(aReqHandle,KErrNone);+ −
return KErrNone;+ −
}+ −
+ −
/**+ −
* Callback function invoked by the observer object when test number property is changed.+ −
* This function is supposed to reset SIMTSY. Currently only SMS messaging part of SIMTSY+ −
* is re-started with the new test number.+ −
*/+ −
void CSimPhone::HandleTestNumberChangedL()+ −
{+ −
SetTestNumberAndReadConfigurationFileL();+ −
iSmsMessaging->ReloadConfigurationSettingsL();+ −
}+ −
+ −
TInt CSimPhone::CheckConfigFile()+ −
{+ −
TInt testNumber;+ −
User::LeaveIfError(GetTestNumber(testNumber));+ −
iSectionName.Format(KSectionNameFormat,testNumber);+ −
+ −
CTestConfig* configFile = NULL; + −
+ −
TRAPD(err, configFile = CTestConfig::NewLC(iFs, KConfigFileDir, KConfigFilename); CleanupStack::Pop(configFile));+ −
if( err != KErrNone || configFile->Section(iSectionName) != NULL )+ −
{+ −
err = KErrNone;+ −
}+ −
else+ −
{+ −
err = KErrNotFound;+ −
}+ −
delete configFile;+ −
return err;+ −
}+ −
/**+ −
Constructor for suspend call processing timer+ −
*/+ −
CSimPhone::CSetCallProcessingSuspendStateTimerCallBack::CSetCallProcessingSuspendStateTimerCallBack()+ −
{}+ −
+ −
/**+ −
Must be called before setting the timer. Simply stores the request to be completed when+ −
timer expires+ −
+ −
@param the pointer to the phone that the request will be completed on when the timer expires+ −
@param aReqHandle handle to request that will be completed when the timer expires+ −
*/+ −
void CSimPhone::CSetCallProcessingSuspendStateTimerCallBack::SetHandle(CSimPhone* aPhone, const TTsyReqHandle aHandle)+ −
{+ −
iPhone = aPhone;+ −
iHandle = aHandle;+ −
}+ −
+ −
/**+ −
Implementation of MTimerCallback::TimerCallBack+ −
Simply completes the suspend call processing request after the delay+ −
*/+ −
void CSimPhone::CSetCallProcessingSuspendStateTimerCallBack::TimerCallBack(TInt /*aId*/)+ −
{+ −
iPhone->ReqCompleted(iHandle,KErrNone);+ −
}+ −
+ −
/**+ −
Constructor for network mode processing timer+ −
*/+ −
CSimPhone::CNetworkModeTimerCallBack::CNetworkModeTimerCallBack()+ −
{+ −
}+ −
+ −
void CSimPhone::CNetworkModeTimerCallBack::SetHandle(CSimPhone* aPhone)+ −
{+ −
iPhone = aPhone;+ −
}+ −
/**+ −
Implementation of MTimerCallback::TimerCallBack+ −
Simply completes the suspend call processing request after the delay+ −
*/+ −
void CSimPhone::CNetworkModeTimerCallBack::TimerCallBack(TInt /*aId*/)+ −
{+ −
LOGPACKET1(">>CSimPhone::CNetworkModeTimerCallBack::TimerCallBack");+ −
iPhone->TimerCallBackNetworkMode();+ −
}+ −
+ −
TInt CSimPhone::NotifyModeChange(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TMobilePhoneNetworkMode* aCaps)+ −
{+ −
LOGPACKET1("CSimPhone::NotifyModeChange called");+ −
__ASSERT_ALWAYS(!iNotifyNetworkModeChange.iNotifyPending,SimPanic(ENotificationAlreadyPending));+ −
+ −
if (iNetworkModeArray->Count() == 0)+ −
{+ −
ReqCompleted(aTsyReqHandle,KErrNotSupported);+ −
return KErrNone;+ −
}+ −
+ −
iNotifyNetworkModeChange.iNotifyPending = ETrue;+ −
iNotifyNetworkModeChange.iNotifyHandle = aTsyReqHandle;+ −
iNotifyNetworkModeChange.iNotifyData = aCaps;+ −
return KErrNone;+ −
}+ −
+ −
/**+ −
* Cancels a clients interest in the change of dynamic caps.+ −
*+ −
* @param aTsyReqHandle Tsy Request handle for the client cancel request+ −
* @return KErrNone+ −
*/+ −
TInt CSimPhone::NotifyModeChangeCancel(const TTsyReqHandle aTsyReqHandle)+ −
{+ −
LOGPACKET1("CSimPhone::NotifyModeChangeCancel called");+ −
if( (iNotifyNetworkModeChange.iNotifyPending) && (aTsyReqHandle == iNotifyNetworkModeChange.iNotifyHandle))+ −
{+ −
iNotifyNetworkModeChange.iNotifyPending=EFalse;+ −
ReqCompleted(aTsyReqHandle,KErrCancel);+ −
}+ −
return KErrNone;+ −
}+ −
+ −
/**+ −
* Timer callback function to simulate a change in the Network Mode of the phone+ −
*/+ −
void CSimPhone::TimerCallBackNetworkMode()+ −
{+ −
if (++iNetworkModeIndex >= iNetworkModeArray->Count())+ −
{+ −
return;+ −
}+ −
iNtwkMode = iNetworkModeArray->At(iNetworkModeIndex).iNetworkMode;+ −
if (iNotifyNetworkModeChange.iNotifyPending)+ −
{+ −
iNotifyNetworkModeChange.iNotifyPending = EFalse;+ −
*(RMobilePhone::TMobilePhoneNetworkMode*)iNotifyNetworkModeChange.iNotifyData = (RMobilePhone::TMobilePhoneNetworkMode)iNtwkMode;+ −
ReqCompleted(iNotifyNetworkModeChange.iNotifyHandle,KErrNone);+ −
}+ −
+ −
iNetworkModeTimer->Start(iNetworkModeArray->At(iNetworkModeIndex).iDuration, &iTimerCallBackNetworkMode);+ −
}+ −
+ −
TInt CSimPhone::CheckSimTsyVersion(RMobilePhone::TMultimodeType& aDataStruct) // overload this for other types of structures+ −
/**+ −
* Checks the version of a data structure against the (simulated) version of SIMTSY, in order+ −
* to determine if the version of the API used is compatible with the version of the TSY used.+ −
*+ −
* @param aDataStruct A versioned data-holding structure, derived from RMobilePhone::TMultimodeType+ −
*+ −
* @return KErrNone if the version of aDataStruct is supported by the user-defined simulated TSY version. KErrNotSupported otherwise+ −
*/+ −
{+ −
TInt ret = KErrNone;+ −
+ −
//retrieval of data version+ −
TInt dataVersion;+ −
switch (aDataStruct.ExtensionId())+ −
{+ −
case KETelExtMultimodeV1:+ −
case RMobilePhoneStore::KETelMobilePhonebookStoreV1:+ −
case RMobileSmsMessaging::KETelMobileSmsSendAttributesV1:+ −
case KETelExt3rdPartyV1:+ −
dataVersion = 1;+ −
break;+ −
case KETelExtMultimodeV2:+ −
//case KETelMobilePhonebookStoreV2: - omitted because it is equal to KETelExtMultimodeV2+ −
dataVersion = 2;+ −
break;+ −
case KETelExtMultimodeV3:+ −
dataVersion = 3;+ −
break;+ −
case KETelExtMultimodeV4:+ −
dataVersion = 4;+ −
break;+ −
case KEtelExtMultimodeV5:+ −
//case KETelMobilePhonebookStoreV5: - omitted because it is equal to KETelExtMultimodeV5+ −
dataVersion = 5;+ −
break;+ −
case KEtelExtMultimodeV6:+ −
dataVersion = 6;+ −
break;+ −
case KEtelExtMultimodeV7:+ −
dataVersion = 7;+ −
break;+ −
case KEtelExtMultimodeV8:+ −
dataVersion = 8;+ −
break;+ −
case KEtelExtMultimodeV9:+ −
dataVersion = 9;+ −
break;+ −
default:+ −
dataVersion = KSimTsyDefaultVersion; + −
break;+ −
}+ −
+ −
if(iSimTsyVersion < dataVersion)+ −
{+ −
ret = KErrNotSupported;+ −
}+ −
+ −
return ret; + −
}+ −
+ −
TInt CSimPhone::CheckSimTsyVersion(TPacketBase& aDataStruct)+ −
/**+ −
* Checks the version of a data structure against the (simulated) version of SIMTSY, in order+ −
* to determine if the version of the API used is compatible with the version of the TSY used.+ −
*+ −
* @param aDataStruct A versioned data-holding structure, derived from TPacketBase+ −
*+ −
* @return KErrNone if the version of aDataStruct is supported by the user-defined simulated TSY version. KErrNotSupported otherwise+ −
*/+ −
{+ −
TInt ret = KErrNone;+ −
+ −
//retrieval of data version+ −
TInt dataVersion;+ −
switch (aDataStruct.ExtensionId())+ −
{+ −
case KETelExtPcktV1:+ −
dataVersion = 1;+ −
break;+ −
case KETelExtPcktV2:+ −
dataVersion = 2;+ −
break;+ −
case KETelExtPcktV3:+ −
dataVersion = 3;+ −
break;+ −
default:+ −
dataVersion = KSimTsyDefaultVersion; + −
break;+ −
}+ −
+ −
if(iSimTsyVersion < dataVersion)+ −
{+ −
ret = KErrNotSupported;+ −
}+ −
+ −
return ret; + −
}+ −
+ −
+ −
TInt CSimPhone::CheckSimTsyVersion(RCall::TCallParams& aDataStruct)+ −
/**+ −
* Checks the version of a data structure against the (simulated) version of SIMTSY, in order+ −
* to determine if the version of the API used is compatible with the version of the TSY used.+ −
*+ −
* @param aDataStruct A versioned data-holding structure, derived from TCallParams+ −
*+ −
* @return KErrNone if the version of aDataStruct is supported by the user-defined simulated TSY version. KErrNotSupported otherwise+ −
*/+ −
{+ −
TInt ret = KErrNone;+ −
+ −
//retrieval of data version+ −
TInt dataVersion;+ −
switch (aDataStruct.ExtensionId())+ −
{+ −
case RMobileCall::KETelMobileCallParamsV1:+ −
case RMobileCall::KETelMobileDataCallParamsV1:+ −
case RMobileCall::KETelMobileHscsdCallParamsV1:+ −
case RMobileCall::KETel3rdPartyCallParamsV1:+ −
dataVersion = 1;+ −
break;+ −
case RMobileCall::KETelMobileCallParamsV2:+ −
case RMobileCall::KETelMobileDataCallParamsV2:+ −
case RMobileCall::KETelMobileHscsdCallParamsV2:+ −
dataVersion = 2;+ −
break;+ −
default:+ −
dataVersion = KSimTsyDefaultVersion; + −
break;+ −
}+ −
+ −
if(iSimTsyVersion < dataVersion)+ −
{+ −
ret = KErrNotSupported;+ −
}+ −
+ −
return ret; + −
}+ −
+ −
+ −
TInt CSimPhone::CheckSimTsyVersion(RMobilePhone::CImsAuthorizationInfoV5& /*aDataStruct*/) // overload this for other types of structures+ −
/**+ −
* Checks the version of a data structure against the (simulated) version of SIMTSY, in order+ −
* to determine if the version of the API used is compatible with the version of the TSY used.+ −
*+ −
* @param aDataStruct A versioned data-holding structure, of type RMobilePhone::CImsAuthorizationInfoV5 or a class derived from it.+ −
*+ −
* @return KErrNone if the version of aDataStruct is supported by the user-defined simulated TSY version. KErrNotSupported otherwise+ −
*/+ −
{+ −
+ −
TInt ret = KErrNone;+ −
+ −
//retrieval of data version+ −
TInt dataVersion = 5; // (does not derive from the TMultimodeType data structure as usual...)+ −
+ −
if(iSimTsyVersion < dataVersion)+ −
{+ −
ret = KErrNotSupported;+ −
}+ −
+ −
return ret; + −
}+ −
+ −
+ −
TInt CSimPhone::CheckSimTsyVersion(RPacketContext::CTFTMediaAuthorizationV3& /*aDataStruct*/) // overload this for other types of structures+ −
/**+ −
* Checks the version of a data structure against the (simulated) version of SIMTSY, in order+ −
* to determine if the version of the API used is compatible with the version of the TSY used.+ −
*+ −
* @param aDataStruct A versioned data-holding structure, of type RPacketContext::CTFTMediaAuthorizationV3 or a class derived from it.+ −
*+ −
* @return KErrNone if the version of aDataStruct is supported by the user-defined simulated TSY version. KErrNotSupported otherwise+ −
*/+ −
{+ −
+ −
TInt ret = KErrNone;+ −
+ −
//retrieval of data version+ −
TInt dataVersion = 3; // (does not derive from the TMultimodeType data structure as usual...)+ −
+ −
if(iSimTsyVersion < dataVersion)+ −
{+ −
ret = KErrNotSupported;+ −
}+ −
+ −
return ret; + −
}+ −
////////////////////+ −
// CSimTestNumberObserver+ −
////////////////////+ −
+ −
CSimPhone::CSimTestNumberObserver::CSimTestNumberObserver(CSimPhone& aSimPhone)+ −
: CActive(CActive::EPriorityStandard),+ −
iSimPhone(aSimPhone)+ −
{+ −
CActiveScheduler::Add(this);+ −
}+ −
+ −
CSimPhone::CSimTestNumberObserver::~CSimTestNumberObserver()+ −
{+ −
Cancel();+ −
iProperty.Close();+ −
}+ −
+ −
CSimPhone::CSimTestNumberObserver* CSimPhone::CSimTestNumberObserver::NewL(CSimPhone& aSimPhone)+ −
{+ −
CSimPhone::CSimTestNumberObserver* self = new(ELeave)CSimPhone::CSimTestNumberObserver(aSimPhone);+ −
CleanupStack::PushL(self);+ −
self->ConstructL();+ −
CleanupStack::Pop(self);+ −
return self;+ −
}+ −
+ −
void CSimPhone::CSimTestNumberObserver::ConstructL()+ −
{+ −
LOGPHONE1("CSimPhone::CSimPhoneObserver::ConstructL");+ −
User::LeaveIfError(iProperty.Attach(KUidPSSimTsyCategory, KPSSimTsyTestNumber));+ −
Start();+ −
}+ −
+ −
void CSimPhone::CSimTestNumberObserver::Start()+ −
{+ −
LOGPHONE1("CSimPhone::CSimPhoneObserver::Start");+ −
iProperty.Subscribe(iStatus);+ −
SetActive();+ −
}+ −
+ −
void CSimPhone::CSimTestNumberObserver::RunL()+ −
{+ −
LOGPHONE2("CSimPhone::CSimPhoneObserver::RunL [iStatus=%d]", iStatus.Int());+ −
TInt err = iSimPhone.CheckConfigFile();+ −
if( err == KErrNone )+ −
{+ −
iSimPhone.HandleTestNumberChangedL();+ −
}+ −
+ −
Start();+ −
}+ −
+ −
void CSimPhone::CSimTestNumberObserver::DoCancel()+ −
{+ −
LOGPHONE1("CSimPhone::CSimPhoneObserver::DoCancel");+ −
iProperty.Cancel();+ −
}+ −
+ −