diff options
-rw-r--r-- | src/trg-files-tree-view.h | 6 | ||||
-rw-r--r-- | src/trg-peers-model.c | 40 | ||||
-rw-r--r-- | src/trg-peers-model.h | 2 | ||||
-rw-r--r-- | src/trg-peers-tree-view.c | 13 | ||||
-rw-r--r-- | src/trg-peers-tree-view.h | 5 | ||||
-rw-r--r-- | src/trg-tree-view.c | 18 | ||||
-rw-r--r-- | src/trg-tree-view.h | 1 |
7 files changed, 71 insertions, 14 deletions
diff --git a/src/trg-files-tree-view.h b/src/trg-files-tree-view.h index dedcb3d..3cfecd7 100644 --- a/src/trg-files-tree-view.h +++ b/src/trg-files-tree-view.h @@ -38,12 +38,12 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE ((klass), TRG_TYPE_FILES_TREE_VIEW)) #define TRG_FILES_TREE_VIEW_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), TRG_TYPE_FILES_TREE_VIEW, TrgFilesTreeViewClass)) - typedef struct { - GtkTreeView parent; +typedef struct { + TrgTreeView parent; } TrgFilesTreeView; typedef struct { - GtkTreeViewClass parent_class; + TrgTreeViewClass parent_class; } TrgFilesTreeViewClass; enum { diff --git a/src/trg-peers-model.c b/src/trg-peers-model.c index 1301fc3..f7c792d 100644 --- a/src/trg-peers-model.c +++ b/src/trg-peers-model.c @@ -28,6 +28,7 @@ #include <glib/gstdio.h> #ifdef HAVE_GEOIP #include <GeoIP.h> +#include <GeoIPCity.h> #endif #include "trg-tree-view.h" @@ -46,6 +47,7 @@ typedef struct _TrgPeersModelPrivate TrgPeersModelPrivate; struct _TrgPeersModelPrivate { GeoIP *geoip; GeoIP *geoipv6; + GeoIP *geoipcity; }; #endif @@ -151,6 +153,8 @@ trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(model); gboolean doGeoLookup = trg_tree_view_is_column_showing(tv, PEERSCOL_COUNTRY); + gboolean doGeoCityLookup = + trg_tree_view_is_column_showing(tv, PEERSCOL_CITY); #endif gboolean doHostLookup = @@ -171,6 +175,7 @@ trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, const gchar *address = NULL, *flagStr; #ifdef HAVE_GEOIP const gchar *country = NULL; + GeoIPRecord *city = NULL; #endif if (mode == TORRENT_GET_MODE_FIRST @@ -179,14 +184,18 @@ trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, address = peer_get_address(peer); #ifdef HAVE_GEOIP - if (address && doGeoLookup) { /* just in case address wasn't set */ - 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 (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 (doGeoCityLookup) + city = GeoIP_record_by_addr(priv->geoipcity, address); } #endif gtk_list_store_set(GTK_LIST_STORE(model), &peerIter, @@ -194,6 +203,7 @@ trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, PEERSCOL_IP, address, #ifdef HAVE_GEOIP PEERSCOL_COUNTRY, country ? country : "", + PEERSCOL_CITY, city ? city->city : "", #endif PEERSCOL_CLIENT, peer_get_client_name(peer), -1); @@ -203,6 +213,9 @@ trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, isNew = FALSE; } + if (city) + GeoIPRecord_delete(city); + flagStr = peer_get_flagstr(peer); gtk_list_store_set(GTK_LIST_STORE(model), &peerIter, PEERSCOL_FLAGS, flagStr, PEERSCOL_PROGRESS, @@ -244,6 +257,7 @@ static void trg_peers_model_init(TrgPeersModel * self) TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(self); gchar *geoip_db_path = NULL; gchar *geoip_v6_db_path = NULL; + gchar *geoip_city_db_path = NULL; #endif GType column_types[PEERSCOL_COLUMNS]; @@ -252,6 +266,7 @@ static void trg_peers_model_init(TrgPeersModel * self) column_types[PEERSCOL_IP] = G_TYPE_STRING; #ifdef HAVE_GEOIP column_types[PEERSCOL_COUNTRY] = G_TYPE_STRING; + column_types[PEERSCOL_CITY] = G_TYPE_STRING; #endif column_types[PEERSCOL_HOST] = G_TYPE_STRING; column_types[PEERSCOL_FLAGS] = G_TYPE_STRING; @@ -268,9 +283,11 @@ static void trg_peers_model_init(TrgPeersModel * self) #ifdef WIN32 geoip_db_path = trg_win32_support_path("GeoIP.dat"); geoip_v6_db_path = trg_win32_support_path("GeoIPv6.dat"); + geoip_city_db_path = trg_win32_support_path("GeoLiteCity.dat"); #else geoip_db_path = g_strdup(TRG_GEOIP_DATABASE); geoip_v6_db_path = g_strdup(TRG_GEOIPV6_DATABASE); + geoip_city_db_path = g_strdup(TRG_GEOIP_CITY_DATABASE); #endif if (g_file_test(geoip_db_path, G_FILE_TEST_EXISTS) == TRUE) @@ -281,6 +298,13 @@ static void trg_peers_model_init(TrgPeersModel * self) priv->geoipv6 = GeoIP_open(geoip_v6_db_path, GEOIP_STANDARD | GEOIP_CHECK_CACHE); + if (g_file_test(geoip_city_db_path, G_FILE_TEST_EXISTS) == TRUE) { + priv->geoipcity = GeoIP_open(geoip_city_db_path, + GEOIP_STANDARD | GEOIP_CHECK_CACHE); + GeoIP_set_charset(priv->geoipcity, GEOIP_CHARSET_UTF8); + } + + g_free(geoip_city_db_path); g_free(geoip_db_path); g_free(geoip_v6_db_path); #endif diff --git a/src/trg-peers-model.h b/src/trg-peers-model.h index 6ae941a..edfd8fe 100644 --- a/src/trg-peers-model.h +++ b/src/trg-peers-model.h @@ -69,6 +69,7 @@ enum { PEERSCOL_IP, #if HAVE_GEOIP PEERSCOL_COUNTRY, + PEERSCOL_CITY, #endif PEERSCOL_HOST, PEERSCOL_FLAGS, @@ -88,3 +89,4 @@ void trg_peers_model_update(TrgPeersModel * model, TrgTreeView * tv, #define TRG_GEOIP_DATABASE "/usr/share/GeoIP/GeoIP.dat" #define TRG_GEOIPV6_DATABASE "/usr/share/GeoIP/GeoIPv6.dat" +#define TRG_GEOIP_CITY_DATABASE "/usr/share/GeoIP/GeoLiteCity.dat" diff --git a/src/trg-peers-tree-view.c b/src/trg-peers-tree-view.c index c2a96c2..2bbb301 100644 --- a/src/trg-peers-tree-view.c +++ b/src/trg-peers-tree-view.c @@ -56,6 +56,9 @@ static void trg_peers_tree_view_init(TrgPeersTreeView * self) #ifdef HAVE_GEOIP trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, PEERSCOL_COUNTRY, _("Country"), "country", 0); + trg_tree_view_reg_column(ttv, TRG_COLTYPE_TEXT, PEERSCOL_CITY, + _("City"), "city", 0); + #endif trg_tree_view_reg_column(ttv, TRG_COLTYPE_SPEED, PEERSCOL_DOWNSPEED, _("Down Speed"), "down-speed", 0); @@ -71,6 +74,14 @@ static void trg_peers_tree_view_init(TrgPeersTreeView * self) gtk_tree_view_set_search_column(GTK_TREE_VIEW(self), PEERSCOL_HOST); } +static void trg_peers_tree_view_column_added(TrgTreeView *tv, const gchar *id) { + if (!g_strcmp0(id, "city")) { + + } else if (!g_strcmp0(id, "country")) { + + } +} + TrgPeersTreeView *trg_peers_tree_view_new(TrgPrefs * prefs, TrgPeersModel * model, const gchar * configId) @@ -83,5 +94,7 @@ TrgPeersTreeView *trg_peers_tree_view_new(TrgPrefs * prefs, trg_tree_view_restore_sort(TRG_TREE_VIEW(obj), 0x00); trg_tree_view_setup_columns(TRG_TREE_VIEW(obj)); + g_signal_connect(obj, "column-added", G_CALLBACK(trg_peers_tree_view_column_added), NULL); + return TRG_PEERS_TREE_VIEW(obj); } diff --git a/src/trg-peers-tree-view.h b/src/trg-peers-tree-view.h index 57a09c1..3e683d3 100644 --- a/src/trg-peers-tree-view.h +++ b/src/trg-peers-tree-view.h @@ -17,7 +17,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - #ifndef TRG_PEERS_TREE_VIEW_H_ #define TRG_PEERS_TREE_VIEW_H_ @@ -40,11 +39,11 @@ G_BEGIN_DECLS #define TRG_PEERS_TREE_VIEW_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), TRG_TYPE_PEERS_TREE_VIEW, TrgPeersTreeViewClass)) typedef struct { - GtkTreeView parent; + TrgTreeView parent; } TrgPeersTreeView; typedef struct { - GtkTreeViewClass parent_class; + TrgTreeViewClass parent_class; } TrgPeersTreeViewClass; GType trg_peers_tree_view_get_type(void); diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 85cb58a..1be9dad 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -49,6 +49,12 @@ enum { PROP_0, PROP_PREFS, PROP_CONFIGID }; +enum { + SIGNAL_COLUMN_ADDED, SIGNAL_COUNT +}; + +static guint signals[SIGNAL_COUNT] = { 0 }; + G_DEFINE_TYPE(TrgTreeView, trg_tree_view, GTK_TYPE_TREE_VIEW) #define TRG_TREE_VIEW_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_TREE_VIEW, TrgTreeViewPrivate)) @@ -215,6 +221,8 @@ trg_tree_view_user_add_column_cb(GtkWidget * w, TRG_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); trg_tree_view_add_column_after(tv, desc, -1, col); + + g_signal_emit(tv, signals[SIGNAL_COLUMN_ADDED], 0, desc->id); } static void trg_tree_view_sort_menu_item_toggled(GtkCheckMenuItem * w, @@ -771,6 +779,16 @@ static void trg_tree_view_class_init(TrgTreeViewClass * klass) G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + signals[SIGNAL_COLUMN_ADDED] = + g_signal_new("column-added", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET(TrgTreeViewClass, + column_added), NULL, + NULL, g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + } static void trg_tree_view_init(TrgTreeView * tv) diff --git a/src/trg-tree-view.h b/src/trg-tree-view.h index 43ee576..435848f 100644 --- a/src/trg-tree-view.h +++ b/src/trg-tree-view.h @@ -42,6 +42,7 @@ G_BEGIN_DECLS typedef struct { GtkTreeViewClass parent_class; + void (*column_added) (TrgTreeView * tv, const gchar *id); } TrgTreeViewClass; GType trg_tree_view_get_type(void); |