Statistics
| Revision:

root / trunk / base / nzbcreator.c @ 1854

History | View | Annotate | Download (22.1 KB)

1
/* 
2
    Copyright (C) 2005-2010  Erik van Pienbroek
3

                
4
    This program is free software; you can redistribute it and/or modify
5
    it under the terms of the GNU General Public License as published by
6
    the Free Software Foundation; either version 2 of the License, or
7
    (at your option) any later version.
8

                
9
    This program is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU General Public License for more details.
13

                
14
    You should have received a copy of the GNU General Public License
15
    along with this program; if not, write to the Free Software
16
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
*/
18

                
19
#ifdef HAVE_CONFIG_H
20
#include "config.h"
21
#endif
22

                
23
#include 
24
#include 
25
#include 
26
#ifdef HAVE_SOUP
27
#include 
28
#endif
29
#ifdef HAVE_SOUP_GNOME
30
#include 
31
#endif
32
#include "nntpgrab_utils.h"
33
#include "nntpgrab_types.h"
34

                
35
#define URI "https://www.nntpgrab.nl/onlinesearch/search.php"
36

                
37
#ifdef HAVE_SOUP
38
static void authenticate_cb(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data)
39
{
40
    soup_auth_authenticate(auth, "guest", "guest");
41
}
42
#endif
43

                
44
ngboolean
45
nntpgrab_utils_nzbcreator_check_api_version(ngboolean *api_okay, char **errmsg)
46
{
47
#ifdef HAVE_SOUP
48
    int result = 0;
49
    SoupSession *session;
50
    SoupMessage *msg;
51
    GError *err = NULL;
52

                
53
    g_return_val_if_fail(api_okay != NULL, FALSE);
54

                
55
    session = soup_session_sync_new_with_options("timeout", 30, NULL);
56

                
57
#ifdef HAVE_SOUP_GNOME
58
    /* Enable proxy support when using GNOME 2.26.0 or higher */
59
    soup_session_add_feature_by_type(session, SOUP_TYPE_GNOME_FEATURES_2_26);
60
#endif
61

                
62
#ifdef HAVE_SOUP_GZIP
63
    /* Enable gzip compression */
64
    soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER);
65
#endif
66

                
67
    g_signal_connect (session, "authenticate", G_CALLBACK(authenticate_cb), NULL);
68

                
69
    msg = soup_xmlrpc_request_new(URI, "getProtocolVersion", G_TYPE_INVALID);
70
    soup_session_send_message(session, msg);
71

                
72
    if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
73
        if (errmsg) {
74
            *errmsg = g_strdup(msg->reason_phrase);
75
        }
76

                
77
        g_object_unref(msg);
78
        g_object_unref(session);
79
        return FALSE;
80
    }
81

                
82
    if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, &err, G_TYPE_INT, &result)) {
83
        if (err) {
84
            if (errmsg) {
85
                *errmsg = g_strdup(err->message);
86
            }
87

                
88
            g_error_free(err);
89
        }
90

                
91
        g_object_unref(msg);
92
        g_object_unref(session);
93

                
94
        return FALSE;
95
    }
96

                
97
    g_object_unref(msg);
98
    g_object_unref(session);
99

                
100
    if (result == 20110711) {
101
        *api_okay = TRUE;
102
    } else {
103
        *api_okay = FALSE;
104
    }
105

                
106
    return TRUE;
107
#else
108
    if (errmsg) {
109
        *errmsg = g_strdup(_("Support for the Online Search hasn't been enabled in this build. Please rebuild NNTPGrab to enable this feature"));
110
    }
111
    return FALSE;
