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