From 77d9e919d22c8aaa6bafbc8c0cf22abbb6d40e1b Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Mon, 17 Mar 2014 20:42:10 +0000 Subject: [PATCH] [ui] ensure the default download directory for updates is the current app dir * Closes #299 * Also fix update save dialog not retrieving the path when compiled for Vista or later --- src/net.c | 3 ++- src/rufus.c | 6 +++--- src/rufus.h | 2 +- src/rufus.rc | 12 ++++++------ src/stdlg.c | 18 +++++++++++++----- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/net.c b/src/net.c index 5d3fdfc8..4f74e55e 100644 --- a/src/net.c +++ b/src/net.c @@ -433,9 +433,10 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) update_check_in_progress = TRUE; verbose = ReadRegistryKey32(REGKEY_HKCU, REGKEY_VERBOSE_UPDATES); + // Without this the FileDialog will produce error 0x8001010E when compiled for Vista or later + IGNORE_RETVAL(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)); // Unless the update was forced, wait a while before performing the update check if (!force_update_check) { - // TODO: Also check on inactivity // It would of course be a lot nicer to use a timer and wake the thread, but my // development time is limited and this is FASTER to implement. do { diff --git a/src/rufus.c b/src/rufus.c index 3dde664f..1393bec9 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -1062,7 +1062,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) log_size = GetDlgItemTextU(hDlg, IDC_LOG_EDIT, log_buffer, log_size); if (log_size != 0) { log_size--; // remove NUL terminator - filepath = FileDialog(TRUE, app_dir, "rufus.log", "log", lmprintf(MSG_108)); + filepath = FileDialog(TRUE, app_dir, "rufus.log", "log", lmprintf(MSG_108), 0); if (filepath != NULL) { FileIO(TRUE, filepath, &log_buffer, &log_size); } @@ -2092,9 +2092,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA } else { safe_free(iso_path); if (selection_default == DT_IMG) - iso_path = FileDialog(FALSE, NULL, "*.img", "img", "DD Image"); + iso_path = FileDialog(FALSE, NULL, "*.img", "img", "DD Image", 0); else - iso_path = FileDialog(FALSE, NULL, "*.iso", "iso", lmprintf(MSG_036)); + iso_path = FileDialog(FALSE, NULL, "*.iso", "iso", lmprintf(MSG_036), 0); if (iso_path == NULL) { CreateTooltip(hSelectISO, lmprintf(MSG_173), -1); break; diff --git a/src/rufus.h b/src/rufus.h index 6e9a9922..f471c80d 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -339,7 +339,7 @@ extern BOOL InstallSyslinux(DWORD drive_index, char drive_letter); DWORD WINAPI FormatThread(void* param); extern BOOL CreateProgress(void); extern BOOL SetAutorun(const char* path); -extern char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_desc); +extern char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_desc, DWORD options); extern BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size); extern unsigned char* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate); extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue); diff --git a/src/rufus.rc b/src/rufus.rc index a4f8ef78..dc49bb1f 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 1.4.6.438" +CAPTION "Rufus 1.4.6.439" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -165,7 +165,7 @@ END RTL_IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 1.4.6.438" +CAPTION "Rufus 1.4.6.439" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -427,8 +427,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,6,438 - PRODUCTVERSION 1,4,6,438 + FILEVERSION 1,4,6,439 + PRODUCTVERSION 1,4,6,439 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -445,13 +445,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.4.6.438" + VALUE "FileVersion", "1.4.6.439" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.4.6.438" + VALUE "ProductVersion", "1.4.6.439" END END BLOCK "VarFileInfo" diff --git a/src/stdlg.c b/src/stdlg.c index b446d026..526dc320 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -241,8 +241,11 @@ fallback: * Return the UTF8 path of a file selected through a load or save dialog * Will use the newer IFileOpenDialog if *compiled* for Vista or later * All string parameters are UTF-8 + * IMPORTANT NOTE: On Vista and later, remember that you need to call + * CoInitializeEx() for *EACH* thread you invoke FileDialog from, as + * GetDisplayName() will return error 0x8001010E otherwise. */ -char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_desc) +char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_desc, DWORD options) { DWORD tmp; OPENFILENAMEA ofn; @@ -280,7 +283,8 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des &IID_IFileDialog, (LPVOID)&pfd); if (FAILED(hr)) { - uprintf("CoCreateInstance for FileOpenDialog failed: error %X\n", hr); + SetLastError(hr); + uprintf("CoCreateInstance for FileOpenDialog failed: %s\n", WindowsErrorString()); pfd = NULL; // Just in case goto fallback; } @@ -319,12 +323,16 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des if (SUCCEEDED(hr)) { filepath = wchar_to_utf8(wpath); CoTaskMemFree(wpath); + } else { + SetLastError(hr); + uprintf("Unable to access file path: %s\n", WindowsErrorString()); } psiResult->lpVtbl->Release(psiResult); } } else if ((hr & 0xFFFF) != ERROR_CANCELLED) { // If it's not a user cancel, assume the dialog didn't show and fallback - uprintf("Could not show FileOpenDialog: error %X\n", hr); + SetLastError(hr); + uprintf("Could not show FileOpenDialog: %s\n", WindowsErrorString()); goto fallback; } pfd->lpVtbl->Release(pfd); @@ -363,7 +371,7 @@ fallback: ofn.lpstrFilter = ext_string; // Initial dir ofn.lpstrInitialDir = path; - ofn.Flags = OFN_OVERWRITEPROMPT; + ofn.Flags = OFN_OVERWRITEPROMPT | options; // Show Dialog if (save) { r = GetSaveFileNameU(&ofn); @@ -1245,7 +1253,7 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR break; } for (i=(int)strlen(update.download_url); (i>0)&&(update.download_url[i]!='/'); i--); - filepath = FileDialog(TRUE, app_dir, (char*)&update.download_url[i+1], "exe", lmprintf(MSG_037)); + filepath = FileDialog(TRUE, app_dir, (char*)&update.download_url[i+1], "exe", lmprintf(MSG_037), OFN_NOCHANGEDIR); if (filepath == NULL) { uprintf("Could not get save path\n"); break;