From 9cc8920afb3e2b1274ce36e1a0a8033783ae15e8 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Wed, 13 Apr 2011 23:22:27 +0000 Subject: handle broken torrent files properly --- src/dispatch.c | 18 +++++++----------- src/requests.c | 3 ++- src/trg-cell-renderer-wanted.h | 1 - src/trg-client.c | 1 + src/trg-torrent-add-dialog.c | 33 ++++++++++++++++++++------------- 5 files changed, 30 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/dispatch.c b/src/dispatch.c index 70a6cc6..b5fc216 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -27,7 +27,7 @@ #include "http.h" #include "json.h" -static void dispatch_async_threadfunc(gpointer task, gpointer user_data); +static void dispatch_async_threadfunc(struct DispatchAsyncData *task, trg_client *client); JsonObject *dispatch(trg_client * client, JsonNode * req, int *status) { @@ -74,22 +74,18 @@ JsonObject *dispatch(trg_client * client, JsonNode * req, int *status) return deserialized; } -static void dispatch_async_threadfunc(gpointer task, gpointer user_data) +static void dispatch_async_threadfunc(struct DispatchAsyncData *task, trg_client *client) { - trg_client *client = (trg_client*)user_data; - struct DispatchAsyncData *args = (struct DispatchAsyncData*)task; - int status; - JsonObject *result = dispatch(client, args->req, &status); - if (args->callback) - args->callback(result, status, args->data); - g_free(args); + JsonObject *result = dispatch(client, task->req, &status); + if (task->callback) + task->callback(result, status, task->data); + g_free(task); } GThreadPool *dispatch_init_pool(trg_client *client) { - GThreadPool *pool = g_thread_pool_new((GFunc)dispatch_async_threadfunc, client, DISPATCH_POOL_SIZE, FALSE, NULL); - return pool; + return g_thread_pool_new((GFunc)dispatch_async_threadfunc, client, DISPATCH_POOL_SIZE, FALSE, NULL); } gboolean dispatch_async(trg_client * client, JsonNode * req, diff --git a/src/requests.c b/src/requests.c index 36363bf..a891364 100644 --- a/src/requests.c +++ b/src/requests.c @@ -175,7 +175,8 @@ JsonNode *torrent_add(gchar * filename, gboolean paused) JsonNode *root = base_request(METHOD_TORRENT_ADD); JsonObject *args = node_get_arguments(root); gchar *encodedFile = base64encode(filename); - json_object_set_string_member(args, PARAM_METAINFO, encodedFile); + if (encodedFile) + json_object_set_string_member(args, PARAM_METAINFO, encodedFile); json_object_set_boolean_member(args, PARAM_PAUSED, paused); g_free(encodedFile); return root; diff --git a/src/trg-cell-renderer-wanted.h b/src/trg-cell-renderer-wanted.h index f8f83d8..9f73206 100644 --- a/src/trg-cell-renderer-wanted.h +++ b/src/trg-cell-renderer-wanted.h @@ -17,7 +17,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - #ifndef TRG_CELL_RENDERER_WANTED_H_ #define TRG_CELL_RENDERER_WANTED_H_ diff --git a/src/trg-client.c b/src/trg-client.c index af02bc0..0ef1f2d 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -32,6 +32,7 @@ #include "trg-client.h" #include "trg-preferences.h" #include "util.h" +#include "dispatch.h" gboolean trg_client_supports_tracker_edit(trg_client * tc) { diff --git a/src/trg-torrent-add-dialog.c b/src/trg-torrent-add-dialog.c index 3c0ffc9..5ea7a6a 100644 --- a/src/trg-torrent-add-dialog.c +++ b/src/trg-torrent-add-dialog.c @@ -154,7 +154,7 @@ static gpointer add_files_threadfunc(gpointer data) (struct add_torrent_threadfunc_args *) data; GSList *li; - for (li = files_thread_data->list; li != NULL; li = g_slist_next(li)) { + for (li = files_thread_data->list; li; li = g_slist_next(li)) { JsonNode *request = torrent_add((gchar *) li->data, files_thread_data->paused); JsonObject *args = node_get_arguments(request); @@ -455,7 +455,6 @@ onViewPathToggled(GtkTreeView * view, (G_OBJECT(col), TR_COLUMN_ID_KEY)); if ((cid == FC_PRIORITY) || (cid == FC_ENABLED)) { GtkTreeIter iter; - /*GArray *indices = getActiveFilesForPath(view, path); */ GtkTreeModel *model = gtk_tree_view_get_model(view); gtk_tree_model_get_iter(model, &iter, path); @@ -745,11 +744,19 @@ static void store_add_node(GtkTreeStore * store, GtkTreeIter * parent, } } - for (li = node->children; li != NULL; li = g_list_next(li)) + for (li = node->children; li; li = g_list_next(li)) store_add_node(store, node->name ? &child : NULL, (trg_torrent_file_node *) li->data); } +static void torrent_not_parsed_warning(GtkWindow *parent) +{ + GtkWidget *dialog = gtk_message_dialog_new(parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("Unable to parse torrent file. File preferences unavailable, but you can still try uploading it.")); + gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + static void trg_torrent_add_dialog_set_filenames(TrgTorrentAddDialog * d, GSList * filenames) { @@ -764,11 +771,18 @@ static void trg_torrent_add_dialog_set_filenames(TrgTorrentAddDialog * d, gchar *file_name = (gchar *) filenames->data; gchar *file_name_base = g_path_get_basename(file_name); trg_torrent_file *tor_data = trg_parse_torrent_file(file_name); - store_add_node(priv->store, NULL, tor_data->top_node); - trg_torrent_file_free(tor_data); + gtk_button_set_label(chooser, file_name_base); g_free(file_name_base); - gtk_widget_set_sensitive(priv->file_list, TRUE); + + if (!tor_data) { + torrent_not_parsed_warning(GTK_WINDOW(priv->parent)); + gtk_widget_set_sensitive(priv->file_list, FALSE); + } else { + store_add_node(priv->store, NULL, tor_data->top_node); + trg_torrent_file_free(tor_data); + gtk_widget_set_sensitive(priv->file_list, TRUE); + } } else { gtk_widget_set_sensitive(priv->file_list, FALSE); if (nfiles < 1) { @@ -918,13 +932,6 @@ static GObject *trg_torrent_add_dialog_constructor(GType type, ++col; priv->dest_combo = trg_destination_folder_new(priv->client); - /*if( !gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( w ), - data->downloadDir ) ) - g_warning( "couldn't select '%s'", data->downloadDir ); - list = get_recent_destinations( ); - for( walk = list; walk; walk = walk->next ) - gtk_file_chooser_add_shortcut_folder( GTK_FILE_CHOOSER( w ), walk->data, NULL ); - g_slist_free( list ); */ gtk_table_attach(GTK_TABLE(t), priv->dest_combo, col, col + 1, row, row + 1, ~0, 0, 0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(l), priv->dest_combo); -- cgit v1.2.3