Statistics
| Revision:

root / trunk / glue / glue_json.c @ 1843

History | View | Annotate | Download (68.3 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

                
27
#include 
28
#include 
29

                
30
#include "nntpgrab.h"
31
#include "nntpgrab_utils.h"
32
#include "nntpgrab_internal.h"
33
#include "nntpgrab_glue.h"
34
#include "nntpgrab_glue_internal.h"
35

                
36
#include "json_object.h"
37
#include "json.h"
38
#include "jsonrpc.h"
39

                
40
static void process_foreach_collection_event(const char *msg, struct json_object *params);
41
static void process_foreach_file_event(const char *msg, struct json_object *params);
42
static void process_foreach_group_event(const char *msg, struct json_object *params);
43

                
44
static struct json_object *
45
get_json_param(const char *msg, struct json_object *params, const char *field, const char *event_name, enum json_type type)
46
{
47
    struct json_object *obj;
48

                
49
    obj = json_object_object_get(params, (char*) field);
50
    if (!obj) {
51
        g_print(__FILE__ ":%i field '%s' is missing for event or method '%s', msg = %s\n", __LINE__, field, event_name, msg);
52
        return NULL;
53
    }
54

                
55
    if (json_object_get_type(obj) != type) {
56
        g_print(__FILE__ ":%i field '%s' is of invalid type for event or method '%s', msg = %s\n", __LINE__, field, event_name, msg);
57
        return NULL;
58
    }
59

                
60
    return obj;
61
}
62

                
63
#define get_param(msg, params, field, event_name, type, dest)                                           \
64
    {                                                                                                   \
65
        struct json_object *obj = get_json_param(msg, params, field, event_name, json_type_ ## type);   \
66
        if (!obj) {                                                                                     \
67
            return;                                                                                     \
68
        }                                                                                               \
69
        dest = json_object_get_ ## type (obj);                                                          \
70
    }
71

                
72
static void
73
emit_part_download_start(const char *msg, struct json_object *params)
74
{
75
    char *servername;
76
    int conn_id;
77
    char *collection_name;
78
    char *subject;
79
    int part_num;
80

                
81
    get_param(msg, params, "servername", "part_download_start", string, servername);
82
    get_param(msg, params, "conn_id", "part_download_start", int, conn_id);
83
    get_param(msg, params, "collection_name", "part_download_start", string, collection_name);
84
    get_param(msg, params, "subject", "part_download_start", string, subject);
85
    get_param(msg, params, "part_num", "part_download_start", int, part_num);
86

                
87
    nntpgrab_core_emit_part_download_start(FALSE, servername, conn_id, collection_name, subject, part_num);
88
}
89

                
90
static void
91
emit_part_done(const char *msg, struct json_object *params)
92
{
93
    char *servername;
94
    int conn_id;
95
    char *collection_name;
96
    char *subject;
97
    int part_num;
98
    int size;
99

                
100
    get_param(msg, params, "servername", "part_done", string, servername);
101
    get_param(msg, params, "conn_id", "part_done", int, conn_id);
102
    get_param(msg, params, "collection_name", "part_done", string, collection_name);
103
    get_param(msg, params, "subject", "part_done", string, subject);
104
    get_param(msg, params, "part_num", "part_done", int, part_num);
105
    get_param(msg, params, "size", "part_done", int, size);
106

                
107
    nntpgrab_core_emit_part_done(FALSE, servername, conn_id, collection_name, subject, part_num, size);
108
}
109

                
110
static void
111
emit_part_failed(const char *msg, struct json_object *params)
112
{
113
    char *servername;
114
    int conn_id;
115
    char *collection_name;
116
    char *subject;
117
    int part_num;
118
    int size;
119
    gboolean all_servers_tried;
120

                
121
    get_param(msg, params, "servername", "part_done", string, servername);
122
    get_param(msg, params, "conn_id", "part_done", int, conn_id);
123
    get_param(msg, params, "collection_name", "part_done", string, collection_name);
124
    get_param(msg, params, "subject", "part_done", string, subject);
125
    get_param(msg, params, "part_num", "part_done", int, part_num);
126
    get_param(msg, params, "size", "part_done", int, size);
127
    get_param(msg, params, "all_servers_tried", "part_done", boolean, all_servers_tried);
128

                
129
    nntpgrab_core_emit_part_failed(FALSE, servername, conn_id, collection_name, subject, part_num, size, all_servers_tried);
130
}
131

                
132
static void
133
emit_traffic_monitor_update(const char *msg, struct json_object *params)
134
{
135
    int bytes_received[10];
136
    int stamp;
137

                
138
    get_param(msg, params, "bytes_received1",  "traffic_monitor_update", int, bytes_received[0]);
139
    get_param(msg, params, "bytes_received2",  "traffic_monitor_update", int, bytes_received[1]);
140
    get_param(msg, params, "bytes_received3",  "traffic_monitor_update", int, bytes_received[2]);
141
    get_param(msg, params, "bytes_received4",  "traffic_monitor_update", int, bytes_received[3]);
142
    get_param(msg, params, "bytes_received5",  "traffic_monitor_update", int, bytes_received[4]);
143
    get_param(msg, params, "bytes_received6",  "traffic_monitor_update", int, bytes_received[5]);
144
    get_param(msg, params, "bytes_received7",  "traffic_monitor_update", int, bytes_received[6]);
145
    get_param(msg, params, "bytes_received8",  "traffic_monitor_update", int, bytes_received[7]);
146
    get_param(msg, params, "bytes_received9",  "traffic_monitor_update", int, bytes_received[8]);
147
    get_param(msg, params, "bytes_received10", "traffic_monitor_update", int, bytes_received[9]);
148
    get_param(msg, params, "stamp", "traffic_monitor_update", int, stamp);
149

                
150
    nntpgrab_core_emit_traffic_monitor_update(FALSE, bytes_received, stamp);
151
}
152

                
153
static void
154
emit_part_progress_update(const char *msg, struct json_object *params)
155
{
156
    char *servername;
157
    int conn_id;
158
    char *collection_name;
159
    char *subject;
160
    int part_num;
161
    int bytes_downloaded;
162
    int bytes_total;
163

                
164
    get_param(msg, params, "servername", "part_progress_update", string, servername);
165
    get_param(msg, params, "conn_id", "part_progress_update", int, conn_id);
166
    get_param(msg, params, "collection_name", "part_progress_update", string, collection_name);
167
    get_param(msg, params, "subject", "part_progress_update", string, subject);
168
    get_param(msg, params, "part_num", "part_progress_update", int, part_num);
169
    get_param(msg, params, "bytes_downloaded", "part_progress_update", int, bytes_downloaded);
170
    get_param(msg, params, "bytes_total", "part_progress_update", int, bytes_total);
171

                
172
    nntpgrab_core_emit_part_progress_update(FALSE, servername, conn_id, collection_name, subject, part_num, bytes_downloaded, bytes_total);
173
}
174

                
175
static void
176
emit_collection_added(const char *msg, struct json_object *params)
177
{
178
    char *collection_name;
179
    char *poster;
180

                
181
    get_param(msg, params, "collection_name", "collection_added", string, collection_name);
182
    get_param(msg, params, "poster", "collection_added", string, poster);
183

                
184
    nntpgrab_core_emit_collection_added(FALSE, collection_name, poster);
185
}
186

                
187
static void
188
emit_collection_removed(const char *msg, struct json_object *params)
189
{
190
    char *collection_name;
191

                
192
    get_param(msg, params, "collection_name", "collection_removed", string, collection_name);
193

                
194
    nntpgrab_core_emit_collection_removed(FALSE, collection_name);
195
}
196

                
197
static void
198
emit_collection_modified(const char *msg, struct json_object *params)
199
{
200
    char *collection_name;
201
    char *poster;
202

                
203
    get_param(msg, params, "collection_name", "collection_modified", string, collection_name);
204
    get_param(msg, params, "poster", "collection_modified", string, poster);
205

                
206
    nntpgrab_core_emit_collection_modified(FALSE, collection_name, poster);
207
}
208

                
209
static void
210
emit_file_added(const char *msg, struct json_object *params)
211
{
212
    struct json_object *obj;
213
    int len;
214
    int i;
215
    char *collection_name;
216
    char *subject;
217
    char *poster;
218
    int stamp;
219
    guint64 file_size;
220
    guint64 total_size;
221
    guint64 total_size_remaining;
222
    NGTaskState status;
223
    int num_parts;
224
    GList *groups;
225

                
226
    get_param(msg, params, "collection_name", "file_added", string, collection_name);
227
    get_param(msg, params, "subject", "file_added", string, subject);
228
    get_param(msg, params, "poster", "file_added", string, poster);
229
    get_param(msg, params, "stamp", "file_added", int, stamp);
230
    get_param(msg, params, "file_size", "file_added", int, file_size);
231
    get_param(msg, params, "total_size", "file_added", int, total_size);
232
    get_param(msg, params, "total_size_remaining", "file_added", int, total_size_remaining);
233
    get_param(msg, params, "status", "file_added", int, status);
234
    get_param(msg, params, "num_parts", "file_added", int, num_parts);
235

                
236
    obj = get_json_param(msg, params, "groups", "file_added", json_type_array);
237
    if (!obj) {
238
        return;
239
    }
240

                
241
    groups = NULL;
242
    len = json_object_array_length(obj);
243
    for (i = 0; i < len; i++) {
244
        struct json_object *group = json_object_array_get_idx(obj, i);
245
        char *groupname;
246

                
247
        g_return_if_fail(group != NULL);
248

                
249
        groupname = json_object_get_string(group);
250

                
251
        g_return_if_fail(groupname != NULL);
252

                
253
        groups = g_list_append(groups, groupname);
254
    }
255

                
256
    nntpgrab_core_emit_file_added(FALSE, collection_name, subject, poster, stamp, file_size * 1024, total_size * 1024, total_size_remaining * 1024, status, num_parts, groups);
257

                
258
    g_list_free(groups);
259
}
260

                
261
static void
262
emit_file_removed(const char *msg, struct json_object *params)
263
{
264
    char *collection_name;
265
    char *subject;
266
    guint64 total_size;
267
    guint64 total_size_remaining;
268

                
269
    get_param(msg, params, "collection_name", "file_removed", string, collection_name);
270
    get_param(msg, params, "subject", "file_removed", string, subject);
271
    get_param(msg, params, "total_size", "file_removed", int, total_size);
272
    get_param(msg, params, "total_size_remaining", "file_removed", int, total_size_remaining);
273

                
274
    nntpgrab_core_emit_file_removed(FALSE, collection_name, subject, total_size * 1024, total_size_remaining * 1024);
275
}
276

                
277
static void
278
emit_file_download_state_update(const char *msg, struct json_object *params)
279
{
280
    char *collection_name;
281
    char *subject;
282
    int num_parts_total;
283
    int num_parts_done;
284
    int num_parts_failed;
285
    guint64 file_size;
286
    guint64 file_size_remaining;
287
    guint64 total_size;
288
    guint64 total_size_remaining;
289

                
290
    get_param(msg, params, "collection_name", "file_download_state_update", string, collection_name);
291
    get_param(msg, params, "subject", "file_download_state_update", string, subject);
292
    get_param(msg, params, "num_parts_total", "file_download_state_update", int, num_parts_total);
293
    get_param(msg, params, "num_parts_done", "file_download_state_update", int, num_parts_done);
294
    get_param(msg, params, "num_parts_failed", "file_download_state_update", int, num_parts_failed);
295
    get_param(msg, params, "file_size", "file_download_state_update", int, file_size);
296
    get_param(msg, params, "file_size_remaining", "file_download_state_update", int, file_size_remaining);
297
    get_param(msg, params, "total_size", "file_download_state_update", int, total_size);
298
    get_param(msg, params, "total_size_remaining", "file_download_state_update", int, total_size_remaining);
299

                
300
    nntpgrab_core_emit_file_download_state_update(FALSE, collection_name, subject, num_parts_total, num_parts_done, num_parts_failed, file_size * 1024, file_size_remaining * 1024, total_size * 1024, total_size_remaining * 1024);
301
}
302

                
303
static void
304
emit_file_state_changed(const char *msg, struct json_object *params)
305
{
306
    char *collection_name;
307
    char *subject;
308
    char *real_filename;
309
    int old_state;
310
    int new_state;
311

                
312
    get_param(msg, params, "collection_name", "file_state_changed", string, collection_name);
313
    get_param(msg, params, "subject", "file_state_changed", string, subject);
314
    get_param(msg, params, "real_filename", "file_state_changed", string, real_filename);
315
    get_param(msg, params, "old_state", "file_state_changed", int, old_state);
316
    get_param(msg, params, "new_state", "file_state_changed", int, new_state);
317

                
318
    nntpgrab_core_emit_file_state_changed(FALSE, collection_name, subject, real_filename, old_state, new_state);
319
}
320

                
321
static void
322
emit_connection_connecting(const char *msg, struct json_object *params)
323
{
324
    char *servername;
325
    int conn_id;
326

                
327
    get_param(msg, params, "servername", "connection_connecting", string, servername);
328
    get_param(msg, params, "conn_id", "connection_connecting", int, conn_id);
329

                
330
    nntpgrab_core_emit_connecting(FALSE, servername, conn_id);
331
}
332

                
333
static void
334
emit_connection_connected(const char *msg, struct json_object *params)
335
{
336
    char *servername;
337
    int conn_id;
338
    char *welcome_msg;
339

                
340
    get_param(msg, params, "servername", "connection_connected", string, servername);
341
    get_param(msg, params, "conn_id", "connection_connected", int, conn_id);
342
    get_param(msg, params, "welcome_msg", "connection_connected", string, welcome_msg);
343

                
344
    nntpgrab_core_emit_connected(FALSE, servername, conn_id, welcome_msg);
345
}
346

                
347
static void
348
emit_connection_disconnect(const char *msg, struct json_object *params)
349
{
350
    char *servername;
351
    int conn_id;
352
    NNTPDisconnectType disconnect_type;
353
    char *reason;
354

                
355
    get_param(msg, params, "servername", "connection_disconnect", string, servername);
356
    get_param(msg, params, "conn_id", "connection_disconnect", int, conn_id);
357
    get_param(msg, params, "disconnect_type", "connection_disconnect", int, disconnect_type);
358
    get_param(msg, params, "reason", "connection_disconnect", string, reason);
359

                
360
    nntpgrab_core_emit_disconnect(FALSE, servername, conn_id, disconnect_type, reason);
361
}
362

                
363
static void
364
emit_schedular_state_changed(const char *msg, struct json_object *params)
365
{
366
    NGSchedularState new_state;
367
    char *reason;
368

                
369
    get_param(msg, params, "new_state", "schedular_state_changed", int, new_state);
370
    get_param(msg, params, "reason", "schedular_state_changed", string, reason);
371

                
372
    nntpgrab_core_emit_schedular_state_changed(FALSE, new_state, (strlen(reason) > 0 ? reason : NULL));
373
}
374

                
375
static void
376
emit_log_message(const char *msg, struct json_object *params)
377
{
378
    char *component;
379
    NGLogLevel log_level;
380
    char *message;
381

                
382
    get_param(msg, params, "component", "log_message", string, component);
383
    get_param(msg, params, "log_level", "log_message", int, log_level);
384
    get_param(msg, params, "msg", "log_message", string, message);
385

                
386
    nntpgrab_core_emit_log_message(FALSE, component, log_level, message, TRUE, FALSE);
387
}
388

                
389
static void
390
emit_task_moved(const char *msg, struct json_object *params)
391
{
392
    char *orig_collection_name;
393
    char *subject;
394
    char *new_collection_name;
395
    int old_position;
396
    int new_position;
397

                
398
    get_param(msg, params, "orig_collection_name", "task_moved", string, orig_collection_name);
399
    get_param(msg, params, "subject", "task_moved", string, subject);
400
    get_param(msg, params, "new_collection_name", "task_moved", string, new_collection_name);
401
    get_param(msg, params, "old_position", "task_moved", int, old_position);
402
    get_param(msg, params, "new_position", "task_moved", int, new_position);
403

                
404
    nntpgrab_core_emit_file_moved(FALSE, orig_collection_name, subject, new_collection_name, old_position, new_position);
405
}
406

                
407
static void
408
emit_collection_moved(const char *msg, struct json_object *params)
409
{
410
    char *collection_name;
411
    int old_position;
412
    int new_position;
413

                
414
    get_param(msg, params, "collection_name", "collection_moved", string, collection_name);
415
    get_param(msg, params, "old_position", "collection_moved", int, old_position);
416
    get_param(msg, params, "new_position", "collection_moved", int, new_position);
417

                
418
    nntpgrab_core_emit_collection_moved(FALSE, collection_name, old_position, new_position);
419
}
420

                
421
static void
422
emit_plugin_loaded(const char *msg, struct json_object *params)
423
{
424
    char *plugin_name;
425
    gboolean is_persistent;
426

                
427
    get_param(msg, params, "plugin_name", "plugin_loaded", string, plugin_name);
428
    get_param(msg, params, "is_persistent", "plugin_loaded", boolean, is_persistent);
429

                
430
    nntpgrab_core_emit_plugin_loaded(FALSE, plugin_name, is_persistent);
431
}
432

                
433
static void
434
emit_plugin_unloaded(const char *msg, struct json_object *params)
435
{
436
    char *plugin_name;
437

                
438
    get_param(msg, params, "plugin_name", "plugin_unloaded", string, plugin_name);
439

                
440
    nntpgrab_core_emit_plugin_unloaded(FALSE, plugin_name);
441
}
442

                
443
static void
444
emit_plugin_event(const char *msg, struct json_object *params)
445
{
446
    int i;
447
    int len;
448
    struct json_object *obj;
449
    char *plugin_name;
450
    char *event_name;
451
    char **values;
452

                
453
    get_param(msg, params, "plugin_name", "plugin_event", string, plugin_name);
454
    get_param(msg, params, "event_name", "plugin_event", string, event_name);
455

                
456
    obj = get_json_param(msg, params, "values", "plugin_event", json_type_array);
457
    if (!obj) {
458
        return;
459
    }
460

                
461
    len = json_object_array_length(obj);
462
    values = g_slice_alloc0(sizeof(char*) * (len + 1));
463

                
464
    for (i = 0; i < len; i++) {
465
        struct json_object *val_obj = json_object_array_get_idx(obj, i);
466
        char *val;
467

                
468
        g_return_if_fail(val_obj != NULL);
469

                
470
        val = json_object_get_string(val_obj);
471

                
472
        g_return_if_fail(val != NULL);
473

                
474
        values[i] = val;
475
    }
476

                
477
    nntpgrab_core_emit_plugin_event(FALSE, plugin_name, event_name, (const char **) values);
478

                
479
    g_slice_free1(sizeof(char*) * (len + 1), values);
480
}
481

                
482
/* This function used to be part of GLib, but because it behaviour got 
483
 * changed in GLib 2.27.4 we can't rely on it's value anymore for
484
 * hardcoded hash comparisons. This is the g_str_hash implementation
485
 * of before GLib 2.27.4 */
486
static guint
487
ng_str_hash (gconstpointer v)
488
{
489
    const signed char *p;
490
    guint32 h = 0;
491

                
492
    for (p = v; *p != '\0'; p++)
493
        h = (h << 5) - h + *p;
494

                
495
    return h;
496
}
497

                
498
static void
499
glue_process_jsonrpc_notification(const char *msg, struct json_object *obj)
500
{
501
    struct json_object *params;
502
    struct json_object *method;
503
    char *event_name;
504
    guint hash;
505

                
506
    params = json_object_object_get(obj, "params");
507
    if (!params) {
508
        g_print(__FILE__ ":%i JSON message lacks a 'params' field, ignoring: %s\n", __LINE__, msg);
509
        return;
510
    }
511

                
512
    if (json_object_get_type(params) != json_type_object) {
513
        g_print(__FILE__ ":%i JSON parameter is of invalid type, ignoring: %s\n", __LINE__, msg);
514
        return;
515
    }
516

                
517
    method = json_object_object_get(obj, "method");
518
    if (!method) {
519
        g_print(__FILE__ ":%i JSON message lacks a 'method' field, ignoring: %s\n", __LINE__, msg);
520
        return;
521
    }
522

                
523
    event_name = json_object_get_string(method);
524
    hash = ng_str_hash(event_name);
525

                
526
    switch (hash) {
527
        case 4148964023U:       /* config_changed */
528
            if (has_signal_handler_pending(CONFIG_CHANGED_SIGNAL)) {
529
                nntpgrab_core_emit_config_changed(FALSE);
530
            }
531
            break;
532
        case 718712759U:        /* part_download_start */
533
            if (has_signal_handler_pending(PART_DOWNLOAD_START_SIGNAL)) {
534
                emit_part_download_start(msg, params);
535
            }
536
            break;
537
        case 2485450830U:       /* part_done */
538
            if (has_signal_handler_pending(PART_DONE_SIGNAL)) {
539
                emit_part_done(msg, params);
540
            }
541
            break;
542
        case 560621065U:        /* part_failed */
543
            if (has_signal_handler_pending(PART_FAILED_SIGNAL)) {
544
                emit_part_failed(msg, params);
545
            }
546
            break;
547
        case 3851882960U:       /* traffic_monitor_update */
548
            if (has_signal_handler_pending(TRAFFIC_MONITOR_UPDATE_SIGNAL)) {
549
                emit_traffic_monitor_update(msg, params);
550
            }
551
            break;
552
        case 3667888847U:       /* part_progress_update */
553
            if (has_signal_handler_pending(PART_PROGRESS_UPDATE_SIGNAL)) {
554
                emit_part_progress_update(msg, params);
555
            }
556
            break;
557
        case 2792752159U:       /* collection_added */
558
            if (has_signal_handler_pending(COLLECTION_ADDED_SIGNAL)) {
559
                emit_collection_added(msg, params);
560
            }
561
            break;
562
        case 1720184767U:       /* collection_removed */
563
            if (has_signal_handler_pending(COLLECTION_REMOVED_SIGNAL)) {
564
                emit_collection_removed(msg, params);
565
            }
566
            break;
567
        case 1683429194U:       /* collection_modified */
568
            if (has_signal_handler_pending(COLLECTION_MODIFIED_SIGNAL)) {
569
                emit_collection_modified(msg, params);
570
            }
571
            break;
572
        case 2127244413U:       /* file_added */
573
            if (has_signal_handler_pending(FILE_ADDED_SIGNAL)) {
574
                emit_file_added(msg, params);
575
            }
576
            break;
577
        case 2117367965U:       /* file_removed */
578
            if (has_signal_handler_pending(FILE_REMOVED_SIGNAL)) {
579
                emit_file_removed(msg, params);
580
            }
581
            break;
582
        case 2548616203U:       /* file_download_state_update */
583
            if (has_signal_handler_pending(FILE_DOWNLOAD_STATE_UPDATE_SIGNAL)) {
584
                emit_file_download_state_update(msg, params);
585
            }
586
            break;
587
        case 3407424387U:       /* file_state_changed */
588
            if (has_signal_handler_pending(FILE_STATE_CHANGED_SIGNAL)) {
589
                emit_file_state_changed(msg, params);
590
            }
591
            break;
592
        case 1506868921U:       /* connection_connecting */
593
            if (has_signal_handler_pending(CONNECTION_CONNECTING_SIGNAL)) {
594
                emit_connection_connecting(msg, params);
595
            }
596
            break;
597
        case 2681007848U:       /* connection_connected */
598
            if (has_signal_handler_pending(CONNECTION_CONNECTED_SIGNAL)) {
599
                emit_connection_connected(msg, params);
600
            }
601
            break;
602
        case 2812926109U:       /* connection_disconnect */
603
            if (has_signal_handler_pending(CONNECTION_DISCONNECT_SIGNAL)) {
604
                emit_connection_disconnect(msg, params);
605
            }
606
            break;
607
        case 1376609542U:       /* schedular_state_changed */
608
            if (has_signal_handler_pending(SCHEDULAR_STATE_CHANGED_SIGNAL)) {
609
                emit_schedular_state_changed(msg, params);
610
            }
611
            break;
612
        case 843068174U:        /* foreach_collection_event */
613
            process_foreach_collection_event(msg, params);
614
            break;
615
        case 3826728748U:       /* foreach_file_event */
616
            process_foreach_file_event(msg, params);
617
            break;
618
        case 2102350437U:       /* foreach_group_event */
619
            process_foreach_group_event(msg, params);
620
            break;
621
        case 693552652U:        /* log_message */
622
            if (has_signal_handler_pending(LOG_MESSAGE_SIGNAL)) {
623
                emit_log_message(msg, params);
624
            }
625
            break;
626
        case 1307041657U:       /* task_moved */
627
            if (has_signal_handler_pending(TASK_MOVED_SIGNAL)) {
628
                emit_task_moved(msg, params);
629
            }
630
            break;
631
        case 2804179410U:       /* collection_moved */
632
            if (has_signal_handler_pending(COLLECTION_MOVED_SIGNAL)) {
633
                emit_collection_moved(msg, params);
634
            }
635
            break;
636
        case 2405579865U:       /* all_downloads_completed */
637
            if (has_signal_handler_pending(ALL_DOWNLOADS_COMPLETED_SIGNAL)) {
638
                nntpgrab_core_emit_all_downloads_completed(FALSE);
639
            }
640
            break;
641
        case 3241070225U:       /* plugin_loaded */
642
            if (has_signal_handler_pending(PLUGIN_LOADED_SIGNAL)) {
643
                emit_plugin_loaded(msg, params);
644
            }
645
            break;
646
        case 3055047530U:       /* plugin_unloaded */
647
            if (has_signal_handler_pending(PLUGIN_UNLOADED_SIGNAL)) {
648
                emit_plugin_unloaded(msg, params);
649
            }
650
            break;
651
        case 2037961358U:       /* plugin_event */
652
            if (has_signal_handler_pending(PLUGIN_EVENT_SIGNAL)) {
653
                emit_plugin_event(msg, params);
654
            }
655
            break;
656

                
657
        default:
658
            g_print(__FILE__ ":%i JSON notification with unknown event name received, event_name = %s, hash = %u, msg = %s\n", __LINE__, event_name, hash, msg);
659
            break;
660
    }
661
}
662

                
663
static GAsyncQueue *command_queue = NULL;
664
static GStaticMutex command_mutex = G_STATIC_MUTEX_INIT;
665
static GStaticMutex init_mutex = G_STATIC_MUTEX_INIT;
666

                
667
void
668
glue_process_jsonrpc_msg(const char *msg)
669
{
670
    struct json_object *obj;
671
    struct json_object *id;
672

                
673
    g_return_if_fail(msg != NULL);
674

                
675
    obj = json_tokener_parse((char*)msg);
676
    if (!obj) {
677
        g_print(__FILE__ ":%i Invalid message received from server, ignoring: %s\n", __LINE__, msg);
678
        return;
679
    }
680

                
681
    id = json_object_object_get(obj, "id");
682
    if (!id) {
683
        /* Notification received! */
684
        glue_process_jsonrpc_notification(msg, obj);
685
        json_object_put(obj);
686
        return;
687
    }
688

                
689
    g_print(__FILE__ ":%i JSON response received for msg: %s\n", __LINE__, msg);
690

                
691
    g_static_mutex_lock(&init_mutex);
692
    if (command_queue == NULL) {
693
        command_queue = g_async_queue_new();
694
    }
695
    g_static_mutex_unlock(&init_mutex);
696

                
697
    g_async_queue_push(command_queue, obj);
698

                
699
    /* No need to unref here as it should be done by the thread who pop's the queue */
700
}
701

                
702
/*************************************************************************************/
703
/* JSON-RPC methods */
704
/*************************************************************************************/
705
#define get_method_param(params, field, method_name, type, dest)                                        \
706
    {                                                                                                   \
707
        char *msg = json_object_get_string(params);                                                     \
708
        struct json_object *obj = get_json_param(msg, params, field, method_name, json_type_ ## type);  \
709
        if (!obj) {                                                                                     \
710
            json_object_put(params) ;                                                                   \
711
            return FALSE;                                                                               \
712
        }                                                                                               \
713
        dest = json_object_get_ ## type (obj);                                                          \
714
    }
715

                
716
static struct json_object *
717
create_new_json_request(const char *method, struct json_object *request_params)
718
{
719
    struct json_object *request;
720
    static int id = 0;
721

                
722
    if (!request_params) {
723
        request_params = json_object_new_array();
724
    }
725

                
726
    request = json_object_new_object();
727
    json_object_object_add(request, "method", json_object_new_string((char*) method));
728
    json_object_object_add(request, "id", json_object_new_int(++id));
729
    json_object_object_add(request, "params", request_params);
730

                
731
    return request;
732
}
733

                
734
static struct json_object *
735
send_request_and_wait_for_response(NntpgrabGlue *glue, struct json_object *request, char **errmsg)
736
{
737
    struct json_object *response;
738
    struct json_object *result;
739
    struct json_object *error;
740
    GTimeVal tv;
741
    int count;
742

                
743
    g_return_val_if_fail(glue != NULL, NULL);
744
    g_return_val_if_fail(request != NULL, NULL);
745
    g_return_val_if_fail(errmsg != NULL, NULL);
746

                
747
    g_static_mutex_lock(&command_mutex);
748

                
749
    if (!write_line(&glue->socket, "%s\r\n", json_object_to_json_string(request))) {
750
        g_static_mutex_unlock(&command_mutex);
751
        return NULL;
752
    }
753

                
754
    g_static_mutex_lock(&init_mutex);
755
    if (command_queue == NULL) {
756
        command_queue = g_async_queue_new();
757
    }
758
    g_static_mutex_unlock(&init_mutex);
759

                
760
    count = 0;
761
    while (count < READ_TIMEOUT_VALUE) {
762
        g_get_current_time(&tv);
763
        tv.tv_sec++;
764

                
765
        response = g_async_queue_timed_pop(command_queue, &tv);
766
        if (response) {
767
            break;
768
        } else if (glue->socket.socket_id <= 0) {
769
            *errmsg = g_strdup_printf(__FILE__ ":%i Connection got disconnected\n", __LINE__);
770

                
771
            nntpgrab_core_emit_log_message(FALSE, "Glue layer", NG_LOG_LEVEL_WARNING, *errmsg, TRUE, FALSE);
772

                
773
            g_static_mutex_unlock(&command_mutex);
774

                
775
            return NULL;
776
        }
777
        count++;
778
    }
779

                
780
    g_static_mutex_unlock(&command_mutex);
781

                
782
    if (!response) {
783
        *errmsg = g_strdup_printf(__FILE__ ":%i Timed out waiting for response from server, request = %s\n", __LINE__, json_object_to_json_string(request));
784

                
785
        nntpgrab_core_emit_log_message(FALSE, "Glue layer", NG_LOG_LEVEL_WARNING, *errmsg, TRUE, FALSE);
786

                
787
        return NULL;
788
    }
789

                
790
    error = json_object_object_get(response, "error");
791
    if (error) {
792
        *errmsg = g_strdup(json_object_get_string(error));
793

                
794
        json_object_put(response);
795

                
796
        return NULL;
797
    }
798

                
799
    result = json_object_object_get(response, "result");
800
    if (!result) {
801
        *errmsg = g_strdup_printf(__FILE__ ":%i Response from server lacks a 'result' field, request = %s, response = %s\n", __LINE__, json_object_to_json_string(request), json_object_to_json_string(response));
802

                
803
        nntpgrab_core_emit_log_message(FALSE, "Glue layer", NG_LOG_LEVEL_WARNING, *errmsg, TRUE, FALSE);
804

                
805
        json_object_put(response);
806

                
807
        return NULL;
808
    }
809

                
810
    /* We're only interested in the result, so we add a reference to that and unref the response */
811
    json_object_get(result);
812
    json_object_put(response);
813

                
814
    return result;
815
}
816

                
817
void
818
nntpgrab_glue_internal_kill_server(NntpgrabGlue *obj)
819
{
820
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
821
    struct json_object *request;
822
    struct json_object *response_result;
823
    char *errmsg = NULL;
824

                
825
    request = create_new_json_request("nntpgrab_server_request_quit", NULL);
826

                
827
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
828
        g_print(__FILE__ ":%i nntpgrab_server_request_quit FAILED: %s\n", __LINE__, errmsg);
829
        g_free(errmsg);
830
        json_object_put(request);
831
        return;
832
    }
833

                
834
    json_object_put(response_result);
835
    json_object_put(request);
836
}
837

                
838
NGList *
839
nntpgrab_glue_internal_config_get_avail_servers(NntpgrabGlue *obj)
840
{
841
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
842
    struct json_object *request;
843
    struct json_object *response_result;
844
    NGList *ret = NULL;
845
    char *errmsg = NULL;
846
    int i;
847
    int len;
848

                
849
    request = create_new_json_request("nntpgrab_config_get_avail_servers", NULL);
850

                
851
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
852
        g_print(__FILE__ ":%i nntpgrab_config_get_avail_servers FAILED: %s\n", __LINE__, errmsg);
853
        g_free(errmsg);
854
        json_object_put(request);
855
        return NULL;
856
    }
857

                
858
    len = json_object_array_length(response_result);
859
    for (i = 0; i < len; i++) {
860
        struct json_object *obj = json_object_array_get_idx(response_result, i);
861
        char *servername;
862

                
863
        g_return_val_if_fail(obj != NULL, NULL);
864

                
865
        servername = json_object_get_string(obj);
866

                
867
        g_return_val_if_fail(servername != NULL, NULL);
868

                
869
        ret = ng_list_append(ret, g_strdup(servername));
870
    }
871

                
872
    json_object_put(request);
873
    json_object_put(response_result);
874

                
875
    return ret;
876
}
877

                
878
gboolean
879
nntpgrab_glue_internal_config_get_server_info(NntpgrabGlue *obj, const char *servername, NGConfigServer *ret)
880
{
881
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
882
    struct json_object *request;
883
    struct json_object *request_params;
884
    struct json_object *response_result;
885
    char *errmsg = NULL;
886
    char *servername_received;
887
    char *hostname;
888
    int port;
889
    char *username;
890
    char *password;
891
    int max_threads;
892
    NGServerPriority priority;
893
    ngboolean send_group_command;
894
    ngboolean use_ssl;
895
    ngboolean enabled;
896

                
897
    g_return_val_if_fail(servername != NULL, FALSE);
898
    g_return_val_if_fail(ret != NULL, FALSE);
899

                
900
    request_params = json_object_new_array();
901
    json_object_array_add(request_params, json_object_new_string((char*) servername));
902
    request = create_new_json_request("nntpgrab_config_get_server_info", request_params);
903

                
904
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
905
        g_print(__FILE__ ":%i nntpgrab_config_get_server_info FAILED: %s\n", __LINE__, errmsg);
906
        g_free(errmsg);
907
        json_object_put(request);
908
        return FALSE;
909
    }
910

                
911
    get_method_param(response_result, "servername", "config_get_server_info", string, servername_received);
912
    get_method_param(response_result, "hostname", "config_get_server_info", string, hostname);
913
    get_method_param(response_result, "port", "config_get_server_info", int, port);
914
    get_method_param(response_result, "username", "config_get_server_info", string, username);
915
    get_method_param(response_result, "password", "config_get_server_info", string, password);
916
    get_method_param(response_result, "max_threads", "config_get_server_info", int, max_threads);
917
    get_method_param(response_result, "priority", "config_get_server_info", int, priority);
918
    get_method_param(response_result, "send_group_command", "config_get_server_info", boolean, send_group_command);
919
    get_method_param(response_result, "use_ssl", "config_get_server_info", boolean, use_ssl);
920
    get_method_param(response_result, "enabled", "config_get_server_info", boolean, enabled);
921

                
922
    memset(ret, 0, sizeof(NGConfigServer));
923

                
924
    strncpy(ret->servername, servername_received, sizeof(ret->servername));
925
    strncpy(ret->hostname, hostname, sizeof(ret->hostname));
926
    ret->port = port;
927
    strncpy(ret->username, username, sizeof(ret->username));
928
    strncpy(ret->password, password, sizeof(ret->password));
929
    ret->max_threads = max_threads;
930
    ret->priority = priority;
931
    ret->send_group_command = send_group_command;
932
    ret->use_ssl = use_ssl;
933
    ret->enabled = enabled;
934

                
935
    json_object_put(request);
936
    json_object_put(response_result);
937

                
938
    return TRUE;
939
}
940

                
941
gboolean
942
nntpgrab_glue_internal_config_add_server(NntpgrabGlue *obj, NGConfigServer new_server, char **errmsg)
943
{
944
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
945
    struct json_object *request;
946
    struct json_object *request_params;
947
    struct json_object *server;
948
    struct json_object *response_result;
949

                
950
    request_params = json_object_new_array();
951
    server = json_object_new_object();
952
    json_object_object_add(server, "servername", json_object_new_string((char*) new_server.servername));
953
    json_object_object_add(server, "hostname", json_object_new_string((char*) new_server.hostname));
954
    json_object_object_add(server, "port", json_object_new_int(new_server.port));
955
    json_object_object_add(server, "username", json_object_new_string((char*) new_server.username));
956
    json_object_object_add(server, "password", json_object_new_string((char*) new_server.password));
957
    json_object_object_add(server, "max_threads", json_object_new_int(new_server.max_threads));
958
    json_object_object_add(server, "priority", json_object_new_int(new_server.priority));
959
    json_object_object_add(server, "send_group_command", json_object_new_boolean(new_server.send_group_command));
960
    json_object_object_add(server, "use_ssl", json_object_new_boolean(new_server.use_ssl));
961
    json_object_object_add(server, "enabled", json_object_new_boolean(new_server.enabled));
962
    json_object_array_add(request_params, server);
963
    request = create_new_json_request("nntpgrab_config_add_server", request_params);
964

                
965
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
966
        json_object_put(request);
967
        return FALSE;
968
    }
