00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include
00020 #include
00021 #include
00022 #include
00023 #include
00024 #include "nntpgrab.h"
00025 #include "nntpgrab_internal.h"
00026 #include "nntpgrab_utils.h"
00027 #include "marshalers.h"
00028 #include "configuration.h"
00029 #include "schedular.h"
00030 #include "nntpconnection.h"
00031 #include "decoder.h"
00032 #include "par2.h"
00033
00034 #define NNTPGRAB_TYPE_CORE (core_get_type ())
00035 #define NNTPGRAB_CORE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), NNTPGRAB_TYPE_CORE, NNTPGrabCore))
00036 #define NNTPGRAB_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NNTPGRAB_TYPE_CORE, NNTPGrabCoreClass))
00037 #define IS_NNTPGRAB_CORE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), NNTPGRAB_TYPE_CORE))
00038 #define IS_NNTPGRAB_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NNTPGRAB_TYPE_CORE))
00039 #define NNTPGRAB_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NNTPGRAB_TYPE_CORE, NNTPGrabCoreClass))
00040
00041 struct NNTPGrabCore
00042 {
00043 GObject parent;
00044
00045 Configuration *config;
00046 Schedular *schedular;
00047 gboolean is_finalizing;
00048 };
00049
00050 static NNTPGrabCore *core = NULL;
00051
00052 struct NNTPGrabCoreClass
00053 {
00054 GObjectClass parent;
00055 };
00056
00057 enum
00058 {
00059 CONFIG_CHANGED_SIGNAL,
00060 PART_DOWNLOAD_START_SIGNAL,
00061 PART_DONE_SIGNAL,
00062 PART_FAILED_SIGNAL,
00063 PART_PROGRESS_UPDATE_SIGNAL,
00064 TRAFFIC_MONITOR_UPDATE_SIGNAL,
00065 COLLECTION_ADDED_SIGNAL,
00066 COLLECTION_REMOVED_SIGNAL,
00067 FILE_ADDED_SIGNAL,
00068 FILE_REMOVED_SIGNAL,
00069 FILE_DOWNLOAD_STATE_UPDATE_SIGNAL,
00070 FILE_STATE_CHANGED_SIGNAL,
00071 CONNECTION_CONNECTING_SIGNAL,
00072 CONNECTION_CONNECTED_SIGNAL,
00073 CONNECTION_DISCONNECT_SIGNAL,
00074 SCHEDULAR_STATE_CHANGED_SIGNAL,
00075 FATAL_ERROR_SIGNAL,
00076 WARNING_MESSAGE_SIGNAL,
00077 DEBUG_MESSAGE_SIGNAL,
00078 TASK_MOVED_SIGNAL,
00079 COLLECTION_MOVED_SIGNAL,
00080 LAST_SIGNAL
00081 };
00082
00083 static guint signals[LAST_SIGNAL] = { 0 };
00084
00085 G_DEFINE_TYPE(NNTPGrabCore, core, G_TYPE_OBJECT)
00086
00087 static void
00088 core_init (NNTPGrabCore *obj)
00089 {
00090 obj->is_finalizing = FALSE;
00091 }
00092
00093 static void
00094 core_finalize (GObject *obj)
00095 {
00096 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00097
00098 core->is_finalizing = TRUE;
00099
00100 if (core->config) {
00101 configuration_destroy(core->config);
00102 }
00103
00104 if (core->schedular) {
00105 schedular_destroy(core->schedular);
00106 }
00107 }
00108
00109 static void
00110 core_class_init (NNTPGrabCoreClass *klass)
00111 {
00112 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
00113
00114 gobject_class->finalize = core_finalize;
00115
00116 signals[CONFIG_CHANGED_SIGNAL] = g_signal_new("config_changed",
00117 G_OBJECT_CLASS_TYPE (klass),
00118 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00119 0,
00120 NULL, NULL,
00121 nntpgrab_marshal_VOID__VOID,
00122 G_TYPE_NONE, 0);
00123
00124 signals[PART_DOWNLOAD_START_SIGNAL] = g_signal_new ("part_download_start",
00125 G_OBJECT_CLASS_TYPE (klass),
00126 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00127 0,
00128 NULL, NULL,
00129 nntpgrab_marshal_VOID__STRING_INT_STRING_STRING_INT,
00130 G_TYPE_NONE, 5, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
00131
00132 signals[PART_DONE_SIGNAL] = g_signal_new ("part_done",
00133 G_OBJECT_CLASS_TYPE (klass),
00134 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00135 0,
00136 NULL, NULL,
00137 nntpgrab_marshal_VOID__STRING_INT_STRING_STRING_INT_INT,
00138 G_TYPE_NONE, 6, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
00139
00140 signals[PART_FAILED_SIGNAL] = g_signal_new ("part_failed",
00141 G_OBJECT_CLASS_TYPE (klass),
00142 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00143 0,
00144 NULL, NULL,
00145 nntpgrab_marshal_VOID__STRING_INT_STRING_STRING_INT_INT_BOOLEAN,
00146 G_TYPE_NONE, 7, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN);
00147
00148 signals[PART_PROGRESS_UPDATE_SIGNAL] = g_signal_new ("part_progress_update",
00149 G_OBJECT_CLASS_TYPE (klass),
00150 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00151 0,
00152 NULL, NULL,
00153 nntpgrab_marshal_VOID__STRING_INT_STRING_INT_INT_INT,
00154 G_TYPE_NONE, 6, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
00155
00156 signals[TRAFFIC_MONITOR_UPDATE_SIGNAL] = g_signal_new ("traffic_monitor_update",
00157 G_OBJECT_CLASS_TYPE (klass),
00158 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00159 0,
00160 NULL, NULL,
00161 nntpgrab_marshal_VOID__INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT64_DOUBLE,
00162 G_TYPE_NONE, 12, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT64, G_TYPE_DOUBLE);
00163
00164 signals[COLLECTION_ADDED_SIGNAL] = g_signal_new ("collection_added",
00165 G_OBJECT_CLASS_TYPE (klass),
00166 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00167 0,
00168 NULL, NULL,
00169 nntpgrab_marshal_VOID__STRING,
00170 G_TYPE_NONE, 1, G_TYPE_STRING);
00171
00172 signals[COLLECTION_REMOVED_SIGNAL] = g_signal_new ("collection_removed",
00173 G_OBJECT_CLASS_TYPE (klass),
00174 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00175 0,
00176 NULL, NULL,
00177 nntpgrab_marshal_VOID__STRING,
00178 G_TYPE_NONE, 1, G_TYPE_STRING);
00179
00180 signals[FILE_ADDED_SIGNAL] = g_signal_new ("file_added",
00181 G_OBJECT_CLASS_TYPE (klass),
00182 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00183 0,
00184 NULL, NULL,
00185 nntpgrab_marshal_VOID__STRING_STRING_STRING_UINT64_UINT64_UINT64_UINT64_INT_INT_POINTER,
00186 G_TYPE_NONE, 10, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_UINT64, G_TYPE_UINT64, G_TYPE_UINT64, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER);
00187
00188 signals[FILE_REMOVED_SIGNAL] = g_signal_new ("file_removed",
00189 G_OBJECT_CLASS_TYPE (klass),
00190 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00191 0,
00192 NULL, NULL,
00193 nntpgrab_marshal_VOID__STRING_STRING_UINT64_UINT64,
00194 G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_UINT64);
00195
00196 signals[FILE_DOWNLOAD_STATE_UPDATE_SIGNAL] = g_signal_new ("file_download_state_update",
00197 G_OBJECT_CLASS_TYPE (klass),
00198 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00199 0,
00200 NULL, NULL,
00201 nntpgrab_marshal_VOID__STRING_STRING_INT_INT_INT_UINT64_UINT64_UINT64_UINT64,
00202 G_TYPE_NONE, 9, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_UINT64, G_TYPE_UINT64, G_TYPE_UINT64, G_TYPE_UINT64);
00203
00204 signals[FILE_STATE_CHANGED_SIGNAL] = g_signal_new ("file_state_changed",
00205 G_OBJECT_CLASS_TYPE (klass),
00206 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00207 0,
00208 NULL, NULL,
00209 nntpgrab_marshal_VOID__STRING_STRING_INT_INT,
00210 G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
00211
00212 signals[CONNECTION_CONNECTING_SIGNAL] = g_signal_new ("connection_connecting",
00213 G_OBJECT_CLASS_TYPE (klass),
00214 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00215 0,
00216 NULL, NULL,
00217 nntpgrab_marshal_VOID__STRING_INT,
00218 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT);
00219
00220 signals[CONNECTION_CONNECTED_SIGNAL] = g_signal_new ("connection_connected",
00221 G_OBJECT_CLASS_TYPE (klass),
00222 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00223 0,
00224 NULL, NULL,
00225 nntpgrab_marshal_VOID__STRING_INT_STRING,
00226 G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
00227
00228 signals[CONNECTION_DISCONNECT_SIGNAL] = g_signal_new ("connection_disconnect",
00229 G_OBJECT_CLASS_TYPE (klass),
00230 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00231 0,
00232 NULL, NULL,
00233 nntpgrab_marshal_VOID__STRING_INT_ENUM_STRING,
00234 G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
00235
00236
00237 signals[SCHEDULAR_STATE_CHANGED_SIGNAL] = g_signal_new ("schedular_state_changed",
00238 G_OBJECT_CLASS_TYPE (klass),
00239 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00240 0,
00241 NULL, NULL,
00242 nntpgrab_marshal_VOID__INT_STRING,
00243 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING);
00244
00245
00246 signals[FATAL_ERROR_SIGNAL] = g_signal_new ("fatal_error",
00247 G_OBJECT_CLASS_TYPE (klass),
00248 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00249 0,
00250 NULL, NULL,
00251 nntpgrab_marshal_VOID__STRING,
00252 G_TYPE_NONE, 1, G_TYPE_STRING);
00253
00254 signals[WARNING_MESSAGE_SIGNAL] = g_signal_new ("warning_message",
00255 G_OBJECT_CLASS_TYPE (klass),
00256 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00257 0,
00258 NULL, NULL,
00259 nntpgrab_marshal_VOID__STRING,
00260 G_TYPE_NONE, 1, G_TYPE_STRING);
00261
00262 signals[DEBUG_MESSAGE_SIGNAL] = g_signal_new ("debug_message",
00263 G_OBJECT_CLASS_TYPE (klass),
00264 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00265 0,
00266 NULL, NULL,
00267 nntpgrab_marshal_VOID__POINTER_STRING,
00268 G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_STRING);
00269
00270 signals[TASK_MOVED_SIGNAL] = g_signal_new ("task_moved",
00271 G_OBJECT_CLASS_TYPE (klass),
00272 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00273 0,
00274 NULL, NULL,
00275 nntpgrab_marshal_VOID__STRING_STRING_STRING_INT_INT,
00276 G_TYPE_NONE, 5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
00277
00278 signals[COLLECTION_MOVED_SIGNAL] = g_signal_new ("collection_moved",
00279 G_OBJECT_CLASS_TYPE (klass),
00280 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
00281 0,
00282 NULL, NULL,
00283 nntpgrab_marshal_VOID__STRING_INT_INT,
00284 G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
00285 }
00286
00287 NNTPGrabCore *
00288 get_core(void)
00289 {
00290 if (core && core->is_finalizing) {
00291 return NULL;
00292 }
00293
00294 return core;
00295 }
00296
00297 static gboolean
00298 on_config_changed(Configuration *config, gpointer data)
00299 {
00300 nntpgrab_core_emit_config_changed();
00301 return FALSE;
00302 }
00303
00304
00305
00306
00307
00308
00309
00310 NNTPGrabCore *
00311 nntpgrab_core_init(int version, char **err, char **warnings)
00312 {
00313 static gboolean initialized = FALSE;
00314 #ifdef WIN32
00315 char *installation_path;
00316 #endif
00317
00318 if (initialized) {
00319 if (err) {
00320 *err = g_strdup_printf(_("NNTPGrab Core already initialized"));
00321 }
00322 return NULL;
00323 }
00324
00325 if (!g_thread_supported ()) g_thread_init (NULL);
00326 g_type_init();
00327
00328
00329 if (version != NNTPGRAB_API_VERSION) {
00330 if (err) {
00331 *err = g_strdup_printf(_("NNTPGrab Core API mismatch (Core API version = %i, frontend's version = %i)"), NNTPGRAB_API_VERSION, version);
00332 }
00333 return NULL;
00334 }
00335
00336 #ifdef WIN32
00337
00338 installation_path = g_win32_get_package_installation_directory_of_module(NULL);
00339 g_return_val_if_fail(installation_path != NULL, NULL);
00340
00341 if (!g_getenv("NNTPGRAB_LIBDIR")) {
00342 char *path = g_strdup_printf("%s\\lib\\nntpgrab", installation_path);
00343 g_setenv("NNTPGRAB_LIBDIR", path, TRUE);
00344 g_free(path);
00345 }
00346 g_free(installation_path);
00347 #endif
00348
00349 core = g_object_new(NNTPGRAB_TYPE_CORE, NULL);
00350
00351 if (!(core->config = configuration_new(err, warnings))) {
00352 g_object_unref(core);
00353 return NULL;
00354 }
00355
00356 g_signal_connect(core->config, "config_changed", G_CALLBACK(on_config_changed), NULL);
00357
00358 if (!nntpconnection_initialize(err)) {
00359 g_object_unref(core);
00360 return NULL;
00361 }
00362
00363 if (!(core->schedular = schedular_new(core->config, err))) {
00364 g_object_unref(core);
00365 return NULL;
00366 }
00367
00368 if (!decoder_initialize(err)) {
00369 g_object_unref(core);
00370 return NULL;
00371 }
00372
00373 if (!par2_initialize(err)) {
00374 g_object_unref(core);
00375 return NULL;
00376 }
00377
00378 initialized = TRUE;
00379
00380 return core;
00381 }
00382
00383 void
00384 nntpgrab_core_cleanup(NNTPGrabCore *obj)
00385 {
00386 g_object_unref(obj);
00387 }
00388
00389 GList *
00390 nntpgrab_config_get_avail_servers(NNTPGrabCore *obj)
00391 {
00392 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00393
00394 g_assert(core->config);
00395
00396 return configuration_get_avail_servers(core->config);
00397 }
00398
00399 void
00400 nntpgrab_config_free_avail_servers(NNTPGrabCore *obj, GList *servers)
00401 {
00402 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00403
00404 g_assert(core->config);
00405
00406 configuration_free_avail_servers(core->config, servers);
00407 }
00408
00409 gboolean
00410 nntpgrab_config_get_server_info(NNTPGrabCore *obj, const char *servername, ConfigServer *ret)
00411 {
00412 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00413 ConfigServer *config;
00414
00415 g_assert(core->config);
00416
00417 config = configuration_get_server_info(core->config, servername);
00418 if (config) {
00419 memcpy(ret, config, sizeof(ConfigServer));
00420 g_slice_free(ConfigServer, config);
00421 return TRUE;
00422 } else {
00423 return FALSE;
00424 }
00425 }
00426
00427 gboolean
00428 nntpgrab_config_add_server(NNTPGrabCore *obj, ConfigServer new_server)
00429 {
00430 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00431 gboolean retval;
00432 char *errmsg;
00433
00434 g_assert(core->config);
00435
00436 retval = configuration_add_server(core->config, new_server);
00437
00438 if (!configuration_save(core->config, &errmsg)) {
00439 nntpgrab_core_emit_fatal_error(errmsg);
00440 g_free(errmsg);
00441 }
00442
00443 return retval;
00444 }
00445
00446 gboolean
00447 nntpgrab_config_del_server(NNTPGrabCore *obj, const char *servername)
00448 {
00449 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00450 gboolean retval;
00451 char *errmsg;
00452
00453 g_assert(core->config);
00454
00455 retval = configuration_del_server(core->config, servername);
00456
00457 if (!configuration_save(core->config, &errmsg)) {
00458 nntpgrab_core_emit_fatal_error(errmsg);
00459 g_free(errmsg);
00460 }
00461
00462 return retval;
00463 }
00464
00465 gboolean
00466 nntpgrab_config_edit_server(NNTPGrabCore *obj, const char *servername, ConfigServer server)
00467 {
00468 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00469 gboolean retval;
00470 char *errmsg;
00471
00472 g_assert(core->config);
00473
00474 retval = configuration_edit_server(core->config, servername, server);
00475
00476 if (!configuration_save(core->config, &errmsg)) {
00477 nntpgrab_core_emit_fatal_error(errmsg);
00478 g_free(errmsg);
00479 }
00480
00481 return retval;
00482 }
00483
00484 ConfigOpts
00485 nntpgrab_config_get_opts(NNTPGrabCore *obj)
00486 {
00487 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00488
00489 g_assert(core->config);
00490
00491 return configuration_get_opts(core->config);
00492 }
00493
00494 void
00495 nntpgrab_config_set_opts(NNTPGrabCore *obj, ConfigOpts opts)
00496 {
00497 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00498 char *errmsg;
00499
00500 g_assert(core->config);
00501
00502 configuration_set_opts(core->config, opts);
00503
00504 if (!configuration_save(core->config, &errmsg)) {
00505 nntpgrab_core_emit_fatal_error(errmsg);
00506 g_free(errmsg);
00507 }
00508 }
00509
00510 gboolean
00511 nntpgrab_config_get_folder_listing(NNTPGrabCore *obj, const char *parent, GList **folders)
00512 {
00513 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00514
00515 return configuration_get_folder_listing(core->config, parent, folders);
00516 }
00517
00518 void
00519 nntpgrab_config_free_folder_listing(NNTPGrabCore *obj, GList *folders)
00520 {
00521 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00522
00523 configuration_free_folder_listing(core->config, folders);
00524 }
00525
00526 gboolean
00527 nntpgrab_schedular_start(NNTPGrabCore *obj)
00528 {
00529 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00530
00531 g_assert(core->schedular);
00532
00533 return schedular_start(core->schedular);
00534 }
00535
00536 static gpointer
00537 schedular_stop_func(gpointer data)
00538 {
00539 NNTPGrabCore *core = NNTPGRAB_CORE(data);
00540
00541 g_assert(core->schedular);
00542
00543 schedular_stop(core->schedular);
00544
00545 return NULL;
00546 }
00547
00548 gboolean
00549 nntpgrab_schedular_stop(NNTPGrabCore *obj, gboolean wait)
00550 {
00551 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00552
00553 g_assert(core->schedular);
00554
00555 if (wait) {
00556 return schedular_stop(core->schedular);
00557 } else {
00558
00559 if (schedular_get_state(core->schedular) != SCHEDULAR_STATE_RUNNING) {
00560 return FALSE;
00561 }
00562
00563 g_thread_create(schedular_stop_func, obj, FALSE, NULL);
00564
00565 return TRUE;
00566 }
00567 }
00568
00569 SchedularState
00570 nntpgrab_schedular_get_state(NNTPGrabCore *obj)
00571 {
00572 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00573
00574 g_assert(core->schedular);
00575
00576 return (schedular_get_state(core->schedular));
00577 }
00578
00579 gboolean
00580 nntpgrab_schedular_add_task_to_queue(NNTPGrabCore *obj, const char *collection_name, const char *subject, const char *poster, time_t stamp, guint64 file_size, GList *groups, GList *parts, char **errmsg)
00581 {
00582 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00583 NNTPFile *file;
00584 GList *list;
00585 char *tmp;
00586 char *tmp2;
00587 ConfigOpts opts;
00588
00589 g_assert(core->schedular);
00590
00591 file = g_slice_new0(NNTPFile);
00592 strncpy((char *) file->subject, subject, sizeof(file->subject));
00593 strncpy((char *) file->poster, poster, sizeof(file->poster));
00594 file->stamp = stamp;
00595 file->file_size = file_size;
00596 file->file_size_remaining = file_size;
00597
00598 opts = configuration_get_opts(core->config);
00599 tmp = tempnam(opts.temp_directory, NULL);
00600 tmp2 = g_path_get_basename(tmp);
00601 strncpy((char *) file->tmp_filename, tmp2, sizeof(file->tmp_filename));
00602 g_free(tmp2);
00603 free(tmp);
00604
00605
00606 if (!nntpgrab_utils_strip_subject(file->subject, NULL, NULL, NULL, NULL, NULL, NULL, &file->file_type, &file->par2_startnum, &file->num_par2_blocks, NULL, &file->numparts)) {
00607
00608 file->file_type = NNTP_FILE_TYPE_UNKNOWN;
00609 file->par2_startnum = -1;
00610 file->num_par2_blocks =-1;
00611 file->numparts = g_list_length(parts);
00612 }
00613
00614 file->status = TASK_STATE_WAITING_FOR_DOWNLOAD;
00615
00616 if (file->par2_startnum == -1) {
00617 file->par2_endnum = -1;
00618 } else {
00619 file->par2_endnum = file->par2_startnum + file->num_par2_blocks;
00620 }
00621
00622 list = groups;
00623 while (list) {
00624 const char *group = list->data;
00625 file->groups = g_list_append(file->groups, g_strdup(group));
00626 list = g_list_next(list);
00627 }
00628
00629 list = parts;
00630 while (list) {
00631 NNTPGrabPart *part = list->data;
00632 NNTPPart *new_part;
00633
00634 new_part = g_slice_new0(NNTPPart);
00635
00636 strncpy((char *) new_part->message_id, part->message_id, sizeof(new_part->message_id));
00637 new_part->size = part->size;
00638 new_part->partnum = part->partnum;
00639
00640 file->parts = g_list_append(file->parts, new_part);
00641
00642 list = g_list_next(list);
00643 }
00644
00645 return schedular_add_task_to_queue(core->schedular, collection_name, file, errmsg);
00646 }
00647
00648 gboolean
00649 nntpgrab_schedular_del_task_from_queue(NNTPGrabCore *obj, const char *collection_name, const char *subject, char **errmsg)
00650 {
00651 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00652
00653 g_assert(core->schedular);
00654 g_assert(collection_name);
00655
00656 return schedular_del_task_from_queue(core->schedular, collection_name, subject, errmsg);
00657 }
00658
00659 gboolean
00660 nntpgrab_schedular_restart_task(NNTPGrabCore *obj, const char *collection_name, const char *subject, char **errmsg)
00661 {
00662 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00663
00664 g_assert(core->schedular);
00665
00666 return schedular_restart_task(core->schedular, collection_name, subject, errmsg);
00667 }
00668
00669 gboolean
00670 nntpgrab_schedular_save_queue(NNTPGrabCore *obj, char **errmsg)
00671 {
00672 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00673
00674 g_assert(core->schedular);
00675
00676 return schedular_save_queue(core->schedular, errmsg);
00677 }
00678
00679 void
00680 nntpgrab_schedular_foreach_task(NNTPGrabCore *obj, ForeachCollectionFunc collection_func, ForeachFileFunc file_func, ForeachGroupFunc group_func, gpointer data)
00681 {
00682 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00683
00684 g_assert(core->schedular);
00685
00686 schedular_foreach_task(core->schedular, collection_func, file_func, group_func, data);
00687 }
00688
00689 gboolean
00690 nntpgrab_schedular_move_task(NNTPGrabCore *obj, const char *collection_name_src, const char *subject_src, const char *collection_name_dest, int position_dest)
00691 {
00692 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00693
00694 g_assert(core->schedular);
00695
00696 return schedular_move_task(core->schedular, collection_name_src, subject_src, collection_name_dest, position_dest);
00697 }
00698
00699 gboolean
00700 nntpgrab_schedular_move_collection(NNTPGrabCore *obj, const char *collection_name, int new_position)
00701 {
00702 NNTPGrabCore *core = NNTPGRAB_CORE(obj);
00703
00704 g_assert(core->schedular);
00705
00706 return schedular_move_collection(core->schedular, collection_name, new_position);
00707 }