diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2012-03-17 22:04:24 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2012-03-17 22:04:24 +0000 |
commit | 8024343b6537fc0e25c51ee958d45ec30b97493f (patch) | |
tree | 76d7b50a7bcf291d24a367fc26eb184a84f665ce | |
parent | 62fa0a364fb7eaccab9e8037e9f607f78a088dbb (diff) |
issue 188
-rw-r--r-- | src/trg-client.c | 7 | ||||
-rw-r--r-- | src/trg-client.h | 1 | ||||
-rw-r--r-- | src/trg-main-window.c | 66 | ||||
-rw-r--r-- | src/trg-main-window.h | 1 | ||||
-rw-r--r-- | src/trg-preferences-dialog.c | 4 | ||||
-rw-r--r-- | src/trg-prefs.c | 2 | ||||
-rw-r--r-- | src/trg-prefs.h | 2 |
7 files changed, 74 insertions, 9 deletions
diff --git a/src/trg-client.c b/src/trg-client.c index 87110d7..311321f 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -36,6 +36,7 @@ #include "trg-prefs.h" #include "protocol-constants.h" #include "util.h" +#include "requests.h" #include "trg-client.h" /* This class manages/does quite a few things, and is passed around a lot. It: @@ -688,3 +689,9 @@ dispatch_async_str(TrgClient * tc, gchar * req, return dispatch_async_common(tc, trg_req, callback, data); } + +gboolean trg_client_update_session(TrgClient *tc, GSourceFunc callback, gpointer data) +{ + return dispatch_async(tc, session_get(), callback, + data); +} diff --git a/src/trg-client.h b/src/trg-client.h index b57bb4e..82e8914 100644 --- a/src/trg-client.h +++ b/src/trg-client.h @@ -161,6 +161,7 @@ guint trg_client_get_failcount(TrgClient * tc); void trg_client_reset_failcount(TrgClient * tc); void trg_client_inc_serial(TrgClient * tc); void trg_client_inc_connid(TrgClient * tc); +gboolean trg_client_update_session(TrgClient *tc, GSourceFunc callback, gpointer data); G_END_DECLS #endif /* _TRG_CLIENT_H_ */ diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 7b415ea..ab9e151 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -134,12 +134,14 @@ static void view_states_toggled_cb(GtkCheckMenuItem * w, static void view_notebook_toggled_cb(GtkCheckMenuItem * w, TrgMainWindow * win); static GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win); +static gboolean on_session_get_timer(gpointer data); static gboolean on_session_get(gpointer data); static gboolean on_torrent_get(gpointer data, int mode); static gboolean on_torrent_get_first(gpointer data); static gboolean on_torrent_get_active(gpointer data); static gboolean on_torrent_get_update(gpointer data); static gboolean on_torrent_get_interactive(gpointer data); +static gboolean trg_session_update_timerfunc(gpointer data); static gboolean trg_update_torrents_timerfunc(gpointer data); static void open_about_cb(GtkWidget * w, GtkWindow * parent); static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model, @@ -250,6 +252,7 @@ struct _TrgMainWindowPrivate { gint width, height; guint timerId; + guint sessionTimerId; gboolean min_on_start; gboolean queuesEnabled; @@ -882,7 +885,7 @@ static void delete_cb(GtkWidget * w G_GNUC_UNUSED, TrgMainWindow * win) ("<big><b>Remove and delete %d torrents?</b></big>"), GTK_STOCK_DELETE) == GTK_RESPONSE_ACCEPT) dispatch_async(priv->client, torrent_remove(ids, TRUE), - on_generic_interactive_action, win); + on_delete_complete, win); else json_array_unref(ids); } @@ -1006,8 +1009,7 @@ gboolean on_session_set(gpointer data) if (response->status == CURLE_OK || response->status == FAIL_RESPONSE_UNSUCCESSFUL) - dispatch_async(priv->client, session_get(), on_session_get, - response->cb_data); + trg_client_update_session(priv->client, on_session_get, response->cb_data); trg_dialog_error_handler(TRG_MAIN_WINDOW(response->cb_data), response); trg_response_free(response); @@ -1022,6 +1024,23 @@ hasEnabledChanged(JsonObject * a, JsonObject * b, const gchar * key) json_object_get_boolean_member(b, key); } +static gboolean on_session_get_timer(gpointer data) +{ + trg_response *response = (trg_response *) data; + TrgMainWindow *win = TRG_MAIN_WINDOW(response->cb_data); + TrgMainWindowPrivate *priv = win->priv; + TrgPrefs *prefs = trg_client_get_prefs(priv->client); + + on_session_get(data); + + priv->sessionTimerId = g_timeout_add_seconds(trg_prefs_get_int(prefs, + TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, TRG_PREFS_CONNECTION), + trg_session_update_timerfunc, + win); + + return FALSE; +} + static gboolean on_session_get(gpointer data) { trg_response *response = (trg_response *) data; @@ -1033,6 +1052,8 @@ static gboolean on_session_get(gpointer data) JsonObject *lastSession = trg_client_get_session(client); JsonObject *newSession = NULL; + g_message("session update!"); + if (response->obj) newSession = get_arguments(response->obj); @@ -1311,6 +1332,16 @@ static gboolean on_torrent_get_update(gpointer data) return on_torrent_get(data, TORRENT_GET_MODE_UPDATE); } +static gboolean trg_session_update_timerfunc(gpointer data) +{ + TrgMainWindow *win = TRG_MAIN_WINDOW(data); + TrgMainWindowPrivate *priv = win->priv; + + trg_client_update_session(priv->client, on_session_get_timer, win); + + return FALSE; +} + static gboolean trg_update_torrents_timerfunc(gpointer data) { TrgMainWindow *win = TRG_MAIN_WINDOW(data); @@ -1334,10 +1365,6 @@ static gboolean trg_update_torrents_timerfunc(gpointer data) : TORRENT_GET_TAG_MODE_FULL), activeOnly ? on_torrent_get_active : on_torrent_get_update, data); - - if (trg_client_get_serial(tc) % SESSION_UPDATE_DIVISOR == 0) - dispatch_async(priv->client, session_get(), on_session_get, - data); } return FALSE; @@ -1506,6 +1533,19 @@ torrent_selection_changed(GtkTreeSelection * selection, return TRUE; } +gboolean on_delete_complete(gpointer data) +{ + trg_response *response = (trg_response *) data; + TrgMainWindow *win = TRG_MAIN_WINDOW(response->cb_data); + TrgMainWindowPrivate *priv = win->priv; + TrgClient *tc = priv->client; + + if (trg_client_is_connected(tc) && response->status == CURLE_OK) + trg_client_update_session(priv->client, on_session_get, response->cb_data); + + return on_generic_interactive_action(data); +} + gboolean on_generic_interactive_action(gpointer data) { trg_response *response = (trg_response *) data; @@ -1583,7 +1623,13 @@ trg_main_window_conn_changed(TrgMainWindow * win, gboolean connected) connected); gtk_widget_set_sensitive(GTK_WIDGET(priv->genDetails), connected); - if (!connected) { + if (connected) { + TrgPrefs *prefs = trg_client_get_prefs(priv->client); + priv->sessionTimerId = g_timeout_add_seconds(trg_prefs_get_int(prefs, + TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, TRG_PREFS_CONNECTION), + trg_session_update_timerfunc, + win); + } else { trg_main_window_torrent_scrub(win); trg_state_selector_disconnect(priv->stateSelector); @@ -1594,7 +1640,9 @@ trg_main_window_conn_changed(TrgMainWindow * win, gboolean connected) trg_torrent_model_remove_all(priv->torrentModel); - priv->timerId = 0; + g_source_remove(priv->timerId); + g_source_remove(priv->sessionTimerId); + priv->sessionTimerId = priv->timerId = 0; } trg_client_status_change(tc, connected); diff --git a/src/trg-main-window.h b/src/trg-main-window.h index 999ca38..59dddc8 100644 --- a/src/trg-main-window.h +++ b/src/trg-main-window.h @@ -62,6 +62,7 @@ typedef struct { GType trg_main_window_get_type(void); gint trg_add_from_filename(TrgMainWindow * win, gchar ** uris); gboolean on_session_set(gpointer data); +gboolean on_delete_complete(gpointer data); gboolean on_generic_interactive_action(gpointer data); void auto_connect_if_required(TrgMainWindow * win); void trg_main_window_set_start_args(TrgMainWindow * win, gchar ** args); diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 75abcd1..ca57da2 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -427,6 +427,10 @@ static GtkWidget *trg_prefs_generalPage(TrgPreferencesDialog * dlg) hig_workarea_add_row(t, &row, _("Minimised update interval:"), w, NULL); + w = trgp_spin_new(dlg, TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, 1, INT_MAX, 1, + TRG_PREFS_PROFILE, NULL); + hig_workarea_add_row(t, &row, _("Session update interval:"), w, NULL); + hig_workarea_add_section_title(t, &row, _("Torrents")); w = trgp_check_new(dlg, _("Start paused"), TRG_PREFS_KEY_START_PAUSED, diff --git a/src/trg-prefs.c b/src/trg-prefs.c index 3c099b2..253009d 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -102,6 +102,8 @@ static void trg_prefs_create_defaults(TrgPrefs * p) trg_prefs_add_default_int(p, TRG_PREFS_KEY_PORT, 9091); trg_prefs_add_default_int(p, TRG_PREFS_KEY_UPDATE_INTERVAL, TRG_INTERVAL_DEFAULT); + trg_prefs_add_default_int(p, TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, + TRG_SESSION_INTERVAL_DEFAULT); trg_prefs_add_default_int(p, TRG_PREFS_KEY_MINUPDATE_INTERVAL, TRG_INTERVAL_DEFAULT); trg_prefs_add_default_int(p, TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY, 2); diff --git a/src/trg-prefs.h b/src/trg-prefs.h index e0eba8e..535eb31 100644 --- a/src/trg-prefs.h +++ b/src/trg-prefs.h @@ -27,6 +27,7 @@ #define TRG_PREFS_DEFAULT_DIR_MODE 448 #define TRG_PORT_DEFAULT 9091 #define TRG_INTERVAL_DEFAULT 3 +#define TRG_SESSION_INTERVAL_DEFAULT 60 #define TRG_PROFILE_NAME_DEFAULT "Default" #define TRG_PREFS_KEY_PROFILE_ID "profile-id" @@ -42,6 +43,7 @@ #define TRG_PREFS_KEY_TIMEOUT "timeout" #define TRG_PREFS_KEY_RETRIES "retries" #define TRG_PREFS_KEY_UPDATE_INTERVAL "update-interval" +#define TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL "session-update-interval" #define TRG_PREFS_KEY_COMPLETE_NOTIFY "complete-notify" #define TRG_PREFS_KEY_ADD_NOTIFY "add-notify" #define TRG_PREFS_KEY_WINDOW_WIDTH "window-width" |