112
#endif
113
}
114

                
115
void
116
nntpgrab_utils_nzbcreator_free_groups(NGList *groups)
117
{
118
    NGList *list = groups;
119
    while (list) {
120
        g_slice_free(NZBCreatorGroup, list->data);
121
        list = ng_list_next(list);
122
    }
123
    ng_list_free(groups);
124
}
125

                
126
NGList *
127
nntpgrab_utils_nzbcreator_get_all_groups(char **errmsg)
128
{
129
    NGList *ret = NULL;
130

                
131
#ifndef HAVE_SOUP
132
    if (errmsg) {
133
        *errmsg = g_strdup(_("Support for the Online Search hasn't been enabled in this build. Please rebuild NNTPGrab to enable this feature"));
134
    }
135
#else
136
    SoupSession *session = soup_session_sync_new_with_options("timeout", 30, NULL);
137
    SoupMessage *msg = soup_xmlrpc_request_new(URI, "getListOfAvailableGroups", G_TYPE_INVALID);
138
    GError *err = NULL;
139
    int i;
140
    GValueArray *result = NULL;
141
    GHashTable *group_arr = NULL;
142

                
143
#ifdef SOUP_TYPE_GNOME_FEATURES_2_26
144
    /* Enable proxy support when using GNOME 2.26.0 or higher */
145
    soup_session_add_feature_by_type(session, SOUP_TYPE_GNOME_FEATURES_2_26);
146
#endif
147

                
148
#ifdef HAVE_SOUP_GZIP
149
    /* Enable gzip compression */
150
    soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER);
151
#endif
152

                
153
    g_signal_connect (session, "authenticate", G_CALLBACK(authenticate_cb), NULL);
154

                
155
    soup_session_send_message(session, msg);
156
    if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
157
        if (errmsg) {
158
            *errmsg = g_strdup_printf(_("Server returned unknown error: %s (%i)"), msg->reason_phrase, msg->status_code);
159
        }
160
        g_object_unref(msg);
161
        g_object_unref(session);
162
        return NULL;
163
    }
164

                
165
    if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, &err, G_TYPE_VALUE_ARRAY, &result)) {
166
        if (errmsg) {
167
            if (err) {
168
                *errmsg = g_strdup_printf(_("An error occured while retrieving the list of Online Search groups:\n%s"), err->message);
169
            } else {
170
                *errmsg = g_strdup_printf(_("%s:%i Unable to parse reply from server. See the console for more details"), __FILE__, __LINE__);
171
            }
172
        }
173

                
174
        if (err) {
175
            g_error_free(err);
176
        }
177

                
178
        g_object_unref(msg);
179
        g_object_unref(session);
180

                
181
        return NULL;
182
    }
183

                
184
    for (i = 0; i < result->n_values; i++) {
185
        NZBCreatorGroup *group;
186
        char *groupname = NULL;
187
        int group_id = -1;
188

                
189
        if (!soup_value_array_get_nth(result, i, G_TYPE_HASH_TABLE, &group_arr)) {
190
            g_warning(_("%s:%i Unable to parse values"), __FILE__, __LINE__);
191
            continue;
192
        }
193

                
194
        if (!soup_value_hash_lookup_vals(group_arr, "group_id", G_TYPE_INT, &group_id, "newsgroup", G_TYPE_STRING, &groupname, NULL)) {
195
            g_warning(_("%s:%i Unable to parse values"), __FILE__, __LINE__);
196
            g_hash_table_destroy(group_arr);
197
            continue;
198
        }
199

                
200
        group = g_slice_new0(NZBCreatorGroup);
201
        strncpy(group->newsgroup, groupname, sizeof(group->newsgroup) - 1);
202
        group->group_id = group_id;
203

                
204
        ret = ng_list_append(ret, group);
205
    }
206

                
207
    g_value_array_free(result);
208

                
209
    g_object_unref(msg);
210
    g_object_unref(session);
211
#endif
212

                
213
    return ret;
214
}
215

                
216
void
217
nntpgrab_utils_nzbcreator_free_result(NZBCreatorSearchResult *result)
218
{
219
    NGList *list;
220

                
221
    list = result->collections;
222
    while (list) {
223
        g_slice_free(NZBCreatorCollection, list->data);
224
        list = ng_list_next(list);
225
    }
226

                
227
    g_list_free((GList*) result->collections);
228
    g_slice_free(NZBCreatorSearchResult, result);
229
}
230

                
231
NZBCreatorSearchResult *
232
nntpgrab_utils_nzbcreator_perform_search(NZBCreatorSearchOpts opts, char **errmsg)
233
{
234
    NZBCreatorSearchResult *result = NULL;
235

                
236
#ifndef HAVE_SOUP
237
    if (errmsg) {
238
        *errmsg = g_strdup(_("Support for the Online Search hasn't been enabled in this build. Please rebuild NNTPGrab to enable this feature"));
239
    }
240
#else
241
    SoupSession *session;
242
    SoupMessage *msg;
243
    GHashTable *args;
244
    GError *err = NULL;
245
    GHashTable *rpc_result = NULL;
246
    GValueArray *matches = NULL;
247
    int i;
248

                
249
    g_return_val_if_fail(strlen(opts.query) > 0, FALSE);
250
    g_return_val_if_fail(opts.max_age <= 150, FALSE);
251
    g_return_val_if_fail(opts.percentage_complete <= 100, FALSE);
252

                
253
    session = soup_session_sync_new_with_options("timeout", 30, NULL);
254

                
255
#ifdef SOUP_TYPE_GNOME_FEATURES_2_26
256
    /* Enable proxy support when using GNOME 2.26.0 or higher */
257
    soup_session_add_feature_by_type(session, SOUP_TYPE_GNOME_FEATURES_2_26);
258
#endif
259

                
260
#ifdef HAVE_SOUP_GZIP
261
    /* Enable gzip compression */
262
    soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER);
