--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/inc/cmmsmsmesshandler.h Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,666 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+
+
+// INCLUDES
+
+#ifndef _CMMSMSMESSHANDLER_H_
+#define _CMMSMSMESSHANDLER_H_
+
+#include <etelmm.h>
+#include <tisi.h>
+
+#include "mmmmesshandlerbase.h"
+#include "cmmsmsgsmutility.h" // ksimsbsmsgsmisimsgmaxlength, koperatornamemaxlength
+#include "cmmphonetreceiver.h"
+#include "cmmsmscache.h" // cmmsmscache
+#include "muiccoperationbase.h"
+#include "cmmuiccmesshandler.h"
+
+// CONSTANTS
+
+// SMS record length, as specified in ETSI TS 31 102
+// "4.2.25 EFSMS (Short messages)"
+const TUint8 KSmsElemetaryFileRecordLength = 176;
+
+// for file descriptor tag in FCI data received from UICC Server
+const TUint8 KTagFCIFileDescriptor = 0x82;
+
+#define UICC_FCI_EF_FDESC_OFFSET_NUM_ENTR 6
+
+
+// MACROS
+//none
+
+// DATA TYPES
+//none
+
+// EXTERNAL DATA STRUCTURES
+//none
+
+// FUNCTION PROTOTYPES
+//none
+
+
+// FORWARD DECLARATIONS
+class CMmPhoNetSender;
+class CMmPhoNetReceiver;
+class CMmMessageRouter;
+class TIsiReceiveC;
+class CMmUiccMessHandler;
+
+//DESCRIPTION
+//
+//CMmSmsMessHandler is used to create and send SMS
+//ISI-messages to PhoNet via PhoNetSender. It also receives SMS ISI-messages
+//from PhoNet via PhoNetReceiver.
+class CMmSmsMessHandler :
+ public CBase,
+ public MMmMessHandlerBase,
+ public MMmMessageReceiver,
+ public MUiccOperationBase
+ {
+
+ private: // types
+
+ // The SMS request types are grouped into
+ // the following types. Used as ISA transaction IDs.
+ enum TSmsRequestType
+ {
+ ESmsMessagingUnknown = 0,
+ ESmsMessagingGetMessageStoreInfo,
+ ESmsMessagingReceiveMessage,
+ ESmsMessagingSendMessage,
+ ESmsMessagingSendSatMessage,
+ ESmsMessagingSendNoFdnMessage,
+ ESmsMessagingResumeSmsReception,
+ ESmsMessagingGetSmspListPhase1,
+ ESmsMessagingStoreSmspList,
+ ESmsMessagingAckSmsStored,
+ ESmsMessagingNackSmsStored,
+ EPhoneStoreDelete,
+ EPhoneStoreDeleteAll,
+ EPhoneStoreWrite,
+ EInternalNack,
+ ESms2Cache,
+ ESms2WriteReceived
+
+ };
+
+ //METHODS
+ public:
+
+ /**
+ * Destructor
+ * @return: None
+ */
+ ~CMmSmsMessHandler();
+
+ /**
+ * Creates a SMS MessageHandler object instance.
+ * @param CMmPhoNetSender* aPhoNetSender: A pointer to PhoNet sender
+ * @param CMmPhoNetReceiver* aPhoNetReceiver: pointer to PhoNet receiver
+ * @param CMmMessageRouter* aMessageRouter: pointer to the message
+ * router object
+ * @return CMmSmsMessHandler*: Pointer to the created object
+ */
+ static CMmSmsMessHandler* NewL(
+ CMmPhoNetSender* aPhoNetSender,
+ CMmPhoNetReceiver* aPhoNetReceiver,
+ CMmMessageRouter* aMessageRouter,
+ CMmUiccMessHandler* aUiccMessHandler );
+
+ /**
+ * From CMessHandlerBase. This method is the single entry point for
+ * requests coming from the Symbian OS layer to this message handler
+ * @param TInt aIpc: IPC number of the request
+ * @param const CMmDataPackage* aDataPackage: Data Package
+ * @return TInt KErrNone or error code
+ */
+ TInt ExtFuncL( TInt aIpc, const CMmDataPackage* aDataPackage );
+
+ /**
+ * Isimsg received by PhonetReceiver
+ * @param const TIsiReceiveC& aIsiMsg: The received Isi message
+ */
+ void ReceiveMessageL( const TIsiReceiveC& aIsiMessage );
+
+ /**
+ * Handles errors comes from PhoNetReceiver RunError
+ * @param const TIsiReceiveC& aIsiMsg: The received ISI message
+ * @param TInt aError: Error code
+ */
+ void HandleError( const TIsiReceiveC& aIsiMsg, TInt aError );
+
+ /**
+ * Start reading SMS's from SIM to cache
+ * @return error code
+ */
+ void InitializeSmsCache();
+
+ /**
+ * Handle UICC response messages
+ * @param aTraId Transaction ID
+ * @param aFileData Descriptor for file data
+ * @return KErrNone or error code
+ */
+ TInt ProcessUiccMsg(
+ TInt aTraId,
+ TInt aStatus,
+ const TDesC8& aFileData );
+
+ private:
+
+ /**
+ * Handle EMobileSmsMessagingGetMessageStoreInfo/EMobilePhoneStoreGetInfo
+ * @return error code
+ */
+ TInt GetSmsStoreInfo( TInt aIpc );
+
+ /**
+ * Handle EMobilePhoneStoreDelete
+ * @return error code
+ */
+ TInt DeleteSms( const CMmDataPackage* aDataPackage );
+
+ /**
+ * Handle EMobilePhoneStoreDeleteAll
+ * @return error code
+ */
+ TInt DeleteAllSms();
+
+ /**
+ * Handle EMobilePhoneStoreRead
+ * @return error code
+ */
+ TInt ReadSms( const CMmDataPackage* aDataPackage );
+
+ /**
+ * Handle EMobilePhoneStoreReadAllPhase1
+ * @return error code
+ */
+ TInt ReadAllSmsL();
+
+ /**
+ * Handle EMobilePhoneStoreWrite
+ * @return error code
+ */
+ TInt WriteSms( const RMobileSmsStore::TMobileGsmSmsEntryV1& aEntry,
+ TInt aIndex);
+
+ /**
+ * Constructor
+ * @return: None
+ */
+ CMmSmsMessHandler();
+
+ /**
+ * Initialises object attributes.
+ * @return None
+ */
+ void ConstructL();
+
+ /**
+ * Response for SmsMessageSendReq
+ * @param const TIsiReceiveC& aIsiMsg: The Isi message
+ * @param TInt aIpc: IPC number (ETel Messaging- or SAT-
+ * originated SMS sending)
+ */
+ void SmsMessageSendResp(
+ const TIsiReceiveC& aIsiMsg,
+ TInt aIpc );
+
+ /**
+ * Handle internally SIM server response to SimStSmsRead
+ * (ReadAllSms) request
+ * @param TBool aSupportedPduType: Is read PDU's type supported
+ * @param TSmsMsg* aSmsMsg: A pointer to the sms message
+ * @param Int aSmsLocIndex: index of the SIM SMS slot
+ * @param TUint8 aSmsNumOfLoc: number of SIM SMS slots
+ * @return void: None
+ */
+ void InternalRetrieveSmsListReadSmsL(
+ TBool aSupportedPduType,
+ TSmsMsg* aSmsMsg,
+ TInt aSmsLocIndex,
+ TUint8 aSmsNumOfLoc );
+
+ /**
+ * Sms gsm received pp report request (Ack or Nack)
+ * @param TUint8 aTransactionId: Transaction identifier
+ * @param const TDesC8* aMsgData: A pointer to the Message data
+ * @param TInt aRpCause: RP cause
+ * @return TInt: KErrNone or error code
+ */
+ TInt SmsReceivedMsgReportReq(
+ TUint8 aTransactionId,
+ const TDesC8* aMsgData,
+ TInt aRpCause );
+
+ /**
+ * Coverts RP cause value to SMS cause cause value.
+ * @param aRpCause - RP Cause value
+ * @return TUint8 - SMS Cause value
+ */
+ TUint8 SmsMapCause( TInt aRpCause );
+
+ /* Complete reading of one SMSP set
+ * @param TSmsParameters* aParameters: A pointer to sms parameter
+ * @return: void: None
+ */
+ void InternalRetrieveSmspListL( TSmsParameters* aParameters );
+
+ /**
+ * Activate, deactivate or query status of SMS receiving
+ * @param aAction Reception command
+ * @return KErrNone or error code
+ */
+ TInt SmsReceiveMessageReq( TUint8 aAction );
+
+ /**
+ * Sms message send request to sms server
+ * @param TUint8 aTransactionId: Transaction identifier
+ * @param const CMmDataPackage* aDataPackage: Data package
+ * with SMS message data and attributes
+ * @param TBool aSmsCheckDisableFdn: If ETrue the sub block
+ * SMS_SB_CHECK_INFO with SMS_CHECK_DISABLE_FDN is inculed
+ * when SMS_MESSAGE_SEND_REQ is sent.
+ * @return TInt: KErrNone or error code
+ */
+ TInt SmsMessageSendReq(
+ TUint8 aTransactionId,
+ const CMmDataPackage* aDataPackage,
+ TBool aSmsCheckDisableFdn );
+
+ /**
+ * Creates SMS_MESSAGE_SEND_REQ ISI message with all needed
+ * subblocks and sends it to SMS server.
+ * @param aTransactionId Transaction ID
+ * @param aMsgAttr Message attributes
+ * @param aMsgData TPDU
+ * @param aSubblockId Subblock ID
+ * @param TBool aSmsCheckDisableFdn: If ETrue the sub block
+ * SMS_SB_CHECK_INFO with SMS_CHECK_DISABLE_FDN is inculed
+ * when SMS_MESSAGE_SEND_REQ is sent.
+ * @return Symbian error code
+ */
+ TInt CreateSmsMessageSendReq(
+ TUint8 aTransactionId,
+ RMobileSmsMessaging::TMobileSmsSendAttributesV1* aMsgAttr,
+ const TDesC8& aMsgData,
+ TUint8 aSubblockId,
+ TBool aSmsCheckDisableFdn );
+
+ /**
+ * Response to SMS_RECEIVED_MSG_REQ.
+ * @param aIsiMsg ISI message
+ */
+ void SmsReceiveMessageResp( const TIsiReceiveC& aIsiMsg );
+
+ /**
+ * Incoming SMS message
+ * @param const TIsiReceiveC& aIsiMsg: The ISI message
+ */
+ void SmsReceivedMsgInd( const TIsiReceiveC& aIsiMsg );
+
+ /**
+ * Read received class2 SMS that has just been stored
+ * to SIM card
+ * @param TIsiReceiveC* aIsiMsg: A pointer to Isi message
+ * @return TInt: KErrNone
+ */
+ TInt ReadReceivedClass2Sms( TIsiReceiveC* aIsiMsg );
+
+ /**
+ * Response for SmsReceivedMsgReportReq
+ * @param const TIsiReceiveC& aIsiMsg: Isi message
+ */
+ void SmsReceivedMsgReportResp( const TIsiReceiveC& aIsiMsg );
+
+ // SIM Server responses
+ /**
+ * SIM Server responses
+ * @param const TIsiReceiveC& aIsiMsg: The received Isi message
+ * @return TInt: KErrNone
+ */
+ TInt SimStSmsWriteResp( const TIsiReceiveC& aIsiMsg );
+
+ /**
+ * Build Service Centre Address
+ * @param RMobilePhone::TMobileAddress const& scPtr: Pointer to
+ * Service center
+ * @param TDes8& aScAddress: Service centre address
+ * @return void: None
+ */
+ void BuildScAddress(
+ RMobilePhone::TMobileAddress const & scPtr,
+ TDes8& aScAddress ) const;
+
+ /**
+ * Build Destination Address
+ * @param RMobilePhone::TMobileAddress const& scPtr: Service centre ptr
+ * @param TDes8& aScAddress: Destination address
+ * @return void: None
+ */
+ void BuildDeAddress(
+ RMobilePhone::TMobileAddress const & scPtr,
+ TDes8& aDeAddress ) const;
+
+ /**
+ * Check message datacoding scheme
+ * @param TUint8 dcs: Data coding scheme
+ * @return TBool: ETrue if 7bit, else EFalse
+ */
+ TBool IsDataCodingScheme7Bit( TUint8 aDcs ) const;
+
+ /**
+ * Calculate number of characters in user data
+ * @param TUint8 aCharacterAmount: Character amount (from ISI message)
+ * @param TUint8 aDataLength: Data length in bytes (from ISI message)
+ * @param TPtrC8 const& aUserData: User data
+ * @return TUint8: number of characters in user data
+ */
+ TUint8 CalculateNumberOfCharsInUserData(
+ TUint8 aCharacterAmount,
+ TUint8 aDataLength,
+ TPtrC8 const& aUserData ) const;
+
+ /**
+ * Check if the SMS is from class2 or not
+ * @param const TIsiReceiveC& aIsiMsg: The Isi message
+ * @param TUint8& aSmsClass2ReplaceTpPid: set to tppid to replace
+ * @return TBool: ETrue is SMS Class is Class2
+ */
+ TBool IsSmsClass2(
+ const TIsiReceiveC& aIsiMsg,
+ TUint8& aSmsClass2ReplaceTpPid );
+
+ /**
+ * Checks if aReadSmsIsiMsg contains same TP-PID as
+ * aReceivedTpPid, and same sender number and Service Center number
+ * as aReceivedSmsIsiMsg.
+ * @param TUint8 aReceivedTpPid: received TP-PID
+ * @param const TIsiReceiveC& aReceivedSmsIsiMsg: received isi msg
+ * @param TDesC8& aSMSOnSIM: SMS stored on SIM
+ */
+ TBool CheckTpPidAndSenderAndServiceCenter(
+ TUint8 aReceivedTpPid,
+ const TIsiReceiveC& aReceivedSmsIsiMsg,
+ RMobileSmsStore::TMobileGsmSmsEntryV1* aSMSOnSIM );
+
+ /**
+ * Sends a SMS_SETTINGS_UPDATE_REQ (updates only the route
+ * setting) and saves the bearer setting in iMobileSmsBearer.
+ * @param RMobileSmsMessaging::TMobileSmsBearer& aBearer : Preferred
+ * SMS Bearer (CS or PS)
+ * @return TInt: KErrNone or error code
+ */
+ TInt SmsSettingsUpdateReq(
+ RMobileSmsMessaging::TMobileSmsBearer& aBearer );
+
+ /**
+ * Response for SmsSettingsUpdateReq
+ * @param const TIsiReceiveC& aIsiMsg: The receiced ISI message
+ * @return void
+ */
+ void SmsSettingsUpdateResp( const TIsiReceiveC& aIsiMsg );
+
+ /**
+ * Processes class2 SMS. Called by
+ * CMmSmsMessHandler::SmsReceivedMsgInd.
+ * @param const TIsiReceiveC& aIsiMsg received ISI-message
+ * @param TUint8 aIsReplace: is this replacement
+ * @return TInt system-wide error code
+ * @note does not complete request on error
+ */
+ TInt SmsClass2ReceivedMsgInd( const TIsiReceiveC& aIsiMsg,
+ TUint8 aIsReplace );
+
+ /**
+ * Processes class1 SMS. Called by
+ * CMmSmsMessHandler::SmsReceivedMsgInd.
+ * @param const TIsiReceiveC& aIsiMsg received ISI-message
+ * @return TInt system-wide error code
+ * @note does not complete request on error
+ */
+ TInt SmsClass1ReceivedMsgInd( const TIsiReceiveC& aIsiMsg );
+
+ /**
+ * Returns the length of destination address field from TPDU
+ * @param aMsgData SMS TPDU
+ * @param subBlockId Subblock ID
+ * @param aDestAddressLength Reference to destination address length
+ * @return Symbian error code
+ */
+ TInt GetDestAddressLength(
+ const TDesC8& aMsgData,
+ TUint8 subBlockId,
+ TUint8& aDestAddressLength ) const;
+
+ /**
+ * Creates SMS_SB_SUBMIT subblock and appends it to ISI message
+ * @param aMsgData SMS TPDU
+ * @param aIsiMsg ISI message
+ * @param aDestAddressLength Destination address length
+ * @param aMsgOffset Offset of ISI message where to append subblock
+ * @return void
+ */
+ void BuildSmsSbSubmit(
+ const TDesC8& aMsgData,
+ TIsiSend& aIsiMsg,
+ TUint8 aDestAddressLength,
+ TUint8 aMsgOffset ) const;
+
+ /**
+ * Creates SMS_SB_COMMAND subblock and appends it to ISI message
+ * @param aMsgData SMS TPDU
+ * @param aIsiMsg ISI message
+ * @param aMsgOffset Offset of ISI message where to append subblock
+ * @return void
+ */
+ void BuildSmsSbCommand(
+ const TDesC8& aMsgData,
+ TIsiSend& aIsiMsg,
+ TUint8 aMsgOffset ) const;
+
+ /**
+ * Creates SMS_SB_ADDRESS subblock and appends it to ISI message
+ * @param aAddress Address data
+ * @param aIsiMsg ISI message
+ * @param aAddressType Address type
+ * @param aMsgOffset Offset of ISI message where to append subblock
+ * @return Length of created subblock
+ */
+ TUint8 BuildSmsSbAddress(
+ const TDesC8& aAddress,
+ TIsiSend& aIsiMsg,
+ TUint8 aAddressType,
+ TUint8 aMsgOffset ) const;
+
+ /**
+ * Creates SMS_SB_USER_DATA subblock and appends it to ISI message
+ * @param aMsgData SMS TPDU
+ * @param aIsiMsg ISI message
+ * @param aTpUdl User data length from TPDU
+ * @param aTpUserDataIndex Index of user data in TPDU
+ * @param aDefaultAlphabet Is 7-bit coding used
+ * @param aMsgOffset Offset of ISI message where to append subblock
+ * @return Length of created subblock
+ */
+ TUint8 BuildSmsSbUserData(
+ const TDesC8& aMsgData,
+ TIsiSend& aIsiMsg,
+ TUint8 aTpUdl,
+ TUint8 aTpUserDataIndex,
+ TBool aDefaultAlphabet,
+ TUint8 aMsgOffset ) const;
+
+ /**
+ * Creates SMS_SB_VALIDITY_PERIOD subblock and appends it to ISI message
+ * @param aMsgData SMS TPDU
+ * @param aIsiMsg ISI message
+ * @param aTpVpIndex Index of validity period in TPDU
+ * @param aTpVpLength Length of validity period
+ * @param aMsgOffset Offset of ISI message where to append subblock
+ * @return void
+ */
+ void BuildSmsSbValidityPeriod(
+ const TDesC8& aMsgData,
+ TIsiSend& aIsiMsg,
+ TUint8 aTpVpIndex,
+ TUint8 aTpVpLength,
+ TUint8 aMsgOffset )const;
+
+ /**
+ * Creates SMS_SB_CHECK_INFO sub block with SMS_CHECK_DISABLE_FDN and appends it
+ * to ISI message.
+ * @param aIsiMsg ISI message
+ * @param aMsgOffset Offset of ISI message where to append subblock
+ * @return void
+ */
+ void BuildSmsCheckInfo(
+ TIsiSend& aIsiMsg,
+ TUint8 aMsgOffset )const;
+
+ /**
+ * Read SMS or EF SMS record count from SIM/USIM
+ * @param aRecordId (If record count is requested this value has no
+ * effect => may be set e.g. 0 or FF)
+ * @param aTrId Transaction ID:
+ * - ETrIdReadSMS when SMS is read from certain record.
+ * - ETrIdReadSMSRecordCount when EF SMS record count is requested.
+ * @return Error code
+ */
+ TInt UiccReadSMSOrSMSRecordCountReq( const TUint8 aRecordId,
+ const TUiccTrId aTrId );
+
+ /**
+ * Read Class 2 SMS from SIM/USIM response
+ * @param aStatus Status
+ * @param aFileData File data
+ * @return void
+ */
+ void UiccReadSMSResp(
+ TInt aStatus,
+ const TDesC8& aFileData );
+
+ /**
+ * Read Class 2 SMS from SIM/USIM response when SMS is at first
+ * written to SIM
+ * @param aStatus Status
+ * @param aFileData File data
+ * @return void
+ */
+ void UiccReadSMSRespForComplete(
+ TInt aStatus,
+ const TDesC8& aFileData );
+
+ /**
+ * Write Class 2 SMS from SIM/USIM
+ * @param aInfo Flags 2 data
+ * @return void
+ */
+ TInt UiccWriteSMSReq(
+ const RMobileSmsStore::TMobileGsmSmsEntryV1& aEntry,
+ const TUint8 aRecordId );
+
+ /**
+ * Write Class 2 SMS from SIM/USIM response
+ * @param aInfo Flags 2 data
+ * @return void
+ */
+ void UiccWriteSMSResp( TInt aStatus );
+
+ /**
+ * Read number of EF SMS records
+ * @return void
+ */
+ void GetNumOfEFSMSRecords( void );
+
+ /**
+ * Response for Read EF SMS record count
+ * @param aStatus Status
+ * @param aFileData File data
+ * @return void
+ */
+ void GetNumOfEFSMSRecordsResp(
+ TInt aStatus,
+ const TDesC8& aFileData );
+
+ //ATTRIBUTES
+ public:
+ //none
+
+ private:
+
+ // Pointer to the message router
+ CMmMessageRouter* iMessageRouter;
+
+ // Pointer to the PhonetSender
+ CMmPhoNetSender* iPhoNetSender;
+
+ // Operator name from SIM
+ TBuf16<KOperatorNameMaxLength> iOperatorName;
+
+ // SIM SMS cache
+ CMmSmsCache iSmsCache;
+
+ // Slot (location ) in which the SMS is going to be written on SIM card
+ // This is needed because write resp doesn't contain the slot written to
+ // information..
+ TUint8 iSmsSlotLocation;
+
+ // Read all parameter sets location index
+ TUint8 iLocationOfSmspSet;
+
+ // Amounth of SMS parameter sets to be read
+ TUint8 iAmountOfSmspSets;
+
+ // Temporary SMS parameter storage array, that is used while
+ // retrieving of SMSP list
+ CArrayPtrFlat<TSmsParameters>* iSmspListArray;
+
+ // Write SMS message pointer
+ const RMobileSmsStore::TMobileGsmSmsEntryV1* iWriteSmsEntryPtr;
+
+ // SMS message list storage array
+ CArrayPtrFlat<TSmsMsg>* iSmsListArray;
+
+ // flag to check if a Class2 SMS has been received while
+ // SMS lots were being read
+ TBool iReceivedClass2ToBeReSent;
+
+ // MO SMS Bearer
+ RMobileSmsMessaging::TMobileSmsBearer iMobileSmsBearer;
+
+ // Is SMS Sending ongoing
+ TBool iSMSSendingOngoing;
+
+ // Record ID saved during query
+ TUint8 iRecordId;
+
+ // Pointer to UICC message handler
+ CMmUiccMessHandler* iMmUiccMessHandler;
+
+ // Flag to check is the case class 2 SMS write or EMobileStoreWrite
+ TBool iSMSClass2Write;
+ };
+
+#endif // _CMMSMSMESSHANDLER_H_
+
+//End of file