On 08.09.2017 8:29, Alex Henrie wrote:
typedef struct { FolderItems3 FolderItems3_iface; LONG ref; + VARIANT dir; + WCHAR **item_filenames; + LONG item_count; } FolderItemsImpl;
If 'dir' is always a string maybe store it as such?
static HRESULT WINAPI FolderItemsImpl_Item(FolderItems3 *iface, VARIANT index, FolderItem **ppid) { - FIXME("(%p,%s,%p)\n", iface, debugstr_variant(&index), ppid); + FolderItemsImpl *This = impl_from_FolderItems(iface); + WCHAR path_str[MAX_PATH]; + VARIANT path_var; + HRESULT ret; + + TRACE("(%p,%s,%p)\n", iface, debugstr_variant(&index), ppid);
*ppid = NULL; - return E_NOTIMPL; + + if (!PathIsDirectoryW(V_BSTR(&This->dir))) + return S_FALSE;
How could it not be a directory?
+ TRACE("(%p,%s,%p)\n", iface, debugstr_variant(&index), ppid);
Could add some spaces in argument list? Most of the wine code is doing that I think.
+ if (!PathCombineW(path_str, V_BSTR(&This->dir), This->item_filenames[V_I4(&index)])) + return E_OUTOFMEMORY;
Why E_OUTOFMEMORY?
+ do + { + if (!strcmpW(file_info.cFileName, dot) || !strcmpW(file_info.cFileName, dot_dot)) + continue; + + if (This->item_count >= item_size) + { + item_size *= 2; + filenames = HeapReAlloc(GetProcessHeap(), 0, This->item_filenames, item_size * sizeof(WCHAR*)); + if (!filenames) + goto fail; + This->item_filenames = filenames; + } + + This->item_filenames[This->item_count] = strdupW(file_info.cFileName); + if (!This->item_filenames[This->item_count]) + goto fail; + This->item_count++; + } + while (FindNextFileW(first_file, &file_info));
Do we have tests showing that it takes a snapshot like that? For example if new file is created after FolderItems was created, is it accessible with BSTR index for example?