d3dxof.c 23.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * Implementation of DirectX File Interfaces
 *
 * Copyright 2004 Christian Costa
 *
 * This file contains the (internal) driver registration functions,
 * driver enumeration APIs and DirectDraw creation functions.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * 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 25 26
 */

#include "config.h"
#include "wine/debug.h"

27 28
#define COBJMACROS

29 30 31 32 33 34 35 36
#include "winbase.h"
#include "wingdi.h"

#include "d3dxof_private.h"
#include "dxfile.h"

WINE_DEFAULT_DEBUG_CHANNEL(d3dxof);

37 38 39 40 41 42 43
static const struct IDirectXFileVtbl IDirectXFile_Vtbl;
static const struct IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl;
static const struct IDirectXFileDataVtbl IDirectXFileData_Vtbl;
static const struct IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl;
static const struct IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl;
static const struct IDirectXFileObjectVtbl IDirectXFileObject_Vtbl;
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 52 53 54 55 56 57 58 59 60 61 62 63
      
    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFile_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
    return S_OK;
}

/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile* iface, REFIID riid, void** ppvObject)
{
64
  IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
65

66
  TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

  if (IsEqualGUID(riid, &IID_IUnknown)
      || IsEqualGUID(riid, &IID_IDirectXFile))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile* iface)
{
82
  IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
83
  ULONG ref = InterlockedIncrement(&This->ref);
84

85
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
86

87
  return ref;
88 89 90 91
}

static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile* iface)
{
92
  IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
93
  ULONG ref = InterlockedDecrement(&This->ref);
94

95
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
96

97
  if (!ref)
98 99
    HeapFree(GetProcessHeap(), 0, This);

100
  return ref;
101 102 103 104 105 106
}

/*** IDirectXFile methods ***/
static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPVOID pvSource, DXFILELOADOPTIONS dwLoadOptions, LPDIRECTXFILEENUMOBJECT* ppEnumObj)

{
107
  IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
108 109
  IDirectXFileEnumObjectImpl* object; 

110
  FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
111 112 113 114 115 116 117 118 119 120 121 122 123

  if (dwLoadOptions == 0)
  {
    FIXME("Source is a file '%s'\n", (char*)pvSource);
  }

  object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileEnumObjectImpl));

  object->lpVtbl.lpVtbl = &IDirectXFileEnumObject_Vtbl;
  object->ref = 1;

  *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;
    
124
  return DXFILE_OK;
125 126 127 128
}

static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
{
129
  IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
130

131
  FIXME("(%p/%p)->(%s,%x,%p) stub!\n", This, iface, szFileName, dwFileFormat, ppSaveObj);
132

133
  return DXFILEERR_BADVALUE;
134 135 136 137
}

static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LPVOID pvData, DWORD cbSize)
{
138
  IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
139

140
  FIXME("(%p/%p)->(%p,%d) stub!\n", This, iface, pvData, cbSize);
141

142
  return DXFILEERR_BADVALUE;
143 144
}

145
static const IDirectXFileVtbl IDirectXFile_Vtbl =
146 147 148 149 150 151 152 153 154
{
  IDirectXFileImpl_QueryInterface,
  IDirectXFileImpl_AddRef,
  IDirectXFileImpl_Release,
  IDirectXFileImpl_CreateEnumObject,
  IDirectXFileImpl_CreateSaveObject,
  IDirectXFileImpl_RegisterTemplates
};

155 156 157 158 159 160 161 162 163 164 165 166 167
HRESULT IDirectXFileBinaryImpl_Create(IDirectXFileBinaryImpl** ppObj)
{
    IDirectXFileBinaryImpl* object;

    TRACE("(%p)\n", ppObj);
      
    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileBinaryImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFileBinary_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
168
    return DXFILE_OK;
169 170
}

171 172 173
/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary* iface, REFIID riid, void** ppvObject)
{
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 181 182 183 184 185 186 187 188 189 190 191 192
      || IsEqualGUID(riid, &IID_IDirectXFileBinary))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary* iface)
{
193
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
194
  ULONG ref = InterlockedIncrement(&This->ref);
195

196
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
197

198
  return ref;
199 200 201 202
}

static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary* iface)
{
203
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
204
  ULONG ref = InterlockedDecrement(&This->ref);
205

206
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
207

208
  if (!ref)
209 210
    HeapFree(GetProcessHeap(), 0, This);

211
  return ref;
212 213 214 215 216 217
}

/*** IDirectXFileObject methods ***/
static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)

{
218
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
219 220 221

  FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 

222
  return DXFILEERR_BADVALUE;
223 224 225 226
}

