/****************************************************************************** * IEnumDMO_fnNext */ static HRESULT WINAPI IEnumDMO_fnNext( IEnumDMO * iface, DWORD cItemsToFetch, CLSID * pCLSID, WCHAR ** Names, DWORD * pcItemsFetched) { HKEY hkey; WCHAR szNextKey[MAX_PATH]; WCHAR szGuidKey[64]; WCHAR szKey[MAX_PATH]; WCHAR szValue[MAX_PATH]; DWORD len; UINT count = 0; HRESULT hres = S_OK; LONG ret; IEnumDMOImpl *This = impl_from_IEnumDMO(iface); TRACE("(%p)->(%d %p %p %p)\n", This, cItemsToFetch, pCLSID, Names, pcItemsFetched); if (!pCLSID || !Names || !pcItemsFetched) return E_POINTER; while (count < cItemsToFetch) { This->index++; len = MAX_PATH; ret = RegEnumKeyExW(This->hkey, This->index, szNextKey, &len, NULL, NULL, NULL, NULL); if (ret != ERROR_SUCCESS) { hres = HRESULT_FROM_WIN32(ret); break; } TRACE("found %s\n", debugstr_w(szNextKey)); if (!(This->dwFlags & DMO_ENUMF_INCLUDE_KEYED)) { wsprintfW(szKey, szCat3Fmt, szDMORootKey, szNextKey, szDMOKeyed); ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hkey); if (ERROR_SUCCESS == ret) { RegCloseKey(hkey); /* Skip Keyed entries */ continue; } } wsprintfW(szKey, szCat2Fmt, szDMORootKey, szNextKey); ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hkey); TRACE("testing %s\n", debugstr_w(szKey)); if (This->pInTypes) { UINT i, j; DWORD cInTypes; DMO_PARTIAL_MEDIATYPE* pInTypes; hres = read_types(hkey, szDMOInputType, &cInTypes, sizeof(szValue)/sizeof(DMO_PARTIAL_MEDIATYPE), (DMO_PARTIAL_MEDIATYPE*)szValue); if (FAILED(hres)) { RegCloseKey(hkey); continue; } pInTypes = (DMO_PARTIAL_MEDIATYPE*) szValue; TRACE("read %d intypes for %s:\n", cInTypes, debugstr_w(szKey)); for (i = 0; i < cInTypes; i++) { TRACE("intype %d: type %s, subtype %s\n", i, debugstr_guid(&pInTypes[i].type), debugstr_guid(&pInTypes[i].subtype)); } for (i = 0; i < This->cInTypes; i++) { for (j = 0; j < cInTypes; j++) { if (IsMediaTypeEqual(&pInTypes[j], &This->pInTypes[i])) break; } if (j >= cInTypes) break; } if (i < This->cInTypes) { RegCloseKey(hkey); continue; } } if (This->pOutTypes) { UINT i, j; DWORD cOutTypes; DMO_PARTIAL_MEDIATYPE* pOutTypes; hres = read_types(hkey, szDMOOutputType, &cOutTypes, sizeof(szValue)/sizeof(DMO_PARTIAL_MEDIATYPE), (DMO_PARTIAL_MEDIATYPE*)szValue); if (FAILED(hres)) { RegCloseKey(hkey); continue; } pOutTypes = (DMO_PARTIAL_MEDIATYPE*) szValue; TRACE("read %d outtypes for %s:\n", cOutTypes, debugstr_w(szKey)); for (i = 0; i < cOutTypes; i++) { TRACE("outtype %d: type %s, subtype %s\n", i, debugstr_guid(&pOutTypes[i].type), debugstr_guid(&pOutTypes[i].subtype)); } for (i = 0; i < This->cOutTypes; i++) { for (j = 0; j < cOutTypes; j++) { if (IsMediaTypeEqual(&pOutTypes[j], &This->pOutTypes[i])) break; } if (j >= cOutTypes) break; } if (i < This->cOutTypes) { RegCloseKey(hkey); continue; } } /* Media object wasn't filtered so add it to return list */ Names[count] = NULL; len = MAX_PATH * sizeof(WCHAR); ret = RegQueryValueExW(hkey, NULL, NULL, NULL, (LPBYTE)szValue, &len); if (ERROR_SUCCESS == ret) { Names[count] = CoTaskMemAlloc((strlenW(szValue) + 1) * sizeof(WCHAR)); if (Names[count]) strcpyW(Names[count], szValue); } wsprintfW(szGuidKey,szToGuidFmt,szNextKey); CLSIDFromString(szGuidKey, &pCLSID[count]); TRACE("found match %s %s\n", debugstr_w(szValue), debugstr_w(szNextKey)); RegCloseKey(hkey); count++; } *pcItemsFetched = count; if (*pcItemsFetched < cItemsToFetch) hres = S_FALSE; TRACE("<-- %i found\n",count); return hres; }
/****************************************************************************** * IEnumDMO_fnNext */ static HRESULT WINAPI IEnumDMO_fnNext( IEnumDMO * iface, DWORD cItemsToFetch, CLSID * pCLSID, WCHAR ** Names, DWORD * pcItemsFetched) { FILETIME ft; HKEY hkey; WCHAR szNextKey[MAX_PATH]; WCHAR szGuidKey[64]; WCHAR szKey[MAX_PATH]; WCHAR szValue[MAX_PATH]; DWORD len; UINT count = 0; HRESULT hres = S_OK; IEnumDMOImpl *This = (IEnumDMOImpl *)iface; TRACE("--> (%p) %d %p %p %p\n", iface, cItemsToFetch, pCLSID, Names, pcItemsFetched); if (!pCLSID || !Names || !pcItemsFetched) return E_POINTER; while (count < cItemsToFetch) { This->index++; len = MAX_PATH; hres = RegEnumKeyExW(This->hkey, This->index, szNextKey, &len, NULL, NULL, NULL, &ft); if (hres != ERROR_SUCCESS) break; TRACE("found %s\n", debugstr_w(szNextKey)); if (!(This->dwFlags & DMO_ENUMF_INCLUDE_KEYED)) { wsprintfW(szKey, szCat3Fmt, szDMORootKey, szNextKey, szDMOKeyed); hres = RegOpenKeyExW(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hkey); if (ERROR_SUCCESS == hres) { RegCloseKey(hkey); /* Skip Keyed entries */ continue; } } wsprintfW(szKey, szCat2Fmt, szDMORootKey, szNextKey); hres = RegOpenKeyExW(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hkey); if (This->pInTypes) { UINT i, j; DWORD cInTypes; DMO_PARTIAL_MEDIATYPE* pInTypes; hres = read_types(hkey, szDMOInputType, &cInTypes, sizeof(szValue)/sizeof(DMO_PARTIAL_MEDIATYPE), (DMO_PARTIAL_MEDIATYPE*)szValue); if (ERROR_SUCCESS != hres) { RegCloseKey(hkey); continue; } pInTypes = (DMO_PARTIAL_MEDIATYPE*) szValue; for (i = 0; i < This->cInTypes; i++) { for (j = 0; j < cInTypes; j++) { if (IsMediaTypeEqual(&pInTypes[j], &This->pInTypes[i])) break; } if (j >= cInTypes) break; } if (i < This->cInTypes) { RegCloseKey(hkey); continue; } } if (This->pOutTypes) { UINT i, j; DWORD cOutTypes; DMO_PARTIAL_MEDIATYPE* pOutTypes; hres = read_types(hkey, szDMOOutputType, &cOutTypes, sizeof(szValue)/sizeof(DMO_PARTIAL_MEDIATYPE), (DMO_PARTIAL_MEDIATYPE*)szValue); if (ERROR_SUCCESS != hres) { RegCloseKey(hkey); continue; } pOutTypes = (DMO_PARTIAL_MEDIATYPE*) szValue; for (i = 0; i < This->cOutTypes; i++) { for (j = 0; j < cOutTypes; j++) { if (IsMediaTypeEqual(&pOutTypes[j], &This->pOutTypes[i])) break; } if (j >= cOutTypes) break; } if (i < This->cOutTypes) { RegCloseKey(hkey); continue; } } /* Media object wasn't filtered so add it to return list */ Names[count] = NULL; len = MAX_PATH * sizeof(WCHAR); hres = RegQueryValueExW(hkey, NULL, NULL, NULL, (LPBYTE) szValue, &len); if (ERROR_SUCCESS == hres) { Names[count] = HeapAlloc(GetProcessHeap(), 0, strlenW(szValue) + 1); if (Names[count]) strcmpW(Names[count], szValue); } wsprintfW(szGuidKey,szToGuidFmt,szNextKey); CLSIDFromString(szGuidKey, &pCLSID[count]); TRACE("found match %s %s\n", debugstr_w(szValue), debugstr_w(szNextKey)); RegCloseKey(hkey); count++; } *pcItemsFetched = count; if (*pcItemsFetched < cItemsToFetch) hres = S_FALSE; TRACE("<-- %i found\n",count); return hres; }