[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