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@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.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 defines the class CSmsMessage williamr@2: // williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @file williamr@4: @publishedAll williamr@2: */ williamr@2: williamr@2: #ifndef __GSMUMSG_H__ williamr@2: #define __GSMUMSG_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include "gsmupdu.h" williamr@2: williamr@2: #include williamr@2: williamr@2: /** williamr@4: * @publishedAll williamr@2: */ williamr@2: const TUint IoctlWriteSMSBufferSize = 256; williamr@2: const TUint KMaxMobileNameSize = 32; williamr@2: williamr@2: class CSmsBufferBase; williamr@2: class CSmsCompressedBuffer; williamr@2: class TSmsUserDataSettings; williamr@2: class CSmsEMSBufferSegmenter; williamr@2: class CEmsUserPrompt; williamr@2: class CEmsObjectDistribution; williamr@2: class CSmsIEOperation; williamr@2: class CSmsNonIEOperation; williamr@4: class CSmsMessageAdditionalAttributes; williamr@2: williamr@2: /** williamr@2: * This class is used in CSmsMessage only. williamr@4: * @publishedAll williamr@2: */ williamr@2: class TGsmSmsSlotEntry williamr@2: { williamr@2: public: williamr@2: IMPORT_C TGsmSmsSlotEntry(); williamr@2: williamr@2: public: williamr@2: TInt iIndex; williamr@2: TBuf iStore; // equivalent to RMobilePhone::TMobileName williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: }; williamr@2: williamr@4: struct TEncodeParams williamr@4: { williamr@4: const TTime* iTimeStamp; williamr@4: const TTimeIntervalSeconds* iTimeIntervalInSeconds; williamr@4: }; williamr@2: williamr@2: /** williamr@2: * Represents a complete SMS message. williamr@2: * williamr@2: * This class can: williamr@2: * williamr@2: * Internalise and externalise its data williamr@2: * williamr@2: * Encode/decode itself to/from one or more SMS PDU's williamr@2: * williamr@2: * SMS Message Data is stored in the CSmsBufferBase iBuffer. SMS Message Settings williamr@2: * are stored in the CSmsPDU iSmsPDU. williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CSmsMessage : public CBase williamr@2: { williamr@2: public: williamr@2: /** User data optimisation flags. */ williamr@2: enum TSmsOptimizationFlags williamr@2: { williamr@2: /** williamr@2: * The alphabet flag causes an alphabet to be chosen which preserves information williamr@2: * in the message and makes the number of PDUs as small as possible. williamr@2: */ williamr@2: ESmsFlagOptimizeAlphabet=0x01, williamr@2: /** williamr@2: * 8-bit referenced concatenation. williamr@2: * williamr@2: * This causes compression to be switched off and if the message length is greater williamr@2: * than the maximum message length, concatenation is switched on. williamr@2: */ williamr@2: ESmsFlagOptimizeConcatenation=0x08, williamr@2: /** williamr@2: * 16-bit referenced concatenation. williamr@2: * williamr@2: * This causes compression to be switched off and if the message length is greater williamr@2: * than the maximum message length, concatenation is switched on. williamr@2: */ williamr@2: ESmsFlagOptimizeConcatenation16BitReference=0x10, williamr@2: }; williamr@2: williamr@2: /** Flags that indicate whether a message is stored. */ williamr@2: enum TMobileSmsStorage williamr@2: { williamr@2: /** No storage. */ williamr@2: ESmsNoStorage=0x00, williamr@2: /** SIM storage. */ williamr@2: ESmsSIMStorage=0x04, williamr@2: /** Phone storage. */ williamr@2: ESmsPhoneStorage=0x08, williamr@2: /** Combined storage. */ williamr@2: ESmsCombinedStorage=0x0C williamr@2: }; williamr@2: williamr@2: enum TTimeIntervalsRepresentedInSeconds williamr@2: { williamr@2: E15MinutesRepresentedInSeconds = 15 * 60, williamr@2: EMaximumSeconds = 79 * E15MinutesRepresentedInSeconds williamr@2: // Harmonised with maximum offset allowed for williamr@2: // Service Centre Time Stamp per 23.040 V4.4 Sect 9.2.3.11. williamr@2: }; williamr@2: williamr@2: williamr@2: public: williamr@2: IMPORT_C static CSmsMessage* NewL(RFs& aFs, const TGsmSms& aGsmSms,CSmsBufferBase* aBuffer, TBool aIsRPError=EFalse,TBool aIsMobileTerminated=ETrue); williamr@2: IMPORT_C static CSmsMessage* NewL(RFs& aFs, CSmsPDU::TSmsPDUType aType,CSmsBufferBase* aBuffer,TBool aIsRPError=EFalse); williamr@2: IMPORT_C ~CSmsMessage(); williamr@2: williamr@2: inline CSmsPDU::TSmsPDUType Type() const; williamr@2: inline TBool IsComplete() const; williamr@2: inline TBool IsDecoded() const; williamr@2: inline TMobileSmsStorage Storage() const; williamr@2: inline void SetStorage(TMobileSmsStorage aStorage); williamr@2: inline NMobileSmsStore::TMobileSmsStoreStatus Status() const; williamr@2: inline void SetStatus(NMobileSmsStore::TMobileSmsStoreStatus aStatus); williamr@2: inline TInt LogServerId() const; williamr@2: inline void SetLogServerId(TInt aId); williamr@2: inline const TTime& Time() const; williamr@2: inline void SetTime(const TTime& aTime); williamr@2: IMPORT_C TTimeIntervalSeconds UTCOffset() const; williamr@2: IMPORT_C TBool SetUTCOffset(const TTimeIntervalSeconds& aTimeOffset); williamr@2: IMPORT_C void SetDecodedOnSIM(TBool aOnSim); williamr@2: IMPORT_C TBool DecodedOnSim(); williamr@2: IMPORT_C void SetForwardToClient(TBool aForward); williamr@2: IMPORT_C TBool ForwardToClient(); williamr@2: williamr@2: inline CSmsPDU& SmsPDU(); williamr@2: inline const CSmsPDU& SmsPDU() const; williamr@2: williamr@2: inline TPtrC ServiceCenterAddress() const; williamr@2: inline void SetServiceCenterAddressL(const TDesC& aAddress); williamr@2: inline void ParsedServiceCenterAddress(TGsmSmsTelNumber& aParsedAddress) const; williamr@2: inline void SetParsedServiceCenterAddressL(const TGsmSmsTelNumber& aParsedAddress); williamr@2: williamr@2: inline TPtrC ToFromAddress() const; williamr@2: inline void SetToFromAddressL(const TDesC& aAddress); williamr@2: inline void ParsedToFromAddress(TGsmSmsTelNumber& aParsedAddress) const; williamr@2: inline void SetParsedToFromAddressL(const TGsmSmsTelNumber& aParsedAddress); williamr@2: williamr@2: IMPORT_C void InternalizeWithoutBufferL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeWithoutBufferL(RWriteStream& aStream) const; williamr@2: williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeL(RWriteStream& aStream) const; williamr@2: williamr@2: inline CSmsBufferBase& Buffer(); williamr@2: inline const CSmsBufferBase& Buffer() const; williamr@2: williamr@2: // Functions related to encoding/decoding the text buffer williamr@2: IMPORT_C TBool TextPresent() const; williamr@2: IMPORT_C TInt NumMessagePDUsL(); williamr@2: IMPORT_C TInt MaxMessageLength() const; williamr@2: IMPORT_C TInt MessageLengthL(); williamr@2: IMPORT_C void GetEncodingInfoL(TInt& aPdus, TInt& aUnconvertedChars, williamr@2: TInt& aDowngradedChars, TInt& aFreeUDUnitsInLastPDU); williamr@2: williamr@2: IMPORT_C void UserDataSettings(TSmsUserDataSettings& aSettings) const; williamr@2: IMPORT_C void SetUserDataSettingsL(const TSmsUserDataSettings& aSettings); williamr@2: IMPORT_C void OptimizeSettingsL(TInt aOptions); williamr@2: williamr@2: IMPORT_C TSmsEncoding Alternative7bitEncoding() const; williamr@2: IMPORT_C TInt SetAlternative7bitEncoding(TSmsEncoding aEncoding); williamr@2: IMPORT_C TBool IsSupportedL(const TDesC& aDes,TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstUnconvertibleCharacter); williamr@2: IMPORT_C TBool IsSupportedL(const TDesC& aDes, TInt& aNumberOfUnconvertibleCharacters, williamr@2: TInt& aNumberOfDowngradedCharacters, williamr@2: TInt& aNumberRequiringAlternativeEncoding, williamr@2: TInt& aIndexOfFirstUnconvertibleCharacter) const; williamr@2: williamr@2: IMPORT_C void EncodeMessagePDUsL(CArrayFix& aSmsArray, TInt aReference=0); williamr@2: IMPORT_C void DecodeMessagePDUsL(const CArrayFix& aSmsArray); williamr@2: IMPORT_C const RPointerArray& GetEMSInformationElementsL()const; williamr@2: IMPORT_C void AddEMSInformationElementL(const CEmsInformationElement& aEmsIE); williamr@2: IMPORT_C RPointerArray* RemoveEMSInformationElementsL(const TUint aStartPosition,const TSmsId aEmsId); williamr@2: IMPORT_C CEmsInformationElement* RemoveEMSInformationElementL(const TUint aStartPosition,const TSmsId aEmsId); williamr@2: IMPORT_C void ResetEMSL(); williamr@2: IMPORT_C TBool EncodeIntoSinglePDUL(CArrayFix& aSmsArray); williamr@2: IMPORT_C void CopyEmsElementsL(CSmsMessage& aToMessage) const; williamr@2: IMPORT_C void AddSlotL(const TGsmSmsSlotEntry& aSlot); williamr@2: IMPORT_C TBool MatchSlots(const CArrayFixFlat& aSlotArray); williamr@2: // E-mail header williamr@2: IMPORT_C void AddEmailHeaderL(const TDesC& aEmailHeader,const TDesC& aEmailBody); williamr@2: IMPORT_C TBool IsEmailHeader() const; williamr@2: IMPORT_C TBool GetEmailHeaderL(HBufC** aEmailHeader,HBufC** aEmailBody); williamr@2: void InstallEmailHeaderInformationElementL(CSmsUserData& aUserData,TInt& aHeaderLength); williamr@2: void InstallEmailHeaderInformationElementL(CSmsCommand& aCommand,TInt& aHeaderLength); williamr@2: inline void Set16BitConcatenation(TBool aIs16BitConcatenation); williamr@2: inline TBool Is16BitConcatenation()const; williamr@2: IMPORT_C void UpdateSlotsL(TDesC8& aBuf); williamr@2: // Version information williamr@2: IMPORT_C TInt Version(); williamr@2: // from this point downwards, all functions should be published internally only williamr@2: IMPORT_C TInt SetVersion(TInt aVersion); williamr@2: IMPORT_C void InternalizeWithoutBufferAndVersionL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeWithoutBufferAndVersionL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeBufferL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeBufferL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeVersionL(RReadStream& aStream); williamr@2: IMPORT_C void ExternalizeVersionL(RWriteStream& aStream) const; williamr@2: williamr@4: void* AdditionalInfo() {return (void*)iAdditionalInfo;}; williamr@2: IMPORT_C CSmsIEOperation& GetOperationsForIEL(CSmsInformationElement::TSmsInformationElementIdentifier) const; williamr@2: IMPORT_C CSmsNonIEOperation& GetOperationsForNonIEL(TSmsNonIEIdentifier) const; williamr@2: williamr@2: IMPORT_C TSmsStatusReportScheme Scheme() const; williamr@2: IMPORT_C void DecodePartialCompleteMessagePDUsL(const CArrayFix& aSmsArray, TBool aLastPartialCompleteMsg); williamr@2: williamr@2: private: williamr@2: williamr@2: CSmsMessage(RFs& aFs, CSmsBufferBase* aBuffer); williamr@2: void ConstructL(const TGsmSms& aGsmSms, TBool aIsRPError,TBool aIsMobileTerminated); williamr@2: void ConstructL(CSmsPDU::TSmsPDUType aType,TBool aIsRPError); williamr@2: williamr@2: void CreateControlIEOperationsClassesL(); williamr@2: void CreateControlNonIEOperationsClassesL(); williamr@2: williamr@2: inline void SetIsComplete(TBool aIsComplete); williamr@2: inline void SetIsDecoded(TBool aIsDecoded); williamr@2: williamr@2: williamr@2: inline TBool BinaryData() const; williamr@2: TInt ConvertedBufferLengthL(const CSmsBufferBase& aBuffer); williamr@2: void EncodeBufferL(CArrayFix& aSmsArray,TInt aReference,const CSmsBufferBase& aBuffer, williamr@2: TInt& aUnconvertedChars, TInt& aDowngradedChars, williamr@2: TInt& aFreeUDUnitsInLastPDU, TBool aDoEncode=ETrue); williamr@2: void DecodeBufferL(CArrayPtr& aSmsPDUArray,CSmsBufferBase& aBuffer); williamr@2: TBool EncodeIntoSinglePDUL(CArrayFix& aSmsArray, TInt& aUnconvertedChars, williamr@2: TInt& aDowngradedChars, TInt& aFreeUDUnitsInLastPDU); williamr@2: void PrepareCommandMessageL(void); williamr@2: void InstallEmsInformationElementsL(CSmsUserData& aUserData, TInt aStartPosition); williamr@2: void InstallEmsInformationElementsL(CSmsCommand& aCommand, TInt aStartPosition); williamr@2: void InstallControlInformationElementsL(CSmsUserData& aUserData, TInt aSegmentSequenceNum); williamr@2: void InstallControlInformationElementsL(CSmsCommand& aCommand); williamr@4: TBool AddEMSInformationElementsToMultiSegmentMessageL(CSmsEMSBufferSegmenter& aSegmenter, TUint& aCharsAdded, williamr@4: TBool aDoEncode, TSmsEncoding& aEncoding, williamr@4: RPointerArray& aCorrectedFormatingIEArray, williamr@4: TUint& aCurEMSIEno, TUint& aBaseAddr); williamr@2: TBool AddEMSInformationElementsToSingleSegmentMessageL(CSmsEMSBufferSegmenter& aSegmenter, williamr@2: TSmsEncoding aEncoding); williamr@4: void AddControlInformationElementsToMultiSegmentMessageL(TBool aDoEncode); williamr@4: void AddControlInformationElementsToMultiSegmentMessageL(TSmsInformationElementCategories::TInformationElementCategory aCategory, TBool aMandatoryInPDU, TBool aDoEncode); williamr@4: void AddCurrentPDUToPDUArrayL(TBool aDoEncode); williamr@2: TBool AddIEToUserDataL(CEmsInformationElement* aIe, TInt aCharsAlreadyAdded,TUint& aCharsAddedToCurrentPDU,CSmsEMSBufferSegmenter& aSeg); williamr@2: TInt FillPduL(CSmsEMSBufferSegmenter& aSeg, TInt aNumChars, TSmsEncoding aEncoding); williamr@2: TInt NumMessageEmsPDUsL(); williamr@2: void CorrectFormattingL(TUint aCharsAddedToCurrentPDU,RPointerArray& aCorrectedFormatingIEArray,TUint aBaseAddr); williamr@2: void CorrectFormattingInSinglePDUL(); williamr@2: void ResetWorkingPDUL(); williamr@2: TBool CanBeRemoved(const CEmsInformationElement& aIE, TUint aIEIndex); williamr@2: void AddEmsUserPromptL(const CEmsUserPrompt& aEmsIE); williamr@2: void AddEmsObjectDistributionL(const CEmsObjectDistribution& aObjectDistributionIE); williamr@2: void UpdateUserPromptAndODIElementsStartPosition(); williamr@2: TInt AddReceivedEmsInformationElement(CEmsInformationElement* aIE); williamr@4: TSmsStatusReportScheme FindSchemeL(const CArrayPtr& aSmsPDUArray); williamr@2: void InstallTPSRRInformationL(const CArrayPtr& aSmsPDUArray, TInt aSegmentSequenceNum); williamr@2: void EncodingTPSRRFromSchemesIntoSinglePDUL(); williamr@2: void DecodeOnlyTextL(CArrayPtr& aSmsPDUArray,CSmsBufferBase& aBuffer); williamr@2: void AddIncompleteMessageInfoL(TInt aStartPDU, TInt aEndPDU, TBool aLastPartialCompleteMsg); williamr@2: void MergeAlternative7bitEncoding(TSmsEncoding aEncoding) const; williamr@2: williamr@2: private: williamr@2: enum TSmsMessageFlags williamr@2: { williamr@2: ESmsFlagIsComplete=0x01, williamr@2: ESmsFlagIsDecoded=0x02, williamr@2: williamr@2: ESmsStorageMask=0x0C, williamr@2: ESmsUTCOffsetSecondGranularityMask =0x1FFFF0,//Bits needed to represent 79 * 15 * 60 seconds williamr@2: ESmsUTCOffsetSignBit =0x200000 williamr@2: }; williamr@2: williamr@2: enum TTimeBitMaskOffsets williamr@2: { williamr@2: ESecondBitOffset = 4, williamr@2: ESignBitOffset = 21 williamr@2: }; williamr@2: williamr@2: enum TDecodedOnSimBit williamr@2: { williamr@2: EDecodedOnSimBit = 0x80000000 williamr@2: }; williamr@2: williamr@2: enum TForwardToClientBit williamr@2: { williamr@2: EForwardToClientBit = 0x40000000 williamr@2: }; williamr@2: williamr@2: williamr@2: private: williamr@2: williamr@2: TInt iFlags; williamr@2: NMobileSmsStore::TMobileSmsStoreStatus iStatus; williamr@2: TInt iLogServerId; williamr@2: TTime iTime; williamr@2: CSmsPDU* iSmsPDU; williamr@2: CSmsBufferBase* iBuffer; williamr@2: RFs& iFs; williamr@2: williamr@2: TBool iIs16BitConcatenation; williamr@2: RPointerArray* iInformationElementArray; williamr@2: CCnvCharacterSetConverter* iCharacterSetConverter; williamr@2: williamr@2: public: williamr@4: CArrayFixFlat iSlotArray; //< Array for slots williamr@2: /** williamr@2: * SMS versions williamr@2: */ williamr@2: enum TSmsMessageVersion williamr@2: { williamr@2: /** The default value. */ williamr@2: ESmsMessageV0, williamr@2: /** Release 6 SMS Support */ williamr@2: ESmsMessageV1, williamr@2: /** Latest version */ williamr@2: ESmsMessageV2, williamr@2: /** Incomplete Class0 Information Support */ williamr@2: ESmsMessageV3, williamr@2: ESmsIncompleteClass0MessageV = ESmsMessageV3, williamr@2: /** National language 7bit encoding support */ williamr@2: ESmsMessageV4 williamr@2: // for all other versions the corresponding enum values would be added i.e. ESmsMessageV5, etc. williamr@2: }; williamr@2: williamr@2: protected: williamr@2: williamr@4: /** williamr@4: * iVersion is the version of CSmsMessage. This parameter will be williamr@4: * used to identify what iAdditionalInfo points to for that particular williamr@4: * version of CSmsMessage williamr@4: */ williamr@2: TInt iVersion; williamr@2: williamr@4: /** williamr@4: * iAdditionalInfo would point to any new added data structure. williamr@4: * iVersion would identify which data structure is valid for that williamr@4: * * particular version of CSmsMessage williamr@4: */ williamr@4: CSmsMessageAdditionalAttributes* iAdditionalInfo; williamr@2: }; williamr@2: williamr@2: #include williamr@2: williamr@2: #endif // !defined __GSMUMSG_H__