Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
/**
 * 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);
	}
}