summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/requests.c29
-rw-r--r--src/session-get.c5
-rw-r--r--src/session-get.h1
-rw-r--r--src/trg-files-model.c19
-rw-r--r--src/trg-torrent-add-url-dialog.c33
5 files changed, 73 insertions, 14 deletions
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));
}