263
#endif
264

                
265
    g_signal_connect (session, "authenticate", G_CALLBACK(authenticate_cb), NULL);
266

                
267
    args = soup_value_hash_new_with_vals(   "query", G_TYPE_STRING, opts.query,
268
                                            "search_only_in", G_TYPE_INT, opts.search_only_in,
269
                                            "max_age", G_TYPE_INT, opts.max_age,
270
                                            "offset", G_TYPE_INT, opts.offset,
271
                                            NULL);
272

                
273
    if (strlen(opts.username) > 0 && strlen(opts.password) > 0) {
274
        soup_value_hash_insert(args, "username", G_TYPE_STRING, opts.username);
275
        soup_value_hash_insert(args, "password", G_TYPE_STRING, opts.password);
276
    }
277

                
278
    if (opts.minimal_file_size > 0) {
279
        /* Libsoup doesn't support 64bit integers as XML-RPC parameters */
280
        char *tmp = g_strdup_printf("%"G_GUINT64_FORMAT, opts.minimal_file_size);
281
        soup_value_hash_insert(args, "minimal_file_size", G_TYPE_STRING, tmp);
282
        g_free(tmp);
283
    }
284
    if (opts.maximal_file_size > 0) {
285
        char *tmp = g_strdup_printf("%"G_GUINT64_FORMAT, opts.maximal_file_size);
286
        soup_value_hash_insert(args, "maximal_file_size", G_TYPE_STRING, tmp);
287
        g_free(tmp);
288
    }
289
    if (opts.percentage_complete > 0) {
290
        soup_value_hash_insert(args, "percentage_complete", G_TYPE_INT, opts.percentage_complete);
291
    }
292
    if (opts.group_to_search > 0) {
293
        soup_value_hash_insert(args, "group_to_search", G_TYPE_INT, opts.group_to_search);
294
    }
295
    if (opts.file_type != NNTP_FILE_TYPE_UNKNOWN) {
296
        soup_value_hash_insert(args, "file_type", G_TYPE_INT, opts.file_type);
297
    }
298

                
299
    msg = soup_xmlrpc_request_new(URI, "performSearch", G_TYPE_HASH_TABLE, args, G_TYPE_INVALID);
300

                
301
    soup_session_send_message(session, msg);
302

                
303
    g_hash_table_destroy(args);
304

                
305
    if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
306
        if (errmsg) {
307
            *errmsg = g_strdup_printf(_("Server returned unknown error: %s (%i)"), msg->reason_phrase, msg->status_code);
308
        }
309
        g_object_unref(msg);
310
        g_object_unref(session);
311
        return NULL;
312
    }
313

                
314
    if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, &err, G_TYPE_HASH_TABLE, &rpc_result)) {
315
        if (errmsg) {
316
            if (err) {
317
                *errmsg = g_strdup_printf(_("An error occured while performing the search:\n%s"), err->message);
318
            } else {
319
                *errmsg = g_strdup_printf(_("%s:%i Unable to parse reply from server. See the console for more details"), __FILE__, __LINE__);
320
            }
321
        }
322

                
323
        if (err) {
324
            g_error_free(err);
325
        }
326

                
327
        g_object_unref(msg);
328
        g_object_unref(session);
329

                
330
        return NULL;
331
    }
332

                
333
    result = g_slice_new0(NZBCreatorSearchResult);
