From 61ec5b754bb8acf189d0ac083bf8e0cb0c98ebc0 Mon Sep 17 00:00:00 2001 From: Chris Toshok Date: Fri, 23 Jun 2000 02:03:35 +0000 Subject: ignore test-newsrc 2000-06-22 Chris Toshok * providers/nntp/.cvsignore: ignore test-newsrc * providers/nntp/camel-nntp-store.c, providers/nntp/camel-nntp-store.h, providers/nntp/camel-nntp-folder.c, providers/nntp/camel-nntp-folder.h, providers/nntp/camel-nntp-utils.c: Bring the nntp provider up to a state where it builds and is usable with the current camel. there are still warts (semi-broken .newsrc file handling, and a lack of a subscribe ui -- in fact no way to add a new server, really), but it'll display news messages. * providers/nntp/Makefile.am (libcamelnntp_la_SOURCES): add camel-nntp-newsrc.c (libcamelnntpinclude_HEADERS): add camel-nntp-newsrc.h also, add test-newsrc stuff. * providers/nntp/test-newsrc.c: new file that tests the newsrc stuff by parsing and regurgitating a .newsrc file for a particular server. * providers/nntp/camel-nntp-newsrc.c, providers/nntp/camel-nntp-newsrc.h: new files, initial support for .newsrc files. svn path=/trunk/; revision=3702 --- camel/providers/nntp/camel-nntp-folder.c | 666 ++++++++++++------------------- 1 file changed, 259 insertions(+), 407 deletions(-) (limited to 'camel/providers/nntp/camel-nntp-folder.c') diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c index 8bc623add7..a3cfc49d26 100644 --- a/camel/providers/nntp/camel-nntp-folder.c +++ b/camel/providers/nntp/camel-nntp-folder.c @@ -57,163 +57,39 @@ static CamelFolderClass *parent_class=NULL; #define CNNTPS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass) -static void _init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, - gchar separator, CamelException *ex); - -static void _open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex); -static void _close (CamelFolder *folder, gboolean expunge, CamelException *ex); -static gboolean _exists (CamelFolder *folder, CamelException *ex); -static gboolean _create(CamelFolder *folder, CamelException *ex); -static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex); -static gboolean _delete_messages (CamelFolder *folder, CamelException *ex); -static GList *_list_subfolders (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex); -static gint _get_message_count (CamelFolder *folder, CamelException *ex); -static void _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); -static GPtrArray *_get_uid_array (CamelFolder *folder, CamelException *ex); -static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex); -#if 0 -static void _expunge (CamelFolder *folder, CamelException *ex); -static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex); -#endif -static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); - -static void _finalize (GtkObject *object); - -static void -camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_nntp_folder_class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_class); - - parent_class = gtk_type_class (camel_folder_get_type ()); - - /* virtual method definition */ - - /* virtual method overload */ - camel_folder_class->init = _init; - camel_folder_class->open = _open; - camel_folder_class->close = _close; - camel_folder_class->exists = _exists; - camel_folder_class->create = _create; - camel_folder_class->delete = _delete; - camel_folder_class->delete_messages = _delete_messages; - camel_folder_class->list_subfolders = _list_subfolders; - camel_folder_class->get_message_count = _get_message_count; - camel_folder_class->get_uid_array = _get_uid_array; - camel_folder_class->get_message_by_uid = _get_message_by_uid; -#if 0 - camel_folder_class->append_message = _append_message; - camel_folder_class->expunge = _expunge; - camel_folder_class->copy_message_to = _copy_message_to; - camel_folder_class->get_message_uid = _get_message_uid; -#endif - - gtk_object_class->finalize = _finalize; - -} - -static void -_finalize (GtkObject *object) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (object); - - g_free (nntp_folder->summary_file_path); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); -} - -GtkType -camel_nntp_folder_get_type (void) -{ - static GtkType camel_nntp_folder_type = 0; - - if (!camel_nntp_folder_type) { - GtkTypeInfo camel_nntp_folder_info = - { - "CamelNNTPFolder", - sizeof (CamelNNTPFolder), - sizeof (CamelNNTPFolderClass), - (GtkClassInitFunc) camel_nntp_folder_class_init, - (GtkObjectInitFunc) NULL, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - camel_nntp_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_nntp_folder_info); - } - - return camel_nntp_folder_type; -} +static void _check_get_or_maybe_generate_summary_file (CamelNNTPFolder *nntp_folder, + CamelException *ex); static void -_init (CamelFolder *folder, CamelStore *parent_store, - CamelFolder *parent_folder, const gchar *name, gchar separator, - CamelException *ex) +nntp_folder_init (CamelFolder *folder, CamelStore *parent_store, + CamelFolder *parent_folder, const gchar *name, + gchar *separator, gboolean path_begins_with_sep, + CamelException *ex) { + const gchar *root_dir_path; + CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); + /* call parent method */ parent_class->init (folder, parent_store, parent_folder, - name, separator, ex); + name, separator, path_begins_with_sep, + ex); if (camel_exception_get_id (ex)) return; - /* we assume that the parent init - method checks for the existance of @folder */ - - if (!strcmp(name, "/")) - { - folder->has_summary_capability = FALSE; - folder->can_hold_messages = FALSE; - folder->can_hold_folders = TRUE; - } - else - { - folder->has_summary_capability = TRUE; - folder->can_hold_messages = TRUE; - folder->can_hold_folders = TRUE; - } - - folder->has_uid_capability = TRUE; - folder->has_search_capability = FALSE; -} - -/* internal method used to : - - test for the existence of a summary file - - test the sync between the summary and the newsgroup - - load the summary or create it if necessary -*/ -static void -_check_get_or_maybe_generate_summary_file (CamelNNTPFolder *nntp_folder, - CamelException *ex) -{ - CamelFolder *folder = CAMEL_FOLDER (nntp_folder); - - nntp_folder->summary = camel_folder_summary_new (); - camel_folder_summary_set_filename (nntp_folder->summary, nntp_folder->summary_file_path); + /* set flags */ - if (-1 == camel_folder_summary_load (nntp_folder->summary)) { - /* Bad or nonexistant summary file */ - camel_nntp_get_headers (CAMEL_FOLDER( folder )->parent_store, nntp_folder, ex); - if (camel_exception_get_id (ex)) - return; - - /* XXX check return value */ - camel_folder_summary_save (nntp_folder->summary); + if (!strcmp (name, "/")) { + /* the root folder is the only folder that has "subfolders" */ + folder->can_hold_folders = TRUE; + folder->can_hold_messages = FALSE; + } + else { + folder->can_hold_folders = FALSE; + folder->can_hold_messages = TRUE; + folder->has_summary_capability = TRUE; } -} - - -static void -_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - const gchar *root_dir_path; - /* call parent class */ - parent_class->open (folder, mode, ex); - if (camel_exception_get_id(ex)) - return; + /* XX */ + nntp_folder->group_name = g_strdup (strrchr (name, '/') + 1); #if 0 /* get (or create) uid list */ @@ -223,135 +99,43 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) root_dir_path = camel_nntp_store_get_toplevel_dir (CAMEL_NNTP_STORE(folder->parent_store)); - nntp_folder->summary_file_path = g_strdup_printf ("%s/%s-ev-summary", root_dir_path, folder->name); - - _check_get_or_maybe_generate_summary_file (nntp_folder, ex); + nntp_folder->summary_file_path = g_strdup_printf ("%s/%s-ev-summary", + root_dir_path, nntp_folder->group_name); } - static void -_close (CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - CamelFolderSummary *summary = nntp_folder->summary; - - /* call parent implementation */ - parent_class->close (folder, expunge, ex); - - /* XXX only if dirty? */ - camel_folder_summary_save (summary); -} - -static gboolean -_exists (CamelFolder *folder, CamelException *ex) -{ -#if 0 - CamelNNTPFolder *nntp_folder; - struct stat stat_buf; - gint stat_error; - gboolean exists; - - g_assert(folder != NULL); - - nntp_folder = CAMEL_NNTP_FOLDER (folder); - - /* check if the nntp summary path is determined */ - if (!nntp_folder->summary_file_path) { - camel_exception_set (ex, - CAMEL_EXCEPTION_FOLDER_INVALID, - "undetermined folder summary path. Maybe use set_name ?"); - return FALSE; - } - - /* check if the nntp file exists */ - stat_error = stat (nntp_folder->summary_file_path, &stat_buf); - if (stat_error == -1) - return FALSE; - - exists = S_ISREG (stat_buf.st_mode); - /* we should check the rights here */ - - return exists; -#endif - return TRUE; -} - -static gboolean -_create (CamelFolder *folder, CamelException *ex) +nntp_folder_sync (CamelFolder *folder, gboolean expunge, + CamelException *ex) { -#if 0 - CamelNNTPSummary *summary; - g_assert(folder != NULL); - - /* call default implementation */ - parent_class->create (folder, ex); - - /* create the summary object */ - summary = CAMEL_NNTP_SUMMARY (gtk_object_new (camel_nntp_summary_get_type (), NULL)); - summary->nb_message = 0; - summary->next_uid = 1; - summary->nntp_file_size = 0; - summary->message_info = g_array_new (FALSE, FALSE, sizeof (CamelNNTPSummaryInformation)); -#endif - - return TRUE; + camel_folder_summary_save (CAMEL_NNTP_FOLDER(folder)->summary); } -static gboolean -_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) +static const gchar * +nntp_folder_get_name (CamelFolder *folder) { -#if 0 - gboolean folder_already_exists; - - g_assert(folder != NULL); - - /* check if the folder object exists */ - - /* in the case where the folder does not exist, - return immediatly */ - folder_already_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) - return FALSE; - - if (!folder_already_exists) - return TRUE; - - - /* call default implementation. - It should delete the messages in the folder - and recurse the operation to subfolders */ - parent_class->delete (folder, recurse, ex); -#endif - return TRUE; + g_assert(0); + return NULL; } -gboolean -_delete_messages (CamelFolder *folder, CamelException *ex) +static const gchar * +nntp_folder_get_full_name (CamelFolder *folder) { - - gboolean folder_already_exists; - - g_assert(folder!=NULL); - - /* in the case where the folder does not exist, - return immediatly */ - folder_already_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) return FALSE; - - if (!folder_already_exists) return TRUE; - - return TRUE; + g_assert(0); + return NULL; } -static GList * -_list_subfolders (CamelFolder *folder, CamelException *ex) +static CamelFolder* +nntp_folder_get_subfolder (CamelFolder *folder, + const gchar *folder_name, + gboolean create, + CamelException *ex) { - /* newsgroups don't have subfolders */ + g_assert (0); return NULL; } static gint -_get_message_count (CamelFolder *folder, CamelException *ex) +nntp_folder_get_message_count (CamelFolder *folder, CamelException *ex) { CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER(folder); @@ -361,155 +145,50 @@ _get_message_count (CamelFolder *folder, CamelException *ex) return camel_folder_summary_count(nntp_folder->summary); } -#if 0 -static void -_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) +static guint32 +nntp_folder_get_message_flags (CamelFolder *folder, const char *uid, CamelException *ex) { CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); -#if 0 - CamelNNTPSummary *summary = CAMEL_NNTP_SUMMARY (folder->summary); -#endif - CamelStream *output_stream; - guint32 tmp_file_size; - guint32 next_uid; - gint tmp_file_fd; - GArray *message_info_array; -#if 0 - GArray *nntp_summary_info; -#endif - gchar *tmp_message_filename; - gint fd1, fd2; - int i; - - /* write the message itself */ - output_stream = camel_stream_fs_new_with_name (tmp_message_filename, - CAMEL_STREAM_FS_WRITE); - if (output_stream != NULL) { - camel_stream_write_string (output_stream, "From - \n"); - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), output_stream); - } - camel_stream_flush (output_stream); - gtk_object_unref (GTK_OBJECT (output_stream)); - - /* at this point we have saved the message to a - temporary file, now, we have to add the x-evolution - field and also update the main summary */ - - /* - First : parse the nntp file, but only from the - position where the message has been added, - wich happens to be the last postion in the - nntp file before we added the message. - This position is still stored in the summary - for the moment - */ - next_uid = summary->next_uid; - tmp_file_fd = open (tmp_message_filename, O_RDONLY); - message_info_array = - camel_nntp_parse_file (tmp_file_fd, "From - ", 0, - &tmp_file_size, &next_uid, TRUE, - NULL, 0, ex); - - close (tmp_file_fd); - - /* get the value of the last available UID - as saved in the summary file, again */ - next_uid = summary->next_uid; - - /* make sure all our of message info's have 0 uid - ignore any - set elsewhere */ - for (i=0;ilen;i++) { - g_array_index(message_info_array, CamelNNTPParserMessageInfo, i).uid = 0; - } - - /* - OK, this is not very efficient, we should not use the same - method as for parsing an entire mail file, - but I have no time to write a simpler parser - */ -#if 0 - next_uid = camel_nntp_write_xev (nntp_folder, tmp_message_filename, - message_info_array, &tmp_file_size, next_uid, ex); - -#endif - if (camel_exception_get_id (ex)) { - /* ** FIXME : free the preparsed information */ - return; - } + CamelMessageInfo *info = camel_folder_summary_uid (nntp_folder->summary, uid); -#if 0 - nntp_summary_info = - parsed_information_to_nntp_summary (message_info_array); -#endif - - /* store the number of messages as well as the summary array */ - summary->nb_message += 1; - summary->next_uid = next_uid; + return info->flags; +} - ((CamelNNTPSummaryInformation *)(nntp_summary_info->data))->position += - summary->nntp_file_size; - summary->nntp_file_size += tmp_file_size; +static void +nntp_folder_set_message_flags (CamelFolder *folder, const char *uid, + guint32 flags, guint32 set, CamelException *ex) +{ + CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); + CamelMessageInfo *info = camel_folder_summary_uid (nntp_folder->summary, uid); - camel_nntp_summary_append_entries (summary, nntp_summary_info); - g_array_free (nntp_summary_info, TRUE); - + info->flags = set; - /* append the temporary file message to the nntp file */ - fd1 = open (tmp_message_filename, O_RDONLY); - fd2 = open (nntp_folder->folder_file_path, - O_WRONLY | O_CREAT | O_APPEND, - 0600); + camel_folder_summary_touch (nntp_folder->summary); + if (set & CAMEL_MESSAGE_SEEN) { + CamelNNTPStore *store; + CamelException *ex; + + ex = camel_exception_new (); + store = CAMEL_NNTP_STORE (camel_folder_get_parent_store (folder, ex)); + camel_exception_free (ex); - if (fd2 == -1) { - camel_exception_setv (ex, - CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, - "could not open the nntp folder file for appending the message\n" - "\t%s\n" - "Full error is : %s\n", - nntp_folder->folder_file_path, - strerror (errno)); - return; + camel_nntp_newsrc_mark_article_read (store->newsrc, + nntp_folder->group_name, + 1 /* XXX */); } - - camel_nntp_copy_file_chunk (fd1, - fd2, - tmp_file_size, - ex); - close (fd1); - close (fd2); - - /* remove the temporary file */ - unlink (tmp_message_filename); - - g_free (tmp_message_filename); } -#endif - - -static GPtrArray * -_get_uid_array (CamelFolder *folder, CamelException *ex) +static const gchar* +nntp_folder_get_message_uid (CamelFolder *folder, + CamelMimeMessage *message, + CamelException *ex) { - CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); - GPtrArray *message_info_array, *out; - CamelMessageInfo *message_info; - int i; - - message_info_array = nntp_folder->summary->messages; - - out = g_ptr_array_new (); - g_ptr_array_set_size (out, message_info_array->len); - - for (i=0; ilen; i++) { - message_info = (CamelMessageInfo *)(message_info_array->pdata) + i; - out->pdata[i] = g_strdup (message_info->uid); - } - - return out; + g_assert (0); + return NULL; } static CamelMimeMessage * -_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) +nntp_folder_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) { CamelStream *nntp_istream; CamelStream *message_stream; @@ -550,7 +229,7 @@ _get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) buf[0] = 0; while (!done) { - char *line = camel_stream_buffer_read_line ( CAMEL_STREAM_BUFFER ( nntp_istream ), ex); + char *line = camel_stream_buffer_read_line ( CAMEL_STREAM_BUFFER ( nntp_istream )); int line_length; /* XXX check exception */ @@ -589,9 +268,7 @@ _get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) gtk_object_unref ((GtkObject *)message_stream); /* init other fields? */ - message->folder = folder; gtk_object_ref((GtkObject *)folder); - message->message_uid = g_strdup(uid); #if 0 gtk_signal_connect((GtkObject *)message, "message_changed", message_changed, folder); @@ -600,18 +277,193 @@ _get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) return message; } -/* get message info for a range of messages */ +static void +nntp_folder_delete_message_by_uid (CamelFolder *folder, + const gchar *uid, + CamelException *ex) +{ + g_assert (0); +} + +static GPtrArray * +nntp_folder_get_uids (CamelFolder *folder, + CamelException *ex) +{ + CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); + GPtrArray *message_info_array, *out; + CamelMessageInfo *message_info; + int i; + + message_info_array = nntp_folder->summary->messages; + + out = g_ptr_array_new (); + g_ptr_array_set_size (out, message_info_array->len); + + for (i=0; ilen; i++) { + message_info = (CamelMessageInfo *)(message_info_array->pdata) + i; + out->pdata[i] = g_strdup (message_info->uid); + } + + return out; +} + +static void +nntp_folder_free_uids (CamelFolder *folder, + GPtrArray *array) +{ + int i; + for (i = 0; i < array->len; i ++) { + g_free (g_ptr_array_index (array, i)); + } + g_ptr_array_free (array, TRUE /* XXX? */); +} + +static GPtrArray * +nntp_folder_get_summary (CamelFolder *folder, + CamelException *ex) +{ + CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (folder); + _check_get_or_maybe_generate_summary_file (nntp_folder, ex); + + return nntp_folder->summary->messages; +} + +static void +nntp_folder_free_summary (CamelFolder *folder, + GPtrArray *summary) +{ + g_assert (0); +} + static GPtrArray * -summary_get_message_info (CamelFolder *folder, int first, int count) +nntp_folder_get_subfolder_names (CamelFolder *folder, CamelException *ex) +{ + if (!strcmp (folder->name, "/")) { + CamelStore *store = camel_folder_get_parent_store (folder, ex); + GPtrArray *array = camel_nntp_newsrc_get_subscribed_group_names (CAMEL_NNTP_STORE (store)->newsrc); + return array; + } + else { + return NULL; + } +} + +static void +nntp_folder_free_subfolder_names (CamelFolder *folder, GPtrArray *subfolders) +{ + if (subfolders) { + CamelException *ex = camel_exception_new (); + CamelStore *store = camel_folder_get_parent_store (folder, ex); + camel_nntp_newsrc_free_group_names (CAMEL_NNTP_STORE (store)->newsrc, subfolders); + camel_exception_free (ex); + } +} + +static GList* +nntp_folder_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex) { - GPtrArray *array = g_ptr_array_new(); - int i, maxcount; - CamelNNTPFolder *nntp_folder = (CamelNNTPFolder *)folder; + g_assert (0); + return NULL; +} + +static const CamelMessageInfo* +nntp_folder_summary_get_by_uid (CamelFolder *folder, const char *uid) +{ + g_assert(0); + return NULL; +} + +static void +nntp_folder_finalize (GtkObject *object) +{ + CamelNNTPFolder *nntp_folder = CAMEL_NNTP_FOLDER (object); + + g_free (nntp_folder->summary_file_path); + + GTK_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) +{ + CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_nntp_folder_class); + GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_class); + + parent_class = gtk_type_class (camel_folder_get_type ()); + + /* virtual method definition */ + + /* virtual method overload */ + camel_folder_class->init = nntp_folder_init; + camel_folder_class->sync = nntp_folder_sync; + camel_folder_class->get_name = nntp_folder_get_name; + camel_folder_class->get_full_name = nntp_folder_get_full_name; + camel_folder_class->get_subfolder = nntp_folder_get_subfolder; + camel_folder_class->get_message_count = nntp_folder_get_message_count; + camel_folder_class->set_message_flags = nntp_folder_set_message_flags; + camel_folder_class->get_message_flags = nntp_folder_get_message_flags; + camel_folder_class->get_message_uid = nntp_folder_get_message_uid; + camel_folder_class->get_message_by_uid = nntp_folder_get_message_by_uid; + camel_folder_class->delete_message_by_uid = nntp_folder_delete_message_by_uid; + camel_folder_class->get_uids = nntp_folder_get_uids; + camel_folder_class->free_uids = nntp_folder_free_uids; + camel_folder_class->get_summary = nntp_folder_get_summary; + camel_folder_class->free_summary = nntp_folder_free_summary; + camel_folder_class->get_subfolder_names = nntp_folder_get_subfolder_names; + camel_folder_class->free_subfolder_names = nntp_folder_free_subfolder_names; + camel_folder_class->search_by_expression = nntp_folder_search_by_expression; + camel_folder_class->summary_get_by_uid = nntp_folder_summary_get_by_uid; + + gtk_object_class->finalize = nntp_folder_finalize; + +} + +GtkType +camel_nntp_folder_get_type (void) +{ + static GtkType camel_nntp_folder_type = 0; + + if (!camel_nntp_folder_type) { + GtkTypeInfo camel_nntp_folder_info = + { + "CamelNNTPFolder", + sizeof (CamelNNTPFolder), + sizeof (CamelNNTPFolderClass), + (GtkClassInitFunc) camel_nntp_folder_class_init, + (GtkObjectInitFunc) NULL, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + camel_nntp_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_nntp_folder_info); + } + + return camel_nntp_folder_type; +} + + +/* internal method used to : + - test for the existence of a summary file + - test the sync between the summary and the newsgroup + - load the summary or create it if necessary +*/ +static void +_check_get_or_maybe_generate_summary_file (CamelNNTPFolder *nntp_folder, + CamelException *ex) +{ + CamelFolder *folder = CAMEL_FOLDER (nntp_folder); - maxcount = camel_folder_summary_count(nntp_folder->summary); - maxcount = MIN(first + count, maxcount); - for (i=first;isummary->messages, i)); + nntp_folder->summary = camel_folder_summary_new (); + camel_folder_summary_set_filename (nntp_folder->summary, nntp_folder->summary_file_path); - return array; + if (-1 == camel_folder_summary_load (nntp_folder->summary)) { + /* Bad or nonexistant summary file */ + camel_nntp_get_headers (CAMEL_FOLDER( folder )->parent_store, nntp_folder, ex); + if (camel_exception_get_id (ex)) + return; + + /* XXX check return value */ + camel_folder_summary_save (nntp_folder->summary); + } } -- cgit v1.2.3