Fixed header dependencies to be fully compatible with the Windows
[wine] / dlls / dmscript / script.c
1 /* IDirectMusicScript
2  *
3  * Copyright (C) 2003 Rok Mandeljc
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 #include <stdarg.h>
21
22 #include "windef.h"
23 #include "winbase.h"
24 #include "winuser.h"
25 #include "wingdi.h"
26 #include "wine/debug.h"
27
28 #include "dmscript_private.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(dmscript);
31
32 /* IDirectMusicScript IUnknown part: */
33 HRESULT WINAPI IDirectMusicScriptImpl_QueryInterface (LPDIRECTMUSICSCRIPT iface, REFIID riid, LPVOID *ppobj)
34 {
35         ICOM_THIS(IDirectMusicScriptImpl,iface);
36
37         if (IsEqualIID(riid, &IID_IUnknown) || 
38             IsEqualIID(riid, &IID_IDirectMusicScript)) {
39                 IDirectMusicScriptImpl_AddRef(iface);
40                 *ppobj = This;
41                 return S_OK;
42         }
43         
44         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
45         return E_NOINTERFACE;
46 }
47
48 ULONG WINAPI IDirectMusicScriptImpl_AddRef (LPDIRECTMUSICSCRIPT iface)
49 {
50         ICOM_THIS(IDirectMusicScriptImpl,iface);
51         TRACE("(%p) : AddRef from %ld\n", This, This->ref);
52         return ++(This->ref);
53 }
54
55 ULONG WINAPI IDirectMusicScriptImpl_Release (LPDIRECTMUSICSCRIPT iface)
56 {
57         ICOM_THIS(IDirectMusicScriptImpl,iface);
58         ULONG ref = --This->ref;
59         TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
60         if (ref == 0) {
61                 HeapFree(GetProcessHeap(), 0, This);
62         }
63         return ref;
64 }
65
66 /* IDirectMusicScript IDirectMusicScript part: */
67 HRESULT WINAPI IDirectMusicScriptImpl_Init (LPDIRECTMUSICSCRIPT iface, IDirectMusicPerformance* pPerformance, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
68 {
69         ICOM_THIS(IDirectMusicScriptImpl,iface);
70
71         FIXME("(%p, %p, %p): stub\n", This, pPerformance, pErrorInfo);
72
73         return S_OK;
74 }
75
76 HRESULT WINAPI IDirectMusicScriptImpl_CallRoutine (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszRoutineName, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
77 {
78         ICOM_THIS(IDirectMusicScriptImpl,iface);
79
80         FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszRoutineName), pErrorInfo);
81
82         return S_OK;
83 }
84
85 HRESULT WINAPI IDirectMusicScriptImpl_SetVariableVariant (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszVariableName, VARIANT varValue, BOOL fSetRef, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
86 {
87         ICOM_THIS(IDirectMusicScriptImpl,iface);
88
89         FIXME("(%p, %p, FIXME, %d, %p): stub\n", This, pwszVariableName,/* varValue,*/ fSetRef, pErrorInfo);
90
91         return S_OK;
92 }
93
94 HRESULT WINAPI IDirectMusicScriptImpl_GetVariableVariant (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszVariableName, VARIANT* pvarValue, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
95 {
96         ICOM_THIS(IDirectMusicScriptImpl,iface);
97
98         FIXME("(%p, %p, %p, %p): stub\n", This, pwszVariableName, pvarValue, pErrorInfo);
99
100         return S_OK;
101 }
102
103 HRESULT WINAPI IDirectMusicScriptImpl_SetVariableNumber (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszVariableName, LONG lValue, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
104 {
105         ICOM_THIS(IDirectMusicScriptImpl,iface);
106
107         FIXME("(%p, %p, %li, %p): stub\n", This, pwszVariableName, lValue, pErrorInfo);
108
109         return S_OK;
110 }
111
112 HRESULT WINAPI IDirectMusicScriptImpl_GetVariableNumber (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszVariableName, LONG* plValue, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
113 {
114         ICOM_THIS(IDirectMusicScriptImpl,iface);
115
116         FIXME("(%p, %p, %p, %p): stub\n", This, pwszVariableName, plValue, pErrorInfo);
117
118         return S_OK;
119 }
120
121 HRESULT WINAPI IDirectMusicScriptImpl_SetVariableObject (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszVariableName, IUnknown* punkValue, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
122 {
123         ICOM_THIS(IDirectMusicScriptImpl,iface);
124
125         FIXME("(%p, %p, %p, %p): stub\n", This, pwszVariableName, punkValue, pErrorInfo);
126
127         return S_OK;
128 }
129
130 HRESULT WINAPI IDirectMusicScriptImpl_GetVariableObject (LPDIRECTMUSICSCRIPT iface, WCHAR* pwszVariableName, REFIID riid, LPVOID* ppv, DMUS_SCRIPT_ERRORINFO* pErrorInfo)
131 {
132         ICOM_THIS(IDirectMusicScriptImpl,iface);
133
134         FIXME("(%p, %p, %s, %p, %p): stub\n", This, pwszVariableName, debugstr_guid(riid), ppv, pErrorInfo);
135
136         return S_OK;
137 }
138
139 HRESULT WINAPI IDirectMusicScriptImpl_EnumRoutine (LPDIRECTMUSICSCRIPT iface, DWORD dwIndex, WCHAR* pwszName)
140 {
141         ICOM_THIS(IDirectMusicScriptImpl,iface);
142
143         FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName);
144
145         return S_OK;
146 }
147
148 HRESULT WINAPI IDirectMusicScriptImpl_EnumVariable (LPDIRECTMUSICSCRIPT iface, DWORD dwIndex, WCHAR* pwszName)
149 {
150         ICOM_THIS(IDirectMusicScriptImpl,iface);
151
152         FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName);
153
154         return S_OK;
155 }
156
157 ICOM_VTABLE(IDirectMusicScript) DirectMusicScript_Vtbl =
158 {
159     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
160         IDirectMusicScriptImpl_QueryInterface,
161         IDirectMusicScriptImpl_AddRef,
162         IDirectMusicScriptImpl_Release,
163         IDirectMusicScriptImpl_Init,
164         IDirectMusicScriptImpl_CallRoutine,
165         IDirectMusicScriptImpl_SetVariableVariant,
166         IDirectMusicScriptImpl_GetVariableVariant,
167         IDirectMusicScriptImpl_SetVariableNumber,
168         IDirectMusicScriptImpl_GetVariableNumber,
169         IDirectMusicScriptImpl_SetVariableObject,
170         IDirectMusicScriptImpl_GetVariableObject,
171         IDirectMusicScriptImpl_EnumRoutine,
172         IDirectMusicScriptImpl_EnumVariable
173 };
174
175 /* for ClassFactory */
176 HRESULT WINAPI DMUSIC_CreateDirectMusicScript (LPCGUID lpcGUID, LPDIRECTMUSICSCRIPT* ppDMScript, LPUNKNOWN pUnkOuter)
177 {
178         IDirectMusicScriptImpl* dmscript;
179         
180         if (IsEqualIID (lpcGUID, &IID_IDirectMusicScript)) {
181                 dmscript = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicScriptImpl));
182                 if (NULL == dmscript) {
183                         *ppDMScript = (LPDIRECTMUSICSCRIPT) NULL;
184                         return E_OUTOFMEMORY;
185                 }
186                 dmscript->lpVtbl = &DirectMusicScript_Vtbl;
187                 dmscript->ref = 1;
188                 *ppDMScript = (LPDIRECTMUSICSCRIPT) dmscript;
189                 return S_OK;
190         }
191         
192         WARN("No interface found\n");
193         return E_NOINTERFACE;   
194 }
195
196 /*****************************************************************************
197  * IDirectMusicScriptObject implementation
198  */
199 /* IDirectMusicScriptObject IUnknown part: */
200 HRESULT WINAPI IDirectMusicScriptObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj)
201 {
202         ICOM_THIS(IDirectMusicScriptObject,iface);
203
204         if (IsEqualIID (riid, &IID_IUnknown) 
205                 || IsEqualIID(riid, &IID_IDirectMusicObject)) {
206                 IDirectMusicScriptObject_AddRef(iface);
207                 *ppobj = This;
208                 return S_OK;
209         } else if (IsEqualIID (riid, &IID_IPersistStream)) {
210                 IPersistStream_AddRef ((LPPERSISTSTREAM)This->pStream);
211                 *ppobj = (LPPERSISTSTREAM)This->pStream;
212                 return S_OK;
213         } else if (IsEqualIID (riid, &IID_IDirectMusicScript)) {
214                 IDirectMusicScript_AddRef ((LPDIRECTMUSICSCRIPT)This->pScript);
215                 *ppobj = (LPDIRECTMUSICSCRIPT)This->pScript;
216                 return S_OK;
217         }
218         
219         WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
220         return E_NOINTERFACE;
221 }
222
223 ULONG WINAPI IDirectMusicScriptObject_AddRef (LPDIRECTMUSICOBJECT iface)
224 {
225         ICOM_THIS(IDirectMusicScriptObject,iface);
226         TRACE("(%p) : AddRef from %ld\n", This, This->ref);
227         return ++(This->ref);
228 }
229
230 ULONG WINAPI IDirectMusicScriptObject_Release (LPDIRECTMUSICOBJECT iface)
231 {
232         ICOM_THIS(IDirectMusicScriptObject,iface);
233         ULONG ref = --This->ref;
234         TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
235         if (ref == 0) {
236                 HeapFree(GetProcessHeap(), 0, This);
237         }
238         return ref;
239 }
240
241 /* IDirectMusicScriptObject IDirectMusicObject part: */
242 HRESULT WINAPI IDirectMusicScriptObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc)
243 {
244         ICOM_THIS(IDirectMusicScriptObject,iface);
245
246         TRACE("(%p, %p)\n", This, pDesc);
247         pDesc = This->pDesc;
248         
249         return S_OK;
250 }
251
252 HRESULT WINAPI IDirectMusicScriptObject_SetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc)
253 {
254         ICOM_THIS(IDirectMusicScriptObject,iface);
255
256         TRACE("(%p, %p)\n", This, pDesc);
257         This->pDesc = pDesc;
258
259         return S_OK;
260 }
261
262 HRESULT WINAPI IDirectMusicScriptObject_ParseDescriptor (LPDIRECTMUSICOBJECT iface, LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc)
263 {
264         ICOM_THIS(IDirectMusicScriptObject,iface);
265
266         FIXME("(%p, %p, %p): stub\n", This, pStream, pDesc);
267
268         return S_OK;
269 }
270
271 ICOM_VTABLE(IDirectMusicObject) DirectMusicScriptObject_Vtbl =
272 {
273     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
274         IDirectMusicScriptObject_QueryInterface,
275         IDirectMusicScriptObject_AddRef,
276         IDirectMusicScriptObject_Release,
277         IDirectMusicScriptObject_GetDescriptor,
278         IDirectMusicScriptObject_SetDescriptor,
279         IDirectMusicScriptObject_ParseDescriptor
280 };
281
282 /* for ClassFactory */
283 HRESULT WINAPI DMUSIC_CreateDirectMusicScriptObject (LPCGUID lpcGUID, LPDIRECTMUSICOBJECT* ppObject, LPUNKNOWN pUnkOuter)
284 {
285         IDirectMusicScriptObject *obj;
286         
287         TRACE("(%p,%p,%p)\n", lpcGUID, ppObject, pUnkOuter);
288         if (IsEqualIID (lpcGUID, &IID_IDirectMusicObject)) {
289                 obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicScriptObject));
290                 if (NULL == obj) {
291                         *ppObject = (LPDIRECTMUSICOBJECT) NULL;
292                         return E_OUTOFMEMORY;
293                 }
294                 obj->lpVtbl = &DirectMusicScriptObject_Vtbl;
295                 obj->ref = 1;
296                 /* prepare IPersistStream */
297                 obj->pStream = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(IDirectMusicScriptObjectStream));
298                 obj->pStream->lpVtbl = &DirectMusicScriptObjectStream_Vtbl;
299                 obj->pStream->ref = 1;  
300                 obj->pStream->pParentObject = obj;
301                 /* prepare IDirectMusicScript */
302                 DMUSIC_CreateDirectMusicScript (&IID_IDirectMusicScript, (LPDIRECTMUSICSCRIPT*)&obj->pScript, NULL);
303                 obj->pScript->pObject = obj;
304                 *ppObject = (LPDIRECTMUSICOBJECT) obj;
305                 return S_OK;
306         }
307         WARN("No interface found\n");
308         
309         return E_NOINTERFACE;
310 }
311         
312 /*****************************************************************************
313  * IDirectMusicScriptObjectStream implementation
314  */
315 /* IDirectMusicScriptObjectStream IUnknown part: */
316 HRESULT WINAPI IDirectMusicScriptObjectStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj)
317 {
318         ICOM_THIS(IDirectMusicScriptObjectStream,iface);
319
320         if (IsEqualIID (riid, &IID_IUnknown)
321                 || IsEqualIID (riid, &IID_IPersistStream)) {
322                 IDirectMusicScriptObjectStream_AddRef(iface);
323                 *ppobj = This;
324                 return S_OK;
325         }
326         
327         WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
328         return E_NOINTERFACE;
329 }
330
331 ULONG WINAPI IDirectMusicScriptObjectStream_AddRef (LPPERSISTSTREAM iface)
332 {
333         ICOM_THIS(IDirectMusicScriptObjectStream,iface);
334         TRACE("(%p) : AddRef from %ld\n", This, This->ref);
335         return ++(This->ref);
336 }
337
338 ULONG WINAPI IDirectMusicScriptObjectStream_Release (LPPERSISTSTREAM iface)
339 {
340         ICOM_THIS(IDirectMusicScriptObjectStream,iface);
341         ULONG ref = --This->ref;
342         TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
343         if (ref == 0) {
344                 HeapFree(GetProcessHeap(), 0, This);
345         }
346         return ref;
347 }
348
349 /* IDirectMusicScriptObjectStream IPersist part: */
350 HRESULT WINAPI IDirectMusicScriptObjectStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID)
351 {
352         return E_NOTIMPL;
353 }
354
355 /* IDirectMusicScriptObjectStream IPersistStream part: */
356 HRESULT WINAPI IDirectMusicScriptObjectStream_IsDirty (LPPERSISTSTREAM iface)
357 {
358         return E_NOTIMPL;
359 }
360
361 HRESULT WINAPI IDirectMusicScriptObjectStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
362 {
363         FIXME(": Loading not implemented yet\n");
364         return S_OK;
365 }
366
367 HRESULT WINAPI IDirectMusicScriptObjectStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
368 {
369         return E_NOTIMPL;
370 }
371
372 HRESULT WINAPI IDirectMusicScriptObjectStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize)
373 {
374         return E_NOTIMPL;
375 }
376
377 ICOM_VTABLE(IPersistStream) DirectMusicScriptObjectStream_Vtbl =
378 {
379     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
380         IDirectMusicScriptObjectStream_QueryInterface,
381         IDirectMusicScriptObjectStream_AddRef,
382         IDirectMusicScriptObjectStream_Release,
383         IDirectMusicScriptObjectStream_GetClassID,
384         IDirectMusicScriptObjectStream_IsDirty,
385         IDirectMusicScriptObjectStream_Load,
386         IDirectMusicScriptObjectStream_Save,
387         IDirectMusicScriptObjectStream_GetSizeMax
388 };