334
    if (!soup_value_hash_lookup_vals(rpc_result,    "number_of_hits", G_TYPE_INT, &result->number_of_hits,
335
                                                    "number_of_results", G_TYPE_INT, &result->number_of_results,
336
                                                    "results_per_page", G_TYPE_INT, &result->results_per_page,
337
                                                    "offset", G_TYPE_INT, &result->offset,
338
                                                    "matches", G_TYPE_VALUE_ARRAY, &matches,
339
                                                    NULL)) {
340
        g_warning(_("%s:%i Unable to parse values"), __FILE__, __LINE__);
341
        g_slice_free(NZBCreatorSearchResult, result);
342
        g_hash_table_destroy(rpc_result);
343
        g_object_unref(msg);
344
        g_object_unref(session);
345
        return NULL;
346
    }
347

                
348
    for (i = 0; i < matches->n_values; i++) {
349
        NZBCreatorCollection *collection;
350
        GHashTable *hash_collection = NULL;
351
        int collection_id = 0;
352
        char *collection_name;
353
        char *short_collection_name;
354
        char *poster;
355
        char *newsgroup;
356
        int stamp = 0;
357
        int num_parts_found = -1;
358
        int num_parts_expected = -1;
359
        /* gint64 */guint total_size = -1;
360
        int complete_percentage = 0;
361
        int num_regular_files = 0;
362
        int num_par2_files = 0;
363
        int first_file_id = -1;
364

                
365
        if (!soup_value_array_get_nth(matches, i, G_TYPE_HASH_TABLE, &hash_collection)) {
366
            g_warning(__FILE__ ":%i Unable to parse values", __LINE__);
367
            continue;
368
        }
369

                
370
        if (!soup_value_hash_lookup_vals(hash_collection,   "collection_id", G_TYPE_INT, &collection_id,
371
                                                            "collection_name", G_TYPE_STRING, &collection_name,
372
                                                            "short_collection_name", G_TYPE_STRING, &short_collection_name,
373
                                                            "poster", G_TYPE_STRING, &poster,
374
                                                            "total_size", G_TYPE_INT, &total_size,       // FIXME: possible overflow!
375
                                                            "newsgroup", G_TYPE_STRING, &newsgroup,
376
                                                            "stamp", G_TYPE_INT, &stamp,
377
                                                            "num_parts_found", G_TYPE_INT, &num_parts_found,
378
                                                            "num_parts_expected", G_TYPE_INT, &num_parts_expected,
379
                                                            "complete_percentage", G_TYPE_INT, &complete_percentage,
380
                                                            "num_regular_files", G_TYPE_INT, &num_regular_files,
381
                                                            "num_par2_files", G_TYPE_INT, &num_par2_files,
382
                                                            "first_file_id", G_TYPE_INT, &first_file_id,
383
                                                            NULL)) {
384
            g_warning(_("%s:%i Unable to parse values"), __FILE__, __LINE__);
385
            g_hash_table_destroy(hash_collection);
386
            continue;
387
        }
388

                
389
        collection = g_slice_new0(NZBCreatorCollection);
390
        collection->collection_id = collection_id;
391
        strncpy(collection->collection_name, collection_name, sizeof(collection->collection_name) - 1);
392
        strncpy(collection->short_collection_name, short_collection_name, sizeof(collection->short_collection_name) - 1);
393
        strncpy(collection->poster, poster, sizeof(collection->poster) - 1);
394
        collection->total_size = total_size;
395
        strncpy(collection->newsgroup, newsgroup, sizeof(collection->newsgroup) - 1);
396
        collection->stamp = (time_t) stamp;
397
        collection->num_parts_found = num_parts_found;
398
        collection->num_parts_expected = num_parts_expected;
399
        collection->complete_percentage = complete_percentage;
400
        collection->num_regular_files = num_regular_files;
401
        collection->num_par2_files = num_par2_files;
402
        collection->first_file_id = first_file_id;
403

                
404
        result->collections = ng_list_append(result->collections, collection);
405
    }
406

                
407
    g_hash_table_destroy(rpc_result);
408
    g_object_unref(msg);
409
    g_object_unref(session);
410
#endif
411

                
412
    return result;
