* change mu_util_play a bit to better deal with non-ascii filenames

- don't try to encode anything, but pass the filename into the argv for the
    program to open (before we, used g_spawn_command_line_async, and there we
    need to escape things for the command line. Now we use g_spawn_command, so
    we can pass argv as such.
  - add a GError** arg to mu_util_play, and update all callers
  - cleanup the mu-cmd-extract code a bit
This commit is contained in:
djcb 2012-04-15 19:59:53 +03:00
parent 7a04f14963
commit 6f4448be56
6 changed files with 108 additions and 91 deletions

View File

@ -38,35 +38,30 @@ save_part (MuMsg *msg, const char *targetdir, guint partidx, gboolean overwrite,
{
GError *err;
gchar *filepath;
gboolean rv;
err = NULL;
rv = FALSE;
filepath = mu_msg_part_filepath (msg, targetdir, partidx, &err);
if (!filepath) {
if (err) {
g_warning ("failed to save MIME-part: %s",
err->message);
g_error_free (err);
}
g_free (filepath);
return FALSE;
}
if (!filepath)
goto exit;
if (!mu_msg_part_save (msg, filepath, partidx, overwrite, FALSE, &err)) {
if (err) {
g_warning ("failed to save MIME-part: %s",
err->message);
g_error_free (err);
}
g_free (filepath);
return FALSE;
}
if (!mu_msg_part_save (msg, filepath, partidx, overwrite, FALSE, &err))
goto exit;
if (play)
mu_util_play (filepath, TRUE, FALSE);
rv = mu_util_play (filepath, TRUE, FALSE, &err);
else
rv = TRUE;
exit:
if (err)
g_warning ("error with MIME-part: %s",
err->message);
g_clear_error (&err);
g_free (filepath);
return TRUE;
return rv;
}
@ -211,30 +206,27 @@ save_part_if (MuMsg *msg, MuMsgPart *part, SaveData *sd)
err = NULL;
filepath = mu_msg_part_filepath (msg, sd->targetdir, part->index, &err);
if (!filepath) {
g_warning ("failed to get file path: %s",
err&&err->message ? err->message : "error");
g_clear_error (&err);
goto leave;
}
if (!filepath)
goto exit;
if (!mu_msg_part_save (msg, filepath, part->index,
sd->overwrite, FALSE, &err)) {
g_warning ("failed to save MIME-part: %s",
err&&err->message ? err->message : "error");
g_clear_error (&err);
goto leave;
}
if (sd->play && !mu_util_play (filepath, TRUE, FALSE))
goto leave;
sd->overwrite, FALSE, &err))
goto exit;
if (sd->play)
rv = mu_util_play (filepath, TRUE, FALSE, &err);
else
rv = TRUE;
++sd->saved_num;
leave:
sd->result = rv;
++sd->saved_num;
exit:
if (err)
g_warning ("error saving MIME part: %s", err->message);
g_free (filepath);
g_clear_error (&err);
sd->result = rv;
}
static gboolean

View File

