diff options
Diffstat (limited to 'sapi/activescript/php5as_scriptengine.h')
-rw-r--r-- | sapi/activescript/php5as_scriptengine.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/sapi/activescript/php5as_scriptengine.h b/sapi/activescript/php5as_scriptengine.h new file mode 100644 index 0000000000..fd5fd522a8 --- /dev/null +++ b/sapi/activescript/php5as_scriptengine.h @@ -0,0 +1,235 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Wez Furlong <wez@thebrainroom.com> | + +----------------------------------------------------------------------+ + */ +/* $Id$ */ + +#include <activscp.h> +#include "zend.h" +#include <setjmp.h> + +/* Definitions for thread messages */ +enum { + PHPSE_STATE_CHANGE = WM_USER + 20, + PHPSE_INIT_NEW, + PHPSE_PARSE_SCRIPT, + PHPSE_ADD_SCRIPTLET, + PHPSE_CLOSE, + PHPSE_CLONE, + PHPSE_ENTER, + PHPSE_LEAVE, + PHPSE_TERMINATE, + PHPSE_PARSE_PROC, + PHPSE_EXEC_PROC, + PHPSE_ADD_NAMED_ITEM, + PHPSE_SET_SITE, + PHPSE_ADD_TYPELIB, + PHPSE_TRIGGER_ERROR, + PHPSE_GET_DISPATCH, + PHPSE_DUMMY_TICK, +}; + +struct php_active_script_get_dispatch_info { + LPCOLESTR pstrItemName; + DWORD dispatch; +}; + +struct php_active_script_add_named_item_info { + LPCOLESTR pstrName; + DWORD dwFlags; + IUnknown *punk; + ITypeInfo *ptyp; + IDispatch *pdisp; + DWORD marshal; +}; + +struct php_active_script_add_scriptlet_info { + /* [in] */ LPCOLESTR pstrDefaultName; + /* [in] */ LPCOLESTR pstrCode; + /* [in] */ LPCOLESTR pstrItemName; + /* [in] */ LPCOLESTR pstrSubItemName; + /* [in] */ LPCOLESTR pstrEventName; + /* [in] */ LPCOLESTR pstrDelimiter; + /* [in] */ DWORD dwSourceContextCookie; + /* [in] */ ULONG ulStartingLineNumber; + /* [in] */ DWORD dwFlags; + /* [out] */ BSTR *pbstrName; + /* [out] */ EXCEPINFO *pexcepinfo; +}; + +struct php_active_script_parse_info { + /* [in] */ LPCOLESTR pstrCode; + /* [in] */ LPCOLESTR pstrItemName; + /* [in] */ IUnknown *punkContext; + /* [in] */ LPCOLESTR pstrDelimiter; + /* [in] */ DWORD dwSourceContextCookie; + /* [in] */ ULONG ulStartingLineNumber; + /* [in] */ DWORD dwFlags; + /* [out] */ VARIANT *pvarResult; + /* [out] */ EXCEPINFO *pexcepinfo; +}; + +struct php_active_script_parse_proc_info { + /* [in] */ LPCOLESTR pstrCode; + /* [in] */ LPCOLESTR pstrFormalParams; + /* [in] */ LPCOLESTR pstrProcedureName; + /* [in] */ LPCOLESTR pstrItemName; + /* [in] */ IUnknown *punkContext; + /* [in] */ LPCOLESTR pstrDelimiter; + /* [in] */ DWORD dwSourceContextCookie; + /* [in] */ ULONG ulStartingLineNumber; + /* [in] */ DWORD dwFlags; + DWORD dispcookie; +}; + +struct php_active_script_add_tlb_info { + /* [in] */ const GUID * rguidTypeLib; + /* [in] */ DWORD dwMajor; + /* [in] */ DWORD dwMinor; + /* [in] */ DWORD dwFlags; +}; + +class TPHPScriptingEngine: + public IActiveScript, + public IActiveScriptParse, + public IActiveScriptParseProcedure +{ +public: + volatile LONG m_refcount; + IActiveScriptSite *m_pass; + SCRIPTSTATE m_scriptstate; + MUTEX_T m_mutex; + HashTable m_script_dispatchers; + HANDLE m_engine_thread_handle; + + HANDLE m_sync_thread_msg; + HRESULT m_sync_thread_ret; + + /* This is hacky, but only used when the host queries us for a script dispatch */ + void *** m_tsrm_hack; + + void add_to_global_namespace(IDispatch *disp, DWORD flags, char *name TSRMLS_DC); + + THREAD_T m_enginethread, m_basethread; + HashTable m_frags; + ULONG m_lambda_count; + IActiveScriptSite *m_pass_eng; + + jmp_buf *m_err_trap; + int m_in_main, m_stop_main; + + HRESULT SendThreadMessage(LONG msg, WPARAM wparam, LPARAM lparam); + + void engine_thread_func(void); + HRESULT engine_thread_handler(LONG msg, WPARAM wParam, LPARAM lParam, int *handled TSRMLS_DC); + +public: /* IUnknown */ + STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject); + STDMETHODIMP_(DWORD) AddRef(void); + STDMETHODIMP_(DWORD) Release(void); +public: /* IActiveScript */ + STDMETHODIMP SetScriptSite( + /* [in] */ IActiveScriptSite *pass); + + STDMETHODIMP GetScriptSite( + /* [in] */ REFIID riid, + /* [iid_is][out] */ void **ppvObject); + + STDMETHODIMP SetScriptState( + /* [in] */ SCRIPTSTATE ss); + + STDMETHODIMP GetScriptState( + /* [out] */ SCRIPTSTATE *pssState); + + STDMETHODIMP Close( void); + + STDMETHODIMP AddNamedItem( + /* [in] */ LPCOLESTR pstrName, + /* [in] */ DWORD dwFlags); + + STDMETHODIMP AddTypeLib( + /* [in] */ REFGUID rguidTypeLib, + /* [in] */ DWORD dwMajor, + /* [in] */ DWORD dwMinor, + /* [in] */ DWORD dwFlags); + + STDMETHODIMP GetScriptDispatch( + /* [in] */ LPCOLESTR pstrItemName, + /* [out] */ IDispatch **ppdisp); + + STDMETHODIMP GetCurrentScriptThreadID( + /* [out] */ SCRIPTTHREADID *pstidThread); + + STDMETHODIMP GetScriptThreadID( + /* [in] */ DWORD dwWin32ThreadId, + /* [out] */ SCRIPTTHREADID *pstidThread); + + STDMETHODIMP GetScriptThreadState( + /* [in] */ SCRIPTTHREADID stidThread, + /* [out] */ SCRIPTTHREADSTATE *pstsState); + + STDMETHODIMP InterruptScriptThread( + /* [in] */ SCRIPTTHREADID stidThread, + /* [in] */ const EXCEPINFO *pexcepinfo, + /* [in] */ DWORD dwFlags); + + STDMETHODIMP Clone( + /* [out] */ IActiveScript **ppscript); + +public: /* IActiveScriptParse */ + STDMETHODIMP InitNew( void); + + STDMETHODIMP AddScriptlet( + /* [in] */ LPCOLESTR pstrDefaultName, + /* [in] */ LPCOLESTR pstrCode, + /* [in] */ LPCOLESTR pstrItemName, + /* [in] */ LPCOLESTR pstrSubItemName, + /* [in] */ LPCOLESTR pstrEventName, + /* [in] */ LPCOLESTR pstrDelimiter, + /* [in] */ DWORD dwSourceContextCookie, + /* [in] */ ULONG ulStartingLineNumber, + /* [in] */ DWORD dwFlags, + /* [out] */ BSTR *pbstrName, + /* [out] */ EXCEPINFO *pexcepinfo); + + STDMETHODIMP ParseScriptText( + /* [in] */ LPCOLESTR pstrCode, + /* [in] */ LPCOLESTR pstrItemName, + /* [in] */ IUnknown *punkContext, + /* [in] */ LPCOLESTR pstrDelimiter, + /* [in] */ DWORD dwSourceContextCookie, + /* [in] */ ULONG ulStartingLineNumber, + /* [in] */ DWORD dwFlags, + /* [out] */ VARIANT *pvarResult, + /* [out] */ EXCEPINFO *pexcepinfo); +public: /* IActiveScriptParseProcedure */ + STDMETHODIMP ParseProcedureText( + /* [in] */ LPCOLESTR pstrCode, + /* [in] */ LPCOLESTR pstrFormalParams, + /* [in] */ LPCOLESTR pstrProcedureName, + /* [in] */ LPCOLESTR pstrItemName, + /* [in] */ IUnknown *punkContext, + /* [in] */ LPCOLESTR pstrDelimiter, + /* [in] */ DWORD dwSourceContextCookie, + /* [in] */ ULONG ulStartingLineNumber, + /* [in] */ DWORD dwFlags, + /* [out] */ IDispatch **ppdisp); +public: + TPHPScriptingEngine(); + ~TPHPScriptingEngine(); + +}; + |