summaryrefslogtreecommitdiff
path: root/src/trg-torrent-add-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/trg-torrent-add-dialog.c')
-rw-r--r--src/trg-torrent-add-dialog.c214
1 files changed, 101 insertions, 113 deletions
diff --git a/src/trg-torrent-add-dialog.c b/src/trg-torrent-add-dialog.c
index 517797e..aa63166 100644
--- a/src/trg-torrent-add-dialog.c
+++ b/src/trg-torrent-add-dialog.c
@@ -45,9 +45,10 @@
#include "torrent.h"
#include "json.h"
#include "protocol-constants.h"
+#include "upload.h"
enum {
- PROP_0, PROP_FILENAME, PROP_PARENT, PROP_CLIENT
+ PROP_0, PROP_FILENAME, PROP_PARENT, PROP_CLIENT, PROP_UPLOAD
};
enum {
@@ -63,6 +64,7 @@ struct _TrgTorrentAddDialogPrivate {
TrgClient *client;
TrgMainWindow *parent;
GSList *filenames;
+ trg_upload *upload;
GtkWidget *source_chooser;
GtkWidget *dest_combo;
GtkWidget *priority_combo;
@@ -70,6 +72,7 @@ struct _TrgTorrentAddDialogPrivate {
GtkTreeStore *store;
GtkWidget *paused_check;
GtkWidget *delete_check;
+ guint n_files;
};
#define MAGNET_MAX_LINK_WIDTH 75
@@ -90,6 +93,9 @@ static void trg_torrent_add_dialog_set_property(GObject * object,
case PROP_PARENT:
priv->parent = g_value_get_object(value);
break;
+ case PROP_UPLOAD:
+ priv->upload = g_value_get_pointer(value);
+ break;
case PROP_CLIENT:
priv->client = g_value_get_pointer(value);
break;
@@ -115,72 +121,13 @@ trg_torrent_add_dialog_get_property(GObject * object,
}
}
-static void
-add_set_common_args(JsonObject * args, gint priority, gchar * dir)
-{
- json_object_set_string_member(args, FIELD_FILE_DOWNLOAD_DIR, dir);
- json_object_set_int_member(args, FIELD_BANDWIDTH_PRIORITY,
- (gint64) priority);
-}
-
-static gpointer add_files_threadfunc(gpointer data)
-{
- struct add_torrent_threadfunc_args *files_thread_data =
- (struct add_torrent_threadfunc_args *) data;
-
- GSList *li;
-
- for (li = files_thread_data->list; li; li = g_slist_next(li)) {
- gchar *fileName = (gchar *) li->data;
- JsonNode *request =
- torrent_add(fileName, files_thread_data->flags);
- JsonObject *args;
- trg_response *response;
-
- if (!request)
- continue;
-
- args = node_get_arguments(request);
-
- if (files_thread_data->extraArgs)
- add_set_common_args(args, files_thread_data->priority,
- files_thread_data->dir);
-
- response = dispatch(files_thread_data->client, request);
- response->cb_data = files_thread_data->cb_data;
- g_idle_add(on_generic_interactive_action, response);
- }
-
- g_str_slist_free(files_thread_data->list);
-
- if (files_thread_data->extraArgs)
- g_free(files_thread_data->dir);
-
- g_free(files_thread_data);
-
- return NULL;
-}
-
-void launch_add_thread(struct add_torrent_threadfunc_args *args)
-{
- GError *error = NULL;
- g_thread_create(add_files_threadfunc, args, FALSE, &error);
-
- if (error) {
- g_error("thread creation error: %s", error->message);
- g_error_free(error);
- g_str_slist_free(args->list);
- g_free(args);
- }
-}
-
static gboolean
add_file_indexes_foreachfunc(GtkTreeModel * model,
GtkTreePath *
path G_GNUC_UNUSED,
GtkTreeIter * iter, gpointer data)
{
- JsonObject *args = (JsonObject *) data;
+ trg_upload *upload = (trg_upload *) data;
gint priority, index, wanted;
gtk_tree_model_get(model, iter, FC_PRIORITY, &priority, FC_ENABLED,
@@ -189,17 +136,8 @@ add_file_indexes_foreachfunc(GtkTreeModel * model,
if (gtk_tree_model_iter_has_child(model, iter) || index < 0)
return FALSE;
- if (wanted)
- add_file_id_to_array(args, FIELD_FILES_WANTED, index);
- else
- add_file_id_to_array(args, FIELD_FILES_UNWANTED, index);
-
- if (priority == TR_PRI_LOW)
- add_file_id_to_array(args, FIELD_FILES_PRIORITY_LOW, index);
- else if (priority == TR_PRI_HIGH)
- add_file_id_to_array(args, FIELD_FILES_PRIORITY_HIGH, index);
- else
- add_file_id_to_array(args, FIELD_FILES_PRIORITY_NORMAL, index);
+ upload->file_wanted[index] = wanted;
+ upload->file_priorities[index] = priority;
return FALSE;
}
@@ -225,38 +163,33 @@ trg_torrent_add_response_cb(GtkDialog * dlg, gint res_id, gpointer data)
gchar *dir =
trg_destination_combo_get_dir(TRG_DESTINATION_COMBO
(priv->dest_combo));
+ trg_upload *upload;
- if (g_slist_length(priv->filenames) == 1) {
- JsonNode *req =
- torrent_add((gchar *) priv->filenames->data, flags);
- if (req) {
- JsonObject *args = node_get_arguments(req);
- gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store),
- add_file_indexes_foreachfunc, args);
- add_set_common_args(args, priority, dir);
- dispatch_async(priv->client, req,
- on_generic_interactive_action,
- priv->parent);
- }
- g_str_slist_free(priv->filenames);
+ if (priv->upload) {
+ upload = priv->upload;
} else {
- struct add_torrent_threadfunc_args *args =
- g_new(struct add_torrent_threadfunc_args, 1);
- args->list = priv->filenames;
- args->cb_data = priv->parent;
- args->client = priv->client;
- args->dir = g_strdup(dir);
- args->priority = priority;
- args->flags = flags;
- args->extraArgs = TRUE;
-
- launch_add_thread(args);
+ upload = g_new0(trg_upload, 1);
+ upload->list = priv->filenames;
}
+ upload->main_window = priv->parent;
+ upload->client = priv->client;
+ upload->dir = dir;
+ upload->priority = priority;
+ upload->flags = flags;
+ upload->extra_args = TRUE;
+
+ upload->n_files = priv->n_files;
+ upload->file_priorities = g_new0(gint, priv->n_files);
+ upload->file_wanted = g_new0(gint, priv->n_files);
+
+ gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store),
+ add_file_indexes_foreachfunc, upload);
+
+ trg_do_upload(upload);
+
trg_destination_combo_save_selection(TRG_DESTINATION_COMBO
(priv->dest_combo));
-
- g_free(dir);
} else {
g_str_slist_free(priv->filenames);
}
@@ -465,7 +398,7 @@ static void addTorrentFilters(GtkFileChooser * chooser)
static void
store_add_node(GtkTreeStore * store, GtkTreeIter * parent,
- trg_files_tree_node * node)
+ trg_files_tree_node * node, guint *n_files)
{
GtkTreeIter child;
GList *li;
@@ -476,11 +409,12 @@ store_add_node(GtkTreeStore * store, GtkTreeIter * parent,
1, FC_INDEX, node->index,
FC_PRIORITY, TR_PRI_NORMAL,
FC_SIZE, node->length, -1);
+ *n_files = *n_files + 1;
}
for (li = node->children; li; li = g_list_next(li))
store_add_node(store, node->name ? &child : NULL,
- (trg_files_tree_node *) li->data);
+ (trg_files_tree_node *) li->data, n_files);
}
static void torrent_not_parsed_warning(GtkWindow * parent)
@@ -511,6 +445,28 @@ static void torrent_not_found_error(GtkWindow * parent, gchar * file)
}
static void
+trg_torrent_add_dialog_set_upload(TrgTorrentAddDialog *d, trg_upload *upload) {
+ TrgTorrentAddDialogPrivate *priv =
+ TRG_TORRENT_ADD_DIALOG_GET_PRIVATE(d);
+ GtkButton *chooser = GTK_BUTTON(priv->source_chooser);
+ trg_torrent_file *tor_data = NULL;
+
+ if (upload->uid)
+ gtk_button_set_label(chooser, upload->uid);
+
+ tor_data = trg_parse_torrent_data(upload->upload_response->raw, upload->upload_response->size);
+
+ if (!tor_data) {
+ torrent_not_parsed_warning(GTK_WINDOW(priv->parent));
+ } else {
+ store_add_node(priv->store, NULL, tor_data->top_node, &priv->n_files);
+ trg_torrent_file_free(tor_data);
+ }
+
+ gtk_widget_set_sensitive(priv->file_list, tor_data != NULL);
+}
+
+static void
trg_torrent_add_dialog_set_filenames(TrgTorrentAddDialog * d,
GSList * filenames)
{
@@ -521,6 +477,11 @@ trg_torrent_add_dialog_set_filenames(TrgTorrentAddDialog * d,
gtk_tree_store_clear(priv->store);
+ if (priv->upload) {
+ trg_upload_free(priv->upload);
+ priv->upload = NULL;
+ }
+
if (nfiles == 1) {
gchar *file_name = (gchar *) filenames->data;
if (is_url(file_name) || is_magnet(file_name)) {
@@ -556,7 +517,7 @@ trg_torrent_add_dialog_set_filenames(TrgTorrentAddDialog * d,
if (!tor_data) {
torrent_not_parsed_warning(GTK_WINDOW(priv->parent));
} else {
- store_add_node(priv->store, NULL, tor_data->top_node);
+ store_add_node(priv->store, NULL, tor_data->top_node, &priv->n_files);
trg_torrent_file_free(tor_data);
}
} else {
@@ -784,8 +745,12 @@ static GObject *trg_torrent_add_dialog_constructor(GType type,
priv->source_chooser = gtk_button_new();
gtk_button_set_alignment(GTK_BUTTON(priv->source_chooser), 0.0f, 0.5f);
- trg_torrent_add_dialog_set_filenames(TRG_TORRENT_ADD_DIALOG(obj),
- priv->filenames);
+
+ if (priv->filenames)
+ trg_torrent_add_dialog_set_filenames(TRG_TORRENT_ADD_DIALOG(obj),
+ priv->filenames);
+ else if (priv->upload)
+ trg_torrent_add_dialog_set_upload(TRG_TORRENT_ADD_DIALOG(obj), priv->upload);
gtk_table_attach(GTK_TABLE(t), priv->source_chooser, 1, 2, 0,
1, ~0, 0, 0, 0);
@@ -868,6 +833,21 @@ trg_torrent_add_dialog_class_init(TrgTorrentAddDialogClass * klass)
G_PARAM_STATIC_BLURB));
g_object_class_install_property(object_class,
+ PROP_UPLOAD,
+ g_param_spec_pointer("upload",
+ "upload",
+ "upload",
+ G_PARAM_READWRITE
+ |
+ G_PARAM_CONSTRUCT_ONLY
+ |
+ G_PARAM_STATIC_NAME
+ |
+ G_PARAM_STATIC_NICK
+ |
+ G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property(object_class,
PROP_CLIENT,
g_param_spec_pointer("client",
"client",
@@ -902,7 +882,7 @@ static void trg_torrent_add_dialog_init(TrgTorrentAddDialog * self)
{
}
-TrgTorrentAddDialog *trg_torrent_add_dialog_new(TrgMainWindow * parent,
+TrgTorrentAddDialog *trg_torrent_add_dialog_new_from_filenames(TrgMainWindow * parent,
TrgClient * client,
GSList * filenames)
{
@@ -911,6 +891,15 @@ TrgTorrentAddDialog *trg_torrent_add_dialog_new(TrgMainWindow * parent,
NULL);
}
+TrgTorrentAddDialog *trg_torrent_add_dialog_new_from_upload(TrgMainWindow * parent,
+ TrgClient * client,
+ trg_upload *upload)
+{
+ return g_object_new(TRG_TYPE_TORRENT_ADD_DIALOG, "upload",
+ upload, "parent", parent, "client", client,
+ NULL);
+}
+
void trg_torrent_add_dialog(TrgMainWindow * win, TrgClient * client)
{
GtkWidget *w;
@@ -937,22 +926,21 @@ void trg_torrent_add_dialog(TrgMainWindow * win, TrgClient * client)
prefs);
if (showOptions) {
- TrgTorrentAddDialog *dialog = trg_torrent_add_dialog_new(win,
+ TrgTorrentAddDialog *dialog = trg_torrent_add_dialog_new_from_filenames(win,
client,
l);
gtk_widget_show_all(GTK_WIDGET(dialog));
} else {
- struct add_torrent_threadfunc_args *args =
- g_new0(struct add_torrent_threadfunc_args, 1);
+ trg_upload *upload = g_new0(trg_upload, 1);
- args->list = l;
- args->cb_data = win;
- args->client = client;
- args->extraArgs = FALSE;
- args->flags = trg_prefs_get_add_flags(prefs);
+ upload->list = l;
+ upload->main_window = win;
+ upload->client = client;
+ upload->extra_args = FALSE;
+ upload->flags = trg_prefs_get_add_flags(prefs);
- launch_add_thread(args);
+ trg_do_upload(upload);
}
}