telephonyserverplugins/simatktsy/src/CSatNotifyLocalInfo.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/simatktsy/src/CSatNotifyLocalInfo.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simatktsy/src/CSatNotifyLocalInfo.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,821 +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
-
+// 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
+