// SMUTMSG.H
//
// Copyright (c) 1998 Symbian Ltd.  All rights reserved.
//



#if !defined (__SMUTMSG_H_)
#define __SMUTMSG_H_
#if !defined (__SMUTELEM_H_)
#include "smutelem.h"
#endif 

class RMsvReadStream;
class RMsvWriteStream;
class TSms;
class TMsvEntry;
class CSmsAddress;


class CSmsMessage : public CBase
	{
public:
	enum TSmsMsgType
		{
		ESmsDeliver,
		ESmsDeliverReport,
		ESmsSubmit,
		ESmsSubmitReport,
		ESmsStatusReport,
		ESmsCommand
		};
public:
	IMPORT_C static CSmsMessage* NewL(RMsvReadStream &aStream,CCnvCharacterSetConverter& aCharacterSetConverter);
	IMPORT_C static CSmsMessage* NewL(const TSms& aSms,CCnvCharacterSetConverter& aCharacterSetConverter,TBool aServiceCenterAddressPresent);
	IMPORT_C static CSmsMessage* NewL(TSmsMsgType aType,CCnvCharacterSetConverter& aCharacterSetConverter);

	inline TSmsMsgType Type() const;

	IMPORT_C void ExternalizeL(RMsvWriteStream& aStream) const; 

	IMPORT_C void EncodeMessagePDUL(TSms& aSms,TBool aServiceCenterAddressPresent) const;

	inline TPtrC ServiceCenterAddress() const;
	inline void SetServiceCenterAddressL(const TDesC& aAddress);
	inline void ParsedServiceCenterAddress(TGsmTelNumber& aParsedAddress) const;
	inline void SetParsedServiceCenterAddressL(const TGsmTelNumber& aParsedAddress);

	virtual TPtrC Body() const=0;
	virtual void SetBodyL(const TDesC& aBody)=0;

	virtual void SetToFromAddressL(const TDesC& aAddress)=0;
	virtual TPtrC ToFromAddress() const=0;

	virtual void SetValidityPeriod(const TTimeIntervalMinutes& aTimeIntervalMinutes)=0;
	virtual const TTimeIntervalMinutes& ValidityPeriod() const=0;

	virtual void SetTime(const TTime& aTime)=0;
	virtual const TTime& Time() const=0;

	virtual TSmsDataCodingScheme::TSmsAlphabet Alphabet() const=0;
	virtual void SetAlphabet(TSmsDataCodingScheme::TSmsAlphabet aAlphabet)=0;

	virtual void SetClass(TBool aClassDefined,TSmsDataCodingScheme::TSmsClass aClass)=0;
	virtual	TBool Class(TSmsDataCodingScheme::TSmsClass& aClass) const=0;

	virtual	TBool TextCompressed() const=0;
	virtual void SetTextCompressed(TBool aCompressed)=0;

	virtual CSmsUserData* UserData()=0; 
	virtual const CSmsUserData* UserData() const=0; 

	IMPORT_C TBool TextConcatenated() const;
	IMPORT_C void SetTextConcatenatedL(TBool aConcatenated);
	IMPORT_C TInt MessageReference() const;
	IMPORT_C void SetMessageReference(TInt aReference);
	IMPORT_C TInt NumMessages() const;
	IMPORT_C void SetNumMessages(TInt aNum);
	IMPORT_C TInt MessageIndex() const;
	IMPORT_C void SetMessageIndex(TInt aIndex);

protected:
	CSmsMessage(TSmsMsgType);

	virtual void ConstructL()=0;
	virtual TUint8* EncodeL(TUint8* aPtr) const=0;
	virtual const TUint8* DecodeL(const TUint8* aPtr)=0;
	virtual void InternalizeMessageL(RMsvReadStream& aStream)=0;  
	virtual void ExternalizeMessageL(RMsvWriteStream& aStream) const=0; 

private:
	TSmsMsgType iSmsMsgType;

protected:
	CSmsAddress* iServiceCenterAddress; 
	};

