1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include "protocol-constants.h"
#include "requests.h"
#include "trg-client.h"
#include "util.h"
#include "trg-main-window.h"
#include "json.h"
#include "upload.h"
static gboolean upload_complete_callback(gpointer data);
static void next_upload(trg_upload *upload);
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);
}
void trg_upload_free(trg_upload *upload) {
g_str_slist_free(upload->list);
g_free(upload->dir);
g_free(upload->uid);
g_free(upload->file_wanted);
g_free(upload->file_priorities);
trg_response_free(upload->upload_response);
g_free(upload);
}
static void add_priorities(JsonObject *args, gint* priorities, gint n_files)
{
gint i;
for (i = 0; i < n_files; i++) {
gint priority = priorities[i];
if (priority == TR_PRI_LOW)
add_file_id_to_array(args, FIELD_FILES_PRIORITY_LOW, i);
else if (priority == TR_PRI_HIGH)
add_file_id_to_array(args, FIELD_FILES_PRIORITY_HIGH, i);
else
add_file_id_to_array(args, FIELD_FILES_PRIORITY_NORMAL, i);
}
}
static void add_wanteds(JsonObject *args, gint* wanteds, gint n_files) {
gint i;
for (i = 0; i < n_files; i++) {
if (wanteds[i])
add_file_id_to_array(args, FIELD_FILES_WANTED, i);
else
add_file_id_to_array(args, FIELD_FILES_UNWANTED, i);
}
}
static void next_upload(trg_upload *upload) {
JsonNode *req = NULL;
if (upload->upload_response && upload->progress_index < 1)
req = torrent_add_from_response(upload->upload_response, upload->flags);
else if (upload->list && upload->progress_index < g_slist_length(upload->list))
req = torrent_add_from_file((gchar*)g_slist_nth_data(upload->list, upload->progress_index), upload->flags);
if (req) {
JsonObject *args = node_get_arguments(req);
if (upload->extra_args)
add_set_common_args(args, upload->priority, upload->dir);
if (upload->file_wanted)
add_wanteds(args, upload->file_wanted, upload->n_files);
if (upload->file_priorities)
add_priorities(args, upload->file_priorities, upload->n_files);
upload->progress_index++;
dispatch_async(upload->client, req, upload_complete_callback, upload);
} else {
trg_upload_free(upload);
}
}
static gboolean upload_complete_callback(gpointer data) {
trg_response *response = (trg_response*)data;
trg_upload *upload = (trg_upload*)response->cb_data;
if (upload->callback)
upload->callback(data);
/* the callback we're delegating to will destroy the response */
if (upload->main_window)
on_generic_interactive_action(upload->main_window, response);
else
trg_response_free(response);
next_upload(upload);
return FALSE;
}
void trg_do_upload(trg_upload *upload)
{
next_upload(upload);
}
|