radiotap: Updates to the radiotap dissector to avoid confusion.
[metze/wireshark/wip.git] / epan / expert.c
index 9dd53863fb688f469588dfd28a8bd5e620e18f00..ae9fb2cdb4b2995bd32c9617e3763600d63de00a 100644 (file)
@@ -27,6 +27,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <wsutil/ws_printf.h>
+
 #include "packet.h"
 #include "expert.h"
 #include "uat.h"
@@ -68,6 +70,9 @@ static gpa_expertinfo_t gpa_expertinfo;
 /* Hash table of abbreviations and IDs */
 static GHashTable *gpa_name_map = NULL;
 
+/* Deregistered expert infos */
+static GPtrArray *deregistered_expertinfos = NULL;
+
 const value_string expert_group_vals[] = {
        { PI_CHECKSUM,          "Checksum" },
        { PI_SEQUENCE,          "Sequence" },
@@ -81,12 +86,14 @@ const value_string expert_group_vals[] = {
        { PI_SECURITY,          "Security" },
        { PI_COMMENTS_GROUP,    "Comment" },
        { PI_DECRYPTION,        "Decryption" },
+       { PI_ASSUMPTION,        "Assumption" },
+       { PI_DEPRECATED,        "Deprecated" },
        { 0, NULL }
 };
 
 const value_string expert_severity_vals[] = {
        { PI_ERROR,             "Error" },
-       { PI_WARN,              "Warn" },
+       { PI_WARN,              "Warning" },
        { PI_NOTE,              "Note" },
        { PI_CHAT,              "Chat" },
        { PI_COMMENT,           "Comment" },
@@ -138,11 +145,7 @@ static void *uat_expert_copy_cb(void *n, const void *o, size_t siz _U_)
        expert_level_entry_t       *new_record = (expert_level_entry_t*)n;
        const expert_level_entry_t *old_record = (const expert_level_entry_t *)o;
 
-       if (old_record->field) {
-               new_record->field = g_strdup(old_record->field);
-       } else {
-               new_record->field = NULL;
-       }
+       new_record->field = g_strdup(old_record->field);
 
        new_record->severity = old_record->severity;
 
@@ -153,8 +156,7 @@ static void uat_expert_free_cb(void*r)
 {
        expert_level_entry_t *rec = (expert_level_entry_t *)r;
 
-       if (rec->field)
-               g_free(rec->field);
+       g_free(rec->field);
 }
 
 static void uat_expert_post_update_cb(void)
@@ -187,6 +189,7 @@ static void uat_expert_post_update_cb(void)
        if((guint)eiindex >= gpa_expertinfo.len && getenv("WIRESHARK_ABORT_ON_DISSECTOR_BUG"))   \
                g_error("Unregistered expert info! index=%d", eiindex);                          \
        DISSECTOR_ASSERT_HINT((guint)eiindex < gpa_expertinfo.len, "Unregistered expert info!"); \
+       DISSECTOR_ASSERT_HINT(gpa_expertinfo.ei[eiindex] != NULL, "Unregistered expert info!"); \
        expinfo = gpa_expertinfo.ei[eiindex];
 
 void
@@ -200,10 +203,10 @@ expert_packet_init(void)
                        { "Message", "_ws.expert.message", FT_STRING, BASE_NONE, NULL, 0, "Wireshark expert information", HFILL }
                },
                { &hf_expert_group,
-                       { "Group", "_ws.expert.group", FT_UINT32, BASE_HEX, VALS(expert_group_vals), 0, "Wireshark expert group", HFILL }
+                       { "Group", "_ws.expert.group", FT_UINT32, BASE_NONE, VALS(expert_group_vals), 0, "Wireshark expert group", HFILL }
                },
                { &hf_expert_severity,
-                       { "Severity level", "_ws.expert.severity", FT_UINT32, BASE_HEX, VALS(expert_severity_vals), 0, "Wireshark expert severity level", HFILL }
+                       { "Severity level", "_ws.expert.severity", FT_UINT32, BASE_NONE, VALS(expert_severity_vals), 0, "Wireshark expert severity level", HFILL }
                }
        };
        static gint *ett[] = {
@@ -242,6 +245,7 @@ expert_packet_init(void)
                        uat_expert_update_cb,
                        uat_expert_free_cb,
                        uat_expert_post_update_cb,
+                       NULL,
                        custom_expert_fields);
 
                prefs_register_uat_preference(module_expert,
@@ -265,6 +269,7 @@ expert_init(void)
        gpa_expertinfo.ei            = NULL;
        gpa_name_map                 = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
        uat_saved_fields             = g_array_new(FALSE, FALSE, sizeof(expert_field_info*));
+       deregistered_expertinfos     = g_ptr_array_new();
 }
 
 void
@@ -293,6 +298,11 @@ expert_cleanup(void)
                g_array_free(uat_saved_fields, TRUE);
                uat_saved_fields = NULL;
        }
+
+       if (deregistered_expertinfos) {
+               g_ptr_array_free(deregistered_expertinfos, FALSE);
+               deregistered_expertinfos = NULL;
+       }
 }
 
 
@@ -323,9 +333,35 @@ expert_module_t *expert_register_protocol(int id)
        return module;
 }
 
