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
;
165 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This
, iface
, pvSource
, dwLoadOptions
, ppEnumObj
);
167 if (dwLoadOptions
== DXFILELOAD_FROMFILE
)
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
;
181 FIXME("Source type %d is not handled yet\n", dwLoadOptions
);
184 hr
= IDirectXFileEnumObjectImpl_Create(&object
);
188 *ppEnumObj
= (LPDIRECTXFILEENUMOBJECT
)object
;
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
)
206 memcpy(data
, buf
->buffer
, size
);
208 buf
->rem_bytes
-= size
;
212 static void dump_TOKEN(WORD token
)
214 #define DUMP_TOKEN(t) case t: TRACE(#t "\n"); break
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
);
250 TRACE("Unknown token %d\n", token
);
256 static BOOL
is_space(char c
)
270 static BOOL
is_operator(char c
)
289 static inline BOOL
is_separator(char c
)
291 return is_space(c
) || is_operator(c
);
294 static WORD
get_operator_token(char c
)
303 return TOKEN_OBRACKET
;
305 return TOKEN_CBRACKET
;
317 return TOKEN_SEMICOLON
;
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
)))
328 buf
->rem_bytes
-= len
;
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"))
340 if (is_keyword(buf
, "DWORD"))
342 if (is_keyword(buf
, "FLOAT"))
344 if (is_keyword(buf
, "DOUBLE"))
346 if (is_keyword(buf
, "CHAR"))
348 if (is_keyword(buf
, "UCHAR"))
350 if (is_keyword(buf
, "SWORD"))
352 if (is_keyword(buf
, "SDWORD"))
354 if (is_keyword(buf
, "VOID"))
356 if (is_keyword(buf
, "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"))
368 static BOOL
is_guid(parse_buffer
* buf
)
376 if (*buf
->buffer
!= '<')
379 while (*(buf
->buffer
+pos
) != '>')
381 tmp
[pos
] = *(buf
->buffer
+pos
);
386 if (pos
!= 37 /* <+35+> */)
388 TRACE("Wrong guid %s (%d) \n", tmp
, 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);
397 TRACE("Wrong guid %s (%d) \n", tmp
, pos
);
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
;
418 static BOOL
is_name(parse_buffer
* buf
)
424 while (!is_separator(c
= *(buf
->buffer
+pos
)))
426 if (!(((c
>= 'a') && (c
<= 'z')) || ((c
>= 'A') && (c
<= 'Z'))))
434 TRACE("Wrong name %s\n", tmp
);
439 buf
->rem_bytes
-= pos
;
441 TRACE("Found name %s\n", tmp
);
442 strcpy((char*)buf
->value
, tmp
);
447 static BOOL
is_integer(parse_buffer
* buf
)
454 while (!is_separator(c
= *(buf
->buffer
+pos
)))
456 if (!((c
>= '0') && (c
<= '9')))
463 buf
->rem_bytes
-= pos
;
465 sscanf(tmp
, "%d", &integer
);
467 TRACE("Found integer %s - %d\n", tmp
, integer
);
469 *(WORD
*)buf
->value
= integer
;
474 static WORD
parse_TOKEN_dbg_opt(parse_buffer
* buf
, BOOL show_token
)
483 if (!read_bytes(buf
, &c
, 1))
485 /*TRACE("char = '%c'\n", is_space(c) ? ' ' : c);*/
488 if (is_operator(c
) && (c
!= '<'))
490 token
= get_operator_token(c
);
503 if ((token
= get_keyword_token(buf
)))
513 token
= TOKEN_INTEGER
;
522 FIXME("Unrecognize element\n");
529 if (!read_bytes(buf
, &token
, 2))
539 case TOKEN_INTEGER_LIST
:
540 case TOKEN_FLOAT_LIST
:
551 case TOKEN_SEMICOLON
:
577 static const char* get_primitive_string(WORD token
)
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
)
622 parse_buffer save
= *buf
;
623 /*TRACE("check: ");*/
624 token
= parse_TOKEN_dbg_opt(buf
, FALSE
);
629 if (!read_bytes(buf
, &token
, 2))
641 static inline BOOL
is_primitive_type(WORD token
)
666 static BOOL
parse_name(parse_buffer
* buf
)
671 if (parse_TOKEN(buf
) != TOKEN_NAME
)
675 if (!read_bytes(buf
, &count
, 4))
677 if (!read_bytes(buf
, strname
, count
))
680 /*TRACE("name = %s\n", strname);*/
682 strcpy((char*)buf
->value
, strname
);
687 static BOOL
parse_class_id(parse_buffer
* buf
)
692 if (parse_TOKEN(buf
) != TOKEN_GUID
)
696 if (!read_bytes(buf
, &class_id
, 16))
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
;
707 static BOOL
parse_integer(parse_buffer
* buf
)
711 if (parse_TOKEN(buf
) != TOKEN_INTEGER
)
715 if (!read_bytes(buf
, &integer
, 4))
717 /*TRACE("integer = %ld\n", integer);*/
719 *(DWORD
*)buf
->value
= integer
;
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
)
731 if (parse_TOKEN(buf
) != TOKEN_DOT
)
733 if (parse_TOKEN(buf
) != TOKEN_DOT
)
735 cur_template
->open
= TRUE
;
741 if (!parse_name(buf
))
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
))
747 cur_template
->nb_childs
++;
748 if (check_TOKEN(buf
) != TOKEN_COMMA
)
752 cur_template
->open
= FALSE
;
758 static BOOL
parse_template_members_list(parse_buffer
* buf
)
766 cur_member
= &buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].members
[idx_member
];
769 if (check_TOKEN(buf
) == TOKEN_NAME
)
771 if (!parse_name(buf
))
773 while (cur_member
->idx_template
< buf
->pdxf
->nb_xtemplates
)
775 if (!strcmp((char*)buf
->value
, buf
->pdxf
->xtemplates
[cur_member
->idx_template
].name
))
777 cur_member
->idx_template
++;
779 if (cur_member
->idx_template
== buf
->pdxf
->nb_xtemplates
)
781 TRACE("Reference to non existing template '%s'\n", (char*)buf
->value
);
784 if (check_TOKEN(buf
) == TOKEN_NAME
)
785 if (!parse_name(buf
))
787 if (parse_TOKEN(buf
) != TOKEN_SEMICOLON
)
789 cur_member
->type
= TOKEN_NAME
;
790 strcpy(cur_member
->name
, (char*)buf
->value
);
793 else if (check_TOKEN(buf
) == TOKEN_ARRAY
)
800 token
= check_TOKEN(buf
);
801 if (is_primitive_type(token
))
804 cur_member
->type
= token
;
808 if (!parse_name(buf
))
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
))
816 cur_member
->idx_template
++;
818 if (cur_member
->idx_template
== buf
->pdxf
->nb_xtemplates
)
820 TRACE("Reference to non existing template '%s'\n", (char*)buf
->value
);
824 if (!parse_name(buf
))
826 strcpy(cur_member
->name
, (char*)buf
->value
);
828 while (check_TOKEN(buf
) == TOKEN_OBRACKET
)
832 FIXME("No support for multi-dimensional array yet\n");
836 if (check_TOKEN(buf
) == TOKEN_INTEGER
)
838 if (!parse_integer(buf
))
840 cur_member
->dim_fixed
[nb_dims
] = TRUE
;
841 cur_member
->dim_value
[nb_dims
] = *(DWORD
*)buf
->value
;
845 if (!parse_name(buf
))
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
)
857 if (parse_TOKEN(buf
) != TOKEN_SEMICOLON
)
859 cur_member
->nb_dims
= nb_dims
;
862 else if (is_primitive_type(check_TOKEN(buf
)))
864 cur_member
->type
= check_TOKEN(buf
);
866 if (check_TOKEN(buf
) == TOKEN_NAME
)
867 if (!parse_name(buf
))
869 strcpy(cur_member
->name
, (char*)buf
->value
);
870 if (parse_TOKEN(buf
) != TOKEN_SEMICOLON
)
879 buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].nb_members
= idx_member
;
884 static BOOL
parse_template_parts(parse_buffer
* buf
)
886 if (check_TOKEN(buf
) == TOKEN_OBRACKET
)
889 if (!parse_template_option_info(buf
))
891 if (parse_TOKEN(buf
) != TOKEN_CBRACKET
)
896 if (!parse_template_members_list(buf
))
898 if (check_TOKEN(buf
) == TOKEN_OBRACKET
)
901 if (!parse_template_option_info(buf
))
903 if (parse_TOKEN(buf
) != TOKEN_CBRACKET
)
911 static BOOL
parse_template(parse_buffer
* buf
)
913 if (parse_TOKEN(buf
) != TOKEN_TEMPLATE
)
915 if (!parse_name(buf
))
917 strcpy(buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].name
, (char*)buf
->value
);
918 if (parse_TOKEN(buf
) != TOKEN_OBRACE
)
920 if (!parse_class_id(buf
))
922 buf
->pdxf
->xtemplates
[buf
->pdxf
->nb_xtemplates
].class_id
= *(GUID
*)buf
->value
;
923 if (!parse_template_parts(buf
))
925 if (parse_TOKEN(buf
) != TOKEN_CBRACE
)
929 /* Go to the next template */
930 while (buf
->rem_bytes
)
932 if (is_space(*buf
->buffer
))
940 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
));
941 buf
->pdxf
->nb_xtemplates
++;
946 static HRESULT WINAPI
IDirectXFileImpl_RegisterTemplates(IDirectXFile
* iface
, LPVOID pvData
, DWORD cbSize
)
948 IDirectXFileImpl
*This
= (IDirectXFileImpl
*)iface
;
952 buf
.buffer
= (LPBYTE
)pvData
;
953 buf
.rem_bytes
= cbSize
;
957 FIXME("(%p/%p)->(%p,%d) partial stub!\n", This
, iface
, pvData
, cbSize
);
960 return DXFILEERR_BADVALUE
;
963 return DXFILEERR_BADFILETYPE
;
965 if (TRACE_ON(d3dxof
))
968 memcpy(string
, pvData
, 16);
970 TRACE("header = '%s'\n", string
);
973 read_bytes(&buf
, &token_header
, 4);
975 if (token_header
!= XOFFILE_FORMAT_MAGIC
)
976 return DXFILEERR_BADFILETYPE
;
978 read_bytes(&buf
, &token_header
, 4);
980 if (token_header
!= XOFFILE_FORMAT_VERSION
)
981 return DXFILEERR_BADFILEVERSION
;
983 read_bytes(&buf
, &token_header
, 4);
985 if ((token_header
!= XOFFILE_FORMAT_BINARY
) && (token_header
!= XOFFILE_FORMAT_TEXT
) && (token_header
!= XOFFILE_FORMAT_COMPRESSED
))
986 return DXFILEERR_BADFILETYPE
;
988 if (token_header
== XOFFILE_FORMAT_TEXT
)
993 if (token_header
== XOFFILE_FORMAT_COMPRESSED
)
995 FIXME("Compressed formats not supported yet");
996 return DXFILEERR_BADVALUE
;
999 read_bytes(&buf
, &token_header
, 4);
1001 if ((token_header
!= XOFFILE_FORMAT_FLOAT_BITS_32
) && (token_header
!= XOFFILE_FORMAT_FLOAT_BITS_64
))
1002 return DXFILEERR_BADFILEFLOATSIZE
;
1004 TRACE("Header is correct\n");
1006 while (buf
.rem_bytes
)
1008 if (!parse_template(&buf
))
1010 TRACE("Template is not correct\n");
1011 return DXFILEERR_BADVALUE
;
1015 TRACE("Template successfully parsed:\n");
1016 if (TRACE_ON(d3dxof
))
1021 i
= This
->nb_xtemplates
- 1;
1022 clsid
= &This
->xtemplates
[i
].class_id
;
1024 DPRINTF("template %s {\n", This
->xtemplates
[i
].name
);
1025 DPRINTF(CLSIDFMT
"\n", clsid
->Data1
, clsid
->Data2
, clsid
->Data3
, clsid
->Data4
[0],
1026 clsid
->Data4
[1], clsid
->Data4
[2], clsid
->Data4
[3], clsid
->Data4
[4], clsid
->Data4
[5], clsid
->Data4
[6], clsid
->Data4
[7]);
1027 for (j
= 0; j
< This
->xtemplates
[i
].nb_members
; j
++)
1029 if (This
->xtemplates
[i
].members
[j
].nb_dims
)
1031 if (This
->xtemplates
[i
].members
[j
].type
== TOKEN_NAME
)
1032 DPRINTF("%s ", This
->xtemplates
[This
->xtemplates
[i
].members
[j
].idx_template
].name
);
1034 DPRINTF("%s ", get_primitive_string(This
->xtemplates
[i
].members
[j
].type
));
1035 DPRINTF("%s", This
->xtemplates
[i
].members
[j
].name
);
1036 for (k
= 0; k
< This
->xtemplates
[i
].members
[j
].nb_dims
; k
++)
1038 if (This
->xtemplates
[i
].members
[j
].dim_fixed
[k
])
1039 DPRINTF("[%d]", This
->xtemplates
[i
].members
[j
].dim_value
[k
]);
1041 DPRINTF("[%s]", This
->xtemplates
[i
].members
[This
->xtemplates
[i
].members
[j
].dim_value
[k
]].name
);
1045 if (This
->xtemplates
[i
].open
)
1047 else if (This
->xtemplates
[i
].nb_childs
)
1049 DPRINTF("[%s", This
->xtemplates
[i
].childs
[0]);
1050 for (j
= 1; j
< This
->xtemplates
[i
].nb_childs
; j
++)
1051 DPRINTF(",%s", This
->xtemplates
[i
].childs
[j
]);
1059 if (TRACE_ON(d3dxof
))
1062 TRACE("Registered templates (%d):\n", This
->nb_xtemplates
);
1063 for (i
= 0; i
< This
->nb_xtemplates
; i
++)
1064 DPRINTF("%s - %s\n", This
->xtemplates
[i
].name
, debugstr_guid(&This
->xtemplates
[i
].class_id
));
1070 static const IDirectXFileVtbl IDirectXFile_Vtbl
=
1072 IDirectXFileImpl_QueryInterface
,
1073 IDirectXFileImpl_AddRef
,
1074 IDirectXFileImpl_Release
,
1075 IDirectXFileImpl_CreateEnumObject
,
1076 IDirectXFileImpl_CreateSaveObject
,
1077 IDirectXFileImpl_RegisterTemplates
1080 HRESULT
IDirectXFileBinaryImpl_Create(IDirectXFileBinaryImpl
** ppObj
)
1082 IDirectXFileBinaryImpl
* object
;
1084 TRACE("(%p)\n", ppObj
);
1086 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileBinaryImpl
));
1088 object
->lpVtbl
.lpVtbl
= &IDirectXFileBinary_Vtbl
;
1096 /*** IUnknown methods ***/
1097 static HRESULT WINAPI
IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary
* iface
, REFIID riid
, void** ppvObject
)
1099 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1101 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1103 if (IsEqualGUID(riid
, &IID_IUnknown
)
1104 || IsEqualGUID(riid
, &IID_IDirectXFileObject
)
1105 || IsEqualGUID(riid
, &IID_IDirectXFileBinary
))
1107 IClassFactory_AddRef(iface
);
1112 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1113 return E_NOINTERFACE
;
1116 static ULONG WINAPI
IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary
* iface
)
1118 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1119 ULONG ref
= InterlockedIncrement(&This
->ref
);
1121 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1126 static ULONG WINAPI
IDirectXFileBinaryImpl_Release(IDirectXFileBinary
* iface
)
1128 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1129 ULONG ref
= InterlockedDecrement(&This
->ref
);
1131 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1134 HeapFree(GetProcessHeap(), 0, This
);
1139 /*** IDirectXFileObject methods ***/
1140 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetName(IDirectXFileBinary
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1143 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1145 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1147 return DXFILEERR_BADVALUE
;
1150 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetId(IDirectXFileBinary
* iface
, LPGUID pGuid
)
1152 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1154 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
1156 return DXFILEERR_BADVALUE
;
1159 /*** IDirectXFileBinary methods ***/
1160 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary
* iface
, DWORD
* pcbSize
)
1162 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1164 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pcbSize
);
1166 return DXFILEERR_BADVALUE
;
1169 static HRESULT WINAPI
IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary
* iface
, LPCSTR
* pszMimeType
)
1171 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1173 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pszMimeType
);
1175 return DXFILEERR_BADVALUE
;
1178 static HRESULT WINAPI
IDirectXFileBinaryImpl_Read(IDirectXFileBinary
* iface
, LPVOID pvData
, DWORD cbSize
, LPDWORD pcbRead
)
1180 IDirectXFileBinaryImpl
*This
= (IDirectXFileBinaryImpl
*)iface
;
1182 FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This
, iface
, pvData
, cbSize
, pcbRead
);
1184 return DXFILEERR_BADVALUE
;
1187 static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl
=
1189 IDirectXFileBinaryImpl_QueryInterface
,
1190 IDirectXFileBinaryImpl_AddRef
,
1191 IDirectXFileBinaryImpl_Release
,
1192 IDirectXFileBinaryImpl_GetName
,
1193 IDirectXFileBinaryImpl_GetId
,
1194 IDirectXFileBinaryImpl_GetSize
,
1195 IDirectXFileBinaryImpl_GetMimeType
,
1196 IDirectXFileBinaryImpl_Read
1199 HRESULT
IDirectXFileDataImpl_Create(IDirectXFileDataImpl
** ppObj
)
1201 IDirectXFileDataImpl
* object
;
1203 TRACE("(%p)\n", ppObj
);
1205 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileDataImpl
));
1207 object
->lpVtbl
.lpVtbl
= &IDirectXFileData_Vtbl
;
1215 /*** IUnknown methods ***/
1216 static HRESULT WINAPI
IDirectXFileDataImpl_QueryInterface(IDirectXFileData
* iface
, REFIID riid
, void** ppvObject
)
1218 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1220 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1222 if (IsEqualGUID(riid
, &IID_IUnknown
)
1223 || IsEqualGUID(riid
, &IID_IDirectXFileObject
)
1224 || IsEqualGUID(riid
, &IID_IDirectXFileData
))
1226 IClassFactory_AddRef(iface
);
1231 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1232 return E_NOINTERFACE
;
1235 static ULONG WINAPI
IDirectXFileDataImpl_AddRef(IDirectXFileData
* iface
)
1237 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1238 ULONG ref
= InterlockedIncrement(&This
->ref
);
1240 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1245 static ULONG WINAPI
IDirectXFileDataImpl_Release(IDirectXFileData
* iface
)
1247 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1248 ULONG ref
= InterlockedDecrement(&This
->ref
);
1250 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1253 HeapFree(GetProcessHeap(), 0, This
);
1258 /*** IDirectXFileObject methods ***/
1259 static HRESULT WINAPI
IDirectXFileDataImpl_GetName(IDirectXFileData
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1262 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1264 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1266 return DXFILEERR_BADVALUE
;
1269 static HRESULT WINAPI
IDirectXFileDataImpl_GetId(IDirectXFileData
* iface
, LPGUID pGuid
)
1271 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1273 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
1275 return DXFILEERR_BADVALUE
;
1278 /*** IDirectXFileData methods ***/
1279 static HRESULT WINAPI
IDirectXFileDataImpl_GetData(IDirectXFileData
* iface
, LPCSTR szMember
, DWORD
* pcbSize
, void** ppvData
)
1281 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1283 FIXME("(%p/%p)->(%s,%p,%p) stub!\n", This
, iface
, szMember
, pcbSize
, ppvData
);
1285 return DXFILEERR_BADVALUE
;
1288 static HRESULT WINAPI
IDirectXFileDataImpl_GetType(IDirectXFileData
* iface
, const GUID
** pguid
)
1290 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1292 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pguid
);
1294 return DXFILEERR_BADVALUE
;
1297 static HRESULT WINAPI
IDirectXFileDataImpl_GetNextObject(IDirectXFileData
* iface
, LPDIRECTXFILEOBJECT
* ppChildObj
)
1299 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1301 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppChildObj
);
1303 return DXFILEERR_BADVALUE
;
1306 static HRESULT WINAPI
IDirectXFileDataImpl_AddDataObject(IDirectXFileData
* iface
, LPDIRECTXFILEDATA pDataObj
)
1308 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1310 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pDataObj
);
1312 return DXFILEERR_BADVALUE
;
1315 static HRESULT WINAPI
IDirectXFileDataImpl_AddDataReference(IDirectXFileData
* iface
, LPCSTR szRef
, const GUID
* pguidRef
)
1317 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1319 FIXME("(%p/%p)->(%s,%p) stub!\n", This
, iface
, szRef
, pguidRef
);
1321 return DXFILEERR_BADVALUE
;
1324 static HRESULT WINAPI
IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData
* iface
, LPCSTR szName
, const GUID
* pguid
, LPCSTR szMimeType
, LPVOID pvData
, DWORD cbSize
)
1326 IDirectXFileDataImpl
*This
= (IDirectXFileDataImpl
*)iface
;
1328 FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This
, iface
, szName
, pguid
, szMimeType
, pvData
, cbSize
);
1330 return DXFILEERR_BADVALUE
;
1333 static const IDirectXFileDataVtbl IDirectXFileData_Vtbl
=
1335 IDirectXFileDataImpl_QueryInterface
,
1336 IDirectXFileDataImpl_AddRef
,
1337 IDirectXFileDataImpl_Release
,
1338 IDirectXFileDataImpl_GetName
,
1339 IDirectXFileDataImpl_GetId
,
1340 IDirectXFileDataImpl_GetData
,
1341 IDirectXFileDataImpl_GetType
,
1342 IDirectXFileDataImpl_GetNextObject
,
1343 IDirectXFileDataImpl_AddDataObject
,
1344 IDirectXFileDataImpl_AddDataReference
,
1345 IDirectXFileDataImpl_AddBinaryObject
1348 HRESULT
IDirectXFileDataReferenceImpl_Create(IDirectXFileDataReferenceImpl
** ppObj
)
1350 IDirectXFileDataReferenceImpl
* object
;
1352 TRACE("(%p)\n", ppObj
);
1354 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileDataReferenceImpl
));
1356 object
->lpVtbl
.lpVtbl
= &IDirectXFileDataReference_Vtbl
;
1364 /*** IUnknown methods ***/
1365 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference
* iface
, REFIID riid
, void** ppvObject
)
1367 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1369 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1371 if (IsEqualGUID(riid
, &IID_IUnknown
)
1372 || IsEqualGUID(riid
, &IID_IDirectXFileObject
)
1373 || IsEqualGUID(riid
, &IID_IDirectXFileDataReference
))
1375 IClassFactory_AddRef(iface
);
1380 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1381 return E_NOINTERFACE
;
1384 static ULONG WINAPI
IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference
* iface
)
1386 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1387 ULONG ref
= InterlockedIncrement(&This
->ref
);
1389 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1394 static ULONG WINAPI
IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference
* iface
)
1396 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1397 ULONG ref
= InterlockedDecrement(&This
->ref
);
1399 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1402 HeapFree(GetProcessHeap(), 0, This
);
1407 /*** IDirectXFileObject methods ***/
1408 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataReference
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1410 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1412 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1414 return DXFILEERR_BADVALUE
;
1417 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference
* iface
, LPGUID pGuid
)
1419 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1421 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
1423 return DXFILEERR_BADVALUE
;
1426 /*** IDirectXFileDataReference ***/
1427 static HRESULT WINAPI
IDirectXFileDataReferenceImpl_Resolve(IDirectXFileDataReference
* iface
, LPDIRECTXFILEDATA
* ppDataObj
)
1429 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1431 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppDataObj
);
1433 return DXFILEERR_BADVALUE
;
1436 static const IDirectXFileDataReferenceVtbl IDirectXFileDataReference_Vtbl
=
1438 IDirectXFileDataReferenceImpl_QueryInterface
,
1439 IDirectXFileDataReferenceImpl_AddRef
,
1440 IDirectXFileDataReferenceImpl_Release
,
1441 IDirectXFileDataReferenceImpl_GetName
,
1442 IDirectXFileDataReferenceImpl_GetId
,
1443 IDirectXFileDataReferenceImpl_Resolve
1446 HRESULT
IDirectXFileEnumObjectImpl_Create(IDirectXFileEnumObjectImpl
** ppObj
)
1448 IDirectXFileEnumObjectImpl
* object
;
1450 TRACE("(%p)\n", ppObj
);
1452 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileEnumObjectImpl
));
1454 object
->lpVtbl
.lpVtbl
= &IDirectXFileEnumObject_Vtbl
;
1462 /*** IUnknown methods ***/
1463 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject
* iface
, REFIID riid
, void** ppvObject
)
1465 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1467 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1469 if (IsEqualGUID(riid
, &IID_IUnknown
)
1470 || IsEqualGUID(riid
, &IID_IDirectXFileEnumObject
))
1472 IClassFactory_AddRef(iface
);
1477 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1478 return E_NOINTERFACE
;
1481 static ULONG WINAPI
IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject
* iface
)
1483 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1484 ULONG ref
= InterlockedIncrement(&This
->ref
);
1486 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1491 static ULONG WINAPI
IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject
* iface
)
1493 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1494 ULONG ref
= InterlockedDecrement(&This
->ref
);
1496 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1499 HeapFree(GetProcessHeap(), 0, This
);
1504 /*** IDirectXFileEnumObject methods ***/
1505 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileEnumObject
* iface
, LPDIRECTXFILEDATA
* ppDataObj
)
1507 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1508 IDirectXFileDataImpl
* object
;
1511 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppDataObj
);
1513 hr
= IDirectXFileDataImpl_Create(&object
);
1517 *ppDataObj
= (LPDIRECTXFILEDATA
)object
;
1522 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject
* iface
, REFGUID rguid
, LPDIRECTXFILEDATA
* ppDataObj
)
1524 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1526 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, rguid
, ppDataObj
);
1528 return DXFILEERR_BADVALUE
;
1531 static HRESULT WINAPI
IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject
* iface
, LPCSTR szName
, LPDIRECTXFILEDATA
* ppDataObj
)
1533 IDirectXFileEnumObjectImpl
*This
= (IDirectXFileEnumObjectImpl
*)iface
;
1535 FIXME("(%p/%p)->(%s,%p) stub!\n", This
, iface
, szName
, ppDataObj
);
1537 return DXFILEERR_BADVALUE
;
1540 static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl
=
1542 IDirectXFileEnumObjectImpl_QueryInterface
,
1543 IDirectXFileEnumObjectImpl_AddRef
,
1544 IDirectXFileEnumObjectImpl_Release
,
1545 IDirectXFileEnumObjectImpl_GetNextDataObject
,
1546 IDirectXFileEnumObjectImpl_GetDataObjectById
,
1547 IDirectXFileEnumObjectImpl_GetDataObjectByName
1550 HRESULT
IDirectXFileObjectImpl_Create(IDirectXFileObjectImpl
** ppObj
)
1552 IDirectXFileObjectImpl
* object
;
1554 TRACE("(%p)\n", ppObj
);
1556 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileObjectImpl
));
1558 object
->lpVtbl
.lpVtbl
= &IDirectXFileObject_Vtbl
;
1566 /*** IUnknown methods ***/
1567 static HRESULT WINAPI
IDirectXFileObjectImpl_QueryInterface(IDirectXFileObject
* iface
, REFIID riid
, void** ppvObject
)
1569 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1571 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1573 if (IsEqualGUID(riid
, &IID_IUnknown
)
1574 || IsEqualGUID(riid
, &IID_IDirectXFileObject
))
1576 IClassFactory_AddRef(iface
);
1581 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1582 return E_NOINTERFACE
;
1585 static ULONG WINAPI
IDirectXFileObjectImpl_AddRef(IDirectXFileObject
* iface
)
1587 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1588 ULONG ref
= InterlockedIncrement(&This
->ref
);
1590 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1595 static ULONG WINAPI
IDirectXFileObjectImpl_Release(IDirectXFileObject
* iface
)
1597 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1598 ULONG ref
= InterlockedDecrement(&This
->ref
);
1600 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1603 HeapFree(GetProcessHeap(), 0, This
);
1608 /*** IDirectXFileObject methods ***/
1609 static HRESULT WINAPI
IDirectXFileObjectImpl_GetName(IDirectXFileObject
* iface
, LPSTR pstrNameBuf
, LPDWORD pdwBufLen
)
1611 IDirectXFileDataReferenceImpl
*This
= (IDirectXFileDataReferenceImpl
*)iface
;
1613 FIXME("(%p/%p)->(%p,%p) stub!\n", This
, iface
, pstrNameBuf
, pdwBufLen
);
1615 return DXFILEERR_BADVALUE
;
1618 static HRESULT WINAPI
IDirectXFileObjectImpl_GetId(IDirectXFileObject
* iface
, LPGUID pGuid
)
1620 IDirectXFileObjectImpl
*This
= (IDirectXFileObjectImpl
*)iface
;
1622 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, pGuid
);
1624 return DXFILEERR_BADVALUE
;
1627 static const IDirectXFileObjectVtbl IDirectXFileObject_Vtbl
=
1629 IDirectXFileObjectImpl_QueryInterface
,
1630 IDirectXFileObjectImpl_AddRef
,
1631 IDirectXFileObjectImpl_Release
,
1632 IDirectXFileObjectImpl_GetName
,
1633 IDirectXFileObjectImpl_GetId
1636 HRESULT
IDirectXFileSaveObjectImpl_Create(IDirectXFileSaveObjectImpl
** ppObj
)
1638 IDirectXFileSaveObjectImpl
* object
;
1640 TRACE("(%p)\n", ppObj
);
1642 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectXFileSaveObjectImpl
));
1644 object
->lpVtbl
.lpVtbl
= &IDirectXFileSaveObject_Vtbl
;
1652 /*** IUnknown methods ***/
1653 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject
* iface
, REFIID riid
, void** ppvObject
)
1655 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
1657 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
1659 if (IsEqualGUID(riid
, &IID_IUnknown
)
1660 || IsEqualGUID(riid
, &IID_IDirectXFileSaveObject
))
1662 IClassFactory_AddRef(iface
);
1667 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
1668 return E_NOINTERFACE
;
1671 static ULONG WINAPI
IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject
* iface
)
1673 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
1674 ULONG ref
= InterlockedIncrement(&This
->ref
);
1676 TRACE("(%p/%p): AddRef from %d\n", iface
, This
, ref
- 1);
1681 static ULONG WINAPI
IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject
* iface
)
1683 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
1684 ULONG ref
= InterlockedDecrement(&This
->ref
);
1686 TRACE("(%p/%p): ReleaseRef to %d\n", iface
, This
, ref
);
1689 HeapFree(GetProcessHeap(), 0, This
);
1694 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject
* iface
, DWORD cTemplates
, const GUID
** ppguidTemplates
)
1696 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
1698 FIXME("(%p/%p)->(%d,%p) stub!\n", This
, iface
, cTemplates
, ppguidTemplates
);
1700 return DXFILEERR_BADVALUE
;
1703 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject
* iface
, REFGUID rguidTemplate
, LPCSTR szName
, const GUID
* pguid
, DWORD cbSize
, LPVOID pvData
, LPDIRECTXFILEDATA
* ppDataObj
)
1705 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
1707 FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This
, iface
, rguidTemplate
, szName
, pguid
, cbSize
, pvData
, ppDataObj
);
1709 return DXFILEERR_BADVALUE
;
1712 static HRESULT WINAPI
IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject
* iface
, LPDIRECTXFILEDATA ppDataObj
)
1714 IDirectXFileSaveObjectImpl
*This
= (IDirectXFileSaveObjectImpl
*)iface
;
1716 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppDataObj
);
1718 return DXFILEERR_BADVALUE
;
1721 static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl
=
1723 IDirectXFileSaveObjectImpl_QueryInterface
,
1724 IDirectXFileSaveObjectImpl_AddRef
,
1725 IDirectXFileSaveObjectImpl_Release
,
1726 IDirectXFileSaveObjectImpl_SaveTemplates
,
1727 IDirectXFileSaveObjectImpl_CreateDataObject
,
1728 IDirectXFileSaveObjectImpl_SaveData