static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary* iface, LPGUID pGuid)
{
227
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
228 229 230

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 

231
  return DXFILEERR_BADVALUE;
232 233 234 235 236
}

/*** IDirectXFileBinary methods ***/
static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary* iface, DWORD* pcbSize)
{
237
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
238 239 240

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcbSize); 

241
  return DXFILEERR_BADVALUE;
242 243 244 245
}

static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary* iface, LPCSTR* pszMimeType)
{
246
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
247 248 249

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pszMimeType);

250
  return DXFILEERR_BADVALUE;
251 252 253 254
}

static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary* iface, LPVOID pvData, DWORD cbSize, LPDWORD pcbRead)
{
255
  IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
256

257
  FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This, iface, pvData, cbSize, pcbRead);
258

259
  return DXFILEERR_BADVALUE;
260 261
}

262
static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl =
263 264 265 266 267 268 269 270 271 272 273
{
    IDirectXFileBinaryImpl_QueryInterface,
    IDirectXFileBinaryImpl_AddRef,
    IDirectXFileBinaryImpl_Release,
    IDirectXFileBinaryImpl_GetName,
    IDirectXFileBinaryImpl_GetId,
    IDirectXFileBinaryImpl_GetSize,
    IDirectXFileBinaryImpl_GetMimeType,
    IDirectXFileBinaryImpl_Read
};

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
HRESULT IDirectXFileDataImpl_Create(IDirectXFileDataImpl** ppObj)
{
    IDirectXFileDataImpl* object;

    TRACE("(%p)\n", ppObj);
      
    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFileData_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
    return S_OK;
}

290 291 292
/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData* iface, REFIID riid, void** ppvObject)
{
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 300 301 302 303 304 305 306 307 308 309 310 311
      || IsEqualGUID(riid, &IID_IDirectXFileData))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData* iface)
{
312
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
313
  ULONG ref = InterlockedIncrement(&This->ref);
314

315
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
316

317
  return ref;
318 319 320 321
}

static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData* iface)
{
322
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
323
  ULONG ref = InterlockedDecrement(&This->ref);
324

325
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
326

327
  if (!ref)
328 329
    HeapFree(GetProcessHeap(), 0, This);

330
  return ref;
331 332 333 334 335 336
}

/*** IDirectXFileObject methods ***/
static HRESULT WINAPI IDirectXFileDataImpl_GetName(IDirectXFileData* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)

{
337
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
338 339 340

  FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 

341
  return DXFILEERR_BADVALUE;
342 343 344 345
}

static HRESULT WINAPI IDirectXFileDataImpl_GetId(IDirectXFileData* iface, LPGUID pGuid)
{
346
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
347 348 349

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 

350
  return DXFILEERR_BADVALUE;
351 352 353 354 355
}

/*** IDirectXFileData methods ***/
static HRESULT WINAPI IDirectXFileDataImpl_GetData(IDirectXFileData* iface, LPCSTR szMember, DWORD* pcbSize, void** ppvData)
{
356
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
357 358 359

  FIXME("(%p/%p)->(%s,%p,%p) stub!\n", This, iface, szMember, pcbSize, ppvData); 

360
  return DXFILEERR_BADVALUE;
361 362 363 364
}

static HRESULT WINAPI IDirectXFileDataImpl_GetType(IDirectXFileData* iface, const GUID** pguid)
{
365
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
366 367 368

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pguid); 

369
  return DXFILEERR_BADVALUE;
370 371 372 373
}

static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface, LPDIRECTXFILEOBJECT* ppChildObj)
{
374
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
375 376 377

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppChildObj); 

378
  return DXFILEERR_BADVALUE;
379 380 381 382
}

static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData* iface, LPDIRECTXFILEDATA pDataObj)
{
383
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
384 385 386

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDataObj); 

387
  return DXFILEERR_BADVALUE;
388 389 390 391
}

static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData* iface, LPCSTR szRef, const GUID* pguidRef)
{
392
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
393 394 395

  FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szRef, pguidRef); 

396
  return DXFILEERR_BADVALUE;
397 398 399 400
}

static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData* iface, LPCSTR szName, const GUID* pguid, LPCSTR szMimeType, LPVOID pvData, DWORD cbSize)
{
401
  IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
402

403
  FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This, iface, szName, pguid, szMimeType, pvData, cbSize);
404

405
  return DXFILEERR_BADVALUE;
406 407
}

