diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/simtsy/src/CSimNetworkStatus.cpp --- a/telephonyserverplugins/simtsy/src/CSimNetworkStatus.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/simtsy/src/CSimNetworkStatus.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,1935 +1,1935 @@ -// 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: -// Implements the functionality required to provide clients with -// network status, registration and NITZ information. -// -// - -/** - @file -*/ - -#include -#include -#include -#include "CSimNetworkStatus.h" -#include "CSimPhone.h" -#include "Simlog.h" -#include "CSimPubSubChange.h" -#include "CSimTsyMode.h" -#include "etelmmerr.h" -#include "CSimPubSub.h" -#include "simtsyglobalproperties.h" - -const TInt KSettingListGranularity=5; // < The granularity used for parameter list arrays. - -// Timer values -const TInt KNetStatTimeoutDefault=1; - -CSimNetworkStatus* CSimNetworkStatus::NewL(CSimPhone* aPhone) -/** - * Standard two-phase constructor. - * @param aPhone The parent phone object. - * @return CSimNetworkStatus The new network status class. - */ - { - CSimNetworkStatus* self=new(ELeave) CSimNetworkStatus(aPhone); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -CSimNetworkStatus::CSimNetworkStatus(CSimPhone* aPhone) - : iPhone(aPhone) -/** - * Trivial first phase construction. - * @param aPhone The parent phone object. - */ - { - iCurrNetChangeV1NotificationPending = EFalse; - iCurrNetChangeV2NotificationPending = EFalse; - iCurrNetChangeEtelIsvNotificationPending = EFalse; - iCurrNetChangeNoLocV1NotificationPending = EFalse; - iCurrNetChangeNoLocV2NotificationPending = EFalse; - iCurrNetChangeV5NotificationPending = EFalse; - iCurrNetChangeV8NotificationPending = EFalse; - iCurrNetChangeNoLocV5NotificationPending = EFalse; - iCurrNetChangeNoLocV8NotificationPending = EFalse; - iCurrentNetworkChangeLocationAreaNotificationPending = EFalse; - - iRoamStatGetTimeout = KNetStatTimeoutDefault; - - iRoamStatTimer = NULL; - iRoamStatGetClients = NULL; - iRoamStatNotifyClients = NULL; - } - -void CSimNetworkStatus::ConstructL() -/** - * Second phase construction. Create instances of the necessary heap-based - * objects and read in the network, Network Registration and NITZ information - * from the configuration file. - * If any network registration status tags have been read, the initial values - * will be loaded and the network registration timer started. - * Similarly, if any NITZ tags have been read, the initial NITZ values will be loaded - * and the NITZ timer started. - * - * Entries in the configuration file will take the following formats: - * - * "NetworkInfo= , , , , , " - * A number of these tags may be included to create a list of Network Information - * that can be used via the RegStatus tag during the test. - * "LocationArea= , , " - * that can be used via the RegStatus tag during the test. - * - * "RegStatus= , , " - * The RegistrationStatus is taken from the RMoiblePhone::TMobilePhoneRegistrationStatus - * enumeration. The NetworkIndex is a reference to the NetworkInfo list. - * A number of these tags may be included to create a Network Registration Profile. - * - * "NitzInfo= , , , , , , , , - * , " - * A number of these tags may be included to create a NITZ Profile. - * - * "CellInfo= , , , , " - * A number of these tags may be included to create a Cell Information Profile. - */ - { - LOGNETWORK1("Starting to parse Network Status config parameters..."); - iRegStatTimer=CSimTimer::NewL(iPhone); - iNitzTimer=CSimTimer::NewL(iPhone); - iRadioModeTimer=CSimTimer::NewL(iPhone); - iCellInfoTimer=CSimTimer::NewL(iPhone); - - iRegStatusInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); - iNetworkInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); - iNetworkInfoV8=new(ELeave) CArrayFixFlat(KSettingListGranularity); - iNitzInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); - iRadioModeInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); - iCellInfo = new (ELeave)CArrayFixFlat(KSettingListGranularity); - iLocationArea = new (ELeave)CArrayFixFlat(KSettingListGranularity); - - TInt count; - count=CfgFile()->ItemCount(KNetworkInfo); - const CTestConfigItem* item=NULL; - TInt ret=KErrNone; - - TInt i; - for(i=0;iItem(KNetworkInfo,i); - if(!item) - break; - - TPtrC8 countryCode,networkIdentify,displayTag,longName,shortName; - TInt status; - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,countryCode); - if(ret!=KErrNone) - { - LOGPARSERR("countryCode",ret,0,&KNetworkInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,networkIdentify); - if(ret!=KErrNone) - { - LOGPARSERR("networkIdentify",ret,1,&KNetworkInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,displayTag); - if(ret!=KErrNone) - { - LOGPARSERR("displayTag",ret,2,&KNetworkInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,shortName); - if(ret!=KErrNone) - { - LOGPARSERR("shortName",ret,3,&KNetworkInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,longName); - if(ret!=KErrNone) - { - LOGPARSERR("longName",ret,4,&KNetworkInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,status); - if(ret!=KErrNone) - { - LOGPARSERR("status",ret,5,&KNetworkInfo); - continue; - } - RMobilePhone::TMobilePhoneNetworkInfoV2 networkInfo; - RMobilePhone::TMobilePhoneNetworkInfoV8 networkInfoV8; - - TInt mode; - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,mode); - if(ret!=KErrNone) - { - // It's ok, this element is optional. Assume that the - // config file is old, and default mode to GSM - mode = RMobilePhone::ENetworkModeGsm; - } - networkInfo.iMode=RMobilePhone::TMobilePhoneNetworkMode(mode); - - networkInfo.iStatus=RMobilePhone::TMobilePhoneNetworkStatus(status); - networkInfo.iBandInfo=RMobilePhone::EBandUnknown; - networkInfo.iCountryCode.Copy(countryCode); - networkInfo.iAnalogSID.SetLength(0); - networkInfo.iNetworkId.Copy(networkIdentify); - networkInfo.iDisplayTag.Copy(displayTag); - - TInt maxLength = networkInfo.iShortName.MaxLength(); - if (shortName.Length() > maxLength) - { - networkInfo.iShortName.Copy(shortName.Left(maxLength)); - } - else - { - networkInfo.iShortName.Copy(shortName); - } - - maxLength = networkInfo.iLongName.MaxLength(); - if (longName.Length() > maxLength) - { - networkInfo.iLongName.Copy(longName.Left(maxLength)); - } - else - { - networkInfo.iLongName.Copy(longName); - } - - networkInfo.iAccess = RMobilePhone::ENetworkAccessGsm; - networkInfoV8.iHsdpaAvailableIndicator=EFalse; - networkInfoV8.iEgprsAvailableIndicator=EFalse; - networkInfoV8.iHsupaAvailableIndicator=ETrue; - iNetworkInfo->AppendL(networkInfo); - iNetworkInfoV8->AppendL(networkInfoV8); - } - - -// Read in the Registration status profile. - count=CfgFile()->ItemCount(KRegStatus); - item=NULL; - for(i=0;iItem(KRegStatus,i); - if(!item) - break; - - TInt duration,regStat,networkIndex; - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); - if(ret!=KErrNone) - { - LOGPARSERR("duration",ret,0,&KRegStatus); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,regStat); - if(ret!=KErrNone) - { - LOGPARSERR("regStat",ret,1,&KRegStatus); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,networkIndex); - if(ret!=KErrNone) - networkIndex=KErrNotFound; // Network Index is optional. - - TRegStatus regStatus; - regStatus.iDuration=duration; - regStatus.iRegStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)regStat; - regStatus.iNetworkInfoIndex=networkIndex; - iRegStatusInfo->AppendL(regStatus); - } - - count=CfgFile()->ItemCount(KRadioMode); - item=NULL; - for(i=0;iItem(KRadioMode,i); - if(!item) - break; - - TInt duration,radioStatus; - - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); - if(ret!=KErrNone) - { - LOGPARSERR("duration",ret,0,&KRadioMode); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,radioStatus); - if(ret!=KErrNone) - { - LOGPARSERR("radioStatus",ret,1,&KRadioMode); - continue; - } - - - TRadioMode radioMode; - radioMode.iDuration=duration; - radioMode.iRadioOn=(TBool)radioStatus; - iRadioModeInfo->AppendL(radioMode); - } - -// Read the NITZ information - count=CfgFile()->ItemCount(KNitzInfo); - item=NULL; - for(i=0;iItem(KNitzInfo,i); - if(!item) - break; - - TInt duration,year,month,day,hour,min,sec,microsec,tz,dst; - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); - if(ret!=KErrNone) - { - LOGPARSERR("duration",ret,0,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,year); - if(ret!=KErrNone) - { - LOGPARSERR("year",ret,1,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,month); - if(ret!=KErrNone) - { - LOGPARSERR("month",ret,2,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,day); - if(ret!=KErrNone) - { - LOGPARSERR("day",ret,3,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,hour); - if(ret!=KErrNone) - { - LOGPARSERR("hour",ret,4,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,min); - if(ret!=KErrNone) - { - LOGPARSERR("min",ret,5,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,sec); - if(ret!=KErrNone) - { - LOGPARSERR("sec",ret,6,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,microsec); - if(ret!=KErrNone) - { - LOGPARSERR("microsec",ret,7,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,tz); - if(ret!=KErrNone) - { - LOGPARSERR("tz",ret,8,&KNitzInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,dst); - if(ret!=KErrNone) - { - LOGPARSERR("dst",ret,9,&KNitzInfo); - continue; - } - - RMobilePhone::TMobilePhoneNITZ nitzInfo(year,(TMonth)month,day,hour,min,sec,microsec); - nitzInfo.iTimeZone=tz; - nitzInfo.iDST=dst; - nitzInfo.iNitzFieldsUsed= (RMobilePhone::KCapsTimeAvailable - |RMobilePhone::KCapsTimezoneAvailable - |RMobilePhone::KCapsDSTAvailable); - - TNitzInfoAndDuration nitzInfoAndDuration; - nitzInfoAndDuration.iNitz=nitzInfo; - nitzInfoAndDuration.iDuration=duration; - iNitzInfo->AppendL(nitzInfoAndDuration); - } - - // Read the Cell Info information - count=CfgFile()->ItemCount(KCellInfo); - item=NULL; - for(i=0;iItem(KCellInfo,i); - if(!item) - break; - - TInt duration,mode,cellId,timingAdvance,cellInfoStatus; - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); - if(ret!=KErrNone) - { - LOGPARSERR("duration",ret,0,&KCellInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,mode); - if(ret!=KErrNone) - { - LOGPARSERR("mode",ret,1,&KCellInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,cellId); - if(ret!=KErrNone) - { - LOGPARSERR("cellId",ret,2,&KCellInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,timingAdvance); - if(ret!=KErrNone) - { - LOGPARSERR("timingAdvance",ret,3,&KCellInfo); - continue; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,cellInfoStatus); - if(ret!=KErrNone) - { - LOGPARSERR("cellInfoStatus",ret,3,&KCellInfo); - continue; - } - - TCellInfoAndDuration cellInfoAndDuration; - cellInfoAndDuration.iInfo.iMode = static_cast(mode); - cellInfoAndDuration.iInfo.iCellId = static_cast(cellId); - cellInfoAndDuration.iInfo.iTimingAdvance = static_cast(timingAdvance); - cellInfoAndDuration.iInfo.iStatus = static_cast(cellInfoStatus); - - cellInfoAndDuration.iDuration=duration; - iCellInfo->AppendL(cellInfoAndDuration); - } - - // Read the Location Area information - count=CfgFile()->ItemCount(KLocationArea); - item=NULL; - for(i=0;iItem(KLocationArea,i); - if(!item) - break; - - TBool areaKnown; - TInt locationAreaCode, cellId; - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,areaKnown); - if(ret!=KErrNone) - { - ret = EFalse; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,locationAreaCode); - if(ret!=KErrNone) - { - locationAreaCode = 0; - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,cellId); - if(ret!=KErrNone) - { - cellId = 0; - } - - RMobilePhone::TMobilePhoneLocationAreaV1 locationArea; - locationArea.iAreaKnown = areaKnown; - locationArea.iLocationAreaCode = locationAreaCode; - locationArea.iCellId= cellId; - iLocationArea->AppendL(locationArea); - } - LOGNETWORK1("...Finished parsing Network Status config parameters..."); - -// If present load the first registration status settings and start the registration -// status timer. - if(iRegStatusInfo->Count()!=0) - { - iRegStatIndex=0; - iCurrentRegStatus=iRegStatusInfo->At(0).iRegStatus; - iCurrentNetworkIndex=iRegStatusInfo->At(0).iNetworkInfoIndex; - LOGNETWORK2("Starting ETimerIdNtwkStatRegStat for duration:%d", iRegStatusInfo->At(0).iDuration); - iRegStatTimer->Start(iRegStatusInfo->At(0).iDuration,this,ETimerIdNtwkStatRegStat); - } - -// If present load the first NITZ settings and start the NITZ timer. - if(iNitzInfo->Count()!=0) - { - iNitzIndex=0; - iCurrentNitzInfo=iNitzInfo->At(0).iNitz; - iNitzTimer->Start(iNitzInfo->At(0).iDuration,this,ETimerIdNtwkStatNitz); - } - -// If present load the first Cell Info settings and start the cell info timer. - if(iCellInfo->Count()!=0) - { - iCellInfoIndex=0; - iCurrentCellInfo=iCellInfo->At(0).iInfo; - iCellInfoTimer->Start(iCellInfo->At(0).iDuration,this,ETimerIdCellInfo); - } - - if(iRadioModeInfo->Count()!=0) - { - iRadioModeIndex=0; - iRadioMode.iRadioOn=iRadioModeInfo->At(0).iRadioOn; - if(iRadioMode.iRadioOn==EFalse) - { - RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOff); - LOGNETWORK1("Radio Mode = OFF (from config)"); - } - else - { - RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOn); - LOGNETWORK1("Radio Mode = ON (from config)"); - } - LOGNETWORK2("Radio Mode duration = %d (from config)", iRadioModeInfo->At(0).iDuration); - - iRadioModeTimer->Start(iRadioModeInfo->At(0).iDuration,this,ETimerIdNtwkStatRadioMode); - } - else - { - //default to on - RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOn); - LOGNETWORK1("Radio Mode = ON (no config)"); - } - -//If present read in Service Provider settings - TPtrC8 spname, plmnfield; - TInt displayreq; - item=CfgFile()->Item(KServiceProviderName); - if (item) - { - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,displayreq); - if(ret!=KErrNone) - { - LOGPARSERR("displayreq",ret,0,&KServiceProviderName); - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,spname); - if(ret!=KErrNone) - { - LOGPARSERR("spname",ret,1,&KServiceProviderName); - } - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,plmnfield); - if(ret!=KErrNone) - { - LOGPARSERR("plmnfield",ret,2,&KServiceProviderName); - } - iServiceProvider.iDisplayReq = static_cast(displayreq); - - TInt maxLength = iServiceProvider.iSPName.MaxLength(); - if (spname.Length() > maxLength) - { - iServiceProvider.iSPName.Copy(spname.Left(maxLength)); - } - else - { - iServiceProvider.iSPName.Copy(spname); - } - - maxLength = iServiceProvider.iPLMNField.MaxLength(); - if (plmnfield.Length() > maxLength) - { - iServiceProvider.iPLMNField.Copy(plmnfield.Left(maxLength)); - } - else - { - iServiceProvider.iPLMNField.Copy(plmnfield); - } - } - else - { - iServiceProvider.iDisplayReq = KDisplayReqDefault; - iServiceProvider.iSPName.Copy(KSPNameDefault); - iServiceProvider.iPLMNField.Copy(KPLMNFieldDefault); - } - - iRegStatChange=CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidSimtsyCategoryLocal, KSimtsyRegStatChange, KSimtsyRegStatChangeType)); - //also listen on new P&S uids - iPSRegStatChange=CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimTsyRegStatChange, KPSSimTsyRegStatChangeKeyType)); - - } - -void CSimNetworkStatus::FindRoamStatSettings() -/** - * Get Roaming Status Configuration - */ - { - const CTestConfigItem* item=NULL; - TInt ret=KErrNone; - - //If present read in Service Provider settings - TInt getTimer; - item=CfgFile()->Item(KRoamStatTimers); - if (item) - { - ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,getTimer); - if(ret!=KErrNone) - { - LOGNETWORK1("WARNING: CSimNetworkStatus::FindRoamStatSettings found ERROR with Config"); - } - iRoamStatGetTimeout = getTimer; - } - } - -void CSimNetworkStatus::SetNetworkMode() -/** - * Initialize iPhone->NetworkMode(). - */ - { - if(iCurrentNetworkIndex != KErrNotFound) - { - if(iNetworkInfo->Count()>iCurrentNetworkIndex) - { - iPhone->UpdateNetworkMode(iNetworkInfo->At(iCurrentNetworkIndex).iMode); - } - } - } - -CSimNetworkStatus::~CSimNetworkStatus() -/** - * Standard destructor. Destroy the heap-based object owned by this object. - */ - { - delete iCellInfoTimer; - delete iNitzTimer; - delete iRegStatTimer; - delete iRegStatChange; - delete iPSRegStatChange; - delete iRadioModeTimer; - if (iCellInfo) - { - iCellInfo->Delete(0,iCellInfo->Count()); - delete iCellInfo; - } - if (iNitzInfo) - { - iNitzInfo->Delete(0,iNitzInfo->Count()); - delete iNitzInfo;//todo check ptr - } - if (iRegStatusInfo) - { - iRegStatusInfo->Delete(0,iRegStatusInfo->Count()); - delete iRegStatusInfo;//todo check ptr - } - if (iNetworkInfo) - { - iNetworkInfo->Delete(0,iNetworkInfo->Count()); - delete iNetworkInfo;//todo check ptr - } - if (iNetworkInfoV8) - { - iNetworkInfoV8->Delete(0,iNetworkInfoV8->Count()); - delete iNetworkInfoV8;//todo check ptr - } - if (iRadioModeInfo) - { - iRadioModeInfo->Delete(0,iRadioModeInfo->Count()); - delete iRadioModeInfo;//todo check ptr - } - if(iLocationArea) - { - iLocationArea->Delete(0,iLocationArea->Count()); - delete iLocationArea; - } - - delete iRoamStatTimer; - if(iRoamStatGetClients) - { - TInt i; - TRoamStatClient client; - for(i=0;iCount();i++) - { - client = iRoamStatGetClients->At(i); - iPhone->ReqCompleted(client.iReqHandle, KErrCancel); - } - iRoamStatGetClients->Reset(); - delete iRoamStatGetClients; - } - if(iRoamStatNotifyClients) - { - TInt i; - TRoamStatClient client; - for(i=0;iCount();i++) - { - client = iRoamStatNotifyClients->At(i); - iPhone->ReqCompleted(client.iReqHandle, KErrCancel); - } - iRoamStatNotifyClients->Reset(); - delete iRoamStatNotifyClients; - } - } - -TInt CSimNetworkStatus::GetNetworkCaps(TTsyReqHandle aReqHandle,TDes8* aPckg1) -/** - * Retrieve the Network Capability information. Network capabilities for this test - * are deduced from the tags, and therefore loaded information, for this test. - * @param aReqHandle The request handle associated with this request. - * @param aPckg1 The first parameter package. This will be populated with the - * capability data to be returned. - * @return TInt Standard error value. - */ -{ - TPckg* networkCapsPckg=(TPckg*)aPckg1; - TUint32& networkCaps=(*networkCapsPckg)(); - - if(iRegStatusInfo->Count()==0) - networkCaps=RMobilePhone::KCapsGetCurrentMode; - else - networkCaps=RMobilePhone::KCapsGetRegistrationStatus | - RMobilePhone::KCapsNotifyRegistrationStatus | - RMobilePhone::KCapsGetCurrentMode | - RMobilePhone::KCapsGetCurrentNetwork | - RMobilePhone::KCapsNotifyCurrentNetwork | - RMobilePhone::KCapsGetHomeNetwork; - - if(iNetworkInfo->Count()>=1) - networkCaps|=RMobilePhone::KCapsGetHomeNetwork; - - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::GetHomeNetwork(TTsyReqHandle aReqHandle,TDes8* aPckg1) -/** - * Retrieve information about the Home Network. The first NetworkInfo tag information - * is taken to be the "home" network. If this information is not present, the - * request is completed with KErrNotSupported. - * @param aReqHandle The request handle associated with this request. - * @param aPckg1 The first parameter package. This will be populated with the - * Home Network information to be returned. - * @return TInt Standard error value.+ - */ - { - RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* homeNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TMultimodeType& packagetype = (*homeNetworkPckg)(); - RMobilePhone::TMobilePhoneNetworkInfoV1& homeNetwork=(*homeNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(homeNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - if(iNetworkInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - PopulateNetworkInfoV1(0,homeNetwork); - - if(packagetype.ExtensionId() == KETelExtMultimodeV1 || packagetype.ExtensionId() == KETelExtMultimodeV2 || \ - packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8 ) - { - RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* homeNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV1& homeNetwork=(*homeNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(homeNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - PopulateNetworkInfoV1(0,homeNetwork); - - //if V2 package then set its paramters as well - if(packagetype.ExtensionId() == KETelExtMultimodeV2 || packagetype.ExtensionId() == KEtelExtMultimodeV5 || \ - packagetype.ExtensionId() == KEtelExtMultimodeV8) - { - RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* homeNetworkPckgV2=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV2& homeNetworkV2=(*homeNetworkPckgV2)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(homeNetworkV2); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - homeNetworkV2.iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; - - if(packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8) - { - RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* homeNetworkPckgV5=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV5& homeNetworkV5=(*homeNetworkPckgV5)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(homeNetworkV5); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - homeNetworkV5.iHsdpaAvailableIndicator = iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; - homeNetworkV5.iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; - - if(packagetype.ExtensionId() == KEtelExtMultimodeV8) - { - RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* homeNetworkPckgV8=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV8& homeNetworkV8=(*homeNetworkPckgV8)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(homeNetworkV8); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - homeNetworkV8.iHsupaAvailableIndicator = iNetworkInfoV8->At(0).iHsupaAvailableIndicator; - } - } - } - } - else - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::GetCurrentNetwork(TTsyReqHandle aReqHandle,TDes8* aPckg1,TDes8* aPckg2) -/** - * Retrieve information about the Current Network. The current network is given by the - * iCurrentNetworkIndex member variable. It will be updated from RegStat tags in the - * configuration file. If there is no network information currently available (perhaps - * because the SIM TSY is simulating a network search) KErrNotFound will be - * returned. If no registration status profile information is contained in the - * configuration file KErrNotSupported will be returned. - * @param aReqHandle The request handle associated with this request. - * @param aPckg1 The first parameter package. This will be populated with the - * Current Network information to be returned. - * @return TInt Standard error value. - */ - { - RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TMultimodeType& packagetype = (*currentNetworkPckg)(); - - if(aPckg2) - { - TPckg* areaPckg=(TPckg*)aPckg2; - RMobilePhone::TMobilePhoneLocationAreaV1& area=(*areaPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(area); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - if((iCurrentNetworkIndex >=0) && (iCurrentNetworkIndex Count())) - { - area.iAreaKnown = iLocationArea->At(iCurrentNetworkIndex).iAreaKnown; - area.iLocationAreaCode = iLocationArea->At(iCurrentNetworkIndex).iLocationAreaCode; - area.iCellId = iLocationArea->At(iCurrentNetworkIndex).iCellId; - } - else - { - area.iAreaKnown=EFalse; // Area information not currently supported. - } - } - - - if(iRegStatusInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - if(iCurrentNetworkIndex==KErrNotFound) - { - iPhone->ReqCompleted(aReqHandle,KErrNotFound); - return KErrNone; - } - - if(packagetype.ExtensionId() == KETelExtMultimodeV1 || packagetype.ExtensionId() == KETelExtMultimodeV2 || \ - packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8 ) - { - RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - PopulateNetworkInfoV1(iCurrentNetworkIndex,currentNetwork); - //if V2 package then set its paramters as well - if(currentNetwork.ExtensionId() == KETelExtMultimodeV2 || packagetype.ExtensionId() == KEtelExtMultimodeV5 || \ - packagetype.ExtensionId() == KEtelExtMultimodeV8) - { - RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* currentNetworkPckgV2=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV2& currentNetworkV2=(*currentNetworkPckgV2)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetworkV2); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - currentNetworkV2.iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; - - if(packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8) - { - RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* currentNetworkPckgV5=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV5& currentNetworkV5=(*currentNetworkPckgV5)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetworkV5); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - currentNetworkV5.iHsdpaAvailableIndicator = iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; - currentNetworkV5.iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; - - if(packagetype.ExtensionId() == KEtelExtMultimodeV8) - { - RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* currentNetworkPckgV8=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV8& currentNetworkV8=(*currentNetworkPckgV8)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetworkV8); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - currentNetworkV8.iHsupaAvailableIndicator = iNetworkInfoV8->At(0).iHsupaAvailableIndicator; - } - } - } - } - - else if(packagetype.ExtensionId() == KETelExt3rdPartyV1) - { - RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - PopulateEtel3rdPartyNetworkInfoV1(iCurrentNetworkIndex, currentNetwork); - } - else - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::GetCurrentNetworkNoLocation(TTsyReqHandle aReqHandle,TDes8* aPckg1) -/** - * Retrieve information about the Current Network excluding loation information. The current network is given by the - * iCurrentNetworkIndex member variable. It will be updated from RegStat tags in the - * configuration file. If there is no network information currently available (perhaps - * because the SIM TSY is simulating a network search) KErrNotFound will be - * returned. If no registration status profile information is contained in the - * configuration file KErrNotSupported will be returned. - * @param aReqHandle The request handle associated with this request. - * @param aPckg1 The first parameter package. This will be populated with the - * Current Network information to be returned. This is either a packaged TMobilePhoneNetworkInfoV1 or TMobilePhoneNetworkInfoV2 - * @return TInt Standard error value. - */ - { - return GetCurrentNetwork(aReqHandle, aPckg1, NULL); - } - -TInt CSimNetworkStatus::GetNetworkRegistrationStatus(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Retrieve information about the Current Network Registration Status. This is given by - * the iCurrentRegStatus member variable. It will be updated from RegStat tags in the - * configuration file. If no registration status profile information is contained in the - * configuration file KErrNotSupported will be returned. - * @param aReqHandle The request handle associated with this request. - * @param aPckg1 The first parameter package. This will be populated with the - * Current Network Registration Status to be returned. - * @return TInt Standard error value. - */ - { - TPckg* regStatusPckg=(TPckg*)aPckg; - RMobilePhone::TMobilePhoneRegistrationStatus& regStatus=(*regStatusPckg)(); - - if(iRegStatusInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - regStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)iCurrentRegStatus; - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::NotifyNetworkRegistrationStatusChange(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Register a client's interest in being notified when the Network Registration Status - * changes. - * This function records the request's parameters and awaits a change in network registration - * status before completing. - * - * @param aPckg The first parameter package. This is populated with the network registration - * status. - * @return TInt Standard error value. - */ - { - TPckg* regStatusPckg=(TPckg*)aPckg; - RMobilePhone::TMobilePhoneRegistrationStatus& regStatus=(*regStatusPckg)(); - - if(iRegStatusInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - __ASSERT_ALWAYS(!iRegStatChangeNotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - iRegStatChangeNotificationPending=ETrue; - iRegStatChangeNotificationReqHandle=aReqHandle; - iRegStatChangeNotificationRegStatus=®Status; - return KErrNone; - } - -void CSimNetworkStatus::NotifyNetworkRegistrationStatusChangeCancel() -/** - * Cancel a previous request to be notified of a change in network registration status. - */ - { - if(iRegStatChangeNotificationPending) - { - iRegStatChangeNotificationPending=EFalse; - iPhone->ReqCompleted(iRegStatChangeNotificationReqHandle,KErrCancel); - } - } - -TInt CSimNetworkStatus::NotifyCurrentNetworkChange(TTsyReqHandle aReqHandle,TDes8* aPckg1,TDes8* aPckg2) -/** - * Register a client's interest in being notified when the current network changes. - * This function records the request's parameters and awaits a change in current network - * before completing. - * - * @param aPckg1 The first parameter package. This is populated with the current network - * information when the request completes. - * @return TInt Standard error value. - */ - { - TPckg* areaPckg=(TPckg*)aPckg2; - RMobilePhone::TMobilePhoneLocationAreaV1& area=(*areaPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(area); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - TPckg* paramPckg=(TPckg*)aPckg1; - RMobilePhone::TMultimodeType& paramclass=(*paramPckg)(); - - if(iRegStatusInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - if(paramclass.ExtensionId() == KETelExtMultimodeV1) - { - __ASSERT_ALWAYS(!iCurrNetChangeV1NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeV1NotificationPending=ETrue; - iCurrNetChangeV1NotificationReqHandle=aReqHandle; - iCurrNetChangeV1NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KETelExtMultimodeV2) - { - __ASSERT_ALWAYS(!iCurrNetChangeV2NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV2& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeV2NotificationPending=ETrue; - iCurrNetChangeV2NotificationReqHandle=aReqHandle; - iCurrNetChangeV2NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KEtelExtMultimodeV5) - { - __ASSERT_ALWAYS(!iCurrNetChangeV5NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV5& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeV5NotificationPending=ETrue; - iCurrNetChangeV5NotificationReqHandle=aReqHandle; - iCurrNetChangeV5NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KEtelExtMultimodeV8) - { - __ASSERT_ALWAYS(!iCurrNetChangeV8NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV8& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeV8NotificationPending=ETrue; - iCurrNetChangeV8NotificationReqHandle=aReqHandle; - iCurrNetChangeV8NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KETelExt3rdPartyV1) - { - RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeEtelIsvNotificationPending=ETrue; - iCurrNetChangeEtelIsvNotificationReqHandle=aReqHandle; - iCurrNetChangeEtelIsvNotificationNetInfo=¤tNetwork; - } - else - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - __ASSERT_ALWAYS(!iCurrentNetworkChangeLocationAreaNotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - iCurrentNetworkChangeLocationArea = &area; - iCurrentNetworkChangeLocationAreaNotificationPending = ETrue; - - return KErrNone; - } - -void CSimNetworkStatus::NotifyCurrentNetworkChangeCancel(const TTsyReqHandle aTsyReqHandle) -/** - * Cancel a previous request to be notified of a change in current network. - * @param aTsyReqHandle request handle - */ - { - if(iCurrNetChangeV1NotificationPending && iCurrNetChangeV1NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeV1NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeV1NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeV2NotificationPending && iCurrNetChangeV2NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeV2NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeV2NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeV5NotificationPending && iCurrNetChangeV5NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeV5NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeV5NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeV8NotificationPending && iCurrNetChangeV8NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeV8NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeV8NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeEtelIsvNotificationPending && iCurrNetChangeEtelIsvNotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeEtelIsvNotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeEtelIsvNotificationReqHandle,KErrCancel); - } - iCurrentNetworkChangeLocationAreaNotificationPending = EFalse; - } - -TInt CSimNetworkStatus::NotifyCurrentNetworkNoLocationChange(TTsyReqHandle aReqHandle,TDes8* aPckg1) -/** - * Register an EtelISV client's interest in being notified when the current network changes. - * This function records the request's parameters and awaits a change in current network - * before completing. - * - * @param aPckg1 The first parameter package. This is populated with the current network - * information when the request completes. - * @return TInt Standard error value. - */ - { - TPckg* paramPckg=(TPckg*)aPckg1; - RMobilePhone::TMultimodeType& paramclass=(*paramPckg)(); - - if(iRegStatusInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - if(paramclass.ExtensionId() == KETelExtMultimodeV1) - { - __ASSERT_ALWAYS(!iCurrNetChangeNoLocV1NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); - - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeNoLocV1NotificationPending=ETrue; - iCurrNetChangeNoLocV1NotificationReqHandle=aReqHandle; - iCurrNetChangeNoLocV1NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KETelExtMultimodeV2) - { - __ASSERT_ALWAYS(!iCurrNetChangeNoLocV2NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV2& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeNoLocV2NotificationPending=ETrue; - iCurrNetChangeNoLocV2NotificationReqHandle=aReqHandle; - iCurrNetChangeNoLocV2NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KEtelExtMultimodeV5) - { - __ASSERT_ALWAYS(!iCurrNetChangeNoLocV5NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV5& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeNoLocV5NotificationPending=ETrue; - iCurrNetChangeNoLocV5NotificationReqHandle=aReqHandle; - iCurrNetChangeNoLocV5NotificationNetInfo=¤tNetwork; - } - else if(paramclass.ExtensionId() == KEtelExtMultimodeV8) - { - __ASSERT_ALWAYS(!iCurrNetChangeNoLocV8NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); - - RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; - RMobilePhone::TMobilePhoneNetworkInfoV8& currentNetwork=(*currentNetworkPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - iCurrNetChangeNoLocV8NotificationPending=ETrue; - iCurrNetChangeNoLocV8NotificationReqHandle=aReqHandle; - iCurrNetChangeNoLocV8NotificationNetInfo=¤tNetwork; - } - else - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - return KErrNone; - } - -void CSimNetworkStatus::NotifyCurrentNetworkNoLocationChangeCancel(const TTsyReqHandle aTsyReqHandle) -/** - * Cancel a previous request from an EtelISV client to be notified of a change in current network. - * @param aTsyReqHandle request handle - */ - { - if(iCurrNetChangeNoLocV1NotificationPending && iCurrNetChangeNoLocV1NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeNoLocV1NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeNoLocV1NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeNoLocV2NotificationPending && iCurrNetChangeNoLocV2NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeNoLocV2NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeNoLocV2NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeNoLocV5NotificationPending && iCurrNetChangeNoLocV5NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeNoLocV5NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeNoLocV5NotificationReqHandle,KErrCancel); - } - else if(iCurrNetChangeNoLocV8NotificationPending && iCurrNetChangeNoLocV8NotificationReqHandle == aTsyReqHandle) - { - iCurrNetChangeNoLocV8NotificationPending=EFalse; - iPhone->ReqCompleted(iCurrNetChangeNoLocV8NotificationReqHandle,KErrCancel); - } - } - -TInt CSimNetworkStatus::GetNITZInfo(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Retrieve the current "Network Information and Time Zone" (NITZ) information. - * It will be updated from NitzInfo tags in the configuration file. If no NITZ - * profile information is contained in the configuration file KErrNotSupported - * will be returned. - * @param aReqHandle The request handle associated with this request. - * @param aPckg The first parameter package. This will be populated with the - * NITZ information to be returned. - * @return TInt Standard error value. - */ - { - TPckg* nitzPckg=(TPckg*)aPckg; - RMobilePhone::TMobilePhoneNITZ& nitz=(*nitzPckg)(); - - if(iNitzInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - nitz=iCurrentNitzInfo; - PopulateNitzNetworkNames(nitz); - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::NotifyNITZInfoChange(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Register a client's interest in being notified when NITZ information is received. - * This function records the request's parameters and awaits a NITZ information event, as - * scheduled by the "NitzInfo" tags in the configuration file. - * - * @param aPckg The first parameter package. This is populated with the NITZ - * information when the request completes. - * @return TInt Standard error value. - */ - { - TPckg* nitzPckg=(TPckg*)aPckg; - RMobilePhone::TMobilePhoneNITZ& nitz=(*nitzPckg)(); - - if(iNitzInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - iNitzChangeNotificationPending=ETrue; - iNitzChangeNotificationReqHandle=aReqHandle; - iNitzChangeNotificationInfo=&nitz; - return KErrNone; - } - -void CSimNetworkStatus::NotifyNITZInfoChangeCancel() -/** - * Cancel a previous request to be notified of new NITZ informations. - */ - { - if(iNitzChangeNotificationPending) - { - iNitzChangeNotificationPending=EFalse; - iPhone->ReqCompleted(iNitzChangeNotificationReqHandle,KErrCancel); - } - } - -void CSimNetworkStatus::TimerCallBack(TInt aId) -/** - * The timer callback function. This function will be called when either the - * Registration Status timer, cell info timer or the NITZ timer complete. The aId parameter - * is used to indicate which timer has completed and the appropriate callback function - * is called. - * @param aId This parameter indicates which timer has completed. The timer ID is - * registered when the timer is started. - */ - { - switch(aId) - { - case ETimerIdNtwkStatRegStat: - TimerCallBackRegStat(); - break; - case ETimerIdNtwkStatNitz: - TimerCallBackNitz(); - break; - case ETimerIdNtwkStatRadioMode: - TInt err; - err = KErrNone; - TRAP(err,TimerCallBackRadioModeL()); - break; - - case ETimerIdNtwkStatRoamStat: - SimPanic(EIllegalCallBackId); - break; - case ETimerIdCellInfo: - TimerCallBackCellInfo(); - break; - default: - LOGNETWORK3("CSimNetworkStatus::TimerCallBack(%d), OOR [%d]",aId, ETimerIdNtwkStatRegStat); - SimPanic(EIllegalCallBackId); - break; - } - } - -void CSimNetworkStatus::TimerCallBackRegStat() -/** - * The Registration timer callback function. This function will be called when the - * Network Registration timer completes. It indicates a simulated change in registration - * status. So, the new network settings must be loaded into the relevant member variables - * and any pending registration notification requests must be completed. - * Finally, the next Network Registration timer is started. - */ - { - iRegStatIndex++; - if(iRegStatusInfo->Count()<=iRegStatIndex) - return; - - TInt oldNetworkIndex=iCurrentNetworkIndex; - iCurrentRegStatus=iRegStatusInfo->At(iRegStatIndex).iRegStatus; - iCurrentNetworkIndex=iRegStatusInfo->At(iRegStatIndex).iNetworkInfoIndex; - - // Ask phone to check if indicator notification needs to be triggered - iPhone->CheckIndicatorNotification(); - - if(iRegStatChangeNotificationPending) - { - iRegStatChangeNotificationPending=EFalse; - *iRegStatChangeNotificationRegStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)iCurrentRegStatus; - iPhone->ReqCompleted(iRegStatChangeNotificationReqHandle,KErrNone); - } - if(oldNetworkIndex!=iCurrentNetworkIndex && iCurrentNetworkIndex>=0) - { - if(iCurrentNetworkChangeLocationAreaNotificationPending) - { - if((iCurrentNetworkIndex >= 0) &&(iCurrentNetworkIndex < iLocationArea->Count())) - { - iCurrentNetworkChangeLocationArea->iAreaKnown = iLocationArea->At(iCurrentNetworkIndex).iAreaKnown; - iCurrentNetworkChangeLocationArea->iLocationAreaCode = iLocationArea->At(iCurrentNetworkIndex).iLocationAreaCode; - iCurrentNetworkChangeLocationArea->iCellId = iLocationArea->At(iCurrentNetworkIndex).iCellId; - } - else - { - iCurrentNetworkChangeLocationArea->iAreaKnown = EFalse; - } - iCurrentNetworkChangeLocationAreaNotificationPending=EFalse; - } - if(iCurrNetChangeV1NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV1"); - iCurrNetChangeV1NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV1* changeNetInfoV1 = reinterpret_cast(iCurrNetChangeV1NotificationNetInfo); - - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV1); - iPhone->ReqCompleted(iCurrNetChangeV1NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeV2NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV2"); - iCurrNetChangeV2NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV2* changeNetInfoV2 = reinterpret_cast(iCurrNetChangeV2NotificationNetInfo); - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV2); - //also set v2 paramaters - changeNetInfoV2->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; - iPhone->ReqCompleted(iCurrNetChangeV2NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeV5NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV5"); - iCurrNetChangeV5NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV5* changeNetInfoV5 = reinterpret_cast(iCurrNetChangeV5NotificationNetInfo); - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV5); - //also set v5 paramaters - changeNetInfoV5->iAccess = iNetworkInfoV8->At(0).iAccess; - changeNetInfoV5->iHsdpaAvailableIndicator= iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; - changeNetInfoV5->iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; - iPhone->ReqCompleted(iCurrNetChangeV5NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeV8NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV8"); - iCurrNetChangeV8NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV8* changeNetInfoV8 = reinterpret_cast(iCurrNetChangeV8NotificationNetInfo); - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV8); - //also set v5 paramaters - changeNetInfoV8->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; - changeNetInfoV8->iHsdpaAvailableIndicator = iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; - changeNetInfoV8->iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; - changeNetInfoV8->iHsupaAvailableIndicator = iNetworkInfoV8->At(0).iHsupaAvailableIndicator; - iPhone->ReqCompleted(iCurrNetChangeV8NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeEtelIsvNotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TEtel3rdPartyMobileNetworkInfoV1"); - iCurrNetChangeEtelIsvNotificationPending = EFalse; - RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1* changeNetInfoEtelIsv = reinterpret_cast(iCurrNetChangeEtelIsvNotificationNetInfo); - - PopulateEtel3rdPartyNetworkInfoV1(iCurrentNetworkIndex, *changeNetInfoEtelIsv); - iPhone->ReqCompleted(iCurrNetChangeEtelIsvNotificationReqHandle,KErrNone); - } - if(iCurrNetChangeNoLocV1NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV1 (No Location)"); - iCurrNetChangeNoLocV1NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV1* changeNetInfoV1 = reinterpret_cast(iCurrNetChangeNoLocV1NotificationNetInfo); - - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV1); - iPhone->ReqCompleted(iCurrNetChangeNoLocV1NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeNoLocV2NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV2 (No Location)"); - iCurrNetChangeNoLocV2NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV2* changeNetInfoV2 = reinterpret_cast(iCurrNetChangeNoLocV2NotificationNetInfo); - - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV2); - //also set v2 paramaters - changeNetInfoV2->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; - iPhone->ReqCompleted(iCurrNetChangeNoLocV2NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeNoLocV5NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV5 (No Location)"); - iCurrNetChangeNoLocV5NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV5* changeNetInfoV5 = reinterpret_cast(iCurrNetChangeNoLocV5NotificationNetInfo); - - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV5); - //also set v5 paramaters - changeNetInfoV5->iAccess = iNetworkInfoV8->At(0).iAccess; - changeNetInfoV5->iHsdpaAvailableIndicator= iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; - changeNetInfoV5->iEgprsAvailableIndicator= iNetworkInfoV8->At(0).iEgprsAvailableIndicator; - iPhone->ReqCompleted(iCurrNetChangeNoLocV5NotificationReqHandle,KErrNone); - } - - if(iCurrNetChangeNoLocV8NotificationPending) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV8 (No Location)"); - iCurrNetChangeNoLocV8NotificationPending = EFalse; - RMobilePhone::TMobilePhoneNetworkInfoV8* changeNetInfoV8 = reinterpret_cast(iCurrNetChangeNoLocV8NotificationNetInfo); - - PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV8); - //also set v8 paramaters - changeNetInfoV8->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; - changeNetInfoV8->iHsdpaAvailableIndicator= iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; - changeNetInfoV8->iEgprsAvailableIndicator= iNetworkInfoV8->At(0).iEgprsAvailableIndicator; - changeNetInfoV8->iHsupaAvailableIndicator= iNetworkInfoV8->At(0).iHsupaAvailableIndicator; - iPhone->ReqCompleted(iCurrNetChangeNoLocV8NotificationReqHandle,KErrNone); - } - } - - iRegStatTimer->Start(iRegStatusInfo->At(iRegStatIndex).iDuration,this,ETimerIdNtwkStatRegStat); - } - -void CSimNetworkStatus::TimerCallBackNitz() -/** - * The NITZ timer callback function. This function will be called when the NITZ timer - * completes. It indicates a simulated new NITZ information event. So, the new - * NITZ settings must be loaded into the relevant NITZ member variables and any - * pending NITZ notification requests must be completed. - * Finally, the next NITZ timer is started. - */ - { - iNitzIndex++; - if(iNitzInfo->Count()<=iNitzIndex) - return; - - iCurrentNitzInfo=iNitzInfo->At(iNitzIndex).iNitz; - - if(iNitzChangeNotificationPending) - { - iNitzChangeNotificationPending=EFalse; - *iNitzChangeNotificationInfo=iCurrentNitzInfo; - PopulateNitzNetworkNames(*iNitzChangeNotificationInfo); - iPhone->ReqCompleted(iNitzChangeNotificationReqHandle,KErrNone); - } - - iNitzTimer->Start(iNitzInfo->At(iNitzIndex).iDuration,this,ETimerIdNtwkStatNitz); - } - -void CSimNetworkStatus::TimerCallBackRadioModeL() -/** - * The RadioMode timer callback function. This function will be called when the RadioMode timer - * completes. - */ - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRadioModeL"); - iRadioModeIndex++; - if(iRadioModeInfo->Count()<=iRadioModeIndex) - { - LOGNETWORK1("CSimNetworkStatus::TimerCallBackRadioModeL returning, no more config"); - return; - } - - iRadioMode=iRadioModeInfo->At(iRadioModeIndex); - if(iRadioMode.iRadioOn==EFalse) - { - RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOff); - LOGNETWORK1("Radio Mode = OFF (config duration passed)"); - } - else - { - RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOn); - LOGNETWORK1("Radio Mode = ON (config duration passed)"); - } - - LOGNETWORK2("Next radio Mode duration = %d (from config)", iRadioModeInfo->At(iRadioModeIndex).iDuration); - iRadioModeTimer->Start(iRadioModeInfo->At(iRadioModeIndex).iDuration,this,ETimerIdNtwkStatRadioMode); - } - -void CSimNetworkStatus::PopulateNetworkInfoV1(TInt aIndex,RMobilePhone::TMobilePhoneNetworkInfoV1& aNetInfo) -/** - * A helper function to copy network information structures. - */ - { - RMobilePhone::TMobilePhoneNetworkInfoV1& curNetnfo=reinterpret_cast(iNetworkInfo->At(aIndex)); - aNetInfo.iMode = curNetnfo.iMode; - aNetInfo.iStatus = curNetnfo.iStatus; - aNetInfo.iBandInfo = curNetnfo.iBandInfo; - aNetInfo.iCountryCode = curNetnfo.iCountryCode; - //aNetInfo.iCdmaSID = curNetnfo.iCdmaSID; - aNetInfo.iAnalogSID = curNetnfo.iAnalogSID; - aNetInfo.iNetworkId = curNetnfo.iNetworkId; - aNetInfo.iDisplayTag = curNetnfo.iDisplayTag; - aNetInfo.iShortName = curNetnfo.iShortName; - aNetInfo.iLongName = curNetnfo.iLongName; - } - -void CSimNetworkStatus::PopulateEtel3rdPartyNetworkInfoV1(TInt aIndex,RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1& aNetInfo) -/** - * A helper function to copy network information structures. - */ - { - RMobilePhone::TMobilePhoneNetworkInfoV2& curNetnfo=iNetworkInfo->At(aIndex); - aNetInfo.iMode = curNetnfo.iMode; - aNetInfo.iStatus = curNetnfo.iStatus; - aNetInfo.iBandInfo = curNetnfo.iBandInfo; - aNetInfo.iCountryCode = curNetnfo.iCountryCode; - //aNetInfo.iCdmaSID = curNetnfo.iCdmaSID; - aNetInfo.iNetworkId = curNetnfo.iNetworkId; - aNetInfo.iDisplayTag = curNetnfo.iDisplayTag; - aNetInfo.iShortName = curNetnfo.iShortName; - aNetInfo.iLongName = curNetnfo.iLongName; - aNetInfo.iAccess = curNetnfo.iAccess; - } - -RMobilePhone::TMobilePhoneNetworkStatus CSimNetworkStatus::NetWorkStatus() -/** -* A helper function that returns the network status; -*/ - { - if(!iNetworkInfo || (iCurrentNetworkIndex==KErrNotFound)) - { - return RMobilePhone::ENetworkStatusUnknown; - } - return iNetworkInfo->At(iCurrentNetworkIndex).iStatus; - } - -void CSimNetworkStatus::PopulateNitzNetworkNames(RMobilePhone::TMobilePhoneNITZ& aNitz) -/** - * A helper function to populate the long and short network name fields in the NITZ - * data structures. These are taken from the current network settings. If no network - * name information is available this is indicated in the "NITZ fields used" structure. - * @param aNitz The NITZ data structure which must be populated with network name - * information. - */ - { - if((iNetworkInfo->Count()>0)&&(iRegStatusInfo->Count()>0)) - { - if(iCurrentNetworkIndex>=0) - { - aNitz.iShortNetworkId.Copy(iNetworkInfo->At(iCurrentNetworkIndex).iShortName); - aNitz.iLongNetworkId.Copy(iNetworkInfo->At(iCurrentNetworkIndex).iLongName); - aNitz.iNitzFieldsUsed|= (RMobilePhone::KCapsShortNameAvailable - |RMobilePhone::KCapsLongNameAvailable); - } - } - } - -TInt CSimNetworkStatus::GetCurrentServiceProvider(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Completes the request to get the current service provider name - */ - { - RMobilePhone::TMobilePhoneServiceProviderNameV2Pckg* currentSPPckg=(RMobilePhone::TMobilePhoneServiceProviderNameV2Pckg*)aPckg; - RMobilePhone::TMobilePhoneServiceProviderNameV2& currenSP=(*currentSPPckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(currenSP); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - currenSP = iServiceProvider; - - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::GetCurrentNetworkName(TTsyReqHandle aReqHandle,TDes8* aNetworkName, TDes8* aLocInfo) -/** - * Completes request to get current network name. - */ - { - if(iRegStatusInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - if(iCurrentNetworkIndex==KErrNotFound) - { - iPhone->ReqCompleted(aReqHandle,KErrNotFound); - return KErrNone; - } - - RMobilePhone::TMobilePhoneNetworkNameV3Pckg* networknamePckg=REINTERPRET_CAST(RMobilePhone::TMobilePhoneNetworkNameV3Pckg*, aNetworkName); - RMobilePhone::TMobilePhoneNetworkNameV3& networkname=(*networknamePckg)(); - - // Check that the data structure is supported by the simulated TSY version - TInt err = iPhone->CheckSimTsyVersion(networkname); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - RMobilePhone::TMobilePhoneOPlmnV3Pckg* locInfoPckg=REINTERPRET_CAST(RMobilePhone::TMobilePhoneOPlmnV3Pckg*, aLocInfo); - RMobilePhone::TMobilePhoneOPlmnV3& locInfo=(*locInfoPckg)(); - - // Check that the data structure is supported by the simulated TSY version - err = iPhone->CheckSimTsyVersion(locInfo); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - //use the current network info to populate the current networkname details. - RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork = reinterpret_cast(iNetworkInfo->At(iCurrentNetworkIndex)); - - // Check that the data structure is supported by the simulated TSY version - err = iPhone->CheckSimTsyVersion(currentNetwork); - if(err != KErrNone) - { - iPhone->ReqCompleted(aReqHandle, err); - return KErrNone; - } - - - networkname.iLongName.Copy(currentNetwork.iLongName); - networkname.iShortName.Copy(currentNetwork.iShortName); - networkname.iOtherNames.Zero(); - - locInfo.iCountryCode = currentNetwork.iCountryCode; - locInfo.iFirstLocationAreaCode = KFirstLACDefault; - locInfo.iLastLocationAreaCode = KLastLACDefault; - locInfo.iNetworkId = currentNetwork.iNetworkId; - locInfo.iPNNid = 0; //set to 0 so that it does not require a lookup in the TMobilePhoneOPlmnV3.iOtherNames field for display name - which is emtpy. - - iPhone->ReqCompleted(aReqHandle,KErrNone); - - return KErrNone; - } -const CTestConfigSection* CSimNetworkStatus::CfgFile() -/** - * Returns a pointer to the current configuration file section. - * - * @return CTestConfigSection A pointer to the current configuration file data section. - */ - { - return iPhone->CfgFile(); - } - -void CSimNetworkStatus::PubSubCallback(TInt aRegStat) -/** - * Called by CSimNetStatChange when a network registration status change request has been received. - * - * @param aNewVal The new network registration value (number of bars) - */ - { - if (iCurrentRegStatus == aRegStat) - { - return; - } - - iCurrentRegStatus = aRegStat; - - // Ask phone to check if indicator notification needs to be triggered - iPhone->CheckIndicatorNotification(); - - if(iRegStatChangeNotificationPending) - { - iRegStatChangeNotificationPending=EFalse; - *iRegStatChangeNotificationRegStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)iCurrentRegStatus; - iPhone->ReqCompleted(iRegStatChangeNotificationReqHandle,KErrNone); - } - } - -TInt CSimNetworkStatus::GetCellInfo(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Retrieve the current Cell information. - * It will be updated from CellInfo tags in the configuration file. If no cell - * information is contained in the configuration file KErrNotSupported - * will be returned. - * @param aReqHandle The request handle associated with this request. - * @param aPckg The first parameter package. This will be populated with the - * cell information to be returned. - * @return TInt Standard error value. - */ - { - TPckg* cellInfoPckg=(TPckg*)aPckg; - RMobilePhone::TMobilePhoneCellInfoV9& cellInfo=(*cellInfoPckg)(); - - if(iCellInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - cellInfo=iCurrentCellInfo; - iPhone->ReqCompleted(aReqHandle,KErrNone); - return KErrNone; - } - -TInt CSimNetworkStatus::NotifyCellInfoChange(TTsyReqHandle aReqHandle,TDes8* aPckg) -/** - * Register a client's interest in being notified when cell information is received. - * This function records the request's parameters and awaits a cell information event, as - * scheduled by the "CellInfo" tags in the configuration file. - * - * @param aPckg The first parameter package. This is populated with the cell - * information when the request completes. - * @return TInt Standard error value. - */ - { - TPckg* cellInfoPckg=(TPckg*)aPckg; - RMobilePhone::TMobilePhoneCellInfoV9& cellInfo=(*cellInfoPckg)(); - - if(iCellInfo->Count()==0) - { - iPhone->ReqCompleted(aReqHandle,KErrNotSupported); - return KErrNone; - } - - iCellInfoChangeNotificationPending=ETrue; - iCellInfoChangeNotificationReqHandle=aReqHandle; - iCellInfoChangeNotificationInfo=&cellInfo; - return KErrNone; - } - -void CSimNetworkStatus::NotifyCellInfoChangeCancel(TTsyReqHandle aTsyReqHandle) -/** - * Cancel a previous request to be notified of new cell informations. - * @param aTsyReqHandle request handle - */ - { - if((iCellInfoChangeNotificationPending) && (aTsyReqHandle == iCellInfoChangeNotificationReqHandle)) - { - iCellInfoChangeNotificationPending=EFalse; - iPhone->ReqCompleted(aTsyReqHandle,KErrCancel); - } - } - -void CSimNetworkStatus::TimerCallBackCellInfo() -/** - * The CellInfo timer callback function. This function will be called when the cell info timer - * completes. It indicates a simulated new cell info information event. So, the new - * cell info settings must be loaded into the relevant cell info member variables and any - * pending cell info notification requests must be completed. - * Finally, the next cell info timer is started. - */ - { - iCellInfoIndex++; - if(iCellInfo->Count()<=iCellInfoIndex) - return; - - iCurrentCellInfo=iCellInfo->At(iCellInfoIndex).iInfo; - - if(iCellInfoChangeNotificationPending) - { - iCellInfoChangeNotificationPending=EFalse; - *iCellInfoChangeNotificationInfo=iCurrentCellInfo; - iPhone->ReqCompleted(iCellInfoChangeNotificationReqHandle,KErrNone); - } - - iCellInfoTimer->Start(iCellInfo->At(iCellInfoIndex).iDuration,this,ETimerIdCellInfo); - } +// 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: +// Implements the functionality required to provide clients with +// network status, registration and NITZ information. +// +// + +/** + @file +*/ + +#include +#include +#include +#include "CSimNetworkStatus.h" +#include "CSimPhone.h" +#include "Simlog.h" +#include "CSimPubSubChange.h" +#include "CSimTsyMode.h" +#include "etelmmerr.h" +#include "CSimPubSub.h" +#include "simtsyglobalproperties.h" + +const TInt KSettingListGranularity=5; // < The granularity used for parameter list arrays. + +// Timer values +const TInt KNetStatTimeoutDefault=1; + +CSimNetworkStatus* CSimNetworkStatus::NewL(CSimPhone* aPhone) +/** + * Standard two-phase constructor. + * @param aPhone The parent phone object. + * @return CSimNetworkStatus The new network status class. + */ + { + CSimNetworkStatus* self=new(ELeave) CSimNetworkStatus(aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CSimNetworkStatus::CSimNetworkStatus(CSimPhone* aPhone) + : iPhone(aPhone) +/** + * Trivial first phase construction. + * @param aPhone The parent phone object. + */ + { + iCurrNetChangeV1NotificationPending = EFalse; + iCurrNetChangeV2NotificationPending = EFalse; + iCurrNetChangeEtelIsvNotificationPending = EFalse; + iCurrNetChangeNoLocV1NotificationPending = EFalse; + iCurrNetChangeNoLocV2NotificationPending = EFalse; + iCurrNetChangeV5NotificationPending = EFalse; + iCurrNetChangeV8NotificationPending = EFalse; + iCurrNetChangeNoLocV5NotificationPending = EFalse; + iCurrNetChangeNoLocV8NotificationPending = EFalse; + iCurrentNetworkChangeLocationAreaNotificationPending = EFalse; + + iRoamStatGetTimeout = KNetStatTimeoutDefault; + + iRoamStatTimer = NULL; + iRoamStatGetClients = NULL; + iRoamStatNotifyClients = NULL; + } + +void CSimNetworkStatus::ConstructL() +/** + * Second phase construction. Create instances of the necessary heap-based + * objects and read in the network, Network Registration and NITZ information + * from the configuration file. + * If any network registration status tags have been read, the initial values + * will be loaded and the network registration timer started. + * Similarly, if any NITZ tags have been read, the initial NITZ values will be loaded + * and the NITZ timer started. + * + * Entries in the configuration file will take the following formats: + * + * "NetworkInfo= , , , , , " + * A number of these tags may be included to create a list of Network Information + * that can be used via the RegStatus tag during the test. + * "LocationArea= , , " + * that can be used via the RegStatus tag during the test. + * + * "RegStatus= , , " + * The RegistrationStatus is taken from the RMoiblePhone::TMobilePhoneRegistrationStatus + * enumeration. The NetworkIndex is a reference to the NetworkInfo list. + * A number of these tags may be included to create a Network Registration Profile. + * + * "NitzInfo= , , , , , , , , + * , " + * A number of these tags may be included to create a NITZ Profile. + * + * "CellInfo= , , , , " + * A number of these tags may be included to create a Cell Information Profile. + */ + { + LOGNETWORK1("Starting to parse Network Status config parameters..."); + iRegStatTimer=CSimTimer::NewL(iPhone); + iNitzTimer=CSimTimer::NewL(iPhone); + iRadioModeTimer=CSimTimer::NewL(iPhone); + iCellInfoTimer=CSimTimer::NewL(iPhone); + + iRegStatusInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); + iNetworkInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); + iNetworkInfoV8=new(ELeave) CArrayFixFlat(KSettingListGranularity); + iNitzInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); + iRadioModeInfo=new(ELeave) CArrayFixFlat(KSettingListGranularity); + iCellInfo = new (ELeave)CArrayFixFlat(KSettingListGranularity); + iLocationArea = new (ELeave)CArrayFixFlat(KSettingListGranularity); + + TInt count; + count=CfgFile()->ItemCount(KNetworkInfo); + const CTestConfigItem* item=NULL; + TInt ret=KErrNone; + + TInt i; + for(i=0;iItem(KNetworkInfo,i); + if(!item) + break; + + TPtrC8 countryCode,networkIdentify,displayTag,longName,shortName; + TInt status; + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,countryCode); + if(ret!=KErrNone) + { + LOGPARSERR("countryCode",ret,0,&KNetworkInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,networkIdentify); + if(ret!=KErrNone) + { + LOGPARSERR("networkIdentify",ret,1,&KNetworkInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,displayTag); + if(ret!=KErrNone) + { + LOGPARSERR("displayTag",ret,2,&KNetworkInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,shortName); + if(ret!=KErrNone) + { + LOGPARSERR("shortName",ret,3,&KNetworkInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,longName); + if(ret!=KErrNone) + { + LOGPARSERR("longName",ret,4,&KNetworkInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,status); + if(ret!=KErrNone) + { + LOGPARSERR("status",ret,5,&KNetworkInfo); + continue; + } + RMobilePhone::TMobilePhoneNetworkInfoV2 networkInfo; + RMobilePhone::TMobilePhoneNetworkInfoV8 networkInfoV8; + + TInt mode; + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,mode); + if(ret!=KErrNone) + { + // It's ok, this element is optional. Assume that the + // config file is old, and default mode to GSM + mode = RMobilePhone::ENetworkModeGsm; + } + networkInfo.iMode=RMobilePhone::TMobilePhoneNetworkMode(mode); + + networkInfo.iStatus=RMobilePhone::TMobilePhoneNetworkStatus(status); + networkInfo.iBandInfo=RMobilePhone::EBandUnknown; + networkInfo.iCountryCode.Copy(countryCode); + networkInfo.iAnalogSID.SetLength(0); + networkInfo.iNetworkId.Copy(networkIdentify); + networkInfo.iDisplayTag.Copy(displayTag); + + TInt maxLength = networkInfo.iShortName.MaxLength(); + if (shortName.Length() > maxLength) + { + networkInfo.iShortName.Copy(shortName.Left(maxLength)); + } + else + { + networkInfo.iShortName.Copy(shortName); + } + + maxLength = networkInfo.iLongName.MaxLength(); + if (longName.Length() > maxLength) + { + networkInfo.iLongName.Copy(longName.Left(maxLength)); + } + else + { + networkInfo.iLongName.Copy(longName); + } + + networkInfo.iAccess = RMobilePhone::ENetworkAccessGsm; + networkInfoV8.iHsdpaAvailableIndicator=EFalse; + networkInfoV8.iEgprsAvailableIndicator=EFalse; + networkInfoV8.iHsupaAvailableIndicator=ETrue; + iNetworkInfo->AppendL(networkInfo); + iNetworkInfoV8->AppendL(networkInfoV8); + } + + +// Read in the Registration status profile. + count=CfgFile()->ItemCount(KRegStatus); + item=NULL; + for(i=0;iItem(KRegStatus,i); + if(!item) + break; + + TInt duration,regStat,networkIndex; + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); + if(ret!=KErrNone) + { + LOGPARSERR("duration",ret,0,&KRegStatus); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,regStat); + if(ret!=KErrNone) + { + LOGPARSERR("regStat",ret,1,&KRegStatus); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,networkIndex); + if(ret!=KErrNone) + networkIndex=KErrNotFound; // Network Index is optional. + + TRegStatus regStatus; + regStatus.iDuration=duration; + regStatus.iRegStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)regStat; + regStatus.iNetworkInfoIndex=networkIndex; + iRegStatusInfo->AppendL(regStatus); + } + + count=CfgFile()->ItemCount(KRadioMode); + item=NULL; + for(i=0;iItem(KRadioMode,i); + if(!item) + break; + + TInt duration,radioStatus; + + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); + if(ret!=KErrNone) + { + LOGPARSERR("duration",ret,0,&KRadioMode); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,radioStatus); + if(ret!=KErrNone) + { + LOGPARSERR("radioStatus",ret,1,&KRadioMode); + continue; + } + + + TRadioMode radioMode; + radioMode.iDuration=duration; + radioMode.iRadioOn=(TBool)radioStatus; + iRadioModeInfo->AppendL(radioMode); + } + +// Read the NITZ information + count=CfgFile()->ItemCount(KNitzInfo); + item=NULL; + for(i=0;iItem(KNitzInfo,i); + if(!item) + break; + + TInt duration,year,month,day,hour,min,sec,microsec,tz,dst; + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); + if(ret!=KErrNone) + { + LOGPARSERR("duration",ret,0,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,year); + if(ret!=KErrNone) + { + LOGPARSERR("year",ret,1,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,month); + if(ret!=KErrNone) + { + LOGPARSERR("month",ret,2,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,day); + if(ret!=KErrNone) + { + LOGPARSERR("day",ret,3,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,hour); + if(ret!=KErrNone) + { + LOGPARSERR("hour",ret,4,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,min); + if(ret!=KErrNone) + { + LOGPARSERR("min",ret,5,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,sec); + if(ret!=KErrNone) + { + LOGPARSERR("sec",ret,6,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,microsec); + if(ret!=KErrNone) + { + LOGPARSERR("microsec",ret,7,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,tz); + if(ret!=KErrNone) + { + LOGPARSERR("tz",ret,8,&KNitzInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,dst); + if(ret!=KErrNone) + { + LOGPARSERR("dst",ret,9,&KNitzInfo); + continue; + } + + RMobilePhone::TMobilePhoneNITZ nitzInfo(year,(TMonth)month,day,hour,min,sec,microsec); + nitzInfo.iTimeZone=tz; + nitzInfo.iDST=dst; + nitzInfo.iNitzFieldsUsed= (RMobilePhone::KCapsTimeAvailable + |RMobilePhone::KCapsTimezoneAvailable + |RMobilePhone::KCapsDSTAvailable); + + TNitzInfoAndDuration nitzInfoAndDuration; + nitzInfoAndDuration.iNitz=nitzInfo; + nitzInfoAndDuration.iDuration=duration; + iNitzInfo->AppendL(nitzInfoAndDuration); + } + + // Read the Cell Info information + count=CfgFile()->ItemCount(KCellInfo); + item=NULL; + for(i=0;iItem(KCellInfo,i); + if(!item) + break; + + TInt duration,mode,cellId,timingAdvance,cellInfoStatus; + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration); + if(ret!=KErrNone) + { + LOGPARSERR("duration",ret,0,&KCellInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,mode); + if(ret!=KErrNone) + { + LOGPARSERR("mode",ret,1,&KCellInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,cellId); + if(ret!=KErrNone) + { + LOGPARSERR("cellId",ret,2,&KCellInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,timingAdvance); + if(ret!=KErrNone) + { + LOGPARSERR("timingAdvance",ret,3,&KCellInfo); + continue; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,cellInfoStatus); + if(ret!=KErrNone) + { + LOGPARSERR("cellInfoStatus",ret,3,&KCellInfo); + continue; + } + + TCellInfoAndDuration cellInfoAndDuration; + cellInfoAndDuration.iInfo.iMode = static_cast(mode); + cellInfoAndDuration.iInfo.iCellId = static_cast(cellId); + cellInfoAndDuration.iInfo.iTimingAdvance = static_cast(timingAdvance); + cellInfoAndDuration.iInfo.iStatus = static_cast(cellInfoStatus); + + cellInfoAndDuration.iDuration=duration; + iCellInfo->AppendL(cellInfoAndDuration); + } + + // Read the Location Area information + count=CfgFile()->ItemCount(KLocationArea); + item=NULL; + for(i=0;iItem(KLocationArea,i); + if(!item) + break; + + TBool areaKnown; + TInt locationAreaCode, cellId; + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,areaKnown); + if(ret!=KErrNone) + { + ret = EFalse; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,locationAreaCode); + if(ret!=KErrNone) + { + locationAreaCode = 0; + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,cellId); + if(ret!=KErrNone) + { + cellId = 0; + } + + RMobilePhone::TMobilePhoneLocationAreaV1 locationArea; + locationArea.iAreaKnown = areaKnown; + locationArea.iLocationAreaCode = locationAreaCode; + locationArea.iCellId= cellId; + iLocationArea->AppendL(locationArea); + } + LOGNETWORK1("...Finished parsing Network Status config parameters..."); + +// If present load the first registration status settings and start the registration +// status timer. + if(iRegStatusInfo->Count()!=0) + { + iRegStatIndex=0; + iCurrentRegStatus=iRegStatusInfo->At(0).iRegStatus; + iCurrentNetworkIndex=iRegStatusInfo->At(0).iNetworkInfoIndex; + LOGNETWORK2("Starting ETimerIdNtwkStatRegStat for duration:%d", iRegStatusInfo->At(0).iDuration); + iRegStatTimer->Start(iRegStatusInfo->At(0).iDuration,this,ETimerIdNtwkStatRegStat); + } + +// If present load the first NITZ settings and start the NITZ timer. + if(iNitzInfo->Count()!=0) + { + iNitzIndex=0; + iCurrentNitzInfo=iNitzInfo->At(0).iNitz; + iNitzTimer->Start(iNitzInfo->At(0).iDuration,this,ETimerIdNtwkStatNitz); + } + +// If present load the first Cell Info settings and start the cell info timer. + if(iCellInfo->Count()!=0) + { + iCellInfoIndex=0; + iCurrentCellInfo=iCellInfo->At(0).iInfo; + iCellInfoTimer->Start(iCellInfo->At(0).iDuration,this,ETimerIdCellInfo); + } + + if(iRadioModeInfo->Count()!=0) + { + iRadioModeIndex=0; + iRadioMode.iRadioOn=iRadioModeInfo->At(0).iRadioOn; + if(iRadioMode.iRadioOn==EFalse) + { + RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOff); + LOGNETWORK1("Radio Mode = OFF (from config)"); + } + else + { + RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOn); + LOGNETWORK1("Radio Mode = ON (from config)"); + } + LOGNETWORK2("Radio Mode duration = %d (from config)", iRadioModeInfo->At(0).iDuration); + + iRadioModeTimer->Start(iRadioModeInfo->At(0).iDuration,this,ETimerIdNtwkStatRadioMode); + } + else + { + //default to on + RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOn); + LOGNETWORK1("Radio Mode = ON (no config)"); + } + +//If present read in Service Provider settings + TPtrC8 spname, plmnfield; + TInt displayreq; + item=CfgFile()->Item(KServiceProviderName); + if (item) + { + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,displayreq); + if(ret!=KErrNone) + { + LOGPARSERR("displayreq",ret,0,&KServiceProviderName); + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,spname); + if(ret!=KErrNone) + { + LOGPARSERR("spname",ret,1,&KServiceProviderName); + } + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,plmnfield); + if(ret!=KErrNone) + { + LOGPARSERR("plmnfield",ret,2,&KServiceProviderName); + } + iServiceProvider.iDisplayReq = static_cast(displayreq); + + TInt maxLength = iServiceProvider.iSPName.MaxLength(); + if (spname.Length() > maxLength) + { + iServiceProvider.iSPName.Copy(spname.Left(maxLength)); + } + else + { + iServiceProvider.iSPName.Copy(spname); + } + + maxLength = iServiceProvider.iPLMNField.MaxLength(); + if (plmnfield.Length() > maxLength) + { + iServiceProvider.iPLMNField.Copy(plmnfield.Left(maxLength)); + } + else + { + iServiceProvider.iPLMNField.Copy(plmnfield); + } + } + else + { + iServiceProvider.iDisplayReq = KDisplayReqDefault; + iServiceProvider.iSPName.Copy(KSPNameDefault); + iServiceProvider.iPLMNField.Copy(KPLMNFieldDefault); + } + + iRegStatChange=CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidSimtsyCategoryLocal, KSimtsyRegStatChange, KSimtsyRegStatChangeType)); + //also listen on new P&S uids + iPSRegStatChange=CSimPubSubChange::NewL(this, CSimPubSub::TPubSubProperty(KUidPSSimTsyCategory, KPSSimTsyRegStatChange, KPSSimTsyRegStatChangeKeyType)); + + } + +void CSimNetworkStatus::FindRoamStatSettings() +/** + * Get Roaming Status Configuration + */ + { + const CTestConfigItem* item=NULL; + TInt ret=KErrNone; + + //If present read in Service Provider settings + TInt getTimer; + item=CfgFile()->Item(KRoamStatTimers); + if (item) + { + ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,getTimer); + if(ret!=KErrNone) + { + LOGNETWORK1("WARNING: CSimNetworkStatus::FindRoamStatSettings found ERROR with Config"); + } + iRoamStatGetTimeout = getTimer; + } + } + +void CSimNetworkStatus::SetNetworkMode() +/** + * Initialize iPhone->NetworkMode(). + */ + { + if(iCurrentNetworkIndex != KErrNotFound) + { + if(iNetworkInfo->Count()>iCurrentNetworkIndex) + { + iPhone->UpdateNetworkMode(iNetworkInfo->At(iCurrentNetworkIndex).iMode); + } + } + } + +CSimNetworkStatus::~CSimNetworkStatus() +/** + * Standard destructor. Destroy the heap-based object owned by this object. + */ + { + delete iCellInfoTimer; + delete iNitzTimer; + delete iRegStatTimer; + delete iRegStatChange; + delete iPSRegStatChange; + delete iRadioModeTimer; + if (iCellInfo) + { + iCellInfo->Delete(0,iCellInfo->Count()); + delete iCellInfo; + } + if (iNitzInfo) + { + iNitzInfo->Delete(0,iNitzInfo->Count()); + delete iNitzInfo;//todo check ptr + } + if (iRegStatusInfo) + { + iRegStatusInfo->Delete(0,iRegStatusInfo->Count()); + delete iRegStatusInfo;//todo check ptr + } + if (iNetworkInfo) + { + iNetworkInfo->Delete(0,iNetworkInfo->Count()); + delete iNetworkInfo;//todo check ptr + } + if (iNetworkInfoV8) + { + iNetworkInfoV8->Delete(0,iNetworkInfoV8->Count()); + delete iNetworkInfoV8;//todo check ptr + } + if (iRadioModeInfo) + { + iRadioModeInfo->Delete(0,iRadioModeInfo->Count()); + delete iRadioModeInfo;//todo check ptr + } + if(iLocationArea) + { + iLocationArea->Delete(0,iLocationArea->Count()); + delete iLocationArea; + } + + delete iRoamStatTimer; + if(iRoamStatGetClients) + { + TInt i; + TRoamStatClient client; + for(i=0;iCount();i++) + { + client = iRoamStatGetClients->At(i); + iPhone->ReqCompleted(client.iReqHandle, KErrCancel); + } + iRoamStatGetClients->Reset(); + delete iRoamStatGetClients; + } + if(iRoamStatNotifyClients) + { + TInt i; + TRoamStatClient client; + for(i=0;iCount();i++) + { + client = iRoamStatNotifyClients->At(i); + iPhone->ReqCompleted(client.iReqHandle, KErrCancel); + } + iRoamStatNotifyClients->Reset(); + delete iRoamStatNotifyClients; + } + } + +TInt CSimNetworkStatus::GetNetworkCaps(TTsyReqHandle aReqHandle,TDes8* aPckg1) +/** + * Retrieve the Network Capability information. Network capabilities for this test + * are deduced from the tags, and therefore loaded information, for this test. + * @param aReqHandle The request handle associated with this request. + * @param aPckg1 The first parameter package. This will be populated with the + * capability data to be returned. + * @return TInt Standard error value. + */ +{ + TPckg* networkCapsPckg=(TPckg*)aPckg1; + TUint32& networkCaps=(*networkCapsPckg)(); + + if(iRegStatusInfo->Count()==0) + networkCaps=RMobilePhone::KCapsGetCurrentMode; + else + networkCaps=RMobilePhone::KCapsGetRegistrationStatus | + RMobilePhone::KCapsNotifyRegistrationStatus | + RMobilePhone::KCapsGetCurrentMode | + RMobilePhone::KCapsGetCurrentNetwork | + RMobilePhone::KCapsNotifyCurrentNetwork | + RMobilePhone::KCapsGetHomeNetwork; + + if(iNetworkInfo->Count()>=1) + networkCaps|=RMobilePhone::KCapsGetHomeNetwork; + + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::GetHomeNetwork(TTsyReqHandle aReqHandle,TDes8* aPckg1) +/** + * Retrieve information about the Home Network. The first NetworkInfo tag information + * is taken to be the "home" network. If this information is not present, the + * request is completed with KErrNotSupported. + * @param aReqHandle The request handle associated with this request. + * @param aPckg1 The first parameter package. This will be populated with the + * Home Network information to be returned. + * @return TInt Standard error value.+ + */ + { + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* homeNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TMultimodeType& packagetype = (*homeNetworkPckg)(); + RMobilePhone::TMobilePhoneNetworkInfoV1& homeNetwork=(*homeNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(homeNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + if(iNetworkInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + PopulateNetworkInfoV1(0,homeNetwork); + + if(packagetype.ExtensionId() == KETelExtMultimodeV1 || packagetype.ExtensionId() == KETelExtMultimodeV2 || \ + packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8 ) + { + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* homeNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV1& homeNetwork=(*homeNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(homeNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + PopulateNetworkInfoV1(0,homeNetwork); + + //if V2 package then set its paramters as well + if(packagetype.ExtensionId() == KETelExtMultimodeV2 || packagetype.ExtensionId() == KEtelExtMultimodeV5 || \ + packagetype.ExtensionId() == KEtelExtMultimodeV8) + { + RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* homeNetworkPckgV2=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV2& homeNetworkV2=(*homeNetworkPckgV2)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(homeNetworkV2); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + homeNetworkV2.iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; + + if(packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8) + { + RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* homeNetworkPckgV5=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV5& homeNetworkV5=(*homeNetworkPckgV5)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(homeNetworkV5); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + homeNetworkV5.iHsdpaAvailableIndicator = iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; + homeNetworkV5.iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; + + if(packagetype.ExtensionId() == KEtelExtMultimodeV8) + { + RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* homeNetworkPckgV8=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV8& homeNetworkV8=(*homeNetworkPckgV8)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(homeNetworkV8); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + homeNetworkV8.iHsupaAvailableIndicator = iNetworkInfoV8->At(0).iHsupaAvailableIndicator; + } + } + } + } + else + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::GetCurrentNetwork(TTsyReqHandle aReqHandle,TDes8* aPckg1,TDes8* aPckg2) +/** + * Retrieve information about the Current Network. The current network is given by the + * iCurrentNetworkIndex member variable. It will be updated from RegStat tags in the + * configuration file. If there is no network information currently available (perhaps + * because the SIM TSY is simulating a network search) KErrNotFound will be + * returned. If no registration status profile information is contained in the + * configuration file KErrNotSupported will be returned. + * @param aReqHandle The request handle associated with this request. + * @param aPckg1 The first parameter package. This will be populated with the + * Current Network information to be returned. + * @return TInt Standard error value. + */ + { + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TMultimodeType& packagetype = (*currentNetworkPckg)(); + + if(aPckg2) + { + TPckg* areaPckg=(TPckg*)aPckg2; + RMobilePhone::TMobilePhoneLocationAreaV1& area=(*areaPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(area); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + if((iCurrentNetworkIndex >=0) && (iCurrentNetworkIndex Count())) + { + area.iAreaKnown = iLocationArea->At(iCurrentNetworkIndex).iAreaKnown; + area.iLocationAreaCode = iLocationArea->At(iCurrentNetworkIndex).iLocationAreaCode; + area.iCellId = iLocationArea->At(iCurrentNetworkIndex).iCellId; + } + else + { + area.iAreaKnown=EFalse; // Area information not currently supported. + } + } + + + if(iRegStatusInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + if(iCurrentNetworkIndex==KErrNotFound) + { + iPhone->ReqCompleted(aReqHandle,KErrNotFound); + return KErrNone; + } + + if(packagetype.ExtensionId() == KETelExtMultimodeV1 || packagetype.ExtensionId() == KETelExtMultimodeV2 || \ + packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8 ) + { + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + PopulateNetworkInfoV1(iCurrentNetworkIndex,currentNetwork); + //if V2 package then set its paramters as well + if(currentNetwork.ExtensionId() == KETelExtMultimodeV2 || packagetype.ExtensionId() == KEtelExtMultimodeV5 || \ + packagetype.ExtensionId() == KEtelExtMultimodeV8) + { + RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* currentNetworkPckgV2=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV2& currentNetworkV2=(*currentNetworkPckgV2)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetworkV2); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + currentNetworkV2.iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; + + if(packagetype.ExtensionId() == KEtelExtMultimodeV5 || packagetype.ExtensionId() == KEtelExtMultimodeV8) + { + RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* currentNetworkPckgV5=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV5& currentNetworkV5=(*currentNetworkPckgV5)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetworkV5); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + currentNetworkV5.iHsdpaAvailableIndicator = iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; + currentNetworkV5.iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; + + if(packagetype.ExtensionId() == KEtelExtMultimodeV8) + { + RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* currentNetworkPckgV8=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV8& currentNetworkV8=(*currentNetworkPckgV8)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetworkV8); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + currentNetworkV8.iHsupaAvailableIndicator = iNetworkInfoV8->At(0).iHsupaAvailableIndicator; + } + } + } + } + + else if(packagetype.ExtensionId() == KETelExt3rdPartyV1) + { + RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + PopulateEtel3rdPartyNetworkInfoV1(iCurrentNetworkIndex, currentNetwork); + } + else + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::GetCurrentNetworkNoLocation(TTsyReqHandle aReqHandle,TDes8* aPckg1) +/** + * Retrieve information about the Current Network excluding loation information. The current network is given by the + * iCurrentNetworkIndex member variable. It will be updated from RegStat tags in the + * configuration file. If there is no network information currently available (perhaps + * because the SIM TSY is simulating a network search) KErrNotFound will be + * returned. If no registration status profile information is contained in the + * configuration file KErrNotSupported will be returned. + * @param aReqHandle The request handle associated with this request. + * @param aPckg1 The first parameter package. This will be populated with the + * Current Network information to be returned. This is either a packaged TMobilePhoneNetworkInfoV1 or TMobilePhoneNetworkInfoV2 + * @return TInt Standard error value. + */ + { + return GetCurrentNetwork(aReqHandle, aPckg1, NULL); + } + +TInt CSimNetworkStatus::GetNetworkRegistrationStatus(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Retrieve information about the Current Network Registration Status. This is given by + * the iCurrentRegStatus member variable. It will be updated from RegStat tags in the + * configuration file. If no registration status profile information is contained in the + * configuration file KErrNotSupported will be returned. + * @param aReqHandle The request handle associated with this request. + * @param aPckg1 The first parameter package. This will be populated with the + * Current Network Registration Status to be returned. + * @return TInt Standard error value. + */ + { + TPckg* regStatusPckg=(TPckg*)aPckg; + RMobilePhone::TMobilePhoneRegistrationStatus& regStatus=(*regStatusPckg)(); + + if(iRegStatusInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + regStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)iCurrentRegStatus; + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::NotifyNetworkRegistrationStatusChange(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Register a client's interest in being notified when the Network Registration Status + * changes. + * This function records the request's parameters and awaits a change in network registration + * status before completing. + * + * @param aPckg The first parameter package. This is populated with the network registration + * status. + * @return TInt Standard error value. + */ + { + TPckg* regStatusPckg=(TPckg*)aPckg; + RMobilePhone::TMobilePhoneRegistrationStatus& regStatus=(*regStatusPckg)(); + + if(iRegStatusInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + __ASSERT_ALWAYS(!iRegStatChangeNotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + iRegStatChangeNotificationPending=ETrue; + iRegStatChangeNotificationReqHandle=aReqHandle; + iRegStatChangeNotificationRegStatus=®Status; + return KErrNone; + } + +void CSimNetworkStatus::NotifyNetworkRegistrationStatusChangeCancel() +/** + * Cancel a previous request to be notified of a change in network registration status. + */ + { + if(iRegStatChangeNotificationPending) + { + iRegStatChangeNotificationPending=EFalse; + iPhone->ReqCompleted(iRegStatChangeNotificationReqHandle,KErrCancel); + } + } + +TInt CSimNetworkStatus::NotifyCurrentNetworkChange(TTsyReqHandle aReqHandle,TDes8* aPckg1,TDes8* aPckg2) +/** + * Register a client's interest in being notified when the current network changes. + * This function records the request's parameters and awaits a change in current network + * before completing. + * + * @param aPckg1 The first parameter package. This is populated with the current network + * information when the request completes. + * @return TInt Standard error value. + */ + { + TPckg* areaPckg=(TPckg*)aPckg2; + RMobilePhone::TMobilePhoneLocationAreaV1& area=(*areaPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(area); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + TPckg* paramPckg=(TPckg*)aPckg1; + RMobilePhone::TMultimodeType& paramclass=(*paramPckg)(); + + if(iRegStatusInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + if(paramclass.ExtensionId() == KETelExtMultimodeV1) + { + __ASSERT_ALWAYS(!iCurrNetChangeV1NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeV1NotificationPending=ETrue; + iCurrNetChangeV1NotificationReqHandle=aReqHandle; + iCurrNetChangeV1NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KETelExtMultimodeV2) + { + __ASSERT_ALWAYS(!iCurrNetChangeV2NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV2& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeV2NotificationPending=ETrue; + iCurrNetChangeV2NotificationReqHandle=aReqHandle; + iCurrNetChangeV2NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KEtelExtMultimodeV5) + { + __ASSERT_ALWAYS(!iCurrNetChangeV5NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV5& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeV5NotificationPending=ETrue; + iCurrNetChangeV5NotificationReqHandle=aReqHandle; + iCurrNetChangeV5NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KEtelExtMultimodeV8) + { + __ASSERT_ALWAYS(!iCurrNetChangeV8NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV8& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeV8NotificationPending=ETrue; + iCurrNetChangeV8NotificationReqHandle=aReqHandle; + iCurrNetChangeV8NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KETelExt3rdPartyV1) + { + RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeEtelIsvNotificationPending=ETrue; + iCurrNetChangeEtelIsvNotificationReqHandle=aReqHandle; + iCurrNetChangeEtelIsvNotificationNetInfo=¤tNetwork; + } + else + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + __ASSERT_ALWAYS(!iCurrentNetworkChangeLocationAreaNotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + iCurrentNetworkChangeLocationArea = &area; + iCurrentNetworkChangeLocationAreaNotificationPending = ETrue; + + return KErrNone; + } + +void CSimNetworkStatus::NotifyCurrentNetworkChangeCancel(const TTsyReqHandle aTsyReqHandle) +/** + * Cancel a previous request to be notified of a change in current network. + * @param aTsyReqHandle request handle + */ + { + if(iCurrNetChangeV1NotificationPending && iCurrNetChangeV1NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeV1NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeV1NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeV2NotificationPending && iCurrNetChangeV2NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeV2NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeV2NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeV5NotificationPending && iCurrNetChangeV5NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeV5NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeV5NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeV8NotificationPending && iCurrNetChangeV8NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeV8NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeV8NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeEtelIsvNotificationPending && iCurrNetChangeEtelIsvNotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeEtelIsvNotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeEtelIsvNotificationReqHandle,KErrCancel); + } + iCurrentNetworkChangeLocationAreaNotificationPending = EFalse; + } + +TInt CSimNetworkStatus::NotifyCurrentNetworkNoLocationChange(TTsyReqHandle aReqHandle,TDes8* aPckg1) +/** + * Register an EtelISV client's interest in being notified when the current network changes. + * This function records the request's parameters and awaits a change in current network + * before completing. + * + * @param aPckg1 The first parameter package. This is populated with the current network + * information when the request completes. + * @return TInt Standard error value. + */ + { + TPckg* paramPckg=(TPckg*)aPckg1; + RMobilePhone::TMultimodeType& paramclass=(*paramPckg)(); + + if(iRegStatusInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + if(paramclass.ExtensionId() == KETelExtMultimodeV1) + { + __ASSERT_ALWAYS(!iCurrNetChangeNoLocV1NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV1Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork=(*currentNetworkPckg)(); + + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeNoLocV1NotificationPending=ETrue; + iCurrNetChangeNoLocV1NotificationReqHandle=aReqHandle; + iCurrNetChangeNoLocV1NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KETelExtMultimodeV2) + { + __ASSERT_ALWAYS(!iCurrNetChangeNoLocV2NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV2Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV2Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV2& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeNoLocV2NotificationPending=ETrue; + iCurrNetChangeNoLocV2NotificationReqHandle=aReqHandle; + iCurrNetChangeNoLocV2NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KEtelExtMultimodeV5) + { + __ASSERT_ALWAYS(!iCurrNetChangeNoLocV5NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV5Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV5Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV5& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeNoLocV5NotificationPending=ETrue; + iCurrNetChangeNoLocV5NotificationReqHandle=aReqHandle; + iCurrNetChangeNoLocV5NotificationNetInfo=¤tNetwork; + } + else if(paramclass.ExtensionId() == KEtelExtMultimodeV8) + { + __ASSERT_ALWAYS(!iCurrNetChangeNoLocV8NotificationPending,SimPanic(ENotificationReqAlreadyOutstanding)); + + RMobilePhone::TMobilePhoneNetworkInfoV8Pckg* currentNetworkPckg=(RMobilePhone::TMobilePhoneNetworkInfoV8Pckg*)aPckg1; + RMobilePhone::TMobilePhoneNetworkInfoV8& currentNetwork=(*currentNetworkPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + iCurrNetChangeNoLocV8NotificationPending=ETrue; + iCurrNetChangeNoLocV8NotificationReqHandle=aReqHandle; + iCurrNetChangeNoLocV8NotificationNetInfo=¤tNetwork; + } + else + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + return KErrNone; + } + +void CSimNetworkStatus::NotifyCurrentNetworkNoLocationChangeCancel(const TTsyReqHandle aTsyReqHandle) +/** + * Cancel a previous request from an EtelISV client to be notified of a change in current network. + * @param aTsyReqHandle request handle + */ + { + if(iCurrNetChangeNoLocV1NotificationPending && iCurrNetChangeNoLocV1NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeNoLocV1NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeNoLocV1NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeNoLocV2NotificationPending && iCurrNetChangeNoLocV2NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeNoLocV2NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeNoLocV2NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeNoLocV5NotificationPending && iCurrNetChangeNoLocV5NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeNoLocV5NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeNoLocV5NotificationReqHandle,KErrCancel); + } + else if(iCurrNetChangeNoLocV8NotificationPending && iCurrNetChangeNoLocV8NotificationReqHandle == aTsyReqHandle) + { + iCurrNetChangeNoLocV8NotificationPending=EFalse; + iPhone->ReqCompleted(iCurrNetChangeNoLocV8NotificationReqHandle,KErrCancel); + } + } + +TInt CSimNetworkStatus::GetNITZInfo(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Retrieve the current "Network Information and Time Zone" (NITZ) information. + * It will be updated from NitzInfo tags in the configuration file. If no NITZ + * profile information is contained in the configuration file KErrNotSupported + * will be returned. + * @param aReqHandle The request handle associated with this request. + * @param aPckg The first parameter package. This will be populated with the + * NITZ information to be returned. + * @return TInt Standard error value. + */ + { + TPckg* nitzPckg=(TPckg*)aPckg; + RMobilePhone::TMobilePhoneNITZ& nitz=(*nitzPckg)(); + + if(iNitzInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + nitz=iCurrentNitzInfo; + PopulateNitzNetworkNames(nitz); + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::NotifyNITZInfoChange(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Register a client's interest in being notified when NITZ information is received. + * This function records the request's parameters and awaits a NITZ information event, as + * scheduled by the "NitzInfo" tags in the configuration file. + * + * @param aPckg The first parameter package. This is populated with the NITZ + * information when the request completes. + * @return TInt Standard error value. + */ + { + TPckg* nitzPckg=(TPckg*)aPckg; + RMobilePhone::TMobilePhoneNITZ& nitz=(*nitzPckg)(); + + if(iNitzInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + iNitzChangeNotificationPending=ETrue; + iNitzChangeNotificationReqHandle=aReqHandle; + iNitzChangeNotificationInfo=&nitz; + return KErrNone; + } + +void CSimNetworkStatus::NotifyNITZInfoChangeCancel() +/** + * Cancel a previous request to be notified of new NITZ informations. + */ + { + if(iNitzChangeNotificationPending) + { + iNitzChangeNotificationPending=EFalse; + iPhone->ReqCompleted(iNitzChangeNotificationReqHandle,KErrCancel); + } + } + +void CSimNetworkStatus::TimerCallBack(TInt aId) +/** + * The timer callback function. This function will be called when either the + * Registration Status timer, cell info timer or the NITZ timer complete. The aId parameter + * is used to indicate which timer has completed and the appropriate callback function + * is called. + * @param aId This parameter indicates which timer has completed. The timer ID is + * registered when the timer is started. + */ + { + switch(aId) + { + case ETimerIdNtwkStatRegStat: + TimerCallBackRegStat(); + break; + case ETimerIdNtwkStatNitz: + TimerCallBackNitz(); + break; + case ETimerIdNtwkStatRadioMode: + TInt err; + err = KErrNone; + TRAP(err,TimerCallBackRadioModeL()); + break; + + case ETimerIdNtwkStatRoamStat: + SimPanic(EIllegalCallBackId); + break; + case ETimerIdCellInfo: + TimerCallBackCellInfo(); + break; + default: + LOGNETWORK3("CSimNetworkStatus::TimerCallBack(%d), OOR [%d]",aId, ETimerIdNtwkStatRegStat); + SimPanic(EIllegalCallBackId); + break; + } + } + +void CSimNetworkStatus::TimerCallBackRegStat() +/** + * The Registration timer callback function. This function will be called when the + * Network Registration timer completes. It indicates a simulated change in registration + * status. So, the new network settings must be loaded into the relevant member variables + * and any pending registration notification requests must be completed. + * Finally, the next Network Registration timer is started. + */ + { + iRegStatIndex++; + if(iRegStatusInfo->Count()<=iRegStatIndex) + return; + + TInt oldNetworkIndex=iCurrentNetworkIndex; + iCurrentRegStatus=iRegStatusInfo->At(iRegStatIndex).iRegStatus; + iCurrentNetworkIndex=iRegStatusInfo->At(iRegStatIndex).iNetworkInfoIndex; + + // Ask phone to check if indicator notification needs to be triggered + iPhone->CheckIndicatorNotification(); + + if(iRegStatChangeNotificationPending) + { + iRegStatChangeNotificationPending=EFalse; + *iRegStatChangeNotificationRegStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)iCurrentRegStatus; + iPhone->ReqCompleted(iRegStatChangeNotificationReqHandle,KErrNone); + } + if(oldNetworkIndex!=iCurrentNetworkIndex && iCurrentNetworkIndex>=0) + { + if(iCurrentNetworkChangeLocationAreaNotificationPending) + { + if((iCurrentNetworkIndex >= 0) &&(iCurrentNetworkIndex < iLocationArea->Count())) + { + iCurrentNetworkChangeLocationArea->iAreaKnown = iLocationArea->At(iCurrentNetworkIndex).iAreaKnown; + iCurrentNetworkChangeLocationArea->iLocationAreaCode = iLocationArea->At(iCurrentNetworkIndex).iLocationAreaCode; + iCurrentNetworkChangeLocationArea->iCellId = iLocationArea->At(iCurrentNetworkIndex).iCellId; + } + else + { + iCurrentNetworkChangeLocationArea->iAreaKnown = EFalse; + } + iCurrentNetworkChangeLocationAreaNotificationPending=EFalse; + } + if(iCurrNetChangeV1NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV1"); + iCurrNetChangeV1NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV1* changeNetInfoV1 = reinterpret_cast(iCurrNetChangeV1NotificationNetInfo); + + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV1); + iPhone->ReqCompleted(iCurrNetChangeV1NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeV2NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV2"); + iCurrNetChangeV2NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV2* changeNetInfoV2 = reinterpret_cast(iCurrNetChangeV2NotificationNetInfo); + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV2); + //also set v2 paramaters + changeNetInfoV2->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; + iPhone->ReqCompleted(iCurrNetChangeV2NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeV5NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV5"); + iCurrNetChangeV5NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV5* changeNetInfoV5 = reinterpret_cast(iCurrNetChangeV5NotificationNetInfo); + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV5); + //also set v5 paramaters + changeNetInfoV5->iAccess = iNetworkInfoV8->At(0).iAccess; + changeNetInfoV5->iHsdpaAvailableIndicator= iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; + changeNetInfoV5->iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; + iPhone->ReqCompleted(iCurrNetChangeV5NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeV8NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV8"); + iCurrNetChangeV8NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV8* changeNetInfoV8 = reinterpret_cast(iCurrNetChangeV8NotificationNetInfo); + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV8); + //also set v5 paramaters + changeNetInfoV8->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; + changeNetInfoV8->iHsdpaAvailableIndicator = iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; + changeNetInfoV8->iEgprsAvailableIndicator = iNetworkInfoV8->At(0).iEgprsAvailableIndicator; + changeNetInfoV8->iHsupaAvailableIndicator = iNetworkInfoV8->At(0).iHsupaAvailableIndicator; + iPhone->ReqCompleted(iCurrNetChangeV8NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeEtelIsvNotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TEtel3rdPartyMobileNetworkInfoV1"); + iCurrNetChangeEtelIsvNotificationPending = EFalse; + RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1* changeNetInfoEtelIsv = reinterpret_cast(iCurrNetChangeEtelIsvNotificationNetInfo); + + PopulateEtel3rdPartyNetworkInfoV1(iCurrentNetworkIndex, *changeNetInfoEtelIsv); + iPhone->ReqCompleted(iCurrNetChangeEtelIsvNotificationReqHandle,KErrNone); + } + if(iCurrNetChangeNoLocV1NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV1 (No Location)"); + iCurrNetChangeNoLocV1NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV1* changeNetInfoV1 = reinterpret_cast(iCurrNetChangeNoLocV1NotificationNetInfo); + + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV1); + iPhone->ReqCompleted(iCurrNetChangeNoLocV1NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeNoLocV2NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV2 (No Location)"); + iCurrNetChangeNoLocV2NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV2* changeNetInfoV2 = reinterpret_cast(iCurrNetChangeNoLocV2NotificationNetInfo); + + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV2); + //also set v2 paramaters + changeNetInfoV2->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; + iPhone->ReqCompleted(iCurrNetChangeNoLocV2NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeNoLocV5NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV5 (No Location)"); + iCurrNetChangeNoLocV5NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV5* changeNetInfoV5 = reinterpret_cast(iCurrNetChangeNoLocV5NotificationNetInfo); + + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV5); + //also set v5 paramaters + changeNetInfoV5->iAccess = iNetworkInfoV8->At(0).iAccess; + changeNetInfoV5->iHsdpaAvailableIndicator= iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; + changeNetInfoV5->iEgprsAvailableIndicator= iNetworkInfoV8->At(0).iEgprsAvailableIndicator; + iPhone->ReqCompleted(iCurrNetChangeNoLocV5NotificationReqHandle,KErrNone); + } + + if(iCurrNetChangeNoLocV8NotificationPending) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV8 (No Location)"); + iCurrNetChangeNoLocV8NotificationPending = EFalse; + RMobilePhone::TMobilePhoneNetworkInfoV8* changeNetInfoV8 = reinterpret_cast(iCurrNetChangeNoLocV8NotificationNetInfo); + + PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV8); + //also set v8 paramaters + changeNetInfoV8->iAccess = iNetworkInfo->At(iCurrentNetworkIndex).iAccess; + changeNetInfoV8->iHsdpaAvailableIndicator= iNetworkInfoV8->At(0).iHsdpaAvailableIndicator; + changeNetInfoV8->iEgprsAvailableIndicator= iNetworkInfoV8->At(0).iEgprsAvailableIndicator; + changeNetInfoV8->iHsupaAvailableIndicator= iNetworkInfoV8->At(0).iHsupaAvailableIndicator; + iPhone->ReqCompleted(iCurrNetChangeNoLocV8NotificationReqHandle,KErrNone); + } + } + + iRegStatTimer->Start(iRegStatusInfo->At(iRegStatIndex).iDuration,this,ETimerIdNtwkStatRegStat); + } + +void CSimNetworkStatus::TimerCallBackNitz() +/** + * The NITZ timer callback function. This function will be called when the NITZ timer + * completes. It indicates a simulated new NITZ information event. So, the new + * NITZ settings must be loaded into the relevant NITZ member variables and any + * pending NITZ notification requests must be completed. + * Finally, the next NITZ timer is started. + */ + { + iNitzIndex++; + if(iNitzInfo->Count()<=iNitzIndex) + return; + + iCurrentNitzInfo=iNitzInfo->At(iNitzIndex).iNitz; + + if(iNitzChangeNotificationPending) + { + iNitzChangeNotificationPending=EFalse; + *iNitzChangeNotificationInfo=iCurrentNitzInfo; + PopulateNitzNetworkNames(*iNitzChangeNotificationInfo); + iPhone->ReqCompleted(iNitzChangeNotificationReqHandle,KErrNone); + } + + iNitzTimer->Start(iNitzInfo->At(iNitzIndex).iDuration,this,ETimerIdNtwkStatNitz); + } + +void CSimNetworkStatus::TimerCallBackRadioModeL() +/** + * The RadioMode timer callback function. This function will be called when the RadioMode timer + * completes. + */ + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRadioModeL"); + iRadioModeIndex++; + if(iRadioModeInfo->Count()<=iRadioModeIndex) + { + LOGNETWORK1("CSimNetworkStatus::TimerCallBackRadioModeL returning, no more config"); + return; + } + + iRadioMode=iRadioModeInfo->At(iRadioModeIndex); + if(iRadioMode.iRadioOn==EFalse) + { + RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOff); + LOGNETWORK1("Radio Mode = OFF (config duration passed)"); + } + else + { + RProperty::Set(KUidSystemCategory, KUidPhonePwrValue, ESAPhoneOn); + LOGNETWORK1("Radio Mode = ON (config duration passed)"); + } + + LOGNETWORK2("Next radio Mode duration = %d (from config)", iRadioModeInfo->At(iRadioModeIndex).iDuration); + iRadioModeTimer->Start(iRadioModeInfo->At(iRadioModeIndex).iDuration,this,ETimerIdNtwkStatRadioMode); + } + +void CSimNetworkStatus::PopulateNetworkInfoV1(TInt aIndex,RMobilePhone::TMobilePhoneNetworkInfoV1& aNetInfo) +/** + * A helper function to copy network information structures. + */ + { + RMobilePhone::TMobilePhoneNetworkInfoV1& curNetnfo=reinterpret_cast(iNetworkInfo->At(aIndex)); + aNetInfo.iMode = curNetnfo.iMode; + aNetInfo.iStatus = curNetnfo.iStatus; + aNetInfo.iBandInfo = curNetnfo.iBandInfo; + aNetInfo.iCountryCode = curNetnfo.iCountryCode; + //aNetInfo.iCdmaSID = curNetnfo.iCdmaSID; + aNetInfo.iAnalogSID = curNetnfo.iAnalogSID; + aNetInfo.iNetworkId = curNetnfo.iNetworkId; + aNetInfo.iDisplayTag = curNetnfo.iDisplayTag; + aNetInfo.iShortName = curNetnfo.iShortName; + aNetInfo.iLongName = curNetnfo.iLongName; + } + +void CSimNetworkStatus::PopulateEtel3rdPartyNetworkInfoV1(TInt aIndex,RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1& aNetInfo) +/** + * A helper function to copy network information structures. + */ + { + RMobilePhone::TMobilePhoneNetworkInfoV2& curNetnfo=iNetworkInfo->At(aIndex); + aNetInfo.iMode = curNetnfo.iMode; + aNetInfo.iStatus = curNetnfo.iStatus; + aNetInfo.iBandInfo = curNetnfo.iBandInfo; + aNetInfo.iCountryCode = curNetnfo.iCountryCode; + //aNetInfo.iCdmaSID = curNetnfo.iCdmaSID; + aNetInfo.iNetworkId = curNetnfo.iNetworkId; + aNetInfo.iDisplayTag = curNetnfo.iDisplayTag; + aNetInfo.iShortName = curNetnfo.iShortName; + aNetInfo.iLongName = curNetnfo.iLongName; + aNetInfo.iAccess = curNetnfo.iAccess; + } + +RMobilePhone::TMobilePhoneNetworkStatus CSimNetworkStatus::NetWorkStatus() +/** +* A helper function that returns the network status; +*/ + { + if(!iNetworkInfo || (iCurrentNetworkIndex==KErrNotFound)) + { + return RMobilePhone::ENetworkStatusUnknown; + } + return iNetworkInfo->At(iCurrentNetworkIndex).iStatus; + } + +void CSimNetworkStatus::PopulateNitzNetworkNames(RMobilePhone::TMobilePhoneNITZ& aNitz) +/** + * A helper function to populate the long and short network name fields in the NITZ + * data structures. These are taken from the current network settings. If no network + * name information is available this is indicated in the "NITZ fields used" structure. + * @param aNitz The NITZ data structure which must be populated with network name + * information. + */ + { + if((iNetworkInfo->Count()>0)&&(iRegStatusInfo->Count()>0)) + { + if(iCurrentNetworkIndex>=0) + { + aNitz.iShortNetworkId.Copy(iNetworkInfo->At(iCurrentNetworkIndex).iShortName); + aNitz.iLongNetworkId.Copy(iNetworkInfo->At(iCurrentNetworkIndex).iLongName); + aNitz.iNitzFieldsUsed|= (RMobilePhone::KCapsShortNameAvailable + |RMobilePhone::KCapsLongNameAvailable); + } + } + } + +TInt CSimNetworkStatus::GetCurrentServiceProvider(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Completes the request to get the current service provider name + */ + { + RMobilePhone::TMobilePhoneServiceProviderNameV2Pckg* currentSPPckg=(RMobilePhone::TMobilePhoneServiceProviderNameV2Pckg*)aPckg; + RMobilePhone::TMobilePhoneServiceProviderNameV2& currenSP=(*currentSPPckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(currenSP); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + currenSP = iServiceProvider; + + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::GetCurrentNetworkName(TTsyReqHandle aReqHandle,TDes8* aNetworkName, TDes8* aLocInfo) +/** + * Completes request to get current network name. + */ + { + if(iRegStatusInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + if(iCurrentNetworkIndex==KErrNotFound) + { + iPhone->ReqCompleted(aReqHandle,KErrNotFound); + return KErrNone; + } + + RMobilePhone::TMobilePhoneNetworkNameV3Pckg* networknamePckg=REINTERPRET_CAST(RMobilePhone::TMobilePhoneNetworkNameV3Pckg*, aNetworkName); + RMobilePhone::TMobilePhoneNetworkNameV3& networkname=(*networknamePckg)(); + + // Check that the data structure is supported by the simulated TSY version + TInt err = iPhone->CheckSimTsyVersion(networkname); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + RMobilePhone::TMobilePhoneOPlmnV3Pckg* locInfoPckg=REINTERPRET_CAST(RMobilePhone::TMobilePhoneOPlmnV3Pckg*, aLocInfo); + RMobilePhone::TMobilePhoneOPlmnV3& locInfo=(*locInfoPckg)(); + + // Check that the data structure is supported by the simulated TSY version + err = iPhone->CheckSimTsyVersion(locInfo); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + //use the current network info to populate the current networkname details. + RMobilePhone::TMobilePhoneNetworkInfoV1& currentNetwork = reinterpret_cast(iNetworkInfo->At(iCurrentNetworkIndex)); + + // Check that the data structure is supported by the simulated TSY version + err = iPhone->CheckSimTsyVersion(currentNetwork); + if(err != KErrNone) + { + iPhone->ReqCompleted(aReqHandle, err); + return KErrNone; + } + + + networkname.iLongName.Copy(currentNetwork.iLongName); + networkname.iShortName.Copy(currentNetwork.iShortName); + networkname.iOtherNames.Zero(); + + locInfo.iCountryCode = currentNetwork.iCountryCode; + locInfo.iFirstLocationAreaCode = KFirstLACDefault; + locInfo.iLastLocationAreaCode = KLastLACDefault; + locInfo.iNetworkId = currentNetwork.iNetworkId; + locInfo.iPNNid = 0; //set to 0 so that it does not require a lookup in the TMobilePhoneOPlmnV3.iOtherNames field for display name - which is emtpy. + + iPhone->ReqCompleted(aReqHandle,KErrNone); + + return KErrNone; + } +const CTestConfigSection* CSimNetworkStatus::CfgFile() +/** + * Returns a pointer to the current configuration file section. + * + * @return CTestConfigSection A pointer to the current configuration file data section. + */ + { + return iPhone->CfgFile(); + } + +void CSimNetworkStatus::PubSubCallback(TInt aRegStat) +/** + * Called by CSimNetStatChange when a network registration status change request has been received. + * + * @param aNewVal The new network registration value (number of bars) + */ + { + if (iCurrentRegStatus == aRegStat) + { + return; + } + + iCurrentRegStatus = aRegStat; + + // Ask phone to check if indicator notification needs to be triggered + iPhone->CheckIndicatorNotification(); + + if(iRegStatChangeNotificationPending) + { + iRegStatChangeNotificationPending=EFalse; + *iRegStatChangeNotificationRegStatus=(RMobilePhone::TMobilePhoneRegistrationStatus)iCurrentRegStatus; + iPhone->ReqCompleted(iRegStatChangeNotificationReqHandle,KErrNone); + } + } + +TInt CSimNetworkStatus::GetCellInfo(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Retrieve the current Cell information. + * It will be updated from CellInfo tags in the configuration file. If no cell + * information is contained in the configuration file KErrNotSupported + * will be returned. + * @param aReqHandle The request handle associated with this request. + * @param aPckg The first parameter package. This will be populated with the + * cell information to be returned. + * @return TInt Standard error value. + */ + { + TPckg* cellInfoPckg=(TPckg*)aPckg; + RMobilePhone::TMobilePhoneCellInfoV9& cellInfo=(*cellInfoPckg)(); + + if(iCellInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + cellInfo=iCurrentCellInfo; + iPhone->ReqCompleted(aReqHandle,KErrNone); + return KErrNone; + } + +TInt CSimNetworkStatus::NotifyCellInfoChange(TTsyReqHandle aReqHandle,TDes8* aPckg) +/** + * Register a client's interest in being notified when cell information is received. + * This function records the request's parameters and awaits a cell information event, as + * scheduled by the "CellInfo" tags in the configuration file. + * + * @param aPckg The first parameter package. This is populated with the cell + * information when the request completes. + * @return TInt Standard error value. + */ + { + TPckg* cellInfoPckg=(TPckg*)aPckg; + RMobilePhone::TMobilePhoneCellInfoV9& cellInfo=(*cellInfoPckg)(); + + if(iCellInfo->Count()==0) + { + iPhone->ReqCompleted(aReqHandle,KErrNotSupported); + return KErrNone; + } + + iCellInfoChangeNotificationPending=ETrue; + iCellInfoChangeNotificationReqHandle=aReqHandle; + iCellInfoChangeNotificationInfo=&cellInfo; + return KErrNone; + } + +void CSimNetworkStatus::NotifyCellInfoChangeCancel(TTsyReqHandle aTsyReqHandle) +/** + * Cancel a previous request to be notified of new cell informations. + * @param aTsyReqHandle request handle + */ + { + if((iCellInfoChangeNotificationPending) && (aTsyReqHandle == iCellInfoChangeNotificationReqHandle)) + { + iCellInfoChangeNotificationPending=EFalse; + iPhone->ReqCompleted(aTsyReqHandle,KErrCancel); + } + } + +void CSimNetworkStatus::TimerCallBackCellInfo() +/** + * The CellInfo timer callback function. This function will be called when the cell info timer + * completes. It indicates a simulated new cell info information event. So, the new + * cell info settings must be loaded into the relevant cell info member variables and any + * pending cell info notification requests must be completed. + * Finally, the next cell info timer is started. + */ + { + iCellInfoIndex++; + if(iCellInfo->Count()<=iCellInfoIndex) + return; + + iCurrentCellInfo=iCellInfo->At(iCellInfoIndex).iInfo; + + if(iCellInfoChangeNotificationPending) + { + iCellInfoChangeNotificationPending=EFalse; + *iCellInfoChangeNotificationInfo=iCurrentCellInfo; + iPhone->ReqCompleted(iCellInfoChangeNotificationReqHandle,KErrNone); + } + + iCellInfoTimer->Start(iCellInfo->At(iCellInfoIndex).iDuration,this,ETimerIdCellInfo); + }