nntpgrab_core.c

Go to the documentation of this file.
00001 /*
00002  Copyright (C) 2005-2007 Erik van Pienbroek
00003 
00004  This program is free software; you can redistribute it and/or modify
00005  it under the terms of the GNU General Public License as published by
00006  the Free Software Foundation; either version 2 of the License, or
00007  (at your option) any later version.
00008 
00009  This program is distributed in the hope that it will be useful,
00010  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00012  GNU General Public License for more details.
00013 
00014  You should have received a copy of the GNU General Public License
00015  along with this program; if not, write to the Free Software
00016  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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 /* Public methods */
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     // Check if the API version matches
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     // Detect the installation directory on Win32
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         // Is the schedular queue already stopped?
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);                  // Don't use g_free here as tempnam is a libc function!
00604 
00605     // Detect the file type and the par2 blocks
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         // Sanitize values
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 }

Generated on Sun Oct 12 01:45:30 2008 for NNTPGrab by  1.5.4