static void imap_fetch_all_update (struct imap_fetch_all_t *fetch) { SpruceIMAPSummary *imap_summary = (SpruceIMAPSummary *) fetch->summary; SpruceCache *cache = ((SpruceIMAPFolder *) imap_summary->folder)->cache; SpruceIMAPMessageInfo *iinfo, *new_iinfo; struct imap_envelope_t *envelope; SpruceFolderChangeInfo *changes; SpruceMessageInfo *info; guint32 flags; int total, i; changes = fetch->changes; total = spruce_folder_summary_count (fetch->summary); for (i = 0; i < total; i++) { info = spruce_folder_summary_index (fetch->summary, i); if (!(envelope = g_hash_table_lookup (fetch->uid_hash, info->uid))) { /* this message has been expunged from the server */ spruce_cache_expire_key (cache, info->uid, NULL); spruce_folder_change_info_remove_uid (changes, info->uid); spruce_folder_summary_remove (fetch->summary, info); total--; i--; } else if (envelope->changed & IMAP_FETCH_FLAGS) { /* update it with the new flags */ new_iinfo = (SpruceIMAPMessageInfo *) envelope->info; iinfo = (SpruceIMAPMessageInfo *) info; flags = info->flags; info->flags = spruce_imap_merge_flags (iinfo->server_flags, info->flags, new_iinfo->server_flags); iinfo->server_flags = new_iinfo->server_flags; if (info->flags != flags) spruce_folder_change_info_change_uid (changes, info->uid); } spruce_folder_summary_info_unref (fetch->summary, info); } for (i = 0; i < fetch->added->len; i++) { if (!(envelope = fetch->added->pdata[i])) { courier_imap_is_a_piece_of_shit (fetch->summary, fetch->first + i); continue; } spruce_folder_summary_info_unref (fetch->summary, envelope->info); g_free (envelope); } g_ptr_array_free (fetch->added, TRUE); g_hash_table_destroy (fetch->uid_hash); if (spruce_folder_change_info_changed (changes)) g_signal_emit_by_name (imap_summary->folder, "folder-changed", changes); spruce_folder_change_info_free (changes); g_free (fetch); }
static void imap4_fetch_all_add (struct imap4_fetch_all_t *fetch) { CamelFolderChangeInfo *changes = NULL; struct imap4_envelope_t *envelope; CamelMessageInfo *info; int i; changes = fetch->changes; for (i = 0; i < fetch->added->len; i++) { if (!(envelope = fetch->added->pdata[i])) { courier_imap_is_a_piece_of_shit (fetch->summary, i + fetch->first); break; } if (envelope->changed != IMAP4_FETCH_ALL) { d(fprintf (stderr, "Hmmm, IMAP4 server didn't give us everything for message %d\n", i + 1)); camel_message_info_free (envelope->info); g_free (envelope); continue; } if ((info = camel_folder_summary_uid (fetch->summary, camel_message_info_uid (envelope->info)))) { camel_message_info_free (envelope->info); camel_message_info_free (info); g_free (envelope); continue; } camel_folder_change_info_add_uid (changes, camel_message_info_uid (envelope->info)); if ((((CamelMessageInfoBase *) envelope->info)->flags & CAMEL_IMAP4_MESSAGE_RECENT)) camel_folder_change_info_recent_uid (changes, camel_message_info_uid (envelope->info)); camel_folder_summary_add (fetch->summary, envelope->info); g_free (envelope); } g_ptr_array_free (fetch->added, TRUE); g_hash_table_destroy (fetch->uid_hash); if (camel_folder_change_info_changed (changes)) camel_object_trigger_event (fetch->summary->folder, "folder_changed", changes); camel_folder_change_info_free (changes); g_free (fetch); }
static guint32 imap4_fetch_all_update (struct imap4_fetch_all_t *fetch) { CamelIMAP4MessageInfo *iinfo, *new_iinfo; CamelFolderChangeInfo *changes = NULL; struct imap4_envelope_t *envelope; CamelMessageInfo *info; guint32 first = 0; guint32 flags; int total, i; changes = fetch->changes; total = camel_folder_summary_count (fetch->summary); for (i = 0; i < total; i++) { info = camel_folder_summary_index (fetch->summary, i); if (!(envelope = g_hash_table_lookup (fetch->uid_hash, camel_message_info_uid (info)))) { /* remove it */ camel_folder_change_info_remove_uid (changes, camel_message_info_uid (info)); camel_folder_summary_remove (fetch->summary, info); total--; i--; } else if (envelope->changed & IMAP4_FETCH_FLAGS) { /* update it with the new flags */ new_iinfo = (CamelIMAP4MessageInfo *) envelope->info; iinfo = (CamelIMAP4MessageInfo *) info; flags = iinfo->info.flags; iinfo->info.flags = camel_imap4_merge_flags (iinfo->server_flags, iinfo->info.flags, new_iinfo->server_flags); iinfo->server_flags = new_iinfo->server_flags; if (iinfo->info.flags != flags) camel_folder_change_info_change_uid (changes, camel_message_info_uid (info)); } camel_message_info_free (info); } for (i = 0; i < fetch->added->len; i++) { if (!(envelope = fetch->added->pdata[i])) { courier_imap_is_a_piece_of_shit (fetch->summary, i + fetch->first); break; } info = envelope->info; if (!first && camel_message_info_uid (info)) { if ((info = camel_folder_summary_uid (fetch->summary, camel_message_info_uid (info)))) { camel_message_info_free(info); } else { first = i + fetch->first; } } camel_message_info_free(envelope->info); g_free (envelope); } g_ptr_array_free (fetch->added, TRUE); g_hash_table_destroy (fetch->uid_hash); if (camel_folder_change_info_changed (changes)) camel_object_trigger_event (fetch->summary->folder, "folder_changed", changes); camel_folder_change_info_free (changes); g_free (fetch); return first; }
/** * imap_fetch_all_add: * @fetch: FETCH ALL state * @complete: %TRUE if the FETCH command is complete or %FALSE otherwise * * Adds all newly acquired envelopes to the summary. Stops at the * first incomplete envelope. **/ static void imap_fetch_all_add (struct imap_fetch_all_t *fetch, gboolean complete) { SpruceIMAPSummary *imap_summary = (SpruceIMAPSummary *) fetch->summary; struct imap_envelope_t *envelope; SpruceFolderChangeInfo *changes; SpruceMessageInfo *info; guint32 i; changes = fetch->changes; for (i = 0; i < fetch->added->len; i++) { if (!(envelope = fetch->added->pdata[i])) { if (complete) courier_imap_is_a_piece_of_shit (fetch->summary, i + fetch->first); break; } if ((envelope->changed & IMAP_FETCH_ALL) != IMAP_FETCH_ALL) { /* server hasn't given us all the requested info for this message. */ if (complete) { fprintf (stderr, "Hmmm, IMAP server didn't give us everything for message %d\n", i + fetch->first); } break; } if (!(envelope->changed & IMAP_FETCH_SAVED)) { if ((info = spruce_folder_summary_uid (fetch->summary, envelope->info->uid))) continue; spruce_folder_change_info_add_uid (changes, envelope->info->uid); spruce_folder_summary_info_ref (fetch->summary, envelope->info); spruce_folder_summary_add (fetch->summary, envelope->info); envelope->changed |= IMAP_FETCH_SAVED; } } if (complete) { for (i = 0; i < fetch->added->len; i++) { if (!(envelope = fetch->added->pdata[i])) continue; spruce_folder_summary_info_unref (fetch->summary, envelope->info); g_free (envelope); } g_ptr_array_free (fetch->added, TRUE); g_hash_table_destroy (fetch->uid_hash); } if (spruce_folder_change_info_changed (changes)) g_signal_emit_by_name (imap_summary->folder, "folder-changed", changes); if (complete) { spruce_folder_change_info_free (changes); g_free (fetch); } else { spruce_folder_summary_save (fetch->summary); spruce_folder_change_info_clear (changes); } }