969

                
970
    json_object_put(request);
971
    json_object_put(response_result);
972

                
973
    return TRUE;
974
}
975

                
976
gboolean
977
nntpgrab_glue_internal_config_del_server(NntpgrabGlue *obj, const char *servername, char **errmsg)
978
{
979
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
980
    struct json_object *request;
981
    struct json_object *request_params;
982
    struct json_object *response_result;
983

                
984
    request_params = json_object_new_array();
985
    json_object_array_add(request_params, json_object_new_string((char*) servername));
986
    request = create_new_json_request("nntpgrab_config_del_server", request_params);
987

                
988
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
989
        json_object_put(request);
990
        return FALSE;
991
    }
992

                
993
    json_object_put(request);
994
    json_object_put(response_result);
995

                
996
    return TRUE;
997
}
998

                
999
gboolean
1000
nntpgrab_glue_internal_config_edit_server(NntpgrabGlue *obj, const char *servername, NGConfigServer new_server, char **errmsg)
1001
{
1002
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1003
    struct json_object *request;
1004
    struct json_object *request_params;
1005
    struct json_object *server;
1006
    struct json_object *response_result;
1007

                
1008
    request_params = json_object_new_array();
1009
    server = json_object_new_object();
1010
    json_object_object_add(server, "servername", json_object_new_string((char*) new_server.servername));
1011
    json_object_object_add(server, "hostname", json_object_new_string((char*) new_server.hostname));
1012
    json_object_object_add(server, "port", json_object_new_int(new_server.port));
1013
    json_object_object_add(server, "username", json_object_new_string((char*) new_server.username));
1014
    json_object_object_add(server, "password", json_object_new_string((char*) new_server.password));
1015
    json_object_object_add(server, "max_threads", json_object_new_int(new_server.max_threads));
1016
    json_object_object_add(server, "priority", json_object_new_int(new_server.priority));
1017
    json_object_object_add(server, "send_group_command", json_object_new_boolean(new_server.send_group_command));
1018
    json_object_object_add(server, "use_ssl", json_object_new_boolean(new_server.use_ssl));
1019
    json_object_object_add(server, "enabled", json_object_new_boolean(new_server.enabled));
1020
    json_object_array_add(request_params, json_object_new_string((char*) servername));
1021
    json_object_array_add(request_params, server);
1022
    request = create_new_json_request("nntpgrab_config_edit_server", request_params);
1023

                
1024
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1025
        json_object_put(request);
1026
        return FALSE;
1027
    }