408
static const IDirectXFileDataVtbl IDirectXFileData_Vtbl =
409 410 411 412 413 414 415 416 417 418 419 420 421 422
{
    IDirectXFileDataImpl_QueryInterface,
    IDirectXFileDataImpl_AddRef,
    IDirectXFileDataImpl_Release,
    IDirectXFileDataImpl_GetName,
    IDirectXFileDataImpl_GetId,
    IDirectXFileDataImpl_GetData,
    IDirectXFileDataImpl_GetType,
    IDirectXFileDataImpl_GetNextObject,
    IDirectXFileDataImpl_AddDataObject,
    IDirectXFileDataImpl_AddDataReference,
    IDirectXFileDataImpl_AddBinaryObject
};

423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
HRESULT IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImpl** ppObj)
{
    IDirectXFileDataReferenceImpl* object;

    TRACE("(%p)\n", ppObj);
      
    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataReferenceImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFileDataReference_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
    return S_OK;
}

439 440 441
/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference* iface, REFIID riid, void** ppvObject)
{
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 449 450 451 452 453 454 455 456 457 458 459 460
      || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference* iface)
{
461
  IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
462
  ULONG ref = InterlockedIncrement(&This->ref);
463

464
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
465

466
  return ref;
467 468 469 470
}

static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference* iface)
{
471
  IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
472
  ULONG ref = InterlockedDecrement(&This->ref);
473

474
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
475

476
  if (!ref)
477 478
    HeapFree(GetProcessHeap(), 0, This);

479
  return ref;
480 481 482 483 484
}

/*** IDirectXFileObject methods ***/
static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataReference* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
{
485
  IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
486 487 488

  FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 

489
  return DXFILEERR_BADVALUE;
490 491 492 493
}

static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference* iface, LPGUID pGuid)
{
494
  IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
495 496 497

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 

498
  return DXFILEERR_BADVALUE;
499 500 501 502 503
}

/*** IDirectXFileDataReference ***/
static HRESULT WINAPI IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference* iface, LPDIRECTXFILEDATA* ppDataObj)
{
504
  IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
505 506 507

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj); 

508
  return DXFILEERR_BADVALUE;
509 510
}

511
static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl =
512 513 514 515 516 517 518 519 520
{
    IDirectXFileDataReferenceImpl_QueryInterface,
    IDirectXFileDataReferenceImpl_AddRef,
    IDirectXFileDataReferenceImpl_Release,
    IDirectXFileDataReferenceImpl_GetName,
    IDirectXFileDataReferenceImpl_GetId,
    IDirectXFileDataReferenceImpl_Resolve
};

521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
HRESULT IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl** ppObj)
{
    IDirectXFileEnumObjectImpl* object;

    TRACE("(%p)\n", ppObj);
      
    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileEnumObjectImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFileEnumObject_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
    return S_OK;
}

537 538 539
/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject* iface, REFIID riid, void** ppvObject)
{
540
  IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
541

542
  TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557

  if (IsEqualGUID(riid, &IID_IUnknown)
      || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject* iface)
{
558
  IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
559
  ULONG ref = InterlockedIncrement(&This->ref);
560

561
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
562

563
  return ref;
564 565 566 567
}

static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* iface)
{
568
  IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
569
  ULONG ref = InterlockedDecrement(&This->ref);
570

571
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
572

573
  if (!ref)
574 575
    HeapFree(GetProcessHeap(), 0, This);

576
  return ref;
577 578 579 580 581
}

/*** IDirectXFileEnumObject methods ***/
static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileEnumObject* iface, LPDIRECTXFILEDATA* ppDataObj)
{
582
  IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
583 584 585 586 587 588 589 590 591 592 593
  IDirectXFileDataImpl* object;
  
  FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj); 

  object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataImpl));

  object->lpVtbl.lpVtbl = &IDirectXFileData_Vtbl;
  object->ref = 1;

  *ppDataObj = (LPDIRECTXFILEDATA)object;

594
  return DXFILEERR_BADVALUE;
595 596 597 598
}

static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject* iface, REFGUID rguid, LPDIRECTXFILEDATA* ppDataObj)
{
599
  IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
600 601 602

  FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, rguid, ppDataObj); 

603
  return DXFILEERR_BADVALUE;
604 605 606 607
}

static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject* iface, LPCSTR szName, LPDIRECTXFILEDATA* ppDataObj)
{
608
  IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
609 610 611

  FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szName, ppDataObj); 

612
  return DXFILEERR_BADVALUE;
613 614
}

615
static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl =
616 617 618 619 620 621 622 623 624
{
    IDirectXFileEnumObjectImpl_QueryInterface,
    IDirectXFileEnumObjectImpl_AddRef,
    IDirectXFileEnumObjectImpl_Release,
    IDirectXFileEnumObjectImpl_GetNextDataObject,
    IDirectXFileEnumObjectImpl_GetDataObjectById,
    IDirectXFileEnumObjectImpl_GetDataObjectByName
};

