// SMSCLNT.H
//
// Copyright (c) 1998 Symbian Ltd.  All rights reserved.
//


#if !defined(__SMSCLNT_H__)
#define __SMSCLNT_H__

#if !defined(__MTCLBASE_H__)
#include <mtclbase.h>
#endif
#if !defined(__SMUTSET_H__)
#include "smutset.h"
#endif
#if !defined(__SMUTHDR_H__)
#include "smuthdr.h"
#endif



class CSmsClientMTMSessionObserver : public CBase , public MMsvSessionObserver
	{
public:
	CSmsClientMTMSessionObserver();
	void HandleSessionEvent(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3);
	};

class CSmsClientMtm : public CBaseMtm
	{
public:
	IMPORT_C static CSmsClientMtm* NewL(CRegisteredMtmDll& aRegisteredMtmDll,CMsvSession& aSession);
	~CSmsClientMtm();

	void HandleEntryEvent(enum MMsvEntryObserver::TMsvEntryEvent,TAny*,TAny*,TAny*);

	void StoreL(); 
	void RestoreL();

	void ReplyL(CMsvEntry& aReplyEntry,TMsvPartList aPartList,TRequestStatus& aCompletionStatus);
	void ForwardL(CMsvEntry& aForwardEntry,TMsvPartList aPartList,TRequestStatus& aCompletionStatus);

	TMsvPartList ValidateMessage(TMsvPartList aPartList);
	TMsvPartList Find(const TDesC& aTextToFind, TMsvPartList aPartList);

	CMsvOperation* ReplyL(TMsvId aDestination, TMsvPartList aPartlist, TRequestStatus& aCompletionStatus);
	CMsvOperation* ForwardL(TMsvId aDestination, TMsvPartList aPartList, TRequestStatus& aCompletionStatus);
	// --- Generic message functions (not already in TMsvEntry) ---
	void AddAddresseeL(const TDesC& aRealAddress);
	void AddAddresseeL(const TDesC& aRealAddress, const TDesC& aAlias);
	void RemoveAddressee(TInt aIndex);

	// --- RTTI functions ---
	TInt QueryCapability(TUid aCapability, TInt& aResponse);
	void InvokeSyncFunctionL(TInt aFunctionId,const CMsvEntrySelection& aSelection, TDes8& aParameter);
	CMsvOperation* InvokeAsyncFunctionL(TInt aFunctionId,const CMsvEntrySelection& aSelection, TDes8& aParameter, TRequestStatus& aCompletionStatus);

	// specfic for Sms client
	inline CSmsHeader& SmsHeader();
	inline const CSmsHeader& SmsHeader() const;
	inline TSmsSettings& SmsSettings();
	inline const TSmsSettings& SmsSettings() const;

protected:
	CSmsClientMtm(CRegisteredMtmDll& aRegisteredMtmDll,CMsvSession& aSession);
	void ConstructL();
	void ContextEntrySwitched(); 
	CMsvOperation* CreateNewEntryL(TMsvId aDestination,CSmsHeader& aSmsHeader,const CRichText& aBody,TRequestStatus& aCompletionStatus);
	TBool ValidRecipients() const;
	TBool ValidNumber(const TDesC& aNumber) const;
private:
	void DoAddAddresseeL(const TDesC& aRealAddress, const TDesC& aAlias);
	void AddRecipientL(const TDesC& aRealAddress, const TDesC& aAlias);
	void ResetHeader();

protected:
	TSmsSettings iSmsSettings;
	CSmsHeader* iSmsHeader;
	CSmsClientMTMSessionObserver* iSmsClientMTMSessionObserver;

private:
	CSmsHeader* iSmsRestoredHeader;  //  submit or deliver
	CSmsHeader* iSmsSwitchedHeader;  //  submit
	};


#include "smsclnt.inl"

#endif
