--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simatktsy/src/CSatNotifyLocalInfo.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,821 @@
+// Copyright (c) 2006-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:
+// Name : CSatNotifyLocalInfo.cpp
+// Part of : Common SIM ATK TSY / commonsimatktsy
+// Local info notification functionality of SAT Tsy
+// Version : 1.0
+//
+
+
+
+//INCLUDES
+#include <satcs.h> // Etel SAT IPC definitions
+#include "CSatTsy.h" // Tsy class header
+#include "CSatNotifyLocalInfo.h" // Class header
+#include "CBerTlv.h" // Ber Tlv data handling
+#include "TTlv.h" // TTlv class
+#include "CSatDataPackage.h" // Parameter packing
+#include "TfLogger.h" // For TFLOGSTRING
+#include "TSatUtility.h" // Utilities
+#include "CSatTsyReqHandleStore.h" // Request handle class
+#include "cmmmessagemanagerbase.h" // Message manager class for forwarding req.
+#include "MSatTsy_IPCDefs.h" // Sat Tsy internal request types
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatNotifyLocalInfo* CSatNotifyLocalInfo::NewL
+ (
+ CSatNotificationsTsy* aNotificationsTsy
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::NewL");
+ CSatNotifyLocalInfo* const satNotifyLocalInfo =
+ new ( ELeave ) CSatNotifyLocalInfo( aNotificationsTsy );
+ CleanupStack::PushL( satNotifyLocalInfo );
+ satNotifyLocalInfo->ConstructL();
+ CleanupStack::Pop( satNotifyLocalInfo );
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::NewL, end of method");
+ return satNotifyLocalInfo;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::~CSatNotifyLocalInfo
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSatNotifyLocalInfo::~CSatNotifyLocalInfo
+ (
+ // None
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::~CSatNotifyLocalInfo");
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CSatNotifyLocalInfo
+// Default C++ constructor
+// -----------------------------------------------------------------------------
+//
+CSatNotifyLocalInfo::CSatNotifyLocalInfo
+ (
+ CSatNotificationsTsy* aNotificationsTsy
+ ) : iTimingAdvance( 0xFF ), iTimeZone( 0xFF ),
+ iMEStatus( KMEIsInTheIdleState ), iCurrentAccTech( 0xFF ),
+ iNotificationsTsy( aNotificationsTsy )
+ {
+ // Set time zone as not available ( 0xFF )
+ // Set timing advance as not available ( 0xFF )
+ // Set ME status as in the idle state ( KMEIsInTheIdleState )
+ // Set current access technology as unknown ( 0xFF )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::ConstructL
+// Symbian 2nd phase constructor
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::ConstructL
+ (
+ // None
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::ConstructL");
+ // IMEI of the ME
+ iIMEI.Zero();
+ // Clear NMR (Network Measurement result)
+ iNMR.Zero();
+ // Clear BCCH channel list
+ iBCCHChannelList.Zero();
+ // Initialize location info data
+ iLocalInformation.iOperatorCode.FillZ( KOperatorCodeLength );
+ iLocalInformation.iLocationAreaCode = 0;
+ iLocalInformation.iCellId = 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::Notify
+// This request allows a client to be notified of a LOCAL INFO proactive
+// command
+// -----------------------------------------------------------------------------
+//
+TInt CSatNotifyLocalInfo::Notify
+ (
+ const TTsyReqHandle aTsyReqHandle,
+ const TDataPackage& aPackage
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::Notify");
+ // Save data pointer to client side for completion
+ iLocalInfoV3Pckg = reinterpret_cast<RSat::TLocalInfoV3Pckg*>(
+ aPackage.Des1n() );
+ // Save the request handle
+ iNotificationsTsy->iSatTsy->SaveReqHandle( aTsyReqHandle,
+ CSatTsy::ESatNotifyLocalInfoPCmdReqType );
+ // Check if requested notification is already pending
+ iNotificationsTsy->NotifySatReadyForNotification( KProvideLocalInformation );
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CancelNotification
+// This method cancels an outstanding asynchronous NotifyLocalInfo request.
+// -----------------------------------------------------------------------------
+//
+TInt CSatNotifyLocalInfo::CancelNotification
+ (
+ const TTsyReqHandle aTsyReqHandle
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CancelNotification");
+ // Reset the request handle
+ iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle(
+ CSatTsy::ESatNotifyLocalInfoPCmdReqType );
+ // Reset the data pointer
+ iLocalInfoV3Pckg = NULL;
+ // Complete the request with KErrCancel
+ iNotificationsTsy->iSatTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteNotifyL
+// This method completes an outstanding asynchronous NotifyLocalInfo request.
+// -----------------------------------------------------------------------------
+//
+TInt CSatNotifyLocalInfo::CompleteNotifyL
+ (
+ CSatDataPackage* aDataPackage,
+ TInt aErrorCode
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteNotifyL");
+
+ TInt ret( KErrNone );
+ TPtrC8* data;
+
+ // Unpack parameters
+ CSatDataPackage dataPackage;
+ aDataPackage->UnPackData( &data );
+ // Clear additional info
+ iLocalInfoRspV3.iAdditionalInfo.Zero();
+ // Get ber tlv
+ CBerTlv berTlv;
+ berTlv.SetData( *data );
+ // Get command details tlv
+ CTlv commandDetails;
+ berTlv.TlvByTagValue( &commandDetails, KTlvCommandDetailsTag );
+ // Store command details tlv
+ iNotificationsTsy->iTerminalRespData.iCommandDetails.Copy(
+ commandDetails.Data() );
+
+ TUint8 pCmdNumber( commandDetails.GetShortInfo( ETLV_CommandNumber ) );
+ // Store pCmdNumber
+ iNotificationsTsy->iTerminalRespData.iPCmdNumber = pCmdNumber;
+
+ switch ( iNotificationsTsy->iTerminalRespData.
+ iCommandDetails[KCommandQualifier] )
+ {
+ case RSat::KProvideLocalInfo:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteNotifyL\
+ request: LOCAL INFO");
+ iLocalInfoIsOngoing = ETrue;
+ // Get Local Info
+ dataPackage.PackData( &iLocalInfoIsOngoing );
+ iNotificationsTsy->iSatTsy->MessageManager()->
+ HandleRequestL( ESatTsyProvideLocalInfo, &dataPackage );
+ break;
+ }
+ case RSat::KProvideLocalInfoImei:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo:: CompleteNotifyL, \
+ request: IMEI");
+ // Check if IMEI is received
+ if ( iIMEI.Length() )
+ {
+ iLocalInfoRspV3.iGeneralResult = RSat::KSuccess;
+ }
+ else
+ {
+ iLocalInfoRspV3.iGeneralResult =
+ RSat::KMeUnableToProcessCmd;
+ iLocalInfoRspV3.iAdditionalInfo.Append(
+ KNoSpecificCauseCanBeGiven );
+ }
+ break;
+ }
+ case RSat::KProvideLocalInformationNmr:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo:: request: NMR");
+ iLocalInfoIsOngoing = ETrue;
+ // Request Network Measurement Results
+ dataPackage.PackData( &iLocalInfoIsOngoing );
+ iNotificationsTsy->iSatTsy->MessageManager()->
+ HandleRequestL( ESatTsyLocalInformationNmr, &dataPackage );
+ break;
+ }
+ case RSat::KProvideLocalInfoDateTimeTimeZone:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo:: request: \
+ DATE/TIME/TIMEZONE");
+ SetDateTimeTimeZone();
+ break;
+ }
+ case RSat::KProvideLocalInfoLanguage:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteNotifyL request, \
+ Language");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle =
+ iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle(
+ CSatTsy::ESatNotifyLocalInfoPCmdReqType );
+
+ if ( CSatTsy::ESatReqHandleUnknown != reqHandle )
+ {
+ if ( KErrNone == aErrorCode )
+ {
+ // Fill the send sm structure
+ RSat::TLocalInfoV3& localInfoV3 = ( *iLocalInfoV3Pckg )();
+
+ // Get command details tlv
+ CTlv deviceIdentities;
+ berTlv.TlvByTagValue( &deviceIdentities,
+ KTlvDeviceIdentityTag );
+
+ localInfoV3.iDevideId = ( RSat::TDeviceId )
+ deviceIdentities.GetShortInfo(
+ ETLV_SourceDeviceIdentity );
+
+ localInfoV3.iInfoType =
+ ( RSat::TLocaInfomationType) iNotificationsTsy->
+ iTerminalRespData.iCommandDetails[KCommandQualifier];
+
+ // Command number
+ localInfoV3.SetPCmdNumber( pCmdNumber );
+ }
+ iNotificationsTsy->iSatTsy->ReqCompleted(
+ reqHandle, aErrorCode );
+ }
+ else
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteNotifyL\
+ No reqHandle");
+ iLocalInfoRspV3.iGeneralResult =
+ RSat::KMeUnableToProcessCmd;
+ iLocalInfoRspV3.iAdditionalInfo.Append(
+ RSat::KNoSpecificMeProblem );
+ TerminalResponseL( NULL );
+ }
+ break;
+ }
+ case RSat::KProvideLocalInfoTimingAdv:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteNotifyL\
+ request: TimingAdvance");
+ iLocalInfoIsOngoing = ETrue;
+ dataPackage.PackData( &iLocalInfoIsOngoing );
+ // Request service
+ iNotificationsTsy->iSatTsy->MessageManager()->
+ HandleRequestL( ESatTsyTimingAdvance, &dataPackage );
+ break;
+ }
+ case RSat::KProvideLocalInfoAccTech:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteNotifyL\
+ request: Access Technology");
+ iLocalInfoIsOngoing = ETrue;
+ dataPackage.PackData( &iLocalInfoIsOngoing );
+ // Request Access technology
+ iNotificationsTsy->iSatTsy->MessageManager()->
+ HandleRequestL( ESatTsyAccTech, &dataPackage );
+ break;
+ }
+ // Currently not supported:
+ case RSat::KProvideLocalInfoESN:
+ {
+ iLocalInfoRspV3.iGeneralResult =
+ RSat::KCmdBeyondMeCapabilities;
+ break;
+ }
+ default:
+ {
+ iLocalInfoRspV3.iGeneralResult = RSat::KCmdTypeNotUnderstood;
+ }
+ }
+
+ if ( ( RSat::KProvideLocalInformationNmr != iNotificationsTsy->
+ iTerminalRespData.iCommandDetails[KCommandQualifier] )
+ && ( RSat::KProvideLocalInfo != iNotificationsTsy->
+ iTerminalRespData.iCommandDetails[KCommandQualifier] )
+ && ( RSat::KProvideLocalInfoTimingAdv != iNotificationsTsy->
+ iTerminalRespData.iCommandDetails[KCommandQualifier] )
+ && ( RSat::KProvideLocalInfoLanguage != iNotificationsTsy->
+ iTerminalRespData.iCommandDetails[KCommandQualifier] )
+ && ( RSat::KProvideLocalInfoAccTech != iNotificationsTsy->
+ iTerminalRespData.iCommandDetails[KCommandQualifier] ) )
+ {
+ // Send terminal response to the NAA
+ TerminalResponseL( NULL );
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::TerminalResponseL
+// Called by ETel server, passes terminal response to DOS
+// -----------------------------------------------------------------------------
+//
+TInt CSatNotifyLocalInfo::TerminalResponseL
+ (
+ TDes8* aRsp
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::TerminalResponseL");
+
+ TInt ret( KErrNone );
+ TBuf<RSat::KAdditionalInfoMaxSize> additionalInfo;
+ if ( aRsp )
+ {
+ RSat::TLocalInfoRspV3Pckg* aRspPckg =
+ reinterpret_cast<RSat::TLocalInfoRspV3Pckg*>( aRsp );
+ RSat::TLocalInfoRspV3& rspV1 = ( *aRspPckg ) ();
+ // Get Proactive command number
+ iNotificationsTsy->iTerminalRespData.iPCmdNumber = rspV1.PCmdNumber();
+ // Check that general result value is valid.
+ if ( ( RSat::KSuccess != rspV1.iGeneralResult )
+ && ( RSat::KSuccessLimitedService != rspV1.iGeneralResult )
+ && ( RSat::KMeUnableToProcessCmd != rspV1.iGeneralResult )
+ && ( RSat::KCmdBeyondMeCapabilities != rspV1.iGeneralResult ) )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::TerminalResponseL,\
+ Invalid General Result");
+ // Invalid general result
+ ret = KErrCorrupt;
+ }
+ else
+ {
+ // Do nothing
+ }
+ iLocalInfoRspV3.iGeneralResult = rspV1.iGeneralResult;
+
+ // If there is ME (Mobile Entity) error, additional info is needed
+ if ( ( RSat::KMeProblem == rspV1.iInfoType ) &&
+ ( NULL == rspV1.iAdditionalInfo.Length() ) )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::TerminalResponseL,\
+ Invalid Additional Info");
+ // Invalid additional info field
+ ret = KErrCorrupt;
+ }
+ else
+ {
+ // Do nothing
+ }
+
+ iLocalInfoRspV3.iAdditionalInfo = rspV1.iAdditionalInfo;
+ }
+ else
+ {
+ // Do nothing
+ }
+
+ additionalInfo.Copy( iLocalInfoRspV3.iAdditionalInfo );
+ CreateTerminalRespL( iNotificationsTsy->iTerminalRespData.iPCmdNumber,
+ static_cast<TUint8>( iLocalInfoRspV3.iGeneralResult ),
+ additionalInfo );
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CreateTerminalRespL
+// Constructs LocalInfo specific part of terminal response and calls
+// DOS to send the actual message.
+// -----------------------------------------------------------------------------
+//
+TInt CSatNotifyLocalInfo::CreateTerminalRespL
+ (
+ TUint8 aPCmdNumber,
+ TUint8 aGeneralResult,
+ TDesC16& aAdditionalInfo
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CreateTerminalRespL");
+ // Create and append response data
+ TTlv tlvSpecificData;
+ // Create General Result TLV
+ tlvSpecificData.AddTag( KTlvResultTag );
+ // General result
+ tlvSpecificData.AddByte( aGeneralResult );
+
+ if ( ( RSat::KSuccess != aGeneralResult ) &&
+ ( RSat::KSuccessLimitedService != aGeneralResult ) )
+ {
+ if ( aAdditionalInfo.Length() )
+ {
+ tlvSpecificData.AddByte( static_cast<TUint8>(
+ ( aAdditionalInfo[0] >> 0 ) & 0xFF ) );
+ }
+ }
+ else
+ {
+ switch ( iNotificationsTsy->iTerminalRespData.
+ iCommandDetails[KCommandQualifier] )
+ {
+ case RSat::KProvideLocalInfo:
+ {
+ // Create Location Information TLV
+ tlvSpecificData.AddTag( KTlvLocationInformationTag );
+ // Append Mobile Country & Network Codes, 3 bytes
+ tlvSpecificData.AddData( iLocalInformation.iOperatorCode );
+ // Append location area code
+ tlvSpecificData.AddByte( static_cast<TUint8>(
+ iLocalInformation.iLocationAreaCode>>8 ) );
+ tlvSpecificData.AddByte( static_cast<TUint8>(
+ iLocalInformation.iLocationAreaCode>>0 ) );
+ // Append Cell Id
+ tlvSpecificData.AddByte( static_cast<TUint8>(
+ iLocalInformation.iCellId >> 8 ) );
+ tlvSpecificData.AddByte( static_cast<TUint8>(
+ iLocalInformation.iCellId >> 0 ) );
+ break;
+ }
+ case RSat::KProvideLocalInfoImei:
+ {
+ // Add tlv tag
+ tlvSpecificData.AddTag( KTlvImeiTag );
+ TBuf8<8> bcdImei;
+ // Convert IMEI to BCD format
+ _LIT8( KTen, "*" );
+ _LIT8( KZero, "0" );
+
+ // Check if required changes is allready done for the IMEI
+ if ( '*' != iIMEI[0] )
+ {
+ // Processing BCD string is much harder than ASCII so
+ // required changes is done before BCD conversion.
+ // (lot's of shifting etc..)
+ // Insert '*'(0x2A) as a first character which is converted
+ // to 0xA in AsciiToBCD method.
+ // Type of identity for IMEI code is 0xA "1010b"
+ // See 3GPP TS 04.08
+ iIMEI.Insert( 0, KTen );
+
+ // Spare digit: this digit shall be zero, when transmitted
+ // by the Mobile Station.
+ // See GSM 03.03
+ iIMEI.Replace( iIMEI.Length() - 1, 1 , KZero );
+ }
+
+ TSatUtility::AsciiToBCD( iIMEI, bcdImei );
+ // Add IMEI code to the terminal response
+ tlvSpecificData.AddData( bcdImei );
+ break;
+ }
+ case RSat::KProvideLocalInformationNmr:
+ {
+ SetInformationNmr( &tlvSpecificData );
+ break;
+ }
+ case RSat::KProvideLocalInfoDateTimeTimeZone:
+ {
+ tlvSpecificData.AddTag( KTlvDateTimeAndTimeZoneTag );
+ // Append current date/time/timezone to the terminal response
+ TInt i( 0 );
+ for ( i = 0; i < aAdditionalInfo.Length(); i++ )
+ {
+ tlvSpecificData.AddByte( static_cast<TUint8>( aAdditionalInfo[i]
+ & 0x00FF ) );
+ }
+ break;
+ }
+ case RSat::KProvideLocalInfoTimingAdv:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::\
+ CreateTerminalRespL, TimingAdvance");
+ // Timing advance result
+ tlvSpecificData.AddTag( KTlvTimingAdvanceTag );
+ tlvSpecificData.AddByte( iMEStatus );
+ tlvSpecificData.AddByte( iTimingAdvance );
+ break;
+ }
+ case RSat::KProvideLocalInfoLanguage:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::\
+ CreateTerminalRespL, LocalInfoLanguage");
+
+ if ( aAdditionalInfo.Length() )
+ {
+ // create Language TLV
+ tlvSpecificData.AddTag( KTlvLanguageTag );
+ TBuf8<2> character;
+ TSatUtility::Copy16to8LE( aAdditionalInfo, character);
+ tlvSpecificData.AddData( character );
+ }
+ else
+ {
+ // Do nothing
+ }
+ break;
+ }
+ case RSat::KProvideLocalInfoAccTech:
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::\
+ CreateTerminalRespL, Access Technology");
+ // Access technology result
+ tlvSpecificData.AddTag( KTlvAccessTechnologyTag );
+ tlvSpecificData.AddByte( iCurrentAccTech );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ // Prepare data
+ iNotificationsTsy->iTerminalRespData.iPCmdNumber = aPCmdNumber;
+ TPtrC8 data = tlvSpecificData.GetDataWithoutTopLevelTag();
+
+ // Pack data
+ CSatDataPackage dataPackage;
+ dataPackage.PackData( &iNotificationsTsy->iTerminalRespData, &data );
+
+ // Forward request to the DOS
+ return iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL(
+ ESatTerminalRsp, &dataPackage );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteTerminalRespDataL
+// Unpacks terminal response specific data
+// calls CreateTerminalRespL.
+// -----------------------------------------------------------------------------
+//
+TInt CSatNotifyLocalInfo::CompleteTerminalRespDataL
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteTerminalRespDataL");
+ TInt ret( KErrNone );
+ // Unpack parameters
+ CSatNotificationsTsy::TTerminalRespData* terminalRespData;
+ aDataPackage->UnPackData( &terminalRespData );
+ CreateTerminalRespL( iNotificationsTsy->iTerminalRespData.iPCmdNumber,
+ terminalRespData->iGeneralResult,
+ terminalRespData->iAdditionalInfo );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteUpdateLocalInfo
+// Called when local info is changed
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::CompleteUpdateLocalInfo
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteUpdateLocalInfo");
+ aDataPackage->UnPackData( iLocalInformation );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteUpdateNetInfo
+// Called when NMR or BCCHChannel list is changed
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::CompleteUpdateNetInfo
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteUpdateNetInfo");
+ aDataPackage->UnPackData( iNMR, iBCCHChannelList );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteUpdateTimingAdvAndMEStatus
+// Called when Timing addvance or ME Status is changed
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::CompleteUpdateTimingAdvAndMEStatus
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteUpdateTimingAdvAndMEStatus");
+ aDataPackage->UnPackData( iTimingAdvance, iMEStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteUpdateAccTech
+// Called when Access technology is changed
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::CompleteUpdateAccTech
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteUpdateAccTech");
+ aDataPackage->UnPackData( iCurrentAccTech );
+ }
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteUpdateIMEI
+// Called when IMEI is changed ( in boot up )
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::CompleteUpdateIMEI
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteUpdateIMEI");
+ aDataPackage->UnPackData( iIMEI );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::CompleteUpdateTimeZone
+// Called when Time zone is changed
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::CompleteUpdateTimeZone
+ (
+ CSatDataPackage* aDataPackage,
+ TInt /*aErrorCode*/
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::CompleteUpdateTimeZone");
+ aDataPackage->UnPackData( iTimeZone );
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::LocalInformation
+// Returns const reference to the up-to-date local information data
+// -----------------------------------------------------------------------------
+//
+const CSatNotificationsTsy::TLocalInformation&
+ CSatNotifyLocalInfo::LocalInformation
+ (
+ // None
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::LocalInformation");
+ return iLocalInformation;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::SetDateTimeTimeZone
+// Sets Date, Time and TimeZone into local info structure
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::SetDateTimeTimeZone
+ (
+ // None
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::SetDateTimeTimeZone");
+ TTime time;
+ TLocale locale;
+ TDateTime dateTime;
+ // Get Universal time
+ time.UniversalTime();
+ // Get Universal time offset ( Time zone in seconds )
+ TTimeIntervalSeconds universalTimeOffset(
+ locale.UniversalTimeOffset() );
+ // Add locale's universal time offset to universal time
+ // to get the local time
+ time += universalTimeOffset;
+ // Converts a TTime object into a TDateTime object
+ dateTime = time.DateTime();
+ // Get and conver year
+ TUint8 temp( TSatUtility::ConvertToSemiOctet(
+ dateTime.Year() ) );
+ // Append year to additional info
+ iLocalInfoRspV3.iAdditionalInfo.Append( temp );
+ // Convert month
+ // Offset from zero. So adding one.
+ temp = TSatUtility::ConvertToSemiOctet(
+ dateTime.Month() + 1 );
+ // Append month value to the additional info
+ iLocalInfoRspV3.iAdditionalInfo.Append( temp );
+ // Convert day to the semi-octec presentation
+ // The day.Offset from zero, so add one before displaying
+ // the day number.
+ temp = TSatUtility::ConvertToSemiOctet(
+ dateTime.Day() + 1 );
+ // Append the day value to the additional info
+ iLocalInfoRspV3.iAdditionalInfo.Append( temp );
+ // Conver current time to the semi-octec presentation.
+ // First hour
+ temp = TSatUtility::ConvertToSemiOctet(
+ dateTime.Hour() );
+ // Append the hour value to the additional info
+ iLocalInfoRspV3.iAdditionalInfo.Append( temp );
+ // Minute value
+ temp = TSatUtility::ConvertToSemiOctet(
+ dateTime.Minute() );
+ // Append the minute value to the additional info
+ iLocalInfoRspV3.iAdditionalInfo.Append( temp );
+ // Seconds
+ temp = TSatUtility::ConvertToSemiOctet(
+ dateTime.Second() );
+ // Append the seconds value to the additional info
+ iLocalInfoRspV3.iAdditionalInfo.Append( temp );
+ // Append time zone
+ iLocalInfoRspV3.iAdditionalInfo.Append( iTimeZone );
+ // Set generall result as Success
+ iLocalInfoRspV3.iGeneralResult = RSat::KSuccess;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatNotifyLocalInfo::SetInformationNmr
+// Sets NMR and BCCHChannelList to tlv data
+// -----------------------------------------------------------------------------
+//
+void CSatNotifyLocalInfo::SetInformationNmr
+ (
+ TTlv* aTlvSpecificData
+ )
+ {
+ TFLOGSTRING("CSAT: CSatNotifyLocalInfo::SetInformationNmr");
+ if ( iNMR.Length() )
+ {
+ // Network measurement result
+ aTlvSpecificData->AddTag( KTlvNetworkMeasurementResultsTag );
+ aTlvSpecificData->AddData( iNMR );
+ }
+
+ if ( iBCCHChannelList.Length() )
+ {
+ // Append BCCH channel list tag
+ aTlvSpecificData->AddTag( KTlvBccdChannelListTag );
+
+ TInt i( 0 );
+ TInt mask( 3 );
+ TInt shiftMove( 2 );
+ TUint8 nextChar( 0 );
+
+ // Convert BCCH channel list from 16-bit to 10-bit format
+ for ( i = 0; i < iBCCHChannelList.Length(); i++ )
+ {
+ TUint char2 = ( iBCCHChannelList[i] & 0x03FF );
+ TUint8 char1 = static_cast<TUint8>( char2 >> shiftMove );
+
+ // Append byte
+ aTlvSpecificData->AddByte(
+ static_cast<TUint8>( char1 | nextChar ) );
+
+ nextChar = static_cast<TUint8>( ( char2 & mask )
+ << ( 8 - shiftMove ) );
+
+ if ( 8 == shiftMove )
+ {
+ shiftMove = 2;
+ nextChar = 0;
+ aTlvSpecificData->AddByte(
+ static_cast<TUint8> ( char2 & 0x00FF ) );
+ mask = 3;
+ }
+ else
+ {
+ shiftMove += 2;
+ mask = ( 1L << shiftMove ) - 1;
+ }
+ }
+ // Add last byte
+ aTlvSpecificData->AddByte( nextChar );
+ }
+ // Clear nmr
+ iNMR.Zero();
+ // Clear BCCH channel list
+ iBCCHChannelList.Zero();
+ }
+
+
+// End of file
+