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 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 MetadataHandlerEnum_Next(IWICEnumMetadataItem *iface, ULONG celt, PROPVARIANT *rgeltSchema, PROPVARIANT *rgeltId, PROPVARIANT *rgeltValue, ULONG *pceltFetched) { MetadataHandlerEnum *This = impl_from_IWICEnumMetadataItem(iface); ULONG new_index; HRESULT hr=S_FALSE; int i; TRACE("(%p,%i)\n", iface, celt); EnterCriticalSection(&This->parent->lock); if (This->index >= This->parent->item_count) { *pceltFetched = 0; LeaveCriticalSection(&This->parent->lock); return S_FALSE; } new_index = min(This->parent->item_count, This->index + celt); *pceltFetched = new_index - This->index; if (rgeltSchema) { for (i=0; SUCCEEDED(hr) && i < *pceltFetched; i++) hr = PropVariantCopy(&rgeltSchema[i], &This->parent->items[i+This->index].schema); } for (i=0; SUCCEEDED(hr) && i < *pceltFetched; i++) hr = PropVariantCopy(&rgeltId[i], &This->parent->items[i+This->index].id); if (rgeltValue) { for (i=0; SUCCEEDED(hr) && i < *pceltFetched; i++) hr = PropVariantCopy(&rgeltValue[i], &This->parent->items[i+This->index].value); } if (SUCCEEDED(hr)) { This->index = new_index; } LeaveCriticalSection(&This->parent->lock); return hr; }
/****************************************************************** * PropVariantChangeType (PROPSYS.@) */ HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt) { HRESULT hr; FIXME("(%p, %p, %d, %d, %d): semi-stub!\n", ppropvarDest, propvarSrc, propvarSrc->vt, flags, vt); if(vt == propvarSrc->vt) return PropVariantCopy(ppropvarDest, propvarSrc); switch (vt) { case VT_I2: { SHORT res; hr = PropVariantToInt16(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I2; ppropvarDest->u.iVal = res; } return hr; } case VT_UI2: { USHORT res; hr = PropVariantToUInt16(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI2; ppropvarDest->u.uiVal = res; } return hr; } case VT_I4: { LONG res; hr = PropVariantToInt32(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I4; ppropvarDest->u.lVal = res; } return hr; } case VT_UI4: { ULONG res; hr = PropVariantToUInt32(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI4; ppropvarDest->u.ulVal = res; } return hr; } case VT_I8: { LONGLONG res; hr = PropVariantToInt64(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I8; ppropvarDest->u.hVal.QuadPart = res; } return hr; } case VT_UI8: { ULONGLONG res; hr = PropVariantToUInt64(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI8; ppropvarDest->u.uhVal.QuadPart = res; } return hr; } case VT_LPWSTR: { WCHAR *res; hr = PropVariantToStringAlloc(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_LPWSTR; ppropvarDest->u.pwszVal = res; } return hr; } } switch (propvarSrc->vt) { case VT_FILETIME: return PROPVAR_ConvertFILETIME(ppropvarDest, propvarSrc, vt); default: FIXME("Unhandled source type: %d\n", propvarSrc->vt); } return E_FAIL; }
HRESULT CSourceOperation::SetData(const PROPVARIANT& varData) { return PropVariantCopy(&_data, &varData); }
/****************************************************************** * PropVariantChangeType (PROPSYS.@) */ HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt) { HRESULT hr; FIXME("(%p, %p, %d, %d, %d): semi-stub!\n", ppropvarDest, propvarSrc, propvarSrc->vt, flags, vt); if (vt == propvarSrc->vt) return PropVariantCopy(ppropvarDest, propvarSrc); if (propvarSrc->vt == VT_FILETIME) return PROPVAR_ConvertFILETIME(&propvarSrc->u.filetime, ppropvarDest, vt); switch (vt) { case VT_I1: { LONGLONG res; hr = PROPVAR_ConvertNumber(propvarSrc, 8, TRUE, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I1; ppropvarDest->u.cVal = (char)res; } return hr; } case VT_UI1: { LONGLONG res; hr = PROPVAR_ConvertNumber(propvarSrc, 8, FALSE, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI1; ppropvarDest->u.bVal = (UCHAR)res; } return hr; } case VT_I2: { SHORT res; hr = PropVariantToInt16(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I2; ppropvarDest->u.iVal = res; } return hr; } case VT_UI2: { USHORT res; hr = PropVariantToUInt16(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI2; ppropvarDest->u.uiVal = res; } return hr; } case VT_I4: { LONG res; hr = PropVariantToInt32(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I4; ppropvarDest->u.lVal = res; } return hr; } case VT_UI4: { ULONG res; hr = PropVariantToUInt32(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI4; ppropvarDest->u.ulVal = res; } return hr; } case VT_I8: { LONGLONG res; hr = PropVariantToInt64(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_I8; ppropvarDest->u.hVal.QuadPart = res; } return hr; } case VT_UI8: { ULONGLONG res; hr = PropVariantToUInt64(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_UI8; ppropvarDest->u.uhVal.QuadPart = res; } return hr; } case VT_LPWSTR: case VT_BSTR: { WCHAR *res; hr = PropVariantToStringAlloc(propvarSrc, &res); if (SUCCEEDED(hr)) { ppropvarDest->vt = VT_LPWSTR; ppropvarDest->u.pwszVal = res; } return hr; } case VT_LPSTR: { WCHAR *resW; hr = PropVariantToStringAlloc(propvarSrc, &resW); if (SUCCEEDED(hr)) { char *res; DWORD len; len = WideCharToMultiByte(CP_ACP, 0, resW, -1, NULL, 0, NULL, NULL); res = CoTaskMemAlloc(len); if (res) { WideCharToMultiByte(CP_ACP, 0, resW, -1, res, len, NULL, NULL); ppropvarDest->vt = VT_LPSTR; ppropvarDest->u.pszVal = res; } else hr = E_OUTOFMEMORY; CoTaskMemFree(resW); } return hr; } default: FIXME("Unhandled dest type: %d\n", vt); return E_FAIL; } }