[PATCH 4/5] quartz: Simplify FilterMapper3_RegisterFilter().
Zebediah Figura
z.figura12 at gmail.com
Wed Jan 22 00:08:59 CST 2020
Avoid some unnecessary allocations.
Signed-off-by: Zebediah Figura <z.figura12 at 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 */
--
2.25.0
More information about the wine-devel
mailing list