X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=761a637cfe00caf14bc1850219cf139282bfc3bc;hp=21035cda93710b3167d7374fd8e2e7f20ecbe41d;hb=02623a7cbff382cb7e9659176c042e7d2761be2e;hpb=db8b6df30d17d9f93c60758e156699067121cbb5 diff --git a/afs.c b/afs.c index 21035cda..761a637c 100644 --- a/afs.c +++ b/afs.c @@ -18,6 +18,7 @@ #include #include +#include "server_cmd.lsg.h" #include "server.cmdline.h" #include "para.h" #include "error.h" @@ -401,7 +402,7 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) } } p = pattern_txt; - i = 0; + i = pmd->input_skip; for (;;) { if (pmd->lpr) { if (i >= lls_num_inputs(pmd->lpr)) @@ -637,14 +638,17 @@ static void flush_and_free_pb(struct para_buffer *pb) static int com_select_callback(struct afs_callback_arg *aca) { - const char *arg = aca->query.data; + const struct lls_command *cmd = SERVER_CMD_CMD_PTR(SELECT); + const char *arg; int num_admissible, ret; + ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr); + assert(ret >= 0); + arg = lls_input(0, aca->lpr); ret = clear_score_table(); if (ret < 0) { - para_printf(&aca->pbout, "could not clear score table: %s\n", - para_strerror(-ret)); - return ret; + para_printf(&aca->pbout, "could not clear score table\n"); + goto free_lpr; } if (current_play_mode == PLAY_MODE_MOOD) close_current_mood(); @@ -669,20 +673,24 @@ static int com_select_callback(struct afs_callback_arg *aca) out: para_printf(&aca->pbout, "activated %s (%d admissible files)\n", current_mop? current_mop : "dummy mood", num_admissible); +free_lpr: + lls_free_parse_result(aca->lpr, cmd); return ret; } -int com_select(struct command_context *cc) +static int com_select(struct command_context *cc, struct lls_parse_result *lpr) { - struct osl_object query; + const struct lls_command *cmd = SERVER_CMD_CMD_PTR(SELECT); + char *errctx; + int ret = lls(lls_check_arg_count(lpr, 1, 1, &errctx)); - if (cc->argc != 2) - return -E_AFS_SYNTAX; - query.data = cc->argv[1]; - query.size = strlen(cc->argv[1]) + 1; - return send_callback_request(com_select_callback, &query, - &afs_cb_result_handler, cc); + if (ret < 0) { + send_errctx(cc, errctx); + return ret; + } + return send_lls_callback_request(com_select_callback, cmd, lpr, cc); } +EXPORT_SERVER_CMD_HANDLER(select); static void init_admissible_files(char *arg) { @@ -1148,76 +1156,35 @@ static int com_init(struct command_context *cc, struct lls_parse_result *lpr) } EXPORT_SERVER_CMD_HANDLER(init); -/** - * Flags for the check command. - * - * \sa com_check(). - */ -enum com_check_flags { - /** Check the audio file table. */ - CHECK_AFT = 1, - /** Check the mood table. */ - CHECK_MOODS = 2, - /** Check the playlist table. */ - CHECK_PLAYLISTS = 4, - /** Check the attribute table against the audio file table. */ - CHECK_ATTS = 8 -}; - -int com_check(struct command_context *cc) +static int com_check(struct command_context *cc, struct lls_parse_result *lpr) { - unsigned flags = 0; - int i, ret; + const struct lls_opt_result *r_a = SERVER_CMD_OPT_RESULT(CHECK, AFT, lpr); + const struct lls_opt_result *r_A = SERVER_CMD_OPT_RESULT(CHECK, ATTRIBUTE, lpr); + const struct lls_opt_result *r_m = SERVER_CMD_OPT_RESULT(CHECK, MOOD, lpr); + const struct lls_opt_result *r_p = SERVER_CMD_OPT_RESULT(CHECK, PLAYLIST, lpr); + bool noopt = !lls_opt_given(r_a) && !lls_opt_given(r_A) + && !lls_opt_given(r_m) && !lls_opt_given(r_p); + int ret; - for (i = 1; i < cc->argc; i++) { - const char *arg = cc->argv[i]; - if (arg[0] != '-') - break; - if (!strcmp(arg, "--")) { - i++; - break; - } - if (!strcmp(arg, "-a")) { - flags |= CHECK_AFT; - continue; - } - if (!strcmp(arg, "-A")) { - flags |= CHECK_ATTS; - continue; - } - if (!strcmp(arg, "-p")) { - flags |= CHECK_PLAYLISTS; - continue; - } - if (!strcmp(arg, "-m")) { - flags |= CHECK_MOODS; - continue; - } - return -E_AFS_SYNTAX; - } - if (i < cc->argc) - return -E_AFS_SYNTAX; - if (!flags) - flags = ~0U; - if (flags & CHECK_AFT) { + if (noopt || lls_opt_given(r_a)) { ret = send_callback_request(aft_check_callback, NULL, afs_cb_result_handler, cc); if (ret < 0) return ret; } - if (flags & CHECK_ATTS) { + if (noopt || lls_opt_given(r_A)) { ret = send_callback_request(attribute_check_callback, NULL, afs_cb_result_handler, cc); if (ret < 0) return ret; } - if (flags & CHECK_PLAYLISTS) { + if (noopt || lls_opt_given(r_p)) { ret = send_callback_request(playlist_check_callback, NULL, afs_cb_result_handler, cc); if (ret < 0) return ret; } - if (flags & CHECK_MOODS) { + if (noopt || lls_opt_given(r_m)) { ret = send_callback_request(mood_check_callback, NULL, afs_cb_result_handler, cc); if (ret < 0) @@ -1225,6 +1192,7 @@ int com_check(struct command_context *cc) } return 1; } +EXPORT_SERVER_CMD_HANDLER(check); /** * The afs event dispatcher.