diff options
-rw-r--r-- | src/protocol-constants.h | 1 | ||||
-rw-r--r-- | src/requests.c | 5 | ||||
-rw-r--r-- | src/requests.h | 1 | ||||
-rw-r--r-- | src/session-get.c | 11 | ||||
-rw-r--r-- | src/session-get.h | 4 | ||||
-rw-r--r-- | src/trg-main-window.c | 18 | ||||
-rw-r--r-- | src/trg-menu-bar.c | 11 | ||||
-rw-r--r-- | src/trg-preferences-dialog.c | 4 | ||||
-rw-r--r-- | src/trg-remote-prefs-dialog.c | 88 | ||||
-rw-r--r-- | src/trg-stats-dialog.c | 11 | ||||
-rw-r--r-- | src/util.c | 14 | ||||
-rw-r--r-- | src/util.h | 1 |
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); @@ -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) { @@ -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_ */ |