625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
HRESULT IDirectXFileObjectImpl_Create(IDirectXFileObjectImpl** ppObj)
{
    IDirectXFileObjectImpl* object;

    TRACE("(%p)\n", ppObj);
      
    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileObjectImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFileObject_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
    return S_OK;
}

641 642 643
/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileObjectImpl_QueryInterface(IDirectXFileObject* iface, REFIID riid, void** ppvObject)
{
644
  IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
645

646
  TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661

  if (IsEqualGUID(riid, &IID_IUnknown)
      || IsEqualGUID(riid, &IID_IDirectXFileObject))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileObjectImpl_AddRef(IDirectXFileObject* iface)
{
662
  IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
663
  ULONG ref = InterlockedIncrement(&This->ref);
664

665
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
666

667
  return ref;
668 669 670 671
}

static ULONG WINAPI IDirectXFileObjectImpl_Release(IDirectXFileObject* iface)
{
672
  IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
673
  ULONG ref = InterlockedDecrement(&This->ref);
674

675
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
676

677
  if (!ref)
678 679
    HeapFree(GetProcessHeap(), 0, This);

680
  return ref;
681 682 683 684 685
}

/*** IDirectXFileObject methods ***/
static HRESULT WINAPI IDirectXFileObjectImpl_GetName(IDirectXFileObject* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
{
686
  IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
687 688 689

  FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen); 

690
  return DXFILEERR_BADVALUE;
691 692 693 694
}

static HRESULT WINAPI IDirectXFileObjectImpl_GetId(IDirectXFileObject* iface, LPGUID pGuid)
{
695
  IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
696 697 698

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid); 

699
  return DXFILEERR_BADVALUE;
700 701
}

702
static const IDirectXFileObjectVtbl IDirectXFileObject_Vtbl =
703 704 705 706 707 708 709 710
{
    IDirectXFileObjectImpl_QueryInterface,
    IDirectXFileObjectImpl_AddRef,
    IDirectXFileObjectImpl_Release,
    IDirectXFileObjectImpl_GetName,
    IDirectXFileObjectImpl_GetId
};

711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
HRESULT IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl** ppObj)
{
    IDirectXFileSaveObjectImpl* object;

    TRACE("(%p)\n", ppObj);

    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileSaveObjectImpl));
    
    object->lpVtbl.lpVtbl = &IDirectXFileSaveObject_Vtbl;
    object->ref = 1;

    *ppObj = object;
    
    return S_OK;
}

727 728 729
/*** IUnknown methods ***/
static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject* iface, REFIID riid, void** ppvObject)
{
730
  IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
731

732
  TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
733 734 735 736 737 738 739 740 741 742 743 744 745 746 747

  if (IsEqualGUID(riid, &IID_IUnknown)
      || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
  {
    IClassFactory_AddRef(iface);
    *ppvObject = This;
    return S_OK;
  }

  ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
  return E_NOINTERFACE;
}

static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject* iface)
{
748
  IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
749
  ULONG ref = InterlockedIncrement(&This->ref);
750

751
  TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
752

753
  return ref;
754 755 756 757
}

static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject* iface)
{
758
  IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
759
  ULONG ref = InterlockedDecrement(&This->ref);
760

761
  TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
762

763
  if (!ref)
764 765
    HeapFree(GetProcessHeap(), 0, This);

766
  return ref;
767 768 769 770
}

static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject* iface, DWORD cTemplates, const GUID** ppguidTemplates)
{
771
  IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
772

773
  FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, cTemplates, ppguidTemplates);
774

775
  return DXFILEERR_BADVALUE;
776 777 778 779
}

static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject* iface, REFGUID rguidTemplate, LPCSTR szName, const GUID* pguid, DWORD cbSize, LPVOID pvData, LPDIRECTXFILEDATA* ppDataObj)
{
780
  IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
781

782
  FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This, iface, rguidTemplate, szName, pguid, cbSize, pvData, ppDataObj);
783

784
  return DXFILEERR_BADVALUE;
785 786 787 788
}

static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject* iface, LPDIRECTXFILEDATA ppDataObj)
{
789
  IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
790 791 792

  FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj); 

793
  return DXFILEERR_BADVALUE;
794 795
}

796
static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl =
797 798 799 800 801 802 803 804
{
    IDirectXFileSaveObjectImpl_QueryInterface,
    IDirectXFileSaveObjectImpl_AddRef,
    IDirectXFileSaveObjectImpl_Release,
    IDirectXFileSaveObjectImpl_SaveTemplates,
    IDirectXFileSaveObjectImpl_CreateDataObject,
    IDirectXFileSaveObjectImpl_SaveData
};