[GME-commit] GMESRC/GME/Console ScriptHost.h,NONE,1.1 ScriptHost.cpp,NONE,1.1 ScriptEdit.h,NONE,1.1 ScriptEdit.cpp,NONE,1.1

gme-commit at list.isis.vanderbilt.edu gme-commit at list.isis.vanderbilt.edu
Thu Dec 2 17:00:45 CST 2004


Update of /var/lib/gme/GMESRC/GME/Console
In directory braindrain:/tmp/cvs-serv12851

Added Files:
	ScriptHost.h ScriptHost.cpp ScriptEdit.h ScriptEdit.cpp 
Log Message:
console script

CVS User: bogyom

--- NEW FILE: ScriptHost.h ---
// ScriptHost.h : Declaration of the CScriptHost

#ifndef __SCRIPTHOST_H_
#define __SCRIPTHOST_H_

#include "resource.h"       // main symbols
#include "ACTIVSCP.H"
#include "gme.h"

#include <comdef.h>

class CConsoleCtrl;
/////////////////////////////////////////////////////////////////////////////
// CScriptHost
class ATL_NO_VTABLE CScriptHost : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CScriptHost, &CLSID_ScriptHost>,
	public IDispatchImpl<IScriptHost, &IID_IScriptHost, &LIBID_CONSOLELib>,
	public IActiveScriptSite
{
public:
	CScriptHost()
	{
	}

DECLARE_REGISTRY_RESOURCEID(IDR_SCRIPTHOST)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CScriptHost)
	COM_INTERFACE_ENTRY(IScriptHost)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IActiveScriptSite)
END_COM_MAP()

// IScriptHost
public:
	STDMETHOD(ProcessString)(/*[in]*/ BSTR input);
	STDMETHOD(InitEngine)(/*[in]*/ void* console, /*[in]*/ BSTR engineProgid);

// IActiveScriptSite
 public:
	 STDMETHOD(SetGME)(/*[in]*/ IDispatch* gmeapp);
	STDMETHOD(GetLCID)(/*[out]*/ LCID *plcid);
	STDMETHOD(GetItemInfo)(
                /*[in]*/  LPCOLESTR pstrName,
                /*[in]*/  DWORD     dwReturnMask,
                /*[out]*/ IUnknown  **ppiunkItem,
                /*[out]*/ ITypeInfo **ppti);
	STDMETHOD(GetDocVersionString)(/*[out]*/ BSTR      *pbstrVersion);
	STDMETHOD(OnScriptTerminate)(
                /*[in]*/  const VARIANT     *pvarResult,
                /*[in]*/  const EXCEPINFO   *pexcepinfo);
	STDMETHOD(OnStateChange)(
                /*[in]*/  SCRIPTSTATE       ssScriptState);
	STDMETHOD(OnScriptError)(
                /*[in]*/  IActiveScriptError *pscripterror);
	STDMETHOD(OnEnterScript)(void);
	STDMETHOD(OnLeaveScript)(void);

private:
	CConsoleCtrl *m_console;
	IActiveScriptPtr m_iscript;
	IActiveScriptParsePtr m_iscriptParse;
	_bstr_t m_enginePID;

	CComPtr<IGMEOLEApp> m_gmeptr;
	CComPtr<IMgaProject> m_mgaproj;
};

#endif //__SCRIPTHOST_H_

--- NEW FILE: ScriptHost.cpp ---
// ScriptHost.cpp : Implementation of CScriptHost
#include "stdafx.h"
#include "Console.h"
#include "ScriptHost.h"
#include "ConsoleCtl.h"

/////////////////////////////////////////////////////////////////////////////
// CScriptHost


STDMETHODIMP CScriptHost::InitEngine(void* console, BSTR engineProgid)
{
	// register app and project 
	try
	{
		m_console = (CConsoleCtrl*)console;
		_bstr_t newprogid(engineProgid);
		if (m_enginePID == newprogid)
			return S_OK;
		if (m_iscript != NULL)
		{
			COMTHROW(m_iscript->Close());
			m_iscript.Release();
		}
		m_enginePID = newprogid;
		COMTHROW(m_iscript.CreateInstance((BSTR)m_enginePID));
		m_iscriptParse = m_iscript;
		IActiveScriptSitePtr scs(this);
		COMTHROW(m_iscript->SetScriptSite(scs));
		COMTHROW(m_iscriptParse->InitNew());
		if (m_gmeptr != NULL)
		{
			_bstr_t project("project");
			_bstr_t gme("gme");
			COMTHROW(m_iscript->AddNamedItem(gme, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE));
			COMTHROW(m_iscript->AddNamedItem(project, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE));
		}
		COMTHROW(m_iscript->SetScriptState(SCRIPTSTATE_CONNECTED));
	}
	catch(hresult_exception &e) 
	{ 
		return e.hr;
	}
	return S_OK;
}

