windowscodecs: Add a stub IWICMetadataReader/Writer implementation.
[wine.git] / dlls / windowscodecs / metadatahandler.c
blob9dd6cca74b4d71b6ae9b26c3987bb363c1f0b04f
1 /*
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
19 #include "config.h"
21 #include <stdarg.h>
23 #define COBJMACROS
25 #include "windef.h"
26 #include "winbase.h"
27 #include "objbase.h"
28 #include "wincodec.h"
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;
39 LONG ref;
40 IWICPersistStream IWICPersistStream_iface;
41 const MetadataHandlerVtbl *vtable;
42 } MetadataHandler;
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,
55 void **ppv)
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;
74 else
76 *ppv = NULL;
77 return E_NOINTERFACE;
80 IUnknown_AddRef((IUnknown*)*ppv);
81 return S_OK;
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);
91 return 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);
101 if (ref == 0)
103 HeapFree(GetProcessHeap(), 0, This);
106 return ref;
109 static HRESULT WINAPI MetadataHandler_GetMetadataFormat(IWICMetadataWriter *iface,
110 GUID *pguidMetadataFormat)
112 FIXME("(%p,%s): stub\n", iface, debugstr_guid(pguidMetadataFormat));
113 return E_NOTIMPL;
116 static HRESULT WINAPI MetadataHandler_GetMetadataHandlerInfo(IWICMetadataWriter *iface,
117 IWICMetadataHandlerInfo **ppIHandler)
119 FIXME("(%p,%p): stub\n", iface, ppIHandler);
120 return E_NOTIMPL;
123 static HRESULT WINAPI MetadataHandler_GetCount(IWICMetadataWriter *iface,
124 UINT *pcCount)
126 FIXME("(%p,%p): stub\n", iface, pcCount);
127 return E_NOTIMPL;
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);
134 return E_NOTIMPL;
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);
141 return E_NOTIMPL;
144 static HRESULT WINAPI MetadataHandler_GetEnumerator(IWICMetadataWriter *iface,
145 IWICEnumMetadataItem **ppIEnumMetadata)
147 FIXME("(%p,%p): stub\n", iface, ppIEnumMetadata);
148 return E_NOTIMPL;
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);
155 return E_NOTIMPL;
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);
162 return E_NOTIMPL;
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);
169 return E_NOTIMPL;
172 static HRESULT WINAPI MetadataHandler_RemoveValueByIndex(IWICMetadataWriter *iface,
173 UINT nIndex)
175 FIXME("(%p,%u): stub\n", iface, nIndex);
176 return E_NOTIMPL;
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,
215 CLSID *pClassID)
217 FIXME("(%p,%p): stub\n", iface, pClassID);
218 return E_NOTIMPL;
221 static HRESULT WINAPI MetadataHandler_IsDirty(IWICPersistStream *iface)
223 FIXME("(%p): stub\n", iface);
224 return E_NOTIMPL;
227 static HRESULT WINAPI MetadataHandler_Load(IWICPersistStream *iface,
228 IStream *pStm)
230 FIXME("(%p,%p): stub\n", iface, pStm);
231 return E_NOTIMPL;
234 static HRESULT WINAPI MetadataHandler_Save(IWICPersistStream *iface,
235 IStream *pStm, BOOL fClearDirty)
237 FIXME("(%p,%p,%i): stub\n", iface, pStm, fClearDirty);
238 return E_NOTIMPL;
241 static HRESULT WINAPI MetadataHandler_GetSizeMax(IWICPersistStream *iface,
242 ULARGE_INTEGER *pcbSize)
244 FIXME("(%p,%p): stub\n", iface, pcbSize);
245 return E_NOTIMPL;
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);
252 return E_NOTIMPL;
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);
259 return E_NOTIMPL;
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;
278 HRESULT hr;
280 TRACE("%s\n", debugstr_guid(vtable->clsid));
282 *ppv = NULL;
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;
291 This->ref = 1;
292 This->vtable = vtable;
294 hr = IWICMetadataWriter_QueryInterface(&This->IWICMetadataWriter_iface, iid, ppv);
296 IWICMetadataWriter_Release(&This->IWICMetadataWriter_iface);
298 return hr;
301 static HRESULT LoadUnknownMetadata(IStream *input, const GUID *preferred_vendor,
302 DWORD persist_options, MetadataItem **items, DWORD *item_count)
304 FIXME("\n");
305 return E_NOTIMPL;
308 static const MetadataHandlerVtbl UnknownMetadataReader_Vtbl = {
310 &CLSID_WICUnknownMetadataReader,
311 LoadUnknownMetadata
314 HRESULT UnknownMetadataReader_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
316 return MetadataReader_Create(&UnknownMetadataReader_Vtbl, pUnkOuter, iid, ppv);