vbscript: Moved VBScript declaration to vbscript.c.
[wine] / dlls / vbscript / vbscript.c
1 /*
2  * Copyright 2011 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 "config.h"
20
21 #include <stdarg.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "ole2.h"
28
29 #include "vbscript.h"
30
31 #include "wine/debug.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
34
35 #ifdef _WIN64
36
37 #define CTXARG_T DWORDLONG
38 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
39
40 #else
41
42 #define CTXARG_T DWORD
43 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
44
45 #endif
46
47 struct VBScript {
48     IActiveScript IActiveScript_iface;
49     IActiveScriptParse IActiveScriptParse_iface;
50
51     LONG ref;
52
53     IActiveScriptSite *site;
54     LONG thread_id;
55     LCID lcid;
56 };
57
58 static inline VBScript *impl_from_IActiveScript(IActiveScript *iface)
59 {
60     return CONTAINING_RECORD(iface, VBScript, IActiveScript_iface);
61 }
62
63 static HRESULT WINAPI VBScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
64 {
65     VBScript *This = impl_from_IActiveScript(iface);
66
67     if(IsEqualGUID(riid, &IID_IUnknown)) {
68         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
69         *ppv = &This->IActiveScript_iface;
70     }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
71         TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
72         *ppv = &This->IActiveScript_iface;
73     }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
74         TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
75         *ppv = &This->IActiveScriptParse_iface;
76     }else {
77         FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
78         *ppv = NULL;
79         return E_NOINTERFACE;
80     }
81
82     IUnknown_AddRef((IUnknown*)*ppv);
83     return S_OK;
84 }
85
86 static ULONG WINAPI VBScript_AddRef(IActiveScript *iface)
87 {
88     VBScript *This = impl_from_IActiveScript(iface);
89     LONG ref = InterlockedIncrement(&This->ref);
90
91     TRACE("(%p) ref=%d\n", This, ref);
92
93     return ref;
94 }
95
96 static ULONG WINAPI VBScript_Release(IActiveScript *iface)
97 {
98     VBScript *This = impl_from_IActiveScript(iface);
99     LONG ref = InterlockedDecrement(&This->ref);
100
101     TRACE("(%p) ref=%d\n", iface, ref);
102
103     if(!ref) {
104         if(This->site)
105             IActiveScriptSite_Release(This->site);
106         heap_free(This);
107     }
108
109     return ref;
110 }
111
112 static HRESULT WINAPI VBScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
113 {
114     VBScript *This = impl_from_IActiveScript(iface);
115     LCID lcid;
116     HRESULT hres;
117
118     TRACE("(%p)->(%p)\n", This, pass);
119
120     if(!pass)
121         return E_POINTER;
122
123     if(This->site)
124         return E_UNEXPECTED;
125
126     if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
127         return E_UNEXPECTED;
128
129     This->site = pass;
130     IActiveScriptSite_AddRef(This->site);
131
132     hres = IActiveScriptSite_GetLCID(This->site, &lcid);
133     if(hres == S_OK)
134         This->lcid = lcid;
135
136     return S_OK;
137 }
138
139 static HRESULT WINAPI VBScript_GetScriptSite(IActiveScript *iface, REFIID riid,
140                                             void **ppvObject)
141 {
142     VBScript *This = impl_from_IActiveScript(iface);
143     FIXME("(%p)->()\n", This);
144     return E_NOTIMPL;
145 }
146
147 static HRESULT WINAPI VBScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
148 {
149     VBScript *This = impl_from_IActiveScript(iface);
150     FIXME("(%p)->(%d)\n", This, ss);
151     return S_OK;
152 }
153
154 static HRESULT WINAPI VBScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
155 {
156     VBScript *This = impl_from_IActiveScript(iface);
157     FIXME("(%p)->(%p)\n", This, pssState);
158     return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI VBScript_Close(IActiveScript *iface)
162 {
163     VBScript *This = impl_from_IActiveScript(iface);
164     FIXME("(%p)->()\n", This);
165     return E_NOTIMPL;
166 }
167
168 static HRESULT WINAPI VBScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstrName, DWORD dwFlags)
169 {
170     VBScript *This = impl_from_IActiveScript(iface);
171     FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
172     return S_OK;
173 }
174
175 static HRESULT WINAPI VBScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
176         DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
177 {
178     VBScript *This = impl_from_IActiveScript(iface);
179     FIXME("(%p)->()\n", This);
180     return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI VBScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName, IDispatch **ppdisp)
184 {
185     VBScript *This = impl_from_IActiveScript(iface);
186     FIXME("(%p)->(%p)\n", This, ppdisp);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI VBScript_GetCurrentScriptThreadID(IActiveScript *iface,
191                                                        SCRIPTTHREADID *pstridThread)
192 {
193     VBScript *This = impl_from_IActiveScript(iface);
194     FIXME("(%p)->()\n", This);
195     return E_NOTIMPL;
196 }
197
198 static HRESULT WINAPI VBScript_GetScriptThreadID(IActiveScript *iface,
199                                                 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
200 {
201     VBScript *This = impl_from_IActiveScript(iface);
202     FIXME("(%p)->()\n", This);
203     return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI VBScript_GetScriptThreadState(IActiveScript *iface,
207         SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
208 {
209     VBScript *This = impl_from_IActiveScript(iface);
210     FIXME("(%p)->()\n", This);
211     return E_NOTIMPL;
212 }
213
214 static HRESULT WINAPI VBScript_InterruptScriptThread(IActiveScript *iface,
215         SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
216 {
217     VBScript *This = impl_from_IActiveScript(iface);
218     FIXME("(%p)->()\n", This);
219     return E_NOTIMPL;
220 }
221
222 static HRESULT WINAPI VBScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
223 {
224     VBScript *This = impl_from_IActiveScript(iface);
225     FIXME("(%p)->()\n", This);
226     return E_NOTIMPL;
227 }
228
229 static const IActiveScriptVtbl VBScriptVtbl = {
230     VBScript_QueryInterface,
231     VBScript_AddRef,
232     VBScript_Release,
233     VBScript_SetScriptSite,
234     VBScript_GetScriptSite,
235     VBScript_SetScriptState,
236     VBScript_GetScriptState,
237     VBScript_Close,
238     VBScript_AddNamedItem,
239     VBScript_AddTypeLib,
240     VBScript_GetScriptDispatch,
241     VBScript_GetCurrentScriptThreadID,
242     VBScript_GetScriptThreadID,
243     VBScript_GetScriptThreadState,
244     VBScript_InterruptScriptThread,
245     VBScript_Clone
246 };
247
248 static inline VBScript *impl_from_IActiveScriptParse(IActiveScriptParse *iface)
249 {
250     return CONTAINING_RECORD(iface, VBScript, IActiveScriptParse_iface);
251 }
252
253 static HRESULT WINAPI VBScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
254 {
255     VBScript *This = impl_from_IActiveScriptParse(iface);
256     return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
257 }
258
259 static ULONG WINAPI VBScriptParse_AddRef(IActiveScriptParse *iface)
260 {
261     VBScript *This = impl_from_IActiveScriptParse(iface);
262     return IActiveScript_AddRef(&This->IActiveScript_iface);
263 }
264
265 static ULONG WINAPI VBScriptParse_Release(IActiveScriptParse *iface)
266 {
267     VBScript *This = impl_from_IActiveScriptParse(iface);
268     return IActiveScript_Release(&This->IActiveScript_iface);
269 }
270
271 static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface)
272 {
273     VBScript *This = impl_from_IActiveScriptParse(iface);
274     FIXME("(%p)\n", This);
275     return S_OK;
276 }
277
278 static HRESULT WINAPI VBScriptParse_AddScriptlet(IActiveScriptParse *iface,
279         LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
280         LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
281         CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
282         BSTR *pbstrName, EXCEPINFO *pexcepinfo)
283 {
284     VBScript *This = impl_from_IActiveScriptParse(iface);
285     FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
286           debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
287           debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie),
288           ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
289     return E_NOTIMPL;
290 }
291
292 static HRESULT WINAPI VBScriptParse_ParseScriptText(IActiveScriptParse *iface,
293         LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
294         LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
295         DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
296 {
297     VBScript *This = impl_from_IActiveScriptParse(iface);
298     FIXME("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode),
299           debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
300           wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo);
301     return E_NOTIMPL;
302 }
303
304 static const IActiveScriptParseVtbl VBScriptParseVtbl = {
305     VBScriptParse_QueryInterface,
306     VBScriptParse_AddRef,
307     VBScriptParse_Release,
308     VBScriptParse_InitNew,
309     VBScriptParse_AddScriptlet,
310     VBScriptParse_ParseScriptText
311 };
312
313 HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv)
314 {
315     VBScript *ret;
316     HRESULT hres;
317
318     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
319
320     ret = heap_alloc_zero(sizeof(*ret));
321     if(!ret)
322         return E_OUTOFMEMORY;
323
324     ret->IActiveScript_iface.lpVtbl = &VBScriptVtbl;
325     ret->IActiveScriptParse_iface.lpVtbl = &VBScriptParseVtbl;
326
327     ret->ref = 1;
328
329     hres = IActiveScript_QueryInterface(&ret->IActiveScript_iface, riid, ppv);
330     IActiveScript_Release(&ret->IActiveScript_iface);
331     return hres;
332 }