If using the default values, also set dwType to REG_SZ as our default
[wine] / dlls / dmime / dmime_main.c
1 /* DirectMusicInteractiveEngine Main
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 "dmime_private.h"
21
22 WINE_DEFAULT_DEBUG_CHANNEL(dmime);
23
24 typedef struct
25 {
26     /* IUnknown fields */
27     ICOM_VFIELD(IClassFactory);
28     DWORD                       ref;
29 } IClassFactoryImpl;
30
31 /******************************************************************
32  *              DirectMusicPerformance ClassFactory
33  */
34 static HRESULT WINAPI PerformanceCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
35 {
36         ICOM_THIS(IClassFactoryImpl,iface);
37
38         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
39         return E_NOINTERFACE;
40 }
41
42 static ULONG WINAPI PerformanceCF_AddRef(LPCLASSFACTORY iface)
43 {
44         ICOM_THIS(IClassFactoryImpl,iface);
45         return ++(This->ref);
46 }
47
48 static ULONG WINAPI PerformanceCF_Release(LPCLASSFACTORY iface)
49 {
50         ICOM_THIS(IClassFactoryImpl,iface);
51         /* static class, won't be  freed */
52         return --(This->ref);
53 }
54
55 static HRESULT WINAPI PerformanceCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
56 {
57         ICOM_THIS(IClassFactoryImpl,iface);
58
59         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
60         if (IsEqualIID (riid, &IID_IDirectMusicPerformance) ||
61             IsEqualIID (riid, &IID_IDirectMusicPerformance8)) {
62                 return DMUSIC_CreateDirectMusicPerformance (riid, (LPDIRECTMUSICPERFORMANCE8*) ppobj, pOuter);
63         }
64
65         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
66         return E_NOINTERFACE;
67 }
68
69 static HRESULT WINAPI PerformanceCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
70 {
71         ICOM_THIS(IClassFactoryImpl,iface);
72         FIXME("(%p)->(%d),stub!\n", This, dolock);
73         return S_OK;
74 }
75
76 static ICOM_VTABLE(IClassFactory) PerformanceCF_Vtbl = {
77         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
78         PerformanceCF_QueryInterface,
79         PerformanceCF_AddRef,
80         PerformanceCF_Release,
81         PerformanceCF_CreateInstance,
82         PerformanceCF_LockServer
83 };
84
85 static IClassFactoryImpl Performance_CF = {&PerformanceCF_Vtbl, 1 };
86
87 /******************************************************************
88  *              DirectMusicSegment ClassFactory
89  */
90 static HRESULT WINAPI SegmentCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
91 {
92         ICOM_THIS(IClassFactoryImpl,iface);
93
94         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
95         return E_NOINTERFACE;
96 }
97
98 static ULONG WINAPI SegmentCF_AddRef(LPCLASSFACTORY iface)
99 {
100         ICOM_THIS(IClassFactoryImpl,iface);
101         return ++(This->ref);
102 }
103
104 static ULONG WINAPI SegmentCF_Release(LPCLASSFACTORY iface)
105 {
106         ICOM_THIS(IClassFactoryImpl,iface);
107         /* static class, won't be  freed */
108         return --(This->ref);
109 }
110
111 static HRESULT WINAPI SegmentCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
112 {
113         ICOM_THIS(IClassFactoryImpl,iface);
114
115         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
116         if (IsEqualIID (riid, &IID_IDirectMusicSegment) ||
117             IsEqualIID (riid, &IID_IDirectMusicSegment8)) {
118                 return DMUSIC_CreateDirectMusicSegment (riid, (LPDIRECTMUSICSEGMENT8*) ppobj, pOuter);
119         } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
120                 return DMUSIC_CreateDirectMusicSegmentObject (riid, (LPDIRECTMUSICOBJECT*) ppobj, pOuter);
121         }
122
123         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
124         return E_NOINTERFACE;
125 }
126
127 static HRESULT WINAPI SegmentCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
128 {
129         ICOM_THIS(IClassFactoryImpl,iface);
130         FIXME("(%p)->(%d),stub!\n", This, dolock);
131         return S_OK;
132 }
133
134 static ICOM_VTABLE(IClassFactory) SegmentCF_Vtbl = {
135         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
136         SegmentCF_QueryInterface,
137         SegmentCF_AddRef,
138         SegmentCF_Release,
139         SegmentCF_CreateInstance,
140         SegmentCF_LockServer
141 };
142
143 static IClassFactoryImpl Segment_CF = {&SegmentCF_Vtbl, 1 };
144
145 /******************************************************************
146  *              DirectMusicSegmentState ClassFactory
147  */
148 static HRESULT WINAPI SegmentStateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
149 {
150         ICOM_THIS(IClassFactoryImpl,iface);
151
152         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
153         return E_NOINTERFACE;
154 }
155
156 static ULONG WINAPI SegmentStateCF_AddRef(LPCLASSFACTORY iface)
157 {
158         ICOM_THIS(IClassFactoryImpl,iface);
159         return ++(This->ref);
160 }
161
162 static ULONG WINAPI SegmentStateCF_Release(LPCLASSFACTORY iface)
163 {
164         ICOM_THIS(IClassFactoryImpl,iface);
165         /* static class, won't be  freed */
166         return --(This->ref);
167 }
168
169 static HRESULT WINAPI SegmentStateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
170 {
171         ICOM_THIS(IClassFactoryImpl,iface);
172
173         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
174         if (IsEqualIID (riid, &IID_IDirectMusicSegmentState) ||
175                 IsEqualIID (riid, &IID_IDirectMusicSegmentState8)) {
176                 return DMUSIC_CreateDirectMusicSegmentState (riid, (LPDIRECTMUSICSEGMENTSTATE8*) ppobj, pOuter);
177         }
178
179         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
180         return E_NOINTERFACE;
181 }
182
183 static HRESULT WINAPI SegmentStateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
184 {
185         ICOM_THIS(IClassFactoryImpl,iface);
186         FIXME("(%p)->(%d),stub!\n", This, dolock);
187         return S_OK;
188 }
189
190 static ICOM_VTABLE(IClassFactory) SegmentStateCF_Vtbl = {
191         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
192         SegmentStateCF_QueryInterface,
193         SegmentStateCF_AddRef,
194         SegmentStateCF_Release,
195         SegmentStateCF_CreateInstance,
196         SegmentStateCF_LockServer
197 };
198
199 static IClassFactoryImpl SegmentState_CF = {&SegmentStateCF_Vtbl, 1 };
200
201 /******************************************************************
202  *              DirectMusicGraph ClassFactory
203  */
204 static HRESULT WINAPI GraphCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
205 {
206         ICOM_THIS(IClassFactoryImpl,iface);
207
208         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
209         return E_NOINTERFACE;
210 }
211
212 static ULONG WINAPI GraphCF_AddRef(LPCLASSFACTORY iface)
213 {
214         ICOM_THIS(IClassFactoryImpl,iface);
215         return ++(This->ref);
216 }
217
218 static ULONG WINAPI GraphCF_Release(LPCLASSFACTORY iface)
219 {
220         ICOM_THIS(IClassFactoryImpl,iface);
221         /* static class, won't be  freed */
222         return --(This->ref);
223 }
224
225 static HRESULT WINAPI GraphCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
226 {
227         ICOM_THIS(IClassFactoryImpl,iface);
228
229         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
230         if (IsEqualIID (riid, &IID_IDirectMusicGraph)) {
231                 return DMUSIC_CreateDirectMusicGraph (riid, (LPDIRECTMUSICGRAPH*) ppobj, pOuter);
232         } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
233                 return DMUSIC_CreateDirectMusicGraphObject (riid, (LPDIRECTMUSICOBJECT*) ppobj, pOuter);
234         }
235
236         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
237         return E_NOINTERFACE;
238 }
239
240 static HRESULT WINAPI GraphCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
241 {
242         ICOM_THIS(IClassFactoryImpl,iface);
243         FIXME("(%p)->(%d),stub!\n", This, dolock);
244         return S_OK;
245 }
246
247 static ICOM_VTABLE(IClassFactory) GraphCF_Vtbl = {
248         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
249         GraphCF_QueryInterface,
250         GraphCF_AddRef,
251         GraphCF_Release,
252         GraphCF_CreateInstance,
253         GraphCF_LockServer
254 };
255
256 static IClassFactoryImpl Graph_CF = {&GraphCF_Vtbl, 1 };
257
258 /******************************************************************
259  *              DirectMusicTempoTrack ClassFactory
260  */
261 static HRESULT WINAPI TempoTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
262 {
263         ICOM_THIS(IClassFactoryImpl,iface);
264
265         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
266         return E_NOINTERFACE;
267 }
268
269 static ULONG WINAPI TempoTrackCF_AddRef(LPCLASSFACTORY iface)
270 {
271         ICOM_THIS(IClassFactoryImpl,iface);
272         return ++(This->ref);
273 }
274
275 static ULONG WINAPI TempoTrackCF_Release(LPCLASSFACTORY iface)
276 {
277         ICOM_THIS(IClassFactoryImpl,iface);
278         /* static class, won't be  freed */
279         return --(This->ref);
280 }
281
282 static HRESULT WINAPI TempoTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
283 {
284         ICOM_THIS(IClassFactoryImpl,iface);
285
286         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
287         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
288             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
289                 return DMUSIC_CreateDirectMusicTempoTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
290         }
291         
292         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
293         return E_NOINTERFACE;
294 }
295
296 static HRESULT WINAPI TempoTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
297 {
298         ICOM_THIS(IClassFactoryImpl,iface);
299         FIXME("(%p)->(%d),stub!\n", This, dolock);
300         return S_OK;
301 }
302
303 static ICOM_VTABLE(IClassFactory) TempoTrackCF_Vtbl = {
304         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
305         TempoTrackCF_QueryInterface,
306         TempoTrackCF_AddRef,
307         TempoTrackCF_Release,
308         TempoTrackCF_CreateInstance,
309         TempoTrackCF_LockServer
310 };
311
312 static IClassFactoryImpl TempoTrack_CF = {&TempoTrackCF_Vtbl, 1 };
313
314 /******************************************************************
315  *              DirectMusicSeqTrack ClassFactory
316  */
317 static HRESULT WINAPI SeqTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
318 {
319         ICOM_THIS(IClassFactoryImpl,iface);
320
321         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
322         return E_NOINTERFACE;
323 }
324
325 static ULONG WINAPI SeqTrackCF_AddRef(LPCLASSFACTORY iface)
326 {
327         ICOM_THIS(IClassFactoryImpl,iface);
328         return ++(This->ref);
329 }
330
331 static ULONG WINAPI SeqTrackCF_Release(LPCLASSFACTORY iface)
332 {
333         ICOM_THIS(IClassFactoryImpl,iface);
334         /* static class, won't be  freed */
335         return --(This->ref);
336 }
337
338 static HRESULT WINAPI SeqTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
339 {
340         ICOM_THIS(IClassFactoryImpl,iface);
341
342         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
343         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
344             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
345                 return DMUSIC_CreateDirectMusicSeqTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
346         }
347         
348         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
349         return E_NOINTERFACE;
350 }
351
352 static HRESULT WINAPI SeqTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
353 {
354         ICOM_THIS(IClassFactoryImpl,iface);
355         FIXME("(%p)->(%d),stub!\n", This, dolock);
356         return S_OK;
357 }
358
359 static ICOM_VTABLE(IClassFactory) SeqTrackCF_Vtbl = {
360         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
361         SeqTrackCF_QueryInterface,
362         SeqTrackCF_AddRef,
363         SeqTrackCF_Release,
364         SeqTrackCF_CreateInstance,
365         SeqTrackCF_LockServer
366 };
367
368 static IClassFactoryImpl SeqTrack_CF = {&SeqTrackCF_Vtbl, 1 };
369
370 /******************************************************************
371  *              DirectMusicSysExTrack ClassFactory
372  */
373 static HRESULT WINAPI SysExTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
374 {
375         ICOM_THIS(IClassFactoryImpl,iface);
376
377         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
378         return E_NOINTERFACE;
379 }
380
381 static ULONG WINAPI SysExTrackCF_AddRef(LPCLASSFACTORY iface)
382 {
383         ICOM_THIS(IClassFactoryImpl,iface);
384         return ++(This->ref);
385 }
386
387 static ULONG WINAPI SysExTrackCF_Release(LPCLASSFACTORY iface)
388 {
389         ICOM_THIS(IClassFactoryImpl,iface);
390         /* static class, won't be  freed */
391         return --(This->ref);
392 }
393
394 static HRESULT WINAPI SysExTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
395 {
396         ICOM_THIS(IClassFactoryImpl,iface);
397
398         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
399         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
400             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
401                 return DMUSIC_CreateDirectMusicSysExTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
402         }
403         
404         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
405         return E_NOINTERFACE;
406 }
407
408 static HRESULT WINAPI SysExTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
409 {
410         ICOM_THIS(IClassFactoryImpl,iface);
411         FIXME("(%p)->(%d),stub!\n", This, dolock);
412         return S_OK;
413 }
414
415 static ICOM_VTABLE(IClassFactory) SysExTrackCF_Vtbl = {
416         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
417         SysExTrackCF_QueryInterface,
418         SysExTrackCF_AddRef,
419         SysExTrackCF_Release,
420         SysExTrackCF_CreateInstance,
421         SysExTrackCF_LockServer
422 };
423
424 static IClassFactoryImpl SysExTrack_CF = {&SysExTrackCF_Vtbl, 1 };
425
426 /******************************************************************
427  *              DirectMusicTimeSigTrack ClassFactory
428  */
429 static HRESULT WINAPI TimeSigTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
430 {
431         ICOM_THIS(IClassFactoryImpl,iface);
432
433         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
434         return E_NOINTERFACE;
435 }
436
437 static ULONG WINAPI TimeSigTrackCF_AddRef(LPCLASSFACTORY iface)
438 {
439         ICOM_THIS(IClassFactoryImpl,iface);
440         return ++(This->ref);
441 }
442
443 static ULONG WINAPI TimeSigTrackCF_Release(LPCLASSFACTORY iface)
444 {
445         ICOM_THIS(IClassFactoryImpl,iface);
446         /* static class, won't be  freed */
447         return --(This->ref);
448 }
449
450 static HRESULT WINAPI TimeSigTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
451 {
452         ICOM_THIS(IClassFactoryImpl,iface);
453
454         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
455         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
456             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
457                 return DMUSIC_CreateDirectMusicTimeSigTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
458         }
459         
460         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
461         return E_NOINTERFACE;
462 }
463
464 static HRESULT WINAPI TimeSigTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
465 {
466         ICOM_THIS(IClassFactoryImpl,iface);
467         FIXME("(%p)->(%d),stub!\n", This, dolock);
468         return S_OK;
469 }
470
471 static ICOM_VTABLE(IClassFactory) TimeSigTrackCF_Vtbl = {
472         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
473         TimeSigTrackCF_QueryInterface,
474         TimeSigTrackCF_AddRef,
475         TimeSigTrackCF_Release,
476         TimeSigTrackCF_CreateInstance,
477         TimeSigTrackCF_LockServer
478 };
479
480 static IClassFactoryImpl TimeSigTrack_CF = {&TimeSigTrackCF_Vtbl, 1 };
481
482 /******************************************************************
483  *              DirectMusicParamControlTrack ClassFactory
484  */
485 static HRESULT WINAPI ParamControlTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
486 {
487         ICOM_THIS(IClassFactoryImpl,iface);
488
489         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
490         return E_NOINTERFACE;
491 }
492
493 static ULONG WINAPI ParamControlTrackCF_AddRef(LPCLASSFACTORY iface)
494 {
495         ICOM_THIS(IClassFactoryImpl,iface);
496         return ++(This->ref);
497 }
498
499 static ULONG WINAPI ParamControlTrackCF_Release(LPCLASSFACTORY iface)
500 {
501         ICOM_THIS(IClassFactoryImpl,iface);
502         /* static class, won't be  freed */
503         return --(This->ref);
504 }
505
506 static HRESULT WINAPI ParamControlTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
507 {
508         ICOM_THIS(IClassFactoryImpl,iface);
509
510         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
511         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
512             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
513                 return DMUSIC_CreateDirectMusicParamControlTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
514         }
515         
516         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
517         return E_NOINTERFACE;
518 }
519
520 static HRESULT WINAPI ParamControlTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
521 {
522         ICOM_THIS(IClassFactoryImpl,iface);
523         FIXME("(%p)->(%d),stub!\n", This, dolock);
524         return S_OK;
525 }
526
527 static ICOM_VTABLE(IClassFactory) ParamControlTrackCF_Vtbl = {
528         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
529         ParamControlTrackCF_QueryInterface,
530         ParamControlTrackCF_AddRef,
531         ParamControlTrackCF_Release,
532         ParamControlTrackCF_CreateInstance,
533         ParamControlTrackCF_LockServer
534 };
535
536 static IClassFactoryImpl ParamControlTrack_CF = {&ParamControlTrackCF_Vtbl, 1 };
537
538 /******************************************************************
539  *              DirectMusicMarkerTrack ClassFactory
540  */
541 static HRESULT WINAPI MarkerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
542 {
543         ICOM_THIS(IClassFactoryImpl,iface);
544
545         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
546         return E_NOINTERFACE;
547 }
548
549 static ULONG WINAPI MarkerTrackCF_AddRef(LPCLASSFACTORY iface)
550 {
551         ICOM_THIS(IClassFactoryImpl,iface);
552         return ++(This->ref);
553 }
554
555 static ULONG WINAPI MarkerTrackCF_Release(LPCLASSFACTORY iface)
556 {
557         ICOM_THIS(IClassFactoryImpl,iface);
558         /* static class, won't be  freed */
559         return --(This->ref);
560 }
561
562 static HRESULT WINAPI MarkerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
563 {
564         ICOM_THIS(IClassFactoryImpl,iface);
565
566         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
567         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
568             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
569                 return DMUSIC_CreateDirectMusicMarkerTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
570         }
571         
572         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
573         return E_NOINTERFACE;
574 }
575
576 static HRESULT WINAPI MarkerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
577 {
578         ICOM_THIS(IClassFactoryImpl,iface);
579         FIXME("(%p)->(%d),stub!\n", This, dolock);
580         return S_OK;
581 }
582
583 static ICOM_VTABLE(IClassFactory) MarkerTrackCF_Vtbl = {
584         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
585         MarkerTrackCF_QueryInterface,
586         MarkerTrackCF_AddRef,
587         MarkerTrackCF_Release,
588         MarkerTrackCF_CreateInstance,
589         MarkerTrackCF_LockServer
590 };
591
592 static IClassFactoryImpl MarkerTrack_CF = {&MarkerTrackCF_Vtbl, 1 };
593
594 /******************************************************************
595  *              DirectMusicLyricsTrack ClassFactory
596  */
597 static HRESULT WINAPI LyricsTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
598 {
599         ICOM_THIS(IClassFactoryImpl,iface);
600
601         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
602         return E_NOINTERFACE;
603 }
604
605 static ULONG WINAPI LyricsTrackCF_AddRef(LPCLASSFACTORY iface)
606 {
607         ICOM_THIS(IClassFactoryImpl,iface);
608         return ++(This->ref);
609 }
610
611 static ULONG WINAPI LyricsTrackCF_Release(LPCLASSFACTORY iface)
612 {
613         ICOM_THIS(IClassFactoryImpl,iface);
614         /* static class, won't be  freed */
615         return --(This->ref);
616 }
617
618 static HRESULT WINAPI LyricsTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
619 {
620         ICOM_THIS(IClassFactoryImpl,iface);
621
622         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
623         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
624             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
625                 return DMUSIC_CreateDirectMusicLyricsTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
626         }
627         
628         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
629         return E_NOINTERFACE;
630 }
631
632 static HRESULT WINAPI LyricsTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
633 {
634         ICOM_THIS(IClassFactoryImpl,iface);
635         FIXME("(%p)->(%d),stub!\n", This, dolock);
636         return S_OK;
637 }
638
639 static ICOM_VTABLE(IClassFactory) LyricsTrackCF_Vtbl = {
640         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
641         LyricsTrackCF_QueryInterface,
642         LyricsTrackCF_AddRef,
643         LyricsTrackCF_Release,
644         LyricsTrackCF_CreateInstance,
645         LyricsTrackCF_LockServer
646 };
647
648 static IClassFactoryImpl LyricsTrack_CF = {&LyricsTrackCF_Vtbl, 1 };
649
650 /******************************************************************
651  *              DirectMusicSong ClassFactory
652  */
653 static HRESULT WINAPI SongCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
654 {
655         ICOM_THIS(IClassFactoryImpl,iface);
656
657         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
658         return E_NOINTERFACE;
659 }
660
661 static ULONG WINAPI SongCF_AddRef(LPCLASSFACTORY iface)
662 {
663         ICOM_THIS(IClassFactoryImpl,iface);
664         return ++(This->ref);
665 }
666
667 static ULONG WINAPI SongCF_Release(LPCLASSFACTORY iface)
668 {
669         ICOM_THIS(IClassFactoryImpl,iface);
670         /* static class, won't be  freed */
671         return --(This->ref);
672 }
673
674 static HRESULT WINAPI SongCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
675 {
676         ICOM_THIS(IClassFactoryImpl,iface);
677
678         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
679         if (IsEqualIID (riid, &IID_IDirectMusicSong)) {
680                 return DMUSIC_CreateDirectMusicPerformance (riid, (LPDIRECTMUSICPERFORMANCE8*) ppobj, pOuter);
681         } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
682                 return DMUSIC_CreateDirectMusicSongObject (riid, (LPDIRECTMUSICOBJECT*) ppobj, pOuter);
683         }
684
685         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
686         return E_NOINTERFACE;
687 }
688
689 static HRESULT WINAPI SongCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
690 {
691         ICOM_THIS(IClassFactoryImpl,iface);
692         FIXME("(%p)->(%d),stub!\n", This, dolock);
693         return S_OK;
694 }
695
696 static ICOM_VTABLE(IClassFactory) SongCF_Vtbl = {
697         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
698         SongCF_QueryInterface,
699         SongCF_AddRef,
700         SongCF_Release,
701         SongCF_CreateInstance,
702         SongCF_LockServer
703 };
704
705 static IClassFactoryImpl Song_CF = {&SongCF_Vtbl, 1 };
706
707 /******************************************************************
708  *              DirectMusicSegTriggerTrack ClassFactory
709  */
710 static HRESULT WINAPI SegTriggerTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
711 {
712         ICOM_THIS(IClassFactoryImpl,iface);
713
714         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
715         return E_NOINTERFACE;
716 }
717
718 static ULONG WINAPI SegTriggerTrackCF_AddRef(LPCLASSFACTORY iface)
719 {
720         ICOM_THIS(IClassFactoryImpl,iface);
721         return ++(This->ref);
722 }
723
724 static ULONG WINAPI SegTriggerTrackCF_Release(LPCLASSFACTORY iface)
725 {
726         ICOM_THIS(IClassFactoryImpl,iface);
727         /* static class, won't be  freed */
728         return --(This->ref);
729 }
730
731 static HRESULT WINAPI SegTriggerTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
732 {
733         ICOM_THIS(IClassFactoryImpl,iface);
734
735         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
736         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
737             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
738                 return DMUSIC_CreateDirectMusicSegTriggerTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
739         }
740         
741         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
742         return E_NOINTERFACE;
743 }
744
745 static HRESULT WINAPI SegTriggerTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
746 {
747         ICOM_THIS(IClassFactoryImpl,iface);
748         FIXME("(%p)->(%d),stub!\n", This, dolock);
749         return S_OK;
750 }
751
752 static ICOM_VTABLE(IClassFactory) SegTriggerTrackCF_Vtbl = {
753         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
754         SegTriggerTrackCF_QueryInterface,
755         SegTriggerTrackCF_AddRef,
756         SegTriggerTrackCF_Release,
757         SegTriggerTrackCF_CreateInstance,
758         SegTriggerTrackCF_LockServer
759 };
760
761 static IClassFactoryImpl SegTriggerTrack_CF = {&SegTriggerTrackCF_Vtbl, 1 };
762
763
764
765
766 /******************************************************************
767  *              DirectMusicAudioPath ClassFactory
768  */
769 static HRESULT WINAPI AudioPathCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
770 {
771         ICOM_THIS(IClassFactoryImpl,iface);
772
773         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
774         return E_NOINTERFACE;
775 }
776
777 static ULONG WINAPI AudioPathCF_AddRef(LPCLASSFACTORY iface)
778 {
779         ICOM_THIS(IClassFactoryImpl,iface);
780         return ++(This->ref);
781 }
782
783 static ULONG WINAPI AudioPathCF_Release(LPCLASSFACTORY iface)
784 {
785         ICOM_THIS(IClassFactoryImpl,iface);
786         /* static class, won't be  freed */
787         return --(This->ref);
788 }
789
790 static HRESULT WINAPI AudioPathCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
791 {
792         ICOM_THIS(IClassFactoryImpl,iface);
793
794         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
795         if (IsEqualIID (riid, &IID_IDirectMusicAudioPath)) {
796                 return DMUSIC_CreateDirectMusicAudioPath (riid, (LPDIRECTMUSICAUDIOPATH*) ppobj, pOuter);
797         } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
798                 return DMUSIC_CreateDirectMusicAudioPathObject (riid, (LPDIRECTMUSICOBJECT*) ppobj, pOuter);
799         }
800
801         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
802         return E_NOINTERFACE;
803 }
804
805 static HRESULT WINAPI AudioPathCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
806 {
807         ICOM_THIS(IClassFactoryImpl,iface);
808         FIXME("(%p)->(%d),stub!\n", This, dolock);
809         return S_OK;
810 }
811
812 static ICOM_VTABLE(IClassFactory) AudioPathCF_Vtbl = {
813         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
814         AudioPathCF_QueryInterface,
815         AudioPathCF_AddRef,
816         AudioPathCF_Release,
817         AudioPathCF_CreateInstance,
818         AudioPathCF_LockServer
819 };
820
821 static IClassFactoryImpl AudioPath_CF = {&AudioPathCF_Vtbl, 1 };
822
823 /******************************************************************
824  *              DirectMusicWaveTrack ClassFactory
825  */
826 static HRESULT WINAPI WaveTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
827 {
828         ICOM_THIS(IClassFactoryImpl,iface);
829
830         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
831         return E_NOINTERFACE;
832 }
833
834 static ULONG WINAPI WaveTrackCF_AddRef(LPCLASSFACTORY iface)
835 {
836         ICOM_THIS(IClassFactoryImpl,iface);
837         return ++(This->ref);
838 }
839
840 static ULONG WINAPI WaveTrackCF_Release(LPCLASSFACTORY iface)
841 {
842         ICOM_THIS(IClassFactoryImpl,iface);
843         /* static class, won't be  freed */
844         return --(This->ref);
845 }
846
847 static HRESULT WINAPI WaveTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
848 {
849         ICOM_THIS(IClassFactoryImpl,iface);
850
851         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
852         if (IsEqualIID (riid, &IID_IDirectMusicTrack) ||
853             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
854                 return DMUSIC_CreateDirectMusicWaveTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
855         }
856         
857         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);    
858         return E_NOINTERFACE;
859 }
860
861 static HRESULT WINAPI WaveTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
862 {
863         ICOM_THIS(IClassFactoryImpl,iface);
864         FIXME("(%p)->(%d),stub!\n", This, dolock);
865         return S_OK;
866 }
867
868 static ICOM_VTABLE(IClassFactory) WaveTrackCF_Vtbl = {
869         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
870         WaveTrackCF_QueryInterface,
871         WaveTrackCF_AddRef,
872         WaveTrackCF_Release,
873         WaveTrackCF_CreateInstance,
874         WaveTrackCF_LockServer
875 };
876
877 static IClassFactoryImpl WaveTrack_CF = {&WaveTrackCF_Vtbl, 1 };
878
879 /******************************************************************
880  *              DllMain
881  *
882  *
883  */
884 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
885 {
886         if (fdwReason == DLL_PROCESS_ATTACH)
887         {
888                 DisableThreadLibraryCalls(hinstDLL);
889                 /* FIXME: Initialisation */
890         }
891         else if (fdwReason == DLL_PROCESS_DETACH)
892         {
893                 /* FIXME: Cleanup */
894         }
895
896         return TRUE;
897 }
898
899
900 /******************************************************************
901  *              DllCanUnloadNow (DMIME.1)
902  *
903  *
904  */
905 HRESULT WINAPI DMIME_DllCanUnloadNow(void)
906 {
907     FIXME("(void): stub\n");
908
909     return S_FALSE;
910 }
911
912
913 /******************************************************************
914  *              DllGetClassObject (DMIME.2)
915  *
916  *
917  */
918 HRESULT WINAPI DMIME_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
919 {
920     TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
921     if (IsEqualCLSID (rclsid, &CLSID_DirectMusicPerformance) && IsEqualIID (riid, &IID_IClassFactory)) {
922                 *ppv = (LPVOID) &Performance_CF;
923                 IClassFactory_AddRef((IClassFactory*)*ppv);
924                 return S_OK;
925         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegment) && IsEqualIID (riid, &IID_IClassFactory)) {
926                 *ppv = (LPVOID) &Segment_CF;
927                 IClassFactory_AddRef((IClassFactory*)*ppv);
928                 return S_OK;
929         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegmentState) && IsEqualIID (riid, &IID_IClassFactory)) {
930                 *ppv = (LPVOID) &SegmentState_CF;
931                 IClassFactory_AddRef((IClassFactory*)*ppv);
932                 return S_OK;
933         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicGraph) && IsEqualIID (riid, &IID_IClassFactory)) {
934                 *ppv = (LPVOID) &Graph_CF;
935                 IClassFactory_AddRef((IClassFactory*)*ppv);
936                 return S_OK;
937         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTempoTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
938                 *ppv = (LPVOID) &TempoTrack_CF;
939                 IClassFactory_AddRef((IClassFactory*)*ppv);
940                 return S_OK;
941         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSeqTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
942                 *ppv = (LPVOID) &SeqTrack_CF;
943                 IClassFactory_AddRef((IClassFactory*)*ppv);
944                 return S_OK;
945         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSysExTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
946                 *ppv = (LPVOID) &SysExTrack_CF;
947                 IClassFactory_AddRef((IClassFactory*)*ppv);
948                 return S_OK;
949         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTimeSigTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
950                 *ppv = (LPVOID) &TimeSigTrack_CF;
951                 IClassFactory_AddRef((IClassFactory*)*ppv);
952                 return S_OK;
953         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicParamControlTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
954                 *ppv = (LPVOID) &ParamControlTrack_CF;
955                 IClassFactory_AddRef((IClassFactory*)*ppv);
956                 return S_OK;
957         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicMarkerTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
958                 *ppv = (LPVOID) &MarkerTrack_CF;
959                 IClassFactory_AddRef((IClassFactory*)*ppv);
960                 return S_OK;
961         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicLyricsTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
962                 *ppv = (LPVOID) &LyricsTrack_CF;
963                 IClassFactory_AddRef((IClassFactory*)*ppv);
964                 return S_OK;
965         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSong) && IsEqualIID (riid, &IID_IClassFactory)) {
966                 *ppv = (LPVOID) &Song_CF;
967                 IClassFactory_AddRef((IClassFactory*)*ppv);
968                 return S_OK;
969         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSegTriggerTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
970                 *ppv = (LPVOID) &SegTriggerTrack_CF;
971                 IClassFactory_AddRef((IClassFactory*)*ppv);
972                 return S_OK;
973         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicAudioPath) && IsEqualIID (riid, &IID_IClassFactory)) {
974                 *ppv = (LPVOID) &AudioPath_CF;
975                 IClassFactory_AddRef((IClassFactory*)*ppv);
976                 return S_OK;
977         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicWaveTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
978                 *ppv = (LPVOID) &WaveTrack_CF;
979                 IClassFactory_AddRef((IClassFactory*)*ppv);
980                 return S_OK;
981         } 
982         
983     WARN("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
984     return CLASS_E_CLASSNOTAVAILABLE;
985 }