summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2012-04-05 22:10:53 +0000
committerGerald Combs <gerald@wireshark.org>2012-04-05 22:10:53 +0000
commit81334e311aa9d417cbdccda7e48978befc85eae6 (patch)
tree2cf360be85cb03cae2d40196dd41b36966bda639
parentae62dc3bdbdda96a73ed5a289c8b579d6024b307 (diff)
downloadwireshark-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.html101
-rw-r--r--ui/gtk/hostlist_table.c108
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, "'", "&#39;");
+ 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, "'", "&#39;");
+ 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, "'", "&#39;");
+ 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, "'", "&#39;");
+ 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);