wined3d: Check the color data type too when deciding whether to convert data.
[wine] / dlls / d3dxof / d3dxof.c
1 /*
2  * Implementation of DirectX File Interfaces
3  *
4  * Copyright 2004 Christian Costa
5  *
6  * This file contains the (internal) driver registration functions,
7  * driver enumeration APIs and DirectDraw creation functions.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #include "config.h"
25 #include "wine/debug.h"
26
27 #define COBJMACROS
28
29 #include "winbase.h"
30 #include "wingdi.h"
31
32 #include "d3dxof_private.h"
33 #include "dxfile.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(d3dxof);
36
37 static const struct IDirectXFileVtbl IDirectXFile_Vtbl;
38 static const struct IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl;
39 static const struct IDirectXFileDataVtbl IDirectXFileData_Vtbl;
40 static const struct IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl;
41 static const struct IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl;
42 static const struct IDirectXFileObjectVtbl IDirectXFileObject_Vtbl;
43 static const struct IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl;
44
45 HRESULT IDirectXFileImpl_Create(IUnknown* pUnkOuter, LPVOID* ppObj)
46 {
47     IDirectXFileImpl* object;
48
49     TRACE("(%p,%p)\n", pUnkOuter, ppObj);
50       
51     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileImpl));
52     
53     object->lpVtbl.lpVtbl = &IDirectXFile_Vtbl;
54     object->ref = 1;
55
56     *ppObj = object;
57     
58     return S_OK;
59 }
60
61 /*** IUnknown methods ***/
62 static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile* iface, REFIID riid, void** ppvObject)
63 {
64   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
65
66   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
67
68   if (IsEqualGUID(riid, &IID_IUnknown)
69       || IsEqualGUID(riid, &IID_IDirectXFile))
70   {
71     IClassFactory_AddRef(iface);
72     *ppvObject = This;
73     return S_OK;
74   }
75
76   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
77   return E_NOINTERFACE;
78 }
79
80 static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile* iface)
81 {
82   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
83   ULONG ref = InterlockedIncrement(&This->ref);
84
85   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
86
87   return ref;
88 }
89
90 static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile* iface)
91 {
92   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
93   ULONG ref = InterlockedDecrement(&This->ref);
94
95   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
96
97   if (!ref)
98     HeapFree(GetProcessHeap(), 0, This);
99
100   return ref;
101 }
102
103 /*** IDirectXFile methods ***/
104 static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPVOID pvSource, DXFILELOADOPTIONS dwLoadOptions, LPDIRECTXFILEENUMOBJECT* ppEnumObj)
105
106 {
107   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
108   IDirectXFileEnumObjectImpl* object; 
109
110   FIXME("(%p/%p)->(%p,%lx,%p) stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj); 
111
112   if (dwLoadOptions == 0)
113   {
114     FIXME("Source is a file '%s'\n", (char*)pvSource);
115   }
116
117   object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileEnumObjectImpl));
118
119   object->lpVtbl.lpVtbl = &IDirectXFileEnumObject_Vtbl;
120   object->ref = 1;
121
122   *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;
123     
124   return S_FALSE;
125 }
126
127 static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
128 {
129   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
130
131   FIXME("(%p/%p)->(%s,%lx,%p) stub!\n", This, iface, szFileName, dwFileFormat, ppSaveObj); 
132
133   return S_FALSE;
134 }
135
136 static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LPVOID pvData, DWORD cbSize)
137 {
138   IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
139
140   FIXME("(%p/%p)->(%p,%ld) stub!\n", This, iface, pvData, cbSize); 
141
142   return S_FALSE;
143 }
144
145 static const IDirectXFileVtbl IDirectXFile_Vtbl =
146 {
147   IDirectXFileImpl_QueryInterface,
148   IDirectXFileImpl_AddRef,
149   IDirectXFileImpl_Release,
150   IDirectXFileImpl_CreateEnumObject,
151   IDirectXFileImpl_CreateSaveObject,
152   IDirectXFileImpl_RegisterTemplates
153 };
154
155 HRESULT IDirectXFileBinaryImpl_Create(IDirectXFileBinaryImpl** ppObj)
156 {
157     IDirectXFileBinaryImpl* object;
158
159     TRACE("(%p)\n", ppObj);
160       
161     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileBinaryImpl));
162     
163     object->lpVtbl.lpVtbl = &IDirectXFileBinary_Vtbl;
164     object->ref = 1;
165
166     *ppObj = object;
167     
168     return S_OK;
169 }
170
171 /*** IUnknown methods ***/
172 static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary* iface, REFIID riid, void** ppvObject)
173 {
174   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
175
176   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
177
178   if (IsEqualGUID(riid, &IID_IUnknown)
179       || IsEqualGUID(riid, &IID_IDirectXFileObject)
180       || IsEqualGUID(riid, &IID_IDirectXFileBinary))
181   {
182     IClassFactory_AddRef(iface);
183     *ppvObject = This;
184     return S_OK;
185   }
186
187   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
188   return E_NOINTERFACE;
189 }
190
191 static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary* iface)
192 {
193   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
194   ULONG ref = InterlockedIncrement(&This->ref);
195
196   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
197
198   return ref;
199 }
200
201 static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary* iface)
202 {
203   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
204   ULONG ref = InterlockedDecrement(&This->ref);
205
206   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
207
208   if (!ref)
209     HeapFree(GetProcessHeap(), 0, This);
210
211   return ref;
212 }
213
214 /*** IDirectXFileObject methods ***/
215 static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
216
217 {
218   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
219
220   FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 
221
222   return S_FALSE;
223 }
224
225 static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary* iface, LPGUID pGuid)
226 {
227   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
228
229   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 
230
231   return S_FALSE;
232 }
233
234 /*** IDirectXFileBinary methods ***/
235 static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary* iface, DWORD* pcbSize)
236 {
237   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
238
239   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcbSize); 
240
241   return S_FALSE;
242 }
243
244 static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary* iface, LPCSTR* pszMimeType)
245 {
246   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
247
248   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pszMimeType);
249
250   return S_FALSE;
251 }
252
253 static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary* iface, LPVOID pvData, DWORD cbSize, LPDWORD pcbRead)
254 {
255   IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
256
257   FIXME("(%p/%p)->(%p, %ld, %p) stub!\n", This, iface, pvData, cbSize, pcbRead); 
258
259   return S_FALSE;
260 }
261
262 static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl =
263 {
264     IDirectXFileBinaryImpl_QueryInterface,
265     IDirectXFileBinaryImpl_AddRef,
266     IDirectXFileBinaryImpl_Release,
267     IDirectXFileBinaryImpl_GetName,
268     IDirectXFileBinaryImpl_GetId,
269     IDirectXFileBinaryImpl_GetSize,
270     IDirectXFileBinaryImpl_GetMimeType,
271     IDirectXFileBinaryImpl_Read
272 };
273
274 HRESULT IDirectXFileDataImpl_Create(IDirectXFileDataImpl** ppObj)
275 {
276     IDirectXFileDataImpl* object;
277
278     TRACE("(%p)\n", ppObj);
279       
280     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataImpl));
281     
282     object->lpVtbl.lpVtbl = &IDirectXFileData_Vtbl;
283     object->ref = 1;
284
285     *ppObj = object;
286     
287     return S_OK;
288 }
289
290 /*** IUnknown methods ***/
291 static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData* iface, REFIID riid, void** ppvObject)
292 {
293   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
294
295   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
296
297   if (IsEqualGUID(riid, &IID_IUnknown)
298       || IsEqualGUID(riid, &IID_IDirectXFileObject)
299       || IsEqualGUID(riid, &IID_IDirectXFileData))
300   {
301     IClassFactory_AddRef(iface);
302     *ppvObject = This;
303     return S_OK;
304   }
305
306   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
307   return E_NOINTERFACE;
308 }
309
310 static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData* iface)
311 {
312   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
313   ULONG ref = InterlockedIncrement(&This->ref);
314
315   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
316
317   return ref;
318 }
319
320 static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData* iface)
321 {
322   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
323   ULONG ref = InterlockedDecrement(&This->ref);
324
325   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
326
327   if (!ref)
328     HeapFree(GetProcessHeap(), 0, This);
329
330   return ref;
331 }
332
333 /*** IDirectXFileObject methods ***/
334 static HRESULT WINAPI IDirectXFileDataImpl_GetName(IDirectXFileData* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
335
336 {
337   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
338
339   FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 
340
341   return S_FALSE;
342 }
343
344 static HRESULT WINAPI IDirectXFileDataImpl_GetId(IDirectXFileData* iface, LPGUID pGuid)
345 {
346   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
347
348   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 
349
350   return S_FALSE;
351 }
352
353 /*** IDirectXFileData methods ***/
354 static HRESULT WINAPI IDirectXFileDataImpl_GetData(IDirectXFileData* iface, LPCSTR szMember, DWORD* pcbSize, void** ppvData)
355 {
356   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
357
358   FIXME("(%p/%p)->(%s,%p,%p) stub!\n", This, iface, szMember, pcbSize, ppvData); 
359
360   return S_FALSE;
361 }
362
363 static HRESULT WINAPI IDirectXFileDataImpl_GetType(IDirectXFileData* iface, const GUID** pguid)
364 {
365   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
366
367   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pguid); 
368
369   return S_FALSE;
370 }
371
372 static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface, LPDIRECTXFILEOBJECT* ppChildObj)
373 {
374   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
375
376   FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppChildObj); 
377
378   return S_FALSE;
379 }
380
381 static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData* iface, LPDIRECTXFILEDATA pDataObj)
382 {
383   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
384
385   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDataObj); 
386
387   return S_FALSE;
388 }
389
390 static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData* iface, LPCSTR szRef, const GUID* pguidRef)
391 {
392   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
393
394   FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szRef, pguidRef); 
395
396   return S_FALSE;
397 }
398
399 static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData* iface, LPCSTR szName, const GUID* pguid, LPCSTR szMimeType, LPVOID pvData, DWORD cbSize)
400 {
401   IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
402
403   FIXME("(%p/%p)->(%s,%p,%s,%p,%ld) stub!\n", This, iface, szName, pguid, szMimeType, pvData, cbSize);
404
405   return S_FALSE;
406 }
407
408 static const IDirectXFileDataVtbl IDirectXFileData_Vtbl =
409 {
410     IDirectXFileDataImpl_QueryInterface,
411     IDirectXFileDataImpl_AddRef,
412     IDirectXFileDataImpl_Release,
413     IDirectXFileDataImpl_GetName,
414     IDirectXFileDataImpl_GetId,
415     IDirectXFileDataImpl_GetData,
416     IDirectXFileDataImpl_GetType,
417     IDirectXFileDataImpl_GetNextObject,
418     IDirectXFileDataImpl_AddDataObject,
419     IDirectXFileDataImpl_AddDataReference,
420     IDirectXFileDataImpl_AddBinaryObject
421 };
422
423 HRESULT IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImpl** ppObj)
424 {
425     IDirectXFileDataReferenceImpl* object;
426
427     TRACE("(%p)\n", ppObj);
428       
429     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataReferenceImpl));
430     
431     object->lpVtbl.lpVtbl = &IDirectXFileDataReference_Vtbl;
432     object->ref = 1;
433
434     *ppObj = object;
435     
436     return S_OK;
437 }
438
439 /*** IUnknown methods ***/
440 static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference* iface, REFIID riid, void** ppvObject)
441 {
442   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
443
444   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
445
446   if (IsEqualGUID(riid, &IID_IUnknown)
447       || IsEqualGUID(riid, &IID_IDirectXFileObject)
448       || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
449   {
450     IClassFactory_AddRef(iface);
451     *ppvObject = This;
452     return S_OK;
453   }
454
455   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
456   return E_NOINTERFACE;
457 }
458
459 static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference* iface)
460 {
461   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
462   ULONG ref = InterlockedIncrement(&This->ref);
463
464   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
465
466   return ref;
467 }
468
469 static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference* iface)
470 {
471   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
472   ULONG ref = InterlockedDecrement(&This->ref);
473
474   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
475
476   if (!ref)
477     HeapFree(GetProcessHeap(), 0, This);
478
479   return ref;
480 }
481
482 /*** IDirectXFileObject methods ***/
483 static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataReference* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
484 {
485   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
486
487   FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 
488
489   return S_FALSE;
490 }
491
492 static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference* iface, LPGUID pGuid)
493 {
494   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
495
496   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 
497
498   return S_FALSE;
499 }
500
501 /*** IDirectXFileDataReference ***/
502 static HRESULT WINAPI IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference* iface, LPDIRECTXFILEDATA* ppDataObj)
503 {
504   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
505
506   FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj); 
507
508   return S_FALSE;
509 }
510
511 static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl =
512 {
513     IDirectXFileDataReferenceImpl_QueryInterface,
514     IDirectXFileDataReferenceImpl_AddRef,
515     IDirectXFileDataReferenceImpl_Release,
516     IDirectXFileDataReferenceImpl_GetName,
517     IDirectXFileDataReferenceImpl_GetId,
518     IDirectXFileDataReferenceImpl_Resolve
519 };
520
521 HRESULT IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl** ppObj)
522 {
523     IDirectXFileEnumObjectImpl* object;
524
525     TRACE("(%p)\n", ppObj);
526       
527     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileEnumObjectImpl));
528     
529     object->lpVtbl.lpVtbl = &IDirectXFileEnumObject_Vtbl;
530     object->ref = 1;
531
532     *ppObj = object;
533     
534     return S_OK;
535 }
536
537 /*** IUnknown methods ***/
538 static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject* iface, REFIID riid, void** ppvObject)
539 {
540   IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
541
542   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
543
544   if (IsEqualGUID(riid, &IID_IUnknown)
545       || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
546   {
547     IClassFactory_AddRef(iface);
548     *ppvObject = This;
549     return S_OK;
550   }
551
552   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
553   return E_NOINTERFACE;
554 }
555
556 static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject* iface)
557 {
558   IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
559   ULONG ref = InterlockedIncrement(&This->ref);
560
561   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
562
563   return ref;
564 }
565
566 static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* iface)
567 {
568   IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
569   ULONG ref = InterlockedDecrement(&This->ref);
570
571   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
572
573   if (!ref)
574     HeapFree(GetProcessHeap(), 0, This);
575
576   return ref;
577 }
578
579 /*** IDirectXFileEnumObject methods ***/
580 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileEnumObject* iface, LPDIRECTXFILEDATA* ppDataObj)
581 {
582   IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
583   IDirectXFileDataImpl* object;
584   
585   FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj); 
586
587   object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataImpl));
588
589   object->lpVtbl.lpVtbl = &IDirectXFileData_Vtbl;
590   object->ref = 1;
591
592   *ppDataObj = (LPDIRECTXFILEDATA)object;
593
594   return S_FALSE;
595 }
596
597 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject* iface, REFGUID rguid, LPDIRECTXFILEDATA* ppDataObj)
598 {
599   IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
600
601   FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, rguid, ppDataObj); 
602
603   return S_FALSE;
604 }
605
606 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject* iface, LPCSTR szName, LPDIRECTXFILEDATA* ppDataObj)
607 {
608   IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
609
610   FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szName, ppDataObj); 
611
612   return S_FALSE;
613 }
614
615 static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl =
616 {
617     IDirectXFileEnumObjectImpl_QueryInterface,
618     IDirectXFileEnumObjectImpl_AddRef,
619     IDirectXFileEnumObjectImpl_Release,
620     IDirectXFileEnumObjectImpl_GetNextDataObject,
621     IDirectXFileEnumObjectImpl_GetDataObjectById,
622     IDirectXFileEnumObjectImpl_GetDataObjectByName
623 };
624
625 HRESULT IDirectXFileObjectImpl_Create(IDirectXFileObjectImpl** ppObj)
626 {
627     IDirectXFileObjectImpl* object;
628
629     TRACE("(%p)\n", ppObj);
630       
631     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileObjectImpl));
632     
633     object->lpVtbl.lpVtbl = &IDirectXFileObject_Vtbl;
634     object->ref = 1;
635
636     *ppObj = object;
637     
638     return S_OK;
639 }
640
641 /*** IUnknown methods ***/
642 static HRESULT WINAPI IDirectXFileObjectImpl_QueryInterface(IDirectXFileObject* iface, REFIID riid, void** ppvObject)
643 {
644   IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
645
646   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
647
648   if (IsEqualGUID(riid, &IID_IUnknown)
649       || IsEqualGUID(riid, &IID_IDirectXFileObject))
650   {
651     IClassFactory_AddRef(iface);
652     *ppvObject = This;
653     return S_OK;
654   }
655
656   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
657   return E_NOINTERFACE;
658 }
659
660 static ULONG WINAPI IDirectXFileObjectImpl_AddRef(IDirectXFileObject* iface)
661 {
662   IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
663   ULONG ref = InterlockedIncrement(&This->ref);
664
665   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
666
667   return ref;
668 }
669
670 static ULONG WINAPI IDirectXFileObjectImpl_Release(IDirectXFileObject* iface)
671 {
672   IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
673   ULONG ref = InterlockedDecrement(&This->ref);
674
675   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
676
677   if (!ref)
678     HeapFree(GetProcessHeap(), 0, This);
679
680   return ref;
681 }
682
683 /*** IDirectXFileObject methods ***/
684 static HRESULT WINAPI IDirectXFileObjectImpl_GetName(IDirectXFileObject* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
685 {
686   IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
687
688   FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 
689
690   return S_FALSE;
691 }
692
693 static HRESULT WINAPI IDirectXFileObjectImpl_GetId(IDirectXFileObject* iface, LPGUID pGuid)
694 {
695   IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
696
697   FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 
698
699   return S_FALSE;
700 }
701
702 static const IDirectXFileObjectVtbl IDirectXFileObject_Vtbl =
703 {
704     IDirectXFileObjectImpl_QueryInterface,
705     IDirectXFileObjectImpl_AddRef,
706     IDirectXFileObjectImpl_Release,
707     IDirectXFileObjectImpl_GetName,
708     IDirectXFileObjectImpl_GetId
709 };
710
711 HRESULT IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl** ppObj)
712 {
713     IDirectXFileSaveObjectImpl* object;
714
715     TRACE("(%p)\n", ppObj);
716
717     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileSaveObjectImpl));
718     
719     object->lpVtbl.lpVtbl = &IDirectXFileSaveObject_Vtbl;
720     object->ref = 1;
721
722     *ppObj = object;
723     
724     return S_OK;
725 }
726
727 /*** IUnknown methods ***/
728 static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject* iface, REFIID riid, void** ppvObject)
729 {
730   IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
731
732   TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
733
734   if (IsEqualGUID(riid, &IID_IUnknown)
735       || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
736   {
737     IClassFactory_AddRef(iface);
738     *ppvObject = This;
739     return S_OK;
740   }
741
742   ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
743   return E_NOINTERFACE;
744 }
745
746 static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject* iface)
747 {
748   IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
749   ULONG ref = InterlockedIncrement(&This->ref);
750
751   TRACE("(%p/%p): AddRef from %ld\n", iface, This, ref - 1);
752
753   return ref;
754 }
755
756 static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject* iface)
757 {
758   IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
759   ULONG ref = InterlockedDecrement(&This->ref);
760
761   TRACE("(%p/%p): ReleaseRef to %ld\n", iface, This, ref);
762
763   if (!ref)
764     HeapFree(GetProcessHeap(), 0, This);
765
766   return ref;
767 }
768
769 static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject* iface, DWORD cTemplates, const GUID** ppguidTemplates)
770 {
771   IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
772
773   FIXME("(%p/%p)->(%ld,%p) stub!\n", This, iface, cTemplates, ppguidTemplates); 
774
775   return S_FALSE;
776 }
777
778 static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject* iface, REFGUID rguidTemplate, LPCSTR szName, const GUID* pguid, DWORD cbSize, LPVOID pvData, LPDIRECTXFILEDATA* ppDataObj)
779 {
780   IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
781
782   FIXME("(%p/%p)->(%p,%s,%p,%ld,%p,%p) stub!\n", This, iface, rguidTemplate, szName, pguid, cbSize, pvData, ppDataObj); 
783
784   return S_FALSE;
785 }
786
787 static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject* iface, LPDIRECTXFILEDATA ppDataObj)
788 {
789   IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
790
791   FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj); 
792
793   return S_FALSE;
794 }
795
796 static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl =
797 {
798     IDirectXFileSaveObjectImpl_QueryInterface,
799     IDirectXFileSaveObjectImpl_AddRef,
800     IDirectXFileSaveObjectImpl_Release,
801     IDirectXFileSaveObjectImpl_SaveTemplates,
802     IDirectXFileSaveObjectImpl_CreateDataObject,
803     IDirectXFileSaveObjectImpl_SaveData
804 };