2 * Copyright 2012 Vincent Povirk for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
29 #include "wincodecsdk.h"
31 #include "wincodecs_private.h"
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(wincodecs
);
37 typedef struct MetadataHandler
{
38 IWICMetadataWriter IWICMetadataWriter_iface
;
40 IWICPersistStream IWICPersistStream_iface
;
41 const MetadataHandlerVtbl
*vtable
;
44 static inline MetadataHandler
*impl_from_IWICMetadataWriter(IWICMetadataWriter
*iface
)
46 return CONTAINING_RECORD(iface
, MetadataHandler
, IWICMetadataWriter_iface
);
49 static inline MetadataHandler
*impl_from_IWICPersistStream(IWICPersistStream
*iface
)
51 return CONTAINING_RECORD(iface
, MetadataHandler
, IWICPersistStream_iface
);
54 static HRESULT WINAPI
MetadataHandler_QueryInterface(IWICMetadataWriter
*iface
, REFIID iid
,
57 MetadataHandler
*This
= impl_from_IWICMetadataWriter(iface
);
58 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(iid
), ppv
);
60 if (!ppv
) return E_INVALIDARG
;
62 if (IsEqualIID(&IID_IUnknown
, iid
) ||
63 IsEqualIID(&IID_IWICMetadataReader
, iid
) ||
64 (IsEqualIID(&IID_IWICMetadataWriter
, iid
) && This
->vtable
->is_writer
))
66 *ppv
= &This
->IWICMetadataWriter_iface
;
68 else if (IsEqualIID(&IID_IPersist
, iid
) ||
69 IsEqualIID(&IID_IPersistStream
, iid
) ||
70 IsEqualIID(&IID_IWICPersistStream
, iid
))
72 *ppv
= &This
->IWICPersistStream_iface
;
80 IUnknown_AddRef((IUnknown
*)*ppv
);
84 static ULONG WINAPI
MetadataHandler_AddRef(IWICMetadataWriter
*iface
)
86 MetadataHandler
*This
= impl_from_IWICMetadataWriter(iface
);
87 ULONG ref
= InterlockedIncrement(&This
->ref
);
89 TRACE("(%p) refcount=%u\n", iface
, ref
);
94 static ULONG WINAPI
MetadataHandler_Release(IWICMetadataWriter
*iface
)
96 MetadataHandler
*This
= impl_from_IWICMetadataWriter(iface
);
97 ULONG ref
= InterlockedDecrement(&This
->ref
);
99 TRACE("(%p) refcount=%u\n", iface
, ref
);
103 HeapFree(GetProcessHeap(), 0, This
);
109 static HRESULT WINAPI
MetadataHandler_GetMetadataFormat(IWICMetadataWriter
*iface
,
110 GUID
*pguidMetadataFormat
)
112 FIXME("(%p,%s): stub\n", iface
, debugstr_guid(pguidMetadataFormat
));
116 static HRESULT WINAPI
MetadataHandler_GetMetadataHandlerInfo(IWICMetadataWriter
*iface
,
117 IWICMetadataHandlerInfo
**ppIHandler
)
119 FIXME("(%p,%p): stub\n", iface
, ppIHandler
);
123 static HRESULT WINAPI
MetadataHandler_GetCount(IWICMetadataWriter
*iface
,
126 FIXME("(%p,%p): stub\n", iface
, pcCount
);
130 static HRESULT WINAPI
MetadataHandler_GetValueByIndex(IWICMetadataWriter
*iface
,
131 UINT nIndex
, PROPVARIANT
*pvarSchema
, PROPVARIANT
*pvarId
, PROPVARIANT
*pvarValue
)
133 FIXME("(%p,%u,%p,%p,%p): stub\n", iface
, nIndex
, pvarSchema
, pvarId
, pvarValue
);
137 static HRESULT WINAPI
MetadataHandler_GetValue(IWICMetadataWriter
*iface
,
138 const PROPVARIANT
*pvarSchema
, const PROPVARIANT
*pvarId
, PROPVARIANT
*pvarValue
)
140 FIXME("(%p,%p,%p,%p): stub\n", iface
, pvarSchema
, pvarId
, pvarValue
);
144 static HRESULT WINAPI
MetadataHandler_GetEnumerator(IWICMetadataWriter
*iface
,
145 IWICEnumMetadataItem
**ppIEnumMetadata
)
147 FIXME("(%p,%p): stub\n", iface
, ppIEnumMetadata
);
151 static HRESULT WINAPI
MetadataHandler_SetValue(IWICMetadataWriter
*iface
,
152 const PROPVARIANT
*pvarSchema
, const PROPVARIANT
*pvarId
, const PROPVARIANT
*pvarValue
)
154 FIXME("(%p,%p,%p,%p): stub\n", iface
, pvarSchema
, pvarId
, pvarValue
);
158 static HRESULT WINAPI
MetadataHandler_SetValueByIndex(IWICMetadataWriter
*iface
,
159 UINT nIndex
, const PROPVARIANT
*pvarSchema
, const PROPVARIANT
*pvarId
, const PROPVARIANT
*pvarValue
)
161 FIXME("(%p,%u,%p,%p,%p): stub\n", iface
, nIndex
, pvarSchema
, pvarId
, pvarValue
);
165 static HRESULT WINAPI
MetadataHandler_RemoveValue(IWICMetadataWriter
*iface
,
166 const PROPVARIANT
*pvarSchema
, const PROPVARIANT
*pvarId
)
168 FIXME("(%p,%p,%p): stub\n", iface
, pvarSchema
, pvarId
);
172 static HRESULT WINAPI
MetadataHandler_RemoveValueByIndex(IWICMetadataWriter
*iface
,
175 FIXME("(%p,%u): stub\n", iface
, nIndex
);
179 static const IWICMetadataWriterVtbl MetadataHandler_Vtbl
= {
180 MetadataHandler_QueryInterface
,
181 MetadataHandler_AddRef
,
182 MetadataHandler_Release
,
183 MetadataHandler_GetMetadataFormat
,
184 MetadataHandler_GetMetadataHandlerInfo
,
185 MetadataHandler_GetCount
,
186 MetadataHandler_GetValueByIndex
,
187 MetadataHandler_GetValue
,
188 MetadataHandler_GetEnumerator
,
189 MetadataHandler_SetValue
,
190 MetadataHandler_SetValueByIndex
,
191 MetadataHandler_RemoveValue
,
192 MetadataHandler_RemoveValueByIndex
195 static HRESULT WINAPI
MetadataHandler_PersistStream_QueryInterface(IWICPersistStream
*iface
,
196 REFIID iid
, void **ppv
)
198 MetadataHandler
*This
= impl_from_IWICPersistStream(iface
);
199 return IWICMetadataWriter_QueryInterface(&This
->IWICMetadataWriter_iface
, iid
, ppv
);
202 static ULONG WINAPI
MetadataHandler_PersistStream_AddRef(IWICPersistStream
*iface
)
204 MetadataHandler
*This
= impl_from_IWICPersistStream(iface
);
205 return IWICMetadataWriter_AddRef(&This
->IWICMetadataWriter_iface
);
208 static ULONG WINAPI
MetadataHandler_PersistStream_Release(IWICPersistStream
*iface
)
210 MetadataHandler
*This
= impl_from_IWICPersistStream(iface
);
211 return IWICMetadataWriter_Release(&This
->IWICMetadataWriter_iface
);
214 static HRESULT WINAPI
MetadataHandler_GetClassID(IWICPersistStream
*iface
,
217 FIXME("(%p,%p): stub\n", iface
, pClassID
);
221 static HRESULT WINAPI
MetadataHandler_IsDirty(IWICPersistStream
*iface
)
223 FIXME("(%p): stub\n", iface
);
227 static HRESULT WINAPI
MetadataHandler_Load(IWICPersistStream
*iface
,
230 FIXME("(%p,%p): stub\n", iface
, pStm
);
234 static HRESULT WINAPI
MetadataHandler_Save(IWICPersistStream
*iface
,
235 IStream
*pStm
, BOOL fClearDirty
)
237 FIXME("(%p,%p,%i): stub\n", iface
, pStm
, fClearDirty
);
241 static HRESULT WINAPI
MetadataHandler_GetSizeMax(IWICPersistStream
*iface
,
242 ULARGE_INTEGER
*pcbSize
)
244 FIXME("(%p,%p): stub\n", iface
, pcbSize
);
248 static HRESULT WINAPI
MetadataHandler_LoadEx(IWICPersistStream
*iface
,
249 IStream
*pIStream
, const GUID
*pguidPreferredVendor
, DWORD dwPersistOptions
)
251 FIXME("(%p,%p,%s,%x): stub\n", iface
, pIStream
, debugstr_guid(pguidPreferredVendor
), dwPersistOptions
);
255 static HRESULT WINAPI
MetadataHandler_SaveEx(IWICPersistStream
*iface
,
256 IStream
*pIStream
, DWORD dwPersistOptions
, BOOL fClearDirty
)
258 FIXME("(%p,%p,%x,%i): stub\n", iface
, pIStream
, dwPersistOptions
, fClearDirty
);
262 static const IWICPersistStreamVtbl MetadataHandler_PersistStream_Vtbl
= {
263 MetadataHandler_PersistStream_QueryInterface
,
264 MetadataHandler_PersistStream_AddRef
,
265 MetadataHandler_PersistStream_Release
,
266 MetadataHandler_GetClassID
,
267 MetadataHandler_IsDirty
,
268 MetadataHandler_Load
,
269 MetadataHandler_Save
,
270 MetadataHandler_GetSizeMax
,
271 MetadataHandler_LoadEx
,
272 MetadataHandler_SaveEx
275 HRESULT
MetadataReader_Create(const MetadataHandlerVtbl
*vtable
, IUnknown
*pUnkOuter
, REFIID iid
, void** ppv
)
277 MetadataHandler
*This
;
280 TRACE("%s\n", debugstr_guid(vtable
->clsid
));
284 if (pUnkOuter
) return CLASS_E_NOAGGREGATION
;
286 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(MetadataHandler
));
287 if (!This
) return E_OUTOFMEMORY
;
289 This
->IWICMetadataWriter_iface
.lpVtbl
= &MetadataHandler_Vtbl
;
290 This
->IWICPersistStream_iface
.lpVtbl
= &MetadataHandler_PersistStream_Vtbl
;
292 This
->vtable
= vtable
;
294 hr
= IWICMetadataWriter_QueryInterface(&This
->IWICMetadataWriter_iface
, iid
, ppv
);
296 IWICMetadataWriter_Release(&This
->IWICMetadataWriter_iface
);
301 static HRESULT
LoadUnknownMetadata(IStream
*input
, const GUID
*preferred_vendor
,
302 DWORD persist_options
, MetadataItem
**items
, DWORD
*item_count
)
308 static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl
= {
310 &CLSID_WICUnknownMetadataReader
,
314 HRESULT
UnknownMetadataReader_CreateInstance(IUnknown
*pUnkOuter
, REFIID iid
, void** ppv
)
316 return MetadataReader_Create(&UnknownMetadataReader_Vtbl
, pUnkOuter
, iid
, ppv
);