413
}
414

                
415
NGList *
416
nntpgrab_utils_nzbcreator_retrieve_collection_details(ngint64 collection_id, time_t stamp, char **errmsg)
417
{
418
    NGList *result = NULL;
419

                
420
#ifndef HAVE_SOUP
421
    if (errmsg) {
422
        *errmsg = g_strdup(_("Support for the Online Search hasn't been enabled in this build. Please rebuild NNTPGrab to enable this feature"));
423
    }
424
#else
425
    SoupSession *session;
426
    SoupMessage *msg;
427
    GHashTable *args;
428
    GError *err = NULL;
429
    GValueArray *matches = NULL;
430
    int i;
431

                
432
    g_return_val_if_fail(collection_id > 0, FALSE);
433

                
434
    session = soup_session_sync_new_with_options("timeout", 30, NULL);
435

                
436
#ifdef SOUP_TYPE_GNOME_FEATURES_2_26
437
    /* Enable proxy support when using GNOME 2.26.0 or higher */
438
    soup_session_add_feature_by_type(session, SOUP_TYPE_GNOME_FEATURES_2_26);
439
#endif
440

                
441
#ifdef HAVE_SOUP_GZIP
442
    /* Enable gzip compression */
443
    soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER);
444
#endif
445

                
446
    g_signal_connect (session, "authenticate", G_CALLBACK(authenticate_cb), NULL);
447

                
448
    args = soup_value_hash_new_with_vals("collection_id", G_TYPE_INT, (int) collection_id,
449
                                         "stamp", G_TYPE_INT, (int) stamp,
450
                                         NULL);
451
    msg = soup_xmlrpc_request_new(URI, "retrieveCollectionDetails", G_TYPE_HASH_TABLE, args, G_TYPE_INVALID);
452

                
453
    soup_session_send_message(session, msg);
454

                
455
    g_hash_table_destroy(args);
456

                
457
    if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
458
        if (errmsg) {
459
            *errmsg = g_strdup_printf(_("Server returned unknown error: %s (%i)"), msg->reason_phrase, msg->status_code);
460
        }
461
        g_object_unref(msg);
462
        g_object_unref(session);
463
        return NULL;
464
    }
465

                
466
    if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, &err, G_TYPE_VALUE_ARRAY, &matches)) {
467
        if (errmsg) {
468
            if (err) {
469
                *errmsg = g_strdup_printf(_("An error occured while retrieving the collection details:\n%s"), err->message);
470
            } else {
471
                *errmsg = g_strdup_printf(_("%s:%i Unable to parse reply from server:\n%s"), __FILE__, __LINE__, msg->response_body->data);
472
            }
473
        }
474

                
475
        if (err) {
476
            g_error_free(err);
477
        }
478

                
479
        g_object_unref(msg);
480
        g_object_unref(session);
481

                
482
        return NULL;
483
    }
484

                
485
    for (i = 0; i < matches->n_values; i++) {
486
        NZBCreatorFile *file;
487
        GHashTable *hash_file = NULL;
488
        /* gint64 */gint file_id = -1;
489
        char *subject = NULL;
490
        char *poster = NULL;
491
        int num_parts_found = -1;
492
        int num_parts_expected = -1;
493
        int file_type = NNTP_FILE_TYPE_UNKNOWN;
494
        /* gint64 */gint file_size = -1;
495
        int complete_percentage = 0;
496
        int stamp;
497

                
498
        if (!soup_value_array_get_nth(matches, i, G_TYPE_HASH_TABLE, &hash_file)) {
499
            g_warning(_("%s:%i Unable to parse values"), __FILE__, __LINE__);
500
            continue;
501
        }
502

                
503
        if (!soup_value_hash_lookup_vals(hash_file, "file_id", G_TYPE_INT, &file_id,            // FIXME: possible overflow!
504
                                                    "subject", G_TYPE_STRING, &subject,
505
                                                    "poster", G_TYPE_STRING, &poster,
506
                                                    "num_parts_found", G_TYPE_INT, &num_parts_found,
507
                                                    "num_parts_expected", G_TYPE_INT, &num_parts_expected,
508
                                                    "file_type", G_TYPE_INT, &file_type,
509
                                                    "file_size", G_TYPE_INT, &file_size,        // FIXME: possible overflow!
510
                                                    "stamp", G_TYPE_INT, &stamp,
511
                                                    "complete_percentage", G_TYPE_INT, &complete_percentage,
512
                                                    NULL)) {
513
            g_warning(_("%s:%i Unable to parse values"), __FILE__, __LINE__);
514
            continue;
515
        }
516

                
517
        file = g_slice_new0(NZBCreatorFile);
518
        file->file_id = file_id;
519
        strncpy(file->subject, subject, sizeof(file->subject) - 1);
520
        strncpy(file->poster, poster, sizeof(file->poster) - 1);
521
        file->num_parts_found = num_parts_found;
522
        file->num_parts_expected = num_parts_expected;
523
        file->file_type = (NNTPFileType) file_type;
524
        file->file_size = file_size;
525
        file->stamp = (time_t) stamp;
526
        file->complete_percentage = complete_percentage;
527

                
528
        result = ng_list_append(result, file);
529
    }
