static HRESULT WINAPI EnumMonikerImpl_Next(LPENUMMONIKER iface, ULONG celt, IMoniker ** rgelt, ULONG * pceltFetched) { ULONG fetched; EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); TRACE("(%p)->(%d, %p, %p)\n", iface, celt, rgelt, pceltFetched); for (fetched = 0; (This->index + fetched < This->nMonikerCount) && (fetched < celt); fetched++) { rgelt[fetched] = This->ppMoniker[This->index + fetched]; IMoniker_AddRef(rgelt[fetched]); } This->index += fetched; TRACE("-- fetched %d\n", fetched); if (pceltFetched) *pceltFetched = fetched; if (fetched != celt) return S_FALSE; else return S_OK; }
static ULONG WINAPI DEVENUM_IEnumMoniker_AddRef(IEnumMoniker *iface) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; }
static HRESULT WINAPI EnumMonikerImpl_Reset(LPENUMMONIKER iface) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); TRACE("(%p)->()\n", iface); This->index = 0; return S_OK; }
static HRESULT WINAPI EnumMonikerImpl_Skip(LPENUMMONIKER iface, ULONG celt) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); TRACE("(%p)->(%d)\n", iface, celt); This->index += celt; return S_OK; }
static HRESULT WINAPI DEVENUM_IEnumMoniker_Reset(IEnumMoniker *iface) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); TRACE("(%p)->()\n", iface); This->index = 0; return S_OK; }
/********************************************************************** * IEnumMoniker_AddRef (also IUnknown) */ static ULONG WINAPI EnumMonikerImpl_AddRef(LPENUMMONIKER iface) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); ULONG ref; if (This == NULL) return E_POINTER; ref = InterlockedIncrement(&This->ref); TRACE("(%p)->() AddRef from %d\n", iface, ref - 1); return ref; }
static HRESULT WINAPI DEVENUM_IEnumMoniker_Next(IEnumMoniker *iface, ULONG celt, IMoniker **rgelt, ULONG *pceltFetched) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); WCHAR buffer[MAX_PATH + 1]; LONG res; ULONG fetched = 0; MediaCatMoniker * pMoniker; TRACE("(%p)->(%d, %p, %p)\n", iface, celt, rgelt, pceltFetched); while (fetched < celt) { if(This->index+fetched < This->subkey_cnt) res = RegEnumKeyW(This->hkey, This->index+fetched, buffer, sizeof(buffer) / sizeof(WCHAR)); else if(This->special_hkey) res = RegEnumKeyW(This->special_hkey, This->index+fetched-This->subkey_cnt, buffer, sizeof(buffer) / sizeof(WCHAR)); else break; if (res != ERROR_SUCCESS) { break; } pMoniker = DEVENUM_IMediaCatMoniker_Construct(); if (!pMoniker) return E_OUTOFMEMORY; if (RegOpenKeyW(This->index+fetched < This->subkey_cnt ? This->hkey : This->special_hkey, buffer, &pMoniker->hkey) != ERROR_SUCCESS) { IMoniker_Release(&pMoniker->IMoniker_iface); break; } rgelt[fetched] = &pMoniker->IMoniker_iface; fetched++; } This->index += fetched; TRACE("-- fetched %d\n", fetched); if (pceltFetched) *pceltFetched = fetched; if (fetched != celt) return S_FALSE; else return S_OK; }
static ULONG WINAPI DEVENUM_IEnumMoniker_Release(IEnumMoniker *iface) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if (!ref) { RegCloseKey(This->hkey); CoTaskMemFree(This); DEVENUM_UnlockModule(); return 0; } return ref; }
/********************************************************************** * IEnumMoniker_Release (also IUnknown) */ static ULONG WINAPI EnumMonikerImpl_Release(LPENUMMONIKER iface) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->() Release from %d\n", iface, ref + 1); if (!ref) { ULONG i; for (i = 0; i < This->nMonikerCount; i++) IMoniker_Release(This->ppMoniker[i]); CoTaskMemFree(This->ppMoniker); This->ppMoniker = NULL; CoTaskMemFree(This); return 0; } return ref; }
static HRESULT WINAPI DEVENUM_IEnumMoniker_Skip(IEnumMoniker *iface, ULONG celt) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); DWORD special_subkeys = 0; TRACE("(%p)->(%d)\n", iface, celt); /* Before incrementing, check if there are any more values to run through. Some programs use the Skip() function to get the number of devices */ if(This->special_hkey) RegQueryInfoKeyW(This->special_hkey, NULL, NULL, NULL, &special_subkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if((This->index + celt) >= This->subkey_cnt + special_subkeys) { return S_FALSE; } This->index += celt; return S_OK; }
/********************************************************************** * IEnumMoniker_QueryInterface (also IUnknown) */ static HRESULT WINAPI EnumMonikerImpl_QueryInterface( LPENUMMONIKER iface, REFIID riid, LPVOID *ppvObj) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); if (This == NULL || ppvObj == NULL) return E_POINTER; if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumMoniker)) { *ppvObj = iface; EnumMonikerImpl_AddRef(iface); return S_OK; } *ppvObj = NULL; FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT WINAPI DEVENUM_IEnumMoniker_Skip(IEnumMoniker *iface, ULONG celt) { EnumMonikerImpl *This = impl_from_IEnumMoniker(iface); DWORD subKeys; TRACE("(%p)->(%d)\n", iface, celt); /* Before incrementing, check if there are any more values to run thru. Some programs use the Skip() function to get the amount of devices */ if(RegQueryInfoKeyW(This->hkey, NULL, NULL, NULL, &subKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { return S_FALSE; } if((This->index + celt) >= subKeys) { return S_FALSE; } This->index += celt; return S_OK; }