static void emmb_set_message (EMFolderView *emfv, const gchar *uid, gint nomarkseen) { EMMessageBrowser *emmb = EM_MESSAGE_BROWSER (emfv); EMFolderViewClass *folder_view_class; CamelMessageInfo *info; /* Chain up to parent's set_message() method. */ folder_view_class = EM_FOLDER_VIEW_CLASS (parent_class); folder_view_class->set_message (emfv, uid, nomarkseen); if (uid == NULL) { gtk_widget_destroy (GTK_WIDGET (emfv)); return; } info = camel_folder_get_message_info (emfv->folder, uid); if (info != NULL) { gtk_window_set_title ( GTK_WINDOW (emmb->window), camel_message_info_subject (info)); camel_folder_free_message_info (emfv->folder, info); } /* Well we don't know if it got displayed (yet) ... but whatever ... */ if (!nomarkseen) camel_folder_set_message_flags ( emfv->folder, uid, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN); }
gboolean e_mail_session_handle_draft_headers_sync (EMailSession *session, CamelMimeMessage *message, GCancellable *cancellable, GError **error) { CamelFolder *folder; CamelMedium *medium; const gchar *folder_uri; const gchar *message_uid; const gchar *header_name; gboolean success; g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); medium = CAMEL_MEDIUM (message); header_name = "X-Evolution-Draft-Folder"; folder_uri = camel_medium_get_header (medium, header_name); header_name = "X-Evolution-Draft-Message"; message_uid = camel_medium_get_header (medium, header_name); /* Don't report errors about missing X-Evolution-Draft * headers. These headers are optional, so their absence * is handled by doing nothing. */ if (folder_uri == NULL || message_uid == NULL) return TRUE; folder = e_mail_session_uri_to_folder_sync ( session, folder_uri, 0, cancellable, error); if (folder == NULL) return FALSE; camel_folder_set_message_flags ( folder, message_uid, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN); success = camel_folder_synchronize_message_sync ( folder, message_uid, cancellable, error); g_object_unref (folder); return success; }
static void mc_quit_delete (CamelStore *store, struct _store_info *si, MailComponent *mc) { CamelFolder *folder = camel_store_get_junk (store, NULL); if (folder) { GPtrArray *uids; int i; uids = camel_folder_get_uids (folder); camel_folder_freeze(folder); for (i=0;i<uids->len;i++) camel_folder_set_message_flags(folder, uids->pdata[i], CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_SEEN); camel_folder_thaw(folder); camel_folder_free_uids (folder, uids); } }
gboolean e_mail_session_handle_source_headers_sync (EMailSession *session, CamelMimeMessage *message, GCancellable *cancellable, GError **error) { CamelFolder *folder; CamelMedium *medium; CamelMessageFlags flags = 0; const gchar *folder_uri; const gchar *message_uid; const gchar *flag_string; const gchar *header_name; gboolean success; guint length, ii; gchar **tokens; gchar *string; g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); medium = CAMEL_MEDIUM (message); header_name = "X-Evolution-Source-Folder"; folder_uri = camel_medium_get_header (medium, header_name); header_name = "X-Evolution-Source-Message"; message_uid = camel_medium_get_header (medium, header_name); header_name = "X-Evolution-Source-Flags"; flag_string = camel_medium_get_header (medium, header_name); /* Don't report errors about missing X-Evolution-Source * headers. These headers are optional, so their absence * is handled by doing nothing. */ if (folder_uri == NULL || message_uid == NULL || flag_string == NULL) return TRUE; /* Convert the flag string to CamelMessageFlags. */ string = g_strstrip (g_strdup (flag_string)); tokens = g_strsplit (string, " ", 0); g_free (string); /* If tokens is NULL, a length of 0 will skip the loop. */ length = (tokens != NULL) ? g_strv_length (tokens) : 0; for (ii = 0; ii < length; ii++) { /* Note: We're only checking for flags known to * be used in X-Evolution-Source-Flags headers. * Add more as needed. */ if (g_strcmp0 (tokens[ii], "ANSWERED") == 0) flags |= CAMEL_MESSAGE_ANSWERED; else if (g_strcmp0 (tokens[ii], "ANSWERED_ALL") == 0) flags |= CAMEL_MESSAGE_ANSWERED_ALL; else if (g_strcmp0 (tokens[ii], "FORWARDED") == 0) flags |= CAMEL_MESSAGE_FORWARDED; else if (g_strcmp0 (tokens[ii], "SEEN") == 0) flags |= CAMEL_MESSAGE_SEEN; else g_warning ( "Unknown flag '%s' in %s", tokens[ii], header_name); } g_strfreev (tokens); folder = e_mail_session_uri_to_folder_sync ( session, folder_uri, 0, cancellable, error); if (folder == NULL) return FALSE; camel_folder_set_message_flags ( folder, message_uid, flags, flags); success = camel_folder_synchronize_message_sync ( folder, message_uid, cancellable, error); g_object_unref (folder); return success; }
static gboolean maildir_folder_transfer_messages_to_sync (CamelFolder *source, GPtrArray *uids, CamelFolder *dest, gboolean delete_originals, GPtrArray **transferred_uids, GCancellable *cancellable, GError **error) { gboolean fallback = FALSE; if (delete_originals && CAMEL_IS_MAILDIR_FOLDER (source) && CAMEL_IS_MAILDIR_FOLDER (dest)) { gint i; CamelLocalFolder *lf = (CamelLocalFolder *) source; CamelLocalFolder *df = (CamelLocalFolder *) dest; camel_operation_push_message ( cancellable, _("Moving messages")); camel_folder_freeze (dest); camel_folder_freeze (source); for (i = 0; i < uids->len; i++) { gchar *uid = (gchar *) uids->pdata[i]; gchar *s_filename, *d_filename, *tmp; CamelMaildirMessageInfo *mdi; CamelMessageInfo *info; if ((info = camel_folder_summary_uid (source->summary, uid)) == NULL) { set_cannot_get_message_ex ( error, CAMEL_FOLDER_ERROR_INVALID_UID, uid, lf->folder_path, _("No such message")); return FALSE; } mdi = (CamelMaildirMessageInfo *) info; tmp = camel_maildir_summary_info_to_name (mdi); d_filename = g_strdup_printf ("%s/cur/%s", df->folder_path, tmp); g_free (tmp); s_filename = g_strdup_printf("%s/cur/%s", lf->folder_path, camel_maildir_info_filename (mdi)); if (g_rename (s_filename, d_filename) != 0) { if (errno == EXDEV) { i = uids->len + 1; fallback = TRUE; } else { g_set_error ( error, G_IO_ERROR, g_io_error_from_errno (errno), _("Cannot transfer message to destination folder: %s"), g_strerror (errno)); camel_message_info_free (info); break; } } else { camel_folder_set_message_flags ( source, uid, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN, ~0); camel_folder_summary_remove (source->summary, info); } camel_message_info_free (info); g_free (s_filename); g_free (d_filename); } camel_folder_thaw (source); camel_folder_thaw (dest); camel_operation_pop_message (cancellable); } else fallback = TRUE; if (fallback) { CamelFolderClass *folder_class; /* Chain up to parent's transfer_messages_to() method. */ folder_class = CAMEL_FOLDER_CLASS (camel_maildir_folder_parent_class); return folder_class->transfer_messages_to_sync ( source, uids, dest, delete_originals, transferred_uids, cancellable, error); } return TRUE; }
static gboolean maildir_folder_transfer_messages_to_sync (CamelFolder *source, GPtrArray *uids, CamelFolder *dest, gboolean delete_originals, GPtrArray **transferred_uids, GCancellable *cancellable, GError **error) { gboolean fallback = FALSE; if (delete_originals && CAMEL_IS_MAILDIR_FOLDER (source) && CAMEL_IS_MAILDIR_FOLDER (dest) && camel_folder_get_parent_store (source) == camel_folder_get_parent_store (dest)) { gint i; CamelLocalFolder *lf = (CamelLocalFolder *) source; CamelLocalFolder *df = (CamelLocalFolder *) dest; camel_operation_push_message ( cancellable, _("Moving messages")); camel_folder_freeze (dest); camel_folder_freeze (source); for (i = 0; i < uids->len; i++) { gchar *uid = (gchar *) uids->pdata[i]; gchar *s_filename, *d_filename, *new_filename; CamelMaildirMessageInfo *mdi; CamelMessageInfo *info; if ((info = camel_folder_summary_get (source->summary, uid)) == NULL) { set_cannot_get_message_ex ( error, CAMEL_FOLDER_ERROR_INVALID_UID, uid, lf->folder_path, _("No such message")); return FALSE; } mdi = (CamelMaildirMessageInfo *) info; new_filename = camel_maildir_summary_info_to_name (mdi); d_filename = g_strdup_printf ("%s/cur/%s", df->folder_path, new_filename); s_filename = g_strdup_printf ("%s/cur/%s", lf->folder_path, camel_maildir_info_filename (mdi)); if (g_rename (s_filename, d_filename) != 0) { if (errno == EXDEV) { i = uids->len + 1; fallback = TRUE; } else { g_set_error ( error, G_IO_ERROR, g_io_error_from_errno (errno), _("Cannot transfer message to destination folder: %s"), g_strerror (errno)); camel_message_info_unref (info); g_free (s_filename); g_free (d_filename); g_free (new_filename); break; } } else { CamelMessageInfo *clone; CamelMaildirMessageInfo *mclone; clone = camel_message_info_clone (info); clone->summary = dest->summary; mclone = (CamelMaildirMessageInfo *) clone; /* preserve also UID, as it matches the file name */ mclone->info.info.uid = camel_pstring_strdup (camel_message_info_get_uid (info)); camel_maildir_info_set_filename (clone, g_strdup (new_filename)); /* unset deleted flag when transferring from trash folder */ if ((source->folder_flags & CAMEL_FOLDER_IS_TRASH) != 0) camel_message_info_set_flags (info, CAMEL_MESSAGE_DELETED, 0); /* unset junk flag when transferring from junk folder */ if ((source->folder_flags & CAMEL_FOLDER_IS_JUNK) != 0) camel_message_info_set_flags (info, CAMEL_MESSAGE_JUNK, 0); camel_folder_summary_add (dest->summary, clone); camel_folder_change_info_add_uid (df->changes, camel_message_info_get_uid (clone)); camel_folder_set_message_flags ( source, uid, CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN, ~0); camel_folder_change_info_remove_uid (lf->changes, camel_message_info_get_uid (info)); camel_folder_summary_remove (source->summary, info); } camel_message_info_unref (info); g_free (s_filename); g_free (d_filename); g_free (new_filename); } if (lf && camel_folder_change_info_changed (lf->changes)) { camel_folder_changed (source, lf->changes); camel_folder_change_info_clear (lf->changes); } if (df && camel_folder_change_info_changed (df->changes)) { camel_folder_changed (dest, df->changes); camel_folder_change_info_clear (df->changes); } camel_folder_thaw (source); camel_folder_thaw (dest); camel_operation_pop_message (cancellable); } else fallback = TRUE; if (fallback) { CamelFolderClass *folder_class; /* Chain up to parent's transfer_messages_to() method. */ folder_class = CAMEL_FOLDER_CLASS (camel_maildir_folder_parent_class); return folder_class->transfer_messages_to_sync ( source, uids, dest, delete_originals, transferred_uids, cancellable, error); } return TRUE; }