@ -238,6 +238,38 @@ get_docid_from_msgid (MuQuery *query, const char *str, GError **err)
}
/* get a *list* of all messages with the given message id */
G_GNUC_UNUSED static GSList*
get_docid_from_msgid_list (MuQuery *query, const char *str, GError **err)
{
gchar *querystr;
MuMsgIter *iter;
GSList *lst;
querystr = g_strdup_printf ("msgid:%s", str);
iter = mu_query_run (query, querystr, FALSE,
MU_MSG_FIELD_ID_NONE, FALSE, 1, err);
g_free (querystr);
if (!iter || mu_msg_iter_is_done (iter)) {
mu_util_g_set_error (err, MU_ERROR_NO_MATCHES,
"could not find message %s", str);
return NULL;
}
for (lst = NULL; !mu_msg_iter_is_done (iter); mu_msg_iter_next(iter)) {
unsigned docid;
docid = mu_msg_iter_get_docid (iter);
lst = g_slist_prepend
(lst, GUINT_TO_POINTER(docid));
}
mu_msg_iter_destroy (iter);
return lst;
}
/* the string contains either a number (docid) or a message-id if it
* doesn't look like a number, and the query param is non-nil, try to
* locale the message with message-id in the database, and return its
@ -510,11 +542,10 @@ open_part (MuMsg *msg, unsigned index, GError **err)
}
rv = mu_util_play (targetpath, TRUE/*allow local*/,
FALSE/*allow remote*/);
if (!rv) {
print_error (MU_ERROR_FILE, "failed to open");
goto leave;
} else {
FALSE/*allow remote*/, err);
if (!rv)
print_and_clear_g_error (err);
else {
gchar *path;
path = mu_str_escape_c_literal (targetpath, FALSE);
print_expr ("(:info open :message \"%s has been opened\")",
@ -615,10 +646,6 @@ cmd_extract (MuStore *store, MuQuery *query, GSList *args, GError **err)
/*
* 'find' finds a list of messages matching some query, and takes a
* parameter 'query' with the search query, and (optionally) a

View File

@ -323,12 +323,12 @@ mu_util_is_local_file (const char* path)
gboolean
mu_util_play (const char *path, gboolean allow_local, gboolean allow_remote)
mu_util_play (const char *path, gboolean allow_local, gboolean allow_remote,
GError **err)
{
gboolean rv;
GError *err;
const gchar *prog;
char *cmdline, *escpath;
const gchar *argv[3];
const char *prog;
g_return_val_if_fail (path, FALSE);
g_return_val_if_fail (mu_util_is_local_file (path) || allow_remote,
@ -345,19 +345,17 @@ mu_util_play (const char *path, gboolean allow_local, gboolean allow_remote)
#endif /*!__APPLE__*/
}
escpath = g_strescape (path, NULL);
cmdline = g_strdup_printf ("%s \"%s\"", prog, escpath);
g_free (escpath);
argv[0] = prog;
argv[1] = path;
argv[2] = NULL;
err = NULL;
rv = g_spawn_command_line_async (cmdline, &err);
if (!rv) {
g_warning ("failed to spawn %s: %s",
cmdline, err->message ? err->message : "error");
g_error_free (err);
}
g_free (cmdline);
rv = g_spawn_async (NULL,
(gchar**)&argv,
NULL,
G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL,
err);
return rv;
}

View File

@ -178,11 +178,12 @@ gboolean mu_util_printerr_encoded (const char *frm, ...) G_GNUC_PRINTF(1,2);
* @param path full path of the file to open
* @param allow_local allow local files (ie. with file:// prefix or fs paths)
* @param allow_remote allow URIs (ie., http, mailto)
* @param err receives error information, if any
*
* @return TRUE if it succeeded, FALSE otherwise
*/
gboolean mu_util_play (const char *path,
gboolean allow_local, gboolean allow_remote);
gboolean mu_util_play (const char *path, gboolean allow_local,
gboolean allow_remote, GError **err);

View File

@ -175,7 +175,7 @@ on_navigation_policy_decision_requested (MuMsgBodyView *self, WebKitWebFrame *fr
/* don't try to play files on our local file system, this is not something
* external content should do.*/
if (!mu_util_is_local_file(uri))
mu_util_play (uri, FALSE, TRUE);
mu_util_play (uri, FALSE, TRUE, NULL);
return TRUE;
}

View File

@ -134,11 +134,10 @@ on_attach_activated (GtkWidget *w, guint partnum, MuMsg *msg)
if (!mu_msg_part_save (msg, filepath, partnum, FALSE, TRUE, &err)) {
g_warning ("failed to save %s: %s", filepath,
err&&err->message?err->message:"error");
if (err)
g_error_free(err);
g_clear_error (&err);
}
mu_util_play (filepath, TRUE, FALSE);
mu_util_play (filepath, TRUE, FALSE, NULL);
g_free (filepath);
}
}