Avoid some unnecessary allocations.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filtermapper.c | 230 +++++++++++-------------------------- 1 file changed, 66 insertions(+), 164 deletions(-)
diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c index 4bbc96f774..763e378b21 100644 --- a/dlls/quartz/filtermapper.c +++ b/dlls/quartz/filtermapper.c @@ -314,39 +314,6 @@ static HRESULT WINAPI FilterMapper3_UnregisterFilter(IFilterMapper3 *iface, return HRESULT_FROM_WIN32(RegDeleteKeyW(HKEY_CLASSES_ROOT, keypath)); }
-static HRESULT FM2_WriteFriendlyName(IPropertyBag * pPropBag, LPCWSTR szName) -{ - VARIANT var; - HRESULT ret; - BSTR value; - - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = value = SysAllocString(szName); - - ret = IPropertyBag_Write(pPropBag, wszFriendlyName, &var); - SysFreeString(value); - - return ret; -} - -static HRESULT FM2_WriteClsid(IPropertyBag * pPropBag, REFCLSID clsid) -{ - LPWSTR wszClsid = NULL; - VARIANT var; - HRESULT hr; - - hr = StringFromCLSID(clsid, &wszClsid); - - if (SUCCEEDED(hr)) - { - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = wszClsid; - hr = IPropertyBag_Write(pPropBag, wszClsidName, &var); - } - CoTaskMemFree(wszClsid); - return hr; -} - static HRESULT FM2_WriteFilterData(const REGFILTER2 * prf2, BYTE **ppData, ULONG *pcbData) { int size = sizeof(struct REG_RF); @@ -577,36 +544,26 @@ static void FM2_DeleteRegFilter(REGFILTER2 * prf2) CoTaskMemFree((LPVOID)prf2->u.s2.rgPins2); }
-static HRESULT WINAPI FilterMapper3_RegisterFilter( - IFilterMapper3 * iface, - REFCLSID clsidFilter, - LPCWSTR szName, - IMoniker **ppMoniker, - const CLSID *pclsidCategory, - const OLECHAR *szInstance, - const REGFILTER2 *prf2) +static HRESULT WINAPI FilterMapper3_RegisterFilter(IFilterMapper3 *iface, + REFCLSID clsid, const WCHAR *name, IMoniker **ret_moniker, + const CLSID *category, const WCHAR *instance, const REGFILTER2 *prf2) { - IParseDisplayName * pParser = NULL; - IBindCtx * pBindCtx = NULL; - IMoniker * pMoniker = NULL; - IPropertyBag * pPropBag = NULL; + WCHAR *display_name, clsid_string[39]; + IParseDisplayName *parser; + IPropertyBag *prop_bag; + ULONG filter_data_len; + IMoniker *moniker; + BYTE *filter_data; + VARIANT var; + ULONG eaten; HRESULT hr; - LPWSTR pwszParseName = NULL; - LPWSTR pCurrent; - static const WCHAR wszDevice[] = {'@','d','e','v','i','c','e',':','s','w',':',0}; - int nameLen; - ULONG ulEaten; - LPWSTR szClsidTemp = NULL; + size_t len; REGFILTER2 regfilter2; REGFILTERPINS2* pregfp2 = NULL;
- TRACE("(%s, %s, %p, %s, %s, %p)\n", - debugstr_guid(clsidFilter), - debugstr_w(szName), - ppMoniker, - debugstr_guid(pclsidCategory), - debugstr_w(szInstance), - prf2); + TRACE("iface %p, clsid %s, name %s, ret_moniker %p, category %s, instance %s, prf2 %p.\n", + iface, debugstr_guid(clsid), debugstr_w(name), ret_moniker, + debugstr_guid(category), debugstr_w(instance), prf2);
if (prf2->dwVersion == 2) { @@ -648,135 +605,80 @@ static HRESULT WINAPI FilterMapper3_RegisterFilter( return E_NOTIMPL; }
- if (ppMoniker) - *ppMoniker = NULL; + if (ret_moniker) + *ret_moniker = NULL;
- if (!pclsidCategory) - /* MSDN mentions the inexistent CLSID_ActiveMovieFilters GUID. - * In fact this is the CLSID_LegacyAmFilterCategory one */ - pclsidCategory = &CLSID_LegacyAmFilterCategory; - - /* sizeof... will include the null terminator and - * the + 1 is for the separator ('\'). The -1 is - * because CHARS_IN_GUID includes the null terminator - */ - nameLen = ARRAY_SIZE(wszDevice) + CHARS_IN_GUID - 1 + 1; + if (!category) + category = &CLSID_LegacyAmFilterCategory;
- if (szInstance) - nameLen += lstrlenW(szInstance); - else - nameLen += CHARS_IN_GUID - 1; /* CHARS_IN_GUID includes null terminator */ + StringFromGUID2(clsid, clsid_string, ARRAY_SIZE(clsid_string));
- pCurrent = pwszParseName = CoTaskMemAlloc(nameLen*sizeof(WCHAR)); - if (!pwszParseName) + len = 50 + (instance ? wcslen(instance) : 38) + 1; + if (!(display_name = malloc(len * sizeof(WCHAR)))) return E_OUTOFMEMORY;
- lstrcpyW(pwszParseName, wszDevice); - pCurrent += lstrlenW(wszDevice); + wcscpy(display_name, L"@device:sw:"); + StringFromGUID2(category, display_name + wcslen(display_name), len - wcslen(display_name)); + wcscat(display_name, L"\"); + wcscat(display_name, instance ? instance : clsid_string);
- hr = StringFromCLSID(pclsidCategory, &szClsidTemp); + if (FAILED(hr = CoCreateInstance(&CLSID_CDeviceMoniker, NULL, CLSCTX_INPROC, + &IID_IParseDisplayName, (void **)&parser))) + return hr;
- if (SUCCEEDED(hr)) + if (FAILED(hr = IParseDisplayName_ParseDisplayName(parser, NULL, display_name, &eaten, &moniker))) { - memcpy(pCurrent, szClsidTemp, CHARS_IN_GUID * sizeof(WCHAR)); - pCurrent += CHARS_IN_GUID - 1; - pCurrent[0] = '\'; - - if (szInstance) - lstrcpyW(pCurrent+1, szInstance); - else - { - CoTaskMemFree(szClsidTemp); - szClsidTemp = NULL; - - hr = StringFromCLSID(clsidFilter, &szClsidTemp); - if (SUCCEEDED(hr)) - lstrcpyW(pCurrent+1, szClsidTemp); - } + ERR("Failed to parse display name, hr %#x.\n", hr); + IParseDisplayName_Release(parser); + return hr; }
- if (SUCCEEDED(hr)) - hr = CoCreateInstance(&CLSID_CDeviceMoniker, NULL, CLSCTX_INPROC, &IID_IParseDisplayName, (LPVOID *)&pParser); + IParseDisplayName_Release(parser);
- if (SUCCEEDED(hr)) - hr = CreateBindCtx(0, &pBindCtx); - - if (SUCCEEDED(hr)) - hr = IParseDisplayName_ParseDisplayName(pParser, pBindCtx, pwszParseName, &ulEaten, &pMoniker); - - if (pBindCtx) - IBindCtx_Release(pBindCtx); - if (pParser) - IParseDisplayName_Release(pParser); - - if (SUCCEEDED(hr)) - hr = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag); + if (FAILED(hr = IMoniker_BindToStorage(moniker, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag))) + { + ERR("Failed to get property bag, hr %#x.\n", hr); + IMoniker_Release(moniker); + return hr; + }
- if (SUCCEEDED(hr)) - hr = FM2_WriteFriendlyName(pPropBag, szName); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(name); + if (FAILED(hr = IPropertyBag_Write(prop_bag, L"FriendlyName", &var))) + ERR("Failed to write friendly name, hr %#x.\n", hr); + VariantClear(&var);
- if (SUCCEEDED(hr)) - hr = FM2_WriteClsid(pPropBag, clsidFilter); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(clsid_string); + if (FAILED(hr = IPropertyBag_Write(prop_bag, L"CLSID", &var))) + ERR("Failed to write class ID, hr %#x.\n", hr); + VariantClear(&var);
- if (SUCCEEDED(hr)) + if (SUCCEEDED(FM2_WriteFilterData(®filter2, &filter_data, &filter_data_len))) { - BYTE *pData; - ULONG cbData; - - hr = FM2_WriteFilterData(®filter2, &pData, &cbData); - if (SUCCEEDED(hr)) + V_VT(&var) = VT_ARRAY | VT_UI1; + if ((V_ARRAY(&var) = SafeArrayCreateVector(VT_UI1, 0, filter_data_len))) { - VARIANT var; - SAFEARRAY *psa; - SAFEARRAYBOUND saBound; - - saBound.lLbound = 0; - saBound.cElements = cbData; - psa = SafeArrayCreate(VT_UI1, 1, &saBound); - if (!psa) - { - ERR("Couldn't create SAFEARRAY\n"); - hr = E_FAIL; - } - - if (SUCCEEDED(hr)) - { - LPBYTE pbSAData; - hr = SafeArrayAccessData(psa, (LPVOID *)&pbSAData); - if (SUCCEEDED(hr)) - { - memcpy(pbSAData, pData, cbData); - hr = SafeArrayUnaccessData(psa); - } - } - - V_VT(&var) = VT_ARRAY | VT_UI1; - V_ARRAY(&var) = psa; - - if (SUCCEEDED(hr)) - hr = IPropertyBag_Write(pPropBag, wszFilterDataName, &var); - - if (psa) - SafeArrayDestroy(psa); - CoTaskMemFree(pData); + memcpy(V_ARRAY(&var)->pvData, filter_data, filter_data_len); + if (FAILED(hr = IPropertyBag_Write(prop_bag, L"FilterData", &var))) + ERR("Failed to write filter data, hr %#x.\n", hr); + VariantClear(&var); } + + CoTaskMemFree(filter_data); }
- if (pPropBag) - IPropertyBag_Release(pPropBag); - CoTaskMemFree(szClsidTemp); - CoTaskMemFree(pwszParseName); + IPropertyBag_Release(prop_bag); + free(display_name);
- if (SUCCEEDED(hr) && ppMoniker) - *ppMoniker = pMoniker; - else if (pMoniker) - IMoniker_Release(pMoniker); + if (ret_moniker) + *ret_moniker = moniker; + else + IMoniker_Release(moniker);
CoTaskMemFree(pregfp2);
- TRACE("-- returning %x\n", hr); - - return hr; + return S_OK; }
/* internal helper function */