extern int my_setcurrentdir (const TCHAR *curdir, TCHAR *oldcur);
bool my_isfilehidden (const TCHAR *path);
void my_setfilehidden (const TCHAR *path, bool hidden);
+int my_readonlyfile(const TCHAR *path);
extern struct my_openfile_s *my_open (const TCHAR*, int);
extern void my_close (struct my_openfile_s*);
return 0;
}
+int my_readonlyfile(const TCHAR *name)
+{
+ HANDLE h;
+
+ if (!my_existsfile(name))
+ return -1;
+ h = CreateFile(name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (h == INVALID_HANDLE_VALUE) {
+ DWORD err = GetLastError();
+ if (err == ERROR_ACCESS_DENIED || err == ERROR_WRITE_PROTECT)
+ return true;
+ }
+ CloseHandle(h);
+ return false;
+}
+
struct my_openfile_s *my_open (const TCHAR *name, int flags)
{
struct my_openfile_s *mos;
memcpy(&currprefs.path_rom, &p->path_rom, sizeof(struct multipath));
}
+static bool cfgfile_can_write(HWND hDlg, const TCHAR *path)
+{
+ for (;;) {
+ int v = my_readonlyfile(path);
+ if (v <= 0)
+ return true;
+ TCHAR szMessage[MAX_DPATH], msg[MAX_DPATH], szTitle[MAX_DPATH];
+ WIN32GUI_LoadUIString(IDS_READONLYCONFIRMATION, szMessage, MAX_DPATH);
+ _stprintf(msg, szMessage, path);
+ WIN32GUI_LoadUIString(IDS_ERRORTITLE, szTitle, MAX_DPATH);
+ if (MessageBox(hDlg, msg, szTitle, MB_YESNO | MB_ICONWARNING | MB_APPLMODAL | MB_SETFOREGROUND) == IDYES) {
+ DWORD flags = GetFileAttributesSafe(path);
+ if (!(flags & FILE_ATTRIBUTE_READONLY)) {
+ return true;
+ }
+ flags &= ~FILE_ATTRIBUTE_READONLY;
+ SetFileAttributesSafe(path, flags);
+ continue;
+ }
+ break;
+
+ }
+ return false;
+}
+
int target_cfgfile_load (struct uae_prefs *p, const TCHAR *filename, int type, int isdefault)
{
int v, i, type2;
}
break;
case IDC_SAVE:
- SetDlgItemText (hDlg, IDC_EDITNAME, full_path);
- cfgfile_save (&workprefs, full_path, 0);
+ if (cfgfile_can_write(hDlg, full_path)) {
+ SetDlgItemText(hDlg, IDC_EDITNAME, full_path);
+ cfgfile_save(&workprefs, full_path, 0);
+ }
break;
case IDC_ROMFILE:
_tcscpy (workprefs.romfile, full_path);
TCHAR szMessage[MAX_DPATH];
WIN32GUI_LoadUIString(IDS_MUSTENTERNAME, szMessage, MAX_DPATH);
pre_gui_message (szMessage);
- } else {
+ } else if (cfgfile_can_write(hDlg, path)) {
_tcscpy (workprefs.description, desc);
cfgfile_save (&workprefs, path, configtypepanel);
}