summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-10-01 18:09:23 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-10-01 18:09:23 +0000
commit786bfb4ef30c02d2aa1336effcf258d786857def (patch)
treefc597ed2b42626ab3dd259623e70f9791ab7c06d /src
parentd5df15f1fec2971e05a9352585414d92580b7ab1 (diff)
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).
Diffstat (limited to 'src')
-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));
}