From 0eb032e6426bcc42f8103792f9ee7cd41059f224 Mon Sep 17 00:00:00 2001 From: djcb Date: Thu, 20 Sep 2012 21:34:19 +0300 Subject: [PATCH] * mu4e: load message by path (WIP) --- mu/mu-cmd-server.c | 70 +++++++++++++++++++++++++++++++++++----------- mu4e/mu4e-proc.el | 31 +++++++++++++++----- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/mu/mu-cmd-server.c b/mu/mu-cmd-server.c index 7f97efca..a1d5e0d7 100644 --- a/mu/mu-cmd-server.c +++ b/mu/mu-cmd-server.c @@ -969,6 +969,26 @@ set_my_addresses (MuStore *store, const char *addrstr) g_strfreev (my_addresses); } + +static char* +get_checked_path (const char *path) +{ + char *cpath; + + cpath = mu_util_dir_expand(path); + if (!cpath || + !mu_util_check_dir (cpath, TRUE, FALSE)) { + print_error (MU_ERROR_IN_PARAMETERS, + "not a readable dir: '%s'"); + g_free (cpath); + return NULL; + } + + return cpath; +} + + + /* * 'index' (re)indexs maildir at path:, and responds with (:info * index ... ) messages while doing so (see the code) @@ -977,23 +997,26 @@ static MuError cmd_index (ServerContext *ctx, GSList *args, GError **err) { MuIndex *index; - const char *path; + const char *argpath; + char *path; MuIndexStats stats, stats2; MuError rv; - GET_STRING_OR_ERROR_RETURN (args, "path", &path, err); + index = NULL; + + GET_STRING_OR_ERROR_RETURN (args, "path", &argpath, err); + if (!(path = get_checked_path (argpath))) + goto leave; + set_my_addresses (ctx->store, get_string_from_args (args, "my-addresses", TRUE, NULL)); - index = mu_index_new (ctx->store, err); - if (!index) { - print_and_clear_g_error (err); - return MU_OK; - - } + if (!(index = mu_index_new (ctx->store, err))) + goto leave; mu_index_stats_clear (&stats); - rv = mu_index_run (index, path, FALSE, &stats, index_msg_cb, NULL, NULL); + rv = mu_index_run (index, argpath, FALSE, &stats, + index_msg_cb, NULL, NULL); if (rv != MU_OK && rv != MU_STOP) { print_error (MU_ERROR_INTERNAL, "indexing failed"); goto leave; @@ -1011,6 +1034,11 @@ cmd_index (ServerContext *ctx, GSList *args, GError **err) ":processed %u :updated %u :cleaned-up %u)", stats._processed, stats._updated, stats2._cleaned_up); leave: + g_free (path); + + if (err && *err) + print_and_clear_g_error (err); + mu_index_destroy (index); return MU_OK; } @@ -1341,8 +1369,6 @@ cmd_sent (ServerContext *ctx, GSList *args, GError **err) return MU_OK; } - - /* 'view' gets a full (including body etc.) sexp for some message, * identified by either docid: or msgid:; return a (:view ) */ @@ -1350,9 +1376,10 @@ static MuError cmd_view (ServerContext *ctx, GSList *args, GError **err) { MuMsg *msg; - unsigned docid; + const gchar *path; char *sexp; MuMsgOptions opts; + unsigned docid; opts = MU_MSG_OPTION_VERIFY; if (get_bool_from_args (args, "extract-images", FALSE, NULL)) @@ -1364,13 +1391,22 @@ cmd_view (ServerContext *ctx, GSList *args, GError **err) if (get_bool_from_args (args, "extract-encrypted", FALSE, NULL)) opts |= MU_MSG_OPTION_DECRYPT; - docid = determine_docid (ctx->query, args, err); - if (docid == MU_STORE_INVALID_DOCID) { - print_and_clear_g_error (err); - return MU_OK; + /* when 'path' is specified, get the message at path */ + path = get_string_from_args (args, "path", FALSE, NULL); + + if (path) { + docid = 0; + msg = mu_msg_new_from_file (path, NULL, err); + } else { + docid = determine_docid (ctx->query, args, err); + if (docid == MU_STORE_INVALID_DOCID) { + print_and_clear_g_error (err); + return MU_OK; + } + + msg = mu_store_get_msg (ctx->store, docid, err); } - msg = mu_store_get_msg (ctx->store, docid, err); if (!msg) { print_and_clear_g_error (err); return MU_OK; diff --git a/mu4e/mu4e-proc.el b/mu4e/mu4e-proc.el index 68745427..68ea5a82 100644 --- a/mu4e/mu4e-proc.el +++ b/mu4e/mu4e-proc.el @@ -110,17 +110,20 @@ data removed." ;; mu4e~cookie-matcher-rx: ;; (concat mu4e~cookie-pre "\\([[:xdigit:]]+\\)]" mu4e~cookie-post) (ignore-errors ;; an error would e.g. when proc is killed in the middel - (let ((b (string-match mu4e~cookie-matcher-rx mu4e~proc-buf)) (sexp-len) (objcons)) + (let ((b (string-match mu4e~cookie-matcher-rx mu4e~proc-buf)) + (sexp-len) (objcons)) (when b (setq sexp-len (string-to-number (match-string 1 mu4e~proc-buf) 16)) ;; does mu4e~proc-buf contain the full sexp? (when (>= (length mu4e~proc-buf) (+ sexp-len (match-end 0))) ;; clear-up start (setq mu4e~proc-buf (substring mu4e~proc-buf (match-end 0))) - ;; note: we read the input in binary mode -- here, we take the part that - ;; is the sexp, and convert that to utf-8, before we interpret it. + ;; note: we read the input in binary mode -- here, we take the part + ;; that is the sexp, and convert that to utf-8, before we interpret + ;; it. (setq objcons (read-from-string - (decode-coding-string (substring mu4e~proc-buf 0 sexp-len) + (decode-coding-string + (substring mu4e~proc-buf 0 sexp-len) 'utf-8 t))) (when objcons (setq mu4e~proc-buf (substring mu4e~proc-buf sexp-len)) @@ -242,7 +245,8 @@ The server output is as follows: ((plist-get sexp :temp) (funcall mu4e-temp-func (plist-get sexp :temp) ;; name of the temp file - (plist-get sexp :what) ;; what to do with it (pipe|emacs|open-with...) + (plist-get sexp :what) ;; what to do with it + ;; (pipe|emacs|open-with...) (plist-get sexp :param)));; parameter for the action ;; get some info @@ -454,8 +458,8 @@ seen AFTER (the time_t value)." (or after 0))) (defun mu4e~proc-view (docid-or-msgid &optional images decrypt) - "Get one particular message based on its DOCID-OR-MSGID (keyword -argument). Optionally, if IMAGES is non-nil, backend will any + "Get one particular message based on its +DOCID-OR-MSGID. Optionally, if IMAGES is non-nil, backend will any images attached to the message, and return them as temp files. The result will be delivered to the function registered as `mu4e-message-func'." @@ -465,5 +469,18 @@ result will be delivered to the function registered as (if images "true" "false") (if decrypt "true" "false"))) +(defun mu4e~proc-view-path (path &optional images decrypt) + "View message at PATH (keyword +argument). Optionally, if IMAGES is non-nil, backend will any +images attached to the message, and return them as temp files. The +result will be delivered to the function registered as +`mu4e-message-func'." + (mu4e~proc-send-command + "view path:\"%s\" extract-images:%s extract-encrypted:%s" + path + (if images "true" "false") + (if decrypt "true" "false"))) + + (provide 'mu4e-proc) ;; End of mu4e-proc.el