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.

255 lines
7.4 KiB

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