oleaut32: Improve the LHashValOfNameSys() documentation a bit.
[wine/multimedia.git] / dlls / d3dxof / d3dxof.c
blobade39e4cc81c7a7c45bcf83989e45801340d3f1f
1 /*
2 * Implementation of DirectX File Interfaces
4 * Copyright 2004, 2008 Christian Costa
6 * This file contains the (internal) driver registration functions,
7 * driver enumeration APIs and DirectDraw creation functions.
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.
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.
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
24 #include "config.h"
25 #include "wine/debug.h"
27 #define COBJMACROS
29 #include "winbase.h"
30 #include "wingdi.h"
32 #include "d3dxof_private.h"
33 #include "dxfile.h"
35 #include <stdio.h>
37 WINE_DEFAULT_DEBUG_CHANNEL(d3dxof);
39 #define MAKEFOUR(a,b,c,d) ((DWORD)a + ((DWORD)b << 8) + ((DWORD)c << 16) + ((DWORD)d << 24))
40 #define XOFFILE_FORMAT_MAGIC MAKEFOUR('x','o','f',' ')
41 #define XOFFILE_FORMAT_VERSION MAKEFOUR('0','3','0','2')
42 #define XOFFILE_FORMAT_BINARY MAKEFOUR('b','i','n',' ')
43 #define XOFFILE_FORMAT_TEXT MAKEFOUR('t','x','t',' ')
44 #define XOFFILE_FORMAT_COMPRESSED MAKEFOUR('c','m','p',' ')
45 #define XOFFILE_FORMAT_FLOAT_BITS_32 MAKEFOUR('0','0','3','2')
46 #define XOFFILE_FORMAT_FLOAT_BITS_64 MAKEFOUR('0','0','6','4')
48 #define TOKEN_NAME 1
49 #define TOKEN_STRING 2
50 #define TOKEN_INTEGER 3
51 #define TOKEN_GUID 5
52 #define TOKEN_INTEGER_LIST 6
53 #define TOKEN_FLOAT_LIST 7
54 #define TOKEN_OBRACE 10
55 #define TOKEN_CBRACE 11
56 #define TOKEN_OPAREN 12
57 #define TOKEN_CPAREN 13
58 #define TOKEN_OBRACKET 14
59 #define TOKEN_CBRACKET 15
60 #define TOKEN_OANGLE 16
61 #define TOKEN_CANGLE 17
62 #define TOKEN_DOT 18
63 #define TOKEN_COMMA 19
64 #define TOKEN_SEMICOLON 20
65 #define TOKEN_TEMPLATE 31
66 #define TOKEN_WORD 40
67 #define TOKEN_DWORD 41
68 #define TOKEN_FLOAT 42
69 #define TOKEN_DOUBLE 43
70 #define TOKEN_CHAR 44
71 #define TOKEN_UCHAR 45
72 #define TOKEN_SWORD 46
73 #define TOKEN_SDWORD 47
74 #define TOKEN_VOID 48
75 #define TOKEN_LPSTR 49
76 #define TOKEN_UNICODE 50
77 #define TOKEN_CSTRING 51
78 #define TOKEN_ARRAY 52
80 #define CLSIDFMT "<%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X>"
82 typedef struct {
83 /* Buffer to parse */
84 LPBYTE buffer;
85 DWORD rem_bytes;
86 /* Misc info */
87 BOOL txt;
88 BYTE value[100];
89 IDirectXFileImpl* pdxf;
90 } parse_buffer;
92 static const struct IDirectXFileVtbl IDirectXFile_Vtbl;
93 static const struct IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl;
94 static const struct IDirectXFileDataVtbl IDirectXFileData_Vtbl;
95 static const struct IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl;
96 static const struct IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl;
97 static const struct IDirectXFileObjectVtbl IDirectXFileObject_Vtbl;
98 static const struct IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl;
100 HRESULT IDirectXFileImpl_Create(IUnknown* pUnkOuter, LPVOID* ppObj)
102 IDirectXFileImpl* object;
104 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
106 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileImpl));
108 object->lpVtbl.lpVtbl = &IDirectXFile_Vtbl;
109 object->ref = 1;
111 *ppObj = object;
113 return S_OK;
116 /*** IUnknown methods ***/
117 static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile* iface, REFIID riid, void** ppvObject)
119 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
121 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
123 if (IsEqualGUID(riid, &IID_IUnknown)
124 || IsEqualGUID(riid, &IID_IDirectXFile))
126 IClassFactory_AddRef(iface);
127 *ppvObject = This;
128 return S_OK;
131 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
132 return E_NOINTERFACE;
135 static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile* iface)
137 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
138 ULONG ref = InterlockedIncrement(&This->ref);
140 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
142 return ref;
145 static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile* iface)
147 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
148 ULONG ref = InterlockedDecrement(&This->ref);
150 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
152 if (!ref)
153 HeapFree(GetProcessHeap(), 0, This);
155 return ref;
158 /*** IDirectXFile methods ***/
159 static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPVOID pvSource, DXFILELOADOPTIONS dwLoadOptions, LPDIRECTXFILEENUMOBJECT* ppEnumObj)
161 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
162 IDirectXFileEnumObjectImpl* object;
163 HRESULT hr;
165 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
167 if (dwLoadOptions == DXFILELOAD_FROMFILE)
169 HANDLE hFile;
170 TRACE("Open source file '%s'\n", (char*)pvSource);
171 hFile = CreateFileA((char*)pvSource, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
172 if (hFile == INVALID_HANDLE_VALUE)
174 TRACE("File '%s' not found\n", (char*)pvSource);
175 return DXFILEERR_FILENOTFOUND;
177 CloseHandle(hFile);
179 else
181 FIXME("Source type %d is not handled yet\n", dwLoadOptions);
184 hr = IDirectXFileEnumObjectImpl_Create(&object);
185 if (!SUCCEEDED(hr))
186 return hr;
188 *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;
190 return DXFILE_OK;
193 static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
195 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
197 FIXME("(%p/%p)->(%s,%x,%p) stub!\n", This, iface, szFileName, dwFileFormat, ppSaveObj);
199 return DXFILEERR_BADVALUE;
202 static BOOL read_bytes(parse_buffer * buf, LPVOID data, DWORD size)
204 if (buf->rem_bytes < size)
205 return FALSE;
206 memcpy(data, buf->buffer, size);
207 buf->buffer += size;
208 buf->rem_bytes -= size;
209 return TRUE;
212 static void dump_TOKEN(WORD token)
214 #define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
215 switch(token)
217 DUMP_TOKEN(TOKEN_NAME);
218 DUMP_TOKEN(TOKEN_STRING);
219 DUMP_TOKEN(TOKEN_INTEGER);
220 DUMP_TOKEN(TOKEN_GUID);
221 DUMP_TOKEN(TOKEN_INTEGER_LIST);
222 DUMP_TOKEN(TOKEN_FLOAT_LIST);
223 DUMP_TOKEN(TOKEN_OBRACE);
224 DUMP_TOKEN(TOKEN_CBRACE);
225 DUMP_TOKEN(TOKEN_OPAREN);
226 DUMP_TOKEN(TOKEN_CPAREN);
227 DUMP_TOKEN(TOKEN_OBRACKET);
228 DUMP_TOKEN(TOKEN_CBRACKET);
229 DUMP_TOKEN(TOKEN_OANGLE);
230 DUMP_TOKEN(TOKEN_CANGLE);
231 DUMP_TOKEN(TOKEN_DOT);
232 DUMP_TOKEN(TOKEN_COMMA);
233 DUMP_TOKEN(TOKEN_SEMICOLON);
234 DUMP_TOKEN(TOKEN_TEMPLATE);
235 DUMP_TOKEN(TOKEN_WORD);
236 DUMP_TOKEN(TOKEN_DWORD);
237 DUMP_TOKEN(TOKEN_FLOAT);
238 DUMP_TOKEN(TOKEN_DOUBLE);
239 DUMP_TOKEN(TOKEN_CHAR);
240 DUMP_TOKEN(TOKEN_UCHAR);
241 DUMP_TOKEN(TOKEN_SWORD);
242 DUMP_TOKEN(TOKEN_SDWORD);
243 DUMP_TOKEN(TOKEN_VOID);
244 DUMP_TOKEN(TOKEN_LPSTR);
245 DUMP_TOKEN(TOKEN_UNICODE);
246 DUMP_TOKEN(TOKEN_CSTRING);
247 DUMP_TOKEN(TOKEN_ARRAY);
248 default:
249 if (0)
250 TRACE("Unknown token %d\n", token);
251 break;
253 #undef DUMP_TOKEN
256 static BOOL is_space(char c)
258 switch (c)
260 case 0x00:
261 case 0x0D:
262 case 0x0A:
263 case ' ':
264 case '\t':
265 return TRUE;
267 return FALSE;
270 static BOOL is_operator(char c)
272 switch(c)
274 case '{':
275 case '}':
276 case '[':
277 case ']':
278 case '(':
279 case ')':
280 case '<':
281 case '>':
282 case ',':
283 case ';':
284 return TRUE;
286 return FALSE;
289 static inline BOOL is_separator(char c)
291 return is_space(c) || is_operator(c);
294 static WORD get_operator_token(char c)
296 switch(c)
298 case '{':
299 return TOKEN_OBRACE;
300 case '}':
301 return TOKEN_CBRACE;
302 case '[':
303 return TOKEN_OBRACKET;
304 case ']':
305 return TOKEN_CBRACKET;
306 case '(':
307 return TOKEN_OPAREN;
308 case ')':
309 return TOKEN_CPAREN;
310 case '<':
311 return TOKEN_OANGLE;
312 case '>':
313 return TOKEN_CANGLE;
314 case ',':
315 return TOKEN_COMMA;
316 case ';':
317 return TOKEN_SEMICOLON;
319 return 0;
322 static BOOL is_keyword(parse_buffer* buf, const char* keyword)
324 DWORD len = strlen(keyword);
325 if (!strncmp((char*)buf->buffer, keyword,len) && is_separator(*(buf->buffer+len)))
327 buf->buffer += len;
328 buf->rem_bytes -= len;
329 return TRUE;
331 return FALSE;
334 static WORD get_keyword_token(parse_buffer* buf)
336 if (is_keyword(buf, "template"))
337 return TOKEN_TEMPLATE;
338 if (is_keyword(buf, "WORD"))
339 return TOKEN_WORD;
340 if (is_keyword(buf, "DWORD"))
341 return TOKEN_DWORD;
342 if (is_keyword(buf, "FLOAT"))
343 return TOKEN_FLOAT;
344 if (is_keyword(buf, "DOUBLE"))
345 return TOKEN_DOUBLE;
346 if (is_keyword(buf, "CHAR"))
347 return TOKEN_CHAR;
348 if (is_keyword(buf, "UCHAR"))
349 return TOKEN_UCHAR;
350 if (is_keyword(buf, "SWORD"))
351 return TOKEN_SWORD;
352 if (is_keyword(buf, "SDWORD"))
353 return TOKEN_SDWORD;
354 if (is_keyword(buf, "VOID"))
355 return TOKEN_VOID;
356 if (is_keyword(buf, "STRING"))
357 return TOKEN_LPSTR;
358 if (is_keyword(buf, "UNICODE"))
359 return TOKEN_UNICODE;
360 if (is_keyword(buf, "CSTRING"))
361 return TOKEN_CSTRING;
362 if (is_keyword(buf, "array"))
363 return TOKEN_ARRAY;
365 return 0;
368 static BOOL is_guid(parse_buffer* buf)
370 char tmp[50];
371 DWORD pos = 1;
372 GUID class_id;
373 DWORD tab[10];
374 int ret;
376 if (*buf->buffer != '<')
377 return FALSE;
378 tmp[0] = '<';
379 while (*(buf->buffer+pos) != '>')
381 tmp[pos] = *(buf->buffer+pos);
382 pos++;
384 tmp[pos++] = '>';
385 tmp[pos] = 0;
386 if (pos != 38 /* <+36+> */)
388 TRACE("Wrong guid %s (%d)\n", tmp, pos);
389 return FALSE;
391 buf->buffer += pos;
392 buf->rem_bytes -= pos;
394 ret = sscanf(tmp, CLSIDFMT, &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
395 if (ret != 11)
397 TRACE("Wrong guid %s (%d)\n", tmp, pos);
398 return FALSE;
400 TRACE("Found guid %s (%d)\n", tmp, pos);
402 class_id.Data2 = tab[0];
403 class_id.Data3 = tab[1];
404 class_id.Data4[0] = tab[2];
405 class_id.Data4[1] = tab[3];
406 class_id.Data4[2] = tab[4];
407 class_id.Data4[3] = tab[5];
408 class_id.Data4[4] = tab[6];
409 class_id.Data4[5] = tab[7];
410 class_id.Data4[6] = tab[8];
411 class_id.Data4[7] = tab[9];
413 *(GUID*)buf->value = class_id;
415 return TRUE;
418 static BOOL is_name(parse_buffer* buf)
420 char tmp[50];
421 DWORD pos = 0;
422 char c;
423 BOOL error = 0;
424 while (!is_separator(c = *(buf->buffer+pos)))
426 if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9'))))
427 error = 1;
428 tmp[pos++] = c;
430 tmp[pos] = 0;
432 if (error)
434 TRACE("Wrong name %s\n", tmp);
435 return FALSE;
438 buf->buffer += pos;
439 buf->rem_bytes -= pos;
441 TRACE("Found name %s\n", tmp);
442 strcpy((char*)buf->value, tmp);
444 return TRUE;
447 static BOOL is_integer(parse_buffer* buf)
449 char tmp[50];
450 DWORD pos = 0;
451 char c;
452 DWORD integer;
454 while (!is_separator(c = *(buf->buffer+pos)))
456 if (!((c >= '0') && (c <= '9')))
457 return FALSE;
458 tmp[pos++] = c;
460 tmp[pos] = 0;
462 buf->buffer += pos;
463 buf->rem_bytes -= pos;
465 sscanf(tmp, "%d", &integer);
467 TRACE("Found integer %s - %d\n", tmp, integer);
469 *(WORD*)buf->value = integer;
471 return TRUE;
474 static WORD parse_TOKEN_dbg_opt(parse_buffer * buf, BOOL show_token)
476 WORD token;
478 if (buf->txt)
480 while(1)
482 char c;
483 if (!read_bytes(buf, &c, 1))
484 return 0;
485 /*TRACE("char = '%c'\n", is_space(c) ? ' ' : c);*/
486 if (is_space(c))
487 continue;
488 if (is_operator(c) && (c != '<'))
490 token = get_operator_token(c);
491 break;
493 else if (c == '.')
495 token = TOKEN_DOT;
496 break;
498 else
500 buf->buffer -= 1;
501 buf->rem_bytes += 1;
503 if ((token = get_keyword_token(buf)))
504 break;
506 if (is_guid(buf))
508 token = TOKEN_GUID;
509 break;
511 if (is_integer(buf))
513 token = TOKEN_INTEGER;
514 break;
516 if (is_name(buf))
518 token = TOKEN_NAME;
519 break;
522 FIXME("Unrecognize element\n");
523 return 0;
527 else
529 if (!read_bytes(buf, &token, 2))
530 return 0;
533 switch(token)
535 case TOKEN_NAME:
536 case TOKEN_STRING:
537 case TOKEN_INTEGER:
538 case TOKEN_GUID:
539 case TOKEN_INTEGER_LIST:
540 case TOKEN_FLOAT_LIST:
541 case TOKEN_OBRACE:
542 case TOKEN_CBRACE:
543 case TOKEN_OPAREN:
544 case TOKEN_CPAREN:
545 case TOKEN_OBRACKET:
546 case TOKEN_CBRACKET:
547 case TOKEN_OANGLE:
548 case TOKEN_CANGLE:
549 case TOKEN_DOT:
550 case TOKEN_COMMA:
551 case TOKEN_SEMICOLON:
552 case TOKEN_TEMPLATE:
553 case TOKEN_WORD:
554 case TOKEN_DWORD:
555 case TOKEN_FLOAT:
556 case TOKEN_DOUBLE:
557 case TOKEN_CHAR:
558 case TOKEN_UCHAR:
559 case TOKEN_SWORD:
560 case TOKEN_SDWORD:
561 case TOKEN_VOID:
562 case TOKEN_LPSTR:
563 case TOKEN_UNICODE:
564 case TOKEN_CSTRING:
565 case TOKEN_ARRAY:
566 break;
567 default:
568 return 0;
571 if (show_token)
572 dump_TOKEN(token);
574 return token;
577 static const char* get_primitive_string(WORD token)
579 switch(token)
581 case TOKEN_WORD:
582 return "WORD";
583 case TOKEN_DWORD:
584 return "DWORD";
585 case TOKEN_FLOAT:
586 return "FLOAT";
587 case TOKEN_DOUBLE:
588 return "DOUBLE";
589 case TOKEN_CHAR:
590 return "CHAR";
591 case TOKEN_UCHAR:
592 return "UCHAR";
593 case TOKEN_SWORD:
594 return "SWORD";
595 case TOKEN_SDWORD:
596 return "SDWORD";
597 case TOKEN_VOID:
598 return "VOID";
599 case TOKEN_LPSTR:
600 return "STRING";
601 case TOKEN_UNICODE:
602 return "UNICODE";
603 case TOKEN_CSTRING:
604 return "CSTRING ";
605 default:
606 break;
608 return NULL;
611 static inline WORD parse_TOKEN(parse_buffer * buf)
613 return parse_TOKEN_dbg_opt(buf, TRUE);
616 static WORD check_TOKEN(parse_buffer * buf)
618 WORD token;
620 if (buf->txt)
622 parse_buffer save = *buf;
623 /*TRACE("check: ");*/
624 token = parse_TOKEN_dbg_opt(buf, FALSE);
625 *buf = save;
626 return token;
629 if (!read_bytes(buf, &token, 2))
630 return 0;
631 buf->buffer -= 2;
632 buf->rem_bytes += 2;
633 if (0)
635 TRACE("check: ");
636 dump_TOKEN(token);
638 return token;
641 static inline BOOL is_primitive_type(WORD token)
643 BOOL ret;
644 switch(token)
646 case TOKEN_WORD:
647 case TOKEN_DWORD:
648 case TOKEN_FLOAT:
649 case TOKEN_DOUBLE:
650 case TOKEN_CHAR:
651 case TOKEN_UCHAR:
652 case TOKEN_SWORD:
653 case TOKEN_SDWORD:
654 case TOKEN_LPSTR:
655 case TOKEN_UNICODE:
656 case TOKEN_CSTRING:
657 ret = 1;
658 break;
659 default:
660 ret = 0;
661 break;
663 return ret;
666 static BOOL parse_name(parse_buffer * buf)
668 DWORD count;
669 char strname[100];
671 if (parse_TOKEN(buf) != TOKEN_NAME)
672 return FALSE;
673 if (buf->txt)
674 return TRUE;
675 if (!read_bytes(buf, &count, 4))
676 return FALSE;
677 if (!read_bytes(buf, strname, count))
678 return FALSE;
679 strname[count] = 0;
680 /*TRACE("name = %s\n", strname);*/
682 strcpy((char*)buf->value, strname);
684 return TRUE;
687 static BOOL parse_class_id(parse_buffer * buf)
689 char strguid[38];
690 GUID class_id;
692 if (parse_TOKEN(buf) != TOKEN_GUID)
693 return FALSE;
694 if (buf->txt)
695 return TRUE;
696 if (!read_bytes(buf, &class_id, 16))
697 return FALSE;
698 sprintf(strguid, CLSIDFMT, class_id.Data1, class_id.Data2, class_id.Data3, class_id.Data4[0],
699 class_id.Data4[1], class_id.Data4[2], class_id.Data4[3], class_id.Data4[4], class_id.Data4[5], class_id.Data4[6], class_id.Data4[7]);
700 /*TRACE("guid = {%s}\n", strguid);*/
702 *(GUID*)buf->value = class_id;
704 return TRUE;
707 static BOOL parse_integer(parse_buffer * buf)
709 DWORD integer;
711 if (parse_TOKEN(buf) != TOKEN_INTEGER)
712 return FALSE;
713 if (buf->txt)
714 return TRUE;
715 if (!read_bytes(buf, &integer, 4))
716 return FALSE;
717 /*TRACE("integer = %ld\n", integer);*/
719 *(DWORD*)buf->value = integer;
721 return TRUE;
724 static BOOL parse_template_option_info(parse_buffer * buf)
726 xtemplate* cur_template = &buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates];
728 if (check_TOKEN(buf) == TOKEN_DOT)
730 parse_TOKEN(buf);
731 if (parse_TOKEN(buf) != TOKEN_DOT)
732 return FALSE;
733 if (parse_TOKEN(buf) != TOKEN_DOT)
734 return FALSE;
735 cur_template->open = TRUE;
737 else
739 while (1)
741 if (!parse_name(buf))
742 return FALSE;
743 strcpy(cur_template->childs[cur_template->nb_childs], (char*)buf->value);
744 if (check_TOKEN(buf) == TOKEN_GUID)
745 if (!parse_class_id(buf))
746 return FALSE;
747 cur_template->nb_childs++;
748 if (check_TOKEN(buf) != TOKEN_COMMA)
749 break;
750 parse_TOKEN(buf);
752 cur_template->open = FALSE;
755 return TRUE;
758 static BOOL parse_template_members_list(parse_buffer * buf)
760 parse_buffer save1;
761 int idx_member = 0;
762 member* cur_member;
764 while (1)
766 cur_member = &buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].members[idx_member];
767 save1 = *buf;
769 if (check_TOKEN(buf) == TOKEN_NAME)
771 if (!parse_name(buf))
772 break;
773 while (cur_member->idx_template < buf->pdxf->nb_xtemplates)
775 if (!strcmp((char*)buf->value, buf->pdxf->xtemplates[cur_member->idx_template].name))
776 break;
777 cur_member->idx_template++;
779 if (cur_member->idx_template == buf->pdxf->nb_xtemplates)
781 TRACE("Reference to a nonexistent template '%s'\n", (char*)buf->value);
782 return FALSE;
784 if (check_TOKEN(buf) == TOKEN_NAME)
785 if (!parse_name(buf))
786 break;
787 if (parse_TOKEN(buf) != TOKEN_SEMICOLON)
788 break;
789 cur_member->type = TOKEN_NAME;
790 strcpy(cur_member->name, (char*)buf->value);
791 idx_member++;
793 else if (check_TOKEN(buf) == TOKEN_ARRAY)
795 parse_buffer save2;
796 WORD token;
797 int nb_dims = 0;
799 parse_TOKEN(buf);
800 token = check_TOKEN(buf);
801 if (is_primitive_type(token))
803 parse_TOKEN(buf);
804 cur_member->type = token;
806 else
808 if (!parse_name(buf))
809 break;
810 cur_member->type = TOKEN_NAME;
811 cur_member->idx_template = 0;
812 while (cur_member->idx_template < buf->pdxf->nb_xtemplates)
814 if (!strcmp((char*)buf->value, buf->pdxf->xtemplates[cur_member->idx_template].name))
815 break;
816 cur_member->idx_template++;
818 if (cur_member->idx_template == buf->pdxf->nb_xtemplates)
820 TRACE("Reference to nonexistent template '%s'\n", (char*)buf->value);
821 return FALSE;
824 if (!parse_name(buf))
825 break;
826 strcpy(cur_member->name, (char*)buf->value);
827 save2 = *buf;
828 while (check_TOKEN(buf) == TOKEN_OBRACKET)
830 if (nb_dims)
832 FIXME("No support for multi-dimensional array yet\n");
833 return FALSE;
835 parse_TOKEN(buf);
836 if (check_TOKEN(buf) == TOKEN_INTEGER)
838 if (!parse_integer(buf))
839 break;
840 cur_member->dim_fixed[nb_dims] = TRUE;
841 cur_member->dim_value[nb_dims] = *(DWORD*)buf->value;
843 else
845 if (!parse_name(buf))
846 break;
847 cur_member->dim_fixed[nb_dims] = FALSE;
848 /* Hack: Assume array size is specified in previous member */
849 cur_member->dim_value[nb_dims] = idx_member - 1;
851 if (parse_TOKEN(buf) != TOKEN_CBRACKET)
852 break;
853 save2 = *buf;
854 nb_dims++;
856 *buf = save2;
857 if (parse_TOKEN(buf) != TOKEN_SEMICOLON)
858 break;
859 cur_member->nb_dims = nb_dims;
860 idx_member++;
862 else if (is_primitive_type(check_TOKEN(buf)))
864 cur_member->type = check_TOKEN(buf);
865 parse_TOKEN(buf);
866 if (check_TOKEN(buf) == TOKEN_NAME)
867 if (!parse_name(buf))
868 break;
869 strcpy(cur_member->name, (char*)buf->value);
870 if (parse_TOKEN(buf) != TOKEN_SEMICOLON)
871 break;
872 idx_member++;
874 else
875 break;
878 *buf = save1;
879 buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].nb_members = idx_member;
881 return TRUE;
884 static BOOL parse_template_parts(parse_buffer * buf)
886 if (check_TOKEN(buf) == TOKEN_OBRACKET)
888 parse_TOKEN(buf);
889 if (!parse_template_option_info(buf))
890 return FALSE;
891 if (parse_TOKEN(buf) != TOKEN_CBRACKET)
892 return FALSE;
894 else
896 if (!parse_template_members_list(buf))
897 return FALSE;
898 if (check_TOKEN(buf) == TOKEN_OBRACKET)
900 parse_TOKEN(buf);
901 if (!parse_template_option_info(buf))
902 return FALSE;
903 if (parse_TOKEN(buf) != TOKEN_CBRACKET)
904 return FALSE;
908 return TRUE;
911 static BOOL parse_template(parse_buffer * buf)
913 if (parse_TOKEN(buf) != TOKEN_TEMPLATE)
914 return FALSE;
915 if (!parse_name(buf))
916 return FALSE;
917 strcpy(buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name, (char*)buf->value);
918 if (parse_TOKEN(buf) != TOKEN_OBRACE)
919 return FALSE;
920 if (!parse_class_id(buf))
921 return FALSE;
922 buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id = *(GUID*)buf->value;
923 if (!parse_template_parts(buf))
924 return FALSE;
925 if (parse_TOKEN(buf) != TOKEN_CBRACE)
926 return FALSE;
927 if (buf->txt)
929 /* Go to the next template */
930 while (buf->rem_bytes && is_space(*buf->buffer))
932 buf->buffer++;
933 buf->rem_bytes--;
937 TRACE("%d - %s - %s\n", buf->pdxf->nb_xtemplates, buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name, debugstr_guid(&buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id));
938 buf->pdxf->nb_xtemplates++;
940 return TRUE;
943 static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LPVOID pvData, DWORD cbSize)
945 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
946 DWORD token_header;
947 parse_buffer buf;
949 buf.buffer = (LPBYTE)pvData;
950 buf.rem_bytes = cbSize;
951 buf.txt = FALSE;
952 buf.pdxf = This;
954 FIXME("(%p/%p)->(%p,%d) partial stub!\n", This, iface, pvData, cbSize);
956 if (!pvData)
957 return DXFILEERR_BADVALUE;
959 if (cbSize < 16)
960 return DXFILEERR_BADFILETYPE;
962 if (TRACE_ON(d3dxof))
964 char string[17];
965 memcpy(string, pvData, 16);
966 string[16] = 0;
967 TRACE("header = '%s'\n", string);
970 read_bytes(&buf, &token_header, 4);
972 if (token_header != XOFFILE_FORMAT_MAGIC)
973 return DXFILEERR_BADFILETYPE;
975 read_bytes(&buf, &token_header, 4);
977 if (token_header != XOFFILE_FORMAT_VERSION)
978 return DXFILEERR_BADFILEVERSION;
980 read_bytes(&buf, &token_header, 4);
982 if ((token_header != XOFFILE_FORMAT_BINARY) && (token_header != XOFFILE_FORMAT_TEXT) && (token_header != XOFFILE_FORMAT_COMPRESSED))
983 return DXFILEERR_BADFILETYPE;
985 if (token_header == XOFFILE_FORMAT_TEXT)
987 buf.txt = TRUE;
990 if (token_header == XOFFILE_FORMAT_COMPRESSED)
992 FIXME("Compressed formats not supported yet\n");
993 return DXFILEERR_BADVALUE;
996 read_bytes(&buf, &token_header, 4);
998 if ((token_header != XOFFILE_FORMAT_FLOAT_BITS_32) && (token_header != XOFFILE_FORMAT_FLOAT_BITS_64))
999 return DXFILEERR_BADFILEFLOATSIZE;
1001 TRACE("Header is correct\n");
1003 while (buf.rem_bytes)
1005 if (!parse_template(&buf))
1007 TRACE("Template is not correct\n");
1008 return DXFILEERR_BADVALUE;
1010 else
1012 TRACE("Template successfully parsed:\n");
1013 if (TRACE_ON(d3dxof))
1015 int i,j,k;
1016 GUID* clsid;
1018 i = This->nb_xtemplates - 1;
1019 clsid = &This->xtemplates[i].class_id;
1021 DPRINTF("template %s\n", This->xtemplates[i].name);
1022 DPRINTF("{\n");
1023 DPRINTF(CLSIDFMT "\n", clsid->Data1, clsid->Data2, clsid->Data3, clsid->Data4[0],
1024 clsid->Data4[1], clsid->Data4[2], clsid->Data4[3], clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7]);
1025 for (j = 0; j < This->xtemplates[i].nb_members; j++)
1027 if (This->xtemplates[i].members[j].nb_dims)
1028 DPRINTF("array ");
1029 if (This->xtemplates[i].members[j].type == TOKEN_NAME)
1030 DPRINTF("%s ", This->xtemplates[This->xtemplates[i].members[j].idx_template].name);
1031 else
1032 DPRINTF("%s ", get_primitive_string(This->xtemplates[i].members[j].type));
1033 DPRINTF("%s", This->xtemplates[i].members[j].name);
1034 for (k = 0; k < This->xtemplates[i].members[j].nb_dims; k++)
1036 if (This->xtemplates[i].members[j].dim_fixed[k])
1037 DPRINTF("[%d]", This->xtemplates[i].members[j].dim_value[k]);
1038 else
1039 DPRINTF("[%s]", This->xtemplates[i].members[This->xtemplates[i].members[j].dim_value[k]].name);
1041 DPRINTF(";\n");
1043 if (This->xtemplates[i].open)
1044 DPRINTF("[...]\n");
1045 else if (This->xtemplates[i].nb_childs)
1047 DPRINTF("[%s", This->xtemplates[i].childs[0]);
1048 for (j = 1; j < This->xtemplates[i].nb_childs; j++)
1049 DPRINTF(",%s", This->xtemplates[i].childs[j]);
1050 DPRINTF("]\n");
1052 DPRINTF("}\n");
1057 if (TRACE_ON(d3dxof))
1059 int i;
1060 TRACE("Registered templates (%d):\n", This->nb_xtemplates);
1061 for (i = 0; i < This->nb_xtemplates; i++)
1062 DPRINTF("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
1065 return DXFILE_OK;
1068 static const IDirectXFileVtbl IDirectXFile_Vtbl =
1070 IDirectXFileImpl_QueryInterface,
1071 IDirectXFileImpl_AddRef,
1072 IDirectXFileImpl_Release,
1073 IDirectXFileImpl_CreateEnumObject,
1074 IDirectXFileImpl_CreateSaveObject,
1075 IDirectXFileImpl_RegisterTemplates
1078 HRESULT IDirectXFileBinaryImpl_Create(IDirectXFileBinaryImpl** ppObj)
1080 IDirectXFileBinaryImpl* object;
1082 TRACE("(%p)\n", ppObj);
1084 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileBinaryImpl));
1086 object->lpVtbl.lpVtbl = &IDirectXFileBinary_Vtbl;
1087 object->ref = 1;
1089 *ppObj = object;
1091 return DXFILE_OK;
1094 /*** IUnknown methods ***/
1095 static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary* iface, REFIID riid, void** ppvObject)
1097 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1099 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1101 if (IsEqualGUID(riid, &IID_IUnknown)
1102 || IsEqualGUID(riid, &IID_IDirectXFileObject)
1103 || IsEqualGUID(riid, &IID_IDirectXFileBinary))
1105 IClassFactory_AddRef(iface);
1106 *ppvObject = This;
1107 return S_OK;
1110 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1111 return E_NOINTERFACE;
1114 static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary* iface)
1116 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1117 ULONG ref = InterlockedIncrement(&This->ref);
1119 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1121 return ref;
1124 static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary* iface)
1126 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1127 ULONG ref = InterlockedDecrement(&This->ref);
1129 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1131 if (!ref)
1132 HeapFree(GetProcessHeap(), 0, This);
1134 return ref;
1137 /*** IDirectXFileObject methods ***/
1138 static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1141 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1143 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1145 return DXFILEERR_BADVALUE;
1148 static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary* iface, LPGUID pGuid)
1150 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1152 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1154 return DXFILEERR_BADVALUE;
1157 /*** IDirectXFileBinary methods ***/
1158 static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary* iface, DWORD* pcbSize)
1160 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1162 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcbSize);
1164 return DXFILEERR_BADVALUE;
1167 static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary* iface, LPCSTR* pszMimeType)
1169 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1171 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pszMimeType);
1173 return DXFILEERR_BADVALUE;
1176 static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary* iface, LPVOID pvData, DWORD cbSize, LPDWORD pcbRead)
1178 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1180 FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This, iface, pvData, cbSize, pcbRead);
1182 return DXFILEERR_BADVALUE;
1185 static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl =
1187 IDirectXFileBinaryImpl_QueryInterface,
1188 IDirectXFileBinaryImpl_AddRef,
1189 IDirectXFileBinaryImpl_Release,
1190 IDirectXFileBinaryImpl_GetName,
1191 IDirectXFileBinaryImpl_GetId,
1192 IDirectXFileBinaryImpl_GetSize,
1193 IDirectXFileBinaryImpl_GetMimeType,
1194 IDirectXFileBinaryImpl_Read
1197 HRESULT IDirectXFileDataImpl_Create(IDirectXFileDataImpl** ppObj)
1199 IDirectXFileDataImpl* object;
1201 TRACE("(%p)\n", ppObj);
1203 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataImpl));
1205 object->lpVtbl.lpVtbl = &IDirectXFileData_Vtbl;
1206 object->ref = 1;
1208 *ppObj = object;
1210 return S_OK;
1213 /*** IUnknown methods ***/
1214 static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData* iface, REFIID riid, void** ppvObject)
1216 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1218 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1220 if (IsEqualGUID(riid, &IID_IUnknown)
1221 || IsEqualGUID(riid, &IID_IDirectXFileObject)
1222 || IsEqualGUID(riid, &IID_IDirectXFileData))
1224 IClassFactory_AddRef(iface);
1225 *ppvObject = This;
1226 return S_OK;
1229 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1230 return E_NOINTERFACE;
1233 static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData* iface)
1235 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1236 ULONG ref = InterlockedIncrement(&This->ref);
1238 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1240 return ref;
1243 static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData* iface)
1245 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1246 ULONG ref = InterlockedDecrement(&This->ref);
1248 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1250 if (!ref)
1251 HeapFree(GetProcessHeap(), 0, This);
1253 return ref;
1256 /*** IDirectXFileObject methods ***/
1257 static HRESULT WINAPI IDirectXFileDataImpl_GetName(IDirectXFileData* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1260 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1262 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1264 return DXFILEERR_BADVALUE;
1267 static HRESULT WINAPI IDirectXFileDataImpl_GetId(IDirectXFileData* iface, LPGUID pGuid)
1269 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1271 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1273 return DXFILEERR_BADVALUE;
1276 /*** IDirectXFileData methods ***/
1277 static HRESULT WINAPI IDirectXFileDataImpl_GetData(IDirectXFileData* iface, LPCSTR szMember, DWORD* pcbSize, void** ppvData)
1279 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1281 FIXME("(%p/%p)->(%s,%p,%p) stub!\n", This, iface, szMember, pcbSize, ppvData);
1283 return DXFILEERR_BADVALUE;
1286 static HRESULT WINAPI IDirectXFileDataImpl_GetType(IDirectXFileData* iface, const GUID** pguid)
1288 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1290 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pguid);
1292 return DXFILEERR_BADVALUE;
1295 static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface, LPDIRECTXFILEOBJECT* ppChildObj)
1297 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1299 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppChildObj);
1301 return DXFILEERR_BADVALUE;
1304 static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData* iface, LPDIRECTXFILEDATA pDataObj)
1306 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1308 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDataObj);
1310 return DXFILEERR_BADVALUE;
1313 static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData* iface, LPCSTR szRef, const GUID* pguidRef)
1315 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1317 FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szRef, pguidRef);
1319 return DXFILEERR_BADVALUE;
1322 static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData* iface, LPCSTR szName, const GUID* pguid, LPCSTR szMimeType, LPVOID pvData, DWORD cbSize)
1324 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1326 FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This, iface, szName, pguid, szMimeType, pvData, cbSize);
1328 return DXFILEERR_BADVALUE;
1331 static const IDirectXFileDataVtbl IDirectXFileData_Vtbl =
1333 IDirectXFileDataImpl_QueryInterface,
1334 IDirectXFileDataImpl_AddRef,
1335 IDirectXFileDataImpl_Release,
1336 IDirectXFileDataImpl_GetName,
1337 IDirectXFileDataImpl_GetId,
1338 IDirectXFileDataImpl_GetData,
1339 IDirectXFileDataImpl_GetType,
1340 IDirectXFileDataImpl_GetNextObject,
1341 IDirectXFileDataImpl_AddDataObject,
1342 IDirectXFileDataImpl_AddDataReference,
1343 IDirectXFileDataImpl_AddBinaryObject
1346 HRESULT IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImpl** ppObj)
1348 IDirectXFileDataReferenceImpl* object;
1350 TRACE("(%p)\n", ppObj);
1352 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataReferenceImpl));
1354 object->lpVtbl.lpVtbl = &IDirectXFileDataReference_Vtbl;
1355 object->ref = 1;
1357 *ppObj = object;
1359 return S_OK;
1362 /*** IUnknown methods ***/
1363 static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference* iface, REFIID riid, void** ppvObject)
1365 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1367 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1369 if (IsEqualGUID(riid, &IID_IUnknown)
1370 || IsEqualGUID(riid, &IID_IDirectXFileObject)
1371 || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
1373 IClassFactory_AddRef(iface);
1374 *ppvObject = This;
1375 return S_OK;
1378 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1379 return E_NOINTERFACE;
1382 static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference* iface)
1384 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1385 ULONG ref = InterlockedIncrement(&This->ref);
1387 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1389 return ref;
1392 static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference* iface)
1394 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1395 ULONG ref = InterlockedDecrement(&This->ref);
1397 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1399 if (!ref)
1400 HeapFree(GetProcessHeap(), 0, This);
1402 return ref;
1405 /*** IDirectXFileObject methods ***/
1406 static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataReference* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1408 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1410 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1412 return DXFILEERR_BADVALUE;
1415 static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference* iface, LPGUID pGuid)
1417 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1419 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1421 return DXFILEERR_BADVALUE;
1424 /*** IDirectXFileDataReference ***/
1425 static HRESULT WINAPI IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference* iface, LPDIRECTXFILEDATA* ppDataObj)
1427 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1429 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
1431 return DXFILEERR_BADVALUE;
1434 static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl =
1436 IDirectXFileDataReferenceImpl_QueryInterface,
1437 IDirectXFileDataReferenceImpl_AddRef,
1438 IDirectXFileDataReferenceImpl_Release,
1439 IDirectXFileDataReferenceImpl_GetName,
1440 IDirectXFileDataReferenceImpl_GetId,
1441 IDirectXFileDataReferenceImpl_Resolve
1444 HRESULT IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl** ppObj)
1446 IDirectXFileEnumObjectImpl* object;
1448 TRACE("(%p)\n", ppObj);
1450 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileEnumObjectImpl));
1452 object->lpVtbl.lpVtbl = &IDirectXFileEnumObject_Vtbl;
1453 object->ref = 1;
1455 *ppObj = object;
1457 return S_OK;
1460 /*** IUnknown methods ***/
1461 static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject* iface, REFIID riid, void** ppvObject)
1463 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1465 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1467 if (IsEqualGUID(riid, &IID_IUnknown)
1468 || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
1470 IClassFactory_AddRef(iface);
1471 *ppvObject = This;
1472 return S_OK;
1475 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1476 return E_NOINTERFACE;
1479 static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject* iface)
1481 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1482 ULONG ref = InterlockedIncrement(&This->ref);
1484 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1486 return ref;
1489 static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* iface)
1491 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1492 ULONG ref = InterlockedDecrement(&This->ref);
1494 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1496 if (!ref)
1497 HeapFree(GetProcessHeap(), 0, This);
1499 return ref;
1502 /*** IDirectXFileEnumObject methods ***/
1503 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileEnumObject* iface, LPDIRECTXFILEDATA* ppDataObj)
1505 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1506 IDirectXFileDataImpl* object;
1507 HRESULT hr;
1509 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
1511 hr = IDirectXFileDataImpl_Create(&object);
1512 if (!SUCCEEDED(hr))
1513 return hr;
1515 *ppDataObj = (LPDIRECTXFILEDATA)object;
1517 return DXFILE_OK;
1520 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject* iface, REFGUID rguid, LPDIRECTXFILEDATA* ppDataObj)
1522 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1524 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, rguid, ppDataObj);
1526 return DXFILEERR_BADVALUE;
1529 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject* iface, LPCSTR szName, LPDIRECTXFILEDATA* ppDataObj)
1531 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1533 FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szName, ppDataObj);
1535 return DXFILEERR_BADVALUE;
1538 static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl =
1540 IDirectXFileEnumObjectImpl_QueryInterface,
1541 IDirectXFileEnumObjectImpl_AddRef,
1542 IDirectXFileEnumObjectImpl_Release,
1543 IDirectXFileEnumObjectImpl_GetNextDataObject,
1544 IDirectXFileEnumObjectImpl_GetDataObjectById,
1545 IDirectXFileEnumObjectImpl_GetDataObjectByName
1548 HRESULT IDirectXFileObjectImpl_Create(IDirectXFileObjectImpl** ppObj)
1550 IDirectXFileObjectImpl* object;
1552 TRACE("(%p)\n", ppObj);
1554 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileObjectImpl));
1556 object->lpVtbl.lpVtbl = &IDirectXFileObject_Vtbl;
1557 object->ref = 1;
1559 *ppObj = object;
1561 return S_OK;
1564 /*** IUnknown methods ***/
1565 static HRESULT WINAPI IDirectXFileObjectImpl_QueryInterface(IDirectXFileObject* iface, REFIID riid, void** ppvObject)
1567 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1569 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1571 if (IsEqualGUID(riid, &IID_IUnknown)
1572 || IsEqualGUID(riid, &IID_IDirectXFileObject))
1574 IClassFactory_AddRef(iface);
1575 *ppvObject = This;
1576 return S_OK;
1579 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1580 return E_NOINTERFACE;
1583 static ULONG WINAPI IDirectXFileObjectImpl_AddRef(IDirectXFileObject* iface)
1585 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1586 ULONG ref = InterlockedIncrement(&This->ref);
1588 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1590 return ref;
1593 static ULONG WINAPI IDirectXFileObjectImpl_Release(IDirectXFileObject* iface)
1595 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1596 ULONG ref = InterlockedDecrement(&This->ref);
1598 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1600 if (!ref)
1601 HeapFree(GetProcessHeap(), 0, This);
1603 return ref;
1606 /*** IDirectXFileObject methods ***/
1607 static HRESULT WINAPI IDirectXFileObjectImpl_GetName(IDirectXFileObject* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1609 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1611 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1613 return DXFILEERR_BADVALUE;
1616 static HRESULT WINAPI IDirectXFileObjectImpl_GetId(IDirectXFileObject* iface, LPGUID pGuid)
1618 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1620 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1622 return DXFILEERR_BADVALUE;
1625 static const IDirectXFileObjectVtbl IDirectXFileObject_Vtbl =
1627 IDirectXFileObjectImpl_QueryInterface,
1628 IDirectXFileObjectImpl_AddRef,
1629 IDirectXFileObjectImpl_Release,
1630 IDirectXFileObjectImpl_GetName,
1631 IDirectXFileObjectImpl_GetId
1634 HRESULT IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl** ppObj)
1636 IDirectXFileSaveObjectImpl* object;
1638 TRACE("(%p)\n", ppObj);
1640 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileSaveObjectImpl));
1642 object->lpVtbl.lpVtbl = &IDirectXFileSaveObject_Vtbl;
1643 object->ref = 1;
1645 *ppObj = object;
1647 return S_OK;
1650 /*** IUnknown methods ***/
1651 static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject* iface, REFIID riid, void** ppvObject)
1653 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1655 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1657 if (IsEqualGUID(riid, &IID_IUnknown)
1658 || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
1660 IClassFactory_AddRef(iface);
1661 *ppvObject = This;
1662 return S_OK;
1665 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1666 return E_NOINTERFACE;
1669 static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject* iface)
1671 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1672 ULONG ref = InterlockedIncrement(&This->ref);
1674 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1676 return ref;
1679 static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject* iface)
1681 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1682 ULONG ref = InterlockedDecrement(&This->ref);
1684 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1686 if (!ref)
1687 HeapFree(GetProcessHeap(), 0, This);
1689 return ref;
1692 static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject* iface, DWORD cTemplates, const GUID** ppguidTemplates)
1694 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1696 FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, cTemplates, ppguidTemplates);
1698 return DXFILEERR_BADVALUE;
1701 static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject* iface, REFGUID rguidTemplate, LPCSTR szName, const GUID* pguid, DWORD cbSize, LPVOID pvData, LPDIRECTXFILEDATA* ppDataObj)
1703 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1705 FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This, iface, rguidTemplate, szName, pguid, cbSize, pvData, ppDataObj);
1707 return DXFILEERR_BADVALUE;
1710 static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject* iface, LPDIRECTXFILEDATA ppDataObj)
1712 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1714 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
1716 return DXFILEERR_BADVALUE;
1719 static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl =
1721 IDirectXFileSaveObjectImpl_QueryInterface,
1722 IDirectXFileSaveObjectImpl_AddRef,
1723 IDirectXFileSaveObjectImpl_Release,
1724 IDirectXFileSaveObjectImpl_SaveTemplates,
1725 IDirectXFileSaveObjectImpl_CreateDataObject,
1726 IDirectXFileSaveObjectImpl_SaveData