diff options
author | Gerald Combs <gerald@wireshark.org> | 2012-04-05 22:10:53 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2012-04-05 22:10:53 +0000 |
commit | 81334e311aa9d417cbdccda7e48978befc85eae6 (patch) | |
tree | 2cf360be85cb03cae2d40196dd41b36966bda639 | |
parent | ae62dc3bdbdda96a73ed5a289c8b579d6024b307 (diff) | |
download | wireshark-81334e311aa9d417cbdccda7e48978befc85eae6.tar.gz |
Instead of loading our coordinates from a separate text file via
OpenLayers.Layer.Text, insert them into a JSON array and load them using
OpenLayers.Layer.Vector + OpenLayers.Format.GeoJSON. This should fix the
endpoint map feature on modern browsers.
Switch OpenStreetMap to a simpler map from OSGeo.
svn path=/trunk/; revision=41967
-rw-r--r-- | ipmap.html | 101 | ||||
-rw-r--r-- | ui/gtk/hostlist_table.c | 108 |
2 files changed, 151 insertions, 58 deletions
diff --git a/ipmap.html b/ipmap.html index e3e6eb7b76..0ea1864236 100644 --- a/ipmap.html +++ b/ipmap.html @@ -2,45 +2,104 @@ <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Wireshark: IP Location Map</title> + <style type="text/css"> + body { + font-family: Arial, Helvetica, sans-serif; font-size: 13px; + line-height: 17px; + } + </style> <script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"></script> <script type="text/javascript" src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script> <script type="text/javascript"> <!-- - var map; + var map, layer; + var selectControl, selectedFeature; + + function onPopupClose(event) { + selectControl.unselect(this.feature); + } + + function EndpointSelected(event) { + var feature = event.feature; + popup = new OpenLayers.Popup.FramedCloud("endpoint", + feature.geometry.getBounds().getCenterLonLat(), + new OpenLayers.Size(25,25), + "<h3>"+ feature.attributes.title + "</h3>" + + feature.attributes.description, + null, true, onPopupClose); + feature.popup = popup; + popup.feature = feature; + map.addPopup(popup); + } + + function EndpointUnselected(event) { + var feature = event.feature; + if (feature.popup) { + popup.feature = null; + map.removePopup(feature.popup); + feature.popup.destroy(); + feature.popup = null; + } + } function init() { - var map = new OpenLayers.Map("map", { + var endpoints = { + "type": "FeatureCollection", + "features": [ // Start endpoint list - MUST match hostlist_table.c + ] + }; + map = new OpenLayers.Map('map', { controls: [ new OpenLayers.Control.PanZoomBar(), + new OpenLayers.Control.ZoomBox(), new OpenLayers.Control.ScaleLine(), new OpenLayers.Control.MousePosition(), new OpenLayers.Control.MouseDefaults(), - new OpenLayers.Control.Attribution()], - projection: new OpenLayers.Projection("EPSG:900913"), - displayProjection: new OpenLayers.Projection("EPSG:4326"), - maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34, 20037508.34, 20037508.34), - numZoomLevels: 18, - maxResolution: 156543, - units: "m"} - ); - - map.addLayer(new OpenLayers.Layer.OSM.Mapnik("Mapnik")); - map_file = "ipmap.txt"; - if (document.location.hash.length > 1) { - map_file = document.location.hash.substr(1); + new OpenLayers.Control.Attribution() + ], + //projection: new OpenLayers.Projection("EPSG:900913"), + //displayProjection: new OpenLayers.Projection("EPSG:4326"), + //maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34, 20037508.34, 20037508.34), + //numZoomLevels: 18, + //maxResolution: 156543, + //units: "m" + }); + layer = new OpenLayers.Layer.WMS("OpenLayers WMS", + "http://vmap0.tiles.osgeo.org/wms/vmap0", + {layers: 'basic'} ); + map.addLayer(layer); + //map.addLayer(new OpenLayers.Layer.OSM.Mapnik("Mapnik")); + //map.addLayer(new OpenLayers.Layer.Text("IP Locations", { + // location: map_file, projection: new OpenLayers.Projection("EPSG:4326")} ) ); + // + //map.setCenter(new OpenLayers.LonLat(lon, lat), zoom); + + var geojson_format = new OpenLayers.Format.GeoJSON(); + var vector_layer = new OpenLayers.Layer.Vector("IP Endpoints"); + map.addLayer(vector_layer); + vector_layer.addFeatures(geojson_format.read(endpoints)); + + if (endpoints.features.length < 1) { + document.getElementById("statusmsg").innerHTML = "No endpoints to map"; + } else { + map.zoomToExtent(vector_layer.getDataExtent()); } - map.addLayer(new OpenLayers.Layer.Text("IP Locations", { - location: map_file, projection: new OpenLayers.Projection("EPSG:4326")} ) ); - var lonlat = (new OpenLayers.LonLat(0.0, 0.0)); - lonlat.transform(map.displayProjection, map.projection); - map.setCenter(lonlat, 2); + selectControl = new OpenLayers.Control.SelectFeature(vector_layer); + map.addControl(selectControl); + selectControl.activate(); + + vector_layer.events.on({ + 'featureselected': EndpointSelected, + 'featureunselected': EndpointUnselected + }); } // --> </script> </head> <body onload="init()"> - <div id="map"></div> + <div id="statusmsg" style="float: right; z-index: 9999;"></div> + <div id="map" style="z-index: 0;"></div> </body> </html> diff --git a/ui/gtk/hostlist_table.c b/ui/gtk/hostlist_table.c index ae691e9438..28ca7f1612 100644 --- a/ui/gtk/hostlist_table.c +++ b/ui/gtk/hostlist_table.c @@ -930,7 +930,7 @@ map_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { map_t *map = (map_t *)data; - gchar *table_entry; + gchar *table_entry, *esc_entry; guint64 value; /* Add the column values to the TSV data */ @@ -947,46 +947,66 @@ map_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, return FALSE; } - /* Latitude */ - gtk_tree_model_get(model, iter, map->col_lat, &table_entry, -1); - fputs(table_entry, map->out_file); - g_free(table_entry); - fputs("\t", map->out_file); +/* +{ + 'type': 'Feature', 'geometry': { 'type': 'Point', 'coordinates': [-122.583889, 37.898889] }, + 'properties': { 'title': 'host.example.com', 'description': 'AS: AS12345 Ewok Holdings, Inc.<br/>Country: US<br/>City: Muir Woods, CA<br/>Packets: 6<br/>Bytes: 980' } +}, + */ + + fputs("{\n", map->out_file); + fputs(" 'type': 'Feature', 'geometry': { 'type': 'Point', 'coordinates': [", map->out_file); /* Longitude */ gtk_tree_model_get(model, iter, map->col_lon, &table_entry, -1); fputs(table_entry, map->out_file); g_free(table_entry); - fputs("\t", map->out_file); + fputs(", ", map->out_file); + + /* Latitude */ + gtk_tree_model_get(model, iter, map->col_lat, &table_entry, -1); + fputs(table_entry, map->out_file); + g_free(table_entry); + fputs("] },\n", map->out_file); + + fputs(" 'properties': { 'title': '", map->out_file); /* Title */ gtk_tree_model_get(model, iter, map->col_ip, &table_entry, -1); - fputs(table_entry, map->out_file); + esc_entry = string_replace(table_entry, "'", "'"); + fputs(esc_entry, map->out_file); g_free(table_entry); - fputs("\t", map->out_file); + g_free(esc_entry); + fputs("', 'description': '", map->out_file); /* Description */ if (map->col_as_num >= 0) { gtk_tree_model_get(model, iter, map->col_as_num, &table_entry, -1); fputs("AS: ", map->out_file); - fputs(table_entry, map->out_file); + esc_entry = string_replace(table_entry, "'", "'"); + fputs(esc_entry, map->out_file); g_free(table_entry); + g_free(esc_entry); fputs("<br/>", map->out_file); } if (map->col_country >= 0) { gtk_tree_model_get(model, iter, map->col_country, &table_entry, -1); fputs("Country: ", map->out_file); - fputs(table_entry, map->out_file); + esc_entry = string_replace(table_entry, "'", "'"); + fputs(esc_entry, map->out_file); g_free(table_entry); + g_free(esc_entry); fputs("<br/>", map->out_file); } if (map->col_country >= 0) { gtk_tree_model_get(model, iter, map->col_city, &table_entry, -1); fputs("City: ", map->out_file); - fputs(table_entry, map->out_file); + esc_entry = string_replace(table_entry, "'", "'"); + fputs(esc_entry, map->out_file); g_free(table_entry); + g_free(esc_entry); fputs("<br/>", map->out_file); } @@ -994,29 +1014,32 @@ map_handle(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, fprintf(map->out_file, "Packets: %" G_GINT64_MODIFIER "u<br/>", value); gtk_tree_model_get(model, iter, map->col_bytes, &value, -1); - fprintf(map->out_file, "Bytes: %" G_GINT64_MODIFIER "u\t", value); + fprintf(map->out_file, "Bytes: %" G_GINT64_MODIFIER "u", value); /* XXX - we could add specific icons, e.g. depending on the amount of packets or bytes */ - fputs("\n", map->out_file); /* new row */ + fputs("' }\n", map->out_file); + fputs("},\n", map->out_file); /* XXX - Trim the comma from the last item */ map->hosts_written = TRUE; return FALSE; } +#define MAX_TPL_LINE_LEN 4096 static void open_as_map_cb(GtkWindow *copy_bt, gpointer data _U_) { - guint32 i; + guint32 i; gchar *file_uri; gboolean uri_open; - char *map_path, *map_data_filename; - char *src_file_path; - char *dst_file_path; + char *map_path, *map_filename; + char *tpl_filename; + char *tpl_line; GList *columns, *list; GtkTreeViewColumn *column; GtkListStore *store; map_t map; + FILE *tpl_file; map.talkers =g_object_get_data(G_OBJECT(copy_bt), HOST_PTR_KEY); if (!map.talkers) @@ -1072,47 +1095,58 @@ open_as_map_cb(GtkWindow *copy_bt, gpointer data _U_) return; } - /* open the TSV output file */ + /* Create a location map HTML file from a template */ /* XXX - add error handling */ + tpl_filename = get_datafile_path("ipmap.html"); + tpl_file = ws_fopen(tpl_filename, "r"); + if(tpl_file == NULL) { + open_failure_alert_box(tpl_filename, errno, FALSE); + g_free(tpl_filename); + return; + } + g_free(tpl_filename); + + /* We should probably create a file with a temporary name and a .html extension instead */ if (! create_tempdir(&map_path, "Wireshark IP Map ")) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not create temporary directory\n%s", map_path); return; } - map_data_filename = g_strdup_printf("%s%cipmap.txt", map_path, G_DIR_SEPARATOR); - map.out_file = ws_fopen(map_data_filename, "w"); + + map_filename = g_strdup_printf("%s%cipmap.html", map_path, G_DIR_SEPARATOR); + map.out_file = ws_fopen(map_filename, "w"); if(map.out_file == NULL) { - open_failure_alert_box(map_data_filename, errno, TRUE); + open_failure_alert_box(map_filename, errno, TRUE); + g_free(map_filename); + fclose(tpl_file); return; } - fputs("lat\tlon\ttitle\tdescription\t\n", map.out_file); store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(map.talkers->table))); - gtk_tree_model_foreach(GTK_TREE_MODEL(store), map_handle, &map); + tpl_line = g_malloc(MAX_TPL_LINE_LEN); + while (fgets(tpl_line, MAX_TPL_LINE_LEN, tpl_file) != NULL) { + fputs(tpl_line, map.out_file); + /* MUST match ipmap.html */ + if (strstr(tpl_line, "// Start endpoint list")) { + gtk_tree_model_foreach(GTK_TREE_MODEL(store), map_handle, &map); + } + } + g_free(tpl_line); + fclose(tpl_file); fclose(map.out_file); if(!map.hosts_written) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "No latitude/longitude data found"); + g_free(map_filename); return; } - /* copy ipmap.html to temp dir */ - src_file_path = get_datafile_path("ipmap.html"); - dst_file_path = g_strdup_printf("%s%cipmap.html", map_path, G_DIR_SEPARATOR); - - if (!copy_file_binary_mode(src_file_path, dst_file_path)) { - g_free(src_file_path); - g_free(dst_file_path); - return; - } - g_free(src_file_path); - /* open the webbrowser */ - file_uri = filename2uri(dst_file_path); - g_free(dst_file_path); + file_uri = filename2uri(map_filename); + g_free(map_filename); uri_open = browser_open_url (file_uri); if(!uri_open) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Couldn't open the file: \"%s\" in your web browser", file_uri); |