// COMSCR.H
//
// Copyright (c) 1995-1999 Symbian Ltd.  All rights reserved.
//
//	Base script processing classes
//
#ifndef __COMSCR_H__
#define __COMSCR_H__

#include <f32file.h>
#include <s32std.h>
#include <s32stor.h>

enum TCommScriptError
	{
	KScriptErr=100,		// must be the very first of the script errors
	KScriptErrUnexpectedCharacter,
	KScriptErrNumberTooLong,
	KScriptErrStringTooLong,
	KScriptErrUnexpectedEolInString,
	KScriptErrNumberFinalizerExpected,
	KScriptErrUnexpectedToken,
	KScriptErrCommandExpected,
	KScriptErrUnknownLabel,
	KScriptErrLabelDefinedTwice,
	KScriptErrInvalidOption,
	KScriptErrUnexpectedEof,
	KScriptErrExpressionExpected,
	//
	KRunTimeErr=200,	// must be the very first of the runtime errors
	KRunTimeErrDivideByZero,
	KRunTimeErrArgumentNotNumeric,
	KRunTimeErrInvalidArgument,
	KRunTimeErrStringTooLong,
	KRunTimeErrBadFileHandle,
	KRunTimeErrHandleNotOpen,
	KRunTimeErrHandleAlreadyOpen
	};

const TInt KFileScriptBufferSize=256;

struct SCharPosition
	{
	TInt iCharBufferPosition;
	TInt iColumn;
	TInt iLine;
	};

class CScriptSource : public CBase
	{
public:
	IMPORT_C CScriptSource();
	IMPORT_C ~CScriptSource();
	virtual void Close()=0;
	virtual void OpenL()=0;
	virtual TPtrC GetMoreCharsL()=0;
    };

class CStoreScript : public CScriptSource
	{
public:
	IMPORT_C CStoreScript(const CStreamStore& aStore,TStreamId aStreamId);
	IMPORT_C ~CStoreScript();
	IMPORT_C void OpenL();
	IMPORT_C void Close();
	IMPORT_C TPtrC GetMoreCharsL();
private:
//	RFile iFile;
//	RFs* iFsClient;
//	HBufC* iScriptFilename;
	const CStreamStore* iStreamStore;
	TStreamId iStreamId;
	RStoreReadStream iStream;
	TBuf<KFileScriptBufferSize> iChars;
	};

class CFileScript : public CScriptSource
	{
public:
	IMPORT_C CFileScript(RFs& aFsClient,const TDesC& aScriptFilename);
	IMPORT_C ~CFileScript();
	IMPORT_C void OpenL();
	IMPORT_C void Close();
	IMPORT_C TPtrC GetMoreCharsL();
private:
	RFile iFile;
	RFs* iFsClient;
	HBufC* iScriptFilename;
	TBuf8<KFileScriptBufferSize> iChars;
	};

class CMemScript : public CScriptSource
	{
public:
	IMPORT_C CMemScript(const TDesC& aScript);
	IMPORT_C void OpenL();
	IMPORT_C void Close();
	IMPORT_C TPtrC GetMoreCharsL();
private:
	TBool iMoreChar;
	TPtrC iScript;
	};

class CCommsExecutor;

class CCommsScriptProcessor : public CBase
	{
protected:
	IMPORT_C CCommsScriptProcessor();
public:
	IMPORT_C ~CCommsScriptProcessor();
	IMPORT_C static CCommsScriptProcessor* NewL(CCommsExecutor& aExecutor);
public:
	virtual void LoadScriptL(CScriptSource* aScrSource)=0;
	virtual void ExecuteScript(const TCallBack& aCallBack,TBool aRunmode)=0;
	virtual void ExecuteCancelL()=0;
	virtual TBool ProcessorIsActive()=0;
	virtual TInt ProcessorResult() const=0;
	virtual TBool ProcessorRunmode() const=0;
	virtual SCharPosition ProcessorErrorPosition() const=0;
	};

#endif
