telephonyserverplugins/simatktsy/src/csatdatadownloadtsy.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simatktsy/src/csatdatadownloadtsy.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +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
+