From ab19b927c8945e9a4b8d6cde7c898b77bceac6d5 Mon Sep 17 00:00:00 2001 From: Graeme Lunt Date: Wed, 10 May 2006 19:50:54 +0000 Subject: "Field Information" context menu item that will bring up a web page reference to a field type of FT_OID svn path=/trunk/; revision=18125 --- asn1/cms/packet-cms-template.c | 2 +- epan/dissectors/packet-ber.c | 2 +- epan/dissectors/packet-cms.c | 2 +- epan/libethereal.def | 1 + epan/oid_resolv.c | 29 +++++++++++++++++++++++++++++ epan/oid_resolv.h | 5 +++++ gtk/main.c | 23 +++++++++++++++++++++++ gtk/main.h | 11 +++++++++++ gtk/menu.c | 6 ++++++ 9 files changed, 78 insertions(+), 3 deletions(-) diff --git a/asn1/cms/packet-cms-template.c b/asn1/cms/packet-cms-template.c index 8812e79031..62b4b7bf45 100644 --- a/asn1/cms/packet-cms-template.c +++ b/asn1/cms/packet-cms-template.c @@ -138,7 +138,7 @@ void proto_register_cms(void) { static hf_register_info hf[] = { { &hf_cms_ci_contentType, { "contentType", "cms.contentInfo.contentType", - FT_STRING, BASE_NONE, NULL, 0, + FT_OID, BASE_NONE, NULL, 0, "ContentType", HFILL }}, #include "packet-cms-hfarr.c" }; diff --git a/epan/dissectors/packet-ber.c b/epan/dissectors/packet-ber.c index 4ed6577bcc..8f28d1aab8 100644 --- a/epan/dissectors/packet-ber.c +++ b/epan/dissectors/packet-ber.c @@ -2331,7 +2331,7 @@ proto_register_ber(void) "OCTETSTRING", "ber.unknown.OCTETSTRING", FT_BYTES, BASE_HEX, NULL, 0, "This is an unknown OCTETSTRING", HFILL }}, { &hf_ber_unknown_OID, { - "OID", "ber.unknown.OID", FT_STRING, BASE_NONE, + "OID", "ber.unknown.OID", FT_OID, BASE_NONE, NULL, 0, "This is an unknown Object Identifier", HFILL }}, { &hf_ber_unknown_GraphicString, { "GRAPHICSTRING", "ber.unknown.GRAPHICSTRING", FT_STRING, BASE_HEX, diff --git a/epan/dissectors/packet-cms.c b/epan/dissectors/packet-cms.c index 5dfaf33f32..5e73ddaa7a 100644 --- a/epan/dissectors/packet-cms.c +++ b/epan/dissectors/packet-cms.c @@ -1599,7 +1599,7 @@ void proto_register_cms(void) { static hf_register_info hf[] = { { &hf_cms_ci_contentType, { "contentType", "cms.contentInfo.contentType", - FT_STRING, BASE_NONE, NULL, 0, + FT_OID, BASE_NONE, NULL, 0, "ContentType", HFILL }}, /*--- Included file: packet-cms-hfarr.c ---*/ diff --git a/epan/libethereal.def b/epan/libethereal.def index a6a118e4b7..2a7aa5b126 100644 --- a/epan/libethereal.def +++ b/epan/libethereal.def @@ -411,6 +411,7 @@ nt_cmd_vals DATA num_tap_filters DATA num_tree_types DATA offset_from_real_beginning +oid_get_url other_decode_bitfield_value plugin_list DATA postseq_cleanup_all_protocols diff --git a/epan/oid_resolv.c b/epan/oid_resolv.c index 73e530a92c..cda4e31137 100644 --- a/epan/oid_resolv.c +++ b/epan/oid_resolv.c @@ -35,6 +35,9 @@ static GHashTable *oid_table = NULL; +/* this should be configurable - but where ? */ +static const gchar *oid_url_template = "http://www.alvestrand.no/objectid/%s.html"; + void oid_resolv_init(void) { oid_table = g_hash_table_new(g_str_hash, g_str_equal); } @@ -95,3 +98,29 @@ extern void add_oid_name(const guint8 *oid, gint oid_len, const gchar *name) { extern void add_oid_str_name(const gchar *oid_str, const gchar *name) { g_hash_table_insert(oid_table, (gpointer)g_strdup(oid_str), (gpointer)name); } + +gboolean get_oid_url(field_info *finfo, gchar **ret_url) +{ + const char *oid; + + if(finfo && (finfo->hfinfo->type == FT_OID) && + (oid_url_template != NULL) && (*oid_url_template != NULL)) { + if(ret_url) { + /* return the URL */ + oid = oid_to_str(tvb_get_ptr(finfo->ds_tvb, finfo->start, finfo->length), + finfo->length); + + /* the URL will be freed */ + *ret_url = g_strdup_printf(oid_url_template, oid); + return TRUE; + } else { + /* return TRUE if we are configured to return URLs */ + + if((oid_url_template != NULL) && (*oid_url_template != NULL)) + return TRUE; + + } + } + + return FALSE; +} diff --git a/epan/oid_resolv.h b/epan/oid_resolv.h index 7176a65efe..3886755585 100644 --- a/epan/oid_resolv.h +++ b/epan/oid_resolv.h @@ -32,6 +32,8 @@ #ifndef __OID_RESOLV_H__ #define __OID_RESOLV_H__ +#include + /* init and clenup funcions called from epan.h */ extern void oid_resolv_init(void); extern void oid_resolv_cleanup(void); @@ -46,5 +48,8 @@ extern const gchar *get_oid_str_name(const gchar *oid_str); extern void add_oid_name(const guint8 *oid, gint oid_len, const gchar *name); extern void add_oid_str_name(const gchar *oid_str, const gchar *name); +/* get a URL for an OID in the given field */ +/* if ret_url is NULL, just return TRUE if we are configured to provide one */ +extern gboolean get_oid_url(field_info *finfo, gchar **ret_url); #endif /* __OID_RESOLV_H__ */ diff --git a/gtk/main.c b/gtk/main.c index ba6e4f6b15..5dd37998d9 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -89,6 +89,7 @@ #include "cmdarg_err.h" #include "version_info.h" #include "merge.h" +#include #ifdef HAVE_LIBPCAP #include "capture-pcap-util.h" @@ -382,6 +383,28 @@ selected_ptree_ref_cb(GtkWidget *widget _U_, gpointer data _U_) } } +void +selected_ptree_field_url_cb(GtkWidget *widget _U_, gpointer data _U_) +{ + gchar *selected_info_url; + + /* only OIDs for now */ + if(cfile.finfo_selected->hfinfo->type == FT_OID) { + if(get_oid_url(cfile.finfo_selected, &selected_info_url)) { + browser_open_url(selected_info_url); + g_free(selected_info_url); + } + } +} + +gboolean selected_ptree_has_field_url() +{ + /* only OIDs for now */ + if(cfile.finfo_selected->hfinfo->type == FT_OID) + return get_oid_url(cfile.finfo_selected, NULL); + + return FALSE; +} static gchar * get_text_from_packet_list(gpointer data) diff --git a/gtk/main.h b/gtk/main.h index eae8a1dd34..6b279d7e98 100644 --- a/gtk/main.h +++ b/gtk/main.h @@ -105,6 +105,17 @@ extern void selected_ptree_info_cb(GtkWidget *widget, gpointer data); */ extern void selected_ptree_ref_cb(GtkWidget *widget, gpointer data); +/** User requested "Field Information" by ptree context menu. + * + * @param widget parent widget (unused) + * @param data unused + */ +extern void selected_ptree_field_url_cb(GtkWidget *widget, gpointer data); + +/** Determine if "Field Information" should be enabled in ptree context menu. + * + */ +extern gboolean selected_ptree_has_field_url(); /** "Apply as Filter" / "Prepare a Filter" action type. */ typedef enum { diff --git a/gtk/menu.c b/gtk/menu.c index 12af55fd22..20b08ebc6b 100644 --- a/gtk/menu.c +++ b/gtk/menu.c @@ -519,6 +519,8 @@ static GtkItemFactoryEntry tree_view_menu_items[] = 0, ETHEREAL_STOCK_WIKI), ITEM_FACTORY_STOCK_ENTRY("/Filter Field Reference", NULL, selected_ptree_ref_cb, 0, ETHEREAL_STOCK_INTERNET), + ITEM_FACTORY_STOCK_ENTRY("/Field Information", NULL, selected_ptree_field_url_cb, + 0, ETHEREAL_STOCK_INTERNET), ITEM_FACTORY_ENTRY("/Protocol Preferences...", NULL, properties_cb, 0, NULL, NULL), ITEM_FACTORY_ENTRY("/", NULL, NULL, 0, "", NULL), @@ -2135,6 +2137,8 @@ set_menus_for_selected_tree_row(capture_file *cf) TRUE); set_menu_sensitivity(tree_view_menu_factory, "/Filter Field Reference", TRUE); + set_menu_sensitivity(tree_view_menu_factory, "/Field Information", + selected_ptree_has_field_url()); } else { set_menu_sensitivity(main_menu_factory, "/Go/Go to Corresponding Packet", FALSE); @@ -2152,6 +2156,8 @@ set_menus_for_selected_tree_row(capture_file *cf) FALSE); set_menu_sensitivity(tree_view_menu_factory, "/Filter Field Reference", FALSE); + set_menu_sensitivity(tree_view_menu_factory, "/Field Information", + FALSE); } walk_menu_tree_for_selected_tree_row(tap_menu_tree_root, cf->finfo_selected); -- cgit v1.2.3