summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-19 19:02:48 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-19 19:02:48 +0000
commit5403a5be85b5b8a207a704a5298c7f76d8312d0e (patch)
tree087ba7abbcf84ed12141b49373a56e9d253266eb /src
parentf827028d29f6e463c8aeaa329603047d3ac80da1 (diff)
reannounce, blocklist enable/url/update
Diffstat (limited to 'src')
-rw-r--r--src/protocol-constants.h1
-rw-r--r--src/requests.c5
-rw-r--r--src/requests.h1
-rw-r--r--src/session-get.c11
-rw-r--r--src/session-get.h4
-rw-r--r--src/trg-main-window.c18
-rw-r--r--src/trg-menu-bar.c11
-rw-r--r--src/trg-preferences-dialog.c4
-rw-r--r--src/trg-remote-prefs-dialog.c88
-rw-r--r--src/trg-stats-dialog.c11
-rw-r--r--src/util.c14
-rw-r--r--src/util.h1
12 files changed, 143 insertions, 26 deletions
diff --git a/src/protocol-constants.h b/src/protocol-constants.h
index 52dd348..604795b 100644
--- a/src/protocol-constants.h
+++ b/src/protocol-constants.h
@@ -95,6 +95,7 @@
#define METHOD_TORRENT_VERIFY "torrent-verify"
#define METHOD_TORRENT_REMOVE "torrent-remove"
#define METHOD_TORRENT_ADD "torrent-add"
+#define METHOD_TORRENT_REANNOUNCE "torrent-reannounce"
#define METHOD_PORT_TEST "port-test"
#define METHOD_BLOCKLIST_UPDATE "blocklist-update"
#define METHOD_SESSION_STATS "session-stats"
diff --git a/src/requests.c b/src/requests.c
index 1304d7a..8687f6b 100644
--- a/src/requests.c
+++ b/src/requests.c
@@ -80,6 +80,11 @@ JsonNode *torrent_pause(JsonArray * array)
return generic_request(METHOD_TORRENT_STOP, array);
}
+JsonNode *torrent_reannounce(JsonArray *array)
+{
+ return generic_request(METHOD_TORRENT_REANNOUNCE, array);
+}
+
JsonNode *torrent_verify(JsonArray * array)
{
return generic_request(METHOD_TORRENT_VERIFY, array);
diff --git a/src/requests.h b/src/requests.h
index e0443a1..99c99b8 100644
--- a/src/requests.h
+++ b/src/requests.h
@@ -32,6 +32,7 @@ JsonNode *torrent_set(JsonArray * array);
JsonNode *torrent_pause(JsonArray * array);
JsonNode *torrent_start(JsonArray * array);
JsonNode *torrent_verify(JsonArray * array);
+JsonNode *torrent_reannounce(JsonArray *array);
JsonNode *torrent_remove(JsonArray * array, int removeData);
JsonNode *torrent_add(gchar * filename, gboolean paused);
JsonNode *torrent_add_url(const gchar * url, gboolean paused);
diff --git a/src/session-get.c b/src/session-get.c
index 581efcc..34e409b 100644
--- a/src/session-get.c
+++ b/src/session-get.c
@@ -64,7 +64,16 @@ gboolean session_get_port_forwarding_enabled(JsonObject * s)
const gchar *session_get_blocklist_url(JsonObject * s)
{
- return json_object_get_string_member(s, SGET_BLOCKLIST_URL);
+ if (json_object_has_member(s, SGET_BLOCKLIST_URL)) {
+ return json_object_get_string_member(s, SGET_BLOCKLIST_URL);
+ } else {
+ return NULL;
+ }
+}
+
+gint64 session_get_blocklist_size(JsonObject * s)
+{
+ return json_object_get_int_member(s, SGET_BLOCKLIST_SIZE);
}
gboolean session_get_blocklist_enabled(JsonObject * s)
diff --git a/src/session-get.h b/src/session-get.h
index eefaa48..c49cadd 100644
--- a/src/session-get.h
+++ b/src/session-get.h
@@ -58,6 +58,9 @@
#define SGET_CACHE_SIZE_MB "cache-size-mb"
#define SGET_SCRIPT_TORRENT_DONE_FILENAME "script-torrent-done-filename"
#define SGET_SCRIPT_TORRENT_DONE_ENABLED "script-torrent-done-enabled"
+#define SGET_BLOCKLIST_URL "blocklist-url"
+#define SGET_BLOCKLIST_ENABLED "blocklist-enabled"
+#define SGET_BLOCKLIST_SIZE "blocklist-size"
const gchar *session_get_torrent_done_filename(JsonObject * s);
gboolean session_get_torrent_done_enabled(JsonObject * s);
@@ -73,6 +76,7 @@ gint64 session_get_peer_limit_per_torrent(JsonObject * s);
gboolean session_get_port_forwarding_enabled(JsonObject * s);
const gchar *session_get_blocklist_url(JsonObject * s);
gboolean session_get_blocklist_enabled(JsonObject * s);
+gint64 session_get_blocklist_size(JsonObject * s);
gboolean session_get_rename_partial_files(JsonObject * s);
const gchar *session_get_encryption(JsonObject * s);
const gchar *session_get_incomplete_dir(JsonObject * s);
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 7c28d92..00bd5ac 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -91,6 +91,7 @@ static void open_local_prefs_cb(GtkWidget * w, gpointer data);
static void open_remote_prefs_cb(GtkWidget * w, gpointer data);
static TrgToolbar *trg_main_window_toolbar_new(TrgMainWindow * win);
static void verify_cb(GtkWidget * w, gpointer data);
+static void reannounce_cb(GtkWidget * w, gpointer data);
static void pause_cb(GtkWidget * w, gpointer data);
static void resume_cb(GtkWidget * w, gpointer data);
static void remove_cb(GtkWidget * w, gpointer data);
@@ -586,6 +587,16 @@ static TrgToolbar *trg_main_window_toolbar_new(TrgMainWindow * win)
return toolBar;
}
+static void reannounce_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data)
+{
+ TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data);
+
+ dispatch_async(priv->client,
+ torrent_reannounce(build_json_id_array
+ (priv->torrentTreeView)),
+ on_generic_interactive_action, data);
+}
+
static void verify_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data)
{
TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data);
@@ -1177,7 +1188,7 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win)
GObject *b_connect, *b_disconnect, *b_add, *b_resume, *b_pause,
*b_verify, *b_remove, *b_delete, *b_props, *b_local_prefs,
*b_remote_prefs, *b_about, *b_view_states, *b_view_notebook,
- *b_view_stats, *b_add_url, *b_quit, *b_move;
+ *b_view_stats, *b_add_url, *b_quit, *b_move, *b_reannounce;
TrgMenuBar *menuBar;
menuBar = trg_menu_bar_new(win);
@@ -1192,6 +1203,7 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win)
"remove-button", &b_remove,
"move-button", &b_move,
"verify-button", &b_verify,
+ "reannounce-button", &b_reannounce,
"props-button", &b_props,
"remote-prefs-button", &b_remote_prefs,
"local-prefs-button", &b_local_prefs,
@@ -1208,6 +1220,7 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win)
g_signal_connect(b_resume, "activate", G_CALLBACK(resume_cb), win);
g_signal_connect(b_pause, "activate", G_CALLBACK(pause_cb), win);
g_signal_connect(b_verify, "activate", G_CALLBACK(verify_cb), win);
+ g_signal_connect(b_reannounce, "activate", G_CALLBACK(reannounce_cb), win);
g_signal_connect(b_delete, "activate", G_CALLBACK(delete_cb), win);
g_signal_connect(b_remove, "activate", G_CALLBACK(remove_cb), win);
g_signal_connect(b_move, "activate", G_CALLBACK(move_cb), win);
@@ -1406,6 +1419,9 @@ trg_torrent_tv_view_menu(GtkWidget * treeview,
trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Verify",
GTK_STOCK_REFRESH, TRUE, G_CALLBACK(verify_cb),
data);
+ trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Re-announce",
+ GTK_STOCK_REFRESH, TRUE, G_CALLBACK(reannounce_cb),
+ data);
trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Move",
GTK_STOCK_HARDDISK, TRUE, G_CALLBACK(move_cb),
data);
diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c
index 1f59ea1..674b012 100644
--- a/src/trg-menu-bar.c
+++ b/src/trg-menu-bar.c
@@ -32,6 +32,7 @@ enum {
PROP_RESUME_BUTTON,
PROP_PAUSE_BUTTON,
PROP_VERIFY_BUTTON,
+ PROP_REANNOUNCE_BUTTON,
PROP_PROPS_BUTTON,
PROP_MOVE_BUTTON,
PROP_REMOTE_PREFS_BUTTON,
@@ -59,6 +60,7 @@ struct _TrgMenuBarPrivate {
GtkWidget *mb_resume;
GtkWidget *mb_pause;
GtkWidget *mb_verify;
+ GtkWidget *mb_reannounce;
GtkWidget *mb_props;
GtkWidget *mb_local_prefs;
GtkWidget *mb_remote_prefs;
@@ -92,6 +94,7 @@ void trg_menu_bar_torrent_actions_sensitive(TrgMenuBar * mb,
gtk_widget_set_sensitive(priv->mb_resume, sensitive);
gtk_widget_set_sensitive(priv->mb_pause, sensitive);
gtk_widget_set_sensitive(priv->mb_verify, sensitive);
+ gtk_widget_set_sensitive(priv->mb_reannounce, sensitive);
gtk_widget_set_sensitive(priv->mb_move, sensitive);
}
@@ -131,6 +134,9 @@ trg_menu_bar_get_property(GObject * object, guint property_id,
case PROP_VERIFY_BUTTON:
g_value_set_object(value, priv->mb_verify);
break;
+ case PROP_REANNOUNCE_BUTTON:
+ g_value_set_object(value, priv->mb_reannounce);
+ break;
case PROP_PROPS_BUTTON:
g_value_set_object(value, priv->mb_props);
break;
@@ -286,6 +292,9 @@ GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBarPrivate * priv)
priv->mb_verify =
trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), "Verify",
GTK_STOCK_REFRESH, FALSE);
+ priv->mb_reannounce =
+ trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), "Re-announce",
+ GTK_STOCK_REFRESH, FALSE);
priv->mb_move =
trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), "Move",
GTK_STOCK_HARDDISK, FALSE);
@@ -344,6 +353,8 @@ static void trg_menu_bar_class_init(TrgMenuBarClass * klass)
"resume-button", "Resume Button");
trg_menu_bar_install_widget_prop(object_class, PROP_VERIFY_BUTTON,
"verify-button", "Verify Button");
+ trg_menu_bar_install_widget_prop(object_class, PROP_REANNOUNCE_BUTTON,
+ "reannounce-button", "Re-announce Button");
trg_menu_bar_install_widget_prop(object_class, PROP_PAUSE_BUTTON,
"pause-button", "Pause Button");
trg_menu_bar_install_widget_prop(object_class, PROP_PROPS_BUTTON,
diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c
index ef5ab10..09f23c7 100644
--- a/src/trg-preferences-dialog.c
+++ b/src/trg-preferences-dialog.c
@@ -141,9 +141,7 @@ static void interval_changed_cb(GtkWidget * w, gpointer data)
static void spun_cb_int(GtkWidget * widget, gpointer gconf)
{
- gchar *key;
-
- key = g_object_get_data(G_OBJECT(widget), GCONF_OBJECT_KEY);
+ gchar *key = g_object_get_data(G_OBJECT(widget), GCONF_OBJECT_KEY);
gconf_client_set_int(GCONF_CLIENT(gconf),
key,
diff --git a/src/trg-remote-prefs-dialog.c b/src/trg-remote-prefs-dialog.c
index 526a28f..982a73e 100644
--- a/src/trg-remote-prefs-dialog.c
+++ b/src/trg-remote-prefs-dialog.c
@@ -73,6 +73,8 @@ struct _TrgRemotePrefsDialogPrivate {
GtkWidget *speed_limit_up_spin;
GtkWidget *port_test_label;
GtkWidget *port_test_button;
+ GtkWidget *blocklist_update_label;
+ GtkWidget *blocklist_update_button;
};
static GObject *instance = NULL;
@@ -121,6 +123,10 @@ static void update_session(GtkDialog * dlg)
(priv->lpd_enabled_check), args);
gtk_spin_button_json_int_out(GTK_SPIN_BUTTON(priv->peer_port_spin),
args);
+ gtk_toggle_button_json_out(GTK_TOGGLE_BUTTON
+ (priv->blocklist_check), args);
+ if (priv->blocklist_url_entry)
+ gtk_entry_json_output(GTK_ENTRY(priv->blocklist_url_entry), args);
/* Limits */
@@ -299,9 +305,11 @@ static void on_port_tested(JsonObject * response, int status,
{
gboolean isOpen = json_object_get_boolean_member(get_arguments(response), "port-is-open");
if (isOpen)
- gtk_label_set_markup(GTK_LABEL(priv->port_test_label), "Port is <span fgcolor=\"green\">open</span>");
+ gtk_label_set_markup(GTK_LABEL(priv->port_test_label), "Port is <span font_weight=\"bold\" fgcolor=\"darkgreen\">open</span>");
else
- gtk_label_set_markup(GTK_LABEL(priv->port_test_label), "Port is <span fgcolor=\"red\">closed</span>");
+ gtk_label_set_markup(GTK_LABEL(priv->port_test_label), "Port is <span font_weight=\"bold\" fgcolor=\"red\">closed</span>");
+ } else {
+ trg_error_dialog(GTK_WINDOW(data), status, response);
}
}
@@ -320,14 +328,47 @@ static void port_test_cb(GtkButton *b, gpointer data)
dispatch_async(priv->client, req, on_port_tested, data);
}
+static void on_blocklist_updated(JsonObject * response, int status,
+ gpointer data)
+{
+ if (TRG_IS_REMOTE_PREFS_DIALOG(data)) {
+ TrgRemotePrefsDialogPrivate *priv = TRG_REMOTE_PREFS_DIALOG_GET_PRIVATE(data);
+
+ gtk_widget_set_sensitive(priv->blocklist_update_button, TRUE);
+ gtk_button_set_label(GTK_BUTTON(priv->blocklist_update_button), "Update");
+
+ if (status == CURLE_OK) {
+ JsonObject *args = get_arguments(response);
+ gchar *labelText = g_strdup_printf("Blocklist (%ld entries)", json_object_get_int_member(args, SGET_BLOCKLIST_SIZE));
+ gtk_button_set_label(GTK_BUTTON(priv->blocklist_check), labelText);
+ g_free(labelText);
+ } else {
+ trg_error_dialog(GTK_WINDOW(data), status, response);
+ }
+ }
+
+ response_unref(response);
+}
+
+static void update_blocklist_cb(GtkButton *b, gpointer data)
+{
+ TrgRemotePrefsDialogPrivate *priv = TRG_REMOTE_PREFS_DIALOG_GET_PRIVATE(data);
+ JsonNode *req = blocklist_update();
+
+ gtk_widget_set_sensitive(GTK_WIDGET(b), FALSE);
+ gtk_button_set_label(b, "Updating...");
+
+ dispatch_async(priv->client, req, on_blocklist_updated, data);
+}
+
static GtkWidget *trg_rprefs_connPage(TrgRemotePrefsDialog * win,
JsonObject * s)
{
TrgRemotePrefsDialogPrivate *priv =
TRG_REMOTE_PREFS_DIALOG_GET_PRIVATE(win);
- GtkWidget *w, *t;
- const gchar *encryption;
+ GtkWidget *w, *tb, *t;
+ const gchar *stringValue;
gint row = 0;
t = hig_workarea_create();
@@ -337,10 +378,10 @@ static GtkWidget *trg_rprefs_connPage(TrgRemotePrefsDialog * win,
gtk_combo_box_append_text(GTK_COMBO_BOX(w), "Required");
gtk_combo_box_append_text(GTK_COMBO_BOX(w), "Preferred");
gtk_combo_box_append_text(GTK_COMBO_BOX(w), "Tolerated");
- encryption = session_get_encryption(s);
- if (g_strcmp0(encryption, "required") == 0) {
+ stringValue = session_get_encryption(s);
+ if (g_strcmp0(stringValue, "required") == 0) {
gtk_combo_box_set_active(GTK_COMBO_BOX(w), 0);
- } else if (g_strcmp0(encryption, "tolerated") == 0) {
+ } else if (g_strcmp0(stringValue, "tolerated") == 0) {
gtk_combo_box_set_active(GTK_COMBO_BOX(w), 2);
} else {
gtk_combo_box_set_active(GTK_COMBO_BOX(w), 1);
@@ -353,6 +394,11 @@ static GtkWidget *trg_rprefs_connPage(TrgRemotePrefsDialog * win,
session_get_peer_port(s));
hig_workarea_add_row(t, &row, "Peer port", w, w);
+ priv->port_test_label = gtk_label_new("Port test");
+ w = priv->port_test_button = gtk_button_new_with_label("Test");
+ g_signal_connect(w, "clicked", G_CALLBACK(port_test_cb), win);
+ hig_workarea_add_row_w(t, &row, priv->port_test_label, w, NULL);
+
w = priv->peer_port_random_check =
hig_workarea_add_wide_checkbutton(t, &row,
"Random peer port on start",
@@ -378,10 +424,30 @@ static GtkWidget *trg_rprefs_connPage(TrgRemotePrefsDialog * win,
session_get_lpd_enabled(s));
widget_set_json_key(w, SGET_LPD_ENABLED);
- priv->port_test_label = gtk_label_new("Port test");
- w = priv->port_test_button = gtk_button_new_with_label("Test");
- g_signal_connect(w, "clicked", G_CALLBACK(port_test_cb), win);
- hig_workarea_add_row_w(t, &row, priv->port_test_label, w, NULL);
+ stringValue = g_strdup_printf("Blocklist (%ld entries)", session_get_blocklist_size(s));
+ tb = priv->blocklist_check =
+ gtk_check_button_new_with_mnemonic(stringValue);
+ g_free((gchar*)stringValue);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tb),
+ session_get_blocklist_enabled(s));
+
+ w = priv->blocklist_update_button = gtk_button_new_with_label("Update");
+ g_signal_connect(G_OBJECT(w), "clicked", G_CALLBACK(update_blocklist_cb), win);
+
+ hig_workarea_add_row_w(t, &row, tb, w, NULL);
+
+ stringValue = session_get_blocklist_url(s);
+ if (stringValue) {
+ w = priv->blocklist_url_entry = gtk_entry_new();
+ widget_set_json_key(w, SGET_BLOCKLIST_URL);
+ gtk_entry_set_text(GTK_ENTRY(w), session_get_blocklist_url(s));
+ gtk_widget_set_sensitive(w,
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+ (tb)));
+ g_signal_connect(G_OBJECT(tb), "toggled",
+ G_CALLBACK(toggle_active_arg_is_sensitive), w);
+ hig_workarea_add_row(t, &row, "Blocklist URL:", w, NULL);
+ }
return t;
}
diff --git a/src/trg-stats-dialog.c b/src/trg-stats-dialog.c
index c7d94b9..9edb79c 100644
--- a/src/trg-stats-dialog.c
+++ b/src/trg-stats-dialog.c
@@ -221,16 +221,7 @@ static void on_stats_reply(JsonObject * response, int status,
if (priv->client->session != NULL)
g_timeout_add_seconds(5, trg_update_stats_timerfunc, data);
} else {
- const gchar *msg = make_error_message(response, status);
- GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(data),
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK, "%s",
- msg);
- gtk_window_set_title(GTK_WINDOW(dialog), "Error");
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- g_free((gpointer) msg);
+ trg_error_dialog(GTK_WINDOW(data), status, response);
}
response_unref(response);
diff --git a/src/util.c b/src/util.c
index 3621e4d..c2f623f 100644
--- a/src/util.c
+++ b/src/util.c
@@ -33,6 +33,20 @@
#include "util.h"
#include "dispatch.h"
+void trg_error_dialog(GtkWindow *parent, int status, JsonObject *response)
+{
+ const gchar *msg = make_error_message(response, status);
+ GtkWidget *dialog = gtk_message_dialog_new(parent,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK, "%s",
+ msg);
+ gtk_window_set_title(GTK_WINDOW(dialog), "Error");
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ g_free((gpointer) msg);
+}
+
const gchar *make_error_message(JsonObject * response, int status)
{
if (status == FAIL_JSON_DECODE) {
diff --git a/src/util.h b/src/util.h
index 72b3b07..e73950b 100644
--- a/src/util.h
+++ b/src/util.h
@@ -55,5 +55,6 @@ int evutil_vsnprintf(char *buf, size_t buflen, const char *format,
va_list ap);
void response_unref(JsonObject * response);
const gchar *make_error_message(JsonObject * response, int status);
+void trg_error_dialog(GtkWindow *parent, int status, JsonObject *response);
#endif /* UTIL_H_ */