// esh.h: interface for the CEventScriptHandler class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_EVENTSCRIPTHANLDER_H__300C7F54_FE1E_11D0_A776_00C04FC2F5B3__INCLUDED_)
#define AFX_EVENTSCRIPTHANLDER_H__300C7F54_FE1E_11D0_A776_00C04FC2F5B3__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000


//
// CEventScriptHandler - Use or derive from this class to create a script
// handler for a specific sink.
//
// Usage: Use SetScript to pass the script to the script handler. You can
// make global variables available to your script by calling AddGlobalVariable.
// Use AddConnectionPoint to bind to specific functions within the script.
// Name the connection point Hello and the script parse will look for Hello_xxx
// functions and attempt to connect to them. Once you have set the script and
// any other options, you can call StartScript to cause the script to be loaded,
// parsed and intialized. Any global code in the script will be executed at this
// time. Use ExecuteConnectionPoint to cause a specific function to be executed.
//

class CEventScriptHandler  
{
public:
	CEventScriptHandler();
	virtual ~CEventScriptHandler();

	// set the script to be executed
	STDMETHOD(SetScript)(IStream* pstmScript);
	STDMETHOD(SetScript)(BSTR bstrFileName);
	// sets the maximum execution time for the script
	STDMETHOD(MaxExecutionTime)(DWORD dwMaxExecutionTime);
	// tells the script engine whether to allow CreateObject calls
	STDMETHOD(AllowCreateObject)(BOOL fCreateObjectAllowed);
	// tells the script parser that the script uses ASPSyntax
	STDMETHOD(ASPSyntax)(BOOL fIsASPSyntax);
	// adds a connnection point
	STDMETHOD(AddConnectionPoint)(BSTR bstrName, IConnectionPointContainer* pContainer);
	// adds a global variable
	STDMETHOD(AddGlobalVariable)(BSTR bstrName, VARIANT varVariable);

	// Initializes the script engine, parses the scripts and resolves
	// all connection points. Requires that SetScript be called first.
	// Above functions must be called before StartScript for them to 
	// affect script execution.
	STDMETHOD(StartScript)(void);
	// stops the script
	STDMETHOD(StopScript)(void);
	// stops and starts the script
	STDMETHOD(RestartScript)(void);
	// causes a specific script function to be executed
	STDMETHOD(ExecuteConnectionPoint)(IConnectionPoint* pConnectionPoint, DISPID dispid);

protected:
	VARIANT m_varScriptResponse;
	VARIANT m_varErrorResponse;
	IScripto* m_pScripto;
	ULONG m_cNamedProps;
	IPropertyBag* m_pBag;
private:
	BOOL m_fScriptStopped;
};

#endif // !defined(AFX_EVENTSCRIPTHANLDER_H__300C7F54_FE1E_11D0_A776_00C04FC2F5B3__INCLUDED_)