- define additional shell paths for CSIDL_... constants
[wine] / dlls / dmcompos / dmcompos_main.c
1 /* DirectMusicComposer Main
2  *
3  * Copyright (C) 2003-2004 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     /* IUnknown fields */
26     ICOM_VFIELD(IClassFactory);
27     DWORD                       ref;
28 } IClassFactoryImpl;
29
30 /******************************************************************
31  *              DirectMusicChordMap ClassFactory
32  */
33 static HRESULT WINAPI ChordMapCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
34         ICOM_THIS(IClassFactoryImpl,iface);
35         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
36         return E_NOINTERFACE;
37 }
38
39 static ULONG WINAPI ChordMapCF_AddRef(LPCLASSFACTORY iface) {
40         ICOM_THIS(IClassFactoryImpl,iface);
41         return ++(This->ref);
42 }
43
44 static ULONG WINAPI ChordMapCF_Release(LPCLASSFACTORY iface) {
45         ICOM_THIS(IClassFactoryImpl,iface);
46         /* static class, won't be  freed */
47         return --(This->ref);
48 }
49
50 static HRESULT WINAPI ChordMapCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
51         ICOM_THIS(IClassFactoryImpl,iface);
52         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
53         return DMUSIC_CreateDirectMusicChordMapImpl (riid, ppobj, pOuter);
54 }
55
56 static HRESULT WINAPI ChordMapCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
57         ICOM_THIS(IClassFactoryImpl,iface);
58         FIXME("(%p)->(%d),stub!\n", This, dolock);
59         return S_OK;
60 }
61
62 static ICOM_VTABLE(IClassFactory) ChordMapCF_Vtbl = {
63         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
64         ChordMapCF_QueryInterface,
65         ChordMapCF_AddRef,
66         ChordMapCF_Release,
67         ChordMapCF_CreateInstance,
68         ChordMapCF_LockServer
69 };
70
71 static IClassFactoryImpl ChordMap_CF = {&ChordMapCF_Vtbl, 1 };
72
73 /******************************************************************
74  *              DirectMusicComposer ClassFactory
75  */
76 static HRESULT WINAPI ComposerCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
77         ICOM_THIS(IClassFactoryImpl,iface);
78         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
79         return E_NOINTERFACE;
80 }
81
82 static ULONG WINAPI ComposerCF_AddRef(LPCLASSFACTORY iface) {
83         ICOM_THIS(IClassFactoryImpl,iface);
84         return ++(This->ref);
85 }
86
87 static ULONG WINAPI ComposerCF_Release(LPCLASSFACTORY iface) {
88         ICOM_THIS(IClassFactoryImpl,iface);
89         /* static class, won't be  freed */
90         return --(This->ref);
91 }
92
93 static HRESULT WINAPI ComposerCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
94         ICOM_THIS(IClassFactoryImpl,iface);
95         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
96         return DMUSIC_CreateDirectMusicComposerImpl (riid, ppobj, pOuter);
97 }
98
99 static HRESULT WINAPI ComposerCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
100         ICOM_THIS(IClassFactoryImpl,iface);
101         FIXME("(%p)->(%d),stub!\n", This, dolock);
102         return S_OK;
103 }
104
105 static ICOM_VTABLE(IClassFactory) ComposerCF_Vtbl = {
106         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
107         ComposerCF_QueryInterface,
108         ComposerCF_AddRef,
109         ComposerCF_Release,
110         ComposerCF_CreateInstance,
111         ComposerCF_LockServer
112 };
113
114 static IClassFactoryImpl Composer_CF = {&ComposerCF_Vtbl, 1 };
115
116 /******************************************************************
117  *              DirectMusicChordMapTrack ClassFactory
118  */
119 static HRESULT WINAPI ChordMapTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
120         ICOM_THIS(IClassFactoryImpl,iface);
121         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
122         return E_NOINTERFACE;
123 }
124
125 static ULONG WINAPI ChordMapTrackCF_AddRef(LPCLASSFACTORY iface) {
126         ICOM_THIS(IClassFactoryImpl,iface);
127         return ++(This->ref);
128 }
129
130 static ULONG WINAPI ChordMapTrackCF_Release(LPCLASSFACTORY iface) {
131         ICOM_THIS(IClassFactoryImpl,iface);
132         /* static class, won't be  freed */
133         return --(This->ref);
134 }
135
136 static HRESULT WINAPI ChordMapTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
137         ICOM_THIS(IClassFactoryImpl,iface);
138         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
139         return DMUSIC_CreateDirectMusicChordMapTrack (riid, ppobj, pOuter);
140 }
141
142 static HRESULT WINAPI ChordMapTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
143         ICOM_THIS(IClassFactoryImpl,iface);
144         FIXME("(%p)->(%d),stub!\n", This, dolock);
145         return S_OK;
146 }
147
148 static ICOM_VTABLE(IClassFactory) ChordMapTrackCF_Vtbl = {
149         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
150         ChordMapTrackCF_QueryInterface,
151         ChordMapTrackCF_AddRef,
152         ChordMapTrackCF_Release,
153         ChordMapTrackCF_CreateInstance,
154         ChordMapTrackCF_LockServer
155 };
156
157 static IClassFactoryImpl ChordMapTrack_CF = {&ChordMapTrackCF_Vtbl, 1 };
158
159 /******************************************************************
160  *              DirectMusicTemplate ClassFactory
161  */
162 static HRESULT WINAPI TemplateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
163         ICOM_THIS(IClassFactoryImpl,iface);
164         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
165         return E_NOINTERFACE;
166 }
167
168 static ULONG WINAPI TemplateCF_AddRef(LPCLASSFACTORY iface) {
169         ICOM_THIS(IClassFactoryImpl,iface);
170         return ++(This->ref);
171 }
172
173 static ULONG WINAPI TemplateCF_Release(LPCLASSFACTORY iface) {
174         ICOM_THIS(IClassFactoryImpl,iface);
175         /* static class, won't be  freed */
176         return --(This->ref);
177 }
178
179 static HRESULT WINAPI TemplateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
180         ICOM_THIS(IClassFactoryImpl,iface);
181         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
182         /* nothing yet */
183         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
184         return E_NOINTERFACE;
185 }
186
187 static HRESULT WINAPI TemplateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
188         ICOM_THIS(IClassFactoryImpl,iface);
189         FIXME("(%p)->(%d),stub!\n", This, dolock);
190         return S_OK;
191 }
192
193 static ICOM_VTABLE(IClassFactory) TemplateCF_Vtbl = {
194         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
195         TemplateCF_QueryInterface,
196         TemplateCF_AddRef,
197         TemplateCF_Release,
198         TemplateCF_CreateInstance,
199         TemplateCF_LockServer
200 };
201
202 static IClassFactoryImpl Template_CF = {&TemplateCF_Vtbl, 1 };
203
204 /******************************************************************
205  *              DirectMusicSignPostTrack ClassFactory
206  */
207 static HRESULT WINAPI SignPostTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
208         ICOM_THIS(IClassFactoryImpl,iface);
209         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
210         return E_NOINTERFACE;
211 }
212
213 static ULONG WINAPI SignPostTrackCF_AddRef(LPCLASSFACTORY iface) {
214         ICOM_THIS(IClassFactoryImpl,iface);
215         return ++(This->ref);
216 }
217
218 static ULONG WINAPI SignPostTrackCF_Release(LPCLASSFACTORY iface) {
219         ICOM_THIS(IClassFactoryImpl,iface);
220         /* static class, won't be  freed */
221         return --(This->ref);
222 }
223
224 static HRESULT WINAPI SignPostTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
225         ICOM_THIS(IClassFactoryImpl,iface);
226         TRACE ("(%p)->(%p,%s,%p)\n", This, pOuter, debugstr_guid(riid), ppobj);
227         return DMUSIC_CreateDirectMusicSignPostTrack (riid, ppobj, pOuter);
228 }
229
230 static HRESULT WINAPI SignPostTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
231         ICOM_THIS(IClassFactoryImpl,iface);
232         FIXME("(%p)->(%d),stub!\n", This, dolock);
233         return S_OK;
234 }
235
236 static ICOM_VTABLE(IClassFactory) SignPostTrackCF_Vtbl = {
237         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
238         SignPostTrackCF_QueryInterface,
239         SignPostTrackCF_AddRef,
240         SignPostTrackCF_Release,
241         SignPostTrackCF_CreateInstance,
242         SignPostTrackCF_LockServer
243 };
244
245 static IClassFactoryImpl SignPostTrack_CF = {&SignPostTrackCF_Vtbl, 1 };
246
247 /******************************************************************
248  *              DllMain
249  *
250  *
251  */
252 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
253         if (fdwReason == DLL_PROCESS_ATTACH)    {
254             DisableThreadLibraryCalls(hinstDLL);
255                 /* FIXME: Initialisation */
256         }
257         else if (fdwReason == DLL_PROCESS_DETACH)       {
258                 /* FIXME: Cleanup */
259         }
260
261         return TRUE;
262 }
263
264
265 /******************************************************************
266  *              DllCanUnloadNow (DMCOMPOS.1)
267  *
268  *
269  */
270 HRESULT WINAPI DMCOMPOS_DllCanUnloadNow(void) {
271     FIXME("(void): stub\n");
272     return S_FALSE;
273 }
274
275
276 /******************************************************************
277  *              DllGetClassObject (DMCOMPOS.2)
278  *
279  *
280  */
281 HRESULT WINAPI DMCOMPOS_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) {
282     TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
283     if (IsEqualCLSID (rclsid, &CLSID_DirectMusicChordMap) && IsEqualIID (riid, &IID_IClassFactory)) {
284                 *ppv = (LPVOID) &ChordMap_CF;
285                 IClassFactory_AddRef((IClassFactory*)*ppv);
286                 return S_OK;
287         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicComposer) && IsEqualIID (riid, &IID_IClassFactory)) { 
288                 *ppv = (LPVOID) &Composer_CF;
289                 IClassFactory_AddRef((IClassFactory*)*ppv);             
290                 return S_OK;
291         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicChordMapTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
292                 *ppv = (LPVOID) &ChordMapTrack_CF;
293                 IClassFactory_AddRef((IClassFactory*)*ppv);             
294                 return S_OK;
295         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicTemplate) && IsEqualIID (riid, &IID_IClassFactory)) {
296                 *ppv = (LPVOID) &Template_CF;
297                 IClassFactory_AddRef((IClassFactory*)*ppv);             
298                 return S_OK;
299         } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicSignPostTrack) && IsEqualIID (riid, &IID_IClassFactory)) {
300                 *ppv = (LPVOID) &SignPostTrack_CF;
301                 IClassFactory_AddRef((IClassFactory*)*ppv);             
302                 return S_OK;
303         }
304
305     WARN("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
306     return CLASS_E_CLASSNOTAVAILABLE;
307 }