summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan F <ajf@eth0.org.uk>2014-02-02 12:37:42 +0000
committerGravatar Alan F <ajf@eth0.org.uk>2014-02-02 12:37:42 +0000
commite7a058f0e239fa112676c8e3d5fb73279f2dee13 (patch)
tree9539cdfdbd0a38e1703acc9020eaf3c37a1e8c45 /src
parentfaec778fb74c3303796b07ee93585584659f456b (diff)
FOSDEM commit :) add a column to peers tree view with GeoIP city, if available.
Diffstat (limited to 'src')
-rw-r--r--src/trg-files-tree-view.h6
-rw-r--r--src/trg-peers-model.c40
-rw-r--r--src/trg-peers-model.h2
-rw-r--r--src/trg-peers-tree-view.c13
-rw-r--r--src/trg-peers-tree-view.h5
-rw-r--r--src/trg-tree-view.c18
-rw-r--r--src/trg-tree-view.h1
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);