static HRESULT WINAPI IEnumShellItems_fnNext(IEnumShellItems* iface, ULONG celt, IShellItem **rgelt, ULONG *pceltFetched) { IEnumShellItemsImpl *This = impl_from_IEnumShellItems(iface); HRESULT hr = S_FALSE; UINT i; ULONG fetched = 0; TRACE("%p (%d %p %p)\n", This, celt, rgelt, pceltFetched); if(pceltFetched == NULL && celt != 1) return E_INVALIDARG; for(i = This->position; fetched < celt && i < This->count; i++) { hr = IShellItemArray_GetItemAt(This->array, i, &rgelt[fetched]); if(FAILED(hr)) break; fetched++; This->position++; } if(SUCCEEDED(hr)) { if(pceltFetched != NULL) *pceltFetched = fetched; if(fetched > 0) return S_OK; return S_FALSE; } return hr; }
static gpointer filechooser_win32_thread (gpointer _data) { FilechooserWin32ThreadData *data = _data; HRESULT hr; IFileDialog *pfd = NULL; IFileDialog2 *pfd2 = NULL; DWORD flags; DWORD cookie; GSList *l; CoInitializeEx (NULL, COINIT_APARTMENTTHREADED); if (data->save && !data->folder) hr = CoCreateInstance (&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER, &IID_IFileSaveDialog, (LPVOID *) &pfd); else hr = CoCreateInstance (&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, &IID_IFileOpenDialog, (LPVOID *) &pfd); if (FAILED (hr)) g_error ("Can't create FileOpenDialog: %s", g_win32_error_message (hr)); hr = IFileDialog_GetOptions (pfd, &flags); if (FAILED (hr)) g_error ("Can't get FileDialog options: %s", g_win32_error_message (hr)); flags |= FOS_FORCEFILESYSTEM; if (data->folder) flags |= FOS_PICKFOLDERS; if (data->folder && data->save) flags &= ~(FOS_FILEMUSTEXIST); if (data->select_multiple) flags |= FOS_ALLOWMULTISELECT; if (data->show_hidden) flags |= FOS_FORCESHOWHIDDEN; if (data->overwrite_confirmation) flags |= FOS_OVERWRITEPROMPT; else flags &= ~(FOS_OVERWRITEPROMPT); hr = IFileDialog_SetOptions (pfd, flags); if (FAILED (hr)) g_error ("Can't set FileDialog options: %s", g_win32_error_message (hr)); if (data->title) { gunichar2 *label = g_utf8_to_utf16 (data->title, -1, NULL, NULL, NULL); IFileDialog_SetTitle (pfd, label); g_free (label); } if (data->accept_label) { gunichar2 *label = g_utf8_to_utf16 (data->accept_label, -1, NULL, NULL, NULL); IFileDialog_SetOkButtonLabel (pfd, label); g_free (label); } if (data->cancel_label) { gunichar2 *label = g_utf8_to_utf16 (data->cancel_label, -1, NULL, NULL, NULL); hr = IFileDialog_QueryInterface (pfd, &IID_IFileDialog2, (LPVOID *) &pfd2); if (SUCCEEDED (hr)) { IFileDialog2_SetCancelButtonLabel (pfd2, label); IFileDialog2_Release (pfd2); } g_free (label); } for (l = data->shortcut_uris; l != NULL; l = l->next) { IShellItem *item = get_shell_item_for_uri (l->data); if (item) { hr = IFileDialog_AddPlace (pfd, item, FDAP_BOTTOM); if (FAILED (hr)) g_warning_hr ("Can't add dialog shortcut", hr); IShellItem_Release (item); } } if (data->current_file) { IFileSaveDialog *pfsd; hr = IFileDialog_QueryInterface (pfd, &IID_IFileSaveDialog, (LPVOID *) &pfsd); if (SUCCEEDED (hr)) { IShellItem *item = get_shell_item_for_file (data->current_file); if (item) { hr = IFileSaveDialog_SetSaveAsItem (pfsd, item); if (FAILED (hr)) g_warning_hr ("Can't set save as item", hr); IShellItem_Release (item); } IFileSaveDialog_Release (pfsd); } } if (data->current_folder) { IShellItem *item = get_shell_item_for_file (data->current_folder); if (item) { hr = IFileDialog_SetFolder (pfd, item); if (FAILED (hr)) g_warning_hr ("Can't set folder", hr); IShellItem_Release (item); } } if (data->current_name) { gunichar2 *name = g_utf8_to_utf16 (data->current_name, -1, NULL, NULL, NULL); hr = IFileDialog_SetFileName (pfd, name); if (FAILED (hr)) g_warning_hr ("Can't set file name", hr); g_free (name); } if (data->filters) { int n; for (n = 0; data->filters[n].pszName != NULL; n++) {} hr = IFileDialog_SetFileTypes (pfd, n, data->filters); if (FAILED (hr)) g_warning_hr ("Can't set file types", hr); if (data->self->current_filter) { GSList *filters = gtk_file_chooser_list_filters (GTK_FILE_CHOOSER (data->self)); gint current_filter_index = g_slist_index (filters, data->self->current_filter); g_slist_free (filters); if (current_filter_index >= 0) hr = IFileDialog_SetFileTypeIndex (pfd, current_filter_index + 1); else hr = IFileDialog_SetFileTypeIndex (pfd, 1); } else { hr = IFileDialog_SetFileTypeIndex (pfd, 1); } if (FAILED (hr)) g_warning_hr ("Can't set current file type", hr); } data->response = GTK_RESPONSE_CANCEL; hr = IFileDialog_Advise (pfd, data->events, &cookie); if (FAILED (hr)) g_error ("Can't Advise FileDialog: %s", g_win32_error_message (hr)); hr = IFileDialog_Show (pfd, data->parent); if (SUCCEEDED (hr)) { IFileOpenDialog *pfod = NULL; hr = IFileDialog_QueryInterface (pfd,&IID_IFileOpenDialog, (LPVOID *) &pfod); if (SUCCEEDED (hr)) { IShellItemArray *res; DWORD i, count; hr = IFileOpenDialog_GetResults (pfod, &res); if (FAILED (hr)) g_error ("Can't get FileOpenDialog results: %s", g_win32_error_message (hr)); hr = IShellItemArray_GetCount (res, &count); if (FAILED (hr)) g_error ("Can't get FileOpenDialog count: %s", g_win32_error_message (hr)); for (i = 0; i < count; i++) { IShellItem *item; hr = IShellItemArray_GetItemAt (res, i, &item); if (FAILED (hr)) g_error ("Can't get item at %lu: %s", i, g_win32_error_message (hr)); data_add_shell_item (data, item); IShellItem_Release (item); } IShellItemArray_Release (res); IFileOpenDialog_Release (pfod); } else { IShellItem *item; hr = IFileDialog_GetResult (pfd, &item); if (FAILED (hr)) g_error ("Can't get FileDialog result: %s", g_win32_error_message (hr)); data_add_shell_item (data, item); IShellItem_Release (item); } } hr = IFileDialog_Unadvise (pfd, cookie); if (FAILED (hr)) g_error ("Can't Unadvise FileDialog: %s", g_win32_error_message (hr)); IFileDialog_Release ((IUnknown *)pfd); g_main_context_invoke (NULL, filechooser_win32_thread_done, data); return NULL; }