Revision 1863

trunk/nntpgrab_core/download_queue.c (revision 1863)
18 18

                
19 19
#include 
20 20
#include 
21
#include 
21 22
#include 
22 23
#include 
23 24
#include 
trunk/nntpgrab_core/download_thread.c (revision 1863)
21 21
#endif
22 22

                
23 23
#include 
24
#include 
24 25
#include 
25 26
#include 
26 27
#include 
trunk/nntpgrab_core/nntpconnection_backend_native.c (revision 1863)
60 60
#include "nntpgrab_plugin.h"
61 61
#include "download_thread.h"
62 62

                
63
#if !GLIB_CHECK_VERSION(2,20,0) && !defined(WIN32)
64
/* The g_poll function was added in GLib 2.20.0.
65
 * Provide an implementation of this function for environments
66
 * which have an older version of GLib installed.
67
 * Source: https://git.gnome.org/browse/glib/tree/glib/gpoll.c
68
 */
69
#include 
70

                
71
static gint
72
g_poll (GPollFD *fds, guint nfds, gint timeout)
73
{
74
    return poll ((struct pollfd *)fds, nfds, timeout);
75
}
76
#endif
77

                
78
#ifdef WIN32
79
/* The g_poll function only works on HANDLE's on Win32
80
 * so we replace the GLib implementation with one that
81
 * uses the select() function instead of poll().
82
 * The code below is taken from glib's gpoll.c where
83
 * it is a fallback path for platforms which don't
84
 * have a poll function() */
85
#undef g_poll
86
#define g_poll win32_g_poll
87
static gint
88
win32_g_poll (GPollFD *fds, guint nfds, gint timeout)
89
{
90
    struct timeval tv;
91
    FD_SET rset, wset, xset;
92
    GPollFD *f;
93
    int ready;
94
    int maxfd = 0;
95

                
96
    FD_ZERO (&rset);
97
    FD_ZERO (&wset);
98
    FD_ZERO (&xset);
99

                
100
    for (f = fds; f < &fds[nfds]; ++f)
101
        if (f->fd >= 0)
102
        {
103
            if (f->events & G_IO_IN)
104
                FD_SET (f->fd, &rset);
105
            if (f->events & G_IO_OUT)
106
                FD_SET (f->fd, &wset);
107
            if (f->events & G_IO_PRI)
108
                FD_SET (f->fd, &xset);
109
            if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI)))
110
                maxfd = f->fd;
111
        }
112

                
113
    tv.tv_sec = timeout / 1000;
114
    tv.tv_usec = (timeout % 1000) * 1000;
115

                
116
    ready = select (maxfd + 1, &rset, &wset, &xset,
117
                    timeout == -1 ? NULL : &tv);
118
    if (ready > 0)
119
        for (f = fds; f < &fds[nfds]; ++f)
120
        {
121
            f->revents = 0;
122
            if (f->fd >= 0)
123
            {
124
                if (FD_ISSET (f->fd, &rset))
125
                    f->revents |= G_IO_IN;
126
                if (FD_ISSET (f->fd, &wset))
127
                    f->revents |= G_IO_OUT;
128
                if (FD_ISSET (f->fd, &xset))
129
                    f->revents |= G_IO_PRI;
130
            }
131
        }
132

                
133
    return ready;
