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