- implemented loader, loader's stream and loading of objects (now you
[wine] / dlls / dmime / markertrack.c
1 /* IDirectMusicMarkerTrack Implementation
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 "dmime_private.h"
27
28 WINE_DEFAULT_DEBUG_CHANNEL(dmime);
29 WINE_DECLARE_DEBUG_CHANNEL(dmfile);
30
31 /*****************************************************************************
32  * IDirectMusicMarkerTrack implementation
33  */
34 /* IDirectMusicMarkerTrack IUnknown part: */
35 HRESULT WINAPI IDirectMusicMarkerTrack_QueryInterface (LPDIRECTMUSICTRACK8 iface, REFIID riid, LPVOID *ppobj)
36 {
37         ICOM_THIS(IDirectMusicMarkerTrack,iface);
38
39         if (IsEqualIID (riid, &IID_IUnknown) || 
40             IsEqualIID (riid, &IID_IDirectMusicTrack) ||
41             IsEqualIID (riid, &IID_IDirectMusicTrack8)) {
42                 IDirectMusicMarkerTrack_AddRef(iface);
43                 *ppobj = This;
44                 return S_OK;
45         } else if (IsEqualIID (riid, &IID_IPersistStream)) {
46                 IDirectMusicMarkerTrackStream_AddRef ((LPPERSISTSTREAM)This->pStream);
47                 *ppobj = This->pStream;
48                 return S_OK;
49         }
50         
51         WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
52         return E_NOINTERFACE;
53 }
54
55 ULONG WINAPI IDirectMusicMarkerTrack_AddRef (LPDIRECTMUSICTRACK8 iface)
56 {
57         ICOM_THIS(IDirectMusicMarkerTrack,iface);
58         TRACE("(%p) : AddRef from %ld\n", This, This->ref);
59         return ++(This->ref);
60 }
61
62 ULONG WINAPI IDirectMusicMarkerTrack_Release (LPDIRECTMUSICTRACK8 iface)
63 {
64         ICOM_THIS(IDirectMusicMarkerTrack,iface);
65         ULONG ref = --This->ref;
66         TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
67         if (ref == 0) {
68                 HeapFree(GetProcessHeap(), 0, This);
69         }
70         return ref;
71 }
72
73 /* IDirectMusicMarkerTrack IDirectMusicTrack part: */
74 HRESULT WINAPI IDirectMusicMarkerTrack_Init (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegment* pSegment)
75 {
76         ICOM_THIS(IDirectMusicMarkerTrack,iface);
77
78         FIXME("(%p, %p): stub\n", This, pSegment);
79
80         return S_OK;
81 }
82
83 HRESULT WINAPI IDirectMusicMarkerTrack_InitPlay (LPDIRECTMUSICTRACK8 iface, IDirectMusicSegmentState* pSegmentState, IDirectMusicPerformance* pPerformance, void** ppStateData, DWORD dwVirtualTrack8ID, DWORD dwFlags)
84 {
85         ICOM_THIS(IDirectMusicMarkerTrack,iface);
86
87         FIXME("(%p, %p, %p, %p, %ld, %ld): stub\n", This, pSegmentState, pPerformance, ppStateData, dwVirtualTrack8ID, dwFlags);
88
89         return S_OK;
90 }
91
92 HRESULT WINAPI IDirectMusicMarkerTrack_EndPlay (LPDIRECTMUSICTRACK8 iface, void* pStateData)
93 {
94         ICOM_THIS(IDirectMusicMarkerTrack,iface);
95
96         FIXME("(%p, %p): stub\n", This, pStateData);
97
98         return S_OK;
99 }
100
101 HRESULT WINAPI IDirectMusicMarkerTrack_Play (LPDIRECTMUSICTRACK8 iface, void* pStateData, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, MUSIC_TIME mtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID)
102 {
103         ICOM_THIS(IDirectMusicMarkerTrack,iface);
104
105         FIXME("(%p, %p, %ld, %ld, %ld, %ld, %p, %p, %ld): stub\n", This, pStateData, mtStart, mtEnd, mtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
106
107         return S_OK;
108 }
109
110 HRESULT WINAPI IDirectMusicMarkerTrack_GetParam (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, MUSIC_TIME mtTime, MUSIC_TIME* pmtNext, void* pParam)
111 {
112         ICOM_THIS(IDirectMusicMarkerTrack,iface);
113
114         FIXME("(%p, %s, %ld, %p, %p): stub\n", This, debugstr_guid(rguidType), mtTime, pmtNext, pParam);
115
116         return S_OK;
117 }
118
119 HRESULT WINAPI IDirectMusicMarkerTrack_SetParam (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, MUSIC_TIME mtTime, void* pParam)
120 {
121         ICOM_THIS(IDirectMusicMarkerTrack,iface);
122
123         FIXME("(%p, %s, %ld, %p): stub\n", This, debugstr_guid(rguidType), mtTime, pParam);
124
125         return S_OK;
126 }
127
128 HRESULT WINAPI IDirectMusicMarkerTrack_IsParamSupported (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType)
129 {
130         ICOM_THIS(IDirectMusicMarkerTrack,iface);
131
132         TRACE("(%p, %s): ", This, debugstr_guid(rguidType));
133         if (IsEqualGUID (rguidType, &GUID_Play_Marker)
134                 || IsEqualGUID (rguidType, &GUID_Valid_Start_Time)) {
135                 TRACE("param supported\n");
136                 return S_OK;
137                 }
138
139         TRACE("param unsupported\n");
140         return DMUS_E_TYPE_UNSUPPORTED;
141 }
142
143 HRESULT WINAPI IDirectMusicMarkerTrack_AddNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType)
144 {
145         ICOM_THIS(IDirectMusicMarkerTrack,iface);
146
147         FIXME("(%p, %s): stub\n", This, debugstr_guid(rguidNotificationType));
148
149         return S_OK;
150 }
151
152 HRESULT WINAPI IDirectMusicMarkerTrack_RemoveNotificationType (LPDIRECTMUSICTRACK8 iface, REFGUID rguidNotificationType)
153 {
154         ICOM_THIS(IDirectMusicMarkerTrack,iface);
155
156         FIXME("(%p, %s): stub\n", This, debugstr_guid(rguidNotificationType));
157
158         return S_OK;
159 }
160
161 HRESULT WINAPI IDirectMusicMarkerTrack_Clone (LPDIRECTMUSICTRACK8 iface, MUSIC_TIME mtStart, MUSIC_TIME mtEnd, IDirectMusicTrack** ppTrack)
162 {
163         ICOM_THIS(IDirectMusicMarkerTrack,iface);
164
165         FIXME("(%p, %ld, %ld, %p): stub\n", This, mtStart, mtEnd, ppTrack);
166
167         return S_OK;
168 }
169
170 /* IDirectMusicMarkerTrack IDirectMusicTrack8 part: */
171 HRESULT WINAPI IDirectMusicMarkerTrack_PlayEx (LPDIRECTMUSICTRACK8 iface, void* pStateData, REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd, REFERENCE_TIME rtOffset, DWORD dwFlags, IDirectMusicPerformance* pPerf, IDirectMusicSegmentState* pSegSt, DWORD dwVirtualID)
172 {
173         ICOM_THIS(IDirectMusicMarkerTrack,iface);
174
175         FIXME("(%p, %p, %lli, %lli, %lli, %ld, %p, %p, %ld): stub\n", This, pStateData, rtStart, rtEnd, rtOffset, dwFlags, pPerf, pSegSt, dwVirtualID);
176
177         return S_OK;
178 }
179
180 HRESULT WINAPI IDirectMusicMarkerTrack_GetParamEx (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, REFERENCE_TIME rtTime, REFERENCE_TIME* prtNext, void* pParam, void* pStateData, DWORD dwFlags)
181 {
182         ICOM_THIS(IDirectMusicMarkerTrack,iface);
183
184         FIXME("(%p, %s, %lli, %p, %p, %p, %ld): stub\n", This, debugstr_guid(rguidType), rtTime, prtNext, pParam, pStateData, dwFlags);
185
186         return S_OK;
187 }
188
189 HRESULT WINAPI IDirectMusicMarkerTrack_SetParamEx (LPDIRECTMUSICTRACK8 iface, REFGUID rguidType, REFERENCE_TIME rtTime, void* pParam, void* pStateData, DWORD dwFlags)
190 {
191         ICOM_THIS(IDirectMusicMarkerTrack,iface);
192
193         FIXME("(%p, %s, %lli, %p, %p, %ld): stub\n", This, debugstr_guid(rguidType), rtTime, pParam, pStateData, dwFlags);
194
195         return S_OK;
196 }
197
198 HRESULT WINAPI IDirectMusicMarkerTrack_Compose (LPDIRECTMUSICTRACK8 iface, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack)
199 {
200         ICOM_THIS(IDirectMusicMarkerTrack,iface);
201
202         FIXME("(%p, %p, %ld, %p): stub\n", This, pContext, dwTrackGroup, ppResultTrack);
203
204         return S_OK;
205 }
206
207 HRESULT WINAPI IDirectMusicMarkerTrack_Join (LPDIRECTMUSICTRACK8 iface, IDirectMusicTrack* pNewTrack, MUSIC_TIME mtJoin, IUnknown* pContext, DWORD dwTrackGroup, IDirectMusicTrack** ppResultTrack)
208 {
209         ICOM_THIS(IDirectMusicMarkerTrack,iface);
210
211         FIXME("(%p, %p, %ld, %p, %ld, %p): stub\n", This, pNewTrack, mtJoin, pContext, dwTrackGroup, ppResultTrack);
212
213         return S_OK;
214 }
215
216 ICOM_VTABLE(IDirectMusicTrack8) DirectMusicMarkerTrack_Vtbl =
217 {
218     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
219         IDirectMusicMarkerTrack_QueryInterface,
220         IDirectMusicMarkerTrack_AddRef,
221         IDirectMusicMarkerTrack_Release,
222         IDirectMusicMarkerTrack_Init,
223         IDirectMusicMarkerTrack_InitPlay,
224         IDirectMusicMarkerTrack_EndPlay,
225         IDirectMusicMarkerTrack_Play,
226         IDirectMusicMarkerTrack_GetParam,
227         IDirectMusicMarkerTrack_SetParam,
228         IDirectMusicMarkerTrack_IsParamSupported,
229         IDirectMusicMarkerTrack_AddNotificationType,
230         IDirectMusicMarkerTrack_RemoveNotificationType,
231         IDirectMusicMarkerTrack_Clone,
232         IDirectMusicMarkerTrack_PlayEx,
233         IDirectMusicMarkerTrack_GetParamEx,
234         IDirectMusicMarkerTrack_SetParamEx,
235         IDirectMusicMarkerTrack_Compose,
236         IDirectMusicMarkerTrack_Join
237 };
238
239 /* for ClassFactory */
240 HRESULT WINAPI DMUSIC_CreateDirectMusicMarkerTrack (LPCGUID lpcGUID, LPDIRECTMUSICTRACK8 *ppTrack, LPUNKNOWN pUnkOuter)
241 {
242         IDirectMusicMarkerTrack* track;
243         
244         if (IsEqualIID (lpcGUID, &IID_IDirectMusicTrack)
245                 || IsEqualIID (lpcGUID, &IID_IDirectMusicTrack8)) {
246                 track = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicMarkerTrack));
247                 if (NULL == track) {
248                         *ppTrack = (LPDIRECTMUSICTRACK8) NULL;
249                         return E_OUTOFMEMORY;
250                 }
251                 track->lpVtbl = &DirectMusicMarkerTrack_Vtbl;
252                 track->ref = 1;
253                 track->pStream = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(IDirectMusicMarkerTrackStream));
254                 track->pStream->lpVtbl = &DirectMusicMarkerTrackStream_Vtbl;
255                 track->pStream->ref = 1;        
256                 track->pStream->pParentTrack = track;
257                 *ppTrack = (LPDIRECTMUSICTRACK8) track;
258                 return S_OK;
259         }
260         WARN("No interface found\n");
261         
262         return E_NOINTERFACE;
263 }
264
265
266 /*****************************************************************************
267  * IDirectMusicMarkerTrackStream implementation
268  */
269 /* IDirectMusicMarkerTrackStream IUnknown part follow: */
270 HRESULT WINAPI IDirectMusicMarkerTrackStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj)
271 {
272         ICOM_THIS(IDirectMusicMarkerTrackStream,iface);
273
274         if (IsEqualIID (riid, &IID_IUnknown)
275                 || IsEqualIID (riid, &IID_IPersistStream)) {
276                 IDirectMusicMarkerTrackStream_AddRef(iface);
277                 *ppobj = This;
278                 return S_OK;
279         }
280         
281         WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
282         return E_NOINTERFACE;
283 }
284
285 ULONG WINAPI IDirectMusicMarkerTrackStream_AddRef (LPPERSISTSTREAM iface)
286 {
287         ICOM_THIS(IDirectMusicMarkerTrackStream,iface);
288         TRACE("(%p) : AddRef from %ld\n", This, This->ref);
289         return ++(This->ref);
290 }
291
292 ULONG WINAPI IDirectMusicMarkerTrackStream_Release (LPPERSISTSTREAM iface)
293 {
294         ICOM_THIS(IDirectMusicMarkerTrackStream,iface);
295         ULONG ref = --This->ref;
296         TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
297         if (ref == 0) {
298                 HeapFree(GetProcessHeap(), 0, This);
299         }
300         return ref;
301 }
302
303 /* IDirectMusicMarkerTrackStream IPersist part: */
304 HRESULT WINAPI IDirectMusicMarkerTrackStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID)
305 {
306         return E_NOTIMPL;
307 }
308
309 /* IDirectMusicMarkerTrackStream IPersistStream part: */
310 HRESULT WINAPI IDirectMusicMarkerTrackStream_IsDirty (LPPERSISTSTREAM iface)
311 {
312         return E_NOTIMPL;
313 }
314
315 HRESULT WINAPI IDirectMusicMarkerTrackStream_Load (LPPERSISTSTREAM iface, IStream* pStm)
316 {
317         FIXME(": Loading not implemented yet\n");
318         return S_OK;
319 }
320
321 HRESULT WINAPI IDirectMusicMarkerTrackStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty)
322 {
323         return E_NOTIMPL;
324 }
325
326 HRESULT WINAPI IDirectMusicMarkerTrackStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize)
327 {
328         return E_NOTIMPL;
329 }
330
331 ICOM_VTABLE(IPersistStream) DirectMusicMarkerTrackStream_Vtbl =
332 {
333     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
334         IDirectMusicMarkerTrackStream_QueryInterface,
335         IDirectMusicMarkerTrackStream_AddRef,
336         IDirectMusicMarkerTrackStream_Release,
337         IDirectMusicMarkerTrackStream_GetClassID,
338         IDirectMusicMarkerTrackStream_IsDirty,
339         IDirectMusicMarkerTrackStream_Load,
340         IDirectMusicMarkerTrackStream_Save,
341         IDirectMusicMarkerTrackStream_GetSizeMax
342 };