static HRESULT WINAPI MetadataHandler_QueryInterface(IWICMetadataWriter *iface, REFIID iid, void **ppv) { MetadataHandler *This = impl_from_IWICMetadataWriter(iface); TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); if (!ppv) return E_INVALIDARG; if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICMetadataReader, iid) || (IsEqualIID(&IID_IWICMetadataWriter, iid) && This->vtable->is_writer)) { *ppv = &This->IWICMetadataWriter_iface; } else if (IsEqualIID(&IID_IPersist, iid) || IsEqualIID(&IID_IPersistStream, iid) || IsEqualIID(&IID_IWICPersistStream, iid)) { *ppv = &This->IWICPersistStream_iface; } else { *ppv = NULL; return E_NOINTERFACE; } IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI MetadataHandler_GetEnumerator(IWICMetadataWriter *iface, IWICEnumMetadataItem **ppIEnumMetadata) { MetadataHandler *This = impl_from_IWICMetadataWriter(iface); TRACE("(%p,%p)\n", iface, ppIEnumMetadata); return MetadataHandlerEnum_Create(This, 0, ppIEnumMetadata); }
static HRESULT WINAPI MetadataHandler_GetValue(IWICMetadataWriter *iface, const PROPVARIANT *schema, const PROPVARIANT *id, PROPVARIANT *value) { UINT i; HRESULT hr = WINCODEC_ERR_PROPERTYNOTFOUND; MetadataHandler *This = impl_from_IWICMetadataWriter(iface); TRACE("(%p,%p,%p,%p)\n", iface, schema, id, value); if (!id) return E_INVALIDARG; EnterCriticalSection(&This->lock); for (i = 0; i < This->item_count; i++) { if (schema && This->items[i].schema.vt != VT_EMPTY) { if (propvar_cmp(schema, &This->items[i].schema) != 0) continue; } if (propvar_cmp(id, &This->items[i].id) != 0) continue; hr = value ? PropVariantCopy(value, &This->items[i].value) : S_OK; break; } LeaveCriticalSection(&This->lock); return hr; }
static HRESULT WINAPI MetadataHandler_GetValueByIndex(IWICMetadataWriter *iface, UINT index, PROPVARIANT *schema, PROPVARIANT *id, PROPVARIANT *value) { HRESULT hr = S_OK; MetadataHandler *This = impl_from_IWICMetadataWriter(iface); TRACE("%p,%u,%p,%p,%p\n", iface, index, schema, id, value); EnterCriticalSection(&This->lock); if (index >= This->item_count) { LeaveCriticalSection(&This->lock); return E_INVALIDARG; } if (schema) hr = PropVariantCopy(schema, &This->items[index].schema); if (SUCCEEDED(hr) && id) hr = PropVariantCopy(id, &This->items[index].id); if (SUCCEEDED(hr) && value) hr = PropVariantCopy(value, &This->items[index].value); LeaveCriticalSection(&This->lock); return hr; }
static ULONG WINAPI MetadataHandler_AddRef(IWICMetadataWriter *iface) { MetadataHandler *This = impl_from_IWICMetadataWriter(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) refcount=%u\n", iface, ref); return ref; }
static HRESULT WINAPI MetadataHandler_GetCount(IWICMetadataWriter *iface, UINT *pcCount) { MetadataHandler *This = impl_from_IWICMetadataWriter(iface); TRACE("%p,%p\n", iface, pcCount); if (!pcCount) return E_INVALIDARG; *pcCount = This->item_count; return S_OK; }
static ULONG WINAPI MetadataHandler_Release(IWICMetadataWriter *iface) { MetadataHandler *This = impl_from_IWICMetadataWriter(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) refcount=%u\n", iface, ref); if (ref == 0) { MetadataHandler_FreeItems(This); This->lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } return ref; }
static HRESULT WINAPI MetadataHandler_GetMetadataHandlerInfo(IWICMetadataWriter *iface, IWICMetadataHandlerInfo **ppIHandler) { HRESULT hr; IWICComponentInfo *component_info; MetadataHandler *This = impl_from_IWICMetadataWriter(iface); TRACE("%p,%p\n", iface, ppIHandler); hr = CreateComponentInfo(This->vtable->clsid, &component_info); if (FAILED(hr)) return hr; hr = IWICComponentInfo_QueryInterface(component_info, &IID_IWICMetadataHandlerInfo, (void **)ppIHandler); IWICComponentInfo_Release(component_info); return hr; }