--- /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
+