1028

                
1029
    json_object_put(request);
1030
    json_object_put(response_result);
1031

                
1032
    return TRUE;
1033
}
1034

                
1035
gboolean
1036
nntpgrab_glue_internal_config_get_opts(NntpgrabGlue *obj, NGConfigOpts *opts)
1037
{
1038
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1039
    struct json_object *request;
1040
    struct json_object *response_result;
1041
    char *errmsg = NULL;
1042
    char *download_directory;
1043
    char *temp_directory;
1044
    gboolean enable_intelligent_par2_downloading;
1045
    gboolean enable_par2_repair;
1046
    char *auto_import_directory;
1047
    gboolean enable_auto_import;
1048
    gboolean move_file_after_auto_import;
1049
    gboolean enable_auto_unpack;
1050
    gboolean enable_bandwidth_shaping;
1051
    int max_bandwidth;
1052
    gboolean enable_webserver;
1053
    int webserver_port;
1054
    gboolean enable_logger;
1055
    gboolean auto_remove_files;
1056

                
1057
    memset(opts, 0, sizeof(NGConfigOpts));
1058

                
1059
    request = create_new_json_request("nntpgrab_config_get_opts", NULL);
1060

                
1061
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1062
        g_print(__FILE__ ":%i nntpgrab_config_get_opts FAILED: %s\n", __LINE__, errmsg);
1063
        g_free(errmsg);
1064
        json_object_put(request);
1065
        return FALSE;
1066
    }