134
}
135
#endif
136

                
63 137
struct _NntpconnectionBackendNativePrivate {
64 138
    char recv_buffer[65500];    /* NOTE: private GObject fields may only be 64K in total */
65 139
    int recv_buffer_length;
trunk/tests/test_nntpconnection_backend.c (revision 1863)
26 26
#include "nntpconnection_utils.h"
27 27
#include "nntpconnection_backend_native.h"
28 28

                
29
#if GLIB_CHECK_VERSION(2,22,0)
29
#ifdef HAVE_GIO_SOCKET
30 30
#include "nntpconnection_backend_gio.h"
31 31
#endif
32 32

                
... ...
216 216
    g_object_unref(conn);
217 217
}
218 218

                
219
#if GLIB_CHECK_VERSION(2,22,0)
219
#ifdef HAVE_GIO_SOCKET
220 220
static
221 221
void test_backend_gio(void)
222 222
{
... ...
248 248

                
249 249
    g_test_add_func("/nntpconnection/backend/native", test_backend_native);
250 250
    g_test_add_func("/nntpconnection/backend/native/ssl", test_backend_native_ssl);
251
#if GLIB_CHECK_VERSION(2,22,0)
251
#ifdef HAVE_GIO_SOCKET
252 252
    g_test_add_func("/nntpconnection/backend/gio", test_backend_gio);
253 253
#endif
254 254
#ifdef HAVE_GLIB_NETWORKING
trunk/tests/test_nzbcreator.c (revision 1863)
148 148
int main(int argc, char **argv)
149 149
{
150 150
    g_type_init();
151
    g_thread_init(NULL);
152

                
151 153
    g_test_init(&argc, &argv, NULL);
152 154
    g_test_bug_base("https://www.nntpgrab.nl");
153 155

                
trunk/tests/Makefile.am (revision 1863)
1 1
include $(top_srcdir)/Makefile.decl
2 2

                
3 3
if BUILD_TESTSUITE
4
noinst_PROGRAMS = test_schedular test_regex test_nzbcreator test_nntpconnection_backend test_jsonrpc test_download_queue
4
noinst_PROGRAMS = test_schedular test_regex test_jsonrpc test_download_queue
5 5

                
6
INCLUDES = $(GLIB_CFLAGS) -I$(top_srcdir)/base -I$(top_srcdir)/plugins -I$(top_srcdir)/nntpgrab_core
6
if ENABLE_ONLINE_TESTS
7
noinst_PROGRAMS += test_nzbcreator test_nntpconnection_backend
8
endif
9

                
10
INCLUDES = $(GLIB_CFLAGS) $(GIO_CFLAGS) $(LIBPROXY_CFLAGS) $(OPENSSL_CFLAGS) $(NSS_CFLAGS) $(GNUTLS_CFLAGS) $(LIBPROXY_CFLAGS) -I$(top_srcdir)/base -I$(top_srcdir)/plugins -I$(top_srcdir)/nntpgrab_core
7 11
AM_CFLAGS = -Wall
8 12

                
9 13
# The testcases test_nntp_connection and test_configuration require the
... ...
36 40
test_par2_LDADD = $(top_srcdir)/plugins/par2/libnntpgrab_plugin_par2.la
37 41
test_par2_SOURCES = test_par2.c
38 42

                
39
test_nzbcreator_LDADD = $(top_srcdir)/base/libnntpgrab_utils.la
40
test_nzbcreator_SOURCES = test_nzbcreator.c
41

                
42 43
test_unpack_CPPFLAGS = -I$(top_srcdir)/plugins/unpack
43 44
test_unpack_LDADD = $(top_srcdir)/plugins/unpack/libnntpgrab_plugin_unpack.la
44 45
test_unpack_SOURCES = test_unpack.c
45 46

                
46
test_nntpconnection_backend_LDADD = $(GLIB_LIBS) $(GIO_LIBS) $(LIBPROXY_LIBS) $(OPENSSL_LIBS) $(NSS_LIBS) $(GNUTLS_LIBS)
47
if ENABLE_ONLINE_TESTS
48
test_nzbcreator_LDADD = $(top_srcdir)/base/libnntpgrab_utils.la
49
test_nzbcreator_SOURCES = test_nzbcreator.c
50

                
51
test_nntpconnection_backend_LDADD = $(GLIB_LIBS) $(GIO_LIBS) $(LIBPROXY_LIBS) $(OPENSSL_LIBS) $(NSS_LIBS) $(GNUTLS_LIBS) $(LIBPROXY_LIBS)
47 52
test_nntpconnection_backend_SOURCES =  test_nntpconnection_backend.c \
48 53
                                        $(top_srcdir)/nntpgrab_core/nntpconnection_utils.c \
49 54
                                        $(top_srcdir)/nntpgrab_core/nntpconnection_backend_iface.c \
50 55
                                        $(top_srcdir)/nntpgrab_core/nntpconnection_backend_gio.c \
51 56
                                        $(top_srcdir)/nntpgrab_core/nntpconnection_backend_native.c
52 57

                
58
TEST_PROGS += test_nzbcreator test_nntpconnection_backend
59
endif
60

                
53 61
test_jsonrpc_CFLAGS = -I$(top_srcdir)/plugins/jsonrpc
54 62
test_jsonrpc_LDADD = $(GLIB_LIBS)
55 63
test_jsonrpc_SOURCES =         test_jsonrpc.c \
... ...
76 84
                               $(top_srcdir)/nntpgrab_core/download_queue.c \
77 85
                               $(top_srcdir)/nntpgrab_core/queue_rawfile.c
78 86

                
79
TEST_PROGS += test_nzbcreator test_nntpconnection_backend test_jsonrpc test_download_queue
87
TEST_PROGS += test_jsonrpc test_download_queue
88

                
80 89
endif
81 90

                
82 91
noinst_HEADERS = common.h test_download_queue.h
92

                
93
EXTRA_DIST = download_queue_with_1_file.db valgrind.supp
94

                
trunk/autogen.sh (revision 1863)
23 23
cd client/web/module
24 24
phpize
25 25
# Perform a dirty hack to the PHP module Makefile so that
26
# the command 'make dist' won't fail
26
# the commands 'make dist' and 'make check' won't fail
27 27
chmod 600 Makefile.global
28 28
echo "distdir:" >> Makefile.global
29
echo "check:" >> Makefile.global
29 30

                
30 31
# Another dirty hack so that the PHP knows the version information
31 32
VERSION=`cat ../../../configure | grep -A2  "PACKAGE='nntpgrab'"  | grep VERSION | sed s/\ VERSION=\'// | sed s/\'//`
trunk/plugins/par2/Makefile.am (revision 1863)
18 18
#nntpgrab_par2repair_CXXFLAGS = ${nntpgrab_par2repair_CFLAGS}
19 19
#nntpgrab_par2repair_LDADD = $(GLIB_LIBS) $(LIBPAR2_LIBS)
20 20

                
21
EXTRA_DIST += par2check.h marshall.list
21
EXTRA_DIST += par2check.c par2check.h marshall.list
22 22

                
23 23
BUILT_SOURCES = marshalers.h marshalers.c
24 24

                
trunk/configure.in (revision 1863)
53 53
       esac],[proxy=true])
54 54

                
55 55
AC_ARG_ENABLE(testsuite,
56
        [  --disable-testsuite     Build the testsuite (enabled by default)],
56
       [  --disable-testsuite     Build the testsuite (enabled by default)],
57
       [case "x${enableval}" in
58
               xyes) testsuite=true ;;
59
               xno) testsuite=false ;;
60
               *) AC_MSG_ERROR(bad value ${enableval} for --disable-testsuite) ;;
61
       esac],[testsuite=true])
62

                
63
AC_ARG_ENABLE(online-tests,
64
       [  --disable-online-tests  Disable the tests from the testsuite which require an internet connection (enabled by default)],
57 65
        [case "x${enableval}" in
58
                xyes) testsuite=true ;;
59
                xno) testsuite=false ;;
60
                *) AC_MSG_ERROR(bad value ${enableval} for --disable-testsuite) ;;
61
        esac],[testsuite=true])
62
AM_CONDITIONAL(BUILD_TESTSUITE, $testsuite)
66
                xyes) online_tests=true ;;
67
                xno) online_tests=false ;;