STDMETHODIMP CScriptHost::ProcessString(BSTR input)
{
// app = new ActiveXObject("Gme.Application"); app.ConsoleContents = "kaka maka";
//	_bstr_t str1("GMEapp = new ActiveXObject(\"Gme.Application\"); ");
//	_bstr_t str2("GMEapp.ConsoleContents = \"kaka maka\"");
//	_bstr_t str2("GMEapp.ConsoleClear();");
//	_bstr_t str2("GMEapp.CloseProject();");
//	_bstr_t strx("app = new ActiveXObject(\"GME.Application\"); app.CreateProject(\"MetaGME\", \"MGA=C:\\OCL_TEST\\kakamaka.mga\");");
//	_bstr_t str = str1 + str2;

	try
	{
		COMTHROW(m_iscriptParse->ParseScriptText(input, NULL, NULL, NULL, 0, 0, 
			SCRIPTTEXT_ISPERSISTENT, NULL, NULL));
	}
	catch(hresult_exception &e) 
	{ 
		return e.hr;
	}
	return S_OK;
}

STDMETHODIMP CScriptHost::GetLCID(/*[out]*/ LCID *plcid)
{
	return S_OK;
}

STDMETHODIMP CScriptHost::GetItemInfo(
                /*[in]*/  LPCOLESTR pstrName,
                /*[in]*/  DWORD     dwReturnMask,
                /*[out]*/ IUnknown  **ppiunkItem,
                /*[out]*/ ITypeInfo **ppti)
{
	if (!m_gmeptr)
		return E_FAIL;
	if (dwReturnMask&SCRIPTINFO_IUNKNOWN)
	{
		if ((_bstr_t)pstrName == _bstr_t("gme"))
		{
			CComPtr<IUnknown> punk(m_gmeptr);
			((IUnknown*)punk)->AddRef(); 
			*ppiunkItem = punk;
		}
		else if ((_bstr_t)pstrName == _bstr_t("project"))
		{
			CComPtr<IUnknown> punk(m_mgaproj);
			((IUnknown*)punk)->AddRef(); 
			*ppiunkItem = punk;
		}
	}
	if (dwReturnMask&SCRIPTINFO_ITYPEINFO)
	{
	}

	return S_OK;
}

STDMETHODIMP CScriptHost::GetDocVersionString(/*[out]*/ BSTR      *pbstrVersion)
{
	return S_OK;
}

STDMETHODIMP CScriptHost::OnScriptTerminate(
                /*[in]*/  const VARIANT     *pvarResult,
                /*[in]*/  const EXCEPINFO   *pexcepinfo)
{
	return S_OK;
}

STDMETHODIMP CScriptHost::OnStateChange(
                /*[in]*/  SCRIPTSTATE       ssScriptState)
{
	return S_OK;
}

STDMETHODIMP CScriptHost::OnScriptError(
                /*[in]*/  IActiveScriptError *pscripterror)
{
	try
	{
		IActiveScriptErrorPtr perr(pscripterror);

		EXCEPINFO expinfo;
		COMTHROW(perr->GetExceptionInfo(&expinfo));
		DWORD	sc;
		ULONG	line = 0;
		LONG	ch = 0;
		COMTHROW(perr->GetSourcePosition(&sc, &line, &ch));

		// write to console 
		CString desc = expinfo.bstrDescription;
		char err[500];
		sprintf(err, "Scripting Error: %s, Position: %d", desc, ch);
		m_console->Message((LPCTSTR)err, MSG_ERROR);
	}
	catch(hresult_exception &e) 
	{ 
		return e.hr;
	}

	return S_OK;
}

STDMETHODIMP CScriptHost::OnEnterScript(void)
{
	return S_OK;
}

STDMETHODIMP CScriptHost::OnLeaveScript(void)
{
	return S_OK;
}

STDMETHODIMP CScriptHost::SetGME(IDispatch *gmeapp)
{

	if (m_gmeptr == NULL  &&  gmeapp == NULL)
		return S_OK;
	try
	{
		m_gmeptr.Release();
		m_mgaproj.Release();
		if (gmeapp == NULL)
		{
			// delete names 
			if (m_iscript != NULL)
			{
				COMTHROW(m_iscript->Close());
				m_iscript.Release();
			}
			COMTHROW(m_iscript.CreateInstance((BSTR)m_enginePID));
			m_iscriptParse = m_iscript;
			IActiveScriptSitePtr scs(this);
			COMTHROW(m_iscript->SetScriptSite(scs));
			COMTHROW(m_iscriptParse->InitNew());
			COMTHROW(m_iscript->SetScriptState(SCRIPTSTATE_CONNECTED));
			return S_OK;
		}

		CComPtr<IDispatch> gip(gmeapp);
		COMTHROW(gip.QueryInterface(&m_gmeptr));

		COMTHROW(m_gmeptr->get_MgaProject(&m_mgaproj));

		_bstr_t project("project");
		_bstr_t gme("gme");
		COMTHROW(m_iscript->AddNamedItem(gme, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE));
		COMTHROW(m_iscript->AddNamedItem(project, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE));
		COMTHROW(m_iscript->SetScriptState(SCRIPTSTATE_CONNECTED));
	}
	catch(hresult_exception &e) 
	{ 
		return e.hr;
	}
	return S_OK;
}