1067

                
1068
    get_method_param(response_result, "download_directory", "config_get_opts", string, download_directory);
1069
    get_method_param(response_result, "temp_directory", "config_get_opts", string, temp_directory);
1070
    get_method_param(response_result, "enable_intelligent_par2_downloading", "config_get_opts", boolean, enable_intelligent_par2_downloading);
1071
    get_method_param(response_result, "enable_par2_repair", "config_get_opts", boolean, enable_par2_repair);
1072
    get_method_param(response_result, "auto_import_directory", "config_get_opts", string, auto_import_directory);
1073
    get_method_param(response_result, "enable_auto_import", "config_get_opts", boolean, enable_auto_import);
1074
    get_method_param(response_result, "move_file_after_auto_import", "config_get_opts", boolean, move_file_after_auto_import);
1075
    get_method_param(response_result, "enable_auto_unpack", "config_get_opts", boolean, enable_auto_unpack);
1076
    get_method_param(response_result, "enable_bandwidth_shaping", "config_get_opts", boolean, enable_bandwidth_shaping);
1077
    get_method_param(response_result, "max_bandwidth", "config_get_opts", int, max_bandwidth);
1078
    get_method_param(response_result, "enable_webserver", "config_get_opts", boolean, enable_webserver);
1079
    get_method_param(response_result, "webserver_port", "config_get_opts", int, webserver_port);
