From 786bfb4ef30c02d2aa1336effcf258d786857def Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Sat, 1 Oct 2011 18:09:23 +0000 Subject: accept URLs and magnet links as application arguments, DHT on magnet warning, fix files model to accept new files after first update (required for magnet). --- src/requests.c | 29 ++++++++++++++++++++--------- src/session-get.c | 5 +++++ src/session-get.h | 1 + src/trg-files-model.c | 19 +++++++++++++++++-- src/trg-torrent-add-url-dialog.c | 33 ++++++++++++++++++++++++++++++--- 5 files changed, 73 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/requests.c b/src/requests.c index c77217d..fe3f90e 100644 --- a/src/requests.c +++ b/src/requests.c @@ -209,29 +209,40 @@ JsonNode *torrent_add_url(const gchar * url, gboolean paused) return root; } -JsonNode *torrent_add(gchar * filename, gint flags) +JsonNode *torrent_add(gchar * target, gint flags) { JsonNode *root; JsonObject *args; + gboolean isMagnet = g_str_has_prefix(target, "magnet:"); + gboolean isUri = isMagnet || g_regex_match_simple ("^(([^:/?#]+):)?(//([^/?#]*))?", target, 0, 0); + gchar *encodedFile; - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) + if (!isUri && !g_file_test(target, G_FILE_TEST_IS_REGULAR)) { - g_error("file \"%s\" does not exist.", filename); + g_error("file \"%s\" does not exist.", target); return NULL; } root = base_request(METHOD_TORRENT_ADD); args = node_get_arguments(root); - gchar *encodedFile = trg_base64encode(filename); - if (encodedFile) - json_object_set_string_member(args, PARAM_METAINFO, encodedFile); + if (isUri) { + json_object_set_string_member(args, PARAM_FILENAME, target); + } else { + encodedFile = trg_base64encode(target); + if (encodedFile) { + json_object_set_string_member(args, PARAM_METAINFO, encodedFile); + g_free(encodedFile); + } else { + g_error("unable to base64 encode file \"%s\".", target); + return NULL; + } + } - json_object_set_boolean_member(args, PARAM_PAUSED, (flags & TORRENT_ADD_FLAG_PAUSED) == TORRENT_ADD_FLAG_PAUSED); - g_free(encodedFile); + json_object_set_boolean_member(args, PARAM_PAUSED, (flags & TORRENT_ADD_FLAG_PAUSED)); if ((flags & TORRENT_ADD_FLAG_DELETE)) - g_unlink(filename); + g_unlink(target); return root; } diff --git a/src/session-get.c b/src/session-get.c index 25461d6..aec8e74 100644 --- a/src/session-get.c +++ b/src/session-get.c @@ -204,3 +204,8 @@ gint64 session_get_speed_limit_down(JsonObject * s) { return json_object_get_int_member(s, SGET_SPEED_LIMIT_DOWN); } + +gboolean session_get_dht_enabled(JsonObject *s) +{ + return json_object_get_boolean_member(s, SGET_DHT_ENABLED); +} diff --git a/src/session-get.h b/src/session-get.h index 38ab6e9..c43cb59 100644 --- a/src/session-get.h +++ b/src/session-get.h @@ -104,5 +104,6 @@ gboolean session_get_seed_queue_enabled(JsonObject * s); gint64 session_get_seed_queue_size(JsonObject * s); gint64 session_get_rpc_version(JsonObject * s); gint64 session_get_download_dir_free_space(JsonObject *s); +gboolean session_get_dht_enabled(JsonObject *s); #endif /* SESSION_GET_H_ */ diff --git a/src/trg-files-model.c b/src/trg-files-model.c index 956e6f5..3836398 100644 --- a/src/trg-files-model.c +++ b/src/trg-files-model.c @@ -132,6 +132,8 @@ trg_files_model_update(TrgFilesModel * model, gint64 updateSerial, { TrgFilesModelPrivate *priv = TRG_FILES_MODEL_GET_PRIVATE(model); GList *filesList, *li; + GtkTreeIter filesIter; + JsonObject *file; gint j = 0; priv->torrentId = torrent_get_id(t); @@ -144,8 +146,8 @@ trg_files_model_update(TrgFilesModel * model, gint64 updateSerial, gtk_list_store_clear(GTK_LIST_STORE(model)); priv->accept = TRUE; for (li = filesList; li; li = g_list_next(li)) { - JsonObject *file = json_node_get_object((JsonNode *) li->data); - GtkTreeIter filesIter; + file = json_node_get_object((JsonNode *) li->data); + trg_files_model_iter_new(model, &filesIter, file, j); trg_files_model_iter_update(model, &filesIter, file, priv->wanted, @@ -153,9 +155,22 @@ trg_files_model_update(TrgFilesModel * model, gint64 updateSerial, j++; } } else { + gint n_existing = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model), NULL); + gint n_updates = g_list_length(filesList); gtk_tree_model_foreach(GTK_TREE_MODEL(model), (GtkTreeModelForeachFunc) trg_files_model_update_foreach, filesList); + if (n_updates > n_existing) { + gint n_new = n_updates - n_existing; + for (j = n_updates - n_new; j < n_updates; j++) + { + file = json_node_get_object(g_list_nth_data(filesList, j)); + trg_files_model_iter_new(model, &filesIter, file, j); + trg_files_model_iter_update(model, &filesIter, + file, priv->wanted, + priv->priorities, j); + } + } } g_list_free(filesList); diff --git a/src/trg-torrent-add-url-dialog.c b/src/trg-torrent-add-url-dialog.c index 7a4c45f..44a74db 100644 --- a/src/trg-torrent-add-url-dialog.c +++ b/src/trg-torrent-add-url-dialog.c @@ -46,20 +46,47 @@ trg_torrent_add_url_dialog_class_init(TrgTorrentAddUrlDialogClass * klass) g_type_class_add_private(klass, sizeof(TrgTorrentAddUrlDialogPrivate)); } +static gboolean has_dht_support(TrgTorrentAddUrlDialog *dlg) +{ + TrgTorrentAddUrlDialogPrivate *priv = + TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(dlg); + JsonObject *session = trg_client_get_session(priv->client); + return session_get_dht_enabled(session); +} + +static void show_dht_not_enabled_warning(TrgTorrentAddUrlDialog *dlg) +{ + gchar *msg = _("You are trying to add a magnet torrent, but DHT is disabled. Distributed Hash Table (DHT) should be enabled in remote settings."); + GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(dlg), + GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, + "%s", msg); + gtk_window_set_title(GTK_WINDOW(dialog), _("Error")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + static void -trg_torrent_add_url_response_cb(GtkDialog * dlg, gint res_id, +trg_torrent_add_url_response_cb(TrgTorrentAddUrlDialog * dlg, gint res_id, gpointer data) { TrgTorrentAddUrlDialogPrivate *priv = TRG_TORRENT_ADD_URL_DIALOG_GET_PRIVATE(dlg); + if (res_id == GTK_RESPONSE_ACCEPT) { - JsonNode *request = - torrent_add_url(gtk_entry_get_text(GTK_ENTRY(priv->urlEntry)), + JsonNode *request; + const gchar *entryText = gtk_entry_get_text(GTK_ENTRY(priv->urlEntry)); + + if (g_str_has_prefix(entryText, "magnet:") && !has_dht_support(dlg)) + show_dht_not_enabled_warning(dlg); + + request = + torrent_add_url(entryText, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->startCheck))); dispatch_async(priv->client, request, on_generic_interactive_action, data); } + gtk_widget_destroy(GTK_WIDGET(dlg)); } -- cgit v1.2.3