-void expert_deregister_protocol (expert_module_t *module)
+void
+expert_deregister_expertinfo (const char *abbrev)
+{
+       expert_field_info *expinfo = (expert_field_info*)g_hash_table_lookup(gpa_name_map, abbrev);
+       if (expinfo) {
+               g_ptr_array_add(deregistered_expertinfos, gpa_expertinfo.ei[expinfo->id]);
+               g_hash_table_steal(gpa_name_map, abbrev);
+       }
+}
+
+void
+expert_deregister_protocol (expert_module_t *module)
+{
+       wmem_free(wmem_epan_scope(), module);
+}
+
+static void
+free_deregistered_expertinfo (gpointer data, gpointer user_data _U_)
+{
+       expert_field_info *expinfo = (expert_field_info *) data;
+       gpa_expertinfo.ei[expinfo->id] = NULL; /* Invalidate this id */
+}
+
+void
+expert_free_deregistered_expertinfos (void)
 {
-    wmem_free(wmem_epan_scope(), module);
+       g_ptr_array_foreach(deregistered_expertinfos, free_deregistered_expertinfo, NULL);
+       g_ptr_array_free(deregistered_expertinfos, TRUE);
+       deregistered_expertinfos = g_ptr_array_new();
 }
 
 static int
@@ -386,8 +422,8 @@ expert_register_field_array(expert_module_t *module, ei_register_info *exp, cons
 
                /* Register with the header field info, so it's display filterable */
                ptr->eiinfo.hf_info.p_id = &ptr->ids->hf;
+               ptr->eiinfo.hf_info.hfinfo.name = ptr->eiinfo.summary;
                ptr->eiinfo.hf_info.hfinfo.abbrev = ptr->eiinfo.name;
-               ptr->eiinfo.hf_info.hfinfo.blurb = ptr->eiinfo.summary;
 
                proto_register_field_array(module->proto_id, &ptr->eiinfo.hf_info, 1);
        }
@@ -410,6 +446,20 @@ expert_registrar_get_byname(const char *field_name)
        return hfinfo;
 }
 
+/**
+ * Get summary text of an expert_info field.
+ * This is intended for use in expert_add_info_format or proto_tree_add_expert_format
+ * to get the "base" string to then append additional information
+ */
+const gchar* expert_get_summary(expert_field *eiindex)
+{
+       expert_field_info *eiinfo;
+
+       /* Look up the item */
+       EXPERT_REGISTRAR_GET_NTH(eiindex->ei, eiinfo);
+
+    return eiinfo->summary;
+}
 
 /** clear flags according to the mask and set new flag values */
 #define FI_REPLACE_FLAGS(fi, mask, flags_in) { \
@@ -469,7 +519,7 @@ expert_set_info_vformat(packet_info *pinfo, proto_item *pi, int group, int sever
        }
 
        /* if this packet isn't loaded because of a read filter, don't output anything */
-       if (pinfo == NULL || PINFO_FD_NUM(pinfo) == 0) {
+       if (pinfo == NULL || pinfo->num == 0) {
                return;
        }
 
@@ -488,7 +538,7 @@ expert_set_info_vformat(packet_info *pinfo, proto_item *pi, int group, int sever
        }
 
        if (use_vaformat) {
-               g_vsnprintf(formatted, ITEM_LABEL_LENGTH, format, ap);
+               ws_vsnprintf(formatted, ITEM_LABEL_LENGTH, format, ap);
        } else {
                g_strlcpy(formatted, format, ITEM_LABEL_LENGTH);
        }
@@ -522,7 +572,7 @@ expert_set_info_vformat(packet_info *pinfo, proto_item *pi, int group, int sever
 
        ei = wmem_new(wmem_packet_scope(), expert_info_t);
 
-       ei->packet_num  = PINFO_FD_NUM(pinfo);
+       ei->packet_num  = pinfo->num;
        ei->group       = group;
        ei->severity    = severity;
        ei->hf_index    = hf_index;
@@ -589,7 +639,7 @@ proto_tree_add_expert_internal(proto_tree *tree, packet_info *pinfo, expert_fiel
        /* Look up the item */
        EXPERT_REGISTRAR_GET_NTH(expindex->ei, eiinfo);
 
-       ti = proto_tree_add_text(tree, tvb, start, length, "%s", eiinfo->summary);
+       ti = proto_tree_add_text_internal(tree, tvb, start, length, "%s", eiinfo->summary);
        va_start(unused, length);
        expert_set_info_vformat(pinfo, ti, eiinfo->group, eiinfo->severity, *eiinfo->hf_info.p_id, FALSE, eiinfo->summary, unused);
        va_end(unused);
@@ -615,7 +665,7 @@ proto_tree_add_expert_format(proto_tree *tree, packet_info *pinfo, expert_field
        EXPERT_REGISTRAR_GET_NTH(expindex->ei, eiinfo);
 
        va_start(ap, format);
-       ti = proto_tree_add_text_valist(tree, tvb, start, length, format, ap);
+       ti = proto_tree_add_text_valist_internal(tree, tvb, start, length, format, ap);
        va_end(ap);
 
        va_start(ap, format);