adaptationlayer/tsy/nokiatsy_dll/inc/cmmsmsmesshandler.h
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /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