diff options
Diffstat (limited to 'src/trg-client.c')
-rw-r--r-- | src/trg-client.c | 356 |
1 files changed, 300 insertions, 56 deletions
diff --git a/src/trg-client.c b/src/trg-client.c index 3eb6d6d..5de32a9 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -22,113 +22,210 @@ #endif #include <string.h> -#include <glib-object.h> -#include <gconf/gconf-client.h> +#include <glib.h> +#include <glib/gprintf.h> #ifdef HAVE_LIBPROXY #include <proxy.h> #endif -#include "trg-client.h" -#include "trg-preferences.h" +#include "trg-prefs.h" #include "util.h" #include "dispatch.h" +#include "trg-client.h" + +enum { + CLIENT_SIGNAL_PROFILE_CHANGE, + CLIENT_SIGNAL_PROFILE_NEW, + CLIENT_SIGNAL_COUNT +}; + +static guint signals[CLIENT_SIGNAL_COUNT] = { 0 }; + +G_DEFINE_TYPE (TrgClient, trg_client, G_TYPE_OBJECT) + +#define TRG_CLIENT_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_CLIENT, TrgClientPrivate)) + +typedef struct _TrgClientPrivate TrgClientPrivate; + +struct _TrgClientPrivate { + char *session_id; + gboolean activeOnlyUpdate; + gint failCount; + gint interval; + gint64 updateSerial; + JsonObject *session; + gboolean ssl; + float version; + char *url; + char *username; + char *password; + char *proxy; + GHashTable *torrentTable; + GThreadPool *pool; + GMutex *updateMutex; + TrgPrefs *prefs; +}; + +static void +trg_client_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec) +{ + switch (property_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +trg_client_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec) +{ + switch (property_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} -gboolean trg_client_supports_tracker_edit(trg_client * tc) +static void +trg_client_dispose (GObject *object) { - return tc->session && tc->version >= 2.10; + G_OBJECT_CLASS (trg_client_parent_class)->dispose (object); } -trg_client *trg_init_client() +static void +trg_client_class_init (TrgClientClass *klass) { - trg_client *client = g_new0(trg_client, 1); + GObjectClass *object_class = G_OBJECT_CLASS (klass); - client->gconf = gconf_client_get_default(); - client->updateMutex = g_mutex_new(); - client->activeOnlyUpdate = - gconf_client_get_bool(client->gconf, - TRG_GCONF_KEY_UPDATE_ACTIVE_ONLY, NULL); - client->pool = dispatch_init_pool(client); + g_type_class_add_private (klass, sizeof (TrgClientPrivate)); - return client; + object_class->get_property = trg_client_get_property; + object_class->set_property = trg_client_set_property; + object_class->dispose = trg_client_dispose; + + signals[CLIENT_SIGNAL_PROFILE_CHANGE] = + gtk_signal_new ("client-profile-changed", + GTK_RUN_LAST, + G_TYPE_FROM_CLASS(object_class), + GTK_SIGNAL_OFFSET (TrgClientClass, client_profile_changed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + signals[CLIENT_SIGNAL_PROFILE_NEW] = + gtk_signal_new ("client-profile-new", + GTK_RUN_LAST, + G_TYPE_FROM_CLASS(object_class), + GTK_SIGNAL_OFFSET (TrgClientClass, client_profile_new), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); } -#define check_for_error(error) if (error) { g_error_free(error); return TRG_GCONF_SCHEMA_ERROR; } +static void +trg_client_init (TrgClient *self) +{ +} -void trg_client_set_session(trg_client * tc, JsonObject * session) +TrgClient* +trg_client_new (void) { - if (tc->session) - json_object_unref(tc->session); + TrgClient *tc = g_object_new (TRG_TYPE_CLIENT, NULL); + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + TrgPrefs *prefs = priv->prefs = trg_prefs_new(); - session_get_version(session, &tc->version); + trg_prefs_load(prefs); - tc->session = session; + priv->updateMutex = g_mutex_new(); + priv->activeOnlyUpdate = + trg_prefs_get_bool(prefs, + TRG_PREFS_KEY_UPDATE_ACTIVE_ONLY, TRG_PREFS_PROFILE); + priv->pool = dispatch_init_pool(tc); + + return tc; } -int trg_client_populate_with_settings(trg_client * tc, GConfClient * gconf) +gboolean trg_client_supports_tracker_edit(TrgClient * tc) { + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->session && priv->version >= 2.10; +} + +void trg_client_set_session(TrgClient * tc, JsonObject * session) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + + if (priv->session) + json_object_unref(priv->session); + + session_get_version(session, &priv->version); + + priv->session = session; +} + +TrgPrefs *trg_client_get_prefs(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->prefs; +} + +int trg_client_populate_with_settings(TrgClient * tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + TrgPrefs *prefs = priv->prefs; + gint port; gchar *host; - GError *error = NULL; #ifdef HAVE_LIBPROXY pxProxyFactory *pf = NULL; #endif - g_free(tc->url); - tc->url = NULL; + g_free(priv->url); + priv->url = NULL; - g_free(tc->username); - tc->username = NULL; + g_free(priv->username); + priv->username = NULL; - g_free(tc->password); - tc->password = NULL; + g_free(priv->password); + priv->password = NULL; port = - gconf_client_get_int_or_default(gconf, TRG_GCONF_KEY_PORT, - TRG_PORT_DEFAULT, &error); - check_for_error(error); + trg_prefs_get_int(prefs, TRG_PREFS_KEY_PORT, TRG_PREFS_PROFILE); - host = gconf_client_get_string(gconf, TRG_GCONF_KEY_HOSTNAME, &error); - check_for_error(error); + host = trg_prefs_get_string(prefs, TRG_PREFS_KEY_HOSTNAME, TRG_PREFS_PROFILE); if (!host || strlen(host) < 1) return TRG_NO_HOSTNAME_SET; - tc->ssl = gconf_client_get_bool(gconf, TRG_GCONF_KEY_SSL, &error); - check_for_error(error); + priv->ssl = trg_prefs_get_bool(prefs, TRG_PREFS_KEY_SSL, TRG_PREFS_PROFILE); - tc->url = + priv->url = g_strdup_printf("%s://%s:%d/transmission/rpc", - tc->ssl ? "https" : "http", host, port); + priv->ssl ? "https" : "http", host, port); g_free(host); - tc->interval = - gconf_client_get_int_or_default(gconf, - TRG_GCONF_KEY_UPDATE_INTERVAL, - TRG_INTERVAL_DEFAULT, &error); - check_for_error(error); - if (tc->interval < 1) - tc->interval = TRG_INTERVAL_DEFAULT; + priv->interval = + trg_prefs_get_int(prefs, TRG_PREFS_KEY_UPDATE_INTERVAL, TRG_PREFS_PROFILE); + if (priv->interval < 1) + priv->interval = TRG_INTERVAL_DEFAULT; - tc->username = - gconf_client_get_string(gconf, TRG_GCONF_KEY_USERNAME, &error); - check_for_error(error); + priv->username = + trg_prefs_get_string(prefs, TRG_PREFS_KEY_USERNAME, TRG_PREFS_PROFILE); - tc->password = - gconf_client_get_string(gconf, TRG_GCONF_KEY_PASSWORD, &error); - check_for_error(error); + priv->password = + trg_prefs_get_string(prefs, TRG_PREFS_KEY_PASSWORD, TRG_PREFS_PROFILE); - g_free(tc->proxy); - tc->proxy = NULL; + g_free(priv->proxy); + priv->proxy = NULL; #ifdef HAVE_LIBPROXY if ((pf = px_proxy_factory_new())) { - char **proxies = px_proxy_factory_get_proxies(pf, tc->url); + char **proxies = px_proxy_factory_get_proxies(pf, priv->url); int i; for (i = 0; proxies[i]; i++) { if (g_str_has_prefix(proxies[i], "http")) { - g_free(tc->proxy); - tc->proxy = proxies[i]; + g_free(priv->proxy); + priv->proxy = proxies[i]; } else { g_free(proxies[i]); } @@ -141,3 +238,150 @@ int trg_client_populate_with_settings(trg_client * tc, GConfClient * gconf) return 0; } + +gchar *trg_client_get_password(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->password; +} + +gchar *trg_client_get_username(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->username; +} + +gchar *trg_client_get_url(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->url; +} + +gchar *trg_client_get_session_id(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->session_id; +} + +void trg_client_set_session_id(TrgClient *tc, gchar *session_id) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + priv->session_id = session_id; +} + +void trg_client_status_change(TrgClient *tc, gboolean connected) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + if (!connected) { + json_object_unref(priv->session); + priv->session = NULL; + } +} + +JsonObject* trg_client_get_session(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->session; +} + +void trg_client_thread_pool_push(TrgClient *tc, gpointer data, GError **err) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + g_thread_pool_push(priv->pool, data, err); +} + +void trg_client_inc_serial(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + priv->updateSerial++; +} + +gint64 trg_client_get_serial(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->updateSerial; +} + +gboolean trg_client_get_ssl(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->ssl; +} + +gchar *trg_client_get_proxy(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->proxy; +} + +void trg_client_set_torrent_table(TrgClient *tc, GHashTable *table) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + priv->torrentTable = table; +} + +GHashTable* trg_client_get_torrent_table(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->torrentTable; +} + +gboolean trg_client_is_connected(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->session != NULL; +} + +void trg_client_updatelock(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + g_mutex_lock(priv->updateMutex); +} + +gint trg_client_get_failcount(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->failCount; +} + +gint trg_client_inc_failcount(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return ++(priv->failCount); +} + +void trg_client_reset_failcount(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + priv->failCount = 0; +} + +void trg_client_updateunlock(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + g_mutex_unlock(priv->updateMutex); +} + +gboolean trg_client_get_activeonlyupdate(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->activeOnlyUpdate; +} + +void trg_client_set_activeonlyupdate(TrgClient *tc, gboolean activeOnlyUpdate) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + priv->activeOnlyUpdate = activeOnlyUpdate; +} + +gint trg_client_get_interval(TrgClient *tc) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + return priv->interval; +} + +void trg_client_set_interval(TrgClient *tc, gint interval) +{ + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); + priv->interval = interval; +} |