// 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 <e32property.h>
#include <testconfigfileparser.h>
#include <sacls.h>
#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= <CountryCode>, <NetworkId>, <DisplayTag>, <NetworkShortName>, <NetworkLongName> , <NetworkAccess> "
* 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= <AreaKnown>, <LocationAreaCode>, <CellId>"
* that can be used via the RegStatus tag during the test.
*
* "RegStatus= <Duration>, <RegistrationStatus>, <NetworkIndex>"
* 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= <Duration>, <Year>, <Month>, <Day>, <Hour>, <Minute>, <Second>, <Microsecond>,
* <Timezone>, <DayTimeSavings>"
* A number of these tags may be included to create a NITZ Profile.
*
* "CellInfo= <Duration>, <mode>, <CellId>, <timingAdvance>, <cellInfoStatus>"
* 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<TRegStatus>(KSettingListGranularity);
iNetworkInfo=new(ELeave) CArrayFixFlat<RMobilePhone::TMobilePhoneNetworkInfoV2>(KSettingListGranularity);
iNetworkInfoV8=new(ELeave) CArrayFixFlat<RMobilePhone::TMobilePhoneNetworkInfoV8>(KSettingListGranularity);
iNitzInfo=new(ELeave) CArrayFixFlat<TNitzInfoAndDuration>(KSettingListGranularity);
iRadioModeInfo=new(ELeave) CArrayFixFlat<TRadioMode>(KSettingListGranularity);
iCellInfo = new (ELeave)CArrayFixFlat<TCellInfoAndDuration>(KSettingListGranularity);
iLocationArea = new (ELeave)CArrayFixFlat<RMobilePhone::TMobilePhoneLocationAreaV1>(KSettingListGranularity);
TInt count;
count=CfgFile()->ItemCount(KNetworkInfo);
const CTestConfigItem* item=NULL;
TInt ret=KErrNone;
TInt i;
for(i=0;i<count;i++)
{
item=CfgFile()->Item(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;i<count;i++)
{
item=CfgFile()->Item(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;i<count;i++)
{
item=CfgFile()->Item(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;i<count;i++)
{
item=CfgFile()->Item(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;i<count;i++)
{
item=CfgFile()->Item(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<RMobilePhone::TCellMode>(mode);
cellInfoAndDuration.iInfo.iCellId = static_cast<TUint>(cellId);
cellInfoAndDuration.iInfo.iTimingAdvance = static_cast<RMobilePhone::TGsmTimingAdvance>(timingAdvance);
cellInfoAndDuration.iInfo.iStatus = static_cast<RMobilePhone::TCellInfoStatus>(cellInfoStatus);
cellInfoAndDuration.iDuration=duration;
iCellInfo->AppendL(cellInfoAndDuration);
}
// Read the Location Area information
count=CfgFile()->ItemCount(KLocationArea);
item=NULL;
for(i=0;i<count;i++)
{
item=CfgFile()->Item(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<RMobilePhone::TDisplayRequirements>(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;i<iRoamStatGetClients->Count();i++)
{
client = iRoamStatGetClients->At(i);
iPhone->ReqCompleted(client.iReqHandle, KErrCancel);
}
iRoamStatGetClients->Reset();
delete iRoamStatGetClients;
}
if(iRoamStatNotifyClients)
{
TInt i;
TRoamStatClient client;
for(i=0;i<iRoamStatNotifyClients->Count();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<TUint32>* networkCapsPckg=(TPckg<TUint32>*)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<RMobilePhone::TMobilePhoneLocationAreaV1>* areaPckg=(TPckg<RMobilePhone::TMobilePhoneLocationAreaV1>*)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 <iLocationArea->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<RMobilePhone::TMobilePhoneRegistrationStatus>* regStatusPckg=(TPckg<RMobilePhone::TMobilePhoneRegistrationStatus>*)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<RMobilePhone::TMobilePhoneRegistrationStatus>* regStatusPckg=(TPckg<RMobilePhone::TMobilePhoneRegistrationStatus>*)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<RMobilePhone::TMobilePhoneLocationAreaV1>* areaPckg=(TPckg<RMobilePhone::TMobilePhoneLocationAreaV1>*)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<RMobilePhone::TMultimodeType>* paramPckg=(TPckg<RMobilePhone::TMultimodeType>*)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<RMobilePhone::TMultimodeType>* paramPckg=(TPckg<RMobilePhone::TMultimodeType>*)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<RMobilePhone::TMobilePhoneNITZ>* nitzPckg=(TPckg<RMobilePhone::TMobilePhoneNITZ>*)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<RMobilePhone::TMobilePhoneNITZ>* nitzPckg=(TPckg<RMobilePhone::TMobilePhoneNITZ>*)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<RMobilePhone::TMobilePhoneNetworkInfoV1*>(iCurrNetChangeV1NotificationNetInfo);
PopulateNetworkInfoV1(iCurrentNetworkIndex,*changeNetInfoV1);
iPhone->ReqCompleted(iCurrNetChangeV1NotificationReqHandle,KErrNone);
}
if(iCurrNetChangeV2NotificationPending)
{
LOGNETWORK1("CSimNetworkStatus::TimerCallBackRegStat() - completing NotifyCurrentNetworkChange TMobilePhoneNetworkInfoV2");
iCurrNetChangeV2NotificationPending = EFalse;
RMobilePhone::TMobilePhoneNetworkInfoV2* changeNetInfoV2 = reinterpret_cast<RMobilePhone::TMobilePhoneNetworkInfoV2*>(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<RMobilePhone::TMobilePhoneNetworkInfoV5*>(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<RMobilePhone::TMobilePhoneNetworkInfoV8*>(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<RMobilePhone::TEtel3rdPartyMobileNetworkInfoV1*>(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<RMobilePhone::TMobilePhoneNetworkInfoV1*>(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<RMobilePhone::TMobilePhoneNetworkInfoV2*>(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<RMobilePhone::TMobilePhoneNetworkInfoV5*>(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<RMobilePhone::TMobilePhoneNetworkInfoV8*>(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<RMobilePhone::TMobilePhoneNetworkInfoV1&>(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<RMobilePhone::TMobilePhoneNetworkInfoV1&>(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<RMobilePhone::TMobilePhoneCellInfoV9>* cellInfoPckg=(TPckg<RMobilePhone::TMobilePhoneCellInfoV9>*)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<RMobilePhone::TMobilePhoneCellInfoV9>* cellInfoPckg=(TPckg<RMobilePhone::TMobilePhoneCellInfoV9>*)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);
}