1080
    get_method_param(response_result, "enable_logger", "config_get_opts", boolean, enable_logger);
1081
    get_method_param(response_result, "auto_remove_files", "config_get_opts", boolean, auto_remove_files);
1082

                
1083
    strncpy(opts->download_directory, download_directory, sizeof(opts->download_directory) - 1);
1084
    strncpy(opts->temp_directory, temp_directory, sizeof(opts->temp_directory) - 1);
1085
    opts->enable_intelligent_par2_downloading = enable_intelligent_par2_downloading;
1086
    opts->enable_par2_repair = enable_par2_repair;
1087
    strncpy(opts->auto_import_directory, auto_import_directory, sizeof(opts->auto_import_directory) - 1);
1088
    opts->enable_auto_import = enable_auto_import;
1089
    opts->move_file_after_auto_import = move_file_after_auto_import;
1090
    opts->enable_auto_unpack = enable_auto_unpack;
1091
    opts->enable_bandwidth_shaping = enable_bandwidth_shaping;
1092
    opts->max_bandwidth = max_bandwidth;
1093
    opts->enable_webserver = enable_webserver;
1094
    opts->webserver_port = webserver_port;
1095
    opts->enable_logger = enable_logger;
1096
    opts->auto_remove_files = auto_remove_files;
1097

                
1098
    json_object_put(request);
1099
    json_object_put(response_result);
1100

                
1101
    return TRUE;
1102
}
1103

                
1104
gboolean
1105
nntpgrab_glue_internal_config_set_opts(NntpgrabGlue *obj, NGConfigOpts opts)
1106
{
1107
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1108
    struct json_object *request;
1109
    struct json_object *request_params;
1110
    struct json_object *param;
1111
    struct json_object *response_result;
1112
    char *errmsg = NULL;
1113

                
1114
    request_params = json_object_new_array();
1115
    param = json_object_new_object();
1116
    json_object_object_add(param, "download_directory", json_object_new_string((char*) opts.download_directory));
1117
    json_object_object_add(param, "temp_directory", json_object_new_string((char*) opts.temp_directory));
1118
    json_object_object_add(param, "enable_intelligent_par2_downloading", json_object_new_boolean(opts.enable_intelligent_par2_downloading));
1119
    json_object_object_add(param, "enable_par2_repair", json_object_new_boolean(opts.enable_par2_repair));
1120
    json_object_object_add(param, "auto_import_directory", json_object_new_string((char*) opts.auto_import_directory));
1121
    json_object_object_add(param, "enable_auto_import", json_object_new_boolean(opts.enable_auto_import));
1122
    json_object_object_add(param, "move_file_after_auto_import", json_object_new_boolean(opts.move_file_after_auto_import));
1123
    json_object_object_add(param, "enable_auto_unpack", json_object_new_boolean(opts.enable_auto_unpack));
1124
    json_object_object_add(param, "enable_bandwidth_shaping", json_object_new_boolean(opts.enable_bandwidth_shaping));
1125
    json_object_object_add(param, "max_bandwidth", json_object_new_int(opts.max_bandwidth));
1126
    json_object_object_add(param, "enable_webserver", json_object_new_boolean(opts.enable_webserver));
1127
    json_object_object_add(param, "webserver_port", json_object_new_int(opts.webserver_port));
1128
    json_object_object_add(param, "enable_logger", json_object_new_boolean(opts.enable_logger));
1129
    json_object_object_add(param, "auto_remove_files", json_object_new_boolean(opts.auto_remove_files));
1130
    json_object_array_add(request_params, param);
1131
    request = create_new_json_request("nntpgrab_config_set_opts", request_params);
1132

                
1133
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1134
        g_print(__FILE__ ":%i nntpgrab_config_set_opts FAILED: %s\n", __LINE__, errmsg);
1135
        g_free(errmsg);
1136
        json_object_put(request);
1137
        return FALSE;
1138
    }
