Add a wtap_dump_can_write() routine that indicates whether Wiretap
authorGuy Harris <guy@alum.mit.edu>
Mon, 1 Apr 2013 21:17:50 +0000 (21:17 -0000)
committerGuy Harris <guy@alum.mit.edu>
Mon, 1 Apr 2013 21:17:50 +0000 (21:17 -0000)
supports writing files with a given set of encapsulations and comment
types.  Use it, rather than asking for a list of file formats that
support the given set of encapsulation and comment types and checking
whether we got back such a list, or duplicating its logic.

Having file.c use it means that nobody's using
wtap_dump_can_write_encaps() any more; get rid of it.  Instead, have a
private routine that checks whether a given file format supports a given
set of encapsulations *and* comment types, and use that internally.

svn path=/trunk/; revision=48690

file.c
ui/gtk/capture_file_dlg.c
ui/qt/capture_file_dialog.cpp
ui/win32/file_dlg_win32.c
wiretap/file_access.c
wiretap/wtap.h

diff --git a/file.c b/file.c
index 8acb8a29ad94913f791751dfe4c51756452ac0ad..eea204e2d9cb4d6a6c4684e7536373c0b47f3f2f 100644 (file)
--- a/file.c
+++ b/file.c
@@ -3971,20 +3971,14 @@ save_packet(capture_file *cf _U_, frame_data *fdata,
 gboolean
 cf_can_write_with_wiretap(capture_file *cf)
 {
-  int ft;
-
-  for (ft = 0; ft < WTAP_NUM_FILE_TYPES; ft++) {
-    /* To save a file with Wiretap, Wiretap has to handle that format,
-       and its code to handle that format must be able to write a file
-       with this file's encapsulation types. */
-    if (wtap_dump_can_write_encaps(ft, cf->linktypes)) {
-      /* OK, we can write it out in this type. */
-      return TRUE;
-    }
-  }
-
-  /* No, we couldn't save it in any format. */
-  return FALSE;
+  /* We don't care whether we support the comments in this file or not;
+     if we can't, we'll offer the user the option of discarding the
+     comments.
+
+     XXX - we shouldn't offer the option of adding or editing comments
+     of a particular type if we don't support that particular type of
+     comment in any file format. */
+  return wtap_dump_can_write(cf->linktypes, 0);
 }
 
 /*
index 573057d6d825b079960047dd14a59cceed76eeef..cabbd712e36ade92d2a2c73b0b73101c1856d9e7 100644 (file)
@@ -1291,7 +1291,6 @@ static check_savability_t
 check_save_with_comments(capture_file *cf)
 {
   guint32    comment_types;
-  GArray    *savable_file_types;
   GtkWidget *msg_dialog;
   gint       response;
 
@@ -1307,11 +1306,7 @@ check_save_with_comments(capture_file *cf)
 
   /* No. Are there formats in which we can write this file that
      supports all the comments in this file? */
-  savable_file_types = wtap_get_savable_file_types(cf->cd_t, cf->linktypes,
-                                                   comment_types);
-  if (savable_file_types != NULL) {
-    g_array_free(savable_file_types, TRUE);
-
+  if (wtap_dump_can_write(cf->linktypes, comment_types)) {
     /* Yes.  Offer the user a choice of "Save in a format that
        supports comments", "Discard comments and save in the
        file's own format", or "Cancel", meaning "don't bother
@@ -1577,7 +1572,6 @@ static check_savability_t
 gtk_check_save_as_with_comments(GtkWidget *w, capture_file *cf, int file_type)
 {
   guint32    comment_types;
-  GArray    *savable_file_types;
   GtkWidget *msg_dialog;
   gint       response;
 
@@ -1593,11 +1587,7 @@ gtk_check_save_as_with_comments(GtkWidget *w, capture_file *cf, int file_type)
 
   /* No. Are there formats in which we can write this file that
      supports all the comments in this file? */
-  savable_file_types = wtap_get_savable_file_types(file_type, cf->linktypes,
-                                                   comment_types);
-  if (savable_file_types != NULL) {
-    g_array_free(savable_file_types, TRUE);
-
+  if (wtap_dump_can_write(cf->linktypes, comment_types)) {
     /* Yes.  Offer the user a choice of "Save in a format that
        supports comments", "Discard comments and save in the
        format you selected", or "Cancel", meaning "don't bother
index 2e2a992263ef8b7d19556a8e7a622f24da0be4d8..a62d0ad9c3ea9eaf6c05dd3739687d11b8ce045a 100644 (file)
@@ -136,7 +136,6 @@ check_savability_t CaptureFileDialog::checkSaveAsWithComments(QWidget *
     return win32_check_save_as_with_comments(parent->effectiveWinId(), cf, file_type);
 #else // Q_WS_WIN
     guint32 comment_types;
-    GArray *savable_file_types;
     QMessageBox msg_dialog;
     int response;
 
@@ -152,11 +151,7 @@ check_savability_t CaptureFileDialog::checkSaveAsWithComments(QWidget *
 
     /* No. Are there formats in which we can write this file that
        supports all the comments in this file? */
-    savable_file_types = wtap_get_savable_file_types(file_type, cf->linktypes,
-                                                     comment_types);
-    if (savable_file_types != NULL) {
-        g_array_free(savable_file_types, TRUE);
-
+    if (wtap_dump_can_write(cf->linktypes, comment_types)) {
         QPushButton *default_button;
         /* Yes.  Offer the user a choice of "Save in a format that
            supports comments", "Discard comments and save in the
index e1fcb8c3f6cf2ed31dd5218980d8246b4b2243ac..08e718c0fa11b1ddd1981341581a8fbfe921f950 100644 (file)
@@ -238,7 +238,6 @@ check_savability_t
 win32_check_save_as_with_comments(HWND parent, capture_file *cf, int file_type)
 {
     guint32        comment_types;
-    GArray        *savable_file_types;
     gint           response;
 
     /* What types of comments do we have? */
@@ -253,11 +252,7 @@ win32_check_save_as_with_comments(HWND parent, capture_file *cf, int file_type)
 
     /* No. Are there formats in which we can write this file that
        supports all the comments in this file? */
-    savable_file_types = wtap_get_savable_file_types(cf->cd_t, cf->linktypes,
-                                                     comment_types);
-    if (savable_file_types != NULL) {
-        g_array_free(savable_file_types, TRUE);
-
+    if (wtap_dump_can_write(cf->linktypes, comment_types)) {
         /* Yes.  Offer the user a choice of "Save in a format that
            supports comments", "Discard comments and save in the
            format you selected", or "Cancel", meaning "don't bother
index 3e1e8b8e4a3bff1c74454bbe998679154ca2d45c..bf0c22cf3efe2ab1dc54f773f3776f6a6e4d7817 100644 (file)
@@ -877,11 +877,13 @@ wtap_dump_file_encap_type(const GArray *file_encaps)
 }
 
 /*
- * Return TRUE if a capture with a given GArray of WTAP_ENCAP_ types
- * can be written in a specified format, and FALSE if it can't.
+ * Return TRUE if a capture with a given GArray of encapsulation types
+ * and a given bitset of comment types can be written in a specified
+ * format, and FALSE if it can't.
  */
-gboolean
-wtap_dump_can_write_encaps(int ft, const GArray *file_encaps)
+static gboolean
+wtap_dump_can_write_format(int ft, const GArray *file_encaps,
+    guint32 required_comment_types)
 {
        guint i;
 
@@ -894,11 +896,22 @@ wtap_dump_can_write_encaps(int ft, const GArray *file_encaps)
        }
 
        /*
-        * Is the required per-file encapsulation type supported?
+        * Yes.  Can we write out all the required comments in this
+        * format?
+        */
+       if (!wtap_dump_supports_comment_types(ft, required_comment_types)) {
+               /* No. */
+               return FALSE;
+       }
+
+       /*
+        * Yes.  Is the required per-file encapsulation type supported?
         * This might be WTAP_ENCAP_PER_PACKET.
         */
-       if (!wtap_dump_can_write_encap(ft, wtap_dump_file_encap_type(file_encaps)))
+       if (!wtap_dump_can_write_encap(ft, wtap_dump_file_encap_type(file_encaps))) {
+               /* No. */
                return FALSE;
+       }
 
        /*
         * Yes.  Are all the individual encapsulation types supported?
@@ -915,9 +928,32 @@ wtap_dump_can_write_encaps(int ft, const GArray *file_encaps)
        return TRUE;
 }
 
+/**
+ * Return TRUE if we can write a file with the given GArray of
+ * encapsulation types and the given bitmask of comment types.
+ */
+gboolean
+wtap_dump_can_write(const GArray *file_encaps, guint32 required_comment_types)
+{
+  int ft;
+
+  for (ft = 0; ft < WTAP_NUM_FILE_TYPES; ft++) {
+    /* To save a file with Wiretap, Wiretap has to handle that format,
+       and its code to handle that format must be able to write a file
+       with this file's encapsulation types. */
+    if (wtap_dump_can_write_format(ft, file_encaps, required_comment_types)) {
+      /* OK, we can write it out in this type. */
+      return TRUE;
+    }
+  }
+
+  /* No, we couldn't save it in any format. */
+  return FALSE;
+}
+
 /**
  * Get a GArray of WTAP_FILE_ values for file types that can be used
- * to save a file of a given type with a given GArray of WTAP_ENCAP_
+ * to save a file of a given type with a given GArray of encapsulation
  * types and the given bitmask of comment types.
  */
 GArray *
@@ -930,16 +966,16 @@ wtap_get_savable_file_types(int file_type, const GArray *file_encaps,
        int other_file_type = -1;
 
        /* Can we save this file in its own file type? */
-       if (wtap_dump_can_write_encaps(file_type, file_encaps) &&
-           wtap_dump_supports_comment_types(file_type, required_comment_types)) {
+       if (wtap_dump_can_write_format(file_type, file_encaps,
+                                      required_comment_types)) {
                /* Yes - make that the default file type. */
                default_file_type = file_type;
        } else {
                /* OK, find the first file type we *can* save it as. */
                default_file_type = -1;
                for (ft = 0; ft < WTAP_NUM_FILE_TYPES; ft++) {
-                       if (wtap_dump_can_write_encaps(ft, file_encaps) &&
-                           wtap_dump_supports_comment_types(ft, required_comment_types)) {
+                       if (wtap_dump_can_write_format(ft, file_encaps,
+                                                      required_comment_types)) {
                                /* OK, got it. */
                                default_file_type = ft;
                        }
@@ -962,12 +998,12 @@ wtap_get_savable_file_types(int file_type, const GArray *file_encaps,
           pcap-NG, put pcap right after it if we can also write it in
           pcap format. */
        if (default_file_type == WTAP_FILE_PCAP) {
-               if (wtap_dump_can_write_encaps(WTAP_FILE_PCAPNG, file_encaps) &&
-                   wtap_dump_supports_comment_types(WTAP_FILE_PCAPNG, required_comment_types))
+               if (wtap_dump_can_write_format(WTAP_FILE_PCAPNG, file_encaps,
+                                              required_comment_types))
                        other_file_type = WTAP_FILE_PCAPNG;
        } else if (default_file_type == WTAP_FILE_PCAPNG) {
-               if (wtap_dump_can_write_encaps(WTAP_FILE_PCAP, file_encaps) &&
-                   wtap_dump_supports_comment_types(WTAP_FILE_PCAP, required_comment_types))
+               if (wtap_dump_can_write_format(WTAP_FILE_PCAP, file_encaps,
+                                              required_comment_types))
                        other_file_type = WTAP_FILE_PCAP;
        }
        if (other_file_type != -1)
@@ -979,8 +1015,8 @@ wtap_get_savable_file_types(int file_type, const GArray *file_encaps,
                        continue;       /* not a real file type */
                if (ft == default_file_type || ft == other_file_type)
                        continue;       /* we've already done this one */
-               if (wtap_dump_can_write_encaps(ft, file_encaps) &&
-                   wtap_dump_supports_comment_types(ft, required_comment_types)) {
+               if (wtap_dump_can_write_format(ft, file_encaps,
+                                              required_comment_types)) {
                        /* OK, we can write it out in this type. */
                        g_array_append_val(savable_file_types, ft);
                }
index 16bc87433e2fb7a1af98a296753d3625e0b9708c..1a1d1b8f973572c477830a8873ae4ee3ac64e6b8 100644 (file)
@@ -1248,13 +1248,6 @@ gboolean wtap_dump_can_write_encap(int filetype, int encap);
 WS_DLL_PUBLIC
 int wtap_dump_file_encap_type(const GArray *file_encaps);
 
-/**
- * Return TRUE if a capture with a given GArray of WTAP_ENCAP_ types
- * can be written in a specified format, and FALSE if it can't.
- */
-WS_DLL_PUBLIC
-gboolean wtap_dump_can_write_encaps(int ft, const GArray *file_encaps);
-
 /**
  * Return TRUE if we can write this capture file format out in
  * compressed form, FALSE if not.
@@ -1307,6 +1300,13 @@ gboolean wtap_dump_set_addrinfo_list(wtap_dumper *wdh, struct addrinfo *addrinfo
 WS_DLL_PUBLIC
 gboolean wtap_dump_close(wtap_dumper *, int *);
 
+/**
+ * Return TRUE if we can write a file out with the given GArray of file
+ * encapsulations and the given bitmask of comment types.
+ */
+WS_DLL_PUBLIC
+gboolean wtap_dump_can_write(const GArray *file_encaps, guint32 required_comment_types);
+
 /**
  * Get a GArray of WTAP_FILE_ values for file types that can be used
  * to save a file of a given type with a given GArray of WTAP_ENCAP_