* mu-msg.[ch]: improve message moving (update path, flags, maildir)

This commit is contained in:
Dirk-Jan C. Binnema
2011-09-18 14:42:55 +03:00
parent a984a70543
commit 7486e024bf
2 changed files with 54 additions and 11 deletions

View File

@ -77,6 +77,9 @@ msg_new (void)
self->_refcount = 1;
self->_cache = mu_msg_cache_new ();
self->_file = NULL;
self->_doc = NULL;
return self;
}
@ -135,7 +138,7 @@ mu_msg_destroy (MuMsg *self)
return;
mu_msg_file_destroy (self->_file);
mu_msg_doc_destroy (self->_doc);
mu_msg_doc_destroy (self->_doc);
mu_msg_cache_destroy (self->_cache);
@ -721,28 +724,74 @@ mu_msg_is_readable (MuMsg *self)
== 0) ? TRUE : FALSE;
}
/* we need do to determine the
* /home/foo/Maildir/bar
* from the /bar
* that we got
*/
char*
get_target_mdir (MuMsg *msg, const char *maildir)
{
char *rootmaildir, *rv;
rootmaildir = mu_maildir_get_maildir_from_path (mu_msg_get_path(msg));
if (!rootmaildir)
return NULL;
if (!g_str_has_suffix (rootmaildir, mu_msg_get_maildir(msg))) {
g_warning ("path is %s, but maildir is %s",
mu_msg_get_path (msg), mu_msg_get_maildir(msg));
g_free (rootmaildir);
return NULL;
}
rootmaildir[strlen(rootmaildir) - strlen (mu_msg_get_maildir(msg))] = '\0';
rv = g_strconcat (rootmaildir, maildir, NULL);
g_free (rootmaildir);
return rv;
}
/*
* move a msg to another maildir, trying to maintain 'integrity',
* ie. msg in 'new/' will go to new/, one in cur/ goes to cur/. be
* super-paranoid here...
*/
gboolean
mu_msg_move_to_maildir (MuMsg *self, const char* targetmdir,
mu_msg_move_to_maildir (MuMsg *self, const char *maildir,
MuFlags flags, gboolean ignore_dups, GError **err)
{
char *newfullpath;
char *targetmdir;
g_return_val_if_fail (self, FALSE);
g_return_val_if_fail (maildir, FALSE); /* i.e. "/inbox" */
targetmdir = get_target_mdir (self, maildir);
if (!targetmdir) {
g_set_error (err, 0, MU_ERROR, "could not determine target maildir");
return FALSE;
}
newfullpath = mu_maildir_move_message (mu_msg_get_path (self),
targetmdir, flags,
ignore_dups, err);
g_free (targetmdir);
/* update the message path and the flags; they may have
* changed */
if (newfullpath) {
mu_msg_cache_set_str (self->_cache, MU_MSG_FIELD_ID_PATH, newfullpath,
TRUE); /* the cache will free the string */
mu_msg_cache_set_str (self->_cache, MU_MSG_FIELD_ID_MAILDIR,
g_strdup(maildir), TRUE);
/* the cache will free the string */
/* the contentflags haven't changed, so make sure they persist */
flags |= mu_msg_get_flags (self) &

View File

@ -394,14 +394,8 @@ char* mu_msg_to_sexp (MuMsg *msg, unsigned docid,
*
* @param msg a message with an existing file system path in an actual
* maildir
* @param targetmdir the target maildir; note that this the base-level
* Maildir, ie. /home/user/Maildir/archive, and must _not_ include the
* 'cur' or 'new' part. mu_msg_move_to_maildir will make sure that the
* copy is from new/ to new/ and cur/ to cur/. Also note that the
* target maildir must be on the same filesystem. If you specify NULL
* for targetmdir, only the flags of the message are affected; note
* that this may still involve a move to another directory (say, from
* new/ to cur/)
* @param maildir the subdir where the message should go, relative to
* rootmaildir. e.g. "/archive"
* @param flags to set for the target (influences the filename, path)
* @param silently ignore the src=target case (return TRUE)
* @param err (may be NULL) may contain error information; note if the
@ -410,7 +404,7 @@ char* mu_msg_to_sexp (MuMsg *msg, unsigned docid,
*
* @return TRUE if it worked, FALSE otherwise
*/
gboolean mu_msg_move_to_maildir (MuMsg *msg, const char* targetmdir,
gboolean mu_msg_move_to_maildir (MuMsg *msg, const char *maildir,
MuFlags flags, gboolean ignore_dups,
GError **err);