--- NEW FILE: ScriptEdit.h ---
// ScriptEdit.h: interface for the CScriptEdit class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SCRIPTEDIT_H__5EF35F5A_41C7_4F59_A025_215986107399__INCLUDED_)
#define AFX_SCRIPTEDIT_H__5EF35F5A_41C7_4F59_A025_215986107399__INCLUDED_

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

#include <comdef.h>
#include "Console.h"
#include "ScriptHost.h"
#include <vector>


_COM_SMARTPTR_TYPEDEF(IScriptHost, __uuidof(IScriptHost));

class CConsoleCtrl;
class CScriptEdit : public CEdit  
{
public:
	CScriptEdit();
	virtual ~CScriptEdit();
	bool Init(CConsoleCtrl *console);
	void SetGMEApp(IDispatch *disp);

protected:
	CConsoleCtrl *m_console;
	IScriptHostPtr m_host;
	typedef std::vector<CString> Strings;
	Strings m_inputlist;

	DECLARE_MESSAGE_MAP()

	afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );

};

#endif // !defined(AFX_SCRIPTEDIT_H__5EF35F5A_41C7_4F59_A025_215986107399__INCLUDED_)

--- NEW FILE: ScriptEdit.cpp ---
// ScriptEdit.cpp: implementation of the CScriptEdit class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ScriptEdit.h"
#include "ConsoleCtl.h"
#include "MgaUtil.h"
#include "GME.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CScriptEdit, CEdit)
	//{{AFX_MSG_MAP(CHtmlCtrl)
	ON_WM_KEYUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


CScriptEdit::CScriptEdit()
{

}

CScriptEdit::~CScriptEdit()
{

}

bool CScriptEdit::Init(CConsoleCtrl *cons)
{
	try
	{
		m_console = cons;
		COMTHROW(m_host.CreateInstance(CLSID_ScriptHost));
		_bstr_t engine("JScript");
		COMTHROW(m_host->InitEngine((void*)m_console, engine));
	}
	catch(hresult_exception &e) 
	{ 
		char s[200];
		sprintf(s, "Scripting Initialization Error: %d", e.hr);
		m_console->Message((LPCTSTR)s, MSG_ERROR);
		return false;
	}

	return true;
}

void CScriptEdit::OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags )
{
	static int lastup = -1;

	if (nChar == VK_ESCAPE)
	{
		SetSel(0, -1);
		ReplaceSel("");
	}
	else if (nChar == VK_UP)
	{
		lastup++;
		if (lastup >= m_inputlist.size())
			lastup = (m_inputlist.size()==0)? 0: m_inputlist.size()-1;
		if (!m_inputlist.empty())
		{
			SetSel(0, -1);
			ReplaceSel(m_inputlist[m_inputlist.size()-1-lastup]);
		}
	}
	else if (nChar == VK_DOWN)
	{
		lastup --;
		if (lastup < 0)
			lastup = 0;
		if (!m_inputlist.empty())
		{
			SetSel(0, -1);
			ReplaceSel(m_inputlist[m_inputlist.size()-1-lastup]);
		}
	}
	else if (nChar == VK_RETURN)
	{
		lastup = -1;
		CString inp;

		GetLine(0, inp.GetBuffer(256), 256);
		inp.ReleaseBuffer();
		_bstr_t binp = inp;
		// echo
		m_console->Message((LPCTSTR)inp, MSG_NORMAL);
		// check if inp already exists
		for (int k=0; k<m_inputlist.size(); k++)
		{
			if (m_inputlist[k] == inp)
				break;
		}
		// add if inp is new
		if (k == m_inputlist.size())
		{
			m_inputlist.push_back(inp);
			if (m_inputlist.size() > 15) // do not store more than 15 items
			{
				Strings::iterator it = m_inputlist.begin();
				m_inputlist.erase(it);
			}
		}

		try
		{
			// load engine info from registry 
			CComPtr<IMgaRegistrar> registrar;
			COMTHROW(registrar.CoCreateInstance(CComBSTR("Mga.MgaRegistrar")));
			ASSERT( registrar != NULL );
			BSTR eng = NULL;
			COMTHROW( registrar->get_ScriptEngine(REGACCESS_USER, &eng) );
			_bstr_t engine("JScript");
			if (eng != NULL  &&  ((_bstr_t)eng).length() != 0)
				engine = eng;

			_bstr_t input = inp;
			COMTHROW(m_host->InitEngine((void*)m_console, engine));
			COMTHROW(m_host->ProcessString(input));
			SetSel(0, -1);
			Clear();
		}
		catch(hresult_exception &e) 
		{ 
			char s[200];
			sprintf(s, "Scripting Error: %d", e.hr);
			m_console->Message((LPCTSTR)s, MSG_ERROR);
		}
	}
}

void CScriptEdit::SetGMEApp(IDispatch *disp)
{
	try
	{
		COMTHROW(m_host->SetGME(disp));
	}
	catch(hresult_exception &e) 
	{ 
		char s[200];
		sprintf(s, "Scripting Error: %d", e.hr);
		m_console->Message((LPCTSTR)s, MSG_ERROR);
	}
}




More information about the GME-commit mailing list