68
                *) AC_MSG_ERROR(bad value ${enableval} for --disable-online-tests) ;;
69
        esac],[online_tests=true])
63 70

                
64 71
# Search for GLib
65 72
PKG_CHECK_MODULES(GLIB,
... ...
74 81
       have_gio=false; [AC_MSG_RESULT([* GLib 2.16.0 or higher could not be found. Without GLib 2.16.0, automatic NZB import won't be possible])])
75 82

                
76 83
# Search for socket support in GIO
77
AC_MSG_CHECKING(if GIO >= 2.22.0)
78
pkg-config --atleast-version=2.22.0 gio-2.0
84
AC_MSG_CHECKING(if GIO >= 2.26.0)
85
pkg-config --atleast-version=2.26.0 gio-2.0
79 86
if test `echo $?` = 0; then
80 87
       AC_MSG_RESULT([yes]);
81 88
       AC_DEFINE_UNQUOTED(HAVE_GIO_SOCKET, 1, [Do we have socket support in GIO])
... ...
83 90
       AC_MSG_RESULT([no])
84 91
fi
85 92

                
93
# Search for GTest support in GLib
94
AC_MSG_CHECKING(if we need to enable the testsuite)
95
pkg-config --atleast-version=2.16.0 glib-2.0
96
if test `echo $?` != 0; then
97
       if test "$testsuite" = "true" ; then
98
               testsuite=false
99
       fi
100
fi
101
if test "$testsuite" = "true" ; then
102
       AC_MSG_RESULT([yes])
103
else
104
       AC_MSG_RESULT([no])
105
fi
106
AM_CONDITIONAL(BUILD_TESTSUITE, $testsuite)
107
AM_CONDITIONAL(ENABLE_ONLINE_TESTS, $online_tests)
108

                
86 109
# Search for dbus-glib
87 110
if test "$dbus" = "true" ; then
88 111
       PKG_CHECK_MODULES(DBUS,
trunk/Makefile.am (revision 1863)
5 5

                
6 6
DISTCHECK_CONFIGURE_FLAGS = --enable-introspection --enable-gtk-doc
7 7

                
8
EXTRA_DIST +=  intltool-extract.in intltool-merge.in intltool-update.in config.h.win32 \
8
EXTRA_DIST +=  intltool-extract.in intltool-merge.in intltool-update.in \
9 9
               server_qt/server_qt.pro \
10 10
               server_qt/server_qt.rc \
11 11
               server_qt/nntpgrab_server_qt.desktop \
trunk/client/gui/par2.c (revision 1863)
17 17
*/
18 18

                
19 19
#include 
20
#include 
20 21
#include "gui.h"
21 22

                
22 23
static GtkWidget *treeviewPAR2AndUnpack = NULL;
trunk/client/gui/gui_plugins.c (revision 1863)
16 16
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 17
*/
18 18

                
19
#include 
19 20
#include "gui.h"
20 21
#include "config_gui.h"
21 22

                
trunk/client/gui/nzb.c (revision 1863)
429 429
    char *contents = NULL;
430 430
    char *uri = NULL;
431 431
    char *dirname;
432
#if GLIB_CHECK_VERSION(2,16,0)
432 433
    gboolean ret;
433
#if GLIB_CHECK_VERSION(2,16,0)
434 434
    GFile *file;
435 435
#endif
436 436
    time_t now = time(NULL);
trunk/client/gui/auto_import.c (revision 1863)
16 16
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 17
*/
18 18

                
19
#include 
19 20
#include "gui.h"
20 21
#include "config_gui.h"
21 22
#include "nntpgrab_automation.h"
trunk/client/gui/gui_nzbcreator.c (revision 1863)
193 193

                
194 194
    return NULL;
195 195
}
196
#endif
197 196

                
198 197
static void
199 198
perform_search(void)
... ...
226 225
    g_return_if_fail(g_thread_create(perform_search_func, &cached_search_opts, FALSE, NULL));
227 226
}
228 227

                
229
G_MODULE_EXPORT void
230
on_btnNZBCreatorPerformSearch_clicked(GtkWidget *caller, gpointer data)
231
{
232
#ifdef HAVE_SOUP
233
    NZBCreatorSearchOpts opts;
234
    GtkWidget *entryNZBCreatorQuery = nntpgrab_gui_base_get_widget("entryNZBCreatorQuery");
235
    GtkWidget *radNZBCreatorSubjects = nntpgrab_gui_base_get_widget("radNZBCreatorSubjects");
236
    GtkWidget *radNZBCreatorFiles = nntpgrab_gui_base_get_widget("radNZBCreatorFiles");
237
    GtkWidget *radNZBCreatorPosters = nntpgrab_gui_base_get_widget("radNZBCreatorPosters");
238
    GtkWidget *comboNZBCreatorMaxAge = nntpgrab_gui_base_get_widget("comboNZBCreatorMaxAge");
239
    GtkWidget *spinNZBCreatorMinFileSize = nntpgrab_gui_base_get_widget("spinNZBCreatorMinFileSize");
240
    GtkWidget *spinNZBCreatorMaxFileSize = nntpgrab_gui_base_get_widget("spinNZBCreatorMaxFileSize");
241
    GtkWidget *comboNZBCreatorMinFileSize = nntpgrab_gui_base_get_widget("comboNZBCreatorMinFileSize");
242
    GtkWidget *comboNZBCreatorMaxFileSize = nntpgrab_gui_base_get_widget("comboNZBCreatorMaxFileSize");
243
    GtkWidget *comboNZBCreatorPercentage = nntpgrab_gui_base_get_widget("comboNZBCreatorPercentage");
244
    GtkWidget *comboNZBCreatorFileType = nntpgrab_gui_base_get_widget("comboNZBCreatorFileType");
245
    GtkWidget *comboNZBCreatorNewsgroups = nntpgrab_gui_base_get_widget("comboNZBCreatorNewsgroups");
246
    const char *query;
247
    int factor;
248

                
249
    // Query
250
    query = gtk_entry_get_text(GTK_ENTRY(entryNZBCreatorQuery));
251
    if (!query || strlen(query) == 0) {
252
        GtkWidget *windowMain = nntpgrab_gui_base_get_widget("windowMain");
253
        nntpgrab_gui_base_dialog_show(windowMain, _("Please enter a search query first"), GTK_MESSAGE_INFO, GTK_BUTTONS_OK);
254
        return;
255
    }
256

                
257
    memset(&opts, 0, sizeof(NZBCreatorSearchOpts));
258
    strncpy(opts.query, query, sizeof(opts.query) - 1);
259

                
260
    // Search only in
261
    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radNZBCreatorSubjects))) {
262
        opts.search_only_in = NZBCREATOR_SEARCH_ONLY_IN_SUBJECTS;
263
    } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radNZBCreatorFiles))) {
264
        opts.search_only_in = NZBCREATOR_SEARCH_ONLY_IN_FILENAMES;
265
    } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radNZBCreatorPosters))) {
266
        opts.search_only_in = NZBCREATOR_SEARCH_ONLY_IN_POSTERS;
267
    } else {
268
        g_critical("Unknown search_only_in option\n");
269
        return;
270
    }
