jscript: Added DllCanUnloadNow implementation.
[wine] / dlls / jscript / jscript.c
1 /*
2  * Copyright 2008 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "jscript.h"
20 #include "activscp.h"
21 #include "objsafe.h"
22
23 #include "wine/debug.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
26
27 typedef struct {
28     const IActiveScriptVtbl                 *lpIActiveScriptVtbl;
29     const IActiveScriptParseVtbl            *lpIActiveScriptParseVtbl;
30     const IActiveScriptParseProcedure2Vtbl  *lpIActiveScriptParseProcedure2Vtbl;
31     const IActiveScriptPropertyVtbl         *lpIActiveScriptPropertyVtbl;
32     const IObjectSafetyVtbl                 *lpIObjectSafetyVtbl;
33
34     LONG ref;
35 } JScript;
36
37 #define ACTSCRIPT(x)    ((IActiveScript*)                 &(x)->lpIActiveScriptVtbl)
38 #define ASPARSE(x)      ((IActiveScriptParse*)            &(x)->lpIActiveScriptParseVtbl)
39 #define ASPARSEPROC(x)  ((IActiveScriptParseProcedure2*)  &(x)->lpIActiveScriptParseProcedure2Vtbl)
40 #define ACTSCPPROP(x)   ((IActiveScriptProperty*)         &(x)->lpIActiveScriptPropertyVtbl)
41 #define OBJSAFETY(x)    ((IObjectSafety*)                 &(x)->lpIObjectSafetyVtbl)
42
43 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
44
45 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
46 {
47     JScript *This = ACTSCRIPT_THIS(iface);
48
49     *ppv = NULL;
50
51     if(IsEqualGUID(riid, &IID_IUnknown)) {
52         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
53         *ppv = ACTSCRIPT(This);
54     }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
55         TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
56         *ppv = ACTSCRIPT(This);
57     }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
58         TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
59         *ppv = ASPARSE(This);
60     }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
61         TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
62         *ppv = ASPARSEPROC(This);
63     }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
64         TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
65         *ppv = ASPARSEPROC(This);
66     }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
67         TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
68         *ppv = ACTSCPPROP(This);
69     }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
70         TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
71         *ppv = OBJSAFETY(This);
72     }
73
74     if(*ppv) {
75         IUnknown_AddRef((IUnknown*)*ppv);
76         return S_OK;
77     }
78
79     FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
80     return E_NOINTERFACE;
81 }
82
83 static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
84 {
85     JScript *This = ACTSCRIPT_THIS(iface);
86     LONG ref = InterlockedIncrement(&This->ref);
87
88     TRACE("(%p) ref=%d\n", This, ref);
89
90     return ref;
91 }
92
93 static ULONG WINAPI JScript_Release(IActiveScript *iface)
94 {
95     JScript *This = ACTSCRIPT_THIS(iface);
96     LONG ref = InterlockedDecrement(&This->ref);
97
98     TRACE("(%p) ref=%d\n", iface, ref);
99
100     if(!ref) {
101         heap_free(This);
102         unlock_module();
103     }
104
105     return ref;
106 }
107
108 static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
109                                             IActiveScriptSite *pass)
110 {
111     JScript *This = ACTSCRIPT_THIS(iface);
112     FIXME("(%p)->(%p)\n", This, pass);
113     return E_NOTIMPL;
114 }
115
116 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
117                                             void **ppvObject)
118 {
119     JScript *This = ACTSCRIPT_THIS(iface);
120     FIXME("(%p)->()\n", This);
121     return E_NOTIMPL;
122 }
123
124 static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
125 {
126     JScript *This = ACTSCRIPT_THIS(iface);
127     FIXME("(%p)->(%d)\n", This, ss);
128     return E_NOTIMPL;
129 }
130
131 static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
132 {
133     JScript *This = ACTSCRIPT_THIS(iface);
134     FIXME("(%p)->(%p)\n", This, pssState);
135     return E_NOTIMPL;
136 }
137
138 static HRESULT WINAPI JScript_Close(IActiveScript *iface)
139 {
140     JScript *This = ACTSCRIPT_THIS(iface);
141     FIXME("(%p)->()\n", This);
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
146                                            LPCOLESTR pstrName, DWORD dwFlags)
147 {
148     JScript *This = ACTSCRIPT_THIS(iface);
149     FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
150     return E_NOTIMPL;
151 }
152
153 static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
154                                          DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
155 {
156     JScript *This = ACTSCRIPT_THIS(iface);
157     FIXME("(%p)->()\n", This);
158     return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
162                                                 IDispatch **ppdisp)
163 {
164     JScript *This = ACTSCRIPT_THIS(iface);
165     FIXME("(%p)->()\n", This);
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface,
170                                                        SCRIPTTHREADID *pstridThread)
171 {
172     JScript *This = ACTSCRIPT_THIS(iface);
173     FIXME("(%p)->()\n", This);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface,
178                                                 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
179 {
180     JScript *This = ACTSCRIPT_THIS(iface);
181     FIXME("(%p)->()\n", This);
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface,
186         SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
187 {
188     JScript *This = ACTSCRIPT_THIS(iface);
189     FIXME("(%p)->()\n", This);
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface,
194         SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
195 {
196     JScript *This = ACTSCRIPT_THIS(iface);
197     FIXME("(%p)->()\n", This);
198     return E_NOTIMPL;
199 }
200
201 static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
202 {
203     JScript *This = ACTSCRIPT_THIS(iface);
204     FIXME("(%p)->()\n", This);
205     return E_NOTIMPL;
206 }
207
208 #undef ACTSCRIPT_THIS
209
210 static const IActiveScriptVtbl JScriptVtbl = {
211     JScript_QueryInterface,
212     JScript_AddRef,
213     JScript_Release,
214     JScript_SetScriptSite,
215     JScript_GetScriptSite,
216     JScript_SetScriptState,
217     JScript_GetScriptState,
218     JScript_Close,
219     JScript_AddNamedItem,
220     JScript_AddTypeLib,
221     JScript_GetScriptDispatch,
222     JScript_GetCurrentScriptThreadID,
223     JScript_GetScriptThreadID,
224     JScript_GetScriptThreadState,
225     JScript_InterruptScriptThread,
226     JScript_Clone
227 };
228
229 #define ASPARSE_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
230
231 static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
232 {
233     JScript *This = ASPARSE_THIS(iface);
234     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
235 }
236
237 static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
238 {
239     JScript *This = ASPARSE_THIS(iface);
240     return IActiveScript_AddRef(ACTSCRIPT(This));
241 }
242
243 static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
244 {
245     JScript *This = ASPARSE_THIS(iface);
246     return IActiveScript_Release(ACTSCRIPT(This));
247 }
248
249 static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
250 {
251     JScript *This = ASPARSE_THIS(iface);
252     FIXME("(%p)\n", This);
253     return E_NOTIMPL;
254 }
255
256 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
257         LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
258         LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
259         DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
260         BSTR *pbstrName, EXCEPINFO *pexcepinfo)
261 {
262     JScript *This = ASPARSE_THIS(iface);
263     FIXME("(%p)->(%s %s %s %s %s %s %x %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
264           debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
265           debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), dwSourceContextCookie,
266           ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
267     return E_NOTIMPL;
268 }
269
270 static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
271         LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
272         LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine,
273         DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
274 {
275     JScript *This = ASPARSE_THIS(iface);
276     FIXME("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode),
277           debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
278           dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo);
279     return E_NOTIMPL;
280 }
281
282 #undef ASPARSE_THIS
283
284 static const IActiveScriptParseVtbl JScriptParseVtbl = {
285     JScriptParse_QueryInterface,
286     JScriptParse_AddRef,
287     JScriptParse_Release,
288     JScriptParse_InitNew,
289     JScriptParse_AddScriptlet,
290     JScriptParse_ParseScriptText
291 };
292
293 #define ASPARSEPROC_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
294
295 static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
296 {
297     JScript *This = ASPARSEPROC_THIS(iface);
298     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
299 }
300
301 static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
302 {
303     JScript *This = ASPARSEPROC_THIS(iface);
304     return IActiveScript_AddRef(ACTSCRIPT(This));
305 }
306
307 static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
308 {
309     JScript *This = ASPARSEPROC_THIS(iface);
310     return IActiveScript_Release(ACTSCRIPT(This));
311 }
312
313 static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
314         LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
315         LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
316         DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
317 {
318     JScript *This = ASPARSEPROC_THIS(iface);
319     FIXME("(%p)->()\n", This);
320     return E_NOTIMPL;
321 }
322
323 #undef ASPARSEPROC_THIS
324
325 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl = {
326     JScriptParseProcedure_QueryInterface,
327     JScriptParseProcedure_AddRef,
328     JScriptParseProcedure_Release,
329     JScriptParseProcedure_ParseProcedureText,
330 };
331
332 #define ACTSCPPROP_THIS(iface) DEFINE_THIS(JScript, IActiveScriptProperty, iface)
333
334 static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
335 {
336     JScript *This = ACTSCPPROP_THIS(iface);
337     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
338 }
339
340 static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
341 {
342     JScript *This = ACTSCPPROP_THIS(iface);
343     return IActiveScript_AddRef(ACTSCRIPT(This));
344 }
345
346 static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
347 {
348     JScript *This = ACTSCPPROP_THIS(iface);
349     return IActiveScript_Release(ACTSCRIPT(This));
350 }
351
352 static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
353         VARIANT *pvarIndex, VARIANT *pvarValue)
354 {
355     JScript *This = ACTSCPPROP_THIS(iface);
356     FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
361         VARIANT *pvarIndex, VARIANT *pvarValue)
362 {
363     JScript *This = ACTSCPPROP_THIS(iface);
364     FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
365     return E_NOTIMPL;
366 }
367
368 #undef ACTSCPPROP_THIS
369
370 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
371     JScriptProperty_QueryInterface,
372     JScriptProperty_AddRef,
373     JScriptProperty_Release,
374     JScriptProperty_GetProperty,
375     JScriptProperty_SetProperty
376 };
377
378 #define OBJSAFETY_THIS(iface) DEFINE_THIS(JScript, IObjectSafety, iface)
379
380 static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
381 {
382     JScript *This = OBJSAFETY_THIS(iface);
383     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
384 }
385
386 static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
387 {
388     JScript *This = OBJSAFETY_THIS(iface);
389     return IActiveScript_AddRef(ACTSCRIPT(This));
390 }
391
392 static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
393 {
394     JScript *This = OBJSAFETY_THIS(iface);
395     return IActiveScript_Release(ACTSCRIPT(This));
396 }
397
398 static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
399         DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
400 {
401     JScript *This = OBJSAFETY_THIS(iface);
402     FIXME("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
403     return E_NOTIMPL;
404 }
405
406 static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
407         DWORD dwOptionSetMask, DWORD dwEnabledOptions)
408 {
409     JScript *This = OBJSAFETY_THIS(iface);
410     FIXME("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
411     return S_OK;
412 }
413
414 #undef OBJSAFETY_THIS
415
416 static const IObjectSafetyVtbl JScriptSafetyVtbl = {
417     JScriptSafety_QueryInterface,
418     JScriptSafety_AddRef,
419     JScriptSafety_Release,
420     JScriptSafety_GetInterfaceSafetyOptions,
421     JScriptSafety_SetInterfaceSafetyOptions
422 };
423
424 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
425                                              REFIID riid, void **ppv)
426 {
427     JScript *ret;
428     HRESULT hres;
429
430     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
431
432     lock_module();
433
434     ret = heap_alloc(sizeof(*ret));
435
436     ret->lpIActiveScriptVtbl                 = &JScriptVtbl;
437     ret->lpIActiveScriptParseVtbl            = &JScriptParseVtbl;
438     ret->lpIActiveScriptParseProcedure2Vtbl  = &JScriptParseProcedureVtbl;
439     ret->lpIActiveScriptPropertyVtbl         = &JScriptPropertyVtbl;
440     ret->lpIObjectSafetyVtbl                 = &JScriptSafetyVtbl;
441     ret->ref = 1;
442
443     hres = IActiveScript_QueryInterface(ACTSCRIPT(ret), riid, ppv);
444     IActiveScript_Release(ACTSCRIPT(ret));
445     return hres;
446 }