diff options
Diffstat (limited to 'camel/providers')
-rw-r--r-- | camel/providers/nntp/camel-nntp-folder.c | 57 | ||||
-rw-r--r-- | camel/providers/nntp/camel-nntp-store.c | 14 | ||||
-rw-r--r-- | camel/providers/nntp/camel-nntp-summary.c | 22 |
3 files changed, 77 insertions, 16 deletions
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c index 17328bfd38..7c3e2063b1 100644 --- a/camel/providers/nntp/camel-nntp-folder.c +++ b/camel/providers/nntp/camel-nntp-folder.c @@ -79,8 +79,8 @@ static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar * #if 0 static void _expunge (CamelFolder *folder, CamelException *ex); static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex); -static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); #endif +static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex); static void _finalize (GtkObject *object); @@ -106,13 +106,13 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *camel_nntp_folder_class) camel_folder_class->list_subfolders = _list_subfolders; camel_folder_class->get_message_by_number = _get_message_by_number; camel_folder_class->get_message_count = _get_message_count; + camel_folder_class->get_uid_list = _get_uid_list; + camel_folder_class->get_message_by_uid = _get_message_by_uid; #if 0 camel_folder_class->append_message = _append_message; - camel_folder_class->get_uid_list = _get_uid_list; camel_folder_class->expunge = _expunge; camel_folder_class->copy_message_to = _copy_message_to; camel_folder_class->get_message_uid = _get_message_uid; - camel_folder_class->get_message_by_uid = _get_message_by_uid; #endif gtk_object_class->finalize = _finalize; @@ -198,7 +198,7 @@ _init (CamelFolder *folder, CamelStore *parent_store, folder->can_hold_folders = TRUE; } - folder->has_uid_capability = FALSE; + folder->has_uid_capability = TRUE; folder->has_search_capability = FALSE; folder->summary = NULL; @@ -448,11 +448,9 @@ _get_message_count (CamelFolder *folder, CamelException *ex) gint message_count = 0; g_assert (folder); -#if 0 g_assert (folder->summary); message_count = CAMEL_NNTP_SUMMARY (folder->summary)->nb_message; -#endif CAMEL_LOG_FULL_DEBUG ("CamelNNTPFolder::get_message_count found %d messages\n", message_count); return message_count; @@ -588,7 +586,6 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException -#if 0 static GList * _get_uid_list (CamelFolder *folder, CamelException *ex) { @@ -604,21 +601,43 @@ _get_uid_list (CamelFolder *folder, CamelException *ex) for (i=0; i<message_info_array->len; i++) { message_info = (CamelNNTPSummaryInformation *)(message_info_array->data) + i; - uid_list = g_list_prepend (uid_list, g_strdup_printf ("%u", message_info->uid)); + uid_list = g_list_prepend (uid_list, g_strdup (message_info->headers.uid)); } CAMEL_LOG_FULL_DEBUG ("Leaving CamelNNTPFolder::get_uid_list\n"); return uid_list; } -#endif static CamelMimeMessage * _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) { - + GArray *message_info_array; + CamelNNTPSummaryInformation *message_info; + + message_info_array = + CAMEL_NNTP_SUMMARY (folder->summary)->message_info; + + if (number > message_info_array->len) { + camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, + "No such message %d in folder `%s'.", + number, folder->name); + return NULL; + } + + message_info = + (CamelNNTPSummaryInformation *)(message_info_array->data) + + (number - 1); + + return _get_message_by_uid (folder, message_info->headers.uid, ex); +} + + +static CamelMimeMessage * +_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) +{ CamelStream *nntp_istream; CamelStream *message_stream; CamelMimeMessage *message = NULL; @@ -637,17 +656,17 @@ _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) return NULL; } - nntp_istream = CAMEL_NNTP_STORE (parent_store)->istream; + status = camel_nntp_command (CAMEL_NNTP_STORE( parent_store ), NULL, "ARTICLE %s", uid); - status = camel_nntp_command (CAMEL_NNTP_STORE( parent_store ), NULL, "ARTICLE %d", number); + nntp_istream = CAMEL_NNTP_STORE (parent_store)->istream; /* if the uid was not found, raise an exception and return */ if (status != CAMEL_NNTP_OK) { camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, - "message %d not found in the group", - number); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelNNTPFolder::get_message_by_number\n"); + "message %s not found.", + uid); + CAMEL_LOG_FULL_DEBUG ("Leaving CamelNNTPFolder::get_message_by_uid\n"); return NULL; } @@ -658,6 +677,8 @@ _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) buf = malloc(buf_alloc); done = FALSE; + buf[0] = 0; + while (!done) { char *line = camel_stream_buffer_read_line ( CAMEL_STREAM_BUFFER ( nntp_istream )); int line_length = strlen ( line ); @@ -671,6 +692,10 @@ _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) buf_alloc *= 2; buf = realloc (buf, buf_alloc); } + strcat(buf, line); + strcat(buf, "\n"); + buf_len += strlen(line); + g_free (line); } } @@ -682,6 +707,6 @@ _get_message_by_number (CamelFolder *folder, gint number, CamelException *ex) message = camel_mime_message_new_with_session (camel_service_get_session (CAMEL_SERVICE (parent_store))); camel_data_wrapper_set_input_stream (CAMEL_DATA_WRAPPER (message), message_stream); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelNNTPFolder::get_message_by_number\n"); + CAMEL_LOG_FULL_DEBUG ("Leaving CamelNNTPFolder::get_message_by_uid\n"); return message; } diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c index 0c300be197..e64cc14099 100644 --- a/camel/providers/nntp/camel-nntp-store.c +++ b/camel/providers/nntp/camel-nntp-store.c @@ -115,6 +115,8 @@ _get_folder (CamelStore *store, const gchar *folder_name, CamelException *ex) CamelNNTPFolder *new_nntp_folder; CamelFolder *new_folder; + folder_name = "netscape.public.mozilla.announce"; + /* check if folder has already been created */ /* call the standard routine for that when */ /* it is done ... */ @@ -271,11 +273,23 @@ camel_nntp_command (CamelNNTPStore *store, char **ret, char *fmt, ...) va_list ap; int status; int resp_code; + CamelException *ex; va_start (ap, fmt); cmdbuf = g_strdup_vprintf (fmt, ap); va_end (ap); + ex = camel_exception_new(); + + /* make sure we're connected */ + if (store->ostream == NULL) + nntp_connect (CAMEL_SERVICE (store), ex); + + if (camel_exception_get_id (ex)) { + camel_exception_free (ex); + return CAMEL_NNTP_FAIL; + } + /* Send the command */ camel_stream_write (store->ostream, cmdbuf, strlen (cmdbuf)); g_free (cmdbuf); diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c index 079c1dddab..174cceb4cb 100644 --- a/camel/providers/nntp/camel-nntp-summary.c +++ b/camel/providers/nntp/camel-nntp-summary.c @@ -243,6 +243,17 @@ camel_nntp_summary_save (CamelNNTPSummary *summary, const gchar *filename, write (fd, &data, sizeof (data)); if (msg_info->headers.received_date) write (fd, msg_info->headers.received_date, field_length); + + /* Write uid date. */ + if (msg_info->headers.uid) + field_length = strlen (msg_info->headers.uid); + else + field_length = 0; + data = htonl (field_length); + write (fd, &data, sizeof (data)); + if (msg_info->headers.uid) + write (fd, msg_info->headers.uid, field_length); + } close (fd); @@ -357,6 +368,17 @@ camel_nntp_summary_load (const gchar *newsgroup, const gchar *filename, CamelExc field_length); } else msg_info->headers.received_date = NULL; + + /* Read the uid field. */ + read (fd, &field_length, sizeof (field_length)); + field_length = ntohl (field_length); + if (field_length > 0) { + msg_info->headers.uid = + g_new0 (gchar, field_length + 1); + read (fd, msg_info->headers.uid, + field_length); + } else + msg_info->headers.uid = NULL; } close (fd); |