summaryrefslogtreecommitdiff
path: root/src/trg-client.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-08-27 17:15:31 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-08-27 17:15:31 +0000
commitbd758ee4fc423b9ca152a01f897609daa656c938 (patch)
tree0378306b5b007f38f0c4f6c0d868215f70fd70d6 /src/trg-client.c
parentb8a1599a2ab9eafd496ba23179dda97d6e83e917 (diff)
Profile support! Please test and report bugs, as the config system is totally rewritten and may not be perfect. No more GConf (trying to implement profiles with this was UGLY), settings now (for most) live in JSON at $HOME/.config/transmission-remote-gtk/config.json. Hopefully windows support will be easier without GConf.
Diffstat (limited to 'src/trg-client.c')
-rw-r--r--src/trg-client.c356
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;
+}