You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
6.8 KiB

  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 4 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2002 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 2.02 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available at through the world-wide-web at |
  10. | http://www.php.net/license/2_02.txt. |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Wez Furlong <wez@thebrainroom.com> |
  16. +----------------------------------------------------------------------+
  17. */
  18. /* $Id$ */
  19. #include <activscp.h>
  20. #include "zend.h"
  21. #include <setjmp.h>
  22. /* Definitions for thread messages */
  23. enum {
  24. PHPSE_STATE_CHANGE = WM_USER + 20,
  25. PHPSE_INIT_NEW,
  26. PHPSE_PARSE_SCRIPT,
  27. PHPSE_ADD_SCRIPTLET,
  28. PHPSE_CLOSE,
  29. PHPSE_CLONE,
  30. PHPSE_ENTER,
  31. PHPSE_LEAVE,
  32. PHPSE_TERMINATE,
  33. PHPSE_PARSE_PROC,
  34. PHPSE_EXEC_PROC,
  35. PHPSE_ADD_NAMED_ITEM,
  36. PHPSE_SET_SITE,
  37. PHPSE_ADD_TYPELIB,
  38. PHPSE_TRIGGER_ERROR,
  39. PHPSE_GET_DISPATCH,
  40. PHPSE_DUMMY_TICK,
  41. };
  42. struct php_active_script_get_dispatch_info {
  43. LPCOLESTR pstrItemName;
  44. DWORD dispatch;
  45. };
  46. struct php_active_script_add_named_item_info {
  47. LPCOLESTR pstrName;
  48. DWORD dwFlags;
  49. IUnknown *punk;
  50. ITypeInfo *ptyp;
  51. IDispatch *pdisp;
  52. DWORD marshal;
  53. };
  54. struct php_active_script_add_scriptlet_info {
  55. /* [in] */ LPCOLESTR pstrDefaultName;
  56. /* [in] */ LPCOLESTR pstrCode;
  57. /* [in] */ LPCOLESTR pstrItemName;
  58. /* [in] */ LPCOLESTR pstrSubItemName;
  59. /* [in] */ LPCOLESTR pstrEventName;
  60. /* [in] */ LPCOLESTR pstrDelimiter;
  61. /* [in] */ DWORD dwSourceContextCookie;
  62. /* [in] */ ULONG ulStartingLineNumber;
  63. /* [in] */ DWORD dwFlags;
  64. /* [out] */ BSTR *pbstrName;
  65. /* [out] */ EXCEPINFO *pexcepinfo;
  66. };
  67. struct php_active_script_parse_info {
  68. /* [in] */ LPCOLESTR pstrCode;
  69. /* [in] */ LPCOLESTR pstrItemName;
  70. /* [in] */ IUnknown *punkContext;
  71. /* [in] */ LPCOLESTR pstrDelimiter;
  72. /* [in] */ DWORD dwSourceContextCookie;
  73. /* [in] */ ULONG ulStartingLineNumber;
  74. /* [in] */ DWORD dwFlags;
  75. /* [out] */ VARIANT *pvarResult;
  76. /* [out] */ EXCEPINFO *pexcepinfo;
  77. };
  78. struct php_active_script_parse_proc_info {
  79. /* [in] */ LPCOLESTR pstrCode;
  80. /* [in] */ LPCOLESTR pstrFormalParams;
  81. /* [in] */ LPCOLESTR pstrProcedureName;
  82. /* [in] */ LPCOLESTR pstrItemName;
  83. /* [in] */ IUnknown *punkContext;
  84. /* [in] */ LPCOLESTR pstrDelimiter;
  85. /* [in] */ DWORD dwSourceContextCookie;
  86. /* [in] */ ULONG ulStartingLineNumber;
  87. /* [in] */ DWORD dwFlags;
  88. DWORD dispcookie;
  89. };
  90. struct php_active_script_add_tlb_info {
  91. /* [in] */ const GUID * rguidTypeLib;
  92. /* [in] */ DWORD dwMajor;
  93. /* [in] */ DWORD dwMinor;
  94. /* [in] */ DWORD dwFlags;
  95. };
  96. class TPHPScriptingEngine:
  97. public IActiveScript,
  98. public IActiveScriptParse,
  99. public IActiveScriptParseProcedure
  100. {
  101. public:
  102. volatile LONG m_refcount;
  103. IActiveScriptSite *m_pass;
  104. SCRIPTSTATE m_scriptstate;
  105. MUTEX_T m_mutex;
  106. HashTable m_script_dispatchers;
  107. HANDLE m_engine_thread_handle;
  108. HANDLE m_sync_thread_msg;
  109. HRESULT m_sync_thread_ret;
  110. /* This is hacky, but only used when the host queries us for a script dispatch */
  111. void *** m_tsrm_hack;
  112. void add_to_global_namespace(IDispatch *disp, DWORD flags, char *name TSRMLS_DC);
  113. THREAD_T m_enginethread, m_basethread;
  114. HashTable m_frags;
  115. ULONG m_lambda_count;
  116. IActiveScriptSite *m_pass_eng;
  117. jmp_buf *m_err_trap;
  118. int m_in_main, m_stop_main;
  119. HRESULT SendThreadMessage(LONG msg, WPARAM wparam, LPARAM lparam);
  120. void engine_thread_func(void);
  121. HRESULT engine_thread_handler(LONG msg, WPARAM wParam, LPARAM lParam, int *handled TSRMLS_DC);
  122. public: /* IUnknown */
  123. STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject);
  124. STDMETHODIMP_(DWORD) AddRef(void);
  125. STDMETHODIMP_(DWORD) Release(void);
  126. public: /* IActiveScript */
  127. STDMETHODIMP SetScriptSite(
  128. /* [in] */ IActiveScriptSite *pass);
  129. STDMETHODIMP GetScriptSite(
  130. /* [in] */ REFIID riid,
  131. /* [iid_is][out] */ void **ppvObject);
  132. STDMETHODIMP SetScriptState(
  133. /* [in] */ SCRIPTSTATE ss);
  134. STDMETHODIMP GetScriptState(
  135. /* [out] */ SCRIPTSTATE *pssState);
  136. STDMETHODIMP Close( void);
  137. STDMETHODIMP AddNamedItem(
  138. /* [in] */ LPCOLESTR pstrName,
  139. /* [in] */ DWORD dwFlags);
  140. STDMETHODIMP AddTypeLib(
  141. /* [in] */ REFGUID rguidTypeLib,
  142. /* [in] */ DWORD dwMajor,
  143. /* [in] */ DWORD dwMinor,
  144. /* [in] */ DWORD dwFlags);
  145. STDMETHODIMP GetScriptDispatch(
  146. /* [in] */ LPCOLESTR pstrItemName,
  147. /* [out] */ IDispatch **ppdisp);
  148. STDMETHODIMP GetCurrentScriptThreadID(
  149. /* [out] */ SCRIPTTHREADID *pstidThread);
  150. STDMETHODIMP GetScriptThreadID(
  151. /* [in] */ DWORD dwWin32ThreadId,
  152. /* [out] */ SCRIPTTHREADID *pstidThread);
  153. STDMETHODIMP GetScriptThreadState(
  154. /* [in] */ SCRIPTTHREADID stidThread,
  155. /* [out] */ SCRIPTTHREADSTATE *pstsState);
  156. STDMETHODIMP InterruptScriptThread(
  157. /* [in] */ SCRIPTTHREADID stidThread,
  158. /* [in] */ const EXCEPINFO *pexcepinfo,
  159. /* [in] */ DWORD dwFlags);
  160. STDMETHODIMP Clone(
  161. /* [out] */ IActiveScript **ppscript);
  162. public: /* IActiveScriptParse */
  163. STDMETHODIMP InitNew( void);
  164. STDMETHODIMP AddScriptlet(
  165. /* [in] */ LPCOLESTR pstrDefaultName,
  166. /* [in] */ LPCOLESTR pstrCode,
  167. /* [in] */ LPCOLESTR pstrItemName,
  168. /* [in] */ LPCOLESTR pstrSubItemName,
  169. /* [in] */ LPCOLESTR pstrEventName,
  170. /* [in] */ LPCOLESTR pstrDelimiter,
  171. /* [in] */ DWORD dwSourceContextCookie,
  172. /* [in] */ ULONG ulStartingLineNumber,
  173. /* [in] */ DWORD dwFlags,
  174. /* [out] */ BSTR *pbstrName,
  175. /* [out] */ EXCEPINFO *pexcepinfo);
  176. STDMETHODIMP ParseScriptText(
  177. /* [in] */ LPCOLESTR pstrCode,
  178. /* [in] */ LPCOLESTR pstrItemName,
  179. /* [in] */ IUnknown *punkContext,
  180. /* [in] */ LPCOLESTR pstrDelimiter,
  181. /* [in] */ DWORD dwSourceContextCookie,
  182. /* [in] */ ULONG ulStartingLineNumber,
  183. /* [in] */ DWORD dwFlags,
  184. /* [out] */ VARIANT *pvarResult,
  185. /* [out] */ EXCEPINFO *pexcepinfo);
  186. public: /* IActiveScriptParseProcedure */
  187. STDMETHODIMP ParseProcedureText(
  188. /* [in] */ LPCOLESTR pstrCode,
  189. /* [in] */ LPCOLESTR pstrFormalParams,
  190. /* [in] */ LPCOLESTR pstrProcedureName,
  191. /* [in] */ LPCOLESTR pstrItemName,
  192. /* [in] */ IUnknown *punkContext,
  193. /* [in] */ LPCOLESTR pstrDelimiter,
  194. /* [in] */ DWORD dwSourceContextCookie,
  195. /* [in] */ ULONG ulStartingLineNumber,
  196. /* [in] */ DWORD dwFlags,
  197. /* [out] */ IDispatch **ppdisp);
  198. public:
  199. TPHPScriptingEngine();
  200. ~TPHPScriptingEngine();
  201. };