From b598a43dfe3123c3cec1022e59558b09ffe4dac5 Mon Sep 17 00:00:00 2001 From: Alan F Date: Sun, 2 Feb 2014 14:57:06 +0000 Subject: load country and city when the column is enabled, so no need to reopen the window. --- src/trg-peers-model.c | 63 ++++++++++++++++++++++++++++++++++++++++------- src/trg-peers-model.h | 2 ++ src/trg-peers-tree-view.c | 5 ++-- 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/trg-peers-model.c b/src/trg-peers-model.c index f7c792d..d64c74d 100644 --- a/src/trg-peers-model.c +++ b/src/trg-peers-model.c @@ -145,6 +145,18 @@ static void resolved_dns_cb(GObject * source_object, GAsyncResult * res, } } +/* for handling v4 or v6 addresses. string is owned by GeoIP, should not be freed. */ +static const gchar* lookup_country(TrgPeersModel *model, const gchar *address) { + TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(model); + + if (strchr(address, ':') && priv->geoipv6) + return GeoIP_country_name_by_addr_v6(priv->geoipv6, address); + else if (priv->geoip) + return GeoIP_country_name_by_addr(priv->geoip, address); + else + return NULL; +} + void trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, gint64 updateSerial, JsonObject * t, gint mode) @@ -185,15 +197,8 @@ trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, address = peer_get_address(peer); #ifdef HAVE_GEOIP if (address) { /* just in case address wasn't set */ - if (doGeoLookup) { - if (strchr(address, ':') && priv->geoipv6) - country = - GeoIP_country_name_by_addr_v6(priv->geoipv6, - address); - else if (priv->geoip) - country = - GeoIP_country_name_by_addr(priv->geoip, address); - } + if (doGeoLookup) + country = lookup_country(model, address); if (doGeoCityLookup) city = GeoIP_record_by_addr(priv->geoipcity, address); } @@ -310,6 +315,46 @@ static void trg_peers_model_init(TrgPeersModel * self) #endif } +static gboolean trg_peers_model_add_city_foreach(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) { + TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(model); + gchar *address = NULL; + GeoIPRecord *record = NULL; + + gtk_tree_model_get(GTK_TREE_MODEL(model), iter, PEERSCOL_IP, &address, -1); + record = GeoIP_record_by_addr(priv->geoipcity, address); + + if (record) { + gtk_list_store_set(GTK_LIST_STORE(model), iter, PEERSCOL_CITY, record->city, -1); + GeoIPRecord_delete(record); + } + + g_free(address); + + return FALSE; +} + +void trg_peers_model_add_city_column(TrgPeersModel *model) { + gtk_tree_model_foreach(GTK_TREE_MODEL(model), trg_peers_model_add_city_foreach, NULL); +} + +static gboolean trg_peers_model_add_country_foreach(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) { + gchar *address = NULL; + gtk_tree_model_get(GTK_TREE_MODEL(model), iter, PEERSCOL_IP, &address, -1); + gtk_list_store_set(GTK_LIST_STORE(model), iter, PEERSCOL_COUNTRY, lookup_country(TRG_PEERS_MODEL(model), address), -1); + g_free(address); + return FALSE; +} + +void trg_peers_model_add_country_column(TrgPeersModel *model) { + gtk_tree_model_foreach(GTK_TREE_MODEL(model), trg_peers_model_add_country_foreach, NULL); +} + TrgPeersModel *trg_peers_model_new() { return g_object_new(TRG_TYPE_PEERS_MODEL, NULL); diff --git a/src/trg-peers-model.h b/src/trg-peers-model.h index edfd8fe..e080cc1 100644 --- a/src/trg-peers-model.h +++ b/src/trg-peers-model.h @@ -84,6 +84,8 @@ enum { void trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, gint64 updateSerial, JsonObject * t, gboolean first); +void trg_peers_model_add_city_column(TrgPeersModel *model); +void trg_peers_model_add_country_column(TrgPeersModel *model); #endif /* TRG_PEERS_MODEL_H_ */ diff --git a/src/trg-peers-tree-view.c b/src/trg-peers-tree-view.c index 2bbb301..7ed5645 100644 --- a/src/trg-peers-tree-view.c +++ b/src/trg-peers-tree-view.c @@ -75,10 +75,11 @@ static void trg_peers_tree_view_init(TrgPeersTreeView * self) } static void trg_peers_tree_view_column_added(TrgTreeView *tv, const gchar *id) { + TrgPeersModel *model = TRG_PEERS_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(tv))); if (!g_strcmp0(id, "city")) { - + trg_peers_model_add_city_column(model); } else if (!g_strcmp0(id, "country")) { - + trg_peers_model_add_country_column(model); } } -- cgit v1.2.3