Correct the test for the ODS_SELECTED bit in the WM_DRAWITEM message
[wine] / dlls / dmcompos / dmcompos_main.c
1 /* DirectMusicComposer 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 "dmcompos_private.h"
21
22 WINE_DEFAULT_DEBUG_CHANNEL(dmcompos);
23
24 typedef struct
25 {
26     /* IUnknown fields */
27     ICOM_VFIELD(IClassFactory);
28     DWORD                       ref;
29 } IClassFactoryImpl;
30
31 /******************************************************************
32  *              DirectMusicChordMap ClassFactory
33  */
34 static HRESULT WINAPI ChordMapCF_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 ChordMapCF_AddRef(LPCLASSFACTORY iface)
43 {
44         ICOM_THIS(IClassFactoryImpl,iface);
45         return ++(This->ref);
46 }
47
48 static ULONG WINAPI ChordMapCF_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 ChordMapCF_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_IDirectMusicChordMap)) {
61                 return DMUSIC_CreateDirectMusicChordMap (riid, (LPDIRECTMUSICCHORDMAP*)ppobj, pOuter);
62         } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) {
63                 return DMUSIC_CreateDirectMusicChordMapObject (riid, (LPDIRECTMUSICOBJECT*) ppobj, pOuter);
64         }
65         
66         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
67         return E_NOINTERFACE;
68 }
69
70 static HRESULT WINAPI ChordMapCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
71 {
72         ICOM_THIS(IClassFactoryImpl,iface);
73         FIXME("(%p)->(%d),stub!\n", This, dolock);
74         return S_OK;
75 }
76
77 static ICOM_VTABLE(IClassFactory) ChordMapCF_Vtbl = {
78         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
79         ChordMapCF_QueryInterface,
80         ChordMapCF_AddRef,
81         ChordMapCF_Release,
82         ChordMapCF_CreateInstance,
83         ChordMapCF_LockServer
84 };
85
86 static IClassFactoryImpl ChordMap_CF = {&ChordMapCF_Vtbl, 1 };
87
88 /******************************************************************
89  *              DirectMusicComposer ClassFactory
90  */
91 static HRESULT WINAPI ComposerCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
92 {
93         ICOM_THIS(IClassFactoryImpl,iface);
94
95         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
96         return E_NOINTERFACE;
97 }
98
99 static ULONG WINAPI ComposerCF_AddRef(LPCLASSFACTORY iface)
100 {
101         ICOM_THIS(IClassFactoryImpl,iface);
102         return ++(This->ref);
103 }
104
105 static ULONG WINAPI ComposerCF_Release(LPCLASSFACTORY iface)
106 {
107         ICOM_THIS(IClassFactoryImpl,iface);
108         /* static class, won't be  freed */
109         return --(This->ref);
110 }
111
112 static HRESULT WINAPI ComposerCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
113 {
114         ICOM_THIS(IClassFactoryImpl,iface);
115
116         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
117         if (IsEqualIID (riid, &IID_IDirectMusicComposer)) {
118                 return DMUSIC_CreateDirectMusicComposer (riid, (LPDIRECTMUSICCOMPOSER*)ppobj, pOuter);
119         }
120         
121         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
122         return E_NOINTERFACE;
123 }
124
125 static HRESULT WINAPI ComposerCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
126 {
127         ICOM_THIS(IClassFactoryImpl,iface);
128         FIXME("(%p)->(%d),stub!\n", This, dolock);
129         return S_OK;
130 }
131
132 static ICOM_VTABLE(IClassFactory) ComposerCF_Vtbl = {
133         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
134         ComposerCF_QueryInterface,
135         ComposerCF_AddRef,
136         ComposerCF_Release,
137         ComposerCF_CreateInstance,
138         ComposerCF_LockServer
139 };
140
141 static IClassFactoryImpl Composer_CF = {&ComposerCF_Vtbl, 1 };
142
143 /******************************************************************
144  *              DirectMusicChordMapTrack ClassFactory
145  */
146 static HRESULT WINAPI ChordMapTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
147 {
148         ICOM_THIS(IClassFactoryImpl,iface);
149
150         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
151         return E_NOINTERFACE;
152 }
153
154 static ULONG WINAPI ChordMapTrackCF_AddRef(LPCLASSFACTORY iface)
155 {
156         ICOM_THIS(IClassFactoryImpl,iface);
157         return ++(This->ref);
158 }
159
160 static ULONG WINAPI ChordMapTrackCF_Release(LPCLASSFACTORY iface)
161 {
162         ICOM_THIS(IClassFactoryImpl,iface);
163         /* static class, won't be  freed */
164         return --(This->ref);
165 }
166
167 static HRESULT WINAPI ChordMapTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
168 {
169         ICOM_THIS(IClassFactoryImpl,iface);
170
171         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
172         if (IsEqualIID (riid, &IID_IDirectMusicTrack) 
173                 || IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
174                 return DMUSIC_CreateDirectMusicChordMapTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
175         }
176         
177         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
178         return E_NOINTERFACE;
179 }
180
181 static HRESULT WINAPI ChordMapTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
182 {
183         ICOM_THIS(IClassFactoryImpl,iface);
184         FIXME("(%p)->(%d),stub!\n", This, dolock);
185         return S_OK;
186 }
187
188 static ICOM_VTABLE(IClassFactory) ChordMapTrackCF_Vtbl = {
189         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
190         ChordMapTrackCF_QueryInterface,
191         ChordMapTrackCF_AddRef,
192         ChordMapTrackCF_Release,
193         ChordMapTrackCF_CreateInstance,
194         ChordMapTrackCF_LockServer
195 };
196
197 static IClassFactoryImpl ChordMapTrack_CF = {&ChordMapTrackCF_Vtbl, 1 };
198
199 /******************************************************************
200  *              DirectMusicTemplate ClassFactory
201  */
202 static HRESULT WINAPI TemplateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
203 {
204         ICOM_THIS(IClassFactoryImpl,iface);
205
206         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
207         return E_NOINTERFACE;
208 }
209
210 static ULONG WINAPI TemplateCF_AddRef(LPCLASSFACTORY iface)
211 {
212         ICOM_THIS(IClassFactoryImpl,iface);
213         return ++(This->ref);
214 }
215
216 static ULONG WINAPI TemplateCF_Release(LPCLASSFACTORY iface)
217 {
218         ICOM_THIS(IClassFactoryImpl,iface);
219         /* static class, won't be  freed */
220         return --(This->ref);
221 }
222
223 static HRESULT WINAPI TemplateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
224 {
225         ICOM_THIS(IClassFactoryImpl,iface);
226
227         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
228         
229         /* nothing yet */
230         
231         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
232         return E_NOINTERFACE;
233 }
234
235 static HRESULT WINAPI TemplateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
236 {
237         ICOM_THIS(IClassFactoryImpl,iface);
238         FIXME("(%p)->(%d),stub!\n", This, dolock);
239         return S_OK;
240 }
241
242 static ICOM_VTABLE(IClassFactory) TemplateCF_Vtbl = {
243         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
244         TemplateCF_QueryInterface,
245         TemplateCF_AddRef,
246         TemplateCF_Release,
247         TemplateCF_CreateInstance,
248         TemplateCF_LockServer
249 };
250
251 static IClassFactoryImpl Template_CF = {&TemplateCF_Vtbl, 1 };
252
253 /******************************************************************
254  *              DirectMusicSignPostTrack ClassFactory
255  */
256 static HRESULT WINAPI SignPostTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
257 {
258         ICOM_THIS(IClassFactoryImpl,iface);
259
260         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
261         return E_NOINTERFACE;
262 }
263
264 static ULONG WINAPI SignPostTrackCF_AddRef(LPCLASSFACTORY iface)
265 {
266         ICOM_THIS(IClassFactoryImpl,iface);
267         return ++(This->ref);
268 }
269
270 static ULONG WINAPI SignPostTrackCF_Release(LPCLASSFACTORY iface)
271 {
272         ICOM_THIS(IClassFactoryImpl,iface);
273         /* static class, won't be  freed */
274         return --(This->ref);
275 }
276
277 static HRESULT WINAPI SignPostTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
278 {
279         ICOM_THIS(IClassFactoryImpl,iface);
280
281         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
282         if (IsEqualIID (riid, &IID_IDirectMusicTrack) 
283                 || IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
284                 return DMUSIC_CreateDirectMusicSignPostTrack (riid, (LPDIRECTMUSICTRACK8*) ppobj, pOuter);
285         }
286         
287         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
288         return E_NOINTERFACE;
289 }
290
291 static HRESULT WINAPI SignPostTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
292 {
293         ICOM_THIS(IClassFactoryImpl,iface);
294         FIXME("(%p)->(%d),stub!\n", This, dolock);
295         return S_OK;
296 }
297
298 static ICOM_VTABLE(IClassFactory) SignPostTrackCF_Vtbl = {
299         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
300         SignPostTrackCF_QueryInterface,
301         SignPostTrackCF_AddRef,
302         SignPostTrackCF_Release,
303         SignPostTrackCF_CreateInstance,
304         SignPostTrackCF_LockServer
305 };
306
307 static IClassFactoryImpl SignPostTrack_CF = {&SignPostTrackCF_Vtbl, 1 };
308
309 /******************************************************************
310  *              DllMain
311  *
312  *
313  */
314 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
315 {
316         if (fdwReason == DLL_PROCESS_ATTACH)
317         {
318             DisableThreadLibraryCalls(hinstDLL);
319                 /* FIXME: Initialisation */
320         }
321         else if (fdwReason == DLL_PROCESS_DETACH)
322         {
323                 /* FIXME: Cleanup */
324         }
325
326         return TRUE;
327 }
328
329
330 /******************************************************************
331  *              DllCanUnloadNow (DMCOMPOS.1)
332  *
333  *
334  */
335 HRESULT WINAPI DMCOMPOS_DllCanUnloadNow(void)
336 {
337     FIXME("(void): stub\n");
338
339     return S_FALSE;
340 }
341
342
343 /******************************************************************
344  *              DllGetClassObject (DMCOMPOS.2)
345  *
346  *
347  */
348 HRESULT WINAPI DMCOMPOS_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
349 {
350     TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
351     if (IsEqualCLSID (rclsid, &CLSID_DirectMusicChordMap) && IsEqualIID (riid, &IID_IClassFactory)) {
352                 *ppv = (LPVOID) &ChordMap_CF;
353                 IClassFactory_AddRef((IClassFactory*)*ppv);
354                 return S_OK;
355         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicComposer) && IsEqualIID (riid, &IID_IClassFactory)) { 
356                 *ppv = (LPVOID) &Composer_CF;
357                 IClassFactory_AddRef((IClassFactory*)*ppv);             
358                 return S_OK;
359         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicChordMapTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
360                 *ppv = (LPVOID) &ChordMapTrack_CF;
361                 IClassFactory_AddRef((IClassFactory*)*ppv);             
362                 return S_OK;
363         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTemplate) && IsEqualIID (riid, &IID_IClassFactory)) {
364                 *ppv = (LPVOID) &Template_CF;
365                 IClassFactory_AddRef((IClassFactory*)*ppv);             
366                 return S_OK;
367         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSignPostTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
368                 *ppv = (LPVOID) &SignPostTrack_CF;
369                 IClassFactory_AddRef((IClassFactory*)*ppv);             
370                 return S_OK;
371         }
372
373     WARN("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
374     return CLASS_E_CLASSNOTAVAILABLE;
375 }