diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-09-20 20:20:29 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-09-20 20:20:29 +0000 |
commit | 134e52f88ae48ba186ac813d6763aed22d8da4b6 (patch) | |
tree | 23a9df9e9384e43cf3e0a28f179fdbbdd11a8ebc | |
parent | 8cfc6187fdcfbc32e37aec8326451af2ae7eb893 (diff) |
issue 120
-rw-r--r-- | src/trg-main-window.c | 2 | ||||
-rw-r--r-- | src/trg-peers-model.c | 108 | ||||
-rw-r--r-- | src/trg-peers-model.h | 4 | ||||
-rw-r--r-- | src/trg-tree-view.c | 19 | ||||
-rw-r--r-- | src/trg-tree-view.h | 1 |
5 files changed, 69 insertions, 65 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 58d3725..db68ea3 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -242,7 +242,7 @@ static void update_selected_torrent_notebook(TrgMainWindow * win, gint mode, trg_client_get_serial(client), t, mode); trg_files_model_update(priv->filesModel, trg_client_get_serial(client), t, mode); - trg_peers_model_update(priv->peersModel, trg_client_get_serial(client), + trg_peers_model_update(priv->peersModel, TRG_TREE_VIEW(priv->peersTreeView), trg_client_get_serial(client), t, mode); } else if (id < 0) { trg_main_window_torrent_scrub(win); diff --git a/src/trg-peers-model.c b/src/trg-peers-model.c index c9a64e1..2b75ecb 100644 --- a/src/trg-peers-model.c +++ b/src/trg-peers-model.c @@ -30,6 +30,7 @@ #include <GeoIP.h> #endif +#include "trg-tree-view.h" #include "torrent.h" #include "trg-client.h" #include "tpeer.h" @@ -48,19 +49,14 @@ struct _TrgPeersModelPrivate { }; #endif -static void -trg_peers_model_class_init(TrgPeersModelClass * klass G_GNUC_UNUSED) -{ +static void trg_peers_model_class_init(TrgPeersModelClass * klass G_GNUC_UNUSED) { #ifdef HAVE_GEOIP g_type_class_add_private(klass, sizeof(TrgPeersModelPrivate)); #endif } -gboolean -find_existing_peer_item_foreachfunc(GtkTreeModel * model, - GtkTreePath * path G_GNUC_UNUSED, - GtkTreeIter * iter, gpointer data) -{ +gboolean find_existing_peer_item_foreachfunc(GtkTreeModel * model, + GtkTreePath * path G_GNUC_UNUSED, GtkTreeIter * iter, gpointer data) { struct peerAndIter *pi = (struct peerAndIter *) data; gchar *ip; @@ -73,16 +69,14 @@ find_existing_peer_item_foreachfunc(GtkTreeModel * model, return pi->found; } -gboolean -find_existing_peer_item(TrgPeersModel * model, JsonObject * p, - GtkTreeIter * iter) -{ +gboolean find_existing_peer_item(TrgPeersModel * model, JsonObject * p, + GtkTreeIter * iter) { struct peerAndIter pi; pi.ip = peer_get_address(p); pi.found = FALSE; gtk_tree_model_foreach(GTK_TREE_MODEL(model), - find_existing_peer_item_foreachfunc, &pi); + find_existing_peer_item_foreachfunc, &pi); if (pi.found == TRUE) *iter = pi.iter; @@ -90,9 +84,8 @@ find_existing_peer_item(TrgPeersModel * model, JsonObject * p, return pi.found; } -static void resolved_dns_cb(GObject * source_object, - GAsyncResult * res, gpointer data) -{ +static void resolved_dns_cb(GObject * source_object, GAsyncResult * res, + gpointer data) { GtkTreeRowReference *treeRef; GtkTreeModel *model; GtkTreePath *path; @@ -102,15 +95,14 @@ static void resolved_dns_cb(GObject * source_object, path = gtk_tree_row_reference_get_path(treeRef); if (path != NULL) { - gchar *rdns = - g_resolver_lookup_by_address_finish(G_RESOLVER(source_object), - res, NULL); + gchar *rdns = g_resolver_lookup_by_address_finish( + G_RESOLVER(source_object), res, NULL); if (rdns != NULL) { GtkTreeIter iter; if (gtk_tree_model_get_iter(model, &iter, path) == TRUE) { gdk_threads_enter(); - gtk_list_store_set(GTK_LIST_STORE(model), - &iter, PEERSCOL_HOST, rdns, -1); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, PEERSCOL_HOST, + rdns, -1); gdk_threads_leave(); } g_free(rdns); @@ -121,13 +113,14 @@ static void resolved_dns_cb(GObject * source_object, gtk_tree_row_reference_free(treeRef); } -void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial, - JsonObject * t, gint mode) -{ +void trg_peers_model_update(TrgPeersModel * model, TrgTreeView *tv, + gint64 updateSerial, JsonObject * t, gint mode) { #ifdef HAVE_GEOIP TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(model); + gboolean doGeoLookup = trg_tree_view_is_column_showing(tv, PEERSCOL_COUNTRY); #endif + gboolean doHostLookup = trg_tree_view_is_column_showing(tv, PEERSCOL_HOST); JsonArray *peers; GtkTreeIter peerIter; GList *li, *peersList; @@ -146,23 +139,21 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial, const gchar *country = NULL; #endif - if (mode == TORRENT_GET_MODE_FIRST - || find_existing_peer_item(model, peer, &peerIter) == FALSE) { + if (mode == TORRENT_GET_MODE_FIRST || find_existing_peer_item(model, + peer, &peerIter) == FALSE) { gtk_list_store_append(GTK_LIST_STORE(model), &peerIter); address = peer_get_address(peer); #ifdef HAVE_GEOIP - if (priv->geoip) + if (priv->geoip && doGeoLookup) country = GeoIP_country_name_by_addr(priv->geoip, address); #endif - gtk_list_store_set(GTK_LIST_STORE(model), &peerIter, - PEERSCOL_ICON, GTK_STOCK_NETWORK, - PEERSCOL_IP, address, + gtk_list_store_set(GTK_LIST_STORE(model), &peerIter, PEERSCOL_ICON, + GTK_STOCK_NETWORK, PEERSCOL_IP, address, #ifdef HAVE_GEOIP - PEERSCOL_COUNTRY, country ? country : "", + PEERSCOL_COUNTRY, country ? country : "", #endif - PEERSCOL_CLIENT, peer_get_client_name(peer), - -1); + PEERSCOL_CLIENT, peer_get_client_name(peer), -1); isNew = TRUE; } else { @@ -170,21 +161,17 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial, } flagStr = peer_get_flagstr(peer); - gtk_list_store_set(GTK_LIST_STORE(model), &peerIter, - PEERSCOL_FLAGS, flagStr, - PEERSCOL_PROGRESS, - peer_get_progress(peer), - PEERSCOL_DOWNSPEED, - peer_get_rate_to_client(peer), - PEERSCOL_UPSPEED, - peer_get_rate_to_peer(peer), - PEERSCOL_UPDATESERIAL, updateSerial, -1); - - if (isNew == TRUE) { - GtkTreePath *path = - gtk_tree_model_get_path(GTK_TREE_MODEL(model), &peerIter); - GtkTreeRowReference *treeRef = - gtk_tree_row_reference_new(GTK_TREE_MODEL(model), path); + gtk_list_store_set(GTK_LIST_STORE(model), &peerIter, PEERSCOL_FLAGS, + flagStr, PEERSCOL_PROGRESS, peer_get_progress(peer), + PEERSCOL_DOWNSPEED, peer_get_rate_to_client(peer), + PEERSCOL_UPSPEED, peer_get_rate_to_peer(peer), + PEERSCOL_UPDATESERIAL, updateSerial, -1); + + if (doHostLookup && isNew == TRUE) { + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), + &peerIter); + GtkTreeRowReference *treeRef = gtk_tree_row_reference_new( + GTK_TREE_MODEL(model), path); GInetAddress *inetAddr; GResolver *resolver; @@ -192,9 +179,8 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial, inetAddr = g_inet_address_new_from_string(address); resolver = g_resolver_get_default(); - g_resolver_lookup_by_address_async(resolver, - inetAddr, NULL, - resolved_dns_cb, treeRef); + g_resolver_lookup_by_address_async(resolver, inetAddr, NULL, + resolved_dns_cb, treeRef); g_object_unref(resolver); g_object_unref(inetAddr); } @@ -203,12 +189,11 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial, g_list_free(peersList); if (mode != TORRENT_GET_MODE_FIRST) - trg_model_remove_removed(GTK_LIST_STORE(model), - PEERSCOL_UPDATESERIAL, updateSerial); + trg_model_remove_removed(GTK_LIST_STORE(model), PEERSCOL_UPDATESERIAL, + updateSerial); } -static void trg_peers_model_init(TrgPeersModel * self) -{ +static void trg_peers_model_init(TrgPeersModel * self) { #ifdef HAVE_GEOIP TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(self); #endif @@ -228,19 +213,16 @@ static void trg_peers_model_init(TrgPeersModel * self) column_types[PEERSCOL_CLIENT] = G_TYPE_STRING; column_types[PEERSCOL_UPDATESERIAL] = G_TYPE_INT64; - gtk_list_store_set_column_types(GTK_LIST_STORE(self), - PEERSCOL_COLUMNS, column_types); + gtk_list_store_set_column_types(GTK_LIST_STORE(self), PEERSCOL_COLUMNS, + column_types); #ifdef HAVE_GEOIP if (g_file_test(TRG_GEOIP_DATABASE, G_FILE_TEST_EXISTS) == TRUE) - priv->geoip = - GeoIP_open(TRG_GEOIP_DATABASE, - GEOIP_STANDARD | GEOIP_CHECK_CACHE); + priv->geoip = GeoIP_open(TRG_GEOIP_DATABASE, + GEOIP_STANDARD | GEOIP_CHECK_CACHE); #endif } - -TrgPeersModel *trg_peers_model_new() -{ +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 95dcce2..6a4a83c 100644 --- a/src/trg-peers-model.h +++ b/src/trg-peers-model.h @@ -32,6 +32,8 @@ #endif #include <glib-object.h> +#include "trg-tree-view.h" + G_BEGIN_DECLS #define TRG_TYPE_PEERS_MODEL trg_peers_model_get_type() #define TRG_PEERS_MODEL(obj) \ @@ -78,7 +80,7 @@ enum { PEERSCOL_COLUMNS }; -void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial, +void trg_peers_model_update(TrgPeersModel * model, TrgTreeView *tv, gint64 updateSerial, JsonObject * t, gboolean first); #endif /* TRG_PEERS_MODEL_H_ */ diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 175f294..0ad4024 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -48,6 +48,25 @@ struct _TrgTreeViewPrivate { TrgPrefs *prefs; }; +gboolean trg_tree_view_is_column_showing(TrgTreeView *tv, gint index) +{ + TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); + + GList *li; + for (li = priv->columns; li; li = g_list_next(li)) + { + trg_column_description *cd = (trg_column_description*)li->data; + if (cd->model_column == index) { + if (cd->flags & TRG_COLUMN_SHOWING) + return TRUE; + else + break; + } + } + + return FALSE; +} + static void trg_tree_view_get_property(GObject * object, guint property_id, GValue * value, GParamSpec * pspec) diff --git a/src/trg-tree-view.h b/src/trg-tree-view.h index 7a512dd..ac9bb52 100644 --- a/src/trg-tree-view.h +++ b/src/trg-tree-view.h @@ -91,5 +91,6 @@ void trg_tree_view_setup_columns(TrgTreeView * tv); void trg_tree_view_set_prefs(TrgTreeView *tv, TrgPrefs *prefs); void trg_tree_view_persist(TrgTreeView * tv); void trg_tree_view_restore_sort(TrgTreeView * tv); +gboolean trg_tree_view_is_column_showing(TrgTreeView *tv, gint index); #endif /* _TRG_TREE_VIEW_H_ */ |