1139

                
1140
    json_object_put(request);
1141
    json_object_put(response_result);
1142

                
1143
    return TRUE;
1144
}
1145

                
1146
gboolean
1147
nntpgrab_glue_internal_config_get_folder_listing(NntpgrabGlue *obj, const char *parent, NGList **folders)
1148
{
1149
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1150
    struct json_object *request;
1151
    struct json_object *request_params;
1152
    struct json_object *response_result;
1153
    char *errmsg = NULL;
1154
    int i;
1155
    int len;
1156

                
1157
    request_params = json_object_new_array();
1158
    if (parent) {
1159
        json_object_array_add(request_params, json_object_new_string((char*) parent));
1160
    } else {
1161
        json_object_array_add(request_params, NULL);
1162
    }
1163
    request = create_new_json_request("nntpgrab_utils_get_folder_listing", request_params);
1164

                
1165
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1166
        g_print(__FILE__ ":%i nntpgrab_utils_get_folder_listing FAILED: %s\n", __LINE__, errmsg);
1167
        g_free(errmsg);
1168
        json_object_put(request);
1169
        return FALSE;
1170
    }
1171

                
1172
    if (json_object_get_type(response_result) != json_type_array) {
1173
        g_print(__FILE__ ":%i nntpgrab_utils_get_folder_listing FAILED: response_result is of invalid type, type = %i\n", __LINE__, json_object_get_type(response_result));
1174
        json_object_put(request);
1175
        json_object_put(response_result);
1176

                
1177
        return FALSE;
1178
    }
1179

                
1180
    len = json_object_array_length(response_result);
1181
    *folders = NULL;
1182
    for (i = 0; i < len; i++) {
1183
        struct json_object *param = json_object_array_get_idx(response_result, i);
1184
        NNTPGrabFolder *folder;
1185
        char *folder_str;
1186

                
1187
        g_return_val_if_fail(obj != NULL, FALSE);
1188

                
1189
        folder = g_slice_new0(NNTPGrabFolder);
1190

                
1191
        get_method_param(param, "folder", "nntpgrab_utils_get_folder_listing", string, folder_str);
1192
        get_method_param(param, "has_subfolders", "nntpgrab_utils_get_folder_listing", boolean, folder->has_subfolders);
1193
        strncpy(folder->folder, folder_str, sizeof(folder->folder) - 1);
1194

                
1195
        *folders = ng_list_append(*folders, folder);
1196
    }
1197

                
1198
    json_object_put(request);
1199
    json_object_put(response_result);
1200

                
1201
    return TRUE;
1202
}
1203

                
1204
gboolean
1205
nntpgrab_glue_internal_schedular_start(NntpgrabGlue *obj)
1206
{
1207
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1208
    struct json_object *request;
1209
    struct json_object *response_result;
1210
    char *errmsg = NULL;
1211

                
1212
    request = create_new_json_request("nntpgrab_schedular_start", NULL);
1213

                
1214
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1215
        g_print(__FILE__ ":%i nntpgrab_schedular_start FAILED: %s\n", __LINE__, errmsg);
1216
        g_free(errmsg);
1217
        json_object_put(request);
1218
        return FALSE;
1219
    }
1220

                
1221
    json_object_put(request);
1222
    json_object_put(response_result);
1223

                
1224
    return TRUE;
1225
}
1226

                
1227
gboolean
1228
nntpgrab_glue_internal_schedular_stop(NntpgrabGlue *obj, gboolean wait)
1229
{
1230
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1231
    struct json_object *request;
1232
    struct json_object *request_params;
1233
    struct json_object *response_result;
1234
    char *errmsg = NULL;
1235

                
1236
    request_params = json_object_new_array();
1237
    json_object_array_add(request_params, json_object_new_boolean(wait));
1238
    request = create_new_json_request("nntpgrab_schedular_stop", request_params);
1239

                
1240
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1241
        g_print(__FILE__ ":%i nntpgrab_schedular_stop FAILED: %s\n", __LINE__, errmsg);
1242
        g_free(errmsg);
1243
        json_object_put(request);
1244
        return FALSE;
1245
    }
1246

                
1247
    json_object_put(request);
1248
    json_object_put(response_result);
1249

                
1250
    return TRUE;
1251
}
1252

                
1253
NGSchedularState
1254
nntpgrab_glue_internal_schedular_get_state(NntpgrabGlue *obj)
1255
{
1256
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1257
    struct json_object *request;
1258
    struct json_object *response_result;
1259
    char *errmsg = NULL;
1260
    NGSchedularState ret;
1261

                
1262
    request = create_new_json_request("nntpgrab_schedular_get_state", NULL);
1263

                
1264
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1265
        g_print(__FILE__ ":%i nntpgrab_schedular_get_state FAILED: %s\n", __LINE__, errmsg);
1266
        g_free(errmsg);
1267
        json_object_put(request);
1268
        return SCHEDULAR_STATE_STOPPED;
1269
    }
1270

                
1271
    if (json_object_get_type(response_result) != json_type_int) {
1272
        g_print(__FILE__ ":%i nntpgrab_schedular_get_state FAILED: response_result is of invalid type, type = %i\n", __LINE__, json_object_get_type(response_result));
1273
        json_object_put(request);
1274
        json_object_put(response_result);
1275

                
1276
        return SCHEDULAR_STATE_STOPPED;
1277
    }
1278

                
1279
    ret = json_object_get_int(response_result);
1280

                
1281
    json_object_put(request);
1282
    json_object_put(response_result);
1283

                
1284
    return ret;
1285
}
1286

                
1287
gboolean
1288
nntpgrab_glue_internal_schedular_add_task_to_queue(NntpgrabGlue *obj, const char *collection_name, const char *subject, const char *poster, time_t stamp, nguint64 file_size, NGList *groups, NGList *parts, char **errmsg)
1289
{
1290
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1291
    struct json_object *request;
1292
    struct json_object *request_params;
1293
    struct json_object *response_result;
1294
    struct json_object *json_obj;
1295
    NGList *list;
1296

                
1297
    request_params = json_object_new_array();
1298
    json_object_array_add(request_params, json_object_new_string((char*) collection_name));
1299
    json_object_array_add(request_params, json_object_new_string((char*) subject));
1300
    json_object_array_add(request_params, json_object_new_string((char*) poster));
1301
    json_object_array_add(request_params, json_object_new_int(stamp));
1302
    json_object_array_add(request_params, json_object_new_int(file_size / 1024));
1303

                
1304
    json_obj = json_object_new_array();
1305
    json_object_array_add(request_params, json_obj);
1306
    list = groups;
1307
    while (list) {
1308
        char *groupname = list->data;
1309

                
1310
        json_object_array_add(json_obj, json_object_new_string(groupname));
1311

                
1312
        list = ng_list_next(list);
1313
    }
1314

                
1315
    json_obj = json_object_new_array();
1316
    json_object_array_add(request_params, json_obj);
1317
    list = parts;
1318
    while (list) {
1319
        NNTPGrabPart *part = list->data;
1320
        struct json_object *part_obj = json_object_new_object();
1321

                
1322
        json_object_object_add(part_obj, "message_id", json_object_new_string((char*) part->message_id));
1323
        json_object_object_add(part_obj, "part_num", json_object_new_int(part->part_num));
1324
        json_object_object_add(part_obj, "size", json_object_new_int(part->size));
1325
        json_object_array_add(json_obj, part_obj);
1326

                
1327
        list = ng_list_next(list);
1328
    }
1329

                
1330
    request = create_new_json_request("nntpgrab_schedular_add_file_to_queue", request_params);
1331

                
1332
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1333
        json_object_put(request);
1334
        return FALSE;
1335
    }
1336

                
1337
    json_object_put(request);
1338
    json_object_put(response_result);
1339

                
1340
    return TRUE;
1341
}
1342

                
1343
gboolean
1344
nntpgrab_glue_internal_schedular_del_task_from_queue(NntpgrabGlue *obj, const char *collection_name, const char *subject, char **errmsg)
1345
{
1346
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1347
    struct json_object *request;
1348
    struct json_object *request_params;
1349
    struct json_object *response_result;
1350

                
1351
    request_params = json_object_new_array();
1352
    json_object_array_add(request_params, json_object_new_string((char*) collection_name));
1353
    if (subject) {
1354
        json_object_array_add(request_params, json_object_new_string((char*) subject));
1355
    } else {
1356
        json_object_array_add(request_params, NULL);
1357
    }
1358
    request = create_new_json_request("nntpgrab_schedular_del_file_from_queue", request_params);
1359

                
1360
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1361
        json_object_put(request);
1362
        return FALSE;
1363
    }
1364

                
1365
    json_object_put(request);
1366
    json_object_put(response_result);
1367

                
1368
    return TRUE;
