Windows 'File ! Save_As': Error popup if saving to name of open capture file and...
authorwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 2 Dec 2010 01:38:50 +0000 (01:38 +0000)
committerwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 2 Dec 2010 01:38:50 +0000 (01:38 +0000)
error popup if delete of existing file fails.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@35100 f5534014-38df-0310-8fa8-9805f1628bb7

win32/file_dlg_win32.c

index 9b66d1ded680feba16dc127473b6785fd14a6f19..60afe8ed8b4a16f6099fd5835601bcf38f489e46 100644 (file)
@@ -301,7 +301,7 @@ win32_save_as_file(HWND h_wnd, action_after_save_e action_after_save, gpointer a
         /* append the default file extension if there's none given by the user */
         /* (we expect a file extension to be at most 5 chars + the dot) */
         file_name8 = g_string_new(utf_16to8(file_name16));
-        file_last_dot = strrchr(file_name8->str,'.');
+        file_last_dot = strrchr(file_name8->str,'.'); /* XXX: strrchr not really OK for utf8 ? */
         if(file_last_dot == NULL || strlen(file_name8->str)-(file_last_dot-file_name8->str) > 5+1) {
             if(wtap_file_extension_default_string(filetype) != NULL) {
                 file_name8 = g_string_append(file_name8, wtap_file_extension_default_string(filetype));
@@ -314,12 +314,29 @@ win32_save_as_file(HWND h_wnd, action_after_save_e action_after_save, gpointer a
 
         /* GetSaveFileName() already asked the user if he wants to overwrite the old file,        */
         /* so if we are here, user already confirmed to overwrite - just delete the old file now. */
-        ws_unlink(file_name8->str);  /* XX: Windows Wireshark is built with GLIB >= 2.6 these     */
-                                     /* days so ws_unlink will properly convert the               */
-                                     /* UTF8 filename to UTF16 & then do a _wunlink.              */
-
+        /* Note: Windows ws_unlink cannot delete a currently open file; Therefore the             */
+        /*       GetSaveFileName dialog has been coded to prevent doing a 'save as' to the        */
+        /*       currently open capture file.                                                     */
+        /* XX: Windows Wireshark is built with GLIB >= 2.6 these       */
+        /*     days so ws_unlink will properly convert the             */
+        /*     UTF8 filename to UTF16 & then do a _wunlink.            */
+        /* XX: if the cf_save fails, it will do a GTK simple_dialog()  */
+        /*     which is not useful while doing a Windows dialog.       */
+        /*     (A GTK dialog box will be generated and basically will  */
+        /*     only appear when the redisplayed Windows 'save_as-file' */
+        /*     dialog is dismissed. It will then need to be dismissed. */
+        /*     This should be fixed even though the cf_save()          */
+        /*     presumably should rarely fail in this case.             */
+        if ((ws_unlink(file_name8->str) != 0) && (errno == EACCES)) {
+            /* XXX: Is MessageBox the best way to pop up an error ? How to make text bold ? */
+            gchar *str = g_strdup_printf("Unable to delete file: %s\nPlease choose another name !", file_name8->str);
+            MessageBox( NULL, utf_8to16(str), _T("Error"), MB_ICONERROR | MB_APPLMODAL | MB_OK);
+            g_free(str);
+            goto AGAIN;
+        }
         if (cf_save(&cfile, file_name8->str, &range, filetype, FALSE) != CF_OK) {
             /* The write failed.  Try again. */
+        AGAIN:
             g_string_free(file_name8, TRUE /* free_segment */);
             g_free( (void *) ofn->lpstrFilter);
             g_free( (void *) ofn);
@@ -1475,6 +1492,31 @@ save_as_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, LPARAM l_param) {
                 case CDN_HELP:
                     topic_cb(NULL, HELP_SAVE_WIN32_DIALOG);
                     break;
+                case CDN_FILEOK: {
+                    HWND   parent;
+                    TCHAR  file_name16_selected[MAX_PATH];
+                    char  *file_name8_selected;
+                    int    selected_size;
+
+                    /* Check if trying to do 'save as' to the currently open file */
+                    parent = GetParent(sf_hwnd);
+                    selected_size = CommDlg_OpenSave_GetSpec(parent, file_name16_selected, MAX_PATH);
+                    if (selected_size > 0) {
+                        file_name8_selected = utf_16to8(file_name16_selected);
+                        if (files_identical(cfile.filename, file_name8_selected)) {
+                            /* XXX: Is MessageBox the best way to pop up an error ? How to make text bold ? */
+                            gchar *str = g_strdup_printf(
+                                "Capture File \"%s\" identical to loaded file !!\n\n"
+                                "Please choose a different filename.",
+                                file_name8_selected);
+                            MessageBox( parent, utf_8to16(str), _T("Error"), MB_ICONERROR | MB_APPLMODAL | MB_OK);
+                            g_free(str);
+                            SetWindowLongPtr(sf_hwnd, DWLP_MSGRESULT, 1L); /* Don't allow ! */
+                            return 1;
+                        }
+                    }
+                }
+                    break;
                 default:
                     break;
             }