class CSmsDeliver : public CSmsMessage
	{
public:
	CSmsDeliver(CCnvCharacterSetConverter& aCharacterSetConverter);
	~CSmsDeliver();

	TPtrC Body() const;
	void SetBodyL(const TDesC& aBody);

	void SetToFromAddressL(const TDesC& aAddress);
	TPtrC ToFromAddress() const;

	void SetValidityPeriod(const TTimeIntervalMinutes& aTimeIntervalMinutes);
	const TTimeIntervalMinutes& ValidityPeriod() const;

	void SetTime(const TTime& aTime);
	const TTime& Time() const;

	inline TSmsDataCodingScheme::TSmsAlphabet Alphabet() const;
	inline void SetAlphabet(TSmsDataCodingScheme::TSmsAlphabet aAlphabet);

	inline void SetClass(TBool aClassDefined,TSmsDataCodingScheme::TSmsClass aClass);
	inline TBool Class(TSmsDataCodingScheme::TSmsClass& aClass) const;

	inline TBool TextCompressed() const;
	inline void SetTextCompressed(TBool aCompressed);

	inline CSmsUserData* UserData();
	inline const CSmsUserData* UserData() const; 

protected:
	void ConstructL();
	TUint8* EncodeL(TUint8* aPtr) const;
	const TUint8* DecodeL(const TUint8* aPtr);
	void InternalizeMessageL(RMsvReadStream& aStream);  
	void ExternalizeMessageL(RMsvWriteStream& aStream) const;

private:
	CCnvCharacterSetConverter& iCharacterSetConverter;

	TSmsFirstOctet iFirstOctet;
	CSmsAddress* iOriginalAddress;
	TSmsProtocolIdentifier iProtocolIdentifier;
	TSmsDataCodingScheme iDataCodingScheme;
	TSmsServiceCenterTimeStamp iServiceCenterTimeStamp;
	CSmsUserData* iUserData; 

	TTimeIntervalMinutes iDummy;  // Used because TValidityPeriodInMinutes() can't return a reference to a temporary
	};

class CSmsSubmit : public CSmsMessage
	{
public:
	CSmsSubmit(CCnvCharacterSetConverter& aCharacterSetConverter);
	~CSmsSubmit();

	TPtrC Body() const;
	void SetBodyL(const TDesC& aBody);

	void SetToFromAddressL(const TDesC& aAddress);
	TPtrC ToFromAddress() const;

	void SetValidityPeriod(const TTimeIntervalMinutes& aTimeIntervalMinutes);
	const TTimeIntervalMinutes& ValidityPeriod() const;

	void SetTime(const TTime& aTime);
	const TTime& Time() const;

	inline TSmsDataCodingScheme::TSmsAlphabet Alphabet() const;
	inline void SetAlphabet(TSmsDataCodingScheme::TSmsAlphabet aAlphabet);

	inline void SetClass(TBool aClassDefined,TSmsDataCodingScheme::TSmsClass aClass);
	inline TBool Class(TSmsDataCodingScheme::TSmsClass& aClass) const;

	inline TBool TextCompressed() const;
	inline void SetTextCompressed(TBool aCompressed);

	inline CSmsUserData* UserData();
	inline const CSmsUserData* UserData() const; 

protected:
	void ConstructL();
	TUint8* EncodeL(TUint8* aPtr) const;
	const TUint8* DecodeL(const TUint8* aPtr);
	void InternalizeMessageL(RMsvReadStream& aStream);  
	void ExternalizeMessageL(RMsvWriteStream& aStream) const; 

private:
	CCnvCharacterSetConverter& iCharacterSetConverter;

	TSmsFirstOctet iFirstOctet;
	TSmsOctet iMessageReference;
	CSmsAddress* iDestinationAddress;
	TSmsProtocolIdentifier iProtocolIdentifier;
	TSmsDataCodingScheme iDataCodingScheme;
	TSmsValidityPeriod iValidityPeriod;
	CSmsUserData* iUserData; 

	TTime iTime; // used for recording time of editing and sending
	};


#include "smutmsg.inl"

#endif // !defined __SMUTMSG_H_