1369
}
1370

                
1371
gboolean
1372
nntpgrab_glue_internal_schedular_restart_task(NntpgrabGlue *obj, const char *collection_name, const char *subject, char **errmsg)
1373
{
1374
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1375
    struct json_object *request;
1376
    struct json_object *request_params;
1377
    struct json_object *response_result;
1378

                
1379
    g_return_val_if_fail(collection_name != NULL, FALSE);
1380
    /* NOTE: subject CAN be NULL */
1381

                
1382
    request_params = json_object_new_array();
1383
    json_object_array_add(request_params, json_object_new_string((char*) collection_name));
1384
    if (subject) {
1385
        json_object_array_add(request_params, json_object_new_string((char*) subject));
1386
    } else {
1387
        json_object_array_add(request_params, NULL);
1388
    }
1389
    request = create_new_json_request("nntpgrab_schedular_restart_file", request_params);
1390

                
1391
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1392
        json_object_put(request);
1393
        return FALSE;
1394
    }
1395

                
1396
    json_object_put(request);
1397
    json_object_put(response_result);
1398

                
1399
    return TRUE;
1400
}
1401

                
1402
gboolean
1403
nntpgrab_glue_internal_schedular_save_queue(NntpgrabGlue *obj, char **errmsg)
1404
{
1405
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1406
    struct json_object *request;
1407
    struct json_object *response_result;
1408

                
1409
    request = create_new_json_request("nntpgrab_schedular_save_queue", NULL);
1410

                
1411
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1412
        json_object_put(request);
1413
        return FALSE;
1414
    }
1415

                
1416
    json_object_put(request);
1417
    json_object_put(response_result);
1418

                
1419
    return TRUE;
1420
}
1421

                
1422
static ForeachCollectionFunc collection_func_global = NULL;
1423
static ForeachFileFunc file_func_global = NULL;
1424
static ForeachGroupFunc group_func_global = NULL;
1425
static void *foreach_task_user_data_global = NULL;
1426

                
1427
static void
1428
process_foreach_collection_event(const char *msg, struct json_object *params)
1429
{
1430
    char *collection_name = NULL;
1431
    char *poster = NULL;
1432
    guint64 total_size = 0;
1433
    guint64 total_size_remaining = 0;
1434
    int position = 0;
1435

                
1436
    if (!collection_func_global) {
1437
        return;
1438
    }
1439

                
1440
    get_param(msg, params, "collection_name", "foreach_collection_event", string, collection_name);
1441
    get_param(msg, params, "poster", "foreach_collection_event", string, poster);
1442
    get_param(msg, params, "total_size", "foreach_collection_event", int, total_size);
1443
    get_param(msg, params, "total_size_remaining", "foreach_collection_event", int, total_size_remaining);
1444
    get_param(msg, params, "position", "foreach_collection_event", int, position);
1445

                
1446
    /* JSON doesn't support 64bit integers so all file sizes are in KB instead of bytes */
1447
    total_size *= 1024;
1448
    total_size_remaining *= 1024;
1449

                
1450
    collection_func_global(collection_name, poster, total_size, total_size_remaining, position, foreach_task_user_data_global);
1451
}
1452

                
1453
static void
1454
process_foreach_file_event(const char *msg, struct json_object *params)
1455
{
1456
    char *collection_name = NULL;
1457
    char *subject = NULL;
1458
    char *poster;
1459
    int stamp;
1460
    guint64 file_size;
1461
    guint64 file_size_remaining;
1462
    int num_parts_total;
1463
    int num_parts_downloaded;
1464
    int num_parts_failed;
1465
    NGTaskState status;
1466
    char *filename;
1467
    int position;
1468

                
1469
    if (!file_func_global) {
1470
        return;
1471
    }
1472

                
1473
    get_param(msg, params, "collection_name", "foreach_file_event", string, collection_name);
1474
    get_param(msg, params, "subject", "foreach_file_event", string, subject);
1475
    get_param(msg, params, "poster", "foreach_file_event", string, poster);
1476
    get_param(msg, params, "stamp", "foreach_file_event", int, stamp);
1477
    get_param(msg, params, "file_size", "foreach_file_event", int, file_size);
1478
    get_param(msg, params, "file_size_remaining", "foreach_file_event", int, file_size_remaining);
1479
    get_param(msg, params, "num_parts_total", "foreach_file_event", int, num_parts_total);
1480
    get_param(msg, params, "num_parts_downloaded", "foreach_file_event", int, num_parts_downloaded);
1481
    get_param(msg, params, "num_parts_failed", "foreach_file_event", int, num_parts_failed);
1482
    get_param(msg, params, "status", "foreach_file_event", int, status);
1483
    get_param(msg, params, "filename", "foreach_file_event", string, filename);
1484
    get_param(msg, params, "position", "foreach_file_event", int, position);
1485

                
1486
    /* JSON doesn't support 64bit integers so all file sizes are in KB instead of bytes */
1487
    file_size *= 1024;
1488
    file_size_remaining *= 1024;
1489

                
1490
    file_func_global(collection_name, subject, poster, stamp, file_size, file_size_remaining, position, num_parts_total, num_parts_downloaded, num_parts_failed, status, filename, foreach_task_user_data_global);
1491
}
1492

                
1493
static void
1494
process_foreach_group_event(const char *msg, struct json_object *params)
1495
{
1496
    char *collection_name = NULL;
1497
    char *subject = NULL;
1498
    char *group = NULL;
1499

                
1500
    if (!group_func_global) {
1501
        return;
1502
    }
1503

                
1504
    get_param(msg, params, "collection_name", "foreach_group_event", string, collection_name);
1505
    get_param(msg, params, "subject", "foreach_group_event", string, subject);
1506
    get_param(msg, params, "group", "foreach_group_event", string, group);
1507

                
1508
    group_func_global(collection_name, subject, group, foreach_task_user_data_global);
1509
}
1510

                
1511
gboolean
1512
nntpgrab_glue_internal_schedular_foreach_task(NntpgrabGlue *obj, ForeachCollectionFunc collection_func, ForeachFileFunc file_func, ForeachGroupFunc group_func, void *data)
1513
{
1514
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1515
    struct json_object *request;
1516
    struct json_object *response_result;
1517
    char *errmsg = NULL;
1518
    gboolean ret;
1519

                
1520
    g_return_val_if_fail(obj != NULL, FALSE);
1521
    g_return_val_if_fail(collection_func != NULL || file_func != NULL || group_func != NULL, FALSE);
1522

                
1523
    request = create_new_json_request("nntpgrab_schedular_foreach_task", NULL);
1524

                
1525
    collection_func_global = collection_func;
1526
    file_func_global = file_func;
1527
    group_func_global = group_func;
1528
    foreach_task_user_data_global = data;
1529

                
1530
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1531
        g_free(errmsg);
1532
        json_object_put(request);
1533
        collection_func_global = NULL;
1534
        file_func_global = NULL;
1535
        group_func_global = NULL;
1536
        foreach_task_user_data_global = NULL;
1537
        return FALSE;
1538
    }
1539

                
1540
    collection_func_global = NULL;
1541
    file_func_global = NULL;
1542
    group_func_global = NULL;
1543
    foreach_task_user_data_global = NULL;
1544

                
1545
    if (json_object_get_type(response_result) != json_type_boolean) {
1546
        // invalid type
1547
        g_print(__FILE__ ":%i response is of invalid type for method 'schedular_foreach_task', response = %s\n", __LINE__, json_object_get_string(response_result));
1548
        json_object_put(request);
1549
        json_object_put(response_result);
1550
        return FALSE;
1551
    }
1552

                
1553
    ret = json_object_get_boolean(response_result);
1554

                
1555
    json_object_put(request);
1556
    json_object_put(response_result);
1557

                
1558
    return ret;
1559
}
1560

                
1561
gboolean
1562
nntpgrab_glue_internal_schedular_move_task(NntpgrabGlue *obj, const char *collection_name_src, const char *subject_src, const char *collection_name_dest, int position_dest)
1563
{
1564
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1565
    struct json_object *request;
1566
    struct json_object *request_params;
1567
    struct json_object *response_result;
1568
    char *errmsg = NULL;
1569

                
1570
    request_params = json_object_new_array();
1571
    json_object_array_add(request_params, json_object_new_string((char*) collection_name_src));
1572
    json_object_array_add(request_params, json_object_new_string((char*) subject_src));
1573
    json_object_array_add(request_params, json_object_new_string((char*) collection_name_dest));
1574
    json_object_array_add(request_params, json_object_new_int(position_dest));
1575
    request = create_new_json_request("nntpgrab_schedular_move_file", request_params);
1576

                
1577
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1578
        g_print(__FILE__ ":%i nntpgrab_schedular_move_file FAILED: %s\n", __LINE__, errmsg);
1579
        g_free(errmsg);
1580
        json_object_put(request);
1581
        return FALSE;
1582
    }
1583

                
1584
    json_object_put(request);
1585
    json_object_put(response_result);
1586

                
1587
    return TRUE;
1588
}
1589

                
1590
gboolean
1591
nntpgrab_glue_internal_schedular_move_collection(NntpgrabGlue *obj, const char *collection_name, int new_position)
1592
{
1593
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1594
    struct json_object *request;
1595
    struct json_object *request_params;
1596
    struct json_object *response_result;
1597
    char *errmsg = NULL;
1598

                
1599
    request_params = json_object_new_array();
1600
    json_object_array_add(request_params, json_object_new_string((char*) collection_name));
1601
    json_object_array_add(request_params, json_object_new_int(new_position));
1602
    request = create_new_json_request("nntpgrab_schedular_move_collection", request_params);
1603

                
1604
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1605
        g_print(__FILE__ ":%i nntpgrab_schedular_move_collection FAILED: %s\n", __LINE__, errmsg);
1606
        g_free(errmsg);
1607
        json_object_put(request);
1608
        return FALSE;
1609
    }
