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>"
82 #define MAX_INPUT_SIZE 1000000
83 #define MAX_DATA_SIZE 100000
85 static const struct IDirectXFileVtbl IDirectXFile_Vtbl
;
86 static const struct IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl
;
87 static const struct IDirectXFileDataVtbl IDirectXFileData_Vtbl
;
88 static const struct IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl
;
89 static const struct IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl
;
90 static const struct IDirectXFileObjectVtbl IDirectXFileObject_Vtbl
;
91 static const struct IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl
;
93 static BOOL
parse_object_parts(parse_buffer
* buf
, BOOL allow_optional
);
94 static BOOL
parse_object(parse_buffer
* buf
);
96 HRESULT
IDirectXFileImpl_Create(IUnknown
* pUnkOuter
, LPVOID
* ppObj
)
98 IDirectXFileImpl
* object
;
100 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
102 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileImpl
));
104 object
->lpVtbl
.lpVtbl
= &IDirectXFile_Vtbl
;
112 /*** IUnknown methods ***/
113 static HRESULT WINAPI
IDirectXFileImpl_QueryInterface(IDirectXFile
* iface
, REFIID riid
, void** ppvObject
)
115 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
117 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
119 if (IsEqualGUID(riid
, &IID_IUnknown
)
120 || IsEqualGUID(riid
, &IID_IDirectXFile
))
122 IClassFactory_AddRef(iface
);
127 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
128 return E_NOINTERFACE
;
131 static ULONG WINAPI
IDirectXFileImpl_AddRef(IDirectXFile
* iface
)
133 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
134 ULONG ref
= InterlockedIncrement(&This
->ref
);
136 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
141 static ULONG WINAPI
IDirectXFileImpl_Release(IDirectXFile
* iface
)
143 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
144 ULONG ref
= InterlockedDecrement(&This
->ref
);
146 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
149 HeapFree(GetProcessHeap(), 0, This
);
154 /*** IDirectXFile methods ***/
155 static HRESULT WINAPI
IDirectXFileImpl_CreateEnumObject(IDirectXFile
* iface
, LPVOID pvSource
, DXFILELOADOPTIONS dwLoadOptions
, LPDIRECTXFILEENUMOBJECT
* ppEnumObj
)
157 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
158 IDirectXFileEnumObjectImpl
* object
;
162 HANDLE hFile
= INVALID_HANDLE_VALUE
;
164 TRACE("(%p/%p)->(%p,%x,%p)\n", This
, iface
, pvSource
, dwLoadOptions
, ppEnumObj
);
167 return DXFILEERR_BADVALUE
;
169 if (dwLoadOptions
== DXFILELOAD_FROMFILE
)
171 TRACE("Open source file '%s'\n", (char*)pvSource
);
173 hFile
= CreateFileA((char*)pvSource
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
174 if (hFile
== INVALID_HANDLE_VALUE
)
176 TRACE("File '%s' not found\n", (char*)pvSource
);
177 return DXFILEERR_FILENOTFOUND
;
180 if (!ReadFile(hFile
, header
, 16, &size
, NULL
))
182 hr
= DXFILEERR_BADVALUE
;
188 hr
= DXFILEERR_BADFILETYPE
;
192 if (TRACE_ON(d3dxof
))
195 memcpy(string
, header
, 16);
197 TRACE("header = '%s'\n", string
);
202 FIXME("Source type %d is not handled yet\n", dwLoadOptions
);
203 hr
= DXFILEERR_NOTDONEYET
;
207 if (header
[0] != XOFFILE_FORMAT_MAGIC
)
209 hr
= DXFILEERR_BADFILETYPE
;
213 if (header
[1] != XOFFILE_FORMAT_VERSION
)
215 hr
= DXFILEERR_BADFILEVERSION
;
219 if ((header
[2] != XOFFILE_FORMAT_BINARY
) && (header
[2] != XOFFILE_FORMAT_TEXT
) && (header
[2] != XOFFILE_FORMAT_COMPRESSED
))
221 hr
= DXFILEERR_BADFILETYPE
;
225 if (header
[2] == XOFFILE_FORMAT_BINARY
)
227 FIXME("Binary format not supported yet\n");
228 hr
= DXFILEERR_NOTDONEYET
;
232 if (header
[2] == XOFFILE_FORMAT_COMPRESSED
)
234 FIXME("Compressed formats not supported yet\n");
235 hr
= DXFILEERR_BADVALUE
;
239 if ((header
[3] != XOFFILE_FORMAT_FLOAT_BITS_32
) && (header
[3] != XOFFILE_FORMAT_FLOAT_BITS_64
))
241 hr
= DXFILEERR_BADFILEFLOATSIZE
;
245 TRACE("Header is correct\n");
247 hr
= IDirectXFileEnumObjectImpl_Create(&object
);
251 object
->source
= dwLoadOptions
;
252 object
->hFile
= hFile
;
253 object
->pDirectXFile
= This
;
254 object
->buf
.pdxf
= This
;
255 object
->buf
.txt
= TRUE
;
256 object
->buf
.token_present
= FALSE
;
257 object
->buf
.cur_subobject
= 0;
259 object
->buf
.buffer
= HeapAlloc(GetProcessHeap(), 0, MAX_INPUT_SIZE
+1);
260 if (!object
->buf
.buffer
)
262 WARN("Out of memory\n");
263 hr
= DXFILEERR_BADALLOC
;
267 ReadFile(hFile
, object
->buf
.buffer
, MAX_INPUT_SIZE
+1, &object
->buf
.rem_bytes
, NULL
);
268 if (object
->buf
.rem_bytes
> MAX_INPUT_SIZE
)
270 FIXME("File size > %d not supported yet\n", MAX_INPUT_SIZE
);
271 HeapFree(GetProcessHeap(), 0, object
->buf
.buffer
);
272 hr
= DXFILEERR_PARSEERROR
;
275 TRACE("Read %d bytes\n", object
->buf
.rem_bytes
);
277 *ppEnumObj
= (LPDIRECTXFILEENUMOBJECT
)object
;
282 if (hFile
!= INVALID_HANDLE_VALUE
)
289 static HRESULT WINAPI
IDirectXFileImpl_CreateSaveObject(IDirectXFile
* iface
, LPCSTR szFileName
, DXFILEFORMAT dwFileFormat
, LPDIRECTXFILESAVEOBJECT
* ppSaveObj
)
291 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
293 FIXME("(%p/%p)->(%s,%x,%p) stub!\n", This
, iface
, szFileName
, dwFileFormat
, ppSaveObj
);
295 return DXFILEERR_BADVALUE
;
298 static BOOL
read_bytes(parse_buffer
* buf
, LPVOID data
, DWORD size
)
300 if (buf
->rem_bytes
< size
)
302 memcpy(data
, buf
->buffer
, size
);
304 buf
->rem_bytes
-= size
;
308 static void dump_TOKEN(WORD token
)
310 #define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
313 DUMP_TOKEN(TOKEN_NAME
);
314 DUMP_TOKEN(TOKEN_STRING
);
315 DUMP_TOKEN(TOKEN_INTEGER
);
316 DUMP_TOKEN(TOKEN_GUID
);
317 DUMP_TOKEN(TOKEN_INTEGER_LIST
);
318 DUMP_TOKEN(TOKEN_FLOAT_LIST
);
319 DUMP_TOKEN(TOKEN_OBRACE
);
320 DUMP_TOKEN(TOKEN_CBRACE
);
321 DUMP_TOKEN(TOKEN_OPAREN
);
322 DUMP_TOKEN(TOKEN_CPAREN
);
323 DUMP_TOKEN(TOKEN_OBRACKET
);
324 DUMP_TOKEN(TOKEN_CBRACKET
);
325 DUMP_TOKEN(TOKEN_OANGLE
);
326 DUMP_TOKEN(TOKEN_CANGLE
);
327 DUMP_TOKEN(TOKEN_DOT
);
328 DUMP_TOKEN(TOKEN_COMMA
);
329 DUMP_TOKEN(TOKEN_SEMICOLON
);
330 DUMP_TOKEN(TOKEN_TEMPLATE
);
331 DUMP_TOKEN(TOKEN_WORD
);
332 DUMP_TOKEN(TOKEN_DWORD
);
333 DUMP_TOKEN(TOKEN_FLOAT
);
334 DUMP_TOKEN(TOKEN_DOUBLE
);
335 DUMP_TOKEN(TOKEN_CHAR
);
336 DUMP_TOKEN(TOKEN_UCHAR
);
337 DUMP_TOKEN(TOKEN_SWORD
);
338 DUMP_TOKEN(TOKEN_SDWORD
);
339 DUMP_TOKEN(TOKEN_VOID
);
340 DUMP_TOKEN(TOKEN_LPSTR
);
341 DUMP_TOKEN(TOKEN_UNICODE
);
342 DUMP_TOKEN(TOKEN_CSTRING
);
343 DUMP_TOKEN(TOKEN_ARRAY
);
346 TRACE("Unknown token %d\n", token
);
352 static BOOL
is_space(char c
)
366 static BOOL
is_operator(char c
)
385 static inline BOOL
is_separator(char c
)
387 return is_space(c
) || is_operator(c
);
390 static WORD
get_operator_token(char c
)
399 return TOKEN_OBRACKET
;
401 return TOKEN_CBRACKET
;
413 return TOKEN_SEMICOLON
;
418 static BOOL
is_keyword(parse_buffer
* buf
, const char* keyword
)
420 DWORD len
= strlen(keyword
);
421 if (!strncmp((char*)buf
->buffer
, keyword
,len
) && is_separator(*(buf
->buffer
+len
)))
424 buf
->rem_bytes
-= len
;
430 static WORD
get_keyword_token(parse_buffer
* buf
)
432 if (is_keyword(buf
, "template"))
433 return TOKEN_TEMPLATE
;
434 if (is_keyword(buf
, "WORD"))
436 if (is_keyword(buf
, "DWORD"))
438 if (is_keyword(buf
, "FLOAT"))
440 if (is_keyword(buf
, "DOUBLE"))
442 if (is_keyword(buf
, "CHAR"))
444 if (is_keyword(buf
, "UCHAR"))
446 if (is_keyword(buf
, "SWORD"))
448 if (is_keyword(buf
, "SDWORD"))
450 if (is_keyword(buf
, "VOID"))
452 if (is_keyword(buf
, "STRING"))
454 if (is_keyword(buf
, "UNICODE"))
455 return TOKEN_UNICODE
;
456 if (is_keyword(buf
, "CSTRING"))
457 return TOKEN_CSTRING
;
458 if (is_keyword(buf
, "array"))
464 static BOOL
is_guid(parse_buffer
* buf
)
472 if (*buf
->buffer
!= '<')
475 while (*(buf
->buffer
+pos
) != '>')
477 tmp
[pos
] = *(buf
->buffer
+pos
);
482 if (pos
!= 38 /* <+36+> */)
484 TRACE("Wrong guid %s (%d)\n", tmp
, pos
);
488 buf
->rem_bytes
-= pos
;
490 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);
493 TRACE("Wrong guid %s (%d)\n", tmp
, pos
);
496 TRACE("Found guid %s (%d)\n", tmp
, pos
);
498 class_id
.Data2
= tab
[0];
499 class_id
.Data3
= tab
[1];
500 class_id
.Data4
[0] = tab
[2];
501 class_id
.Data4
[1] = tab
[3];
502 class_id
.Data4
[2] = tab
[4];
503 class_id
.Data4
[3] = tab
[5];
504 class_id
.Data4
[4] = tab
[6];
505 class_id
.Data4
[5] = tab
[7];
506 class_id
.Data4
[6] = tab
[8];
507 class_id
.Data4
[7] = tab
[9];
509 *(GUID
*)buf
->value
= class_id
;
514 static BOOL
is_name(parse_buffer
* buf
)
520 while (!is_separator(c
= *(buf
->buffer
+pos
)))
522 if (!(((c
>= 'a') && (c
<= 'z')) || ((c
>= 'A') && (c
<= 'Z')) || ((c
>= '0') && (c
<= '9')) || (c
== '_')))
530 TRACE("Wrong name %s\n", tmp
);
535 buf
->rem_bytes
-= pos
;
537 TRACE("Found name %s\n", tmp
);
538 strcpy((char*)buf
->value
, tmp
);
543 static BOOL
is_float(parse_buffer
* buf
)
551 while (!is_separator(c
= *(buf
->buffer
+pos
)))
553 if (!((!pos
&& (c
== '-')) || ((c
>= '0') && (c
<= '9')) || (!dot
&& (c
== '.'))))
562 buf
->rem_bytes
-= pos
;
564 sscanf(tmp
, "%f", &decimal
);
566 TRACE("Found float %s - %f\n", tmp
, decimal
);
568 *(float*)buf
->value
= decimal
;
573 static BOOL
is_integer(parse_buffer
* buf
)
580 while (!is_separator(c
= *(buf
->buffer
+pos
)))
582 if (!((c
>= '0') && (c
<= '9')))
589 buf
->rem_bytes
-= pos
;
591 sscanf(tmp
, "%d", &integer
);
593 TRACE("Found integer %s - %d\n", tmp
, integer
);
595 *(DWORD
*)buf
->value
= integer
;
600 static WORD
parse_TOKEN(parse_buffer
* buf
)
609 if (!read_bytes(buf
, &c
, 1))
611 /*TRACE("char = '%c'\n", is_space(c) ? ' ' : c);*/
612 if ((c
== '#') || (c
== '/'))
614 /* Handle comment (# or //) */
617 if (!read_bytes(buf
, &c
, 1))
625 if (!read_bytes(buf
, &c
, 1))
632 if (is_operator(c
) && (c
!= '<'))
634 token
= get_operator_token(c
);
647 if ((token
= get_keyword_token(buf
)))
657 token
= TOKEN_INTEGER
;
671 FIXME("Unrecognize element\n");
678 if (!read_bytes(buf
, &token
, 2))
688 if (!read_bytes(buf
, &count
, 4))
690 if (!read_bytes(buf
, strname
, count
))
693 /*TRACE("name = %s\n", strname);*/
695 strcpy((char*)buf
->value
, strname
);
702 if (!read_bytes(buf
, &integer
, 4))
704 /*TRACE("integer = %ld\n", integer);*/
706 *(DWORD
*)buf
->value
= integer
;
714 if (!read_bytes(buf
, &class_id
, 16))
716 sprintf(strguid
, CLSIDFMT
, class_id
.Data1
, class_id
.Data2
, class_id
.Data3
, class_id
.Data4
[0],
717 class_id
.Data4
[1], class_id
.Data4
[2], class_id
.Data4
[3], class_id
.Data4
[4], class_id
.Data4
[5],
718 class_id
.Data4
[6], class_id
.Data4
[7]);
719 /*TRACE("guid = {%s}\n", strguid);*/
721 *(GUID
*)buf
->value
= class_id
;
725 case TOKEN_INTEGER_LIST
:
726 case TOKEN_FLOAT_LIST
:
737 case TOKEN_SEMICOLON
:
763 static const char* get_primitive_string(WORD token
)
797 static WORD
get_TOKEN(parse_buffer
* buf
)
799 if (buf
->token_present
)
801 buf
->token_present
= FALSE
;
802 return buf
->current_token
;
805 buf
->current_token
= parse_TOKEN(buf
);
807 return buf
->current_token
;
810 static WORD
check_TOKEN(parse_buffer
* buf
)
812 if (buf
->token_present
)
813 return buf
->current_token
;
815 buf
->current_token
= parse_TOKEN(buf
);
816 buf
->token_present
= TRUE
;
818 return buf
->current_token
;
821 static inline BOOL
is_primitive_type(WORD token
)
846 static BOOL
parse_template_option_info(parse_buffer
* buf
)
848 xtemplate
* cur_template
= &buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
];
850 if (check_TOKEN(buf
) == TOKEN_DOT
)
853 if (get_TOKEN(buf
) != TOKEN_DOT
)
855 if (get_TOKEN(buf
) != TOKEN_DOT
)
857 cur_template
->open
= TRUE
;
863 if (get_TOKEN(buf
) != TOKEN_NAME
)
865 strcpy(cur_template
->childs
[cur_template
->nb_childs
], (char*)buf
->value
);
866 if (check_TOKEN(buf
) == TOKEN_GUID
)
868 cur_template
->nb_childs
++;
869 if (check_TOKEN(buf
) != TOKEN_COMMA
)
873 cur_template
->open
= FALSE
;
879 static BOOL
parse_template_members_list(parse_buffer
* buf
)
888 cur_member
= &buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].members
[idx_member
];
890 if (check_TOKEN(buf
) == TOKEN_ARRAY
)
896 if (check_TOKEN(buf
) == TOKEN_NAME
)
898 cur_member
->type
= get_TOKEN(buf
);
899 cur_member
->idx_template
= 0;
900 while (cur_member
->idx_template
< buf
->pdxf
->nb_xtemplates
)
902 if (!strcmp((char*)buf
->value
, buf
->pdxf
->xtemplates
[cur_member
->idx_template
].name
))
904 cur_member
->idx_template
++;
906 if (cur_member
->idx_template
== buf
->pdxf
->nb_xtemplates
)
908 TRACE("Reference to a nonexistent template '%s'\n", (char*)buf
->value
);
912 else if (is_primitive_type(check_TOKEN(buf
)))
913 cur_member
->type
= get_TOKEN(buf
);
917 if (get_TOKEN(buf
) != TOKEN_NAME
)
919 strcpy(cur_member
->name
, (char*)buf
->value
);
923 while (check_TOKEN(buf
) == TOKEN_OBRACKET
)
927 FIXME("No support for multi-dimensional array yet\n");
931 if (check_TOKEN(buf
) == TOKEN_INTEGER
)
934 cur_member
->dim_fixed
[nb_dims
] = TRUE
;
935 cur_member
->dim_value
[nb_dims
] = *(DWORD
*)buf
->value
;
939 if (get_TOKEN(buf
) != TOKEN_NAME
)
941 cur_member
->dim_fixed
[nb_dims
] = FALSE
;
942 /* Hack: Assume array size is specified in previous member */
943 cur_member
->dim_value
[nb_dims
] = idx_member
- 1;
945 if (get_TOKEN(buf
) != TOKEN_CBRACKET
)
951 cur_member
->nb_dims
= nb_dims
;
953 if (get_TOKEN(buf
) != TOKEN_SEMICOLON
)
959 buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].nb_members
= idx_member
;
964 static BOOL
parse_template_parts(parse_buffer
* buf
)
966 if (!parse_template_members_list(buf
))
968 if (check_TOKEN(buf
) == TOKEN_OBRACKET
)
971 if (!parse_template_option_info(buf
))
973 if (get_TOKEN(buf
) != TOKEN_CBRACKET
)
980 static BOOL
parse_template(parse_buffer
* buf
)
982 if (get_TOKEN(buf
) != TOKEN_TEMPLATE
)
984 if (get_TOKEN(buf
) != TOKEN_NAME
)
986 strcpy(buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].name
, (char*)buf
->value
);
987 if (get_TOKEN(buf
) != TOKEN_OBRACE
)
989 if (get_TOKEN(buf
) != TOKEN_GUID
)
991 buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].class_id
= *(GUID
*)buf
->value
;
992 if (!parse_template_parts(buf
))
994 if (get_TOKEN(buf
) != TOKEN_CBRACE
)
998 /* Go to the next template */
999 while (buf
->rem_bytes
&& is_space(*buf
->buffer
))
1006 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
));
1007 buf
->pdxf
->nb_xtemplates
++;
1012 static HRESULT WINAPI
IDirectXFileImpl_RegisterTemplates(IDirectXFile
* iface
, LPVOID pvData
, DWORD cbSize
)
1014 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
1018 buf
.buffer
= (LPBYTE
)pvData
;
1019 buf
.rem_bytes
= cbSize
;
1021 buf
.token_present
= FALSE
;
1024 TRACE("(%p/%p)->(%p,%d)\n", This
, iface
, pvData
, cbSize
);
1027 return DXFILEERR_BADVALUE
;
1030 return DXFILEERR_BADFILETYPE
;
1032 if (TRACE_ON(d3dxof
))
1035 memcpy(string
, pvData
, 16);
1037 TRACE("header = '%s'\n", string
);
1040 read_bytes(&buf
, &token_header
, 4);
1042 if (token_header
!= XOFFILE_FORMAT_MAGIC
)
1043 return DXFILEERR_BADFILETYPE
;
1045 read_bytes(&buf
, &token_header
, 4);
1047 if (token_header
!= XOFFILE_FORMAT_VERSION
)
1048 return DXFILEERR_BADFILEVERSION
;
1050 read_bytes(&buf
, &token_header
, 4);
1052 if ((token_header
!= XOFFILE_FORMAT_BINARY
) && (token_header
!= XOFFILE_FORMAT_TEXT
) && (token_header
!= XOFFILE_FORMAT_COMPRESSED
))
1053 return DXFILEERR_BADFILETYPE
;
1055 if (token_header
== XOFFILE_FORMAT_TEXT
)
1060 if (token_header
== XOFFILE_FORMAT_COMPRESSED
)
1062 FIXME("Compressed formats not supported yet\n");
1063 return DXFILEERR_BADVALUE
;
1066 read_bytes(&buf
, &token_header
, 4);
1068 if ((token_header
!= XOFFILE_FORMAT_FLOAT_BITS_32
) && (token_header
!= XOFFILE_FORMAT_FLOAT_BITS_64
))
1069 return DXFILEERR_BADFILEFLOATSIZE
;
1071 TRACE("Header is correct\n");
1073 while (buf
.rem_bytes
)
1075 if (!parse_template(&buf
))
1077 TRACE("Template is not correct\n");
1078 return DXFILEERR_BADVALUE
;
1082 TRACE("Template successfully parsed:\n");
1083 if (TRACE_ON(d3dxof
))
1088 i
= This
->nb_xtemplates
- 1;
1089 clsid
= &This
->xtemplates
[i
].class_id
;
1091 DPRINTF("template %s\n", This
->xtemplates
[i
].name
);
1093 DPRINTF(CLSIDFMT
"\n", clsid
->Data1
, clsid
->Data2
, clsid
->Data3
, clsid
->Data4
[0],
1094 clsid
->Data4
[1], clsid
->Data4
[2], clsid
->Data4
[3], clsid
->Data4
[4], clsid
->Data4
[5], clsid
->Data4
[6], clsid
->Data4
[7]);
1095 for (j
= 0; j
< This
->xtemplates
[i
].nb_members
; j
++)
1097 if (This
->xtemplates
[i
].members
[j
].nb_dims
)
1099 if (This
->xtemplates
[i
].members
[j
].type
== TOKEN_NAME
)
1100 DPRINTF("%s ", This
->xtemplates
[This
->xtemplates
[i
].members
[j
].idx_template
].name
);
1102 DPRINTF("%s ", get_primitive_string(This
->xtemplates
[i
].members
[j
].type
));
1103 DPRINTF("%s", This
->xtemplates
[i
].members
[j
].name
);
1104 for (k
= 0; k
< This
->xtemplates
[i
].members
[j
].nb_dims
; k
++)
1106 if (This
->xtemplates
[i
].members
[j
].dim_fixed
[k
])
1107 DPRINTF("[%d]", This
->xtemplates
[i
].members
[j
].dim_value
[k
]);
1109 DPRINTF("[%s]", This
->xtemplates
[i
].members
[This
->xtemplates
[i
].members
[j
].dim_value
[k
]].name
);
1113 if (This
->xtemplates
[i
].open
)
1115 else if (This
->xtemplates
[i
].nb_childs
)
1117 DPRINTF("[%s", This
->xtemplates
[i
].childs
[0]);
1118 for (j
= 1; j
< This
->xtemplates
[i
].nb_childs
; j
++)
1119 DPRINTF(",%s", This
->xtemplates
[i
].childs
[j
]);
1127 if (TRACE_ON(d3dxof
))
1130 TRACE("Registered templates (%d):\n", This
->nb_xtemplates
);
1131 for (i
= 0; i
< This
->nb_xtemplates
; i
++)
1132 DPRINTF("%s - %s\n", This
->xtemplates
[i
].name
, debugstr_guid(&This
->xtemplates
[i
].class_id
));
1138 static const IDirectXFileVtbl IDirectXFile_Vtbl
=
1140 IDirectXFileImpl_QueryInterface
,
1141 IDirectXFileImpl_AddRef
,
1142 IDirectXFileImpl_Release
,
1143 IDirectXFileImpl_CreateEnumObject
,
1144 IDirectXFileImpl_CreateSaveObject
,
1145 IDirectXFileImpl_RegisterTemplates
1148 HRESULT
IDirectXFileBinaryImpl_Create(IDirectXFileBinaryImpl
** ppObj
)
1150 IDirectXFileBinaryImpl
* object
;
1152 TRACE("(%p)\n", ppObj
);
1154 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileBinaryImpl
));
1156 object
->lpVtbl
.lpVtbl
= &IDirectXFileBinary_Vtbl
;
1164 /*** IUnknown methods ***/
1165 static HRESULT WINAPI
IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary
* iface
, REFIID riid
, void** ppvObject
)
1167 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1169 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1171 if (IsEqualGUID(riid
, &IID_IUnknown
)
1172 || IsEqualGUID(riid
, &IID_IDirectXFileObject
)
1173 || IsEqualGUID(riid
, &IID_IDirectXFileBinary
))
1175 IClassFactory_AddRef(iface
);
1180 /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
1181 if (!IsEqualGUID(riid
, &IID_IDirectXFileData
)
1182 && !IsEqualGUID(riid
, &IID_IDirectXFileDataReference
))
1183 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1185 return E_NOINTERFACE
;
1188 static ULONG WINAPI
IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary
* iface
)
1190 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1191 ULONG ref
= InterlockedIncrement(&This
->ref
);
1193 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1198 static ULONG WINAPI
IDirectXFileBinaryImpl_Release(IDirectXFileBinary
* iface
)
1200 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1201 ULONG ref
= InterlockedDecrement(&This
->ref
);
1203 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1206 HeapFree(GetProcessHeap(), 0, This
);
1211 /*** IDirectXFileObject methods ***/
1212 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetName(IDirectXFileBinary
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1215 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1217 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1219 return DXFILEERR_BADVALUE
;
1222 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetId(IDirectXFileBinary
* iface
, LPGUID pGuid
)
1224 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1226 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
1228 return DXFILEERR_BADVALUE
;
1231 /*** IDirectXFileBinary methods ***/
1232 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary
* iface
, DWORD
* pcbSize
)
1234 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1236 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pcbSize
);
1238 return DXFILEERR_BADVALUE
;
1241 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary
* iface
, LPCSTR
* pszMimeType
)
1243 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1245 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pszMimeType
);
1247 return DXFILEERR_BADVALUE
;
1250 static HRESULT WINAPI
IDirectXFileBinaryImpl_Read(IDirectXFileBinary
* iface
, LPVOID pvData
, DWORD cbSize
, LPDWORD pcbRead
)
1252 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1254 FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This
, iface
, pvData
, cbSize
, pcbRead
);
1256 return DXFILEERR_BADVALUE
;
1259 static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl
=
1261 IDirectXFileBinaryImpl_QueryInterface
,
1262 IDirectXFileBinaryImpl_AddRef
,
1263 IDirectXFileBinaryImpl_Release
,
1264 IDirectXFileBinaryImpl_GetName
,
1265 IDirectXFileBinaryImpl_GetId
,
1266 IDirectXFileBinaryImpl_GetSize
,
1267 IDirectXFileBinaryImpl_GetMimeType
,
1268 IDirectXFileBinaryImpl_Read
1271 HRESULT
IDirectXFileDataImpl_Create(IDirectXFileDataImpl
** ppObj
)
1273 IDirectXFileDataImpl
* object
;
1275 TRACE("(%p)\n", ppObj
);
1277 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileDataImpl
));
1279 object
->lpVtbl
.lpVtbl
= &IDirectXFileData_Vtbl
;
1287 /*** IUnknown methods ***/
1288 static HRESULT WINAPI
IDirectXFileDataImpl_QueryInterface(IDirectXFileData
* iface
, REFIID riid
, void** ppvObject
)
1290 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1292 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1294 if (IsEqualGUID(riid
, &IID_IUnknown
)
1295 || IsEqualGUID(riid
, &IID_IDirectXFileObject
)
1296 || IsEqualGUID(riid
, &IID_IDirectXFileData
))
1298 IClassFactory_AddRef(iface
);
1303 /* Do not print an error for interfaces that can be queried to retreive the type of the object */
1304 if (!IsEqualGUID(riid
, &IID_IDirectXFileBinary
)
1305 && !IsEqualGUID(riid
, &IID_IDirectXFileDataReference
))
1306 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1308 return E_NOINTERFACE
;
1311 static ULONG WINAPI
IDirectXFileDataImpl_AddRef(IDirectXFileData
* iface
)
1313 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1314 ULONG ref
= InterlockedIncrement(&This
->ref
);
1316 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1321 static ULONG WINAPI
IDirectXFileDataImpl_Release(IDirectXFileData
* iface
)
1323 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1324 ULONG ref
= InterlockedDecrement(&This
->ref
);
1326 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1329 HeapFree(GetProcessHeap(), 0, This
);
1334 /*** IDirectXFileObject methods ***/
1335 static HRESULT WINAPI
IDirectXFileDataImpl_GetName(IDirectXFileData
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1338 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1340 TRACE("(%p/%p)->(%p,%p)\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1343 return DXFILEERR_BADVALUE
;
1345 strcpy(pstrNameBuf
, This
->pobj
->name
);
1350 static HRESULT WINAPI
IDirectXFileDataImpl_GetId(IDirectXFileData
* iface
, LPGUID pGuid
)
1352 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1354 TRACE("(%p/%p)->(%p)\n", This
, iface
, pGuid
);
1357 return DXFILEERR_BADVALUE
;
1359 memcpy(pGuid
, &This
->pobj
->class_id
, 16);
1364 /*** IDirectXFileData methods ***/
1365 static HRESULT WINAPI
IDirectXFileDataImpl_GetData(IDirectXFileData
* iface
, LPCSTR szMember
, DWORD
* pcbSize
, void** ppvData
)
1367 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1369 TRACE("(%p/%p)->(%s,%p,%p)\n", This
, iface
, szMember
, pcbSize
, ppvData
);
1371 if (!pcbSize
|| !ppvData
)
1372 return DXFILEERR_BADVALUE
;
1376 FIXME("Specifying a member is not supported yet!\n");
1377 return DXFILEERR_BADVALUE
;
1380 *pcbSize
= This
->pobj
->size
;
1381 *ppvData
= This
->pobj
->pdata
;
1386 static HRESULT WINAPI
IDirectXFileDataImpl_GetType(IDirectXFileData
* iface
, const GUID
** pguid
)
1388 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1391 TRACE("(%p/%p)->(%p)\n", This
, iface
, pguid
);
1394 return DXFILEERR_BADVALUE
;
1396 memcpy(&guid
, &This
->pobj
->type
, 16);
1402 static HRESULT WINAPI
IDirectXFileDataImpl_GetNextObject(IDirectXFileData
* iface
, LPDIRECTXFILEOBJECT
* ppChildObj
)
1405 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1406 IDirectXFileDataImpl
*object
;
1408 TRACE("(%p/%p)->(%p)\n", This
, iface
, ppChildObj
);
1410 if (This
->cur_enum_object
>= This
->pobj
->nb_childs
)
1411 return DXFILEERR_NOMOREOBJECTS
;
1413 hr
= IDirectXFileDataImpl_Create(&object
);
1415 return DXFILEERR_BADVALUE
;
1417 object
->pobj
= This
->pobj
->childs
[This
->cur_enum_object
++];
1418 object
->cur_enum_object
= 0;
1420 *ppChildObj
= (LPDIRECTXFILEOBJECT
)object
;
1425 static HRESULT WINAPI
IDirectXFileDataImpl_AddDataObject(IDirectXFileData
* iface
, LPDIRECTXFILEDATA pDataObj
)
1427 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1429 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pDataObj
);
1431 return DXFILEERR_BADVALUE
;
1434 static HRESULT WINAPI
IDirectXFileDataImpl_AddDataReference(IDirectXFileData
* iface
, LPCSTR szRef
, const GUID
* pguidRef
)
1436 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1438 FIXME("(%p/%p)->(%s,%p) stub!\n", This
, iface
, szRef
, pguidRef
);
1440 return DXFILEERR_BADVALUE
;
1443 static HRESULT WINAPI
IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData
* iface
, LPCSTR szName
, const GUID
* pguid
, LPCSTR szMimeType
, LPVOID pvData
, DWORD cbSize
)
1445 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1447 FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This
, iface
, szName
, pguid
, szMimeType
, pvData
, cbSize
);
1449 return DXFILEERR_BADVALUE
;
1452 static const IDirectXFileDataVtbl IDirectXFileData_Vtbl
=
1454 IDirectXFileDataImpl_QueryInterface
,
1455 IDirectXFileDataImpl_AddRef
,
1456 IDirectXFileDataImpl_Release
,
1457 IDirectXFileDataImpl_GetName
,
1458 IDirectXFileDataImpl_GetId
,
1459 IDirectXFileDataImpl_GetData
,
1460 IDirectXFileDataImpl_GetType
,
1461 IDirectXFileDataImpl_GetNextObject
,
1462 IDirectXFileDataImpl_AddDataObject
,
1463 IDirectXFileDataImpl_AddDataReference
,
1464 IDirectXFileDataImpl_AddBinaryObject
1467 HRESULT
IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImpl
** ppObj
)
1469 IDirectXFileDataReferenceImpl
* object
;
1471 TRACE("(%p)\n", ppObj
);
1473 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileDataReferenceImpl
));
1475 object
->lpVtbl
.lpVtbl
= &IDirectXFileDataReference_Vtbl
;
1483 /*** IUnknown methods ***/
1484 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference
* iface
, REFIID riid
, void** ppvObject
)
1486 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1488 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1490 if (IsEqualGUID(riid
, &IID_IUnknown
)
1491 || IsEqualGUID(riid
, &IID_IDirectXFileObject
)
1492 || IsEqualGUID(riid
, &IID_IDirectXFileDataReference
))
1494 IClassFactory_AddRef(iface
);
1499 /* Do not print an error for interfaces that can be queried to retreive the type of the object */
1500 if (!IsEqualGUID(riid
, &IID_IDirectXFileData
)
1501 && !IsEqualGUID(riid
, &IID_IDirectXFileBinary
))
1502 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1504 return E_NOINTERFACE
;
1507 static ULONG WINAPI
IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference
* iface
)
1509 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1510 ULONG ref
= InterlockedIncrement(&This
->ref
);
1512 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1517 static ULONG WINAPI
IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference
* iface
)
1519 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1520 ULONG ref
= InterlockedDecrement(&This
->ref
);
1522 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1525 HeapFree(GetProcessHeap(), 0, This
);
1530 /*** IDirectXFileObject methods ***/
1531 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataReference
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1533 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1535 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1537 return DXFILEERR_BADVALUE
;
1540 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference
* iface
, LPGUID pGuid
)
1542 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1544 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
1546 return DXFILEERR_BADVALUE
;
1549 /*** IDirectXFileDataReference ***/
1550 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference
* iface
, LPDIRECTXFILEDATA
* ppDataObj
)
1552 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1554 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppDataObj
);
1556 return DXFILEERR_BADVALUE
;
1559 static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl
=
1561 IDirectXFileDataReferenceImpl_QueryInterface
,
1562 IDirectXFileDataReferenceImpl_AddRef
,
1563 IDirectXFileDataReferenceImpl_Release
,
1564 IDirectXFileDataReferenceImpl_GetName
,
1565 IDirectXFileDataReferenceImpl_GetId
,
1566 IDirectXFileDataReferenceImpl_Resolve
1569 HRESULT
IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl
** ppObj
)
1571 IDirectXFileEnumObjectImpl
* object
;
1573 TRACE("(%p)\n", ppObj
);
1575 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileEnumObjectImpl
));
1577 object
->lpVtbl
.lpVtbl
= &IDirectXFileEnumObject_Vtbl
;
1585 /*** IUnknown methods ***/
1586 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject
* iface
, REFIID riid
, void** ppvObject
)
1588 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1590 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1592 if (IsEqualGUID(riid
, &IID_IUnknown
)
1593 || IsEqualGUID(riid
, &IID_IDirectXFileEnumObject
))
1595 IClassFactory_AddRef(iface
);
1600 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1601 return E_NOINTERFACE
;
1604 static ULONG WINAPI
IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject
* iface
)
1606 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1607 ULONG ref
= InterlockedIncrement(&This
->ref
);
1609 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1614 static ULONG WINAPI
IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject
* iface
)
1616 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1617 ULONG ref
= InterlockedDecrement(&This
->ref
);
1619 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1622 HeapFree(GetProcessHeap(), 0, This
);
1627 static BOOL
parse_object_members_list(parse_buffer
* buf
)
1631 xtemplate
* pt
= buf
->pxt
[buf
->level
];
1632 DWORD last_dword
= 0;
1634 for (i
= 0; i
< pt
->nb_members
; i
++)
1638 if (pt
->members
[i
].nb_dims
> 1)
1640 FIXME("Arrays with dimension > 1 not yet supported\n");
1643 else if (pt
->members
[i
].nb_dims
)
1645 if (!pt
->members
[i
].dim_fixed
[0])
1649 FIXME("Array with variable must be preceded by the size\n");
1652 nb_elems
= last_dword
;
1653 /*FIXME("Arrays with variable size not yet supported\n");
1657 nb_elems
= pt
->members
[i
].dim_value
[0];
1662 for (k
= 0; k
< nb_elems
; k
++)
1666 if (get_TOKEN(buf
) != TOKEN_COMMA
)
1670 if (pt
->members
[i
].type
== TOKEN_NAME
)
1674 TRACE("Found suboject %s\n", buf
->pdxf
->xtemplates
[pt
->members
[i
].idx_template
].name
);
1676 /* To do template lookup */
1677 for (j
= 0; j
< buf
->pdxf
->nb_xtemplates
; j
++)
1679 if (!strcmp(buf
->pdxf
->xtemplates
[pt
->members
[i
].idx_template
].name
, buf
->pdxf
->xtemplates
[j
].name
))
1681 buf
->pxt
[buf
->level
] = &buf
->pdxf
->xtemplates
[j
];
1685 if (j
== buf
->pdxf
->nb_xtemplates
)
1687 FIXME("Unknown template %s\n", (char*)buf
->value
);
1691 TRACE("Enter %s\n", buf
->pdxf
->xtemplates
[pt
->members
[i
].idx_template
].name
);
1692 if (!parse_object_parts(buf
, FALSE
))
1698 /*if (get_TOKEN(buf) != TOKEN_SEMICOLON)
1703 token
= check_TOKEN(buf
);
1704 if (token
== TOKEN_INTEGER
)
1707 last_dword
= *(DWORD
*)buf
->value
;
1708 TRACE("%s = %d\n", pt
->members
[i
].name
, *(DWORD
*)buf
->value
);
1709 /* Assume larger size */
1710 if ((buf
->cur_pdata
- buf
->pxo
->pdata
+ 4) > MAX_DATA_SIZE
)
1712 WARN("Buffer too small\n");
1715 if (pt
->members
[i
].type
== TOKEN_WORD
)
1717 *(((WORD
*)(buf
->cur_pdata
))) = (WORD
)(*(DWORD
*)buf
->value
);
1718 buf
->cur_pdata
+= 2;
1720 else if (pt
->members
[i
].type
== TOKEN_DWORD
)
1722 *(((DWORD
*)(buf
->cur_pdata
))) = (DWORD
)(*(DWORD
*)buf
->value
);
1723 buf
->cur_pdata
+= 4;
1727 FIXME("Token %d not supported\n", pt
->members
[i
].type
);
1731 else if (token
== TOKEN_FLOAT
)
1734 TRACE("%s = %f\n", pt
->members
[i
].name
, *(float*)buf
->value
);
1735 /* Assume larger size */
1736 if ((buf
->cur_pdata
- buf
->pxo
->pdata
+ 4) > MAX_DATA_SIZE
)
1738 WARN("Buffer too small\n");
1741 if (pt
->members
[i
].type
== TOKEN_FLOAT
)
1743 *(((float*)(buf
->cur_pdata
))) = (float)(*(float*)buf
->value
);
1744 buf
->cur_pdata
+= 4;
1748 FIXME("Token %d not supported\n", pt
->members
[i
].type
);
1757 token
= get_TOKEN(buf
);
1758 if (token
!= TOKEN_SEMICOLON
)
1760 /* Allow comma instead of semicolon in some specific cases */
1761 if (!((token
== TOKEN_COMMA
) && ((i
+1) < pt
->nb_members
) && (pt
->members
[i
].type
== pt
->members
[i
+1].type
)
1762 && (!pt
->members
[i
].nb_dims
) && (!pt
->members
[i
+1].nb_dims
)))
1770 static BOOL
parse_object_parts(parse_buffer
* buf
, BOOL allow_optional
)
1772 if (!parse_object_members_list(buf
))
1777 buf
->pxo
->size
= buf
->cur_pdata
- buf
->pxo
->pdata
;
1779 /* Skip trailing semicolon */
1780 while (check_TOKEN(buf
) == TOKEN_SEMICOLON
)
1785 if (check_TOKEN(buf
) == TOKEN_OBRACE
)
1788 if (get_TOKEN(buf
) != TOKEN_NAME
)
1790 if (get_TOKEN(buf
) != TOKEN_CBRACE
)
1793 else if (check_TOKEN(buf
) == TOKEN_NAME
)
1795 xobject
* pxo
= buf
->pxo
;
1796 buf
->pxo
= buf
->pxo
->childs
[buf
->pxo
->nb_childs
] = &buf
->pxo_tab
[buf
->cur_subobject
++];
1798 TRACE("Enter optional %s\n", (char*)buf
->value
);
1800 if (!parse_object(buf
))
1807 buf
->pxo
->nb_childs
++;
1817 static BOOL
parse_object(parse_buffer
* buf
)
1821 buf
->pxo
->pdata
= buf
->cur_pdata
;
1823 if (get_TOKEN(buf
) != TOKEN_NAME
)
1826 /* To do template lookup */
1827 for (i
= 0; i
< buf
->pdxf
->nb_xtemplates
; i
++)
1829 if (!strcmp((char*)buf
->value
, buf
->pdxf
->xtemplates
[i
].name
))
1831 buf
->pxt
[buf
->level
] = &buf
->pdxf
->xtemplates
[i
];
1832 memcpy(&buf
->pxo
->type
, &buf
->pdxf
->xtemplates
[i
].class_id
, 16);
1836 if (i
== buf
->pdxf
->nb_xtemplates
)
1838 FIXME("Unknown template %s\n", (char*)buf
->value
);
1842 if (check_TOKEN(buf
) == TOKEN_NAME
)
1845 strcpy(buf
->pxo
->name
, (char*)buf
->value
);
1848 buf
->pxo
->name
[0] = 0;
1850 if (get_TOKEN(buf
) != TOKEN_OBRACE
)
1852 if (check_TOKEN(buf
) == TOKEN_GUID
)
1855 memcpy(&buf
->pxo
->class_id
, buf
->value
, 16);
1858 memset(&buf
->pxo
->class_id
, 0, 16);
1860 if (!parse_object_parts(buf
, TRUE
))
1862 if (get_TOKEN(buf
) != TOKEN_CBRACE
)
1867 /* Go to the next object */
1868 while (buf
->rem_bytes
&& is_space(*buf
->buffer
))
1878 /*** IDirectXFileEnumObject methods ***/
1879 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileEnumObject
* iface
, LPDIRECTXFILEDATA
* ppDataObj
)
1881 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1882 IDirectXFileDataImpl
* object
;
1886 TRACE("(%p/%p)->(%p)\n", This
, iface
, ppDataObj
);
1888 if (!This
->buf
.rem_bytes
)
1889 return DXFILEERR_NOMOREOBJECTS
;
1891 hr
= IDirectXFileDataImpl_Create(&object
);
1895 This
->buf
.pxo_tab
= &This
->xobjects
[This
->nb_xobjects
][0];
1896 This
->buf
.cur_subobject
= 0;
1897 This
->buf
.pxo
= &This
->buf
.pxo_tab
[This
->buf
.cur_subobject
++];
1899 pdata
= HeapAlloc(GetProcessHeap(), 0, MAX_DATA_SIZE
);
1902 WARN("Out of memory\n");
1903 return DXFILEERR_BADALLOC
;
1905 This
->buf
.cur_pdata
= pdata
;
1906 This
->buf
.level
= 0;
1908 if (!parse_object(&This
->buf
))
1910 TRACE("Object is not correct\n");
1911 HeapFree(GetProcessHeap(), 0, This
->buf
.pxo
->pdata
);
1912 return DXFILEERR_PARSEERROR
;
1915 object
->pobj
= This
->buf
.pxo
;
1916 object
->cur_enum_object
= 0;
1918 *ppDataObj
= (LPDIRECTXFILEDATA
)object
;
1923 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject
* iface
, REFGUID rguid
, LPDIRECTXFILEDATA
* ppDataObj
)
1925 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1927 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, rguid
, ppDataObj
);
1929 return DXFILEERR_BADVALUE
;
1932 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject
* iface
, LPCSTR szName
, LPDIRECTXFILEDATA
* ppDataObj
)
1934 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1936 FIXME("(%p/%p)->(%s,%p) stub!\n", This
, iface
, szName
, ppDataObj
);
1938 return DXFILEERR_BADVALUE
;
1941 static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl
=
1943 IDirectXFileEnumObjectImpl_QueryInterface
,
1944 IDirectXFileEnumObjectImpl_AddRef
,
1945 IDirectXFileEnumObjectImpl_Release
,
1946 IDirectXFileEnumObjectImpl_GetNextDataObject
,
1947 IDirectXFileEnumObjectImpl_GetDataObjectById
,
1948 IDirectXFileEnumObjectImpl_GetDataObjectByName
1951 HRESULT
IDirectXFileObjectImpl_Create(IDirectXFileObjectImpl
** ppObj
)
1953 IDirectXFileObjectImpl
* object
;
1955 TRACE("(%p)\n", ppObj
);
1957 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileObjectImpl
));
1959 object
->lpVtbl
.lpVtbl
= &IDirectXFileObject_Vtbl
;
1967 /*** IUnknown methods ***/
1968 static HRESULT WINAPI
IDirectXFileObjectImpl_QueryInterface(IDirectXFileObject
* iface
, REFIID riid
, void** ppvObject
)
1970 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1972 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1974 if (IsEqualGUID(riid
, &IID_IUnknown
)
1975 || IsEqualGUID(riid
, &IID_IDirectXFileObject
))
1977 IClassFactory_AddRef(iface
);
1982 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1983 return E_NOINTERFACE
;
1986 static ULONG WINAPI
IDirectXFileObjectImpl_AddRef(IDirectXFileObject
* iface
)
1988 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1989 ULONG ref
= InterlockedIncrement(&This
->ref
);
1991 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1996 static ULONG WINAPI
IDirectXFileObjectImpl_Release(IDirectXFileObject
* iface
)
1998 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1999 ULONG ref
= InterlockedDecrement(&This
->ref
);
2001 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
2004 HeapFree(GetProcessHeap(), 0, This
);
2009 /*** IDirectXFileObject methods ***/
2010 static HRESULT WINAPI
IDirectXFileObjectImpl_GetName(IDirectXFileObject
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
2012 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
2014 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
2016 return DXFILEERR_BADVALUE
;
2019 static HRESULT WINAPI
IDirectXFileObjectImpl_GetId(IDirectXFileObject
* iface
, LPGUID pGuid
)
2021 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
2023 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
2025 return DXFILEERR_BADVALUE
;
2028 static const IDirectXFileObjectVtbl IDirectXFileObject_Vtbl
=
2030 IDirectXFileObjectImpl_QueryInterface
,
2031 IDirectXFileObjectImpl_AddRef
,
2032 IDirectXFileObjectImpl_Release
,
2033 IDirectXFileObjectImpl_GetName
,
2034 IDirectXFileObjectImpl_GetId
2037 HRESULT
IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl
** ppObj
)
2039 IDirectXFileSaveObjectImpl
* object
;
2041 TRACE("(%p)\n", ppObj
);
2043 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileSaveObjectImpl
));
2045 object
->lpVtbl
.lpVtbl
= &IDirectXFileSaveObject_Vtbl
;
2053 /*** IUnknown methods ***/
2054 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject
* iface
, REFIID riid
, void** ppvObject
)
2056 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
2058 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
2060 if (IsEqualGUID(riid
, &IID_IUnknown
)
2061 || IsEqualGUID(riid
, &IID_IDirectXFileSaveObject
))
2063 IClassFactory_AddRef(iface
);
2068 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
2069 return E_NOINTERFACE
;
2072 static ULONG WINAPI
IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject
* iface
)
2074 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
2075 ULONG ref
= InterlockedIncrement(&This
->ref
);
2077 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
2082 static ULONG WINAPI
IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject
* iface
)
2084 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
2085 ULONG ref
= InterlockedDecrement(&This
->ref
);
2087 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
2090 HeapFree(GetProcessHeap(), 0, This
);
2095 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject
* iface
, DWORD cTemplates
, const GUID
** ppguidTemplates
)
2097 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
2099 FIXME("(%p/%p)->(%d,%p) stub!\n", This
, iface
, cTemplates
, ppguidTemplates
);
2101 return DXFILEERR_BADVALUE
;
2104 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject
* iface
, REFGUID rguidTemplate
, LPCSTR szName
, const GUID
* pguid
, DWORD cbSize
, LPVOID pvData
, LPDIRECTXFILEDATA
* ppDataObj
)
2106 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
2108 FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This
, iface
, rguidTemplate
, szName
, pguid
, cbSize
, pvData
, ppDataObj
);
2110 return DXFILEERR_BADVALUE
;
2113 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject
* iface
, LPDIRECTXFILEDATA ppDataObj
)
2115 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
2117 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppDataObj
);
2119 return DXFILEERR_BADVALUE
;
2122 static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl
=
2124 IDirectXFileSaveObjectImpl_QueryInterface
,
2125 IDirectXFileSaveObjectImpl_AddRef
,
2126 IDirectXFileSaveObjectImpl_Release
,
2127 IDirectXFileSaveObjectImpl_SaveTemplates
,
2128 IDirectXFileSaveObjectImpl_CreateDataObject
,
2129 IDirectXFileSaveObjectImpl_SaveData