* mu-msg.[ch]: improve message moving (update path, flags, maildir)
This commit is contained in:
53
src/mu-msg.c
53
src/mu-msg.c
@ -77,6 +77,9 @@ msg_new (void)
|
|||||||
self->_refcount = 1;
|
self->_refcount = 1;
|
||||||
self->_cache = mu_msg_cache_new ();
|
self->_cache = mu_msg_cache_new ();
|
||||||
|
|
||||||
|
self->_file = NULL;
|
||||||
|
self->_doc = NULL;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +138,7 @@ mu_msg_destroy (MuMsg *self)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
mu_msg_file_destroy (self->_file);
|
mu_msg_file_destroy (self->_file);
|
||||||
mu_msg_doc_destroy (self->_doc);
|
mu_msg_doc_destroy (self->_doc);
|
||||||
|
|
||||||
mu_msg_cache_destroy (self->_cache);
|
mu_msg_cache_destroy (self->_cache);
|
||||||
|
|
||||||
@ -721,28 +724,74 @@ mu_msg_is_readable (MuMsg *self)
|
|||||||
== 0) ? TRUE : FALSE;
|
== 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',
|
* 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
|
* ie. msg in 'new/' will go to new/, one in cur/ goes to cur/. be
|
||||||
* super-paranoid here...
|
* super-paranoid here...
|
||||||
*/
|
*/
|
||||||
gboolean
|
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)
|
MuFlags flags, gboolean ignore_dups, GError **err)
|
||||||
{
|
{
|
||||||
char *newfullpath;
|
char *newfullpath;
|
||||||
|
char *targetmdir;
|
||||||
|
|
||||||
g_return_val_if_fail (self, FALSE);
|
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),
|
newfullpath = mu_maildir_move_message (mu_msg_get_path (self),
|
||||||
targetmdir, flags,
|
targetmdir, flags,
|
||||||
ignore_dups, err);
|
ignore_dups, err);
|
||||||
|
g_free (targetmdir);
|
||||||
|
|
||||||
/* update the message path and the flags; they may have
|
/* update the message path and the flags; they may have
|
||||||
* changed */
|
* changed */
|
||||||
if (newfullpath) {
|
if (newfullpath) {
|
||||||
mu_msg_cache_set_str (self->_cache, MU_MSG_FIELD_ID_PATH, newfullpath,
|
mu_msg_cache_set_str (self->_cache, MU_MSG_FIELD_ID_PATH, newfullpath,
|
||||||
TRUE); /* the cache will free the string */
|
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 */
|
/* the contentflags haven't changed, so make sure they persist */
|
||||||
flags |= mu_msg_get_flags (self) &
|
flags |= mu_msg_get_flags (self) &
|
||||||
|
|||||||
12
src/mu-msg.h
12
src/mu-msg.h
@ -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
|
* @param msg a message with an existing file system path in an actual
|
||||||
* maildir
|
* maildir
|
||||||
* @param targetmdir the target maildir; note that this the base-level
|
* @param maildir the subdir where the message should go, relative to
|
||||||
* Maildir, ie. /home/user/Maildir/archive, and must _not_ include the
|
* rootmaildir. e.g. "/archive"
|
||||||
* '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 flags to set for the target (influences the filename, path)
|
* @param flags to set for the target (influences the filename, path)
|
||||||
* @param silently ignore the src=target case (return TRUE)
|
* @param silently ignore the src=target case (return TRUE)
|
||||||
* @param err (may be NULL) may contain error information; note if the
|
* @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
|
* @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,
|
MuFlags flags, gboolean ignore_dups,
|
||||||
GError **err);
|
GError **err);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user