static ULONG WINAPI EnumWorkItems_AddRef(IEnumWorkItems *iface) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p)->(%u)\n", This, ref); return ref; }
static HRESULT WINAPI EnumWorkItems_Reset(IEnumWorkItems *iface) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); TRACE("(%p)\n", This); if (This->handle != INVALID_HANDLE_VALUE) { FindClose(This->handle); This->handle = INVALID_HANDLE_VALUE; } return S_OK; }
static ULONG WINAPI EnumWorkItems_Release(IEnumWorkItems *iface) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(%u)\n", This, ref); if (ref == 0) { HeapFree(GetProcessHeap(), 0, This); InterlockedDecrement(&dll_ref); } return ref; }
static HRESULT WINAPI EnumWorkItems_QueryInterface(IEnumWorkItems *iface, REFIID riid, void **obj) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); if (IsEqualGUID(riid, &IID_IEnumWorkItems) || IsEqualGUID(riid, &IID_IUnknown)) { *obj = &This->IEnumWorkItems_iface; IEnumWorkItems_AddRef(iface); return S_OK; } *obj = NULL; return E_NOINTERFACE; }
static ULONG WINAPI EnumWorkItems_Release(IEnumWorkItems *iface) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(%u)\n", This, ref); if (ref == 0) { if (This->handle != INVALID_HANDLE_VALUE) FindClose(This->handle); heap_free(This); InterlockedDecrement(&dll_ref); } return ref; }
static HRESULT WINAPI EnumWorkItems_Clone(IEnumWorkItems *iface, IEnumWorkItems **cloned) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); FIXME("(%p)->(%p): stub\n", This, cloned); return E_NOTIMPL; }
static HRESULT WINAPI EnumWorkItems_Next(IEnumWorkItems *iface, ULONG count, LPWSTR **names, ULONG *fetched) { static const WCHAR tasksW[] = { '\\','T','a','s','k','s','\\','*',0 }; EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); WCHAR path[MAX_PATH]; WIN32_FIND_DATAW data; ULONG enumerated, allocated, dummy; LPWSTR *list; HRESULT hr = S_FALSE; TRACE("(%p)->(%u %p %p)\n", This, count, names, fetched); if (!count || !names || (!fetched && count > 1)) return E_INVALIDARG; if (!fetched) fetched = &dummy; *names = NULL; *fetched = 0; enumerated = 0; list = NULL; if (This->handle == INVALID_HANDLE_VALUE) { GetWindowsDirectoryW(path, MAX_PATH); lstrcatW(path, tasksW); This->handle = FindFirstFileW(path, &data); if (This->handle == INVALID_HANDLE_VALUE) return S_FALSE; } else { if (!FindNextFileW(This->handle, &data)) return S_FALSE; } allocated = 64; list = CoTaskMemAlloc(allocated * sizeof(list[0])); if (!list) return E_OUTOFMEMORY; do { if (is_file(&data)) { if (enumerated >= allocated) { LPWSTR *new_list; allocated *= 2; new_list = CoTaskMemRealloc(list, allocated * sizeof(list[0])); if (!new_list) { hr = E_OUTOFMEMORY; break; } list = new_list; } list[enumerated] = CoTaskMemAlloc((lstrlenW(data.cFileName) + 1) * sizeof(WCHAR)); if (!list[enumerated]) { hr = E_OUTOFMEMORY; break; } lstrcpyW(list[enumerated], data.cFileName); enumerated++; if (enumerated >= count) { hr = S_OK; break; } } } while (FindNextFileW(This->handle, &data)); if (FAILED(hr)) free_list(list, enumerated); else { *fetched = enumerated; *names = list; } return hr; }
static HRESULT WINAPI EnumWorkItems_Next(IEnumWorkItems *iface, ULONG count, LPWSTR **names, ULONG *fetched) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); FIXME("(%p)->(%u %p %p): stub\n", This, count, names, fetched); return E_NOTIMPL; }
static HRESULT WINAPI EnumWorkItems_Reset(IEnumWorkItems *iface) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); FIXME("(%p): stub\n", This); return E_NOTIMPL; }
static HRESULT WINAPI EnumWorkItems_Skip(IEnumWorkItems *iface, ULONG count) { EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); FIXME("(%p)->(%u): stub\n", This, count); return E_NOTIMPL; }