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
25 #include "wine/debug.h"
32 #include "d3dxof_private.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')
49 #define TOKEN_STRING 2
50 #define TOKEN_INTEGER 3
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
63 #define TOKEN_COMMA 19
64 #define TOKEN_SEMICOLON 20
65 #define TOKEN_TEMPLATE 31
67 #define TOKEN_DWORD 41
68 #define TOKEN_FLOAT 42
69 #define TOKEN_DOUBLE 43
71 #define TOKEN_UCHAR 45
72 #define TOKEN_SWORD 46
73 #define TOKEN_SDWORD 47
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>"
89 IDirectXFileImpl* pdxf;
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;
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);
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);
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);
153 HeapFree(GetProcessHeap(), 0, This);
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;
166 HANDLE hFile = INVALID_HANDLE_VALUE;
168 FIXME("(%p/%p)->(%p,%x,%p) partial stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
171 return DXFILEERR_BADVALUE;
173 if (dwLoadOptions == DXFILELOAD_FROMFILE)
175 TRACE("Open source file '%s'\n", (char*)pvSource);
177 hFile = CreateFileA((char*)pvSource, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
178 if (hFile == INVALID_HANDLE_VALUE)
180 TRACE("File '%s' not found\n", (char*)pvSource);
181 return DXFILEERR_FILENOTFOUND;
184 if (!ReadFile(hFile, header, 16, &size, NULL))
186 hr = DXFILEERR_BADVALUE;
192 hr = DXFILEERR_BADFILETYPE;
196 if (TRACE_ON(d3dxof))
199 memcpy(string, header, 16);
201 TRACE("header = '%s'\n", string);
206 FIXME("Source type %d is not handled yet\n", dwLoadOptions);
207 hr = DXFILEERR_NOTDONEYET;
211 if (header[0] != XOFFILE_FORMAT_MAGIC)
213 hr = DXFILEERR_BADFILETYPE;
217 if (header[1] != XOFFILE_FORMAT_VERSION)
219 hr = DXFILEERR_BADFILEVERSION;
223 if ((header[2] != XOFFILE_FORMAT_BINARY) && (header[2] != XOFFILE_FORMAT_TEXT) && (header[2] != XOFFILE_FORMAT_COMPRESSED))
225 hr = DXFILEERR_BADFILETYPE;
229 if (header[2] == XOFFILE_FORMAT_TEXT)
231 FIXME("Binary format not supported yet\n");
232 hr = DXFILEERR_NOTDONEYET;
236 if (header[2] == XOFFILE_FORMAT_COMPRESSED)
238 FIXME("Compressed formats not supported yet");
239 hr = DXFILEERR_BADVALUE;
243 if ((header[3] != XOFFILE_FORMAT_FLOAT_BITS_32) && (header[3] != XOFFILE_FORMAT_FLOAT_BITS_64))
245 hr = DXFILEERR_BADFILEFLOATSIZE;
249 TRACE("Header is correct\n");
251 hr = IDirectXFileEnumObjectImpl_Create(&object);
255 object->source = dwLoadOptions;
256 object->hFile = hFile;
258 *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;
263 if (hFile != INVALID_HANDLE_VALUE)
270 static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
272 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
274 FIXME("(%p/%p)->(%s,%x,%p) stub!\n", This, iface, szFileName, dwFileFormat, ppSaveObj);
276 return DXFILEERR_BADVALUE;
279 static BOOL read_bytes(parse_buffer * buf, LPVOID data, DWORD size)
281 if (buf->rem_bytes < size)
283 memcpy(data, buf->buffer, size);
285 buf->rem_bytes -= size;
289 static void dump_TOKEN(WORD token)
291 #define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
294 DUMP_TOKEN(TOKEN_NAME);
295 DUMP_TOKEN(TOKEN_STRING);
296 DUMP_TOKEN(TOKEN_INTEGER);
297 DUMP_TOKEN(TOKEN_GUID);
298 DUMP_TOKEN(TOKEN_INTEGER_LIST);
299 DUMP_TOKEN(TOKEN_FLOAT_LIST);
300 DUMP_TOKEN(TOKEN_OBRACE);
301 DUMP_TOKEN(TOKEN_CBRACE);
302 DUMP_TOKEN(TOKEN_OPAREN);
303 DUMP_TOKEN(TOKEN_CPAREN);
304 DUMP_TOKEN(TOKEN_OBRACKET);
305 DUMP_TOKEN(TOKEN_CBRACKET);
306 DUMP_TOKEN(TOKEN_OANGLE);
307 DUMP_TOKEN(TOKEN_CANGLE);
308 DUMP_TOKEN(TOKEN_DOT);
309 DUMP_TOKEN(TOKEN_COMMA);
310 DUMP_TOKEN(TOKEN_SEMICOLON);
311 DUMP_TOKEN(TOKEN_TEMPLATE);
312 DUMP_TOKEN(TOKEN_WORD);
313 DUMP_TOKEN(TOKEN_DWORD);
314 DUMP_TOKEN(TOKEN_FLOAT);
315 DUMP_TOKEN(TOKEN_DOUBLE);
316 DUMP_TOKEN(TOKEN_CHAR);
317 DUMP_TOKEN(TOKEN_UCHAR);
318 DUMP_TOKEN(TOKEN_SWORD);
319 DUMP_TOKEN(TOKEN_SDWORD);
320 DUMP_TOKEN(TOKEN_VOID);
321 DUMP_TOKEN(TOKEN_LPSTR);
322 DUMP_TOKEN(TOKEN_UNICODE);
323 DUMP_TOKEN(TOKEN_CSTRING);
324 DUMP_TOKEN(TOKEN_ARRAY);
327 TRACE("Unknown token %d\n", token);
333 static BOOL is_space(char c)
347 static BOOL is_operator(char c)
366 static inline BOOL is_separator(char c)
368 return is_space(c) || is_operator(c);
371 static WORD get_operator_token(char c)
380 return TOKEN_OBRACKET;
382 return TOKEN_CBRACKET;
394 return TOKEN_SEMICOLON;
399 static BOOL is_keyword(parse_buffer* buf, const char* keyword)
401 DWORD len = strlen(keyword);
402 if (!strncmp((char*)buf->buffer, keyword,len) && is_separator(*(buf->buffer+len)))
405 buf->rem_bytes -= len;
411 static WORD get_keyword_token(parse_buffer* buf)
413 if (is_keyword(buf, "template"))
414 return TOKEN_TEMPLATE;
415 if (is_keyword(buf, "WORD"))
417 if (is_keyword(buf, "DWORD"))
419 if (is_keyword(buf, "FLOAT"))
421 if (is_keyword(buf, "DOUBLE"))
423 if (is_keyword(buf, "CHAR"))
425 if (is_keyword(buf, "UCHAR"))
427 if (is_keyword(buf, "SWORD"))
429 if (is_keyword(buf, "SDWORD"))
431 if (is_keyword(buf, "VOID"))
433 if (is_keyword(buf, "STRING"))
435 if (is_keyword(buf, "UNICODE"))
436 return TOKEN_UNICODE;
437 if (is_keyword(buf, "CSTRING"))
438 return TOKEN_CSTRING;
439 if (is_keyword(buf, "array"))
445 static BOOL is_guid(parse_buffer* buf)
453 if (*buf->buffer != '<')
456 while (*(buf->buffer+pos) != '>')
458 tmp[pos] = *(buf->buffer+pos);
463 if (pos != 38 /* <+36+> */)
465 TRACE("Wrong guid %s (%d)\n", tmp, pos);
469 buf->rem_bytes -= pos;
471 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);
474 TRACE("Wrong guid %s (%d)\n", tmp, pos);
477 TRACE("Found guid %s (%d)\n", tmp, pos);
479 class_id.Data2 = tab[0];
480 class_id.Data3 = tab[1];
481 class_id.Data4[0] = tab[2];
482 class_id.Data4[1] = tab[3];
483 class_id.Data4[2] = tab[4];
484 class_id.Data4[3] = tab[5];
485 class_id.Data4[4] = tab[6];
486 class_id.Data4[5] = tab[7];
487 class_id.Data4[6] = tab[8];
488 class_id.Data4[7] = tab[9];
490 *(GUID*)buf->value = class_id;
495 static BOOL is_name(parse_buffer* buf)
501 while (!is_separator(c = *(buf->buffer+pos)))
503 if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9'))))
511 TRACE("Wrong name %s\n", tmp);
516 buf->rem_bytes -= pos;
518 TRACE("Found name %s\n", tmp);
519 strcpy((char*)buf->value, tmp);
524 static BOOL is_integer(parse_buffer* buf)
531 while (!is_separator(c = *(buf->buffer+pos)))
533 if (!((c >= '0') && (c <= '9')))
540 buf->rem_bytes -= pos;
542 sscanf(tmp, "%d", &integer);
544 TRACE("Found integer %s - %d\n", tmp, integer);
546 *(WORD*)buf->value = integer;
551 static WORD parse_TOKEN_dbg_opt(parse_buffer * buf, BOOL show_token)
560 if (!read_bytes(buf, &c, 1))
562 /*TRACE("char = '%c'\n", is_space(c) ? ' ' : c);*/
565 if (is_operator(c) && (c != '<'))
567 token = get_operator_token(c);
580 if ((token = get_keyword_token(buf)))
590 token = TOKEN_INTEGER;
599 FIXME("Unrecognize element\n");
606 if (!read_bytes(buf, &token, 2))
616 case TOKEN_INTEGER_LIST:
617 case TOKEN_FLOAT_LIST:
628 case TOKEN_SEMICOLON:
654 static const char* get_primitive_string(WORD token)
688 static inline WORD parse_TOKEN(parse_buffer * buf)
690 return parse_TOKEN_dbg_opt(buf, TRUE);
693 static WORD check_TOKEN(parse_buffer * buf)
699 parse_buffer save = *buf;
700 /*TRACE("check: ");*/
701 token = parse_TOKEN_dbg_opt(buf, FALSE);
706 if (!read_bytes(buf, &token, 2))
718 static inline BOOL is_primitive_type(WORD token)
743 static BOOL parse_name(parse_buffer * buf)
748 if (parse_TOKEN(buf) != TOKEN_NAME)
752 if (!read_bytes(buf, &count, 4))
754 if (!read_bytes(buf, strname, count))
757 /*TRACE("name = %s\n", strname);*/
759 strcpy((char*)buf->value, strname);
764 static BOOL parse_class_id(parse_buffer * buf)
769 if (parse_TOKEN(buf) != TOKEN_GUID)
773 if (!read_bytes(buf, &class_id, 16))
775 sprintf(strguid, CLSIDFMT, class_id.Data1, class_id.Data2, class_id.Data3, class_id.Data4[0],
776 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]);
777 /*TRACE("guid = {%s}\n", strguid);*/
779 *(GUID*)buf->value = class_id;
784 static BOOL parse_integer(parse_buffer * buf)
788 if (parse_TOKEN(buf) != TOKEN_INTEGER)
792 if (!read_bytes(buf, &integer, 4))
794 /*TRACE("integer = %ld\n", integer);*/
796 *(DWORD*)buf->value = integer;
801 static BOOL parse_template_option_info(parse_buffer * buf)
803 xtemplate* cur_template = &buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates];
805 if (check_TOKEN(buf) == TOKEN_DOT)
808 if (parse_TOKEN(buf) != TOKEN_DOT)
810 if (parse_TOKEN(buf) != TOKEN_DOT)
812 cur_template->open = TRUE;
818 if (!parse_name(buf))
820 strcpy(cur_template->childs[cur_template->nb_childs], (char*)buf->value);
821 if (check_TOKEN(buf) == TOKEN_GUID)
822 if (!parse_class_id(buf))
824 cur_template->nb_childs++;
825 if (check_TOKEN(buf) != TOKEN_COMMA)
829 cur_template->open = FALSE;
835 static BOOL parse_template_members_list(parse_buffer * buf)
843 cur_member = &buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].members[idx_member];
846 if (check_TOKEN(buf) == TOKEN_NAME)
848 if (!parse_name(buf))
850 while (cur_member->idx_template < buf->pdxf->nb_xtemplates)
852 if (!strcmp((char*)buf->value, buf->pdxf->xtemplates[cur_member->idx_template].name))
854 cur_member->idx_template++;
856 if (cur_member->idx_template == buf->pdxf->nb_xtemplates)
858 TRACE("Reference to a nonexistent template '%s'\n", (char*)buf->value);
861 if (check_TOKEN(buf) == TOKEN_NAME)
862 if (!parse_name(buf))
864 if (parse_TOKEN(buf) != TOKEN_SEMICOLON)
866 cur_member->type = TOKEN_NAME;
867 strcpy(cur_member->name, (char*)buf->value);
870 else if (check_TOKEN(buf) == TOKEN_ARRAY)
877 token = check_TOKEN(buf);
878 if (is_primitive_type(token))
881 cur_member->type = token;
885 if (!parse_name(buf))
887 cur_member->type = TOKEN_NAME;
888 cur_member->idx_template = 0;
889 while (cur_member->idx_template < buf->pdxf->nb_xtemplates)
891 if (!strcmp((char*)buf->value, buf->pdxf->xtemplates[cur_member->idx_template].name))
893 cur_member->idx_template++;
895 if (cur_member->idx_template == buf->pdxf->nb_xtemplates)
897 TRACE("Reference to nonexistent template '%s'\n", (char*)buf->value);
901 if (!parse_name(buf))
903 strcpy(cur_member->name, (char*)buf->value);
905 while (check_TOKEN(buf) == TOKEN_OBRACKET)
909 FIXME("No support for multi-dimensional array yet\n");
913 if (check_TOKEN(buf) == TOKEN_INTEGER)
915 if (!parse_integer(buf))
917 cur_member->dim_fixed[nb_dims] = TRUE;
918 cur_member->dim_value[nb_dims] = *(DWORD*)buf->value;
922 if (!parse_name(buf))
924 cur_member->dim_fixed[nb_dims] = FALSE;
925 /* Hack: Assume array size is specified in previous member */
926 cur_member->dim_value[nb_dims] = idx_member - 1;
928 if (parse_TOKEN(buf) != TOKEN_CBRACKET)
934 if (parse_TOKEN(buf) != TOKEN_SEMICOLON)
936 cur_member->nb_dims = nb_dims;
939 else if (is_primitive_type(check_TOKEN(buf)))
941 cur_member->type = check_TOKEN(buf);
943 if (check_TOKEN(buf) == TOKEN_NAME)
944 if (!parse_name(buf))
946 strcpy(cur_member->name, (char*)buf->value);
947 if (parse_TOKEN(buf) != TOKEN_SEMICOLON)
956 buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].nb_members = idx_member;
961 static BOOL parse_template_parts(parse_buffer * buf)
963 if (check_TOKEN(buf) == TOKEN_OBRACKET)
966 if (!parse_template_option_info(buf))
968 if (parse_TOKEN(buf) != TOKEN_CBRACKET)
973 if (!parse_template_members_list(buf))
975 if (check_TOKEN(buf) == TOKEN_OBRACKET)
978 if (!parse_template_option_info(buf))
980 if (parse_TOKEN(buf) != TOKEN_CBRACKET)
988 static BOOL parse_template(parse_buffer * buf)
990 if (parse_TOKEN(buf) != TOKEN_TEMPLATE)
992 if (!parse_name(buf))
994 strcpy(buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name, (char*)buf->value);
995 if (parse_TOKEN(buf) != TOKEN_OBRACE)
997 if (!parse_class_id(buf))
999 buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id = *(GUID*)buf->value;
1000 if (!parse_template_parts(buf))
1002 if (parse_TOKEN(buf) != TOKEN_CBRACE)
1006 /* Go to the next template */
1007 while (buf->rem_bytes && is_space(*buf->buffer))
1014 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));
1015 buf->pdxf->nb_xtemplates++;
1020 static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LPVOID pvData, DWORD cbSize)
1022 IDirectXFileImpl *This = (IDirectXFileImpl *)iface;
1026 buf.buffer = (LPBYTE)pvData;
1027 buf.rem_bytes = cbSize;
1031 FIXME("(%p/%p)->(%p,%d) partial stub!\n", This, iface, pvData, cbSize);
1034 return DXFILEERR_BADVALUE;
1037 return DXFILEERR_BADFILETYPE;
1039 if (TRACE_ON(d3dxof))
1042 memcpy(string, pvData, 16);
1044 TRACE("header = '%s'\n", string);
1047 read_bytes(&buf, &token_header, 4);
1049 if (token_header != XOFFILE_FORMAT_MAGIC)
1050 return DXFILEERR_BADFILETYPE;
1052 read_bytes(&buf, &token_header, 4);
1054 if (token_header != XOFFILE_FORMAT_VERSION)
1055 return DXFILEERR_BADFILEVERSION;
1057 read_bytes(&buf, &token_header, 4);
1059 if ((token_header != XOFFILE_FORMAT_BINARY) && (token_header != XOFFILE_FORMAT_TEXT) && (token_header != XOFFILE_FORMAT_COMPRESSED))
1060 return DXFILEERR_BADFILETYPE;
1062 if (token_header == XOFFILE_FORMAT_TEXT)
1067 if (token_header == XOFFILE_FORMAT_COMPRESSED)
1069 FIXME("Compressed formats not supported yet\n");
1070 return DXFILEERR_BADVALUE;
1073 read_bytes(&buf, &token_header, 4);
1075 if ((token_header != XOFFILE_FORMAT_FLOAT_BITS_32) && (token_header != XOFFILE_FORMAT_FLOAT_BITS_64))
1076 return DXFILEERR_BADFILEFLOATSIZE;
1078 TRACE("Header is correct\n");
1080 while (buf.rem_bytes)
1082 if (!parse_template(&buf))
1084 TRACE("Template is not correct\n");
1085 return DXFILEERR_BADVALUE;
1089 TRACE("Template successfully parsed:\n");
1090 if (TRACE_ON(d3dxof))
1095 i = This->nb_xtemplates - 1;
1096 clsid = &This->xtemplates[i].class_id;
1098 DPRINTF("template %s\n", This->xtemplates[i].name);
1100 DPRINTF(CLSIDFMT "\n", clsid->Data1, clsid->Data2, clsid->Data3, clsid->Data4[0],
1101 clsid->Data4[1], clsid->Data4[2], clsid->Data4[3], clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7]);
1102 for (j = 0; j < This->xtemplates[i].nb_members; j++)
1104 if (This->xtemplates[i].members[j].nb_dims)
1106 if (This->xtemplates[i].members[j].type == TOKEN_NAME)
1107 DPRINTF("%s ", This->xtemplates[This->xtemplates[i].members[j].idx_template].name);
1109 DPRINTF("%s ", get_primitive_string(This->xtemplates[i].members[j].type));
1110 DPRINTF("%s", This->xtemplates[i].members[j].name);
1111 for (k = 0; k < This->xtemplates[i].members[j].nb_dims; k++)
1113 if (This->xtemplates[i].members[j].dim_fixed[k])
1114 DPRINTF("[%d]", This->xtemplates[i].members[j].dim_value[k]);
1116 DPRINTF("[%s]", This->xtemplates[i].members[This->xtemplates[i].members[j].dim_value[k]].name);
1120 if (This->xtemplates[i].open)
1122 else if (This->xtemplates[i].nb_childs)
1124 DPRINTF("[%s", This->xtemplates[i].childs[0]);
1125 for (j = 1; j < This->xtemplates[i].nb_childs; j++)
1126 DPRINTF(",%s", This->xtemplates[i].childs[j]);
1134 if (TRACE_ON(d3dxof))
1137 TRACE("Registered templates (%d):\n", This->nb_xtemplates);
1138 for (i = 0; i < This->nb_xtemplates; i++)
1139 DPRINTF("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
1145 static const IDirectXFileVtbl IDirectXFile_Vtbl =
1147 IDirectXFileImpl_QueryInterface,
1148 IDirectXFileImpl_AddRef,
1149 IDirectXFileImpl_Release,
1150 IDirectXFileImpl_CreateEnumObject,
1151 IDirectXFileImpl_CreateSaveObject,
1152 IDirectXFileImpl_RegisterTemplates
1155 HRESULT IDirectXFileBinaryImpl_Create(IDirectXFileBinaryImpl** ppObj)
1157 IDirectXFileBinaryImpl* object;
1159 TRACE("(%p)\n", ppObj);
1161 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileBinaryImpl));
1163 object->lpVtbl.lpVtbl = &IDirectXFileBinary_Vtbl;
1171 /*** IUnknown methods ***/
1172 static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary* iface, REFIID riid, void** ppvObject)
1174 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1176 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1178 if (IsEqualGUID(riid, &IID_IUnknown)
1179 || IsEqualGUID(riid, &IID_IDirectXFileObject)
1180 || IsEqualGUID(riid, &IID_IDirectXFileBinary))
1182 IClassFactory_AddRef(iface);
1187 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1188 return E_NOINTERFACE;
1191 static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary* iface)
1193 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1194 ULONG ref = InterlockedIncrement(&This->ref);
1196 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1201 static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary* iface)
1203 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1204 ULONG ref = InterlockedDecrement(&This->ref);
1206 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1209 HeapFree(GetProcessHeap(), 0, This);
1214 /*** IDirectXFileObject methods ***/
1215 static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1218 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1220 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1222 return DXFILEERR_BADVALUE;
1225 static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary* iface, LPGUID pGuid)
1227 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1229 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1231 return DXFILEERR_BADVALUE;
1234 /*** IDirectXFileBinary methods ***/
1235 static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary* iface, DWORD* pcbSize)
1237 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1239 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcbSize);
1241 return DXFILEERR_BADVALUE;
1244 static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary* iface, LPCSTR* pszMimeType)
1246 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1248 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pszMimeType);
1250 return DXFILEERR_BADVALUE;
1253 static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary* iface, LPVOID pvData, DWORD cbSize, LPDWORD pcbRead)
1255 IDirectXFileBinaryImpl *This = (IDirectXFileBinaryImpl *)iface;
1257 FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This, iface, pvData, cbSize, pcbRead);
1259 return DXFILEERR_BADVALUE;
1262 static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl =
1264 IDirectXFileBinaryImpl_QueryInterface,
1265 IDirectXFileBinaryImpl_AddRef,
1266 IDirectXFileBinaryImpl_Release,
1267 IDirectXFileBinaryImpl_GetName,
1268 IDirectXFileBinaryImpl_GetId,
1269 IDirectXFileBinaryImpl_GetSize,
1270 IDirectXFileBinaryImpl_GetMimeType,
1271 IDirectXFileBinaryImpl_Read
1274 HRESULT IDirectXFileDataImpl_Create(IDirectXFileDataImpl** ppObj)
1276 IDirectXFileDataImpl* object;
1278 TRACE("(%p)\n", ppObj);
1280 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataImpl));
1282 object->lpVtbl.lpVtbl = &IDirectXFileData_Vtbl;
1290 /*** IUnknown methods ***/
1291 static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData* iface, REFIID riid, void** ppvObject)
1293 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1295 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1297 if (IsEqualGUID(riid, &IID_IUnknown)
1298 || IsEqualGUID(riid, &IID_IDirectXFileObject)
1299 || IsEqualGUID(riid, &IID_IDirectXFileData))
1301 IClassFactory_AddRef(iface);
1306 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1307 return E_NOINTERFACE;
1310 static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData* iface)
1312 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1313 ULONG ref = InterlockedIncrement(&This->ref);
1315 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1320 static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData* iface)
1322 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1323 ULONG ref = InterlockedDecrement(&This->ref);
1325 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1328 HeapFree(GetProcessHeap(), 0, This);
1333 /*** IDirectXFileObject methods ***/
1334 static HRESULT WINAPI IDirectXFileDataImpl_GetName(IDirectXFileData* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1337 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1339 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1341 return DXFILEERR_BADVALUE;
1344 static HRESULT WINAPI IDirectXFileDataImpl_GetId(IDirectXFileData* iface, LPGUID pGuid)
1346 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1348 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1350 return DXFILEERR_BADVALUE;
1353 /*** IDirectXFileData methods ***/
1354 static HRESULT WINAPI IDirectXFileDataImpl_GetData(IDirectXFileData* iface, LPCSTR szMember, DWORD* pcbSize, void** ppvData)
1356 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1358 FIXME("(%p/%p)->(%s,%p,%p) stub!\n", This, iface, szMember, pcbSize, ppvData);
1360 return DXFILEERR_BADVALUE;
1363 static HRESULT WINAPI IDirectXFileDataImpl_GetType(IDirectXFileData* iface, const GUID** pguid)
1365 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1367 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pguid);
1369 return DXFILEERR_BADVALUE;
1372 static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface, LPDIRECTXFILEOBJECT* ppChildObj)
1374 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1376 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppChildObj);
1378 return DXFILEERR_BADVALUE;
1381 static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData* iface, LPDIRECTXFILEDATA pDataObj)
1383 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1385 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDataObj);
1387 return DXFILEERR_BADVALUE;
1390 static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData* iface, LPCSTR szRef, const GUID* pguidRef)
1392 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1394 FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szRef, pguidRef);
1396 return DXFILEERR_BADVALUE;
1399 static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData* iface, LPCSTR szName, const GUID* pguid, LPCSTR szMimeType, LPVOID pvData, DWORD cbSize)
1401 IDirectXFileDataImpl *This = (IDirectXFileDataImpl *)iface;
1403 FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This, iface, szName, pguid, szMimeType, pvData, cbSize);
1405 return DXFILEERR_BADVALUE;
1408 static const IDirectXFileDataVtbl IDirectXFileData_Vtbl =
1410 IDirectXFileDataImpl_QueryInterface,
1411 IDirectXFileDataImpl_AddRef,
1412 IDirectXFileDataImpl_Release,
1413 IDirectXFileDataImpl_GetName,
1414 IDirectXFileDataImpl_GetId,
1415 IDirectXFileDataImpl_GetData,
1416 IDirectXFileDataImpl_GetType,
1417 IDirectXFileDataImpl_GetNextObject,
1418 IDirectXFileDataImpl_AddDataObject,
1419 IDirectXFileDataImpl_AddDataReference,
1420 IDirectXFileDataImpl_AddBinaryObject
1423 HRESULT IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImpl** ppObj)
1425 IDirectXFileDataReferenceImpl* object;
1427 TRACE("(%p)\n", ppObj);
1429 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileDataReferenceImpl));
1431 object->lpVtbl.lpVtbl = &IDirectXFileDataReference_Vtbl;
1439 /*** IUnknown methods ***/
1440 static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference* iface, REFIID riid, void** ppvObject)
1442 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1444 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1446 if (IsEqualGUID(riid, &IID_IUnknown)
1447 || IsEqualGUID(riid, &IID_IDirectXFileObject)
1448 || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
1450 IClassFactory_AddRef(iface);
1455 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1456 return E_NOINTERFACE;
1459 static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference* iface)
1461 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1462 ULONG ref = InterlockedIncrement(&This->ref);
1464 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1469 static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference* iface)
1471 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1472 ULONG ref = InterlockedDecrement(&This->ref);
1474 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1477 HeapFree(GetProcessHeap(), 0, This);
1482 /*** IDirectXFileObject methods ***/
1483 static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataReference* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1485 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1487 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1489 return DXFILEERR_BADVALUE;
1492 static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference* iface, LPGUID pGuid)
1494 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1496 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1498 return DXFILEERR_BADVALUE;
1501 /*** IDirectXFileDataReference ***/
1502 static HRESULT WINAPI IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference* iface, LPDIRECTXFILEDATA* ppDataObj)
1504 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1506 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
1508 return DXFILEERR_BADVALUE;
1511 static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl =
1513 IDirectXFileDataReferenceImpl_QueryInterface,
1514 IDirectXFileDataReferenceImpl_AddRef,
1515 IDirectXFileDataReferenceImpl_Release,
1516 IDirectXFileDataReferenceImpl_GetName,
1517 IDirectXFileDataReferenceImpl_GetId,
1518 IDirectXFileDataReferenceImpl_Resolve
1521 HRESULT IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl** ppObj)
1523 IDirectXFileEnumObjectImpl* object;
1525 TRACE("(%p)\n", ppObj);
1527 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileEnumObjectImpl));
1529 object->lpVtbl.lpVtbl = &IDirectXFileEnumObject_Vtbl;
1537 /*** IUnknown methods ***/
1538 static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject* iface, REFIID riid, void** ppvObject)
1540 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1542 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1544 if (IsEqualGUID(riid, &IID_IUnknown)
1545 || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
1547 IClassFactory_AddRef(iface);
1552 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1553 return E_NOINTERFACE;
1556 static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject* iface)
1558 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1559 ULONG ref = InterlockedIncrement(&This->ref);
1561 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1566 static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* iface)
1568 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1569 ULONG ref = InterlockedDecrement(&This->ref);
1571 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1574 HeapFree(GetProcessHeap(), 0, This);
1579 /*** IDirectXFileEnumObject methods ***/
1580 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileEnumObject* iface, LPDIRECTXFILEDATA* ppDataObj)
1582 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1583 IDirectXFileDataImpl* object;
1586 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
1588 hr = IDirectXFileDataImpl_Create(&object);
1592 *ppDataObj = (LPDIRECTXFILEDATA)object;
1597 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject* iface, REFGUID rguid, LPDIRECTXFILEDATA* ppDataObj)
1599 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1601 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, rguid, ppDataObj);
1603 return DXFILEERR_BADVALUE;
1606 static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject* iface, LPCSTR szName, LPDIRECTXFILEDATA* ppDataObj)
1608 IDirectXFileEnumObjectImpl *This = (IDirectXFileEnumObjectImpl *)iface;
1610 FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szName, ppDataObj);
1612 return DXFILEERR_BADVALUE;
1615 static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl =
1617 IDirectXFileEnumObjectImpl_QueryInterface,
1618 IDirectXFileEnumObjectImpl_AddRef,
1619 IDirectXFileEnumObjectImpl_Release,
1620 IDirectXFileEnumObjectImpl_GetNextDataObject,
1621 IDirectXFileEnumObjectImpl_GetDataObjectById,
1622 IDirectXFileEnumObjectImpl_GetDataObjectByName
1625 HRESULT IDirectXFileObjectImpl_Create(IDirectXFileObjectImpl** ppObj)
1627 IDirectXFileObjectImpl* object;
1629 TRACE("(%p)\n", ppObj);
1631 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileObjectImpl));
1633 object->lpVtbl.lpVtbl = &IDirectXFileObject_Vtbl;
1641 /*** IUnknown methods ***/
1642 static HRESULT WINAPI IDirectXFileObjectImpl_QueryInterface(IDirectXFileObject* iface, REFIID riid, void** ppvObject)
1644 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1646 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1648 if (IsEqualGUID(riid, &IID_IUnknown)
1649 || IsEqualGUID(riid, &IID_IDirectXFileObject))
1651 IClassFactory_AddRef(iface);
1656 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1657 return E_NOINTERFACE;
1660 static ULONG WINAPI IDirectXFileObjectImpl_AddRef(IDirectXFileObject* iface)
1662 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1663 ULONG ref = InterlockedIncrement(&This->ref);
1665 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1670 static ULONG WINAPI IDirectXFileObjectImpl_Release(IDirectXFileObject* iface)
1672 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1673 ULONG ref = InterlockedDecrement(&This->ref);
1675 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1678 HeapFree(GetProcessHeap(), 0, This);
1683 /*** IDirectXFileObject methods ***/
1684 static HRESULT WINAPI IDirectXFileObjectImpl_GetName(IDirectXFileObject* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
1686 IDirectXFileDataReferenceImpl *This = (IDirectXFileDataReferenceImpl *)iface;
1688 FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
1690 return DXFILEERR_BADVALUE;
1693 static HRESULT WINAPI IDirectXFileObjectImpl_GetId(IDirectXFileObject* iface, LPGUID pGuid)
1695 IDirectXFileObjectImpl *This = (IDirectXFileObjectImpl *)iface;
1697 FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
1699 return DXFILEERR_BADVALUE;
1702 static const IDirectXFileObjectVtbl IDirectXFileObject_Vtbl =
1704 IDirectXFileObjectImpl_QueryInterface,
1705 IDirectXFileObjectImpl_AddRef,
1706 IDirectXFileObjectImpl_Release,
1707 IDirectXFileObjectImpl_GetName,
1708 IDirectXFileObjectImpl_GetId
1711 HRESULT IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl** ppObj)
1713 IDirectXFileSaveObjectImpl* object;
1715 TRACE("(%p)\n", ppObj);
1717 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectXFileSaveObjectImpl));
1719 object->lpVtbl.lpVtbl = &IDirectXFileSaveObject_Vtbl;
1727 /*** IUnknown methods ***/
1728 static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject* iface, REFIID riid, void** ppvObject)
1730 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1732 TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
1734 if (IsEqualGUID(riid, &IID_IUnknown)
1735 || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
1737 IClassFactory_AddRef(iface);
1742 ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1743 return E_NOINTERFACE;
1746 static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject* iface)
1748 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1749 ULONG ref = InterlockedIncrement(&This->ref);
1751 TRACE("(%p/%p): AddRef from %d\n", iface, This, ref - 1);
1756 static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject* iface)
1758 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1759 ULONG ref = InterlockedDecrement(&This->ref);
1761 TRACE("(%p/%p): ReleaseRef to %d\n", iface, This, ref);
1764 HeapFree(GetProcessHeap(), 0, This);
1769 static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject* iface, DWORD cTemplates, const GUID** ppguidTemplates)
1771 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1773 FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, cTemplates, ppguidTemplates);
1775 return DXFILEERR_BADVALUE;
1778 static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject* iface, REFGUID rguidTemplate, LPCSTR szName, const GUID* pguid, DWORD cbSize, LPVOID pvData, LPDIRECTXFILEDATA* ppDataObj)
1780 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1782 FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This, iface, rguidTemplate, szName, pguid, cbSize, pvData, ppDataObj);
1784 return DXFILEERR_BADVALUE;
1787 static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject* iface, LPDIRECTXFILEDATA ppDataObj)
1789 IDirectXFileSaveObjectImpl *This = (IDirectXFileSaveObjectImpl *)iface;
1791 FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
1793 return DXFILEERR_BADVALUE;
1796 static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl =
1798 IDirectXFileSaveObjectImpl_QueryInterface,
1799 IDirectXFileSaveObjectImpl_AddRef,
1800 IDirectXFileSaveObjectImpl_Release,
1801 IDirectXFileSaveObjectImpl_SaveTemplates,
1802 IDirectXFileSaveObjectImpl_CreateDataObject,
1803 IDirectXFileSaveObjectImpl_SaveData