williamr@2: // Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // This file define the classes for the different PDU elements williamr@2: // williamr@2: // williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file williamr@2: */ williamr@2: williamr@2: #ifndef __GSMUELEM_H__ williamr@2: #define __GSMUELEM_H__ williamr@2: williamr@2: // Includes williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: class RFs; williamr@2: class RReadStream; williamr@2: class RWriteStream; williamr@2: class CSmsEMSBufferSegmenter; williamr@2: williamr@2: williamr@2: // class declarations williamr@2: williamr@2: /** williamr@2: * Decoding error. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: const TInt KErrGsmuDecoding = KErrCorrupt; williamr@2: /** williamr@2: * @internalComponent williamr@2: */ williamr@2: _LIT8(KMOSES,"\x40\x4d\x64\xd3\x50\x00"); williamr@2: /** williamr@2: * @internalComponent williamr@2: */ williamr@2: _LIT16(KNETWORK,"NETWORK"); williamr@2: williamr@2: williamr@2: // Constants williamr@2: /** williamr@2: * @internalComponent williamr@2: */ williamr@2: const TUint8 KSms7BitAlphabetEscapeChar=0x1b; williamr@2: williamr@2: williamr@2: /** williamr@2: * Thin wrapper over TLex8 to provide leaving functions when getting the next williamr@2: * character(s). williamr@2: * williamr@2: * These functions leave with KErrGsmuDecoding if there are insufficient characters williamr@2: * remaining. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TGsmuLex8 : public TLex8 williamr@2: { williamr@2: public: williamr@2: TGsmuLex8(const TDesC8& aSource); williamr@2: TUint8 GetL(); williamr@2: void IncL(TInt aNumber = 1); williamr@2: TPtrC8 NextWithNoIncL(TInt aLength) const; williamr@2: TPtrC8 NextWithNoIncL(TInt aLength, TBool aAcceptTruncation) const; williamr@2: TPtrC8 NextAndIncL(TInt aLength); williamr@2: williamr@2: private: williamr@2: inline void LeaveL() const; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Base class for performing all operations on octets. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsOctet williamr@2: { williamr@2: public: williamr@2: inline TSmsOctet(TInt aValue); williamr@2: inline TSmsOctet(TUint8 aValue = 0); williamr@2: inline operator TInt() const; williamr@2: const TSmsOctet& operator = (TInt aValue); williamr@2: inline void FillSemiOctets(TInt aNum); williamr@2: inline TInt SemiOctetsToNum() const; williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: inline void DecodeL(TGsmuLex8& aPdu); williamr@2: inline void InternalizeL(RReadStream& aStream); williamr@2: inline void ExternalizeL(RWriteStream& aStream) const; williamr@2: protected: williamr@2: /** Octet value. */ williamr@2: TUint8 iValue; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Bit masks for key first octet of an SMS PDU williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsFirstOctet : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** TP-MTI (Message Type Indicator) First octet of all SMS PDUs. */ williamr@2: enum TSmsMTI williamr@2: { williamr@2: /** SMS-DELIVER or SMS-DELIVER-REPORT message. */ williamr@2: ESmsMTIDeliverOrDeliverReport=0x00, williamr@2: /** SMS-SUBMIT or SMS-SUBMIT-REPORT message. */ williamr@2: ESmsMTISubmitOrSubmitReport=0x01, williamr@2: /** SMS-STATUS or SMS-COMMAND message. */ williamr@2: ESmsMTIStatusReportOrCommand=0x02, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsMTIMask=0x03 williamr@2: }; williamr@2: williamr@2: /** williamr@2: * TP-UDHI (User Data Header Indicator) Found in first octet of williamr@2: * Submit and Deliver and possibly, Deliver Report and Status Report. williamr@2: */ williamr@2: enum TSmsUDHI williamr@2: { williamr@2: /** User data header indicator not present. */ williamr@2: ESmsUDHIHeaderNotPresent=0x00, williamr@2: /** User data header indicator present. */ williamr@2: ESmsUDHIHeaderPresent=0x40, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsUDHIMask=0x40 williamr@2: }; williamr@2: williamr@2: /** TP-RP (Reply Path) Found in first octet of Submit and Deliver. */ williamr@2: enum TSmsReplyPath williamr@2: { williamr@2: /** Reply path does not exist. */ williamr@2: ESmsReplyPathNone=0x00, williamr@2: /** Reply path exists. */ williamr@2: ESmsReplyPathExists=0x080, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsReplyPathMask=0x80 williamr@2: }; williamr@2: williamr@2: /** TP-MMS (More Messages To Send) Found in Deliver and Status Report. */ williamr@2: enum TSmsMoreMessagesToSend williamr@2: { williamr@2: /** More messages to send. */ williamr@2: ESmsMoreMessagesToSend=0x00, williamr@2: /** No more messages to send. */ williamr@2: ESmsNoMoreMessagesToSend=0x04, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsMoreMessagesToSendMask=0x04, williamr@2: }; williamr@2: williamr@2: /** T-SRI (Status Report Indicator) Found in Status Report. */ williamr@2: enum TSmsStatusReportIndicator williamr@2: { williamr@2: /** Status report is not going to be returned. */ williamr@2: ESmsStatusReportNotReturned=0x00, williamr@2: /** Status report is going to be returned. */ williamr@2: ESmsStatusReportReturned=0x20, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsStatusReportIndicatorMask=0x20 williamr@2: }; williamr@2: williamr@2: /** TP-RD bit flags. */ williamr@2: enum TSmsRejectDuplicates williamr@2: /** williamr@2: * T-RD (Reject Duplicates) Found in Submit williamr@2: */ williamr@2: { williamr@2: /** Accept duplicates. */ williamr@2: ESmsAcceptDuplicates=0x00, williamr@2: /** Reject duplicates. */ williamr@2: ESmsRejectDuplicates=0x04, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsRejectDuplicatesMask=0x04 williamr@2: }; williamr@2: williamr@2: /** T-SRQ (Status Report Qualifier). Found in Status Report. */ williamr@2: enum TSmsStatusReportQualifier williamr@2: { williamr@2: /** Status report result of submit. */ williamr@2: ESmsStatusReportResultOfSubmit=0x00, williamr@2: /** Status report result of command. */ williamr@2: ESmsStatusReportResultOfCommand=0x20, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsStatusReportQualifierMask=0x20 williamr@2: }; williamr@2: williamr@2: /** TP-VPF (Validity Period Format). Found in Submit. */ williamr@2: enum TSmsValidityPeriodFormat williamr@2: { williamr@2: /** TP-VP field not present. */ williamr@2: ESmsVPFNone=0x00, williamr@2: /** TP-VP field present. Enhanced format (7 octets). */ williamr@2: ESmsVPFEnhanced=0x08, // was ESmsVPFReserved, the new GSM spec! williamr@2: /** TP-VP field present, relative validity format. */ williamr@2: ESmsVPFInteger=0x10, // relative validity period williamr@2: /** TP-VP field present, absolute validity format. */ williamr@2: ESmsVPFSemiOctet=0x18, // absolute validity period williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsVPFMask=0x18 williamr@2: }; williamr@2: williamr@2: /** TP-SRR (Status Report Request) Found in Submit and Command. */ williamr@2: enum TSmsStatusReportRequest williamr@2: { williamr@2: /** Status report is not requested. */ williamr@2: ESmsStatusReportNotRequested=0x00, williamr@2: /** Status report is requested. */ williamr@2: ESmsStatusReportRequested=0x20, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsStatusReportRequestMask=0x20 williamr@2: }; williamr@2: williamr@2: public: williamr@2: TSmsFirstOctet(TInt aValue=0); williamr@2: const TSmsFirstOctet& operator = (TInt aValue); // Review williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * TP-FCS (Failure Cause) octet. For Deliver and Submit errors williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsFailureCause : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** TP-FCS flags. */ williamr@2: enum TSmsFailureCauseError williamr@2: { williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: // PID errors williamr@2: /** Telematic interworking not supported. */ williamr@2: ESmsPIDErrorTelematicInterworkingNotSupported=0x80, williamr@2: /** Short message Type 0 not supported. */ williamr@2: ESmsPIDErrorShortMessageType0NotSupported=0x81, williamr@2: /** Cannot replace short message. */ williamr@2: ESmsPIDErrorCannotReplaceShortMessage=0x82, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved1=0x83, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved2=0x84, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved3=0x85, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved4=0x86, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved5=0x87, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved6=0x88, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved7=0x89, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved8=0x8A, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved9=0x8B, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved10=0x8C, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved11=0x8D, williamr@2: /** Reserved. */ williamr@2: ESmsPIDErrorReserved12=0x8E, williamr@2: /** Unspecified TP-PID error. */ williamr@2: ESmsPIDErrorUnspecified=0x8F, williamr@2: // DCS errors williamr@2: /** Data coding scheme (alphabet) not supported. */ williamr@2: ESmsDCSErrorAlphabetNotSupported=0x90, williamr@2: /** Message class not supported. */ williamr@2: ESmsDCSErrorMessageClassNotSupported=0x91, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved1=0x92, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved2=0x93, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved3=0x94, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved4=0x95, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved5=0x96, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved6=0x97, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved7=0x98, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved8=0x99, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved9=0x9A, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved10=0x9B, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved11=0x9C, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved12=0x9D, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorReserved13=0x9E, williamr@2: /** Reserved. */ williamr@2: ESmsDCSErrorUnspecified=0x9F, williamr@2: // CommandErrors williamr@2: /** Command cannot be actioned. */ williamr@2: ESmsCommandErrorCannotBeActioned=0xA0, williamr@2: /** Command unsupported. */ williamr@2: ESmsCommandErrorUnsupported=0xA1, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved1=0xA2, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved2=0xA3, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved3=0xA4, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved4=0xA5, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved5=0xA6, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved6=0xA7, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved7=0xA8, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved8=0xA9, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved9=0xAA, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved10=0xAB, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved11=0xAC, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved12=0xAD, williamr@2: /** Reserved. */ williamr@2: ESmsCommandErrorReserved13=0xAE, williamr@2: /** Unspecified TP-Command error. */ williamr@2: ESmsCommandErrorUnspecified=0xAF, williamr@2: // williamr@2: /** PDU not supported. */ williamr@2: ESmsErrorPDUNotSupported=0xB0, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: /** SC busy. */ williamr@2: ESmsErrorSCBusy=0xC0, williamr@2: /** No SC subscription. */ williamr@2: ESmsErrorNoSCSubscription=0xC1, williamr@2: /** SC system failure. */ williamr@2: ESmsErrorNoSCSystemFailure=0xC2, williamr@2: /** Invalid SME address. */ williamr@2: ESmsErrorInvalidSMEAddress=0xC3, williamr@2: /** Destination SME barred. */ williamr@2: ESmsErrorDestinationSMEBarred=0xC4, williamr@2: /** SM Rejected-Duplicate SM. */ williamr@2: ESmsErrorSMRejectedDuplicateSM=0xC5, williamr@2: /** TP-VPF not supported. */ williamr@2: ESmsErrorVPFNotSupported=0xC6, williamr@2: /** TP-VP not supported. */ williamr@2: ESmsErrorVPNotSupported=0xC7, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: /** SIM SMS storage full. */ williamr@2: ESmsErrorSIMSMSStorageFull=0xD0, williamr@2: /** No SMS storage capability in (U)SIM. */ williamr@2: ESmsErrorNoSMSStorageCapabilityOnSIM=0xD1, williamr@2: /** Error in MS. */ williamr@2: ESmsErrorErrorInMS=0xD2, williamr@2: /** Memory Capacity Exceeded. */ williamr@2: ESmsErrorMemoryCapacityExceded=0xD3, williamr@2: /** (U)SIM Application Toolkit Busy. */ williamr@2: ESmsErrorSIMApplicationToolkitBusy=0xD4, williamr@2: /** (U)SIM data download error. */ williamr@2: ESmsErrorSIMDataDownloadError=0xD5, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError1=0xE0, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError2=0xE1, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError3=0xE2, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError4=0xE3, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError5=0xE4, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError6=0xE5, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError7=0xE6, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError8=0xE7, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError9=0xE8, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError10=0xE9, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError11=0xEA, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError12=0xEB, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError13=0xEC, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError14=0xED, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError15=0xEE, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError16=0xEF, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError17=0xF0, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError18=0xF1, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError19=0xF2, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError20=0xF3, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError21=0xF4, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError22=0xF5, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError23=0xF6, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError24=0xF7, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError25=0xF8, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError26=0xF9, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError27=0xFA, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError28=0xFB, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError29=0xFC, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError30=0xFD, williamr@2: /** Value specific to an application. */ williamr@2: ESmsApplicationError31=0xFE, williamr@2: // williamr@2: /** Unspecified error cause. */ williamr@2: ESmsErrorUnspecified=0xFF, williamr@2: williamr@2: /** @internalComponent */ williamr@2: ESmsErrorFree=0x100 williamr@2: }; williamr@2: public: williamr@2: TSmsFailureCause(); williamr@2: inline TInt Error() const; williamr@2: inline void SetError(TSmsFailureCauseError aError); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * TP-ST (Status Report) octet. Found in Status Report williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsStatus : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** TP-ST flag values. */ williamr@2: enum TSmsStatusValue williamr@2: { williamr@2: // Short message transaction completed williamr@2: /** Short message received by the SME. */ williamr@2: ESmsShortMessageReceivedBySME=0x00, williamr@2: /** williamr@2: * Short message forwarded by the SC to the SME but the SC is unable to confirm williamr@2: * delivery. williamr@2: */ williamr@2: ESmsShortMessageForwardedBySCToSMEButUnconfirmedBySC=0x01, williamr@2: /** Short message replaced by the SC. */ williamr@2: ESmsShortMessageReplacedBySC=0x02, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: // Temporary error, SC still trying to transfer SM williamr@2: /** Temporary error, SC still trying to transfer SM: congestion. */ williamr@2: ESmsTempError1StatusCongestion=0x20, williamr@2: /** Temporary error, SC still trying to transfer SM: SME busy. */ williamr@2: ESmsTempError1StatusSMEBusy=0x21, williamr@2: /** Temporary error, SC still trying to transfer SM: No response from SME. */ williamr@2: ESmsTempError1StatusNoResponseFromSME=0x22, williamr@2: /** Temporary error, SC still trying to transfer SM: Service rejected. */ williamr@2: ESmsTempError1StatusServiceRejected=0x23, williamr@2: /** Temporary error, SC still trying to transfer SM: Quality of service not available. */ williamr@2: ESmsTempError1StatusQualityOfServiceNotAvailable=0x24, williamr@2: /** Temporary error, SC still trying to transfer SM: Error in SME. */ williamr@2: ESmsTempError1StatusErrorInSME=0x25, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: // Permanent error, SC is not making any more transfer attempts williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: Remote procedure williamr@2: * error. williamr@2: */ williamr@2: ESmsPermErrorRemoteProcedureError=0x40, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: Incompatible williamr@2: * destination. williamr@2: */ williamr@2: ESmsPermErrorIncompatibleDestination=0x41, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: Connection rejected williamr@2: * by SME. williamr@2: */ williamr@2: ESmsPermErrorConnectionRejectedBySME=0x42, williamr@2: /** Permanent error, SC is not making any more transfer attempts: Not obtainable. */ williamr@2: ESmsPermErrorNotObtainable=0x43, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: Quality of service williamr@2: * not available. williamr@2: */ williamr@2: ESmsPermErrorQualityOfServiceNotAvailable2=0x44, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: No interworking williamr@2: * available. williamr@2: */ williamr@2: ESmsPermErrorNoInterworkingAvailable=0x45, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: SM Validity Period williamr@2: * Expired. williamr@2: */ williamr@2: ESmsPermErrorSMValidityPeriodExpired=0x46, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: SM Deleted by williamr@2: * originating SME. williamr@2: */ williamr@2: ESmsPermErrorSMDeletedByOriginatingSME=0x47, williamr@2: /** williamr@2: * Permanent error, SC is not making any more transfer attempts: SM Deleted by williamr@2: * SC Administration. williamr@2: */ williamr@2: ESmsPermErrorSMDeletedBySCAdministration=0x48, williamr@2: /** Permanent error, SC is not making any more transfer attempts: SM does not exist. */ williamr@2: ESmsPermErrorDoesNotExist=0x49, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: // Temporary error, SC is not making any more transfer attempts williamr@2: /** Temporary error, SC is not making any more transfer attempts: Congestion. */ williamr@2: ESmsTempError2Congestion=0x60, williamr@2: /** Temporary error, SC is not making any more transfer attempts: SME Busy. */ williamr@2: ESmsTempError2SMEBusy=0x61, williamr@2: /** williamr@2: * Temporary error, SC is not making any more transfer attempts: No response from williamr@2: * SME. williamr@2: */ williamr@2: ESmsTempError2NoResponseFromSME=0x62, williamr@2: /** Temporary error, SC is not making any more transfer attempts: Service rejected. */ williamr@2: ESmsTempError2ServiceRejected=0x63, williamr@2: /** williamr@2: * Temporary error, SC is not making any more transfer attempts: Quality of service williamr@2: * not available. williamr@2: */ williamr@2: ESmsTempError2QualityOfServiceNotAvailable=0x64, williamr@2: /** Temporary error, SC is not making any more transfer attempts: Error in SME. */ williamr@2: ESmsTempError2ErrorInSME=0x65, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: }; williamr@2: public: williamr@2: TSmsStatus(); williamr@2: inline TSmsStatus::TSmsStatusValue Status() const; williamr@2: inline void SetStatus(TSmsStatusValue aValue); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * TP-PI octet. Found in Reports and Commands williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsParameterIndicator : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** TP-PI bit flags. */ williamr@2: enum TSmsPIBits williamr@2: { williamr@2: /** Protocol identifier present. */ williamr@2: ESmsPIDProtocolIdentifierPresent=0x01, williamr@2: /** Data coding scheme present. */ williamr@2: ESmsPIDDataCodingSchemePresent=0x02, williamr@2: /** User data present. */ williamr@2: ESmsPIDUserDataPresent=0x04, williamr@2: /** Reserved. */ williamr@2: ESmsPIDReserved1=0x08, williamr@2: /** Reserved. */ williamr@2: ESmsPIDReserved2=0x10, williamr@2: /** Reserved. */ williamr@2: ESmsPIDReserved3=0x20, williamr@2: /** Reserved. */ williamr@2: ESmsPIDReserved4=0x40, williamr@2: /** Extension. */ williamr@2: ESmsPIDExtension=0x80 williamr@2: }; williamr@2: public: williamr@2: TSmsParameterIndicator(); williamr@2: inline TBool Extension() const; williamr@2: inline void SetExtension(TBool aExtension); williamr@2: inline TBool UserDataPresent() const; williamr@2: inline void SetUserDataPresent(TBool aPresent); williamr@2: inline TBool DataCodingSchemePresent() const; williamr@2: inline void SetDataCodingSchemePresent(TBool aPresent); williamr@2: inline TBool ProtocolIdentifierPresent() const; williamr@2: inline void SetProtocolIdentifierPresent(TBool aPresent); williamr@2: }; williamr@2: williamr@2: // TSmsPID - conversion (None, Fax, Mail, etc.) williamr@2: williamr@2: /** williamr@2: * TP-PID PDU octet. Found in ALL 6 message types. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsProtocolIdentifier : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** PID bits 7-6, which determine the meaning of the lower order bits. */ williamr@2: enum TSmsPIDType williamr@2: { williamr@2: /** Telematic interworking. */ williamr@2: ESmsPIDTelematicInterworking=0x00, williamr@2: /** Short message. */ williamr@2: ESmsPIDShortMessageType=0x40, williamr@2: /** Reserved. */ williamr@2: ESmsPIDReserved=0x80, williamr@2: /** SC specific use. */ williamr@2: ESmsPIDSCSpecificUse=0xC0, williamr@2: williamr@2: /** Mask of bits 7-6. */ williamr@2: ESmsPIDTypeMask=0xC0 williamr@2: }; williamr@2: williamr@2: /** Telematic device indicator flags. Bit 5 - When Bit 7 = 0, Bit 6 = 0 */ williamr@2: enum TSmsTelematicDeviceIndicator williamr@2: { williamr@2: /** No telematic device. */ williamr@2: ESmsNoTelematicDevice=0x00, williamr@2: /** Telematic device. */ williamr@2: ESmsTelematicDevice=0x20, williamr@2: williamr@2: /** Telematic device indicator mask. */ williamr@2: EPIDTelematicDeviceIndicatorMask=0x20 williamr@2: }; williamr@2: williamr@2: /** Telematic Interworking device type flags. Bits 4-0 - When Bit 5 = 1*/ williamr@2: enum TSmsTelematicDeviceType williamr@2: { williamr@2: /** Device type is specific to this SC. */ williamr@2: ESmsSCSpecificDevice=0x00, williamr@2: /** Telex. */ williamr@2: ESmsTelex=0x01, williamr@2: /** Group 3 telefax. */ williamr@2: ESmsGroup3TeleFax=0x02, williamr@2: /** Group 4 telefax. */ williamr@2: ESmsGroup4TeleFax=0x03, williamr@2: /** Voice telephone. */ williamr@2: ESmsVoiceTelephone=0x04, williamr@2: /** ERMES. */ williamr@2: ESmsERMES=0x05, williamr@2: /** National Paging System. */ williamr@2: ESmsNationalPagingSystem=0x06, williamr@2: /** Videotex. */ williamr@2: ESmsVideotex=0x07, williamr@2: /** Teletex, carrier unspecified. */ williamr@2: ESmsTeletexCarrierUnspecified=0x08, williamr@2: /** Teletex, PSPDN. */ williamr@2: ESmsTeletexPSPDN=0x09, williamr@2: /** Teletex, CSPDN. */ williamr@2: ESmsTeletexCSPDN=0x0A, williamr@2: /** Teletex, in analog PSTN. */ williamr@2: ESmsTeletexAnaloguePSTN=0x0B, williamr@2: /** Teletex, in digital ISDN */ williamr@2: ESmsTeletexDigitalISDN=0x0C, williamr@2: /** UCI (Universal Computer Interface, ETSI DE/PS 3 01-3). */ williamr@2: ESmsUCI=0x0D, williamr@2: /** Reserved. */ williamr@2: ESmsReserved1=0x0E, williamr@2: /** Reserved. */ williamr@2: ESmsReserved2=0x0F, williamr@2: /** A message handling facility. */ williamr@2: ESmsMessageHandlingFacility=0x10, williamr@2: /** X.400 message handling system. */ williamr@2: ESmsX400MessageHandlingSystem=0x11, williamr@2: /** Internet Electronic Mail. */ williamr@2: ESmsInternetElectronicMail=0x12, williamr@2: /** Reserved. */ williamr@2: ESmsReserved3=0x13, williamr@2: /** Reserved. */ williamr@2: ESmsReserved4=0x14, williamr@2: /** Reserved. */ williamr@2: ESmsReserved5=0x15, williamr@2: /** Reserved. */ williamr@2: ESmsReserved6=0x16, williamr@2: /** Reserved. */ williamr@2: ESmsReserved7=0x17, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific1=0x18, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific2=0x19, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific3=0x1A, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific4=0x1B, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific5=0x1C, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific6=0x1D, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsSCSpecific7=0x1E, williamr@2: /** Value specific to each SC. */ williamr@2: ESmsGsmMobileStation=0x1F, williamr@2: williamr@2: /** Mask for telematic device type bits. */ williamr@2: ESmsTelematicDeviceTypeMask=0x1F williamr@2: }; williamr@2: williamr@2: /** SM-AL protocol flag. No Telematic Interworking. Bits 4-0 - When Bit 5 = 0*/ williamr@2: enum TSmsShortMessageALProtocol williamr@2: { williamr@2: /** Mask for SM-AL protocol flag bit. */ williamr@2: ESmsShortMessageALProtocolMask=0x0F williamr@2: }; williamr@2: williamr@2: /** Short Message Type flags. Bits 5-0 - When Bit 7 = 1, Bit 6 = 0*/ williamr@2: enum TSmsShortMessageType williamr@2: { williamr@2: /** Short Message Type 0. */ williamr@2: ESmsShortMessageType0=0x00, williamr@2: /** Replace Short Message Type 1. */ williamr@2: ESmsReplaceShortMessageType1=0x01, williamr@2: /** Replace Short Message Type 2. */ williamr@2: ESmsReplaceShortMessageType2=0x02, williamr@2: /** Replace Short Message Type 3. */ williamr@2: ESmsReplaceShortMessageType3=0x03, williamr@2: /** Replace Short Message Type 4. */ williamr@2: ESmsReplaceShortMessageType4=0x04, williamr@2: /** Replace Short Message Type 5. */ williamr@2: ESmsReplaceShortMessageType5=0x05, williamr@2: /** Replace Short Message Type 6. */ williamr@2: ESmsReplaceShortMessageType6=0x06, williamr@2: /** Replace Short Message Type 7. */ williamr@2: ESmsReplaceShortMessageType7=0x07, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: /** Return Call Message. */ williamr@2: ESmsReturnCallMesage=0x1F, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: ESmsAnsi136RData=0x3C, williamr@2: ESmsMEDataDownload=0x3D, williamr@2: /** ME De-personalization Short Message. */ williamr@2: ESmsMEDepersonalizationShortMessage=0x3E, williamr@2: /** ME Data download. */ williamr@2: ESmsSIMDataDownLoad=0x3F, williamr@2: williamr@2: // ESmsShortMessageTypeMask=0x1F williamr@2: /** Mask for Short Message type bits. */ williamr@2: ESmsShortMessageTypeMask=0x3F williamr@2: }; williamr@2: public: williamr@2: TSmsProtocolIdentifier(); williamr@2: inline TSmsPIDType PIDType() const; williamr@2: inline void SetPIDType(TSmsPIDType aSmsPIDType); williamr@2: TSmsTelematicDeviceIndicator TelematicDeviceIndicator() const; williamr@2: void SetTelematicDeviceIndicator(TSmsTelematicDeviceIndicator aIndicator); williamr@2: TSmsTelematicDeviceType TelematicDeviceType() const; williamr@2: void SetTelematicDeviceType(TSmsTelematicDeviceType aDeviceType); williamr@2: TInt ShortMessageALProtocol() const; williamr@2: void SetShortMessageALProtocol(TSmsShortMessageALProtocol aProtocol); williamr@2: TInt ShortMessageType() const; williamr@2: void SetShortMessageType(TSmsShortMessageType aShortMessageType); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * TP-DCS Data Coding Scheme defined in 3GPP TS 23.038. williamr@2: * williamr@2: * The data coding scheme is not always present in an GSM SMS PDU (CSmsPDU). williamr@2: * It is always present for a SUBMIT (CSmsSubmit) and a DELIVER (CSmsDeliver), williamr@2: * and is sometimes present for a DELIVER REPORT (CSmsDeliverReport), a SUBMIT williamr@2: * REPORT (CSmsSubmitReport) or a STATUS REPORT (CSmsStatusReport), depending williamr@2: * on the parameter indicator (TSmsParameterIndicator). williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsDataCodingScheme : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** Flags for bits 7-4, which determine the meaning of the lower order bits. */ williamr@2: enum TSmsDCSBits7To4 williamr@2: { williamr@2: /** Text is uncompressed, no class information. */ williamr@2: ESmsDCSTextUncompressedWithNoClassInfo=0x00, williamr@2: /** Text is uncompressed, class information present. */ williamr@2: ESmsDCSTextUncompressedWithClassInfo=0x10, williamr@2: /** Text is compressed, no class information. */ williamr@2: ESmsDCSTextCompressedWithNoClassInfo=0x20, williamr@2: /** Text is compressed, class information present. */ williamr@2: ESmsDCSTextCompressedWithClassInfo=0x30, williamr@2: williamr@2: /** Auto Deletion, Text is uncompressed, no class information. */ williamr@2: ESmsDCSAutoDelNoClassInfoUncompressedText=0x40, williamr@2: /** Auto Deletion, Text is uncompressed, class information present. */ williamr@2: ESmsDCSAutoDelClassInfoUncompressedText=0x50, williamr@2: /** Auto Deletion, Text is compressed, no class information. */ williamr@2: ESmsDCSAutoDelNoClassInfoCompressedText=0x60, williamr@2: /** Auto Deletion, Text is compressed, class information present. */ williamr@2: ESmsDCSAutoDelClassInfoTextCompressedText=0x70, williamr@2: williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved1=0x40, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved2=0x50, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved3=0x60, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved4=0x70, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved5=0x80, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved6=0x90, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved7=0xA0, williamr@2: /** Reserved. */ williamr@2: ESmsDCSReserved8=0xB0, williamr@2: williamr@2: williamr@2: williamr@2: /** Message Waiting Indication Group: Discard Message. */ williamr@2: ESmsDCSMessageWaitingIndicationDiscardMessage=0xC0, williamr@2: williamr@2: /** Message Waiting Indication Group (7 bit). */ williamr@2: ESmsDCSMessageWaitingIndication7Bit=0xD0, // 7 bit User data williamr@2: /** Message Waiting Indication Group (UCS2). */ williamr@2: ESmsDCSMessageWaitingIndicationUCS2=0xE0, // unicode User data williamr@2: williamr@2: /** Text uncompressed, 7 bit or 8 bit. */ williamr@2: ESmsDCSTextUncompressed7BitOr8Bit=0xF0, williamr@2: williamr@2: /** Masks bits 7 to 4. */ williamr@2: ESmsDCSBits7To4Mask=0xF0 williamr@2: }; williamr@2: williamr@2: /** Message Marked for Automatic Deletion */ williamr@2: enum TAutomaticDeletionGroup williamr@2: { williamr@2: ESmsDCSAutomaticDeletion = 0x40, williamr@2: ESmsDCSAutomaticDeletionMask = 0xC0 williamr@2: }; williamr@2: williamr@2: /** Alphabet bit flags. */ williamr@2: enum TSmsAlphabet williamr@2: { williamr@2: /** GSM 7 bit default alphabet. */ williamr@2: ESmsAlphabet7Bit=0x00, williamr@2: /** 8-bit data. */ williamr@2: ESmsAlphabet8Bit=0x04, williamr@2: /** UCS2. */ williamr@2: ESmsAlphabetUCS2=0x08, williamr@2: /** Reserved. */ williamr@2: ESmsAlphabetReserved=0x0C, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsAlphabetMask=0x0C, williamr@2: }; williamr@2: /** Message Class bit flags. */ williamr@2: enum TSmsClass williamr@2: { williamr@2: /** Class 0. */ williamr@2: ESmsClass0=0x00, williamr@2: /** Class 1. */ williamr@2: ESmsClass1=0x01, williamr@2: /** Class 2. */ williamr@2: ESmsClass2=0x02, williamr@2: /** Class 3. */ williamr@2: ESmsClass3=0x03, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsClassMask=0x03, williamr@2: }; williamr@2: williamr@2: /** Indication Sense bit flags. */ williamr@2: enum TSmsIndicationState williamr@2: { williamr@2: /** Indication inactive. */ williamr@2: ESmsIndicationInactive=0x00, williamr@2: /** Indication active. */ williamr@2: ESmsIndicationActive=0x08, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsIndicationStateMask=0x08 williamr@2: }; williamr@2: /** Indication Type bit flags. */ williamr@2: enum TSmsIndicationType williamr@2: { williamr@2: /** Voicemail Message Waiting. */ williamr@2: ESmsVoicemailMessageWaiting=0x00, williamr@2: /** Fax Message Waiting. */ williamr@2: ESmsFaxMessageWaiting=0x01, williamr@2: /** Electronic Mail Message Waiting. */ williamr@2: ESmsElectronicMailMessageWaiting=0x02, williamr@2: /** Other Message Waiting. */ williamr@2: ESmsFaxOtherMessageWaiting=0x03, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsIndicationTypeMask=0x03 williamr@2: }; williamr@2: williamr@2: public: williamr@2: TSmsDataCodingScheme(); williamr@2: inline TSmsDCSBits7To4 Bits7To4() const; williamr@2: inline void SetBits7To4(TSmsDCSBits7To4 aBits7To4); williamr@2: // Normal SMS settings williamr@2: TBool TextCompressed() const; williamr@2: void SetTextCompressed(TBool aCompressed); williamr@2: TSmsAlphabet Alphabet() const; williamr@2: void SetAlphabet(TSmsAlphabet aAlphabet); williamr@2: TBool Class(TSmsClass& aClass) const; williamr@2: void SetClass(TBool aClassDefined,TSmsClass aClass); williamr@2: // Message waiting settings williamr@2: TSmsIndicationState IndicationState() const; williamr@2: void SetIndicationState(TSmsIndicationState aState); williamr@2: TSmsIndicationType IndicationType() const; williamr@2: void SetIndicationType(TSmsIndicationType aType); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Specifies alternative 7bit encoding combinations to use if the default williamr@2: * GSM encoding cannot encode the message as 7bit without data loss. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: enum TSmsEncoding williamr@2: { williamr@2: /** Default value meaning that no alternative encoding would be used. */ williamr@2: ESmsEncodingNone = 0, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Turkish Single Shift table in place of the williamr@2: * default GSM shift table. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 octet cost in the User Data williamr@2: * Header. williamr@2: */ williamr@2: ESmsEncodingTurkishSingleShift = 0x11, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Turkish Locking Shift table in place of the williamr@2: * default GSM alphabet table. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 octet cost in the User Data williamr@2: * Header. williamr@2: * @note This encoding should only be used if the relevant national williamr@2: * regulatory body has requested its use. williamr@2: */ williamr@2: ESmsEncodingTurkishLockingShift = 0x12, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Turkish Locking Shift and/or the Turkish Single williamr@2: * Shift tables in place of the default GSM alphabet and shift tables. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 or 6 octet cost in the User Data williamr@2: * Header. williamr@2: * @note This encoding should only be used if the relevant national williamr@2: * regulatory body has requested its use. williamr@2: */ williamr@2: ESmsEncodingTurkishLockingAndSingleShift = 0x13, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Spanish Single Shift table in place of the williamr@2: * default GSM shift table. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 octet cost in the User Data williamr@2: * Header. williamr@2: */ williamr@2: ESmsEncodingSpanishSingleShift = 0x21, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Portuguese Single Shift table in place of the williamr@2: * default GSM shift table. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 octet cost in the User Data williamr@2: * Header. williamr@2: */ williamr@2: ESmsEncodingPortugueseSingleShift = 0x31, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Portuguese Locking Shift table in place of the williamr@2: * default GSM alphabet table. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 octet cost in the User Data williamr@2: * Header. williamr@2: * @note This encoding should only be used if the relevant national williamr@2: * regulatory body has requested its use. williamr@2: */ williamr@2: ESmsEncodingPortugueseLockingShift = 0x32, williamr@2: williamr@2: /** williamr@2: * Allows the use of the Portuguese Locking Shift and/or the Portuguese Single williamr@2: * Shift tables in place of the default GSM alphabet and shift tables. williamr@2: * williamr@2: * @note If used during encoding there will be a 3 or 6 octet cost in the User Data williamr@2: * Header. williamr@2: * @note This encoding should only be used if the relevant national williamr@2: * regulatory body has requested its use. williamr@2: */ williamr@2: ESmsEncodingPortugueseLockingAndSingleShift = 0x33 williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * GSM National Language Identifiers. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: enum TSmsNationalLanguageIdentifier williamr@2: { williamr@2: /** Turkish. */ williamr@2: ESmsNationalLanguageIdentifierTurkish = 1, williamr@2: williamr@2: /** Spanish. */ williamr@2: ESmsNationalLanguageIdentifierSpanish = 2, williamr@2: williamr@2: /** Portuguese. */ williamr@2: ESmsNationalLanguageIdentifierPortuguese = 3 williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Utility to provide piecewise character set conversion to / from unpacked user williamr@2: * data elements. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CSmsAlphabetConverter : public CBase williamr@2: { williamr@2: public: williamr@2: // Construction and destruction methods williamr@2: IMPORT_C static CSmsAlphabetConverter* NewLC(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,TSmsDataCodingScheme::TSmsAlphabet aSmsAlphabet,TBool aIsBinary); williamr@2: IMPORT_C ~CSmsAlphabetConverter(); williamr@2: williamr@2: // Enumerated types and structs williamr@2: /** williamr@2: * Indicates whether there is a fixed relationship between the number of characters williamr@2: * and user data elements. williamr@2: * williamr@2: * For example, Unicode characters always map to a single SMS UCS2 character, williamr@2: * while a Unicode character might map to one, two or more SMS 7-bit User Data williamr@2: * Elements (extended 7-bit characters). williamr@2: */ williamr@2: enum TSmsAlphabetWidthConversion williamr@2: { williamr@2: /** Fixed relationship. */ williamr@2: ESmsAlphabetWidthConversionFixed, williamr@2: /** Variable relationship. */ williamr@2: ESmsAlphabetWidthConversionVariable williamr@2: }; williamr@2: williamr@2: struct TSmsAlphabetConversionProperties williamr@2: /** williamr@2: * Holds the number of user data elements required for conversion from a single williamr@2: * native character. williamr@2: * williamr@2: * This value is applicable only if the iWidthConversion parameter is ESmsAlphabetWidthConversionFixed. williamr@2: */ williamr@2: { williamr@2: /** Alphabet width conversion. */ williamr@2: TSmsAlphabetWidthConversion iWidthConversion; williamr@2: /** Number of user data elements required for conversion from a single native character */ williamr@2: TInt iUDElementsPerNativeCharacter; williamr@2: }; williamr@2: williamr@2: public: williamr@2: // Conversion methods williamr@2: void ConversionPropertiesL(TSmsAlphabetConversionProperties& aConversionProperties) const; williamr@2: IMPORT_C TPtrC8 ConvertFromNativeL(const TDesC& aNativeCharacters); williamr@2: IMPORT_C TPtrC8 ConvertFromNativeL(const TDesC& aNativeCharacters, williamr@2: TSmsEncoding aEncoding, williamr@2: TInt& aNumberOfUnconvertibleCharacters, williamr@2: TInt& aNumberOfDowngradedCharacters); williamr@2: IMPORT_C TPtrC ConvertToNativeL(const TDesC8& aUDElements); williamr@2: IMPORT_C TPtrC ConvertToNativeL(const TDesC8& aUDElements, TSmsEncoding aEncoding); williamr@2: williamr@2: TBool IsSupportedL(TChar aChar); williamr@2: TBool IsSupportedL(const TDesC& aDes, TInt& aNumberOfUnconvertibleCharacters, williamr@2: TInt& aIndexOfFirstUnconvertibleCharacter); williamr@2: williamr@2: TBool IsSupportedL(TChar aChar, TSmsEncoding aEncoding, TBool& aIsDowngrade, williamr@2: TBool& aRequiresAlternativeEncoding); williamr@2: TBool IsSupportedL(const TDesC& aDes, TSmsEncoding aEncoding, williamr@2: TInt& aNumberOfUnconvertibleCharacters, williamr@2: TInt& aNumberOfDowngradedCharacters, williamr@2: TInt& aNumberRequiringAlternativeEncoding, williamr@2: TInt& aIndexOfFirstUnconvertibleCharacter); williamr@2: williamr@2: // Alternative Encoding methods williamr@2: TSmsEncoding FindBestAlternativeEncodingL(const TDesC& aNativeCharacters, williamr@2: TSmsEncoding aSuggestedEncoding); williamr@2: void ConfirmAlternativeEncoderL(TSmsEncoding aEncoding) const; williamr@2: williamr@2: // Unconverted buffer methods williamr@2: inline void ResetUnconvertedNativeCharacters(); williamr@2: inline void ResetUnconvertedUDElements(); williamr@2: inline TPtrC UnconvertedNativeCharacters(); williamr@2: inline TPtrC8 UnconvertedUDElements(); williamr@2: williamr@2: // Getter / setters williamr@2: inline TSmsDataCodingScheme::TSmsAlphabet Alphabet() const; williamr@2: williamr@2: private: williamr@2: // Private construction methods williamr@2: CSmsAlphabetConverter(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,TSmsDataCodingScheme::TSmsAlphabet aSmsAlphabet,TBool aIsBinary); williamr@2: void ConstructL(); williamr@2: williamr@2: // Private conversion preparation methods williamr@2: void PrepareForConversionFromNativeL(TSmsEncoding aEncoding); williamr@2: void PrepareForConversionToNativeL(TSmsEncoding aEncoding); williamr@2: williamr@2: // Private Alternative Encoding methods williamr@2: void GetAlternativeEncoderIDL(TSmsEncoding aEncoding, TUint& aEncoderID) const; williamr@2: williamr@2: // Private buffer helper methods williamr@2: TPtr16 CheckAllocBufferL(HBufC16** aBuffer,TInt aMaxLength,TInt aUsedLength); williamr@2: TPtr8 CheckAllocBufferL(HBufC8** aBuffer,TInt aMaxLength,TInt aUsedLength); williamr@2: williamr@2: // Private constants williamr@2: enum williamr@2: { williamr@2: KMaxSmsAlphabetConversionRetries=4 williamr@2: }; williamr@2: williamr@2: enum williamr@2: { williamr@2: KMinSmsAlphabetConversionAllocIncrement=4 williamr@2: }; williamr@2: williamr@2: private: williamr@2: williamr@2: CCnvCharacterSetConverter& iCharacterSetConverter; williamr@2: RFs& iFs; williamr@2: TSmsDataCodingScheme::TSmsAlphabet iSmsAlphabet; williamr@2: TBool iIsBinary; williamr@2: HBufC* iConvertedNativeCharacters; williamr@2: HBufC8* iConvertedUDElements; williamr@2: HBufC* iUnconvertedNativeCharacters; williamr@2: TPtr iUnconvertedNativeCharactersPtr; williamr@2: HBufC8* iUnconvertedUDElements; williamr@2: TPtr8 iUnconvertedUDElementsPtr; williamr@2: }; williamr@2: williamr@2: williamr@2: /** Type-of-number, as defined in ETSI 3GPP TS 23.040. */ williamr@2: enum TGsmSmsTypeOfNumber williamr@2: { williamr@2: /** williamr@2: * Unknown, used when the user or network has no a priori information about the williamr@2: * numbering plan. williamr@2: * In this case, the Address-Value field is organized according to the network williamr@2: * dialling plan, e.g. prefix or escape digits might be present. williamr@2: */ williamr@2: EGsmSmsTONUnknown=0x00, williamr@2: /** williamr@2: * International number. williamr@2: * The international format shall be accepted also when the message is destined williamr@2: * to a recipient in the same country as the MSC or as the SGSN. williamr@2: */ williamr@2: EGsmSmsTONInternationalNumber=0x10, williamr@2: /** williamr@2: * National number. williamr@2: * Prefix or escape digits shall not be included. williamr@2: */ williamr@2: EGsmSmsTONNationalNumber=0x20, williamr@2: /** williamr@2: * Network specific number. williamr@2: * Administration/service number specific to the serving network, e.g. used to williamr@2: * access an operator. williamr@2: */ williamr@2: EGsmSmsTONNetworkSpecificNumber=0x30, williamr@2: /** williamr@2: * Subscriber number. williamr@2: * Used when a specific short number representation is stored in one or more williamr@2: * SCs as part of a higher layer application. (Note that "Subscriber number" williamr@2: * shall only be used in connection with the proper PID referring to this application). williamr@2: */ williamr@2: EGsmSmsTONSubscriberNumber=0x40, williamr@2: /** williamr@2: * Alpha-numeric. williamr@2: * Coded according to 3GPP TS 23.038 - GSM 7-bit default alphabet. williamr@2: */ williamr@2: EGsmSmsTONAlphaNumeric=0x50, williamr@2: EGsmSmsTONAbbreviatedNumber=0x60, ///< Abbreviated number williamr@2: EGsmSmsTONReserverved=0x70, ///< Reserved for extension williamr@2: }; williamr@2: williamr@2: /** Numbering-plan-identification defined in ETSI 3GPP TS 23.040. */ williamr@2: enum TGsmSmsNumberingPlanIdentification williamr@2: { williamr@2: /** Unknown. */ williamr@2: EGsmSmsNPIUnknown=0x00, williamr@2: /** ISDN telephone numbering plan. */ williamr@2: EGsmSmsNPIISDNTelephoneNumberingPlan=0x01, williamr@2: /** Data numbering plan. */ williamr@2: EGsmSmsNPIDataNumberingPlan=0x03, williamr@2: /** Telex numbering plan. */ williamr@2: EGsmSmsNPITelexNumberingPlan=0x04, williamr@2: /** National numbering plan. */ williamr@2: EGsmSmsNPINationalNumberingPlan=0x08, williamr@2: /** Private numbering plan. */ williamr@2: EGsmSmsNPIPrivateNumberingPlan=0x09, williamr@2: /** ERMES numbering plan. */ williamr@2: EGsmSmsNPIERMESNumberingPlan=0x0A, williamr@2: /** Reserved for extension. */ williamr@2: EGsmSmsNPIReservedForExtension=0x0F, williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Type-of-address field defined in ETSI 3GPP TS 23.040 williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TGsmSmsTypeOfAddress : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: williamr@2: enum williamr@2: { williamr@2: EGsmSmsFirstBitMask=0x80, williamr@2: EGsmSmsTONMask=0x70, williamr@2: EGsmSmsNPIMask=0x0F williamr@2: }; williamr@2: williamr@2: public: williamr@2: williamr@2: inline TGsmSmsTypeOfAddress(TInt aValue = EGsmSmsFirstBitMask); williamr@2: inline TGsmSmsTypeOfAddress(TGsmSmsTypeOfNumber aTon, TGsmSmsNumberingPlanIdentification aNPI); williamr@2: williamr@2: inline TGsmSmsTypeOfNumber TON() const; williamr@2: inline void SetTON(TGsmSmsTypeOfNumber aTON); williamr@2: williamr@2: inline TGsmSmsNumberingPlanIdentification NPI() const; williamr@2: /** williamr@2: * Sets the numbering plan identification. williamr@2: * @param aNPI Numbering plan identification williamr@2: */ williamr@2: inline void SetNPI(TGsmSmsNumberingPlanIdentification aNPI); williamr@2: williamr@2: /** williamr@2: * Converts type of number and numbering plan identification information from williamr@2: * the type of address parameter to the NMobilePhone::TMobileTON and NMobilePhone::TMobileNPI williamr@2: * format. williamr@2: * williamr@2: * @param aTON On return, type of number williamr@2: * @param aNPI On return, numbering plan identification williamr@2: */ williamr@2: IMPORT_C void ConvertToETelMM(NMobilePhone::TMobileTON& aTON, NMobilePhone::TMobileNPI& aNPI) const; williamr@2: /** williamr@2: * Sets type of number and numbering plan identification information from values williamr@2: * specified in NMobilePhone::TMobileTON and NMobilePhone::TMobileNPI formats. williamr@2: * williamr@2: * @param aTON Type of number williamr@2: * @param aNPI Numbering plan identification williamr@2: */ williamr@2: IMPORT_C void SetFromETelMM(NMobilePhone::TMobileTON aTON, NMobilePhone::TMobileNPI aNPI); williamr@2: }; williamr@2: williamr@2: /** Maximum length of a Service Centre address = 21, as defined in ETSI GSM 04.11. */ williamr@2: const TInt TGsmSmsTelNumberMaxLen = 21; williamr@2: williamr@2: williamr@2: /** williamr@2: * Encapsulation of basic address information williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TGsmSmsTelNumber williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * @internalComponent williamr@2: * If the address is an alphanumeric address, williamr@2: * it can represent a voice message waiting indicator williamr@2: * as defined in the Common PCN Handset Specification williamr@2: * v4.2. The specification allows other indicators williamr@2: * to be defined in the future. williamr@2: */ williamr@2: enum TTypeOfIndicator williamr@2: { williamr@2: EVoiceMessageWaitingIndicator = 0 williamr@2: }; williamr@2: williamr@2: private: williamr@2: enum TCPHSIndicatorTypeByte williamr@2: { williamr@2: ECPSHIndicatorTypeBitMask = 0x7E, williamr@2: ECPSHVoiceMailId = 0x10, williamr@2: ECPHSIndicatorSettingBit = 0x01, williamr@2: ECPHSVoiceMailSettingSpareBit = 0x80 williamr@2: }; williamr@2: williamr@2: enum TCPHSIndicatorIdByte williamr@2: { williamr@2: ECPSHIndicatorIdBitMask = 0x7E, williamr@2: ECPSHIndicatorId = 0x00, williamr@2: ECPSHIndicatorIdSettingBit = 0x01, williamr@2: ECTSHVoiceMailIndicatorSpareBit = 0x80 williamr@2: }; williamr@2: williamr@2: enum TCPHSByteIndex williamr@2: { williamr@2: ECPHSLength = 0, williamr@2: ECPHSAddressType = 1, williamr@2: ECPHSAddressIndicatorType = 2, williamr@2: ECPHSAddressIndicatorId = 3, williamr@2: ECPHSSizeOfAddressField = 4 williamr@2: }; williamr@2: williamr@2: public: williamr@2: inline TGsmSmsTelNumber(); williamr@2: williamr@2: IMPORT_C TBool IsInstanceOf(TTypeOfIndicator aType); williamr@2: williamr@2: public: williamr@2: williamr@2: TGsmSmsTypeOfAddress iTypeOfAddress; ///< The type-of-address of iTelNumber williamr@2: TBuf iTelNumber; ///< Telephone number, in format of iTypeOfAddress williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * CSmsAddress - address of the recipient or SC williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CSmsAddress : public CBase williamr@2: { williamr@2: public: williamr@2: enum williamr@2: { williamr@2: KSmsAddressMaxAddressValueLength=10,// octets williamr@2: KSmsAddressMaxAddressLength = 12 // address length, type and address value williamr@2: }; williamr@2: public: williamr@2: static CSmsAddress* NewL(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs); williamr@2: ~CSmsAddress(); williamr@2: TPtrC Address() const; williamr@2: void SetAddressL(const TDesC& aAddress); williamr@2: void ParsedAddress(TGsmSmsTelNumber& aParsedAddress) const; williamr@2: void SetParsedAddressL(const TGsmSmsTelNumber& aParsedAddress); williamr@2: williamr@2: void SetRawAddressL(TGsmSmsTypeOfAddress aTypeOfAddress, TPtrC aBuffer); williamr@2: TGsmSmsTypeOfAddress& TypeOfAddress(); williamr@2: williamr@2: TUint8 SizeL(); williamr@2: williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: void DecodeL(TGsmuLex8& aPdu); williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: private: williamr@2: CSmsAddress(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs); williamr@2: void NewBufferL(TInt aLength); williamr@2: void DoSetParsedAddressL(const TDesC& aAddress); williamr@2: private: williamr@2: williamr@2: CCnvCharacterSetConverter& iCharacterSetConverter; williamr@2: RFs& iFs; williamr@2: TGsmSmsTypeOfAddress iTypeOfAddress; williamr@2: HBufC* iBuffer; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * TP-SCTS Service Center Time Stamp Found in Deliver, Submit Report, Status Report, williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsServiceCenterTimeStamp williamr@2: { williamr@2: public: williamr@2: enum {KSmsMaxTimeZoneNumQuarterHours=79}; williamr@2: /** Time zone offset sign bit. */ williamr@2: enum TSmsTimeZoneSignBit williamr@2: { williamr@2: /** Positive offset. */ williamr@2: ESmsTimeZonePositive=0x00, williamr@2: /** Negative offset. */ williamr@2: ESmsTimeZoneNegative=0x08, williamr@2: williamr@2: /** Mask for these bit flags. */ williamr@2: ESmsTimeZoneSignBitMask=0x08 williamr@2: }; williamr@2: public: williamr@2: TSmsServiceCenterTimeStamp(); williamr@2: inline TInt TimeOffset() const; williamr@2: void SetTimeOffset(TInt aNumQuarterHours); williamr@2: inline const TTime& Time() const; williamr@2: inline void SetTime(const TTime& aTime); williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: void DecodeL(TGsmuLex8& aPdu, TInt& aTimeError); williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: private: williamr@2: TTime iTime; williamr@2: TInt iTimeZoneNumQuarterHours; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * TP-VP Validity Period Found in SUBMIT PDUs. williamr@2: * williamr@2: * The validy period format is encoded in the first octet of the PDU, so the williamr@2: * class takes a reference to a TSmsFirstOctet. The validty period specifies williamr@2: * the length of time the PDU lives in the service center if the PDU cannot be williamr@2: * immediately delivered. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsValidityPeriod williamr@2: { williamr@2: public: williamr@2: /** Validity period units (in minutes). */ williamr@2: enum TValidityPeriodUnitInMinutes williamr@2: { williamr@2: /** Five minutes. */ williamr@2: EFiveMinuteUnitInMinutes=5, williamr@2: /** 30 minutes. */ williamr@2: EHalfHourUnitInMinutes=30, williamr@2: /** 1 day. */ williamr@2: EOneDayUnitInMinutes=1440, williamr@2: /** 1 week. */ williamr@2: EOneWeekUnitInMinutes=7*EOneDayUnitInMinutes williamr@2: }; williamr@2: /** Limits for validity period units (in minutes). */ williamr@2: enum TValidityPeriodUnitLimitInMinutes williamr@2: { williamr@2: /** Limit for 5 minute validity period unit. */ williamr@2: EFiveMinuteUnitLimitInMinutes=24*EHalfHourUnitInMinutes, williamr@2: /** Limit for 30 minute validity period unit. */ williamr@2: EHalfHourUnitLimitInMinutes=EOneDayUnitInMinutes, williamr@2: /** Limit for 1 day validity period unit. */ williamr@2: EOneDayUnitLimitInMinutes=30*EOneDayUnitInMinutes, williamr@2: /** Limit for 1 week validity period unit. */ williamr@2: EOneWeekUnitLimitInMinutes=63*EOneWeekUnitInMinutes williamr@2: }; williamr@2: /** Limits for validity period units. */ williamr@2: enum TValidityPeriodLimit williamr@2: { williamr@2: /** Limit for 5 minute validity period unit. */ williamr@2: EFiveMinuteUnitLimit=143, williamr@2: /** Limit for 30 minute validity period unit. */ williamr@2: EHalfHourUnitLimit=167, williamr@2: /** Limit for 1 day validity period unit. */ williamr@2: EOneDayUnitLimit=196, williamr@2: /** Limit for 1 week validity period unit. */ williamr@2: EOneWeekUnitLimit=255 williamr@2: }; williamr@2: public: williamr@2: TSmsValidityPeriod(TSmsFirstOctet& aFirstOctet); williamr@2: inline TSmsFirstOctet::TSmsValidityPeriodFormat ValidityPeriodFormat() const; williamr@2: inline void SetValidityPeriodFormat(TSmsFirstOctet::TSmsValidityPeriodFormat aValidityPeriodFormat); williamr@2: inline const TTimeIntervalMinutes& TimeIntervalMinutes() const; williamr@2: inline void SetTimeIntervalMinutes(const TTimeIntervalMinutes& aTimeIntervalMinutes); williamr@2: TTime Time() const; williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: void DecodeL(TGsmuLex8& aPdu); williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: private: williamr@2: TSmsFirstOctet& iFirstOctet; williamr@2: TTimeIntervalMinutes iTimeIntervalMinutes; williamr@2: }; williamr@2: williamr@2: class CEmsInformationElement; williamr@2: williamr@2: /** williamr@2: * SMS element defined in TP-UD octet. williamr@2: * williamr@2: * This element is found in Deliver, Deliver Report, Submit, Submit Report, Status williamr@2: * Report and Command type messages. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CSmsInformationElement : public CBase williamr@2: { williamr@2: public: williamr@2: /** TP-UD Information Element Identifier. */ williamr@2: enum TSmsInformationElementIdentifier williamr@2: { williamr@2: /** Concatenated short messages, 8-bit reference number. */ williamr@2: ESmsIEIConcatenatedShortMessages8BitReference=0x00, williamr@2: /** Special SMS Message Indication. */ williamr@2: ESmsIEISpecialSMSMessageIndication=0x01, williamr@2: /** Reserved. */ williamr@2: ESmsIEIReserved=0x02, williamr@2: /** Value not used to avoid misinterpretation as line feed character. */ williamr@2: ESmsIEIValueNotUsed=0x03, williamr@2: /** Application port addressing scheme, 8 bit address. */ williamr@2: ESmsIEIApplicationPortAddressing8Bit=0x04, williamr@2: /** Application port addressing scheme, 16 bit address */ williamr@2: ESmsIEIApplicationPortAddressing16Bit=0x05, williamr@2: /** SMSC Control Parameters. */ williamr@2: ESmsIEISMSCControlParameters=0x06, williamr@2: /** UDH Source Indicator. */ williamr@2: ESmsIEIUDHSourceIndicator=0x07, williamr@2: /** Concatenated short message, 16-bit reference number. */ williamr@2: ESmsIEIConcatenatedShortMessages16BitReference=0x08, williamr@2: /** Wireless Control Message Protocol. */ williamr@2: ESmsIEIWirelessControlMessageProtocol=0x09, williamr@2: ESmsIEIRFC822EmailHeader=0x20, williamr@2: williamr@2: williamr@2: // Enhanced SMS IE williamr@2: ESmsEnhancedTextFormatting=0x0A, williamr@2: ESmsEnhancedPredefinedSound=0x0B, williamr@2: ESmsEnhancedUserDefinedSound=0x0C, williamr@2: ESmsEnhancedPredefinedAnimation=0x0D, williamr@2: ESmsEnhancedLargeAnimation=0x0E, williamr@2: ESmsEnhancedSmallAnimation=0x0F, williamr@2: ESmsEnhancedLargePicture=0x10, williamr@2: ESmsEnhancedSmallPicture=0x11, williamr@2: ESmsEnhancedVariablePicture=0x12, williamr@2: ESmsEnhancedUserPromptIndicator=0x13, williamr@2: ESmsEnhancedExtendedObject=0x14, williamr@2: ESmsEnhancedReusedExtendedObject=0x15, williamr@2: ESmsEnhancedCompressionControl=0x16, williamr@2: ESmsEnhancedODI=0x17, williamr@2: ESmsEnhancedStandardWVG=0x18, williamr@2: ESmsEnhancedCharacterSizeWVG=0x19, williamr@2: ESmsEnhancedextendedObjectDataRequest=0x1A, williamr@2: williamr@2: // Control Information Elements williamr@2: williamr@2: ESmsHyperLinkFormat = 0x21, williamr@2: ESmsReplyAddressFormat = 0x22, williamr@2: ESmsEnhanceVoiceMailInformation = 0x23, williamr@2: ESmsNationalLanguageSingleShift = 0x24, williamr@2: ESmsNationalLanguageLockingShift = 0x25, williamr@2: williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: /** SIM Toolkit Security Header 1. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders1=0x70, williamr@2: /** SIM Toolkit Security Header 2. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders2=0x71, williamr@2: /** SIM Toolkit Security Header 3. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders3=0x72, williamr@2: /** SIM Toolkit Security Header 4. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders4=0x73, williamr@2: /** SIM Toolkit Security Header 5. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders5=0x74, williamr@2: /** SIM Toolkit Security Header 6. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders6=0x75, williamr@2: /** SIM Toolkit Security Header 7. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders7=0x76, williamr@2: /** SIM Toolkit Security Header 8. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders8=0x77, williamr@2: /** SIM Toolkit Security Header 9. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders9=0x78, williamr@2: /** SIM Toolkit Security Header 10. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders10=0x79, williamr@2: /** SIM Toolkit Security Header 11. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders11=0x7A, williamr@2: /** SIM Toolkit Security Header 12. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders12=0x7B, williamr@2: /** SIM Toolkit Security Header 13. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders13=0x7C, williamr@2: /** SIM Toolkit Security Header 14. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders14=0x7D, williamr@2: /** SIM Toolkit Security Header 15. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders15=0x7E, williamr@2: /** SIM Toolkit Security Header 16. */ williamr@2: ESmsIEISIMToolkitSecurityHeaders16=0x7F, williamr@2: /** SME to SME specific use 1. */ williamr@2: ESmsIEISMEToSMESpecificUse1=0x80, williamr@2: /** SME to SME specific use 2. */ williamr@2: ESmsIEISMEToSMESpecificUse2=0x81, williamr@2: /** SME to SME specific use 3. */ williamr@2: ESmsIEISMEToSMESpecificUse3=0x82, williamr@2: /** SME to SME specific use 4. */ williamr@2: ESmsIEISMEToSMESpecificUse4=0x83, williamr@2: /** SME to SME specific use 5. */ williamr@2: ESmsIEISMEToSMESpecificUse5=0x84, williamr@2: /** SME to SME specific use 6. */ williamr@2: ESmsIEISMEToSMESpecificUse6=0x85, williamr@2: /** SME to SME specific use 7. */ williamr@2: ESmsIEISMEToSMESpecificUse7=0x86, williamr@2: /** SME to SME specific use 8. */ williamr@2: ESmsIEISMEToSMESpecificUse8=0x87, williamr@2: /** SME to SME specific use 9. */ williamr@2: ESmsIEISMEToSMESpecificUse9=0x88, williamr@2: /** SME to SME specific use 10. */ williamr@2: ESmsIEISMEToSMESpecificUse10=0x89, williamr@2: /** SME to SME specific use 11. */ williamr@2: ESmsIEISMEToSMESpecificUse11=0x8A, williamr@2: /** SME to SME specific use 12. */ williamr@2: ESmsIEISMEToSMESpecificUse12=0x8B, williamr@2: /** SME to SME specific use 13. */ williamr@2: ESmsIEISMEToSMESpecificUse13=0x8C, williamr@2: /** SME to SME specific use 14. */ williamr@2: ESmsIEISMEToSMESpecificUse14=0x8D, williamr@2: /** SME to SME specific use 15. */ williamr@2: ESmsIEISMEToSMESpecificUse15=0x8E, williamr@2: /** SME to SME specific use 16. */ williamr@2: ESmsIEISMEToSMESpecificUse16=0x8F, williamr@2: /** SME to SME specific use 17. */ williamr@2: ESmsIEISMEToSMESpecificUse17=0x90, williamr@2: /** SME to SME specific use 18. */ williamr@2: ESmsIEISMEToSMESpecificUse18=0x91, williamr@2: /** SME to SME specific use 19. */ williamr@2: ESmsIEISMEToSMESpecificUse19=0x92, williamr@2: /** SME to SME specific use 20. */ williamr@2: ESmsIEISMEToSMESpecificUse20=0x93, williamr@2: /** SME to SME specific use 21. */ williamr@2: ESmsIEISMEToSMESpecificUse21=0x94, williamr@2: /** SME to SME specific use 22. */ williamr@2: ESmsIEISMEToSMESpecificUse22=0x95, williamr@2: /** SME to SME specific use 23. */ williamr@2: ESmsIEISMEToSMESpecificUse23=0x96, williamr@2: /** SME to SME specific use 24. */ williamr@2: ESmsIEISMEToSMESpecificUse24=0x97, williamr@2: /** SME to SME specific use 25. */ williamr@2: ESmsIEISMEToSMESpecificUse25=0x98, williamr@2: /** SME to SME specific use 26. */ williamr@2: ESmsIEISMEToSMESpecificUse26=0x99, williamr@2: /** SME to SME specific use 27. */ williamr@2: ESmsIEISMEToSMESpecificUse27=0x9A, williamr@2: /** SME to SME specific use 28. */ williamr@2: ESmsIEISMEToSMESpecificUse28=0x9B, williamr@2: /** SME to SME specific use 29. */ williamr@2: ESmsIEISMEToSMESpecificUse29=0x9C, williamr@2: /** SME to SME specific use 30. */ williamr@2: ESmsIEISMEToSMESpecificUse30=0x9D, williamr@2: /** SME to SME specific use 31. */ williamr@2: ESmsIEISMEToSMESpecificUse31=0x9E, williamr@2: /** SME to SME specific use 32. */ williamr@2: ESmsIEISMEToSMESpecificUse32=0x9F, williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: /** SC specific use 1. */ williamr@2: ESmsIEISCSpecificUse1=0xC0, williamr@2: /** SC specific use 2. */ williamr@2: ESmsIEISCSpecificUse2=0xC1, williamr@2: /** SC specific use 3. */ williamr@2: ESmsIEISCSpecificUse3=0xC2, williamr@2: /** SC specific use 4. */ williamr@2: ESmsIEISCSpecificUse4=0xC3, williamr@2: /** SC specific use 5. */ williamr@2: ESmsIEISCSpecificUse5=0xC4, williamr@2: /** SC specific use 6. */ williamr@2: ESmsIEISCSpecificUse6=0xC5, williamr@2: /** SC specific use 7. */ williamr@2: ESmsIEISCSpecificUse7=0xC6, williamr@2: /** SC specific use 8. */ williamr@2: ESmsIEISCSpecificUse8=0xC7, williamr@2: /** SC specific use 9. */ williamr@2: ESmsIEISCSpecificUse9=0xC8, williamr@2: /** SC specific use 10. */ williamr@2: ESmsIEISCSpecificUse10=0xC9, williamr@2: /** SC specific use 11. */ williamr@2: ESmsIEISCSpecificUse11=0xCA, williamr@2: /** SC specific use 12. */ williamr@2: ESmsIEISCSpecificUse12=0xCB, williamr@2: /** SC specific use 13. */ williamr@2: ESmsIEISCSpecificUse13=0xCC, williamr@2: /** SC specific use 14. */ williamr@2: ESmsIEISCSpecificUse14=0xCD, williamr@2: /** SC specific use 15. */ williamr@2: ESmsIEISCSpecificUse15=0xCE, williamr@2: /** SC specific use 16. */ williamr@2: ESmsIEISCSpecificUse16=0xCF, williamr@2: /** SC specific use 17. */ williamr@2: ESmsIEISCSpecificUse17=0xD0, williamr@2: /** SC specific use 18. */ williamr@2: ESmsIEISCSpecificUse18=0xD1, williamr@2: /** SC specific use 19. */ williamr@2: ESmsIEISCSpecificUse19=0xD2, williamr@2: /** SC specific use 20. */ williamr@2: ESmsIEISCSpecificUse20=0xD3, williamr@2: /** SC specific use 21. */ williamr@2: ESmsIEISCSpecificUse21=0xD4, williamr@2: /** SC specific use 22. */ williamr@2: ESmsIEISCSpecificUse22=0xD5, williamr@2: /** SC specific use 23. */ williamr@2: ESmsIEISCSpecificUse23=0xD6, williamr@2: /** SC specific use 24. */ williamr@2: ESmsIEISCSpecificUse24=0xD7, williamr@2: /** SC specific use 25. */ williamr@2: ESmsIEISCSpecificUse25=0xD8, williamr@2: /** SC specific use 26. */ williamr@2: ESmsIEISCSpecificUse26=0xD9, williamr@2: /** SC specific use 27. */ williamr@2: ESmsIEISCSpecificUse27=0xDA, williamr@2: /** SC specific use 28. */ williamr@2: ESmsIEISCSpecificUse28=0xDB, williamr@2: /** SC specific use 29. */ williamr@2: ESmsIEISCSpecificUse29=0xDC, williamr@2: /** SC specific use 30. */ williamr@2: ESmsIEISCSpecificUse30=0xDD, williamr@2: /** SC specific use 31. */ williamr@2: ESmsIEISCSpecificUse31=0xDE, williamr@2: /** SC specific use 32. */ williamr@2: ESmsIEISCSpecificUse32=0xDF, williamr@2: /** williamr@2: * @internalComponent williamr@2: */ williamr@2: ESmsIEMaximum = 0xFF williamr@2: }; williamr@2: williamr@2: public: williamr@2: // Exported functions williamr@2: IMPORT_C TSmsInformationElementIdentifier Identifier() const; williamr@2: IMPORT_C TPtr8 Data(); williamr@2: IMPORT_C const TDesC8& Data() const; williamr@2: public: williamr@2: static CSmsInformationElement* NewL(TSmsInformationElementIdentifier aIdentifier,const TDesC8& aData); williamr@2: static CSmsInformationElement* NewL(); williamr@2: ~CSmsInformationElement(); williamr@2: williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: void DecodeL(TGsmuLex8& aPdu); williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: void ConstructL(const TDesC8& aData); williamr@2: TUint Length() const; williamr@2: protected: williamr@2: void NewDataL(TInt aLength); williamr@2: inline CSmsInformationElement(TSmsInformationElementIdentifier aInformationElementIdentifier); williamr@2: protected: williamr@2: TSmsOctet iIdentifier; williamr@2: HBufC8* iData; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * @internalComponent williamr@2: * williamr@2: * TSmsInformationElementCategories williamr@2: * williamr@2: * This class specifies where information elements are located SMS Messages. williamr@2: * williamr@2: * It specifies which PDUs each information element can be located in. williamr@2: * williamr@2: * The SMS stack uses this information when encoding and decoding SMS messages. williamr@2: */ williamr@2: class TSmsInformationElementCategories williamr@2: { williamr@2: public: williamr@2: williamr@2: // Comment, table approach probably is not necessary here. williamr@2: // Simply use a switch statement as cannot index directly into table. williamr@2: williamr@2: enum TInformationElementCategory williamr@2: { williamr@2: EEmsInformationElement, williamr@2: ECtrlMandatoryInEveryPDUAndWithIdenticalValues, // e.g. Port Addresses williamr@2: ECtrlMandatoryInEveryPDUMultipleInstancesPerPDU, // e.g. Special SMS Message Indication williamr@2: ECtrlMandatoryInEveryPDUButWithValueSpecificToPDU, // e.g. Email Header / Concatenation Elements, SMSC Parameters williamr@2: ECtrlMandatoryIn1stPDUOnly, // e.g. Reply Address williamr@2: ECtrlSingleInstanceOnly, // e.g. Enhanced Voice Mail williamr@2: ECtrlMultipleInstancesAllowed, // e.g. Hyperlink format williamr@2: ENumberOfCategories williamr@2: }; williamr@2: williamr@2: typedef CSmsInformationElement::TSmsInformationElementIdentifier TInformationElementId; williamr@2: williamr@2: private: williamr@2: enum TIndexToCategory williamr@2: { williamr@2: EIndexEmsInformationElement, williamr@2: EIndexCtrlMandatoryInEveryPDUAndWithIdenticalValues, williamr@2: EIndexCtrlMandatoryInEveryPDUMultipleInstancesPerPDU, williamr@2: EIndexCtrlMandatoryInEveryPDUButWithValueSpecificToPDU, williamr@2: EIndexCtrlMandatoryIn1stPDUOnly, williamr@2: EIndexCtrlSingleInstanceOnly, williamr@2: EIndexCtrlMultipleInstancesAllowed, williamr@2: EIndexCtrlOptionalInEveryPDUWithValueSpecificToPDU, williamr@2: ENumberOfIndices williamr@2: }; williamr@2: williamr@2: public: williamr@2: static TBool GetCategoryDefinition(TInformationElementId aId, TInformationElementCategory& aCategory); williamr@2: private: williamr@2: static TBool TranslateCategoryToIndex(TInformationElementId aId, TInt& index); williamr@2: TSmsInformationElementCategories() {}; williamr@2: ~TSmsInformationElementCategories() {}; williamr@2: void operator=(TSmsInformationElementCategories& aCategory) {(void) aCategory; }; williamr@2: TBool operator==(TSmsInformationElementCategories& aCategory){(void) aCategory; return EFalse; }; williamr@2: static const TInformationElementCategory categories[ENumberOfIndices]; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * @internalComponent williamr@2: */ williamr@2: typedef CSmsInformationElement::TSmsInformationElementIdentifier TSmsId; williamr@2: williamr@2: williamr@2: /** williamr@2: * Mobile originated SMS sent to the network requesting an action or information williamr@2: * on the status of a previously sent SUBMIT. williamr@2: * williamr@2: * This is internal and not intended for use. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CSmsCommandData : public CBase williamr@2: { williamr@2: public: williamr@2: enum {KSmsMaxDataSize=157}; williamr@2: public: williamr@2: static CSmsCommandData* NewL(TSmsFirstOctet& aFirstOctet); williamr@2: ~CSmsCommandData(); williamr@2: williamr@2: inline TInt NumInformationElements() const; williamr@2: CSmsInformationElement& InformationElement(TInt aIndex) const; williamr@2: CSmsInformationElement*& InformationElementPtr(TInt aIndex); williamr@2: TBool InformationElementIndex(CSmsInformationElement::TSmsInformationElementIdentifier aIdentifier, williamr@2: TInt& aIndex) const; williamr@2: void AddInformationElementL(const TSmsId aIdentifier,const TDesC8& aData); williamr@2: void RemoveInformationElement(TInt aIndex); williamr@2: williamr@2: inline TInt MaxDataLength() const; williamr@2: TPtrC8 Data() const; williamr@2: void SetDataL(const TDesC8& aData); williamr@2: williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: void DecodeL(TGsmuLex8& aPdu); williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: private: williamr@2: CSmsCommandData(TSmsFirstOctet& aFirstOctet); williamr@2: williamr@2: TInt HeaderLength() const; williamr@2: TInt TotalHeaderLengthInUDLUnits() const; williamr@2: williamr@2: TBool HeaderPresent() const; williamr@2: void SetHeaderPresent(TBool aHeaderPresent); williamr@2: williamr@2: private: williamr@2: TSmsFirstOctet& iFirstOctet; williamr@2: CArrayPtrFlat iInformationElementArray; williamr@2: HBufC8* iBuffer; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Enumerations and operations for SMS commands. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class TSmsCommandType : public TSmsOctet williamr@2: { williamr@2: public: williamr@2: /** Command types. */ williamr@2: enum TSmsCommandTypeValue williamr@2: { williamr@2: /** Enquiry. */ williamr@2: ESmsCommandTypeEnquiry=0x00, williamr@2: /** Cancel. */ williamr@2: ESmsCommandTypeCancel=0x01, williamr@2: /** Delete. */ williamr@2: ESmsCommandTypeDelete=0x02, williamr@2: /** Enable Status Report Request. */ williamr@2: ESmsCommandTypeEnableStatusReportRequest=0x03 williamr@2: // Reserved values williamr@2: // .... williamr@2: // .... williamr@2: }; williamr@2: public: williamr@2: TSmsCommandType(); williamr@2: inline TInt CommandType() const; williamr@2: inline void SetCommandType(TSmsCommandTypeValue aType); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Operations on the User Data described in TP-UD. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CSmsUserData : public CBase williamr@2: { williamr@2: public: williamr@2: enum {KSmsMaxUserDataSize=140}; williamr@2: williamr@2: public: williamr@2: static CSmsUserData* NewL(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,TSmsFirstOctet& aFirstOctet,const TSmsDataCodingScheme& aDataCodingScheme); williamr@2: ~CSmsUserData(); williamr@2: williamr@2: inline TInt NumInformationElements() const; williamr@2: IMPORT_C CSmsInformationElement& InformationElement(TInt aIndex) const; williamr@2: IMPORT_C TBool InformationElementIndex(CSmsInformationElement::TSmsInformationElementIdentifier aIdentifier,TInt& aIndex) const; williamr@2: IMPORT_C TBool InformationElementLastIndex(CSmsInformationElement::TSmsInformationElementIdentifier aIdentifier,TInt& aIndex) const; williamr@2: IMPORT_C void AddInformationElementL(TSmsId aIdentifier,const TDesC8& aData); williamr@2: IMPORT_C void RemoveInformationElement(TInt aIndex); williamr@2: void InformationElementIndicesL(CSmsInformationElement::TSmsInformationElementIdentifier aIdentifier, CArrayFixFlat& aIndices) const; williamr@2: williamr@2: // EMS related methods williamr@2: void AddEmsInformationElementL(CEmsInformationElement* aIe); // takes ownership od aIe; williamr@2: TBool EmsInformationElementWillFitL(CEmsInformationElement* aIe,CSmsEMSBufferSegmenter& aSeg,TUint& aCharsAddedToCurrentPDU); williamr@2: // Control Information Element related methods williamr@2: TBool ControlInformationElementWillFitL(CSmsInformationElement* aIe); williamr@2: void UpdateInformationElementArrayL(TSmsId aIdentifier,const TDesC8& aData); williamr@2: CSmsInformationElement*& InformationElementPtr(TInt aIndex); williamr@2: williamr@2: TInt MaxPackedUDUnitsInBodyRemaining() const; williamr@2: TInt MaxPackedUDUnitsInBodyRemaining(TUint totalHeaderLengthInUDLUnits) const; williamr@2: williamr@2: IMPORT_C TInt MaxBodyLengthInChars() const; williamr@2: IMPORT_C TPtrC8 Body() const; williamr@2: IMPORT_C void SetBodyL(const TDesC8& aBody); williamr@2: void AppendBodyL(const TDesC8& aExtraBody); williamr@2: williamr@2: IMPORT_C TBool IsSupportedL(TChar aChar); williamr@2: IMPORT_C TBool IsSupportedL(const TDesC& aDes, TInt& aNumberOfUnconvertibleCharacters, williamr@2: TInt& aIndexOfFirstUnconvertibleCharacter) const; williamr@2: williamr@2: IMPORT_C TBool IsSupportedL(const TDesC& aDes, TSmsEncoding aEncoding, williamr@2: TInt& aNumberOfUnconvertibleCharacters, williamr@2: TInt& aNumberOfDowngradedCharacters, williamr@2: TInt& aNumberRequiringAlternativeEncoding, williamr@2: TInt& aIndexOfFirstUnconvertibleCharacter) const; williamr@2: williamr@2: TBool IsBinaryData() const; williamr@2: williamr@2: TUint8* EncodeL(TUint8* aPtr) const; williamr@2: void DecodeL(TGsmuLex8& aPdu); williamr@2: void DecodeL(TGsmuLex8& aPdu, TBool aAcceptTruncation); williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: private: williamr@2: CSmsUserData(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,TSmsFirstOctet& aFirstOctet,const TSmsDataCodingScheme& aDataCodingScheme); williamr@2: void ConstructL(); williamr@2: TInt HeaderLength() const; williamr@2: TInt TotalHeaderLengthInUDLUnits() const; williamr@2: TInt BodyLengthInUDLUnits() const; williamr@2: void NewBodyL(TInt aLengthInChars); williamr@2: TBool HeaderPresent() const; williamr@2: void SetHeaderPresent(TBool aHeaderPresent); williamr@2: TInt TotalHeaderLengthInUDLUnits(TInt aIElen) const; williamr@2: williamr@2: private: williamr@2: williamr@2: CCnvCharacterSetConverter& iCharacterSetConverter; williamr@2: RFs& iFs; williamr@2: williamr@2: TSmsFirstOctet& iFirstOctet; williamr@2: const TSmsDataCodingScheme& iDataCodingScheme; williamr@2: CArrayPtrFlat iInformationElementArray; williamr@2: HBufC8* iBody; williamr@2: }; williamr@2: williamr@2: enum TSmsMessageIndicationType williamr@2: { williamr@2: EGsmSmsVoiceMessageWaiting =0x00, williamr@2: EGsmSmsFaxMessageWaiting =0x01, williamr@2: EGsmSmsElectronicMailMessageWaiting =0x02, williamr@2: EGsmSmsExtendedMessageTypeWaiting =0x03, williamr@2: }; williamr@2: williamr@2: enum TExtendedSmsIndicationType williamr@2: { williamr@2: EGsmSmsNoExtendedMessageTypeIndication=0x00, williamr@2: EGsmSmsVideoMessageWaiting =0x01, williamr@2: EGsmSmsExtendedIndicationType2 =0x02, williamr@2: EGsmSmsExtendedIndicationType3 =0x03, williamr@2: EGsmSmsExtendedIndicationType4 =0x04, williamr@2: EGsmSmsExtendedIndicationType5 =0x05, williamr@2: EGsmSmsExtendedIndicationType6 =0x06, williamr@2: EGsmSmsExtendedIndicationType7 =0x07 williamr@2: }; williamr@2: williamr@2: enum TSmsSpecialMessageIndicationTypeMask williamr@2: { williamr@2: /** Define a mask for the bits representing */ williamr@2: /** the TSmsMessageIndicationType and the */ williamr@2: /** TExtendedSmsIndicationType */ williamr@2: EGsmSmsSpecialMessageIndicationTypeMask = 0x1F williamr@2: }; williamr@2: williamr@2: enum TSmsMessageProfileType williamr@2: { williamr@2: EGsmSmsProfileId1 =0x00, williamr@2: EGsmSmsProfileId2 =0x01, williamr@2: EGsmSmsProfileId3 =0x02, williamr@2: EGsmSmsProfileId4 =0x03 williamr@2: }; williamr@2: williamr@2: enum TVoiceMailInfoType williamr@2: { williamr@2: EGsmSmsVoiceMailNotification = 0x00, williamr@2: EGsmSmsVoiceMailDeleteConfirmation = 0x01 williamr@2: }; williamr@2: williamr@2: /** SMSC Control Parameters Selective Status Report For Each Segment. Found in Submit. */ williamr@2: enum TSmsSMSCControlParameters williamr@2: { williamr@2: /** Status Report for short message transaction completed. */ williamr@2: ESmsStatusReportTransactionCompleted=0x01, williamr@2: /** Status Report for permanent error when Service Centre is not making any more transfer attempts. */ williamr@2: ESmsStatusReportPermanentError=0x02, williamr@2: /** Status Report for temporary error when Service Centre is not making any more transfer attempts. */ williamr@2: ESmsStatusReportTemporaryError=0x04, williamr@2: /** Status Report for temporary error when Service Centre is still trying to transfer message segment. */ williamr@2: ESmsStatusReportTemporaryErrorSCTrying=0x08, williamr@2: /** This is not Supported. williamr@2: Reserved for future use. */ williamr@2: ESmsStatusReportForFutureUse1=0x10, williamr@2: /** This is not Supported. williamr@2: Reserved for future use. */ williamr@2: ESmsStatusReportForFutureUse2=0x20, williamr@2: /** This is not Supported. williamr@2: A Status Report generated by this Short Message, due to a permanent error or last temporary error, williamr@2: cancels the SRR of the rest of the Short Messages in a concatenated message. */ williamr@2: ESmsStatusReportCancelRestSRR=0x40, williamr@2: /** This is not Supported. williamr@2: Include original UDH into the Status Report. */ williamr@2: ESmsStatusReportIncludeOriginalUDH=0x80, williamr@2: /** Mask. The 4 least significant bits, which are supported, are set. */ williamr@2: ESmsSMSCControlParametersMask=0x0F williamr@2: }; williamr@2: williamr@2: williamr@2: /** Non Information Element Identifiers. */ williamr@2: enum TSmsNonIEIdentifier williamr@2: { williamr@2: ESmsTPSRRParameter = 0x00, williamr@2: ESmsIncompleteClass0MessageParameter = 0x01 williamr@2: }; williamr@2: williamr@2: williamr@2: /** Status Report Scheme*/ williamr@2: enum TSmsStatusReportScheme williamr@2: { williamr@2: EDefaultScheme = 0x00, williamr@2: ETPSRRScheme = 0x01, williamr@2: EControlParametersScheme = 0x10 williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * This is the base class for Enhanced Voice Mail Notifications and williamr@2: * Enhanced Voice Mail Delete Confirmations. It encapsulates williamr@2: * the attributes and encoding / decoding algorithms common to williamr@2: * both types of Enhanced Voice Mail Information Element. williamr@2: * williamr@2: * @publishedAll williamr@2: */ williamr@2: class CEnhancedVoiceMailBoxInformation : public CBase williamr@2: { williamr@2: public: williamr@2: enum {KSmsMaxEnhancedVoiceMailSize = CSmsUserData::KSmsMaxUserDataSize - 3}; williamr@2: // allow space in user data for the following bytes: user data header length, IE ID, IE Length williamr@2: public: williamr@2: IMPORT_C TVoiceMailInfoType Type() const; williamr@2: IMPORT_C void SetProfile(TSmsMessageProfileType aProfile); williamr@2: IMPORT_C TSmsMessageProfileType Profile() const; williamr@2: IMPORT_C void SetStorage(TBool aIsStored); williamr@2: IMPORT_C TBool Store() const; williamr@2: IMPORT_C void SetAlmostMaximumCapacity(TBool aIsAlmostFull); williamr@2: IMPORT_C TBool AlmostMaximumCapacity() const; williamr@2: IMPORT_C void SetMaximumCapacity(TBool aIsFull); williamr@2: IMPORT_C TBool MaximumCapacity() const; williamr@2: IMPORT_C TBool ExtensionIndicator() const; williamr@2: IMPORT_C void SetAccessAddressL(const TDesC& aParsedAddress); williamr@2: IMPORT_C void SetParsedAccessAddressL(const TGsmSmsTelNumber& aParsedAddress); williamr@2: IMPORT_C TPtrC AccessAddress() const; williamr@2: IMPORT_C void ParsedAccessAddress(TGsmSmsTelNumber& aParsedAddress) const; williamr@2: IMPORT_C void SetNumberOfVoiceMessages(TUint8 aNumber); williamr@2: IMPORT_C TUint8 NumberOfVoiceMessages() const; williamr@2: williamr@2: static CEnhancedVoiceMailBoxInformation* NewL(); williamr@2: virtual ~CEnhancedVoiceMailBoxInformation(); williamr@2: williamr@2: virtual TUint8* EncodeL(TUint8* aPtr, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs) const; williamr@2: virtual void DecodeL(TGsmuLex8& aVoiceMailInfo, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs); williamr@2: protected: williamr@2: CEnhancedVoiceMailBoxInformation(); williamr@2: CEnhancedVoiceMailBoxInformation(TVoiceMailInfoType aTVoiceMailInfoType); williamr@2: williamr@2: CEnhancedVoiceMailBoxInformation(const CEnhancedVoiceMailBoxInformation&); williamr@2: TBool operator==(const CEnhancedVoiceMailBoxInformation&); williamr@2: void operator=(const CEnhancedVoiceMailBoxInformation&); williamr@2: williamr@2: void ConstructL(); williamr@2: void NewBufferL(TInt aLength); williamr@2: void DoSetParsedAddressL(const TDesC& aAddress); williamr@2: protected: williamr@2: TVoiceMailInfoType iType; williamr@2: TBool iOctet1Bit1; williamr@2: TSmsMessageProfileType iProfile; williamr@2: TBool iStorage; williamr@2: TBool iAlmostFull; williamr@2: TBool iFull; williamr@2: TBool iExtensionIndicator; williamr@2: williamr@2: HBufC* iAccessAddress; williamr@2: TGsmSmsTypeOfAddress iTypeOfAddress; williamr@2: williamr@2: TUint8 iNumberOfVoiceMessages; williamr@2: private: williamr@2: enum TBitMasks williamr@2: { williamr@2: EMask1Bit = 0x01, williamr@2: EMask2Bits = 0x03, williamr@2: EMask4Bits = 0x0F williamr@2: }; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * This class encapsulates the attributes of a VM Notification as described in 23.040 V6.5.0. williamr@2: * It is used as one of the attributes a Enhanced Voice Mail Notification. williamr@2: * williamr@2: * @publishedAll williamr@2: */ williamr@2: class CVoiceMailNotification : public CBase williamr@2: { williamr@2: public: williamr@2: IMPORT_C void SetMessageId(TUint16 aMessageId); williamr@2: IMPORT_C TUint16 MessageId() const; williamr@2: IMPORT_C void SetMessageLength(TUint8 aLength); williamr@2: IMPORT_C TUint8 MessageLength() const; williamr@2: IMPORT_C void SetRetentionDays(TUint8 aDays); williamr@2: IMPORT_C TUint8 RetentionDays() const; williamr@2: IMPORT_C void SetPriorityIndication(TBool aPriority); williamr@2: IMPORT_C TBool PriorityIndication() const; williamr@2: IMPORT_C TBool MessageExtensionIndication() const; williamr@2: IMPORT_C void SetCallingLineIdentityL(TDesC& aLineIdentity); williamr@2: IMPORT_C TPtrC CallingLineIdentity() const; williamr@2: IMPORT_C void SetParsedCallingLineIdentityL(TGsmSmsTelNumber& aParsedAddress); williamr@2: IMPORT_C void ParsedCallingLineIdentity(TGsmSmsTelNumber& aParsedAddress) const; williamr@2: williamr@2: IMPORT_C static CVoiceMailNotification* NewL(); williamr@2: IMPORT_C virtual ~CVoiceMailNotification(); williamr@2: williamr@2: TUint8 SizeL(CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs); williamr@2: williamr@2: virtual TUint8* EncodeL(TUint8* aPtr, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs) const; williamr@2: virtual void DecodeL(TGsmuLex8& aVoiceMailInfo, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs); williamr@2: protected: williamr@2: CVoiceMailNotification(); williamr@2: CVoiceMailNotification(const CVoiceMailNotification&); williamr@2: TBool operator==(const CVoiceMailNotification&); williamr@2: void operator=(const CVoiceMailNotification&); williamr@2: void ConstructL(); williamr@2: void NewBufferL(TInt aLength); williamr@2: void NewExtensionL(TInt aLength); williamr@2: williamr@2: void DoSetParsedAddressL(const TDesC& aAddress); williamr@2: protected: williamr@2: TUint16 iMessageId; williamr@2: TUint8 iMessageLength; williamr@2: TUint8 iRetentionDays; williamr@2: TBool iOctetN8Bit1; williamr@2: TBool iPriorityIndication; williamr@2: TBool iMessageExtensionIndicator; williamr@2: williamr@2: HBufC* iCallingLineIdentity; williamr@2: TGsmSmsTypeOfAddress iTypeOfAddress; williamr@2: williamr@2: HBufC* iExtension; williamr@2: private: williamr@2: enum TBitMasks williamr@2: { williamr@2: EMask1Bit = 0x01, williamr@2: EMask2Bits = 0x03, williamr@2: EMask4Bits = 0x0F, williamr@2: EMask5Bits = 0x1F williamr@2: }; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * This class encapsulates the attributes of an Enhanced Voice Mail Notification as described in williamr@2: * 9.2.3.24.13.1. An enhanced voice mail notification is added to a CSmsMessage using the williamr@2: * interface provided by the class CSmsEnhancedVoiceMailOperations. williamr@2: * williamr@2: * Clients should be aware that 23.040 v6.5.0 specifies that this information element must fit into the williamr@2: * user data field of a single PDU. The amount of space available in the user data field depends on both williamr@2: * the number and size of the mandatory information elements that must also be present. williamr@2: * Intuitively the largest Enhanced Voice Mail information element can be added when no mandatory information williamr@2: * elements need to be encoded in the PDU. To achieve this, the CSmsMessage must be configured with williamr@2: * only the Enhanced Voice Mail Information Element and no other information elements or text. williamr@2: * williamr@2: * @publishedAll williamr@2: */ williamr@2: class CEnhancedVoiceMailNotification : public CEnhancedVoiceMailBoxInformation williamr@2: { williamr@2: public: williamr@2: enum {KMaxNumberOfNotifications = 15}; williamr@2: protected: williamr@2: enum {KSmsNotificationBitMask = 0x0F}; williamr@2: // bits mask for bit representing the number of voice mail notifications. williamr@2: public: williamr@2: IMPORT_C TUint8 NumberOfVoiceMails(); williamr@2: IMPORT_C RPointerArray& GetVoiceMailNotifications(); williamr@2: williamr@2: IMPORT_C static CEnhancedVoiceMailNotification* NewL(); williamr@2: IMPORT_C ~CEnhancedVoiceMailNotification(); williamr@2: williamr@2: TUint8* EncodeL(TUint8* aPtr, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs) const; williamr@2: void DecodeL(TGsmuLex8& aVoiceMailInfo, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs); williamr@2: protected: williamr@2: CEnhancedVoiceMailNotification(); williamr@2: CEnhancedVoiceMailNotification(const CEnhancedVoiceMailNotification&); williamr@2: TBool operator==(const CEnhancedVoiceMailNotification&); williamr@2: void operator=(const CEnhancedVoiceMailNotification&); williamr@2: void NewExtensionL(TInt aLength); williamr@2: void ConstructL(); williamr@2: protected: williamr@2: TUint iNumberOfVMNotifications; williamr@2: HBufC* iExtension; williamr@2: RPointerArray* iNotifications; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * This class encapsulates the attributes of a VM Deletion as described in 23.040 V6.5.0. williamr@2: * 9.2.3.24.13.1. williamr@2: * williamr@2: * It is used as one of the attributes of a Enhanced Voice Mail Delete Confirmation. williamr@2: * williamr@2: * @publishedAll williamr@2: */ williamr@2: class CVoiceMailDeletion : public CBase williamr@2: { williamr@2: public: williamr@2: IMPORT_C void SetMessageId(TUint16 aMessageId); williamr@2: IMPORT_C TUint16 MessageId() const; williamr@2: IMPORT_C TBool MessageExtensionIndication() const; williamr@2: williamr@2: IMPORT_C static CVoiceMailDeletion* NewL(); williamr@2: IMPORT_C virtual ~CVoiceMailDeletion(); williamr@2: TUint8 SizeL(); williamr@2: williamr@2: virtual TUint8* EncodeL(TUint8* aPtr) const; williamr@2: virtual void DecodeL(TGsmuLex8& aVoiceMailInfo); williamr@2: protected: williamr@2: CVoiceMailDeletion(); williamr@2: CVoiceMailDeletion(const CVoiceMailDeletion&); williamr@2: TBool operator==(const CVoiceMailDeletion&); williamr@2: void operator=(const CVoiceMailDeletion&); williamr@2: williamr@2: void ConstructL(); williamr@2: void NewBufferL(TInt aLength); williamr@2: protected: williamr@2: TUint iMessageId; williamr@2: TBool iExtensionIndicator; williamr@2: HBufC* iExtension; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * This class encapsulates the attributes of an Enhanced Voice Delete Confirmation as described in williamr@2: * 9.2.3.24.13.2. An enhanced voice delete confirmation is added to a CSmsMessage using the williamr@2: * interface provided by the class CSmsEnhancedVoiceMailOperations. williamr@2: * williamr@2: * @publishedAll williamr@2: */ williamr@2: class CEnhancedVoiceMailDeleteConfirmations : public williamr@2: CEnhancedVoiceMailBoxInformation williamr@2: { williamr@2: public: williamr@2: enum {KMaxNumberOfNotifications = 31}; williamr@2: protected: williamr@2: enum {KSmsNotificationBitMask = 0x1F}; williamr@2: // bits mask for bit representing the number of voice mail deletions. williamr@2: public: williamr@2: IMPORT_C TUint8 NumberOfDeletes(); williamr@2: IMPORT_C RPointerArray& GetVoiceMailDeletions(); williamr@2: williamr@2: IMPORT_C static CEnhancedVoiceMailDeleteConfirmations* NewL(); williamr@2: IMPORT_C ~CEnhancedVoiceMailDeleteConfirmations(); williamr@2: williamr@2: TUint8* EncodeL(TUint8* aPtr, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs) const; williamr@2: void DecodeL(TGsmuLex8& aVoiceMailInfo, CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFs); williamr@2: protected: williamr@2: CEnhancedVoiceMailDeleteConfirmations(); williamr@2: CEnhancedVoiceMailDeleteConfirmations(const CEnhancedVoiceMailDeleteConfirmations&); williamr@2: TBool operator==(const CEnhancedVoiceMailDeleteConfirmations&); williamr@2: void operator=(const CEnhancedVoiceMailDeleteConfirmations&); williamr@2: williamr@2: void ConstructL(); williamr@2: void NewExtensionL(TInt aLength); williamr@2: protected: williamr@2: HBufC* iExtension; williamr@2: RPointerArray* iVoiceMailDeletions; williamr@2: }; williamr@2: williamr@2: williamr@2: #include williamr@2: williamr@2: #endif // !defined __GSMUELEM_H__