From: Dan Winship Date: Thu, 21 Sep 2000 21:05:56 +0000 (+0000) Subject: New function to convert Camel flags to an IMAP flag_list. X-Git-Tag: upstream/3.7.4~11413 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=784a2d5349304ad8d3b9d8c1a06ad1ef1a67d993;p=platform%2Fupstream%2Fevolution-data-server.git New function to convert Camel flags to an IMAP flag_list. * providers/imap/camel-imap-utils.c (imap_create_flag_list): New function to convert Camel flags to an IMAP flag_list. (imap_parse_flag_list): Contrariwise. * providers/imap/camel-imap-store.c (camel_imap_command_*): Make the @ret arg actually optional, as (mostly) documented. (various): Don't pass "&result" to camel_imap_command_* if we're just going to immediately free it. Don't record status if we're not going to look at it. * providers/imap/camel-imap-folder.c: Likewise. (imap_summary_free): Use camel_folder_info_free. (imap_sync): Use imap_create_flag_list. Clear CAMEL_MESSAGE_FOLDER_FLAGGED after syncing so we don't keep re-syncing. (imap_append_message): Use imap_create_flag_list. Don't leak the memstream if the append fails. (imap_move_message_to): Use camel_folder_delete_message rather than doing it by hand. (imap_get_summary_internal, imap_get_message_info_internal): Use imap_parse_flag_list and header_raw_clear. (camel_imap_folder_changed): Use camel_message_info_free. --- diff --git a/camel/ChangeLog b/camel/ChangeLog index 103b98b..729ee8d 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,30 @@ 2000-09-21 Dan Winship + * providers/imap/camel-imap-utils.c (imap_create_flag_list): New + function to convert Camel flags to an IMAP flag_list. + (imap_parse_flag_list): Contrariwise. + + * providers/imap/camel-imap-store.c (camel_imap_command_*): Make + the @ret arg actually optional, as (mostly) documented. + (various): Don't pass "&result" to camel_imap_command_* if we're + just going to immediately free it. Don't record status if we're + not going to look at it. + + * providers/imap/camel-imap-folder.c: Likewise. + (imap_summary_free): Use camel_folder_info_free. + (imap_sync): Use imap_create_flag_list. Clear + CAMEL_MESSAGE_FOLDER_FLAGGED after syncing so we don't keep + re-syncing. + (imap_append_message): Use imap_create_flag_list. Don't leak the + memstream if the append fails. + (imap_move_message_to): Use camel_folder_delete_message rather + than doing it by hand. + (imap_get_summary_internal, imap_get_message_info_internal): Use + imap_parse_flag_list and header_raw_clear. + (camel_imap_folder_changed): Use camel_message_info_free. + +2000-09-21 Dan Winship + * providers/imap/camel-imap-store.c (get_folder_name): INBOX is case-insensitive. (get_root_folder_name): Make the root folder "" rather than "/". @@ -13,7 +38,7 @@ (get_folder): Update for camel_imap_store_folder_path and other changes. (check_current_folder): Likewise. - + * providers/imap/camel-imap-folder.c: Change a bunch of CamelStore variables to CamelImapStore (and add a few more) to prevent excess gratuitous casting. Use camel_imap_store_folder_path where diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index f0d6933..539b906 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -133,7 +133,6 @@ camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class) camel_folder_class->search_by_expression = imap_search_by_expression; - /*camel_folder_class->get_permanent_flags = imap_get_permanent_flags;*/ camel_folder_class->get_message_flags = imap_get_message_flags; camel_folder_class->set_message_flags = imap_set_message_flags; camel_folder_class->get_message_user_flag = imap_get_message_user_flag; @@ -208,24 +207,12 @@ camel_imap_folder_new (CamelStore *parent, char *folder_name) static void imap_summary_free (GPtrArray **summary) { - CamelMessageInfo *info; GPtrArray *array = *summary; - gint i, max; + gint i; if (array) { - max = array->len; - for (i = 0; i < max; i++) { - info = g_ptr_array_index (array, i); - g_free (info->subject); - g_free (info->from); - g_free (info->to); - g_free (info->cc); - g_free (info->uid); - g_free (info->message_id); - header_references_list_clear (&info->references); - g_free (info); - info = NULL; - } + for (i = 0; i < array->len; i++) + camel_folder_info_free (array->pdata[i]); g_ptr_array_free (array, TRUE); *summary = NULL; @@ -290,26 +277,18 @@ imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) if (info->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) { char *flags; - flags = g_strconcat (info->flags & CAMEL_MESSAGE_SEEN ? "\\Seen " : "", - info->flags & CAMEL_MESSAGE_DRAFT ? "\\Draft " : "", - info->flags & CAMEL_MESSAGE_DELETED ? "\\Deleted " : "", - info->flags & CAMEL_MESSAGE_ANSWERED ? "\\Answered " : "", - NULL); - if (*flags) { - gchar *result; + flags = imap_create_flag_list (info->flags); + if (flags) { gint s; - *(flags + strlen (flags) - 1) = '\0'; - s = camel_imap_command_extended (store, folder, &result, ex, - "UID STORE %s FLAGS.SILENT (%s)", + s = camel_imap_command_extended (store, folder, NULL, ex, + "UID STORE %s FLAGS.SILENT %s", info->uid, flags); - if (s != CAMEL_IMAP_OK) return; - - g_free (result); + g_free (flags); } - g_free (flags); + info->flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED; } } } @@ -318,14 +297,8 @@ imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) static void imap_expunge (CamelFolder *folder, CamelException *ex) { - gchar *result; - gint status; - imap_sync (folder, FALSE, ex); - - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, - &result, ex, "EXPUNGE"); - g_free (result); + camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, NULL, ex, "EXPUNGE"); } static gint @@ -420,21 +393,17 @@ imap_append_message (CamelFolder *folder, CamelMimeMessage *message, const Camel CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); CamelStream *memstream; GByteArray *ba; - gchar *result, *cmdid; - gchar *folder_path, *flagstr = NULL; + gchar *cmdid; + gchar *folder_path, *flagstr; gint status; folder_path = camel_imap_store_folder_path (store, folder->full_name); /* create flag string param */ - if (info && info->flags) { - flagstr = g_strconcat (" (", info->flags & CAMEL_MESSAGE_SEEN ? "\\Seen " : "", - info->flags & CAMEL_MESSAGE_DRAFT ? "\\Draft " : "", - info->flags & CAMEL_MESSAGE_DELETED ? "\\Answered " : "", - NULL); - if (flagstr) - *(flagstr + strlen (flagstr) - 1) = ')'; - } + if (info && info->flags) + flagstr = imap_create_flag_list (info->flags); + else + flagstr = NULL; ba = g_byte_array_new (); memstream = camel_stream_mem_new_with_byte_array (ba); @@ -443,24 +412,25 @@ imap_append_message (CamelFolder *folder, CamelMimeMessage *message, const Camel camel_stream_write_string (memstream, "\r\n"); camel_stream_reset (memstream); - status = camel_imap_command_preliminary (store, &cmdid, ex, "APPEND %s%s {%d}", - folder_path, flagstr ? flagstr : "", ba->len - 2); + status = camel_imap_command_preliminary (store, &cmdid, ex, "APPEND %s%s%s {%d}", + folder_path, flagstr ? " " : "", + flagstr ? flagstr : "", ba->len - 2); g_free (folder_path); + g_free (flagstr); if (status != CAMEL_IMAP_PLUS) { g_free (cmdid); + camel_object_unref (CAMEL_OBJECT (memstream)); return; } /* send the rest of our data - the mime message */ - status = camel_imap_command_continuation_with_stream (store, &result, cmdid, memstream, ex); + status = camel_imap_command_continuation_with_stream (store, NULL, cmdid, memstream, ex); g_free (cmdid); if (status != CAMEL_IMAP_OK) return; - g_free (result); - camel_object_unref (CAMEL_OBJECT (memstream)); camel_imap_folder_changed (folder, 1, NULL, ex); } @@ -469,19 +439,17 @@ static void imap_copy_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex) { CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); - char *result, *folder_path; + char *folder_path; int status; folder_path = camel_imap_store_folder_path (store, destination->full_name); - status = camel_imap_command_extended (store, source, &result, ex, + status = camel_imap_command_extended (store, source, NULL, ex, "UID COPY %s %s", uid, folder_path); g_free (folder_path); if (status != CAMEL_IMAP_OK) return; - g_free (result); - camel_imap_folder_changed (destination, 1, NULL, ex); } @@ -490,30 +458,18 @@ static void imap_move_message_to (CamelFolder *source, const char *uid, CamelFolder *destination, CamelException *ex) { CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); - CamelMessageInfo *info; - char *result, *folder_path; + char *folder_path; int status; folder_path = camel_imap_store_folder_path (store, destination->full_name); - status = camel_imap_command_extended (store, source, &result, ex, + status = camel_imap_command_extended (store, source, NULL, ex, "UID COPY %s %s", uid, folder_path); g_free (folder_path); if (status != CAMEL_IMAP_OK) return; - g_free (result); - - if (!(info = (CamelMessageInfo *)imap_get_message_info (source, uid))) { - CamelService *service = CAMEL_SERVICE (store); - - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - "Could not set flags for message %s on IMAP server %s: %s", - uid, service->url->host, "Unknown error"); - return; - } - - imap_set_message_flags (source, uid, CAMEL_MESSAGE_DELETED, ~(info->flags)); + camel_folder_delete_message (source, uid); camel_imap_folder_changed (destination, 1, NULL, ex); } @@ -521,7 +477,7 @@ imap_move_message_to (CamelFolder *source, const char *uid, CamelFolder *destina static GPtrArray * imap_get_uids (CamelFolder *folder) { - CamelMessageInfo *info; + const CamelMessageInfo *info; GPtrArray *array, *infolist; gint i, count; @@ -533,7 +489,7 @@ imap_get_uids (CamelFolder *folder) g_ptr_array_set_size (array, count); for (i = 0; i < count; i++) { - info = (CamelMessageInfo *) g_ptr_array_index (infolist, i); + info = g_ptr_array_index (infolist, i); array->pdata[i] = g_strdup (info->uid); } @@ -765,21 +721,11 @@ imap_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) d(fprintf (stderr, "Message:\n%s\n", mesg)); msgstream = camel_stream_mem_new_with_buffer (mesg, strlen (mesg) + 1); -#if 0 - f_stream = camel_stream_filter_new_with_stream (msgstream); - filter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_DECODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS); - id = camel_stream_filter_add (f_stream, CAMEL_MIME_FILTER (filter)); -#endif msg = camel_mime_message_new (); d(fprintf (stderr, "*** We created the camel_mime_message ***\n")); camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), msgstream); -#if 0 - camel_stream_filter_remove (f_stream, id); - camel_stream_close (CAMEL_STREAM (f_stream)); -#endif camel_object_unref (CAMEL_OBJECT (msgstream)); - /*camel_object_unref (CAMEL_OBJECT (f_stream));*/ d(fprintf (stderr, "*** We're returning... ***\n")); @@ -946,24 +892,7 @@ imap_get_summary_internal (CamelFolder *folder, CamelException *ex) } for (flags += 6; *flags && *flags != '('; flags++); /* advance to */ - for (q = flags; *q && *q != ')'; q++); /* find the end of */ - flags = g_strndup (flags, (gint)(q - flags + 1)); - /*d(fprintf (stderr, "*** info->flags = %s\n", flags));*/ - - /* now we gotta parse for the flags */ - info->flags = 0; - if (strstr (flags, "\\Seen")) - info->flags |= CAMEL_MESSAGE_SEEN; - if (strstr (flags, "\\Answered")) - info->flags |= CAMEL_MESSAGE_ANSWERED; - if (strstr (flags, "\\Flagged")) - info->flags |= CAMEL_MESSAGE_FLAGGED; - if (strstr (flags, "\\Deleted")) - info->flags |= CAMEL_MESSAGE_DELETED; - if (strstr (flags, "\\Draft")) - info->flags |= CAMEL_MESSAGE_DRAFT; - g_free (flags); - flags = NULL; + info->flags = imap_parse_flag_list (flags); /* construct the header list */ /* fast-forward to beginning of header info... */ @@ -1015,14 +944,7 @@ imap_get_summary_internal (CamelFolder *folder, CamelException *ex) if (info->references == NULL) info->references = header_references_decode (header_raw_find (&h, "in-reply-to", NULL)); - while (h) { - struct _header_raw *next = h->next; - - g_free (h->name); - g_free (h->value); - g_free (h); - h = next; - } + header_raw_clear (&h); g_ptr_array_add (summary, info); g_hash_table_insert (hash, info->uid, info); @@ -1098,24 +1020,7 @@ imap_get_message_info_internal (CamelFolder *folder, guint id, CamelException *e } for (flags += 6; *flags && *flags != '('; flags++); /* advance to */ - for (q = flags; *q && *q != ')'; q++); /* find the end of */ - flags = g_strndup (flags, (gint)(q - flags + 1)); - d(fprintf (stderr, "*** info->flags = %s\n", flags)); - - /* now we gotta parse for the flags */ - info->flags = 0; - if (strstr (flags, "\\Seen")) - info->flags |= CAMEL_MESSAGE_SEEN; - if (strstr (flags, "\\Answered")) - info->flags |= CAMEL_MESSAGE_ANSWERED; - if (strstr (flags, "\\Flagged")) - info->flags |= CAMEL_MESSAGE_FLAGGED; - if (strstr (flags, "\\Deleted")) - info->flags |= CAMEL_MESSAGE_DELETED; - if (strstr (flags, "\\Draft")) - info->flags |= CAMEL_MESSAGE_DRAFT; - g_free (flags); - flags = NULL; + info->flags = imap_parse_flag_list (flags); /* construct the header list */ /* fast-forward to beginning of header info... */ @@ -1167,15 +1072,7 @@ imap_get_message_info_internal (CamelFolder *folder, guint id, CamelException *e if (info->references == NULL) info->references = header_references_decode (header_raw_find (&h, "in-reply-to", NULL)); - while (h->next) { - struct _header_raw *next = h->next; - - g_free (h->name); - g_free (h->value); - g_free (h); - h = next; - } - + header_raw_clear (&h); g_free (result); return info; @@ -1187,10 +1084,8 @@ imap_get_message_info (CamelFolder *folder, const char *uid) { CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - g_return_val_if_fail (*uid != '\0', NULL); - if (imap_folder->summary) - return (CamelMessageInfo *) g_hash_table_lookup (imap_folder->summary_hash, uid); + return g_hash_table_lookup (imap_folder->summary_hash, uid); return NULL; } @@ -1246,15 +1141,6 @@ imap_search_by_expression (CamelFolder *folder, const char *expression, CamelExc return uids; } -#if 0 -static guint32 -imap_get_permanent_flags (CamelFolder *folder, CamelException *ex) -{ - /* return permamnant flags */ - return folder->permanent_flags; -} -#endif - static guint32 imap_get_message_flags (CamelFolder *folder, const char *uid) { @@ -1276,7 +1162,6 @@ imap_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, gui info->flags = (info->flags & ~flags) | (set & flags) | CAMEL_MESSAGE_FOLDER_FLAGGED; - /*gtk_signal_emit_by_name (GTK_OBJECT (folder), "message_changed", uid);*/ camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", (gpointer *) uid); } @@ -1289,7 +1174,6 @@ imap_get_message_user_flag (CamelFolder *folder, const char *uid, const char *na static void imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value) { - /*gtk_signal_emit_by_name (GTK_OBJECT (folder), "message_changed", uid);*/ camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", (gpointer *) uid); } @@ -1314,16 +1198,7 @@ camel_imap_folder_changed (CamelFolder *folder, gint recent, GPtrArray *expunged g_hash_table_remove (imap_folder->summary_hash, info->uid); g_ptr_array_remove_index (imap_folder->summary, id - 1); - /* free the info data */ - g_free (info->subject); - g_free (info->from); - g_free (info->to); - g_free (info->cc); - g_free (info->uid); - g_free (info->message_id); - header_references_list_clear (&info->references); - g_free (info); - info = NULL; + camel_message_info_free (info); } else { /* Hopefully this should never happen */ d(fprintf (stderr, "imap expunge-error: message %d is out of range\n", id)); @@ -1357,15 +1232,7 @@ camel_imap_folder_changed (CamelFolder *folder, gint recent, GPtrArray *expunged g_hash_table_insert (imap_folder->summary_hash, info->uid, info); } else { /* we already have a record of it */ - g_free (info->subject); - g_free (info->from); - g_free (info->to); - g_free (info->cc); - g_free (info->uid); - g_free (info->message_id); - header_references_list_clear (&info->references); - g_free (info); - info = NULL; + camel_message_info_free (info); d(fprintf (stderr, "we already had message %d!!\n", i)); } } else { @@ -1377,6 +1244,5 @@ camel_imap_folder_changed (CamelFolder *folder, gint recent, GPtrArray *expunged } } - /*gtk_signal_emit_by_name (GTK_OBJECT (folder), "folder_changed", 0);*/ camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", GINT_TO_POINTER (0)); } diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 83d46b4..a55de84 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -296,15 +296,9 @@ static gboolean imap_disconnect (CamelService *service, CamelException *ex) { CamelImapStore *store = CAMEL_IMAP_STORE (service); - char *result; - int status; /* send the logout command */ - status = camel_imap_command_extended (store, NULL, &result, ex, "LOGOUT"); - if (status != CAMEL_IMAP_OK) { - /* Oh fuck it, we're disconnecting anyway... */ - } - g_free (result); + camel_imap_command_extended (store, NULL, NULL, ex, "LOGOUT"); g_free (store->dir_sep); store->dir_sep = NULL; @@ -378,12 +372,10 @@ imap_folder_exists (CamelImapStore *store, const char *folder_path, gboolean *se static gboolean imap_create (CamelImapStore *store, const char *folder_path, CamelException *ex) { - gchar *result; gint status; - status = camel_imap_command_extended (store, NULL, &result, ex, + status = camel_imap_command_extended (store, NULL, NULL, ex, "CREATE %s", folder_path); - g_free (result); return status == CAMEL_IMAP_OK; } @@ -446,15 +438,8 @@ static void imap_keepalive (CamelRemoteStore *store) { CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - char *result; - int status; - CamelException ex; - camel_exception_init (&ex); - status = camel_imap_command_extended (imap_store, imap_store->current_folder, - &result, &ex, "NOOP"); - camel_exception_clear (&ex); - g_free (result); + camel_imap_command_extended (imap_store, NULL, NULL, NULL, "NOOP"); } #if 0 @@ -500,7 +485,7 @@ camel_imap_status (char *cmdid, char *respbuf) static gint check_current_folder (CamelImapStore *store, CamelFolder *folder, char *fmt, CamelException *ex) { - char *result, *folder_path; + char *folder_path; int status; /* return OK if we meet one of the following criteria: @@ -511,14 +496,13 @@ check_current_folder (CamelImapStore *store, CamelFolder *folder, char *fmt, Cam return CAMEL_IMAP_OK; folder_path = camel_imap_store_folder_path (store, folder->full_name); - status = camel_imap_command_extended (store, NULL, &result, ex, "SELECT %s", folder_path); + status = camel_imap_command_extended (store, NULL, NULL, ex, "SELECT %s", folder_path); g_free (folder_path); - if (!result || status != CAMEL_IMAP_OK) { + if (status != CAMEL_IMAP_OK) { store->current_folder = NULL; return status; } - g_free (result); /* remember our currently selected folder */ store->current_folder = folder; @@ -622,7 +606,7 @@ camel_imap_command (CamelImapStore *store, CamelFolder *folder, CamelException * * a multi-line response. * @store: the IMAP store * @folder: The folder to perform the operation in - * @ret: a pointer to return the full server response in + * @ret: a pointer to return the full server response in, or %NULL * @fmt: a printf-style format string, followed by arguments * * This camel method sends the IMAP command specified by @fmt and the @@ -722,7 +706,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char ** } } - if (status == CAMEL_IMAP_OK) { + if (status == CAMEL_IMAP_OK && ret) { gchar *p; /* populate the return buffer with the server response */ @@ -742,7 +726,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char ** } *p = '\0'; - } else { + } else if (status != CAMEL_IMAP_OK) { /* command failed */ if (respbuf) { char *word; @@ -758,7 +742,8 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char ** "IMAP command failed: Unknown"); } - *ret = NULL; + if (ret) + *ret = NULL; } /* Update the summary */ @@ -786,7 +771,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char ** * a multi-line response. * @store: the IMAP store * @folder: The folder to perform the operation in - * @ret: a pointer to return the full server response in + * @ret: a pointer to return the full server response in, or %NULL * @fmt: a printf-style format string, followed by arguments * * This camel method sends the IMAP FETCH command specified by @fmt and the @@ -950,7 +935,7 @@ camel_imap_fetch_command (CamelImapStore *store, CamelFolder *folder, char **ret } } - if (status == CAMEL_IMAP_OK) { + if (status == CAMEL_IMAP_OK && ret) { gchar *p; /* populate the return buffer with the server response */ @@ -970,7 +955,7 @@ camel_imap_fetch_command (CamelImapStore *store, CamelFolder *folder, char **ret } *p = '\0'; - } else { + } else if (status != CAMEL_IMAP_OK) { /* command failed */ if (respbuf) { char *word; @@ -986,7 +971,8 @@ camel_imap_fetch_command (CamelImapStore *store, CamelFolder *folder, char **ret "IMAP command failed: Unknown"); } - *ret = NULL; + if (ret) + *ret = NULL; } /* Update the summary */ @@ -1022,11 +1008,6 @@ camel_imap_fetch_command (CamelImapStore *store, CamelFolder *folder, char **ret * @store. This function is meant for use with multi-transactional * IMAP communications like Kerberos authentication and APPEND. * - * If the caller passed a non-NULL pointer for @ret, - * camel_imap_command_preliminary will set it to point to a buffer - * containing the rest of the response from the IMAP server. The - * caller function is responsible for freeing @ret. - * * Return value: one of CAMEL_IMAP_PLUS, CAMEL_IMAP_NO, CAMEL_IMAP_BAD * or CAMEL_IMAP_FAIL * @@ -1081,14 +1062,14 @@ camel_imap_command_preliminary (CamelImapStore *store, char **cmdid, CamelExcept * server and possibly get a multi-line response. * @store: the IMAP store * @cmdid: The command identifier returned from camel_imap_command_preliminary - * @ret: a pointer to return the full server response in + * @ret: a pointer to return the full server response in, or %NULL * @cmdbuf: buffer containing the response/request data * - * This method is for sending continuing responses to the IMAP server. Meant - * to be used as a followup to camel_imap_command_preliminary. - * camel_imap_command_continuation will set @ret to point to a buffer - * containing the rest of the response from the IMAP server. The - * caller function is responsible for freeing @ret. + * This method is for sending continuing responses to the IMAP server. + * Meant to be used as a followup to camel_imap_command_preliminary. + * If @ret is non-%NULL camel_imap_command_continuation will set it to + * point to a buffer containing the rest of the response from the IMAP + * server. The caller function is responsible for freeing @ret. * * Return value: one of CAMEL_IMAP_PLUS (command requires additional data), * CAMEL_IMAP_OK (command executed successfully), @@ -1135,7 +1116,7 @@ camel_imap_command_continuation (CamelImapStore *store, char **ret, char *cmdid, } } - if (status == CAMEL_IMAP_OK) { + if (status == CAMEL_IMAP_OK && ret) { gchar *p; /* populate the return buffer with the server response */ @@ -1155,7 +1136,7 @@ camel_imap_command_continuation (CamelImapStore *store, char **ret, char *cmdid, } *p = '\0'; - } else { + } else if (status != CAMEL_IMAP_OK) { /* command failed */ if (respbuf) { char *word; @@ -1171,7 +1152,8 @@ camel_imap_command_continuation (CamelImapStore *store, char **ret, char *cmdid, "IMAP command failed: Unknown"); } - *ret = NULL; + if (ret) + *ret = NULL; } /* cleanup */ @@ -1187,14 +1169,14 @@ camel_imap_command_continuation (CamelImapStore *store, char **ret, char *cmdid, * server and possibly get a multi-line response. * @store: the IMAP store * @cmdid: The command identifier returned from camel_imap_command_preliminary - * @ret: a pointer to return the full server response in + * @ret: a pointer to return the full server response in, or %NULL * @cstream: a CamelStream containing a continuation response. * - * This method is for sending continuing responses to the IMAP server. Meant - * to be used as a followup to camel_imap_command_preliminary. - * camel_imap_command_continuation will set @ret to point to a buffer - * containing the rest of the response from the IMAP server. The - * caller function is responsible for freeing @ret. + * This method is for sending continuing responses to the IMAP server. + * Meant to be used as a followup to camel_imap_command_preliminary. + * If @ret is not %NULL, camel_imap_command_continuation will set it + * to point to a buffer containing the rest of the response from the + * IMAP server. The caller function is responsible for freeing @ret. * * Return value: one of CAMEL_IMAP_PLUS (command requires additional data), * CAMEL_IMAP_OK (command executed successfully), @@ -1243,7 +1225,7 @@ camel_imap_command_continuation_with_stream (CamelImapStore *store, char **ret, } } - if (status == CAMEL_IMAP_OK) { + if (status == CAMEL_IMAP_OK && ret) { gchar *p; /* populate the return buffer with the server response */ @@ -1263,7 +1245,7 @@ camel_imap_command_continuation_with_stream (CamelImapStore *store, char **ret, } *p = '\0'; - } else { + } else if (status != CAMEL_IMAP_OK) { /* command failed */ if (respbuf) { char *word; @@ -1279,7 +1261,8 @@ camel_imap_command_continuation_with_stream (CamelImapStore *store, char **ret, "IMAP command failed: Unknown error"); } - *ret = NULL; + if (ret) + *ret = NULL; } /* cleanup */ diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c index c329751..8fdc4fb 100644 --- a/camel/providers/imap/camel-imap-utils.c +++ b/camel/providers/imap/camel-imap-utils.c @@ -28,6 +28,7 @@ #include "camel-imap-utils.h" #include "string-utils.h" #include +#include "camel/camel-folder-summary.h" #define d(x) x @@ -496,3 +497,62 @@ imap_translate_sexp (const char *expression) return retval; } + +char * +imap_create_flag_list (guint32 flags) +{ + GString *gstr; + char *flag_list; + + gstr = g_string_new ("("); + + if (flags & CAMEL_MESSAGE_ANSWERED) + g_string_append (gstr, "\\Answered "); + if (flags & CAMEL_MESSAGE_DELETED) + g_string_append (gstr, "\\Deleted "); + if (flags & CAMEL_MESSAGE_DRAFT) + g_string_append (gstr, "\\Draft "); + if (flags & CAMEL_MESSAGE_FLAGGED) + g_string_append (gstr, "\\Flagged "); + if (flags & CAMEL_MESSAGE_SEEN) + g_string_append (gstr, "\\Seen "); + + if (gstr->str[gstr->len - 1] == ' ') + gstr->str[gstr->len - 1] = ')'; + else + g_string_append_c (gstr, ')'); + + flag_list = gstr->str; + g_string_free (gstr, FALSE); + return flag_list; +} + +guint32 +imap_parse_flag_list (const char *flag_list) +{ + guint32 flags = 0; + int len; + + if (*flag_list++ != '(') + return 0; + + while (*flag_list != ')') { + len = strcspn (flag_list, " )"); + if (!g_strncasecmp (flag_list, "\\Answered", len)) + flags |= CAMEL_MESSAGE_ANSWERED; + else if (!g_strncasecmp (flag_list, "\\Deleted", len)) + flags |= CAMEL_MESSAGE_DELETED; + else if (!g_strncasecmp (flag_list, "\\Draft", len)) + flags |= CAMEL_MESSAGE_DRAFT; + else if (!g_strncasecmp (flag_list, "\\Flagged", len)) + flags |= CAMEL_MESSAGE_FLAGGED; + else if (!g_strncasecmp (flag_list, "\\Seen", len)) + flags |= CAMEL_MESSAGE_SEEN; + + flag_list += len; + if (*flag_list == ' ') + flag_list++; + } + + return flags; +} diff --git a/camel/providers/imap/camel-imap-utils.h b/camel/providers/imap/camel-imap-utils.h index 11c6c48..6f450fc 100644 --- a/camel/providers/imap/camel-imap-utils.h +++ b/camel/providers/imap/camel-imap-utils.h @@ -36,6 +36,9 @@ gboolean imap_parse_list_response (char *buf, char *namespace, char **flags, cha char *imap_translate_sexp (const char *expression); +char *imap_create_flag_list (guint32 flags); +guint32 imap_parse_flag_list (const char *flag_list); + #ifdef __cplusplus } #endif /* __cplusplus */