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