* mu-cmd-server.c: some refactoring. pass make line33 again.
This commit is contained in:
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user