271

                
272
    // Maximum age
273
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorMaxAge))) {
274
        case 0:                 // 7 days
275
            opts.max_age = 7;
276
            break;
277

                
278
        case 1:                 // 14 days
279
            opts.max_age = 14;
280
            break;
281

                
282
        case 2:                 // 21 days
283
            opts.max_age = 21;
284
            break;
285

                
286
        case 3:                 // 50 days
287
            opts.max_age = 50;
288
            break;
289

                
290
        case 4:                 // 75 days
291
            opts.max_age = 75;
292
            break;
293

                
294
        case 5:                 // 100 days
295
            opts.max_age = 100;
296
            break;
297

                
298
        case 6:                 // 125 days
299
            opts.max_age = 125;
300
            break;
301

                
302
        case 7:                 // 150 days
303
            opts.max_age = 150;
304
            break;
305

                
306
        default:
307
            g_critical("Unknown max_age option\n");
308
            return;
309
    }
310

                
311
    // Minimal file size
312
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorMinFileSize))) {
313
        case 0:
314
            factor = 1024;
315
            break;
316

                
317
        case 1:
318
            factor = 1024 * 1024;
319
            break;
320

                
321
        case 2:
322
            factor = 1024 * 1024 * 1024;
323
            break;
324

                
325
        default:
326
            g_critical("Unknown min_file_size option\n");
327
            return;
328
    }
329

                
330
    opts.minimal_file_size = (int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinNZBCreatorMinFileSize));
331
    if (opts.minimal_file_size > 0) {
332
        opts.minimal_file_size *= factor;
333
    }
334

                
335
    // Maximal file size
336
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorMaxFileSize))) {
337
        case 0:
338
            factor = 1024;
339
            break;
340

                
341
        case 1:
342
            factor = 1024 * 1024;
343
            break;
344

                
345
        case 2:
346
            factor = 1024 * 1024 * 1024;
347
            break;
348

                
349
        default:
350
            g_critical("Unknown max_file_size option\n");
351
            return;
352
    }
353

                
354
    opts.maximal_file_size = (int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinNZBCreatorMaxFileSize));
355
    if (opts.maximal_file_size > 0) {
356
        opts.maximal_file_size *= factor;
357
    }
358

                
359
    // Percentage complete
360
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorPercentage))) {
361
        case 0:                 // Any percentage
362
            opts.percentage_complete = 0;
363
            break;
364

                
365
        case 1:                 // Only complete files (100%)
366
            opts.percentage_complete = 100;
367
            break;
368

                
369
        case 2:                 // More than 95%
370
            opts.percentage_complete = 95;
371
            break;
372

                
373
        case 3:                 // More than 90%
374
            opts.percentage_complete = 90;
375
            break;
376

                
377
        case 4:                 // More than 85%
378
            opts.percentage_complete = 85;
379
            break;
380

                
381
        case 5:                 // More than 80%
382
            opts.percentage_complete = 80;
383
            break;
384

                
385
        case 6:                 // More than 70%
386
            opts.percentage_complete = 70;
387
            break;
388

                
389
        case 7:                 // More than 60%
390
            opts.percentage_complete = 60;
391
            break;
392

                
393
        case 8:                 // More than 50%
394
            opts.percentage_complete = 50;
395
            break;
396

                
397
        default:
398
            g_critical("Unknown percentage option\n");
399
            return;
400
    }
401

                
402
    // File type
403
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorFileType))) {
404
        case 0:                 // All file types
405
            opts.file_type = NNTP_FILE_TYPE_UNKNOWN;
406
            break;
407

                
408
        case 1:                 // NZB files
409
            opts.file_type = NNTP_FILE_TYPE_NZB;
410
            break;
411

                
412
        case 2:                 // PAR files
413
            opts.file_type = NNTP_FILE_TYPE_PAR;
414
            break;
415

                
416
        case 3:                 // PAR2 files
417
            opts.file_type = NNTP_FILE_TYPE_PAR2;
418
            break;
419

                
420
        case 4:                 // NFO files
421
            opts.file_type = NNTP_FILE_TYPE_NFO;
422
            break;
423

                
424
        case 5:                 // SFV files
425
            opts.file_type = NNTP_FILE_TYPE_SFV;
426
            break;
427

                
428
        case 6:                 // RAR files
429
            opts.file_type = NNTP_FILE_TYPE_RAR;
430
            break;
431

                
432
        default:
433
            g_critical("Unknown file_type option\n");
434
            return;
435
    }