530

                
531
    g_object_unref(msg);
532
    g_object_unref(session);
533
#endif
534

                
535
    return result;
536
}
537

                
538
void nntpgrab_utils_nzbcreator_free_collection_details(NGList *files)
539
{
540
    NGList *list;
541

                
542
    list = files;
543
    while (list) {
544
        g_slice_free(NZBCreatorFile, list->data);
545
        list = ng_list_next(list);
546
    }
547

                
548
    g_list_free((GList*) files);
549
}
550

                
551
char *
552
nntpgrab_utils_nzbcreator_generate_NZB(NGList *file_ids, time_t oldest_stamp, time_t newest_stamp, char **errmsg)
553
{
554
    char *result = NULL;
555

                
556
#ifndef HAVE_SOUP
557
    if (errmsg) {
558
        *errmsg = g_strdup(_("Support for the Online Search hasn't been enabled in this build. Please rebuild NNTPGrab to enable this feature"));
559
    }
560
#else
561
    SoupSession *session;
562
    SoupMessage *msg;
563
    GError *err = NULL;
564
    GHashTable *args = NULL;
565
    GValueArray *arg_file_ids = NULL;
566
    NGList *list;
567

                
568
    arg_file_ids = soup_value_array_new();
569
    list = file_ids;
570
    while (list) {
571
        soup_value_array_append(arg_file_ids, G_TYPE_INT, GPOINTER_TO_INT(list->data));
572
        list = ng_list_next(list);
573
    }
574

                
575
    session = soup_session_sync_new_with_options("timeout", 30, NULL);
576

                
577
#ifdef HAVE_SOUP_GNOME
578
    /* Enable proxy support when using GNOME 2.26.0 or higher */
579
    soup_session_add_feature_by_type(session, SOUP_TYPE_GNOME_FEATURES_2_26);
580
#endif
581

                
582
#ifdef HAVE_SOUP_GZIP
583
    /* Enable gzip compression */
584
    soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER);
585
#endif
586

                
587
    g_signal_connect (session, "authenticate", G_CALLBACK(authenticate_cb), NULL);
588

                
589
    args = soup_value_hash_new_with_vals("oldest_stamp", G_TYPE_INT, (int) oldest_stamp,
590
                                         "newest_stamp", G_TYPE_INT, (int) newest_stamp,
591
                                         "file_ids", G_TYPE_VALUE_ARRAY, arg_file_ids,
592
                                         NULL);
593
    msg = soup_xmlrpc_request_new(URI, "generateNZB", G_TYPE_HASH_TABLE, args, G_TYPE_INVALID);
594
    soup_session_send_message(session, msg);
595

                
596
    g_hash_table_destroy(args);
597

                
598
    if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
599
        if (errmsg) {
600
            *errmsg = g_strdup_printf(_("Server returned unknown error: %s (%i)"), msg->reason_phrase, msg->status_code);
601
        }
602
        g_object_unref(msg);
603
        g_object_unref(session);
604
        return NULL;
605
    }
606

                
607
    if (!soup_xmlrpc_extract_method_response(msg->response_body->data, msg->response_body->length, &err, G_TYPE_STRING, &result)) {
608
        if (errmsg) {
609
            if (err) {
610
                *errmsg = g_strdup_printf(_("An error occured while retrieving the NZB from the server:\n%s"), err->message);
611
            } else {
612
                *errmsg = g_strdup_printf(_("%s:%i Unable to parse reply from server. See the console for more details"), __FILE__, __LINE__);
613
            }
614
        }
615

                
616
        if (err) {
617
            g_error_free(err);
618
        }
619

                
620
        g_object_unref(msg);
621
        g_object_unref(session);
622

                
623
        return NULL;
624
    }
625

                
626
    g_object_unref(msg);
627
    g_object_unref(session);
628
#endif
629

                
630
    return result;
631
}
632