telephonyserverplugins/simatktsy/src/csatdatadownloadtsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/simatktsy/src/csatdatadownloadtsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simatktsy/src/csatdatadownloadtsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,468 +1,468 @@
-// 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        : CSatDataDownloadTsy.cpp
-// Part of     : Common SIM ATK TSY / commonsimatktsy
-// DataDownload-related functionality of Sat Tsy
-// Version     : 1.0
-//
-
-
-
-#include <satcs.h>                  // Etel SAT IPC definitions
-#include <etelmm.h> 				// Etel MM Definitions
-#include "CSatDataPackage.h"        // Parameter packing 
-#include "CSatDataDownloadTsy.h"    // Class header
-#include "CSatTsy.h"                // Sat Tsy class
-#include "TSatUtility.h"            // Utilities
-#include "cmmmessagemanagerbase.h"  // Message manager class for forwarding req.
-#include "TfLogger.h"               // For TFLOGSTRING
-#include "CBerTlv.h"                // Ber Tlv
-#include "TTlv.h"					// TTlv class
-#include "MSatTsy_IPCDefs.h"        // Sat Tsy internal request types
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CSatDataDownloadTsy* CSatDataDownloadTsy::NewL
-        (    
-        CSatTsy* aSatTsy  
-        )
-    {
-    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::NewL" );
-    CSatDataDownloadTsy* const satDataDownloadTsy = 
-        new ( ELeave ) CSatDataDownloadTsy();
-    CleanupStack::PushL( satDataDownloadTsy );
-    satDataDownloadTsy->iSatTsy = aSatTsy;
-    satDataDownloadTsy->ConstructL();
-    CleanupStack::Pop( satDataDownloadTsy );
-    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::NewL, end of method" );
-    return satDataDownloadTsy; 
-    }
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::~CSatDataDownloadTsy
-// Destructor
-// -----------------------------------------------------------------------------
-//    
-CSatDataDownloadTsy::~CSatDataDownloadTsy
-        (    
-        void   
-        )
-    {
-    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::~CSatDataDownloadTsy" );
-    // Unregister
-    iSatTsy->MessageManager()->RegisterTsyObject(
-		CMmMessageManagerBase::ESatDataDownloadTsyObjType, NULL );
-    }
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CSatDataDownloadTsy
-// C++ constructor
-// -----------------------------------------------------------------------------
-//
-CSatDataDownloadTsy::CSatDataDownloadTsy
-        (
-        void
-        )
-    {
-    // None
-    }
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::ConstructL
-// Symbian 2nd phase constructor. Initialises internal attributes.
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::ConstructL
-        (    
-        void
-        )
-    {
-    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::ConstructL" );
-    // Register
-    iSatTsy->MessageManager()->RegisterTsyObject(
-		CMmMessageManagerBase::ESatDataDownloadTsyObjType, this );
-	// Initialize as not supported
-	iIsSmsPpDdlSupported = EFalse;
-    }
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CompleteCellBroadcastDdlL
-// Prepare the envelope to be sent to DOS after a Cell
-// Broadcast message has been received, without request, by the mobile equipment.
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::CompleteCellBroadcastDdlL
-         (
-         const CSatDataPackage* aDataPackage
-         )
-    {
-    TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CompleteCellBroadcastDdlL" );
-
-    TBuf8<KCbsMsgMaxLength> aPdu;
-    aDataPackage->UnPackData( aPdu );     
-    TTlv envelope;
-    // Tag
-    envelope.Begin( KBerTlvCellBroadcastTag );
-    // Device identities
-    envelope.AddTag( KTlvDeviceIdentityTag );
-    envelope.AddByte( KNetwork );
-    envelope.AddByte( KSim );    
-    // Cell broadcast page
-    envelope.AddTag( KTlvCellBroadcastPageTag );
-    envelope.AddData( aPdu );  
-    // Prepare data
-    TPtrC8 data = envelope.End();
-    // Pack data
-    CSatDataPackage dataPackage;
-	dataPackage.PackData( &data );
-    // Forward request to the DOS
-    iSatTsy->MessageManager()->HandleRequestL( 
-		    ESatTsyCellBroadcast, &dataPackage ) ;        
-    }
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CompleteSmsPpDdlL
-// Completes the SMS-PP by sending the envelope if SMS-PP is supported. 
-// Otherwise requests saving of the SMS to EFsms (only class 2 sms)
-// 3GPP TS 11.14, 7 Data download to SIM: If the service "data download via SMS 
-// Point-to-point" is allocated and activated in the SIM Service Table, the ME 
-// shall pass the message transparently to the SIM using the ENVELOPE. If the 
-// service "data download via SMS-PP" is not allocated and activated in the SIM
-// Service Table, and the ME receives a Short Message with the protocol 
-// identifier = SIM data download and data coding scheme = class 2 message,
-// then the ME shall store the message in EFSMS in accordance with TS 11.11.
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::CompleteSmsPpDdlL
-        (
-        const CSatDataPackage* aDataPackage
-        )
-    {  
-    TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CompleteSmsPpDdlL" );
-    TBuf8<KAddrMaxLength> smsScAddress;
-    TBuf8<RMobileSmsMessaging::KGsmTpduSize> smsTpdu;
-    
-    // Unpack data
-    aDataPackage->UnPackData( smsScAddress, smsTpdu );
-    
-    // Check if SMS PP Data Download is supported in NAA, then send envelope
-    if ( iIsSmsPpDdlSupported )
-        {
-        CreateSmsPpDdlEnvelopeL( smsScAddress, smsTpdu );
-        }
-    // Otherwise parse TPDU data and check if SMS must be saved
-    else 
-        {       
-        // Check if the SMS should be saved to EFsms (see method descr.)
-        if ( KErrNone == ParseSmsTpdu( smsTpdu ) &&
-             KSmsTpduProtcolIdUSimDdl == iSmsTpdu.iProtocolId && 
-            ( !( iSmsTpdu.iDcs & 0x01 ) ) && ( iSmsTpdu.iDcs & 0x02 ) )
-            {
-            TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CompleteSmsPpDdlL,\
-                SMS PP DDL is not supported, Store SMS to EFsms" ); 
-            CreateEntryForSavingSmsL( smsScAddress, smsTpdu );
-            }
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CreateEntryForSavingSmsL
-// Creates the TMobileGsmSmsEntryV1Pckg and makes a request to DOS to save the 
-// SMS to EFsms
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::CreateEntryForSavingSmsL
-        (
-        const TDesC8& aSmsScAddress,
-        const TDesC8& aSmsTpdu
-        )
-    {  
-    TFLOGSTRING2( "CSAT:CSatDataDownloadTsy::CreateEntryForSavingSms\
-        SC Addr. length: %d", aSmsScAddress.Length() );
-    TInt offset = 0;
-    
-    // Check that the SC address length contains the length in
-    // addition to the address.
-    if ( ( aSmsScAddress[offset] + 1 ) == aSmsScAddress.Length() )
-        {
-        RMobileSmsStore::TMobileGsmSmsEntryV1 smsEntry;
-        RMobileSmsStore::TMobileGsmSmsEntryV1Pckg smsEntryPckg( smsEntry ); 
-            
-        // Set the Type of number: bits 6,5,4
-        smsEntry.iServiceCentre.iTypeOfNumber = 
-            static_cast<RMobilePhone::TMobileTON>( 
-            ( aSmsScAddress[++offset] >> 4 ) & 0x07 );
-        // Set the Numbering plan identification: bits 3,2,1,0
-        smsEntry.iServiceCentre.iNumberPlan =
-            static_cast<RMobilePhone::TMobileNPI>(
-            aSmsScAddress[offset] & 0x0F );
-        
-        // Set data
-        TBuf8<RSat::KMaxMobileTelNumberSize> scAddress;
-        TBuf16<RSat::KMaxMobileTelNumberSize> scAddress16;
-        
-        // First convert the number to ASCII
-        TSatUtility::BCDToAscii( aSmsScAddress.Mid( ++offset ), scAddress );
-                
-        // Then set the 8 bit data to 16 bit data buffer                  
-        for ( TInt i = 0; i < scAddress.Length(); i++ )
-            {
-            scAddress16.Append( static_cast<TUint16>( 
-                scAddress[i] ) );
-            }
-
-        // Copy the Service Centre address and TPDU data
-        smsEntry.iServiceCentre.iTelNumber.Copy( scAddress16 );
-                
-        TFLOGSTRING2("CSAT:CSatDataDownloadTsy::CreateEntryForSavingSms,\
-            iTelNumber: %S", &smsEntry.iServiceCentre.iTelNumber );
-            
-        smsEntry.iMsgData.Copy( aSmsTpdu ); 
-        
-        // We set the index to point -1, since it means we use the 1st free 
-        // slot. See Etel MM API Specification, 8.1.4 Write Entry. 
-        smsEntry.iIndex = -1;
-
-        // Pack data and forward request to DOS
-        TDesC8* data = reinterpret_cast<TDesC8*>( &smsEntryPckg );
-        CMmDataPackage package;
-        package.PackData( &data, &smsEntry.iIndex );
-        iSatTsy->MessageManager()->HandleRequestL( EMobilePhoneStoreWrite, 
-            &package ); 
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CreateSmsDeliverReportL
-// Completes the writing of the SMS to EFsms by creating the resulting report
-// (see 3GPP TS 23.040, 9.2.2.1a). See also 3GPP TS 23.038 "When a mobile 
-// terminated message is Class 2 ((U)SIM-specific), an MS shall ensure that 
-// the message has been transferred to the SMS data field in the (U)SIM before 
-// sending an acknowledgement to the SC"
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::CreateSmsDeliverReportL
-        (
-        TInt aResult
-        )  
-    {
-    TFLOGSTRING("CSAT: CSatDataDownloadTsy::CreateSmsDeliverReportL");
-    TBuf8<KTpduMaxSize> reportData;
-       
-    // Get User Data length
-    TUint8 userDataLength = iSmsTpdu.iUserData.Length();
-    
-    // Check that SMS TPDU data exists by checking the last mandatory item
-    if ( KSmsTpduByteUnknownOrReserved != iSmsTpdu.iDcs )
-        {
-        TFLOGSTRING("CSAT: CSatDataDownloadTsy::CreateSmsDeliverReportL,\
-            SMS TPDU OK");
-        reportData.Zero();
-        reportData.Append( iSmsTpdu.iParameters );   // 1st byte -> parameters
-        reportData.Append( KAllOptParamsPresent );   // TP-Parameter-Indicator
-        reportData.Append( iSmsTpdu.iProtocolId );   // TP-Protocol-Identifier
-        reportData.Append( iSmsTpdu.iDcs );          // TP-Data-Coding-Scheme
-        reportData.Append( userDataLength );         // TP-User-Data-Length
-        
-        // If user data exists, add it to the end of buffer
-        if ( userDataLength )
-            {
-            reportData.Append( iSmsTpdu.iUserData );
-            }
-        
-        // If saving went OK it means that RP-ACK must to be sent and data is
-        // ready, otherwise RP-ERROR must to be sent, which means that TP Failure 
-        // Cause must be inserted after the parameters
-        if ( KErrNone != aResult )
-            {
-            TFLOGSTRING("CSAT: CSatDataDownloadTsy::CreateSmsDeliverReportL,\
-                Add TP Failure Cause: KDataDownloadError");
-            TBuf8<1> failureCause;
-            failureCause.Zero();
-            failureCause.Append( KDataDownloadError );
-            reportData.Insert( 1, failureCause );
-            }
-        
-        // Pack data and forward request to DOS
-        CMmDataPackage package;
-        package.PackData( &reportData );
-        iSatTsy->MessageManager()->HandleRequestL( ESatTsySmsDeliverReport, 
-            &package );
-        }
-    
-    }
-
-    
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL
-// Prepare the envelope to be sent to DOS after a SMS-PP
-// message has been received, without request, by the mobile equipment.
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL
-        (
-        const TDesC8& aSmsScAddress,
-        const TDesC8& aSmsTpdu
-        )
-    {  
-    TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL" );
-    // Check that the data exists
-    if ( aSmsScAddress.Length() && aSmsTpdu.Length() )
-        {
-        TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL,\
-            Data Ok" );
-        TTlv envelope;
- 
-        envelope.Begin( KBerTlvSmsPpDownloadTag );
-        envelope.AddTag( KTlvDeviceIdentityTag );
-        envelope.AddByte( KNetwork );
-        envelope.AddByte( KSim );
-        envelope.AddTag( KTlvAddressTag );
-        envelope.AddData( aSmsScAddress.Mid( 1, aSmsScAddress[0] ) );
-        envelope.AddTag( KTlvSmsTpduTag );
-        envelope.AddData( aSmsTpdu );
-     
-        // Prepare data
-        TPtrC8 data = envelope.End();
-        // Pack data
-        CSatDataPackage dataPackage;
-    	dataPackage.PackData( &data );
-        // Forward request to the DOS
-        iSatTsy->MessageManager()->HandleRequestL( ESatTsySmsPpDdl, 
-            &dataPackage );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::CompleteReadCbmidsL
-// Request to read Cbmids from the elementary file EFcbmids.
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::CompleteReadCbmidsL
-        (
-        void 
-        )
-    {
-    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::CompleteReadCbmids" );
-    // Convert constants and append to simFilePath
-    TBuf8<KMaxFilePath> simFilePath;
-    // Append data
-    simFilePath.Append( TUint8( KMasterFileCbmids >> 8 ) );
-    //lint -e{778} Constant expression evaluates to 0 in operation 
-	simFilePath.Append( TUint8( KMasterFileCbmids & 0xFF ) );
-
-	simFilePath.Append( TUint8( KDedicatedFileCbmids >> 8 ) );
-	simFilePath.Append( TUint8( KDedicatedFileCbmids & 0xFF ) );
-
-	simFilePath.Append( TUint8( KElementaryFileCbmids >> 8 ) );
-	simFilePath.Append( TUint8( KElementaryFileCbmids & 0xFF ) );
-
-    // Pack data
-    CSatDataPackage dataPackage;
-	dataPackage.PackData( &simFilePath );
-    // Forward request to the DOS
-    iSatTsy->MessageManager()->HandleRequestL( 
-		    ESatTsyReadCbmids, &dataPackage );          
-    }    
-    
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::SetSmsPpDdlStatus
-// Sets the support status of SMS PP Data Download in NAA
-// -----------------------------------------------------------------------------
-//
-void CSatDataDownloadTsy::SetSmsPpDdlStatus
-        (
-        const CSatDataPackage* aDataPackage 
-        )
-    {
-    aDataPackage->UnPackData( iIsSmsPpDdlSupported );   
-    TFLOGSTRING2("CSAT: CSatNotifyMoSmControlRequest::SetActivationStatus, %d",
-    	iIsSmsPpDdlSupported );     
-    }  
-    
-// -----------------------------------------------------------------------------
-// CSatDataDownloadTsy::ParseSmsTpdu
-// Interprets the given TPDU data and sets the results to internal data member
-// -----------------------------------------------------------------------------
-//
-TInt CSatDataDownloadTsy::ParseSmsTpdu
-        (
-        const TDesC8& aSmsTpdu
-        )
-    {
-    TFLOGSTRING("CSAT: CSatDataDownloadTsy::ParseSmsTpdu");
-    TInt ret( KErrCorrupt );
-    
-    // Initialize values
-    iSmsTpdu.iParameters = KSmsTpduByteUnknownOrReserved;
-    iSmsTpdu.iProtocolId = KSmsTpduByteUnknownOrReserved;
-    iSmsTpdu.iDcs = KSmsTpduByteUnknownOrReserved;
-    iSmsTpdu.iUserData.Zero();
-    
-     // Check first that the TPdu data and SC address exist before parsing
-    if ( KSmsTpduMinLength < aSmsTpdu.Length() )
-        {
-        // Set parameters
-        iSmsTpdu.iParameters = aSmsTpdu[0];
-        // Then we need to get Protocol ID and DCS..
-        // ..the length of address in chars is in the 1st byte of Addr. string
-        TUint8 chars = aSmsTpdu[KSmsTpduAddrOffset];
-        TUint8 addrLengthInBytes( 0 ); 
-            
-        if ( chars % 2 )
-            {
-            addrLengthInBytes = chars / 2 + 1;
-            }
-        else
-            {
-            addrLengthInBytes = chars / 2;
-            }
-            
-        // Then add two in order to point to the protocol ID (the order is:
-        // address length, type of address, address data, protocol id...
-        TUint8 offset = KSmsTpduAddrOffset + 2 + addrLengthInBytes;
-
-        // Just to be on the safe side, check that the offset is not too big
-        if ( aSmsTpdu.Length() > ( offset + 1 + KSmsTpduSctsLength ) )
-            {
-            TFLOGSTRING( "CSAT:CSatDataDownloadTsy::ParseSmsTpdu,\
-                SmsTpdu length Ok" );
-            // Set protocol id and data coding shceme
-            iSmsTpdu.iProtocolId = aSmsTpdu[offset];
-            iSmsTpdu.iDcs = aSmsTpdu[++offset] ;
-            
-            // Update offset to point the TP-UDL (skip TP-SCTS, not needed)
-            offset = offset + KSmsTpduSctsLength + 1;
-            TUint8 tpduUserDataLength = aSmsTpdu[offset];
-                
-            // If user data exists, add it to the end of buffer
-            if ( tpduUserDataLength )
-                {
-                iSmsTpdu.iUserData.Copy( aSmsTpdu.Mid( ++offset ) );
-                TFLOGSTRING2( "CSAT:CSatDataDownloadTsy::ParseSmsTpdu,\
-                    iUserData length: %d", iSmsTpdu.iUserData.Length() );
-                }
-
-            ret = KErrNone;
-            } 
-        } // TPDU reaches the minimum length  
-        
-    return ret;
-    }     
-
-// 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        : CSatDataDownloadTsy.cpp
+// Part of     : Common SIM ATK TSY / commonsimatktsy
+// DataDownload-related functionality of Sat Tsy
+// Version     : 1.0
+//
+
+
+
+#include <satcs.h>                  // Etel SAT IPC definitions
+#include <etelmm.h> 				// Etel MM Definitions
+#include "CSatDataPackage.h"        // Parameter packing 
+#include "CSatDataDownloadTsy.h"    // Class header
+#include "CSatTsy.h"                // Sat Tsy class
+#include "TSatUtility.h"            // Utilities
+#include "cmmmessagemanagerbase.h"  // Message manager class for forwarding req.
+#include "TfLogger.h"               // For TFLOGSTRING
+#include "CBerTlv.h"                // Ber Tlv
+#include "TTlv.h"					// TTlv class
+#include "MSatTsy_IPCDefs.h"        // Sat Tsy internal request types
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatDataDownloadTsy* CSatDataDownloadTsy::NewL
+        (    
+        CSatTsy* aSatTsy  
+        )
+    {
+    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::NewL" );
+    CSatDataDownloadTsy* const satDataDownloadTsy = 
+        new ( ELeave ) CSatDataDownloadTsy();
+    CleanupStack::PushL( satDataDownloadTsy );
+    satDataDownloadTsy->iSatTsy = aSatTsy;
+    satDataDownloadTsy->ConstructL();
+    CleanupStack::Pop( satDataDownloadTsy );
+    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::NewL, end of method" );
+    return satDataDownloadTsy; 
+    }
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::~CSatDataDownloadTsy
+// Destructor
+// -----------------------------------------------------------------------------
+//    
+CSatDataDownloadTsy::~CSatDataDownloadTsy
+        (    
+        void   
+        )
+    {
+    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::~CSatDataDownloadTsy" );
+    // Unregister
+    iSatTsy->MessageManager()->RegisterTsyObject(
+		CMmMessageManagerBase::ESatDataDownloadTsyObjType, NULL );
+    }
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CSatDataDownloadTsy
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CSatDataDownloadTsy::CSatDataDownloadTsy
+        (
+        void
+        )
+    {
+    // None
+    }
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::ConstructL
+// Symbian 2nd phase constructor. Initialises internal attributes.
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::ConstructL
+        (    
+        void
+        )
+    {
+    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::ConstructL" );
+    // Register
+    iSatTsy->MessageManager()->RegisterTsyObject(
+		CMmMessageManagerBase::ESatDataDownloadTsyObjType, this );
+	// Initialize as not supported
+	iIsSmsPpDdlSupported = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CompleteCellBroadcastDdlL
+// Prepare the envelope to be sent to DOS after a Cell
+// Broadcast message has been received, without request, by the mobile equipment.
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::CompleteCellBroadcastDdlL
+         (
+         const CSatDataPackage* aDataPackage
+         )
+    {
+    TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CompleteCellBroadcastDdlL" );
+
+    TBuf8<KCbsMsgMaxLength> aPdu;
+    aDataPackage->UnPackData( aPdu );     
+    TTlv envelope;
+    // Tag
+    envelope.Begin( KBerTlvCellBroadcastTag );
+    // Device identities
+    envelope.AddTag( KTlvDeviceIdentityTag );
+    envelope.AddByte( KNetwork );
+    envelope.AddByte( KSim );    
+    // Cell broadcast page
+    envelope.AddTag( KTlvCellBroadcastPageTag );
+    envelope.AddData( aPdu );  
+    // Prepare data
+    TPtrC8 data = envelope.End();
+    // Pack data
+    CSatDataPackage dataPackage;
+	dataPackage.PackData( &data );
+    // Forward request to the DOS
+    iSatTsy->MessageManager()->HandleRequestL( 
+		    ESatTsyCellBroadcast, &dataPackage ) ;        
+    }
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CompleteSmsPpDdlL
+// Completes the SMS-PP by sending the envelope if SMS-PP is supported. 
+// Otherwise requests saving of the SMS to EFsms (only class 2 sms)
+// 3GPP TS 11.14, 7 Data download to SIM: If the service "data download via SMS 
+// Point-to-point" is allocated and activated in the SIM Service Table, the ME 
+// shall pass the message transparently to the SIM using the ENVELOPE. If the 
+// service "data download via SMS-PP" is not allocated and activated in the SIM
+// Service Table, and the ME receives a Short Message with the protocol 
+// identifier = SIM data download and data coding scheme = class 2 message,
+// then the ME shall store the message in EFSMS in accordance with TS 11.11.
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::CompleteSmsPpDdlL
+        (
+        const CSatDataPackage* aDataPackage
+        )
+    {  
+    TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CompleteSmsPpDdlL" );
+    TBuf8<KAddrMaxLength> smsScAddress;
+    TBuf8<RMobileSmsMessaging::KGsmTpduSize> smsTpdu;
+    
+    // Unpack data
+    aDataPackage->UnPackData( smsScAddress, smsTpdu );
+    
+    // Check if SMS PP Data Download is supported in NAA, then send envelope
+    if ( iIsSmsPpDdlSupported )
+        {
+        CreateSmsPpDdlEnvelopeL( smsScAddress, smsTpdu );
+        }
+    // Otherwise parse TPDU data and check if SMS must be saved
+    else 
+        {       
+        // Check if the SMS should be saved to EFsms (see method descr.)
+        if ( KErrNone == ParseSmsTpdu( smsTpdu ) &&
+             KSmsTpduProtcolIdUSimDdl == iSmsTpdu.iProtocolId && 
+            ( !( iSmsTpdu.iDcs & 0x01 ) ) && ( iSmsTpdu.iDcs & 0x02 ) )
+            {
+            TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CompleteSmsPpDdlL,\
+                SMS PP DDL is not supported, Store SMS to EFsms" ); 
+            CreateEntryForSavingSmsL( smsScAddress, smsTpdu );
+            }
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CreateEntryForSavingSmsL
+// Creates the TMobileGsmSmsEntryV1Pckg and makes a request to DOS to save the 
+// SMS to EFsms
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::CreateEntryForSavingSmsL
+        (
+        const TDesC8& aSmsScAddress,
+        const TDesC8& aSmsTpdu
+        )
+    {  
+    TFLOGSTRING2( "CSAT:CSatDataDownloadTsy::CreateEntryForSavingSms\
+        SC Addr. length: %d", aSmsScAddress.Length() );
+    TInt offset = 0;
+    
+    // Check that the SC address length contains the length in
+    // addition to the address.
+    if ( ( aSmsScAddress[offset] + 1 ) == aSmsScAddress.Length() )
+        {
+        RMobileSmsStore::TMobileGsmSmsEntryV1 smsEntry;
+        RMobileSmsStore::TMobileGsmSmsEntryV1Pckg smsEntryPckg( smsEntry ); 
+            
+        // Set the Type of number: bits 6,5,4
+        smsEntry.iServiceCentre.iTypeOfNumber = 
+            static_cast<RMobilePhone::TMobileTON>( 
+            ( aSmsScAddress[++offset] >> 4 ) & 0x07 );
+        // Set the Numbering plan identification: bits 3,2,1,0
+        smsEntry.iServiceCentre.iNumberPlan =
+            static_cast<RMobilePhone::TMobileNPI>(
+            aSmsScAddress[offset] & 0x0F );
+        
+        // Set data
+        TBuf8<RSat::KMaxMobileTelNumberSize> scAddress;
+        TBuf16<RSat::KMaxMobileTelNumberSize> scAddress16;
+        
+        // First convert the number to ASCII
+        TSatUtility::BCDToAscii( aSmsScAddress.Mid( ++offset ), scAddress );
+                
+        // Then set the 8 bit data to 16 bit data buffer                  
+        for ( TInt i = 0; i < scAddress.Length(); i++ )
+            {
+            scAddress16.Append( static_cast<TUint16>( 
+                scAddress[i] ) );
+            }
+
+        // Copy the Service Centre address and TPDU data
+        smsEntry.iServiceCentre.iTelNumber.Copy( scAddress16 );
+                
+        TFLOGSTRING2("CSAT:CSatDataDownloadTsy::CreateEntryForSavingSms,\
+            iTelNumber: %S", &smsEntry.iServiceCentre.iTelNumber );
+            
+        smsEntry.iMsgData.Copy( aSmsTpdu ); 
+        
+        // We set the index to point -1, since it means we use the 1st free 
+        // slot. See Etel MM API Specification, 8.1.4 Write Entry. 
+        smsEntry.iIndex = -1;
+
+        // Pack data and forward request to DOS
+        TDesC8* data = reinterpret_cast<TDesC8*>( &smsEntryPckg );
+        CMmDataPackage package;
+        package.PackData( &data, &smsEntry.iIndex );
+        iSatTsy->MessageManager()->HandleRequestL( EMobilePhoneStoreWrite, 
+            &package ); 
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CreateSmsDeliverReportL
+// Completes the writing of the SMS to EFsms by creating the resulting report
+// (see 3GPP TS 23.040, 9.2.2.1a). See also 3GPP TS 23.038 "When a mobile 
+// terminated message is Class 2 ((U)SIM-specific), an MS shall ensure that 
+// the message has been transferred to the SMS data field in the (U)SIM before 
+// sending an acknowledgement to the SC"
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::CreateSmsDeliverReportL
+        (
+        TInt aResult
+        )  
+    {
+    TFLOGSTRING("CSAT: CSatDataDownloadTsy::CreateSmsDeliverReportL");
+    TBuf8<KTpduMaxSize> reportData;
+       
+    // Get User Data length
+    TUint8 userDataLength = iSmsTpdu.iUserData.Length();
+    
+    // Check that SMS TPDU data exists by checking the last mandatory item
+    if ( KSmsTpduByteUnknownOrReserved != iSmsTpdu.iDcs )
+        {
+        TFLOGSTRING("CSAT: CSatDataDownloadTsy::CreateSmsDeliverReportL,\
+            SMS TPDU OK");
+        reportData.Zero();
+        reportData.Append( iSmsTpdu.iParameters );   // 1st byte -> parameters
+        reportData.Append( KAllOptParamsPresent );   // TP-Parameter-Indicator
+        reportData.Append( iSmsTpdu.iProtocolId );   // TP-Protocol-Identifier
+        reportData.Append( iSmsTpdu.iDcs );          // TP-Data-Coding-Scheme
+        reportData.Append( userDataLength );         // TP-User-Data-Length
+        
+        // If user data exists, add it to the end of buffer
+        if ( userDataLength )
+            {
+            reportData.Append( iSmsTpdu.iUserData );
+            }
+        
+        // If saving went OK it means that RP-ACK must to be sent and data is
+        // ready, otherwise RP-ERROR must to be sent, which means that TP Failure 
+        // Cause must be inserted after the parameters
+        if ( KErrNone != aResult )
+            {
+            TFLOGSTRING("CSAT: CSatDataDownloadTsy::CreateSmsDeliverReportL,\
+                Add TP Failure Cause: KDataDownloadError");
+            TBuf8<1> failureCause;
+            failureCause.Zero();
+            failureCause.Append( KDataDownloadError );
+            reportData.Insert( 1, failureCause );
+            }
+        
+        // Pack data and forward request to DOS
+        CMmDataPackage package;
+        package.PackData( &reportData );
+        iSatTsy->MessageManager()->HandleRequestL( ESatTsySmsDeliverReport, 
+            &package );
+        }
+    
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL
+// Prepare the envelope to be sent to DOS after a SMS-PP
+// message has been received, without request, by the mobile equipment.
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL
+        (
+        const TDesC8& aSmsScAddress,
+        const TDesC8& aSmsTpdu
+        )
+    {  
+    TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL" );
+    // Check that the data exists
+    if ( aSmsScAddress.Length() && aSmsTpdu.Length() )
+        {
+        TFLOGSTRING( "CSAT:CSatDataDownloadTsy::CreateSmsPpDdlEnvelopeL,\
+            Data Ok" );
+        TTlv envelope;
+ 
+        envelope.Begin( KBerTlvSmsPpDownloadTag );
+        envelope.AddTag( KTlvDeviceIdentityTag );
+        envelope.AddByte( KNetwork );
+        envelope.AddByte( KSim );
+        envelope.AddTag( KTlvAddressTag );
+        envelope.AddData( aSmsScAddress.Mid( 1, aSmsScAddress[0] ) );
+        envelope.AddTag( KTlvSmsTpduTag );
+        envelope.AddData( aSmsTpdu );
+     
+        // Prepare data
+        TPtrC8 data = envelope.End();
+        // Pack data
+        CSatDataPackage dataPackage;
+    	dataPackage.PackData( &data );
+        // Forward request to the DOS
+        iSatTsy->MessageManager()->HandleRequestL( ESatTsySmsPpDdl, 
+            &dataPackage );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::CompleteReadCbmidsL
+// Request to read Cbmids from the elementary file EFcbmids.
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::CompleteReadCbmidsL
+        (
+        void 
+        )
+    {
+    TFLOGSTRING( "CSAT: CSatDataDownloadTsy::CompleteReadCbmids" );
+    // Convert constants and append to simFilePath
+    TBuf8<KMaxFilePath> simFilePath;
+    // Append data
+    simFilePath.Append( TUint8( KMasterFileCbmids >> 8 ) );
+    //lint -e{778} Constant expression evaluates to 0 in operation 
+	simFilePath.Append( TUint8( KMasterFileCbmids & 0xFF ) );
+
+	simFilePath.Append( TUint8( KDedicatedFileCbmids >> 8 ) );
+	simFilePath.Append( TUint8( KDedicatedFileCbmids & 0xFF ) );
+
+	simFilePath.Append( TUint8( KElementaryFileCbmids >> 8 ) );
+	simFilePath.Append( TUint8( KElementaryFileCbmids & 0xFF ) );
+
+    // Pack data
+    CSatDataPackage dataPackage;
+	dataPackage.PackData( &simFilePath );
+    // Forward request to the DOS
+    iSatTsy->MessageManager()->HandleRequestL( 
+		    ESatTsyReadCbmids, &dataPackage );          
+    }    
+    
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::SetSmsPpDdlStatus
+// Sets the support status of SMS PP Data Download in NAA
+// -----------------------------------------------------------------------------
+//
+void CSatDataDownloadTsy::SetSmsPpDdlStatus
+        (
+        const CSatDataPackage* aDataPackage 
+        )
+    {
+    aDataPackage->UnPackData( iIsSmsPpDdlSupported );   
+    TFLOGSTRING2("CSAT: CSatNotifyMoSmControlRequest::SetActivationStatus, %d",
+    	iIsSmsPpDdlSupported );     
+    }  
+    
+// -----------------------------------------------------------------------------
+// CSatDataDownloadTsy::ParseSmsTpdu
+// Interprets the given TPDU data and sets the results to internal data member
+// -----------------------------------------------------------------------------
+//
+TInt CSatDataDownloadTsy::ParseSmsTpdu
+        (
+        const TDesC8& aSmsTpdu
+        )
+    {
+    TFLOGSTRING("CSAT: CSatDataDownloadTsy::ParseSmsTpdu");
+    TInt ret( KErrCorrupt );
+    
+    // Initialize values
+    iSmsTpdu.iParameters = KSmsTpduByteUnknownOrReserved;
+    iSmsTpdu.iProtocolId = KSmsTpduByteUnknownOrReserved;
+    iSmsTpdu.iDcs = KSmsTpduByteUnknownOrReserved;
+    iSmsTpdu.iUserData.Zero();
+    
+     // Check first that the TPdu data and SC address exist before parsing
+    if ( KSmsTpduMinLength < aSmsTpdu.Length() )
+        {
+        // Set parameters
+        iSmsTpdu.iParameters = aSmsTpdu[0];
+        // Then we need to get Protocol ID and DCS..
+        // ..the length of address in chars is in the 1st byte of Addr. string
+        TUint8 chars = aSmsTpdu[KSmsTpduAddrOffset];
+        TUint8 addrLengthInBytes( 0 ); 
+            
+        if ( chars % 2 )
+            {
+            addrLengthInBytes = chars / 2 + 1;
+            }
+        else
+            {
+            addrLengthInBytes = chars / 2;
+            }
+            
+        // Then add two in order to point to the protocol ID (the order is:
+        // address length, type of address, address data, protocol id...
+        TUint8 offset = KSmsTpduAddrOffset + 2 + addrLengthInBytes;
+
+        // Just to be on the safe side, check that the offset is not too big
+        if ( aSmsTpdu.Length() > ( offset + 1 + KSmsTpduSctsLength ) )
+            {
+            TFLOGSTRING( "CSAT:CSatDataDownloadTsy::ParseSmsTpdu,\
+                SmsTpdu length Ok" );
+            // Set protocol id and data coding shceme
+            iSmsTpdu.iProtocolId = aSmsTpdu[offset];
+            iSmsTpdu.iDcs = aSmsTpdu[++offset] ;
+            
+            // Update offset to point the TP-UDL (skip TP-SCTS, not needed)
+            offset = offset + KSmsTpduSctsLength + 1;
+            TUint8 tpduUserDataLength = aSmsTpdu[offset];
+                
+            // If user data exists, add it to the end of buffer
+            if ( tpduUserDataLength )
+                {
+                iSmsTpdu.iUserData.Copy( aSmsTpdu.Mid( ++offset ) );
+                TFLOGSTRING2( "CSAT:CSatDataDownloadTsy::ParseSmsTpdu,\
+                    iUserData length: %d", iSmsTpdu.iUserData.Length() );
+                }
+
+            ret = KErrNone;
+            } 
+        } // TPDU reaches the minimum length  
+        
+    return ret;
+    }     
+
+// End of file
+