436

                
437
    // Newsgroup
438
    if (gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorNewsgroups)) > 0) {
439
        GtkTreeIter iter;
440
        GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboNZBCreatorNewsgroups));
441

                
442
        gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboNZBCreatorNewsgroups), &iter);
443
        gtk_tree_model_get(model, &iter, 1, &opts.group_to_search, -1);
444
    }
445

                
446
    /* Search result offset */
447
    opts.offset = 0;
448

                
449
    /* Keep the search query cached so we can re-use it later */
450
    memcpy(&cached_search_opts, &opts, sizeof(NZBCreatorSearchOpts));
451

                
452
    perform_search();
453
#endif
454
}
455

                
456
#ifdef HAVE_SOUP
457 228
struct _nzbcreator_data
458 229
{
459 230
    time_t oldest_stamp;
... ...
518 289

                
519 290
    return NULL;
520 291
}
521
#endif
522 292

                
523
G_MODULE_EXPORT void
524
on_btnNZBCreatorImportFiles_clicked(GtkWidget *caller, gpointer user_data)
525
{
526
#ifdef HAVE_SOUP
527
    GtkWidget *treeNZBCreatorResults = nntpgrab_gui_base_get_widget("treeNZBCreatorResults");
528
    GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeNZBCreatorResults));
529
    GtkWidget *btnNZBCreatorPerformSearch = nntpgrab_gui_base_get_widget("btnNZBCreatorPerformSearch");
530
    GtkWidget *btnNZBCreatorImportFiles = nntpgrab_gui_base_get_widget("btnNZBCreatorImportFiles");
531
    GtkWidget *entryNZBCreatorQuery = nntpgrab_gui_base_get_widget("entryNZBCreatorQuery");
532
    GtkWidget *expanderNZBCreator = nntpgrab_gui_base_get_widget("expanderNZBCreator");
533
    GtkWidget *btnNZBCreatorNewerResults = nntpgrab_gui_base_get_widget("btnNZBCreatorNewerResults");
534
    GtkWidget *btnNZBCreatorOlderResults = nntpgrab_gui_base_get_widget("btnNZBCreatorOlderResults");
535
    GtkWidget *btnNZBCreatorSelectAll = nntpgrab_gui_base_get_widget("btnNZBCreatorSelectAll");
536
    GtkWidget *btnNZBCreatorSelectNone = nntpgrab_gui_base_get_widget("btnNZBCreatorSelectNone");
537
    GtkTreeIter iter;
538
    GtkTreeIter parent;
539
    struct _nzbcreator_data *data;
540
    gboolean val;
541
    int stamp;
542
    char *collection_name_current = NULL;
543
    gboolean has_children;
544
    const char *query = gtk_entry_get_text(GTK_ENTRY(entryNZBCreatorQuery));
545

                
546
    g_return_if_fail(gtk_tree_model_get_iter_first(model, &parent));
547

                
548
    gtk_widget_set_sensitive(treeNZBCreatorResults, FALSE);
549
    gtk_widget_set_sensitive(btnNZBCreatorPerformSearch, FALSE);
550
    gtk_widget_set_sensitive(btnNZBCreatorImportFiles, FALSE);
551
    gtk_widget_set_sensitive(entryNZBCreatorQuery, FALSE);
552
    gtk_widget_set_sensitive(expanderNZBCreator, FALSE);
553
    gtk_widget_set_sensitive(btnNZBCreatorNewerResults, FALSE);
554
    gtk_widget_set_sensitive(btnNZBCreatorOlderResults, FALSE);
555
    gtk_widget_set_sensitive(btnNZBCreatorSelectAll, FALSE);
556
    gtk_widget_set_sensitive(btnNZBCreatorSelectNone, FALSE);
557

                
558
    data = g_slice_new0(struct _nzbcreator_data);
559

                
560
    do {
561
        gtk_tree_model_get(model, &parent, FIELD_SHORT_COLLECTION_NAME, &collection_name_current, -1);
562

                
563
        /* Some items don't have an expander */
564
        if (!(gtk_tree_model_iter_children(model, &iter, &parent))) {
565
            has_children = FALSE;
566
            iter = parent;
567
        } else {
568
            has_children = TRUE;
569
        }
570

                
571
        do {
572
            gint64 file_id = -1;
573

                
574
            gtk_tree_model_get(model, &iter, FIELD_FILE_ID, &file_id, FIELD_SELECTED, &val, FIELD_STAMP, &stamp, -1);
575
            if (val) {
576
                // Use the name of the collection
577
                if (!data->collection_name) {
578
                    data->collection_name = g_strdup(collection_name_current);
579
                } else {
580
                    if (strcmp(data->collection_name, collection_name_current)) {
581
                        // Or use the search query when there are multiple collections involved
582
                        if (strcmp(data->collection_name, query)) {
583
                            g_free(data->collection_name);
584
                            data->collection_name = g_strdup(query);
585
                        }
586
                    }
587
                }
588

                
589
                data->file_ids = ng_list_append(data->file_ids, GINT_TO_POINTER((int)file_id));
590

                
591
                if (stamp > 0 && (data->oldest_stamp == 0 || stamp < data->oldest_stamp)) {
592
                    data->oldest_stamp = stamp;
593
                }
594

                
595
                if (data->newest_stamp == 0 || stamp > data->newest_stamp) {
596
                    data->newest_stamp = stamp;
597
                }
598
            }
599

                
600
            if (!has_children) {
601
                break;
602
            }
603
        } while (gtk_tree_model_iter_next(model, &iter));
604

                
605
        g_free(collection_name_current);
606
    } while (gtk_tree_model_iter_next(model, &parent));
607

                
608
    g_return_if_fail(data->collection_name != NULL);
609

                
610
    /* Perform the retrieval in a seperate thread to avoid a freeze in the GUI */