1610

                
1611
    json_object_put(request);
1612
    json_object_put(response_result);
1613

                
1614
    return TRUE;
1615
}
1616

                
1617
gboolean
1618
nntpgrab_glue_internal_schedular_mark_task_optional(NntpgrabGlue *obj, const char *collection_name, const char *subject, ngboolean is_optional)
1619
{
1620
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1621
    struct json_object *request;
1622
    struct json_object *request_params;
1623
    struct json_object *response_result;
1624
    char *errmsg = NULL;
1625

                
1626
    request_params = json_object_new_array();
1627
    json_object_array_add(request_params, json_object_new_string((char*) collection_name));
1628
    json_object_array_add(request_params, json_object_new_string((char*) subject));
1629
    json_object_array_add(request_params, json_object_new_boolean(is_optional));
1630
    request = create_new_json_request("nntpgrab_schedular_mark_task_optional", request_params);
1631

                
1632
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1633
        g_print(__FILE__ ":%i nntpgrab_schedular_mark_task_optional FAILED: %s\n", __LINE__, errmsg);
1634
        g_free(errmsg);
1635
        json_object_put(request);
1636
        return FALSE;
1637
    }
1638

                
1639
    json_object_put(request);
1640
    json_object_put(response_result);
1641

                
1642
    return TRUE;
1643
}
1644

                
1645
NGList *
1646
nntpgrab_glue_internal_plugins_get_avail_plugins(NntpgrabGlue *obj)
1647
{
1648
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1649
    struct json_object *request;
1650
    struct json_object *response_result;
1651
    NGList *ret = NULL;
1652
    char *errmsg = NULL;
1653
    int i;
1654
    int len;
1655

                
1656
    request = create_new_json_request("nntpgrab_plugins_get_avail_plugins", NULL);
1657

                
1658
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1659
        g_print(__FILE__ ":%i nntpgrab_plugins_get_avail_plugins FAILED: %s\n", __LINE__, errmsg);
1660
        g_free(errmsg);
1661
        json_object_put(request);
1662
        return NULL;
1663
    }
1664

                
1665
    len = json_object_array_length(response_result);
1666
    for (i = 0; i < len; i++) {
1667
        struct json_object *obj = json_object_array_get_idx(response_result, i);
1668
        char *servername;
1669

                
1670
        g_return_val_if_fail(obj != NULL, NULL);
1671

                
1672
        servername = json_object_get_string(obj);
1673

                
1674
        g_return_val_if_fail(servername != NULL, NULL);
1675

                
1676
        ret = ng_list_append(ret, g_strdup(servername));
1677
    }
1678

                
1679
    json_object_put(request);
1680
    json_object_put(response_result);
1681

                
1682
    return ret;
1683
}
1684

                
1685
gboolean
1686
nntpgrab_glue_internal_plugins_get_plugin_info(NntpgrabGlue *obj, const char *plugin_name, NNTPGrabPluginInfo *plugin_info)
1687
{
1688
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1689
    struct json_object *request;
1690
    struct json_object *request_params;
1691
    struct json_object *response_result;
1692
    char *errmsg = NULL;
1693
    char *name;
1694
    char *version;
1695
    char *author;
1696
    char *url;
1697
    char *description;
1698
    gboolean is_loaded;
1699
    gboolean is_persistent;
1700

                
1701
    g_return_val_if_fail(plugin_name != NULL, FALSE);
1702
    g_return_val_if_fail(plugin_info != NULL, FALSE);
1703

                
1704
    request_params = json_object_new_array();
1705
    json_object_array_add(request_params, json_object_new_string((char*) plugin_name));
1706
    request = create_new_json_request("nntpgrab_plugins_get_plugin_info", request_params);
1707

                
1708
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1709
        g_print(__FILE__ ":%i nntpgrab_plugins_get_plugin_info FAILED: %s\n", __LINE__, errmsg);
1710
        g_free(errmsg);
1711
        json_object_put(request);
1712
        return FALSE;
1713
    }
1714

                
1715
    get_method_param(response_result, "name", "plugins_get_plugin_info", string, name);
1716
    get_method_param(response_result, "version", "plugins_get_plugin_info", string, version);
1717
    get_method_param(response_result, "author", "plugins_get_plugin_info", string, author);
1718
    get_method_param(response_result, "url", "plugins_get_plugin_info", string, url);
1719
    get_method_param(response_result, "description", "plugins_get_plugin_info", string, description);
1720
    get_method_param(response_result, "is_loaded", "plugins_get_plugin_info", boolean, is_loaded);
1721
    get_method_param(response_result, "is_persistent", "plugins_get_plugin_info", boolean, is_persistent);
1722

                
1723
    memset(plugin_info, 0, sizeof(NNTPGrabPluginInfo));
1724

                
1725
    strncpy(plugin_info->name, name, sizeof(plugin_info->name));
1726
    strncpy(plugin_info->version, version, sizeof(plugin_info->version));
1727
    strncpy(plugin_info->author, author, sizeof(plugin_info->author));
1728
    strncpy(plugin_info->url, url, sizeof(plugin_info->url));
1729
    strncpy(plugin_info->description, description, sizeof(plugin_info->description));
1730
    plugin_info->is_loaded = is_loaded;
1731
    plugin_info->is_persistent = is_persistent;
1732

                
1733
    json_object_put(request);
1734
    json_object_put(response_result);
1735

                
1736
    return TRUE;
1737
}
1738

                
1739
gboolean
1740
nntpgrab_glue_internal_plugins_load_plugin(NntpgrabGlue *obj, const char *plugin_name, char **errmsg)
1741
{
1742
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1743
    struct json_object *request;
1744
    struct json_object *request_params;
1745
    struct json_object *response_result;
1746

                
1747
    request_params = json_object_new_array();
1748
    json_object_array_add(request_params, json_object_new_string((char*) plugin_name));
1749
    request = create_new_json_request("nntpgrab_plugins_load_plugin", request_params);
1750

                
1751
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1752
        json_object_put(request);
1753
        return FALSE;
1754
    }
1755

                
1756
    json_object_put(request);
1757
    json_object_put(response_result);
1758

                
1759
    return TRUE;
1760
}
1761

                
1762
gboolean
1763
nntpgrab_glue_internal_plugins_unload_plugin(NntpgrabGlue *obj, const char *plugin_name, char **errmsg)
1764
{
1765
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1766
    struct json_object *request;
1767
    struct json_object *request_params;
1768
    struct json_object *response_result;
1769

                
1770
    request_params = json_object_new_array();
1771
    json_object_array_add(request_params, json_object_new_string((char*) plugin_name));
1772
    request = create_new_json_request("nntpgrab_plugins_unload_plugin", request_params);
1773

                
1774
    if (!(response_result = send_request_and_wait_for_response(glue, request, errmsg))) {
1775
        json_object_put(request);
1776
        return FALSE;
1777
    }
1778

                
1779
    json_object_put(request);
1780
    json_object_put(response_result);
1781

                
1782
    return TRUE;
1783
}
1784

                
1785
gboolean
1786
nntpgrab_glue_internal_plugins_set_persistent(NntpgrabGlue *obj, const char *plugin_name, ngboolean persistent)
1787
{
1788
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1789
    struct json_object *request;
1790
    struct json_object *request_params;
1791
    struct json_object *response_result;
1792
    char *errmsg = NULL;
1793

                
1794
    request_params = json_object_new_array();
1795
    json_object_array_add(request_params, json_object_new_string((char*) plugin_name));
1796
    json_object_array_add(request_params, json_object_new_boolean(persistent));
1797
    request = create_new_json_request("nntpgrab_plugins_set_persistent", request_params);
1798

                
1799
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1800
        g_print(__FILE__ ":%i nntpgrab_plugins_set_persistent FAILED: %s\n", __LINE__, errmsg);
1801
        g_free(errmsg);
1802
        json_object_put(request);
1803
        return FALSE;
1804
    }
1805

                
1806
    json_object_put(request);
1807
    json_object_put(response_result);
1808

                
1809
    return TRUE;
1810
}
1811

                
1812
void
1813
nntpgrab_glue_internal_set_emit_log_messages(NntpgrabGlue *obj, ngboolean val)
1814
{
1815
    NntpgrabGlue *glue = NNTPGRAB_GLUE(obj);
1816
    struct json_object *request;
1817
    struct json_object *request_params;
1818
    struct json_object *response_result;
1819
    char *errmsg = NULL;
1820

                
1821
    request_params = json_object_new_array();
1822
    json_object_array_add(request_params, json_object_new_boolean(val));
1823
    request = create_new_json_request("nntpgrab_set_emit_log_messages", request_params);
1824

                
1825
    if (!(response_result = send_request_and_wait_for_response(glue, request, &errmsg))) {
1826
        g_print(__FILE__ ":%i nntpgrab_set_emit_log_messages FAILED: %s\n", __LINE__, errmsg);
1827
        g_free(errmsg);
1828
        json_object_put(request);
1829
        return;
1830
    }
1831

                
1832
    json_object_put(response_result);
1833
    json_object_put(request);
1834
}