summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan F <ajf@eth0.org.uk>2014-02-02 14:57:06 +0000
committerGravatar Alan F <ajf@eth0.org.uk>2014-02-02 14:57:06 +0000
commitb598a43dfe3123c3cec1022e59558b09ffe4dac5 (patch)
tree233cc5aa371c1f1e35a1618120dfd0d0c2076db1 /src
parente7a058f0e239fa112676c8e3d5fb73279f2dee13 (diff)
load country and city when the column is enabled, so no need to reopen the window.
Diffstat (limited to 'src')
-rw-r--r--src/trg-peers-model.c63
-rw-r--r--src/trg-peers-model.h2
-rw-r--r--src/trg-peers-tree-view.c5
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);
}
}