611
    g_return_if_fail(g_thread_create(retrieve_nzbcreator_results, data, FALSE, NULL));
612
#endif
613
}
614

                
615
#ifdef HAVE_SOUP
616 293
static gboolean
617 294
process_newsgroups_list(gpointer data)
618 295
{
... ...
952 629

                
953 630
    gtk_widget_set_sensitive(btnNZBCreatorImportFiles, select_all);
954 631
}
632

                
955 633
#endif
956 634

                
957 635
G_MODULE_EXPORT void
636
on_btnNZBCreatorPerformSearch_clicked(GtkWidget *caller, gpointer data)
637
{
638
#ifdef HAVE_SOUP
639
    NZBCreatorSearchOpts opts;
640
    GtkWidget *entryNZBCreatorQuery = nntpgrab_gui_base_get_widget("entryNZBCreatorQuery");
641
    GtkWidget *radNZBCreatorSubjects = nntpgrab_gui_base_get_widget("radNZBCreatorSubjects");
642
    GtkWidget *radNZBCreatorFiles = nntpgrab_gui_base_get_widget("radNZBCreatorFiles");
643
    GtkWidget *radNZBCreatorPosters = nntpgrab_gui_base_get_widget("radNZBCreatorPosters");
644
    GtkWidget *comboNZBCreatorMaxAge = nntpgrab_gui_base_get_widget("comboNZBCreatorMaxAge");
645
    GtkWidget *spinNZBCreatorMinFileSize = nntpgrab_gui_base_get_widget("spinNZBCreatorMinFileSize");
646
    GtkWidget *spinNZBCreatorMaxFileSize = nntpgrab_gui_base_get_widget("spinNZBCreatorMaxFileSize");
647
    GtkWidget *comboNZBCreatorMinFileSize = nntpgrab_gui_base_get_widget("comboNZBCreatorMinFileSize");
648
    GtkWidget *comboNZBCreatorMaxFileSize = nntpgrab_gui_base_get_widget("comboNZBCreatorMaxFileSize");
649
    GtkWidget *comboNZBCreatorPercentage = nntpgrab_gui_base_get_widget("comboNZBCreatorPercentage");
650
    GtkWidget *comboNZBCreatorFileType = nntpgrab_gui_base_get_widget("comboNZBCreatorFileType");
651
    GtkWidget *comboNZBCreatorNewsgroups = nntpgrab_gui_base_get_widget("comboNZBCreatorNewsgroups");
652
    const char *query;
653
    int factor;
654

                
655
    // Query
656
    query = gtk_entry_get_text(GTK_ENTRY(entryNZBCreatorQuery));
657
    if (!query || strlen(query) == 0) {
658
        GtkWidget *windowMain = nntpgrab_gui_base_get_widget("windowMain");
659
        nntpgrab_gui_base_dialog_show(windowMain, _("Please enter a search query first"), GTK_MESSAGE_INFO, GTK_BUTTONS_OK);
660
        return;
661
    }
662

                
663
    memset(&opts, 0, sizeof(NZBCreatorSearchOpts));
664
    strncpy(opts.query, query, sizeof(opts.query) - 1);
665

                
666
    // Search only in
667
    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radNZBCreatorSubjects))) {
668
        opts.search_only_in = NZBCREATOR_SEARCH_ONLY_IN_SUBJECTS;
669
    } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radNZBCreatorFiles))) {
670
        opts.search_only_in = NZBCREATOR_SEARCH_ONLY_IN_FILENAMES;
671
    } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radNZBCreatorPosters))) {
672
        opts.search_only_in = NZBCREATOR_SEARCH_ONLY_IN_POSTERS;
673
    } else {
674
        g_critical("Unknown search_only_in option\n");
675
        return;
676
    }
677

                
678
    // Maximum age
679
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorMaxAge))) {
680
        case 0:                 // 7 days
681
            opts.max_age = 7;
682
            break;
683

                
684
        case 1:                 // 14 days
685
            opts.max_age = 14;
686
            break;
687

                
688
        case 2:                 // 21 days
689
            opts.max_age = 21;
690
            break;
691

                
692
        case 3:                 // 50 days
693
            opts.max_age = 50;
694
            break;
695

                
696
        case 4:                 // 75 days
697
            opts.max_age = 75;
698
            break;
699

                
700
        case 5:                 // 100 days
701
            opts.max_age = 100;
702
            break;
703

                
704
        case 6:                 // 125 days
705
            opts.max_age = 125;
706
            break;
707

                
708
        case 7:                 // 150 days
709
            opts.max_age = 150;
710
            break;
711

                
712
        default:
713
            g_critical("Unknown max_age option\n");
714
            return;
715
    }
716

                
717
    // Minimal file size
718
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorMinFileSize))) {
719
        case 0:
720
            factor = 1024;
721
            break;
722

                
723
        case 1:
724
            factor = 1024 * 1024;
725
            break;
726

                
727
        case 2:
728
            factor = 1024 * 1024 * 1024;
729
            break;
730

                
731
        default:
732
            g_critical("Unknown min_file_size option\n");
733
            return;
734
    }
735

                
736
    opts.minimal_file_size = (int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinNZBCreatorMinFileSize));
737
    if (opts.minimal_file_size > 0) {
738
        opts.minimal_file_size *= factor;
739
    }
740

                
741
    // Maximal file size
742
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorMaxFileSize))) {
743
        case 0:
744
            factor = 1024;
745
            break;
746

                
747
        case 1:
748
            factor = 1024 * 1024;
749
            break;
750

                
751
        case 2:
752
            factor = 1024 * 1024 * 1024;
753
            break;
754

                
755
        default:
756
            g_critical("Unknown max_file_size option\n");
757
            return;
758
    }
759

                
760
    opts.maximal_file_size = (int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinNZBCreatorMaxFileSize));
761
    if (opts.maximal_file_size > 0) {
762
        opts.maximal_file_size *= factor;
763
    }
764

                
765
    // Percentage complete
766
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorPercentage))) {
767
        case 0:                 // Any percentage
768
            opts.percentage_complete = 0;
769
            break;
770

                
771
        case 1:                 // Only complete files (100%)
772
            opts.percentage_complete = 100;
773
            break;
774

                
775
        case 2:                 // More than 95%
776
            opts.percentage_complete = 95;
777
            break;
778

                
779
        case 3:                 // More than 90%
780
            opts.percentage_complete = 90;
781
            break;
782

                
783
        case 4:                 // More than 85%
784
            opts.percentage_complete = 85;
785
            break;
786

                
787
        case 5:                 // More than 80%
788
            opts.percentage_complete = 80;
789
            break;
790

                
791
        case 6:                 // More than 70%
792
            opts.percentage_complete = 70;
793
            break;
794

                
795
        case 7:                 // More than 60%
796
            opts.percentage_complete = 60;
797
            break;
798

                
799
        case 8:                 // More than 50%
800
            opts.percentage_complete = 50;
801
            break;
802

                
803
        default:
804
            g_critical("Unknown percentage option\n");
805
            return;
806
    }
807

                
808
    // File type
809
    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorFileType))) {
810
        case 0:                 // All file types
811
            opts.file_type = NNTP_FILE_TYPE_UNKNOWN;
812
            break;
813

                
814
        case 1:                 // NZB files
815
            opts.file_type = NNTP_FILE_TYPE_NZB;
816
            break;
817

                
818
        case 2:                 // PAR files
819
            opts.file_type = NNTP_FILE_TYPE_PAR;
820
            break;
821

                
822
        case 3:                 // PAR2 files
823
            opts.file_type = NNTP_FILE_TYPE_PAR2;
824
            break;
825

                
826
        case 4:                 // NFO files
827
            opts.file_type = NNTP_FILE_TYPE_NFO;
828
            break;
829

                
830
        case 5:                 // SFV files
831
            opts.file_type = NNTP_FILE_TYPE_SFV;
832
            break;
833

                
834
        case 6:                 // RAR files
835
            opts.file_type = NNTP_FILE_TYPE_RAR;
836
            break;
837

                
838
        default:
839
            g_critical("Unknown file_type option\n");
840
            return;
841
    }
842

                
843
    // Newsgroup
844
    if (gtk_combo_box_get_active(GTK_COMBO_BOX(comboNZBCreatorNewsgroups)) > 0) {
845
        GtkTreeIter iter;
846
        GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboNZBCreatorNewsgroups));
847

                
848
        gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboNZBCreatorNewsgroups), &iter);
849
        gtk_tree_model_get(model, &iter, 1, &opts.group_to_search, -1);
850
    }
851

                
852
    /* Search result offset */
853
    opts.offset = 0;
854

                
855
    /* Keep the search query cached so we can re-use it later */
856
    memcpy(&cached_search_opts, &opts, sizeof(NZBCreatorSearchOpts));
857

                
858
    perform_search();
859
#endif
860
}
861

                
862
G_MODULE_EXPORT void
863
on_btnNZBCreatorImportFiles_clicked(GtkWidget *caller, gpointer user_data)
864
{
865
#ifdef HAVE_SOUP
866
    GtkWidget *treeNZBCreatorResults = nntpgrab_gui_base_get_widget("treeNZBCreatorResults");
867
    GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeNZBCreatorResults));
868
    GtkWidget *btnNZBCreatorPerformSearch = nntpgrab_gui_base_get_widget("btnNZBCreatorPerformSearch");
869
    GtkWidget *btnNZBCreatorImportFiles = nntpgrab_gui_base_get_widget("btnNZBCreatorImportFiles");
870
    GtkWidget *entryNZBCreatorQuery = nntpgrab_gui_base_get_widget("entryNZBCreatorQuery");
871
    GtkWidget *expanderNZBCreator = nntpgrab_gui_base_get_widget("expanderNZBCreator");
872
    GtkWidget *btnNZBCreatorNewerResults = nntpgrab_gui_base_get_widget("btnNZBCreatorNewerResults");
873
    GtkWidget *btnNZBCreatorOlderResults = nntpgrab_gui_base_get_widget("btnNZBCreatorOlderResults");
874
    GtkWidget *btnNZBCreatorSelectAll = nntpgrab_gui_base_get_widget("btnNZBCreatorSelectAll");
875
    GtkWidget *btnNZBCreatorSelectNone = nntpgrab_gui_base_get_widget("btnNZBCreatorSelectNone");
876
    GtkTreeIter iter;
877
    GtkTreeIter parent;
878
    struct _nzbcreator_data *data;
879
    gboolean val;
880
    int stamp;
881
    char *collection_name_current = NULL;
882
    gboolean has_children;
883
    const char *query = gtk_entry_get_text(GTK_ENTRY(entryNZBCreatorQuery));
884

                
885
    g_return_if_fail(gtk_tree_model_get_iter_first(model, &parent));
886

                
887
    gtk_widget_set_sensitive(treeNZBCreatorResults, FALSE);
888
    gtk_widget_set_sensitive(btnNZBCreatorPerformSearch, FALSE);
889
    gtk_widget_set_sensitive(btnNZBCreatorImportFiles, FALSE);
890
    gtk_widget_set_sensitive(entryNZBCreatorQuery, FALSE);
891
    gtk_widget_set_sensitive(expanderNZBCreator, FALSE);
892
    gtk_widget_set_sensitive(btnNZBCreatorNewerResults, FALSE);
893
    gtk_widget_set_sensitive(btnNZBCreatorOlderResults, FALSE);
894
    gtk_widget_set_sensitive(btnNZBCreatorSelectAll, FALSE);
