}
}
-/** @brief Called when A namepart lookup has completed */
+/** @brief Called when a namepart lookup has completed */
static void namepart_completed(void *v, const char *error, const char *value) {
if(error) {
gtk_label_set_text(GTK_LABEL(report_label), error);
} else {
- cache_put(&cachetype_string, v, value);
+ const char *key = v;
+
+ cache_put(&cachetype_string, key, value);
++namepart_completions_deferred;
}
namepart_completed_or_failed();
}
/** @brief Called when a length lookup has completed */
-static void length_completed(void *v, long l) {
- struct callbackdata *cbd = v;
- long *value;
-
- D(("namepart_completed"));
- value = xmalloc(sizeof *value);
- *value = l;
- cache_put(&cachetype_integer, cbd->u.key, value);
- ++namepart_completions_deferred;
- namepart_completed_or_failed();
-}
-
-/** @brief Called when a length or namepart lookup has failed */
-static void namepart_protocol_error(
- struct callbackdata attribute((unused)) *cbd,
- int attribute((unused)) code,
- const char *msg) {
- D(("namepart_protocol_error"));
- gtk_label_set_text(GTK_LABEL(report_label), msg);
+static void length_completed(void *v, const char *error, long l) {
+ if(error)
+ gtk_label_set_text(GTK_LABEL(report_label), error);
+ else {
+ const char *key = v;
+ long *value;
+
+ D(("namepart_completed"));
+ value = xmalloc(sizeof *value);
+ *value = l;
+ cache_put(&cachetype_integer, key, value);
+ ++namepart_completions_deferred;
+ }
namepart_completed_or_failed();
}
static long getlength(const char *track) {
char *key;
const long *value;
- struct callbackdata *cbd;
static const long bogus = -1;
D(("getlength %s", track));
D(("deferring..."));;
cache_put(&cachetype_integer, key, value = &bogus);
++namepart_lookups_outstanding;
- cbd = xmalloc(sizeof *cbd);
- cbd->onerror = namepart_protocol_error;
- cbd->u.key = key;
- disorder_eclient_length(client, length_completed, track, cbd);
+ disorder_eclient_length(client, length_completed, track, key);
}
return *value;
}
/* for commands with a simple integer response */
static void integer_response_opcallback(disorder_eclient *c,
struct operation *op) {
+ disorder_eclient_integer_response *completed
+ = (disorder_eclient_integer_response *)op->completed;
+
D(("string_response_callback"));
if(c->rc / 100 == 2) {
- if(op->completed)
- ((disorder_eclient_integer_response *)op->completed)
- (op->v, strtol(c->line + 4, 0, 10));
+ long n;
+ int e;
+
+ e = xstrtol(&n, c->line + 4, 0, 10);
+ if(e)
+ completed(op->v, strerror(e), 0);
+ else
+ completed(op->v, 0, n);
} else
- /* TODO don't use protocol_error here */
- protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line);
+ completed(op->v, errorstring(c), 0);
}
/* for commands with no response */
/** @brief String result completion callback
* @param v User data
* @param error Error string or NULL on succes
- * @param value or NULL if not found
+ * @param value Result or NULL
*
* @p error will be NULL on success. In this case @p value will be the result
* (which might be NULL for disorder_eclient_get(),
const char *error,
const char *value);
-typedef void disorder_eclient_integer_response(void *v, long value);
+/** @brief String result completion callback
+ * @param v User data
+ * @param error Error string or NULL on succes
+ * @param value Result or 0
+ *
+ * @p error will be NULL on success. In this case @p value will be the result.
+ *
+ * @p error will be non-NULL on failure. In this case @p value is always 0.
+ */
+typedef void disorder_eclient_integer_response(void *v,
+ const char *error,
+ long value);
/* completion callback with a integer result */
typedef void disorder_eclient_volume_response(void *v, int l, int r);