telephonyserverplugins/simatktsy/src/CSatNotifyLocalInfo.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
--- /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
+