X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/ec9c046264b6c4ee76e2d08cf46ee928b026fe74..c12575c6cea802f894df6ca8b04c1b3656496592:/lib/client.c diff --git a/lib/client.c b/lib/client.c index c907e7c..521a4c7 100644 --- a/lib/client.c +++ b/lib/client.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004-2009 Richard Kettlewell + * Copyright (C) 2004-2010 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -184,7 +184,6 @@ static const char disorder_list[1]; * * Usually you would call this via one of the following interfaces: * - disorder_simple() - * - disorder_simple_list() */ static int disorder_simple_v(disorder_client *c, char **rp, @@ -557,14 +556,11 @@ static int onequeue(disorder_client *c, const char *cmd, } /** @brief Fetch the queue, recent list, etc */ -static int somequeue(disorder_client *c, - const char *cmd, struct queue_entry **qp) { +static int readqueue(disorder_client *c, + struct queue_entry **qp) { struct queue_entry *qh, **qt = &qh, *q; char *l; - int rc; - if((rc = disorder_simple(c, 0, cmd, (char *)0))) - return rc; while(inputline(c->ident, c->fpin, &l, '\n') >= 0) { if(!strcmp(l, ".")) { *qt = 0; @@ -583,7 +579,7 @@ static int somequeue(disorder_client *c, byte_xasprintf((char **)&c->last, "input error: %s", strerror(errno)); disorder_error(errno, "error reading %s", c->ident); } else { - c->last = "input error: unexpxected EOF"; + c->last = "input error: unexpected EOF"; disorder_error(0, "error reading %s: unexpected EOF", c->ident); } return -1; @@ -624,33 +620,6 @@ static int readlist(disorder_client *c, char ***vecp, int *nvecp) { return -1; } -/** @brief Issue a comamnd and get a list response - * @param c Client - * @param vecp Where to store list (UTF-8) - * @param nvecp Where to store number of items, or NULL - * @param cmd Command - * @return 0 on success, non-0 on error - * - * The remaining arguments are command arguments, terminated by (char - * *)0. They should be in UTF-8. - * - * 5xx responses count as errors. - * - * See disorder_simple(). - */ -static int disorder_simple_list(disorder_client *c, - char ***vecp, int *nvecp, - const char *cmd, ...) { - va_list ap; - int ret; - - va_start(ap, cmd); - ret = disorder_simple_v(c, 0, cmd, ap); - va_end(ap); - if(ret) return ret; - return readlist(c, vecp, nvecp); -} - /** @brief Return the user we logged in with * @param c Client * @return User name (owned by @p c, don't modify) @@ -659,29 +628,36 @@ char *disorder_user(disorder_client *c) { return c->user; } -static void pref_error_handler(const char *msg, +static void pairlist_error_handler(const char *msg, void attribute((unused)) *u) { - disorder_error(0, "error handling 'prefs' reply: %s", msg); + disorder_error(0, "error handling key-value pair reply: %s", msg); } -/** @brief Get all preferences for a trcak +/** @brief Get a list of key-value pairs * @param c Client - * @param track Track name * @param kp Where to store linked list of preferences + * @param cmd Command + * @param ... Arguments * @return 0 on success, non-0 on error */ -int disorder_prefs(disorder_client *c, const char *track, struct kvp **kp) { +static int pairlist(disorder_client *c, struct kvp **kp, const char *cmd, ...) { char **vec, **pvec; int nvec, npvec, n, rc; struct kvp *k; + va_list ap; - if((rc = disorder_simple_list(c, &vec, &nvec, "prefs", track, (char *)0))) + va_start(ap, cmd); + rc = disorder_simple_v(c, 0, cmd, ap); + va_end(ap); + if(rc) return rc; + if((rc = readlist(c, &vec, &nvec))) + return rc; for(n = 0; n < nvec; ++n) { - if(!(pvec = split(vec[n], &npvec, SPLIT_QUOTES, pref_error_handler, 0))) + if(!(pvec = split(vec[n], &npvec, SPLIT_QUOTES, pairlist_error_handler, 0))) return -1; if(npvec != 2) { - pref_error_handler("malformed response", 0); + pairlist_error_handler("malformed response", 0); return -1; } *kp = k = xmalloc(sizeof *k); @@ -712,41 +688,6 @@ static int boolean(const char *cmd, const char *value, return 0; } -/** @brief Set volume - * @param c Client - * @param left New left channel value - * @param right New right channel value - * @return 0 on success, non-0 on error - */ -int disorder_set_volume(disorder_client *c, int left, int right) { - char *ls, *rs; - - if(byte_asprintf(&ls, "%d", left) < 0 - || byte_asprintf(&rs, "%d", right) < 0) - return -1; - return disorder_simple(c, 0, "volume", ls, rs, (char *)0); -} - -/** @brief Get volume - * @param c Client - * @param left Where to store left channel value - * @param right Where to store right channel value - * @return 0 on success, non-0 on error - */ -int disorder_get_volume(disorder_client *c, int *left, int *right) { - char *r; - int rc; - - if((rc = disorder_simple(c, &r, "volume", (char *)0))) - return rc; - if(sscanf(r, "%d %d", left, right) != 2) { - c->last = "malformed volume response"; - disorder_error(0, "error parsing response to 'volume': '%s'", r); - return -1; - } - return 0; -} - /** @brief Log to a sink * @param c Client * @param s Sink to write log lines to @@ -768,75 +709,6 @@ int disorder_log(disorder_client *c, struct sink *s) { return 0; } -/** @brief Get recently added tracks - * @param c Client - * @param vecp Where to store pointer to list (UTF-8) - * @param nvecp Where to store count - * @param max Maximum tracks to fetch, or 0 for all available - * @return 0 on success, non-0 on error - */ -int disorder_new_tracks(disorder_client *c, - char ***vecp, int *nvecp, - int max) { - char limit[32]; - - sprintf(limit, "%d", max); - return disorder_simple_list(c, vecp, nvecp, "new", limit, (char *)0); -} - -/** @brief Get server's RTP address information - * @param c Client - * @param addressp Where to store address (UTF-8) - * @param portp Where to store port (UTF-8) - * @return 0 on success, non-0 on error - */ -int disorder_rtp_address(disorder_client *c, char **addressp, char **portp) { - char *r; - int rc, n; - char **vec; - - if((rc = disorder_simple(c, &r, "rtp-address", (char *)0))) - return rc; - vec = split(r, &n, SPLIT_QUOTES, 0, 0); - if(n != 2) { - c->last = "malformed RTP address"; - disorder_error(0, "malformed rtp-address reply"); - return -1; - } - *addressp = vec[0]; - *portp = vec[1]; - return 0; -} - -/** @brief Get details of a scheduled event - * @param c Client - * @param id Event ID - * @param actiondatap Where to put details - * @return 0 on success, non-0 on error - */ -int disorder_schedule_get(disorder_client *c, const char *id, - struct kvp **actiondatap) { - char **lines, **bits; - int rc, nbits; - - *actiondatap = 0; - if((rc = disorder_simple_list(c, &lines, NULL, - "schedule-get", id, (char *)0))) - return rc; - while(*lines) { - if(!(bits = split(*lines++, &nbits, SPLIT_QUOTES, 0, 0))) { - disorder_error(0, "invalid schedule-get reply: cannot split line"); - return -1; - } - if(nbits != 2) { - disorder_error(0, "invalid schedule-get reply: wrong number of fields"); - return -1; - } - kvp_set(actiondatap, bits[0], bits[1]); - } - return 0; -} - /** @brief Add a scheduled event * @param c Client * @param when When to trigger the event