895
    gtk_widget_set_sensitive(btnNZBCreatorSelectNone, FALSE);
896

                
897
    data = g_slice_new0(struct _nzbcreator_data);
898

                
899
    do {
900
        gtk_tree_model_get(model, &parent, FIELD_SHORT_COLLECTION_NAME, &collection_name_current, -1);
901

                
902
        /* Some items don't have an expander */
903
        if (!(gtk_tree_model_iter_children(model, &iter, &parent))) {
904
            has_children = FALSE;
905
            iter = parent;
906
        } else {
907
            has_children = TRUE;
908
        }
909

                
910
        do {
911
            gint64 file_id = -1;
912

                
913
            gtk_tree_model_get(model, &iter, FIELD_FILE_ID, &file_id, FIELD_SELECTED, &val, FIELD_STAMP, &stamp, -1);
914
            if (val) {
915
                // Use the name of the collection
916
                if (!data->collection_name) {
917
                    data->collection_name = g_strdup(collection_name_current);
918
                } else {
919
                    if (strcmp(data->collection_name, collection_name_current)) {
920
                        // Or use the search query when there are multiple collections involved
921
                        if (strcmp(data->collection_name, query)) {
922
                            g_free(data->collection_name);
923
                            data->collection_name = g_strdup(query);
924
                        }
925
                    }
926
                }
927

                
928
                data->file_ids = ng_list_append(data->file_ids, GINT_TO_POINTER((int)file_id));
929

                
930
                if (stamp > 0 && (data->oldest_stamp == 0 || stamp < data->oldest_stamp)) {
931
                    data->oldest_stamp = stamp;
932
                }
933

                
934
                if (data->newest_stamp == 0 || stamp > data->newest_stamp) {
935
                    data->newest_stamp = stamp;
936
                }
937
            }
938

                
939
            if (!has_children) {
940
                break;
941
            }
942
        } while (gtk_tree_model_iter_next(model, &iter));
943

                
944
        g_free(collection_name_current);
945
    } while (gtk_tree_model_iter_next(model, &parent));
946

                
947
    g_return_if_fail(data->collection_name != NULL);
948

                
949
    /* Perform the retrieval in a seperate thread to avoid a freeze in the GUI */
950
    g_return_if_fail(g_thread_create(retrieve_nzbcreator_results, data, FALSE, NULL));
951
#endif
952
}
953

                
954
G_MODULE_EXPORT void
958 955
on_entryNZBCreatorQuery_activate(GtkWidget *caller, gpointer data)
959 956
{
960 957
#ifdef HAVE_SOUP
... ...
1093 1090

                
1094 1091
    // Retrieve the list of available newsgroups in a seperate thread
1095 1092
    g_return_if_fail(g_thread_create(fetch_newsgroups_func, NULL, FALSE, NULL));
1096
#else
1097
    GtkWidget *vboxNZBCreatorTab = nntpgrab_gui_base_get_widget("vboxNZBCreatorTab");
1098
    gtk_widget_hide(vboxNZBCreatorTab);
1099
#endif
1100 1093

                
1101 1094
    g_signal_connect(treeNZBCreatorResults, "row-expanded", G_CALLBACK(on_row_expanded), NULL);
1102 1095

                
... ...
1104 1097

                
1105 1098
    results_per_page = 0;
1106 1099
    memset(&cached_search_opts, 0, sizeof(cached_search_opts));
1100
#else
1101
    GtkWidget *vboxNZBCreatorTab = nntpgrab_gui_base_get_widget("vboxNZBCreatorTab");
1102
    gtk_widget_hide(vboxNZBCreatorTab);
1103
#endif
1107 1104
}
trunk/client/gui_qt/WidgetNZBCreator.cpp (revision 1863)
234 234
                } else if (collection_name != collection_item->text(FIELD_COLLECTION_NAME_SHORT)) {
235 235
                    multiple_collections = TRUE;
236 236
                }
237
            }
238 237

                
239
            stamp = QDateTime::fromString(collection_item->text(FIELD_STAMP));
240
            if (stamp.isValid() && (oldest_stamp.isNull() || stamp < oldest_stamp)) {
241
                oldest_stamp = stamp;
242
            }
238
                stamp = QDateTime::fromString(collection_item->text(FIELD_STAMP));
239
                if (stamp.isValid() && (oldest_stamp.isNull() || stamp < oldest_stamp)) {
240
                    oldest_stamp = stamp;
241
                }
243 242

                
244
            if (stamp.isValid() || stamp > newest_stamp) {
245
                newest_stamp = stamp;
243
                if (stamp.isValid() && stamp > newest_stamp) {
244
                    newest_stamp = stamp;
245
                }
246 246
            }
247 247

                
248 248
            continue;
... ...
265 265
                    oldest_stamp = stamp;
266 266
                }
267 267

                
268
                if (stamp.isValid() || stamp > newest_stamp) {
268
                if (stamp.isValid() && stamp > newest_stamp) {
269 269
                    newest_stamp = stamp;
270 270
                }
271 271
            }
trunk/client/Makefile.am (revision 1863)
79 79
       gui_qt/WidgetDownloadQueue.cpp \
80 80
       gui_qt/WidgetDownloadQueue.h \
81 81
       gui_qt/WidgetNZBCreator.cpp \
82
       gui_qt/WidgetNZBCreatorDetails.cpp \
83
       gui_qt/WidgetNZBCreatorDetails.h \
82 84
       gui_qt/WidgetNZBCreator.h \
85
       gui_qt/WidgetNZBCreatorTree.cpp \
86
       gui_qt/WidgetNZBCreatorTree.h \
83 87
       gui_qt/WidgetRepairAndUnpack.cpp \
84 88
       gui_qt/WidgetRepairAndUnpack.h \
85 89
       gui_qt/WidgetTrafficMonitor.cpp \

Also available in: Unified diff