// EIKDIAL.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined (__EIKDIAL_H__)
#define __EIKDIAL_H__

// requires

#if !defined (__D32SND_H__)
#include <d32snd.h>
#endif

#if !defined (__T32WLD_H__)
#include <t32wld.h>
#endif

#if !defined (__BADESCA_H__)
#include <badesca.h>
#endif

#if !defined (__DIAL_H__)
#include <dial.h>
#endif

#if !defined (__EIKDIALG_H__)
#include <eikdialg.h>
#endif

const TInt KMaxDialPrefix=32;
typedef TBuf<KMaxDialPrefix> TDialPrefixString;

// the data that the Shell dial saves to system.ini, but needed by other dialogs too
class TEikDialSettings
	{
public:
	IMPORT_C TEikDialSettings();
    IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
    IMPORT_C void InternalizeL(RReadStream& aStream);
	//
	IMPORT_C void SetIncludeAreaCode(TBool aIncludeAreaCode);
	IMPORT_C void SetDialOutString(const TDesC& aString);
	IMPORT_C void SetSoundTimes(const TTimeIntervalMicroSeconds32 aToneTime,
		const TTimeIntervalMicroSeconds32 aDelayTime,
		const TTimeIntervalMicroSeconds32 aPauseTime);
	//
	IMPORT_C TBool IncludeAreaCode() const;
	IMPORT_C void GetDialOutString(TDes& aString) const;
	IMPORT_C void GetSoundTimes(TTimeIntervalMicroSeconds32& aToneTime,
		TTimeIntervalMicroSeconds32& aDelayTime, TTimeIntervalMicroSeconds32& aPauseTime) const;
private:
	TBool iIncludeAreaCode;
	TTimeIntervalMicroSeconds32 iToneTime;
	TTimeIntervalMicroSeconds32 iDelayTime;
	TTimeIntervalMicroSeconds32 iPauseTime;
	TDialPrefixString iDialOut;
	TInt iSpare1;
	TInt iSpare2;
	TInt iSpare3;
	TInt iSpare4;
	};

class MEikDtmfPlayerObserver
	{
public:
	virtual void HandleCompletion(TInt aStatus)=0;
	};

class CEikDtmfPlayer : public CActive
	{
public:
	IMPORT_C CEikDtmfPlayer(TInt aPriority, MEikDtmfPlayerObserver* aObserver);
	IMPORT_C ~CEikDtmfPlayer();
	IMPORT_C TInt Play(const TDesC& aDialString, TTimeIntervalMicroSeconds32 aToneTime,
		TTimeIntervalMicroSeconds32 aDelayTime, TTimeIntervalMicroSeconds32 aPauseTime);
	IMPORT_C TInt Play(TUint aDialChar, TTimeIntervalMicroSeconds32 aToneTime,
		TTimeIntervalMicroSeconds32 aDelayTime, TTimeIntervalMicroSeconds32 aPauseTime);
	IMPORT_C TBool IsDialing() const;
private:
	TInt SetUpSoundDevice(TTimeIntervalMicroSeconds32 aToneTime,
		TTimeIntervalMicroSeconds32 aDelayTime, TTimeIntervalMicroSeconds32 aPauseTime);
	virtual void DoCancel();
	virtual void RunL();
private:
	RDevSound iSoundDevice;
	MEikDtmfPlayerObserver* iObserver;
	};

// base dialog classes
class CEikDialDialogBase : public CEikDialog, public MEikDtmfPlayerObserver
	{
public:
	IMPORT_C ~CEikDialDialogBase();
protected:
	IMPORT_C void ConstructL();
	IMPORT_C CEikDialDialogBase();
	IMPORT_C void DoDialing(const TDesC& aPhoneNumber);
	IMPORT_C void DoDialChar(TUint aChar);
	IMPORT_C static TBool IsDiallable(TChar aChar);
private:
	IMPORT_C virtual void HandleCompletion(TInt aStatus);
protected:
	TEikDialSettings iDialSettings;
	CEikDtmfPlayer* iDtmfPlayer;
	};

class CEikFreeDialDialog : public CEikDialDialogBase
	{
public:
	IMPORT_C CEikFreeDialDialog();
private:
	virtual void PreLayoutDynInitL();
	virtual void HandleControlStateChangeL(TInt aControlId);
	virtual TBool OkToExitL(TInt aKeyCode);
private:
	void ClearPhoneNumberL();
	void Redial();
private:
	TInt iStringLength;
	};

class CEikDialDialog : public CEikDialDialogBase
    {
protected:
	enum {EMaxNoDialogLines=5};
public:
	IMPORT_C static TBool IsDiallable(const TDesC& aString, TInt& aStartPos); // called by Agenda before presenting dialog
private:
	IMPORT_C virtual void HandleControlStateChangeL(TInt aControlId);
	IMPORT_C virtual TBool OkToExitL(TInt aKeycode);
protected:
	IMPORT_C CEikDialDialog();
	IMPORT_C void SetPhoneNumberL(TInt aControlId, const TDesC& aString, TInt aStartPos=0);
	IMPORT_C void SetWorldExtension(TDes& aPhoneNumber) const;
	IMPORT_C void Dial();
	IMPORT_C void DialOut();
	IMPORT_C void ExecuteFreeDialDialogL() const;
private:
	TInt SetFullPhoneNumber(TDes& aPhoneNumber) const;
	void SetHomeLocation(TDialLocation& aLocation) const;
    };

#endif