In Windows, in the Save As and Export Selected Packets dialog, append
authorGuy Harris <guy@alum.mit.edu>
Wed, 23 May 2012 03:05:17 +0000 (03:05 -0000)
committerGuy Harris <guy@alum.mit.edu>
Wed, 23 May 2012 03:05:17 +0000 (03:05 -0000)
the default extension for the file type iff

the file type we're using has a list of extensions;

the file has no extension or it has one but it's not one of the
ones in the list.

*Don't* expect a file extension to be at most 5 characters plus the dot
- the extension for pcap-ng, our default capture file type, is "pcapng",
and that's 6 characters!

svn path=/trunk/; revision=42800

ui/qt/main_window.cpp
ui/win32/file_dlg_win32.c
wiretap/file_access.c
wiretap/wtap.h

index 7211c1cd32a4880aa1c458cad1dbb4212131929d..298014cfb7eed3a0b5e998491096f42e5cab76b2 100644 (file)
@@ -210,7 +210,7 @@ append_file_type(QStringList &filters, int ft)
 
     filter = wtap_file_type_string(ft);
     filter += " (";
-    extensions_list = wtap_get_file_extensions_list(ft);
+    extensions_list = wtap_get_file_extensions_list(ft, TRUE);
     if (extensions_list == NULL) {
         /* This file type doesn't have any particular extension
            conventionally used for it, so we'll just use "*.*"
index 4773b4db5fb9b376254d980378f1d7b7386eecc7..2476b3adef249cdb096031255ffb8a69c96245eb 100644 (file)
@@ -271,6 +271,8 @@ win32_save_as_file(HWND h_wnd, action_after_save_e action_after_save, gpointer a
     TCHAR  file_name16[MAX_PATH] = _T("");
     GString *file_name8;
     gchar *file_last_dot;
+    GSList *extensions_list, *extension;
+    gboolean add_extension;
     gchar *dirname;
     int    ofnsize;
 #if (_MSC_VER >= 1500)
@@ -323,12 +325,35 @@ win32_save_as_file(HWND h_wnd, action_after_save_e action_after_save, gpointer a
     if (GetSaveFileName(ofn)) {
         filetype = g_array_index(savable_file_types, int, ofn->nFilterIndex - 1);
 
-        /* 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) */
+        /*
+        * Append the default file extension if there's none given by the user
+        * or if they gave one that's not one of the valid extensions for
+        * the file type.
+        */
         file_name8 = g_string_new(utf_16to8(file_name16));
         file_last_dot = strrchr(file_name8->str,'.');
-        if(file_last_dot == NULL || strlen(file_name8->str)-(file_last_dot-file_name8->str) > 5+1) {
-            if(wtap_default_file_extension(filetype) != NULL) {
+        extensions_list = wtap_get_file_extensions_list(filetype, FALSE);
+        if (extensions_list != NULL) {
+            /* We have one or more extensions for this file type.
+              Start out assuming we need to add the default one. */
+            add_extension = TRUE;
+            if (file_last_dot != NULL) {
+                /* OK, see if the file has one of those extensions. */
+                for (extension = extensions_list; extension != NULL && file_last_dot != NULL;
+                     extension = g_slist_next(extension)) {
+                    if (g_ascii_strcasecmp((char *)extension->data, file_last_dot) == 0) {
+                        /* The file name has one of the extensions for this file type */
+                        add_extension = FALSE;
+                        break;
+                    }
+                }
+            }
+        } else {
+            /* We have no extensions for this file type.  Don't add one. */
+            add_extension = FALSE;
+        }      
+        if (add_extension) {
+            if (wtap_default_file_extension(filetype) != NULL) {
                 g_string_append_printf(file_name8, ".%s", wtap_default_file_extension(filetype));
             }
         }
@@ -420,6 +445,8 @@ win32_export_specified_packets_file(HWND h_wnd) {
     TCHAR  file_name16[MAX_PATH] = _T("");
     GString *file_name8;
     gchar *file_last_dot;
+    GSList *extensions_list, *extension;
+    gboolean add_extension;
     gchar *dirname;
     int    ofnsize;
 #if (_MSC_VER >= 1500)
@@ -472,12 +499,35 @@ win32_export_specified_packets_file(HWND h_wnd) {
     if (GetSaveFileName(ofn)) {
         filetype = g_array_index(savable_file_types, int, ofn->nFilterIndex - 1);
 
-        /* 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) */
+        /*
+        * Append the default file extension if there's none given by the user
+        * or if they gave one that's not one of the valid extensions for
+        * the file type.
+        */
         file_name8 = g_string_new(utf_16to8(file_name16));
         file_last_dot = strrchr(file_name8->str,'.');
-        if(file_last_dot == NULL || strlen(file_name8->str)-(file_last_dot-file_name8->str) > 5+1) {
-            if(wtap_default_file_extension(filetype) != NULL) {
+        extensions_list = wtap_get_file_extensions_list(filetype, FALSE);
+        if (extensions_list != NULL) {
+            /* We have one or more extensions for this file type.
+              Start out assuming we need to add the default one. */
+            add_extension = TRUE;
+            if (file_last_dot != NULL) {
+                /* OK, see if the file has one of those extensions. */
+                for (extension = extensions_list; extension != NULL && file_last_dot != NULL;
+                     extension = g_slist_next(extension)) {
+                    if (g_ascii_strcasecmp((char *)extension->data, file_last_dot) == 0) {
+                        /* The file name has one of the extensions for this file type */
+                        add_extension = FALSE;
+                        break;
+                    }
+                }
+            }
+        } else {
+            /* We have no extensions for this file type.  Don't add one. */
+            add_extension = FALSE;
+        }      
+        if (add_extension) {
+            if (wtap_default_file_extension(filetype) != NULL) {
                 g_string_append_printf(file_name8, ".%s", wtap_default_file_extension(filetype));
             }
         }
@@ -1535,7 +1585,7 @@ append_file_type(GArray *sa, int ft)
     TCHAR *str16;
     guint16 zero = 0;
 
-    extensions_list = wtap_get_file_extensions_list(ft);
+    extensions_list = wtap_get_file_extensions_list(ft, TRUE);
     if (extensions_list == NULL) {
         /* This file type doesn't have any particular extension
            conventionally used for it, so we'll just use "*.*"
index c823098f521447d223db1332056d00360c927c28..b6525f07e8b7422766d2bf24eb1c87c9b5652f96 100644 (file)
@@ -841,12 +841,14 @@ static GSList *add_extensions(GSList *extensions, const gchar *extension,
 }
 
 /* Return a list of file extensions that are used by the specified file type.
-   This includes compressed extensions, e.g. not just "pcap" but also
-   "pcap.gz" if we can read gzipped files.
+
+   If include_compressed is TRUE, the list will include compressed
+   extensions, e.g. not just "pcap" but also "pcap.gz" if we can read
+   gzipped files.
 
    All strings in the list are allocated with g_malloc() and must be freed
    with g_free(). */
-GSList *wtap_get_file_extensions_list(int filetype)
+GSList *wtap_get_file_extensions_list(int filetype, gboolean include_compressed)
 {
        gchar **extensions_set, **extensionp;
        gchar *extension;
@@ -862,9 +864,13 @@ GSList *wtap_get_file_extensions_list(int filetype)
        extensions = NULL;      /* empty list, to start with */
 
        /*
-        * Get the list of compressed-file extensions.
+        * If include_compressions is true, get the list of compressed-file
+        * extensions.
         */
-       compressed_file_extensions = wtap_get_compressed_file_extensions();
+       if (include_compressed)
+               compressed_file_extensions = wtap_get_compressed_file_extensions();
+       else
+               compressed_file_extensions = NULL;
 
        /*
         * Add the default extension, and all compressed variants of
index f671466728f9e59a96169a571d52adb448eb6911..45c26f4a17d8693b970afcf1f98a48848bea8bc0 100644 (file)
@@ -1127,7 +1127,7 @@ int wtap_short_string_to_file_type(const char *short_name);
 
 /*** various file extension functions ***/
 const char *wtap_default_file_extension(int filetype);
-GSList *wtap_get_file_extensions_list(int filetype);
+GSList *wtap_get_file_extensions_list(int filetype, gboolean include_compressed);
 void wtap_free_file_extensions_list(GSList *extensions);
 
 const char *wtap_encap_string(int encap);