[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
This commit is contained in:
Pete Batard 2014-03-17 20:42:10 +00:00
parent 54b7fdcddc
commit 77d9e919d2
5 changed files with 25 additions and 16 deletions

View file

@ -433,9 +433,10 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
update_check_in_progress = TRUE; update_check_in_progress = TRUE;
verbose = ReadRegistryKey32(REGKEY_HKCU, REGKEY_VERBOSE_UPDATES); 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 // Unless the update was forced, wait a while before performing the update check
if (!force_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 // 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. // development time is limited and this is FASTER to implement.
do { do {

View file

@ -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); log_size = GetDlgItemTextU(hDlg, IDC_LOG_EDIT, log_buffer, log_size);
if (log_size != 0) { if (log_size != 0) {
log_size--; // remove NUL terminator 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) { if (filepath != NULL) {
FileIO(TRUE, filepath, &log_buffer, &log_size); FileIO(TRUE, filepath, &log_buffer, &log_size);
} }
@ -2092,9 +2092,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
} else { } else {
safe_free(iso_path); safe_free(iso_path);
if (selection_default == DT_IMG) 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 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) { if (iso_path == NULL) {
CreateTooltip(hSelectISO, lmprintf(MSG_173), -1); CreateTooltip(hSelectISO, lmprintf(MSG_173), -1);
break; break;

View file

@ -339,7 +339,7 @@ extern BOOL InstallSyslinux(DWORD drive_index, char drive_letter);
DWORD WINAPI FormatThread(void* param); DWORD WINAPI FormatThread(void* param);
extern BOOL CreateProgress(void); extern BOOL CreateProgress(void);
extern BOOL SetAutorun(const char* path); 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 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 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); extern BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* szPolicy, DWORD dwValue);

View file

@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 329 IDD_DIALOG DIALOGEX 12, 12, 206, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU 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 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
@ -165,7 +165,7 @@ END
RTL_IDD_DIALOG DIALOGEX 12, 12, 206, 329 RTL_IDD_DIALOG DIALOGEX 12, 12, 206, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU 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 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 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
@ -427,8 +427,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,6,438 FILEVERSION 1,4,6,439
PRODUCTVERSION 1,4,6,438 PRODUCTVERSION 1,4,6,439
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -445,13 +445,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.4.6.438" VALUE "FileVersion", "1.4.6.439"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe" VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "1.4.6.438" VALUE "ProductVersion", "1.4.6.439"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -241,8 +241,11 @@ fallback:
* Return the UTF8 path of a file selected through a load or save dialog * 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 * Will use the newer IFileOpenDialog if *compiled* for Vista or later
* All string parameters are UTF-8 * 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; DWORD tmp;
OPENFILENAMEA ofn; OPENFILENAMEA ofn;
@ -280,7 +283,8 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des
&IID_IFileDialog, (LPVOID)&pfd); &IID_IFileDialog, (LPVOID)&pfd);
if (FAILED(hr)) { 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 pfd = NULL; // Just in case
goto fallback; goto fallback;
} }
@ -319,12 +323,16 @@ char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* ext_des
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
filepath = wchar_to_utf8(wpath); filepath = wchar_to_utf8(wpath);
CoTaskMemFree(wpath); CoTaskMemFree(wpath);
} else {
SetLastError(hr);
uprintf("Unable to access file path: %s\n", WindowsErrorString());
} }
psiResult->lpVtbl->Release(psiResult); psiResult->lpVtbl->Release(psiResult);
} }
} else if ((hr & 0xFFFF) != ERROR_CANCELLED) { } else if ((hr & 0xFFFF) != ERROR_CANCELLED) {
// If it's not a user cancel, assume the dialog didn't show and fallback // 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; goto fallback;
} }
pfd->lpVtbl->Release(pfd); pfd->lpVtbl->Release(pfd);
@ -363,7 +371,7 @@ fallback:
ofn.lpstrFilter = ext_string; ofn.lpstrFilter = ext_string;
// Initial dir // Initial dir
ofn.lpstrInitialDir = path; ofn.lpstrInitialDir = path;
ofn.Flags = OFN_OVERWRITEPROMPT; ofn.Flags = OFN_OVERWRITEPROMPT | options;
// Show Dialog // Show Dialog
if (save) { if (save) {
r = GetSaveFileNameU(&ofn); r = GetSaveFileNameU(&ofn);
@ -1245,7 +1253,7 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR
break; break;
} }
for (i=(int)strlen(update.download_url); (i>0)&&(update.download_url[i]!='/'); i--); 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) { if (filepath == NULL) {
uprintf("Could not get save path\n"); uprintf("Could not get save path\n");
break; break;