* mu-cmd-server.c: some refactoring. pass make line33 again.

This commit is contained in:
djcb
2011-12-20 21:42:24 +02:00
parent 9705487929
commit 85504f02f1

View File

@ -273,25 +273,33 @@ get_path_from_docid (MuStore *store, unsigned docid, GError **err)
static gboolean static gboolean
check_param_num (GSList *lst, unsigned min, unsigned max) check_param_num (GSList *args, unsigned min, unsigned max)
{ {
unsigned len; unsigned len;
len = g_slist_length (lst); len = g_slist_length (args);
return len >= min && len <= max; return len >= min && len <= max;
} }
#define return_if_fail_param_num(ARGS,MN,MX,USAGE) \
do { \
if (!check_param_num((ARGS),(MN),(MX))) \
return server_error(NULL,MU_ERROR_IN_PARAMETERS, \
(USAGE)); \
} while (0)
/* -> ping /* -> ping
* <- (:pong mu :version <version> :doccount <doccount>) * <- (:pong mu :version <version> :doccount <doccount>)
*/ */
static MuError static MuError
cmd_ping (MuStore *store, GSList *lst, GError **err) cmd_ping (MuStore *store, GSList *args, GError **err)
{ {
if (!check_param_num (lst, 0, 0)) return_if_fail_param_num (args, 0, 0, "usage: version");
return server_error (NULL, MU_ERROR_IN_PARAMETERS,
"usage: version");
send_expr ("(:pong \"" PACKAGE_NAME "\" " send_expr ("(:pong \"" PACKAGE_NAME "\" "
":version \"" VERSION "\" " ":version \"" VERSION "\" "
@ -302,52 +310,43 @@ cmd_ping (MuStore *store, GSList *lst, GError **err)
return MU_OK; return MU_OK;
} }
/* /*
* find <query> <maxnum> * find <query> <maxnum>
* => list of s-expression, each describing a message * => list of s-expression, each describing a message
* => (:found <number of found messages>) * => (:found <number of found messages>)
*/ */
static MuError static MuError
cmd_find (MuStore *store, MuQuery *query, GSList *lst, GError **err) cmd_find (MuStore *store, MuQuery *query, GSList *args, GError **err)
{ {
MuMsgIter *iter; MuMsgIter *iter;
unsigned u; unsigned u;
int maxnum; int maxnum;
const char* usage = "usage: find <searchexpr> <maxnum>";
if (!check_param_num (lst, 2, 2)) return_if_fail_param_num (args, 2, 2, usage);
return server_error (NULL, MU_ERROR_IN_PARAMETERS,
"usage: find <searchexpr> <maxnum>");
maxnum = atoi((const char*)lst->next->data); if ((maxnum = atoi((const char*)args->next->data)) == 0)
if (maxnum == 0) return server_error (NULL, MU_ERROR_IN_PARAMETERS, usage);
return server_error (NULL, MU_ERROR_IN_PARAMETERS,
"usage: find <maxnum> <searchexpr>");
iter = mu_query_run (query, (const char*)lst->data, TRUE, if (!(iter = mu_query_run (query, (const char*)args->data, TRUE,
MU_MSG_FIELD_ID_DATE, TRUE, maxnum, err); MU_MSG_FIELD_ID_DATE, TRUE, maxnum, err)))
if (!iter)
return server_error (err, MU_ERROR_INTERNAL, return server_error (err, MU_ERROR_INTERNAL,
"couldn't get iterator"); "couldn't get iterator");
u = 0; for (u = 0; !mu_msg_iter_is_done (iter) && !MU_CAUGHT_SIGNAL;
while (!mu_msg_iter_is_done (iter) && !MU_CAUGHT_SIGNAL) { mu_msg_iter_next (iter)) {
MuMsg *msg; MuMsg *msg;
msg = mu_msg_iter_get_msg_floating (iter); msg = mu_msg_iter_get_msg_floating (iter);
if (mu_msg_is_readable (msg)) { if (mu_msg_is_readable (msg)) {
char *sexp; char *sexp;
sexp = mu_msg_to_sexp (msg, sexp = mu_msg_to_sexp (msg, mu_msg_iter_get_docid (iter),
mu_msg_iter_get_docid (iter),
mu_msg_iter_get_thread_info (iter), mu_msg_iter_get_thread_info (iter),
TRUE); TRUE);
send_expr ("%s", sexp); send_expr ("%s", sexp);
g_free (sexp); g_free (sexp);
++u; ++u;
} }
mu_msg_iter_next (iter);
} }
mu_msg_iter_destroy (iter); mu_msg_iter_destroy (iter);
/* return the number of results found */ /* return the number of results found */
@ -357,16 +356,14 @@ cmd_find (MuStore *store, MuQuery *query, GSList *lst, GError **err)
} }
static MuError static MuError
cmd_mkdir (GSList *lst, GError **err) cmd_mkdir (GSList *args, GError **err)
{ {
if (!check_param_num (lst, 1, 1)) return_if_fail_param_num (args, 1, 1, "usage: mkdir <maildir>");
return server_error (NULL, MU_ERROR_IN_PARAMETERS,
"usage: mkdir <maildir>");
if (!mu_maildir_mkdir ((const char*)lst->data, 0755, FALSE, err)) if (!mu_maildir_mkdir ((const char*)args->data, 0755, FALSE, err))
return server_error (err, MU_G_ERROR_CODE (err), return server_error (err, MU_G_ERROR_CODE (err),
"failed to create maildir '%s'", "failed to create maildir '%s'",
(const char*)lst->data); (const char*)args->data);
return MU_OK; return MU_OK;
} }
@ -482,7 +479,7 @@ do_move (MuStore *store, unsigned docid, MuMsg *msg, const char *maildir,
static MuError static MuError
move_or_flag (MuStore *store, MuQuery *query, GSList *lst, gboolean is_move, move_or_flag (MuStore *store, MuQuery *query, GSList *args, gboolean is_move,
GError **err) GError **err)
{ {
MuError merr; MuError merr;
@ -492,19 +489,19 @@ move_or_flag (MuStore *store, MuQuery *query, GSList *lst, gboolean is_move,
GSList *flagitem; GSList *flagitem;
const char *mdir; const char *mdir;
if ((docid = get_docid (query, (const char*)lst->data, err)) == 0) if ((docid = get_docid (query, (const char*)args->data, err)) == 0)
return server_error (err, MU_ERROR_IN_PARAMETERS, return server_error (err, MU_ERROR_IN_PARAMETERS,
"invalid docid '%s'", (char*)lst->data); "invalid docid '%s'", (char*)args->data);
msg = mu_store_get_msg (store, docid, err); msg = mu_store_get_msg (store, docid, err);
if (!msg) if (!msg)
return server_error (err, MU_ERROR, "failed to get message"); return server_error (err, MU_ERROR, "failed to get message");
if (is_move) { if (is_move) {
mdir = (const char*)g_slist_nth (lst, 1)->data; mdir = (const char*)g_slist_nth (args, 1)->data;
flagitem = g_slist_nth (lst, 2); flagitem = g_slist_nth (args, 2);
} else { /* flag */ } else { /* flag */
mdir = mu_msg_get_maildir (msg); mdir = mu_msg_get_maildir (msg);
flagitem = g_slist_nth (lst, 1); flagitem = g_slist_nth (args, 1);
} }
flags = get_flags (mu_msg_get_path(msg), flags = get_flags (mu_msg_get_path(msg),
@ -522,40 +519,34 @@ move_or_flag (MuStore *store, MuQuery *query, GSList *lst, gboolean is_move,
static MuError static MuError
cmd_move (MuStore *store, GSList *lst, GError **err) cmd_move (MuStore *store, GSList *args, GError **err)
{ {
if (!check_param_num (lst, 2, 3)) return_if_fail_param_num (args, 2, 3,
return server_error "usage: move <docid> <maildir> [<flags>]");
(NULL, MU_ERROR_IN_PARAMETERS,
"usage: move <docid> <maildir> [<flags>]");
return move_or_flag (store, NULL, lst, TRUE, err); return move_or_flag (store, NULL, args, TRUE, err);
} }
static MuError static MuError
cmd_flag (MuStore *store, MuQuery *query, GSList *lst, GError **err) cmd_flag (MuStore *store, MuQuery *query, GSList *args, GError **err)
{ {
if (!check_param_num (lst, 2, 2)) return_if_fail_param_num (args, 2, 2,
return server_error (NULL, MU_ERROR_IN_PARAMETERS, "usage: flag <docid>|<msgid> <flags>");
"usage: flag <docid>|<msgid> <flags>");
return move_or_flag (store, query, lst, FALSE, err); return move_or_flag (store, query, args, FALSE, err);
} }
static MuError static MuError
cmd_remove (MuStore *store, GSList *lst, GError **err) cmd_remove (MuStore *store, GSList *args, GError **err)
{ {
unsigned docid; unsigned docid;
const char *path; const char *path;
if (!check_param_num (lst, 1, 1)) return_if_fail_param_num (args, 1, 1, "usage: remove <docid>");
return server_error (NULL, MU_ERROR_IN_PARAMETERS,
"usage: remove <docid>");
docid = get_docid (NULL, (const char*)lst->data, err); docid = get_docid (NULL, (const char*)args->data, err);
if (docid == MU_STORE_INVALID_DOCID) if (docid == MU_STORE_INVALID_DOCID)
return server_error (err, MU_ERROR_IN_PARAMETERS, return server_error (err, MU_ERROR_IN_PARAMETERS,
"invalid docid"); "invalid docid");
@ -677,10 +668,8 @@ save_or_open (MuStore *store, GSList *args, gboolean is_save, GError **err)
static MuError static MuError
cmd_save (MuStore *store, GSList *args, GError **err) cmd_save (MuStore *store, GSList *args, GError **err)
{ {
if (!check_param_num (args, 3, 3)) return_if_fail_param_num (args, 3, 3,
return server_error "save <docid> <partindex> <targetpath>");
(NULL, MU_ERROR_IN_PARAMETERS,
"save <docid> <partindex> <targetpath>");
return save_or_open (store, args, TRUE, err); return save_or_open (store, args, TRUE, err);
} }
@ -689,10 +678,8 @@ cmd_save (MuStore *store, GSList *args, GError **err)
static MuError static MuError
cmd_open (MuStore *store, GSList *args, GError **err) cmd_open (MuStore *store, GSList *args, GError **err)
{ {
if (!check_param_num (args, 2, 2)) return_if_fail_param_num (args, 2, 2,
return server_error "open <docid> <partindex>");
(NULL, MU_ERROR_IN_PARAMETERS,
"open <docid> <partindex>");
return save_or_open (store, args, FALSE, err); return save_or_open (store, args, FALSE, err);
} }
@ -706,10 +693,8 @@ cmd_view (MuStore *store, GSList *args, GError **err)
unsigned docid; unsigned docid;
char *sexp; char *sexp;
return_if_fail_param_num (args, 1, 1,
if (!check_param_num (args, 1, 1)) "message <docid> <view|reply|forward>");
return server_error (NULL, MU_ERROR_IN_PARAMETERS,
"message <docid> <view|reply|forward>");
docid = get_docid (NULL, (const char*)args->data, err); docid = get_docid (NULL, (const char*)args->data, err);
if (docid == MU_STORE_INVALID_DOCID) if (docid == MU_STORE_INVALID_DOCID)
@ -741,9 +726,8 @@ cmd_compose (MuStore *store, GSList *args, GError **err)
char *sexp; char *sexp;
const char* ctype; const char* ctype;
if ((!check_param_num (args, 2, 2))) return_if_fail_param_num (args, 2, 2,
return server_error (NULL, MU_ERROR_IN_PARAMETERS, "compose <reply|forward|edit> <docid>");
"compose <reply|forward|edit> <docid>");
ctype = (const char*)args->data; ctype = (const char*)args->data;
if (strcmp (ctype, "reply") != 0 && strcmp(ctype, "forward") != 0 if (strcmp (ctype, "reply") != 0 && strcmp(ctype, "forward") != 0
@ -788,18 +772,17 @@ index_msg_cb (MuIndexStats *stats, void *user_data)
} }
static MuError static MuError
cmd_add (MuStore *store, GSList *lst, GError **err) cmd_add (MuStore *store, GSList *args, GError **err)
{ {
unsigned docid; unsigned docid;
const char *path, *maildir; const char *path, *maildir;
gchar *escpath; gchar *escpath;
if (!check_param_num (lst, 2, 2)) return_if_fail_param_num (args, 2, 2,
return server_error (NULL, MU_ERROR_IN_PARAMETERS, "usage: add <path> <maildir>");
"usage: add <path> <maildir>");
path = (const char*)lst->data; path = (const char*)args->data;
maildir = (const char*)g_slist_nth (lst, 1)->data; maildir = (const char*)g_slist_nth (args, 1)->data;
docid = mu_store_add_path (store, path, maildir, err); docid = mu_store_add_path (store, path, maildir, err);
if (docid == MU_STORE_INVALID_DOCID) if (docid == MU_STORE_INVALID_DOCID)
@ -817,16 +800,15 @@ cmd_add (MuStore *store, GSList *lst, GError **err)
static MuError static MuError
cmd_index (MuStore *store, GSList *lst, GError **err) cmd_index (MuStore *store, GSList *args, GError **err)
{ {
MuIndex *index; MuIndex *index;
const char *maildir; const char *maildir;
MuIndexStats stats, stats2; MuIndexStats stats, stats2;
MuError rv; MuError rv;
if (!check_param_num (lst, 1, 1)) return_if_fail_param_num (args, 1, 1,
return server_error (NULL, MU_ERROR_IN_PARAMETERS, "usage: index <maildir>");
"usage: index <maildir>");
index = mu_index_new (store, err); index = mu_index_new (store, err);
if (!index) if (!index)
@ -834,7 +816,7 @@ cmd_index (MuStore *store, GSList *lst, GError **err)
"failed to create index object"); "failed to create index object");
mu_index_stats_clear (&stats); mu_index_stats_clear (&stats);
maildir = (const char*)lst->data; maildir = (const char*)args->data;
rv = mu_index_run (index, maildir, FALSE, &stats, index_msg_cb, NULL, NULL); rv = mu_index_run (index, maildir, FALSE, &stats, index_msg_cb, NULL, NULL);
if (rv != MU_OK && rv != MU_STOP) { if (rv != MU_OK && rv != MU_STOP) {
@ -859,13 +841,9 @@ cmd_index (MuStore *store, GSList *lst, GError **err)
static MuError static MuError
cmd_quit (GSList *lst, GError **err) cmd_quit (GSList *args, GError **err)
{ {
if (lst) { return_if_fail_param_num (args, 0, 0, "usage: quit");
g_set_error (err, 0, MU_ERROR_IN_PARAMETERS,
"`quit' does not take any parameters");
return FALSE;
}
send_expr (";; quiting"); send_expr (";; quiting");
return MU_OK; return MU_OK;