static CamelMessageInfo * message_info_from_uid (CamelFolderSummary *s, const gchar *uid) { CamelMessageInfo *info; /* FIXME[disk-summary] too bad design. Need to peek it from cfs * instead of hacking ugly like this */ camel_folder_summary_lock (s, CAMEL_FOLDER_SUMMARY_SUMMARY_LOCK); info = g_hash_table_lookup (s->loaded_infos, uid); if (info) camel_message_info_ref (info); camel_folder_summary_unlock (s, CAMEL_FOLDER_SUMMARY_SUMMARY_LOCK); if (!info) { CamelVeeMessageInfo *vinfo; gchar tmphash[9]; /* This function isn't really nice. But no great way * But in vfolder case, this may not be so bad, as vuid has the hash in first 8 bytes. * So this just compares the entire string only if it belongs to the same folder. * Otherwise, the first byte itself would return in strcmp, saving the CPU. */ if (!camel_folder_summary_check_uid (s, uid)) { d(g_message ("Unable to find %s in the summary of %s", uid, s->folder->full_name)); return NULL; } /* Create the info and load it, its so easy. */ info = camel_message_info_new (s); camel_message_info_ref (info); info->dirty = FALSE; vinfo = (CamelVeeMessageInfo *) info; info->uid = camel_pstring_strdup (uid); strncpy (tmphash, uid, 8); tmphash[8] = 0; vinfo->summary = g_hash_table_lookup (((CamelVeeFolder *) s->folder)->hashes, tmphash); g_object_ref (vinfo->summary); camel_folder_summary_insert (s, info, FALSE); } return info; }
void e_mail_session_append_to_local_folder (EMailSession *session, EMailLocalFolder local_id, CamelMimeMessage *message, CamelMessageInfo *info, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; AsyncContext *context; g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); context = g_slice_new0 (AsyncContext); context->local_id = local_id; context->message = g_object_ref (message); if (info != NULL) context->info = camel_message_info_ref (info); simple = g_simple_async_result_new ( G_OBJECT (session), callback, user_data, e_mail_session_append_to_local_folder); g_simple_async_result_set_check_cancellable (simple, cancellable); g_simple_async_result_set_op_res_gpointer ( simple, context, (GDestroyNotify) async_context_free); g_simple_async_result_run_in_thread ( simple, mail_session_append_to_local_folder_thread, io_priority, cancellable); g_object_unref (simple); }
static CamelMessageInfo * message_info_from_uid (CamelFolderSummary *s, const gchar *uid) { CamelMessageInfo *info; info = camel_folder_summary_peek_loaded (s, uid); if (!info) { CamelVeeMessageInfo *vinfo; gchar tmphash[9]; /* This function isn't really nice. But no great way * But in vfolder case, this may not be so bad, as vuid has the hash in first 8 bytes. * So this just compares the entire string only if it belongs to the same folder. * Otherwise, the first byte itself would return in strcmp, saving the CPU. */ if (!camel_folder_summary_check_uid (s, uid)) { d(g_message ("Unable to find %s in the summary of %s", uid, camel_folder_get_full_name (camel_folder_summary_get_folder (s->folder)))); return NULL; } /* Create the info and load it, its so easy. */ info = camel_message_info_new (s); camel_message_info_ref (info); info->dirty = FALSE; vinfo = (CamelVeeMessageInfo *) info; info->uid = camel_pstring_strdup (uid); strncpy (tmphash, uid, 8); tmphash[8] = 0; vinfo->orig_summary = g_hash_table_lookup (((CamelVeeFolder *) camel_folder_summary_get_folder (s))->hashes, tmphash); g_object_ref (vinfo->orig_summary); camel_folder_summary_insert (s, info, FALSE); } return info; }