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.c99
1 files changed, 68 insertions, 31 deletions
diff --git a/src/trg-torrent-add-dialog.c b/src/trg-torrent-add-dialog.c
index 702efd4..aa63166 100644
--- a/src/trg-torrent-add-dialog.c
+++ b/src/trg-torrent-add-dialog.c
@@ -48,7 +48,7 @@
#include "upload.h"
enum {
- PROP_0, PROP_FILENAME, PROP_PARENT, PROP_CLIENT, PROP_RESPONSE
+ PROP_0, PROP_FILENAME, PROP_PARENT, PROP_CLIENT, PROP_UPLOAD
};
enum {
@@ -64,7 +64,7 @@ struct _TrgTorrentAddDialogPrivate {
TrgClient *client;
TrgMainWindow *parent;
GSList *filenames;
- trg_response *response;
+ trg_upload *upload;
GtkWidget *source_chooser;
GtkWidget *dest_combo;
GtkWidget *priority_combo;
@@ -72,6 +72,7 @@ struct _TrgTorrentAddDialogPrivate {
GtkTreeStore *store;
GtkWidget *paused_check;
GtkWidget *delete_check;
+ guint n_files;
};
#define MAGNET_MAX_LINK_WIDTH 75
@@ -92,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;
@@ -123,7 +127,7 @@ add_file_indexes_foreachfunc(GtkTreeModel * model,
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,
@@ -132,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;
}
@@ -168,10 +163,15 @@ 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;
- trg_upload *upload = g_new0(trg_upload, 1);
+ if (priv->upload) {
+ upload = priv->upload;
+ } else {
+ upload = g_new0(trg_upload, 1);
+ upload->list = priv->filenames;
+ }
- upload->list = priv->filenames;
upload->main_window = priv->parent;
upload->client = priv->client;
upload->dir = dir;
@@ -179,12 +179,17 @@ trg_torrent_add_response_cb(GtkDialog * dlg, gint res_id, gpointer data)
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);
}
@@ -393,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;
@@ -404,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)
@@ -439,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)
{
@@ -449,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)) {
@@ -484,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 {
@@ -712,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);
@@ -796,10 +833,10 @@ trg_torrent_add_dialog_class_init(TrgTorrentAddDialogClass * klass)
G_PARAM_STATIC_BLURB));
g_object_class_install_property(object_class,
- PROP_RESPONSE,
- g_param_spec_pointer("response",
- "response",
- "response",
+ PROP_UPLOAD,
+ g_param_spec_pointer("upload",
+ "upload",
+ "upload",
G_PARAM_READWRITE
|
G_PARAM_CONSTRUCT_ONLY
@@ -854,12 +891,12 @@ TrgTorrentAddDialog *trg_torrent_add_dialog_new_from_filenames(TrgMainWindow * p
NULL);
}
-TrgTorrentAddDialog *trg_torrent_add_dialog_new_from_response(TrgMainWindow * parent,
+TrgTorrentAddDialog *trg_torrent_add_dialog_new_from_upload(TrgMainWindow * parent,
TrgClient * client,
- trg_response *response)
+ trg_upload *upload)
{
- return g_object_new(TRG_TYPE_TORRENT_ADD_DIALOG, "response",
- response, "parent", parent, "client", client,
+ return g_object_new(TRG_TYPE_TORRENT_ADD_DIALOG, "upload",
+ upload, "parent", parent, "client", client,
NULL);
}