MPD client: abort pending tasks

This commit is contained in:
Přemysl Eric Janouch 2017-06-04 00:49:56 +02:00
parent 7f7606008d
commit ec128558a4
Signed by: p
GPG Key ID: B715679E3A361BE6

View File

@ -1356,7 +1356,7 @@ struct mpd_response
char *message_text; ///< Error message char *message_text; ///< Error message
}; };
/// Task completion callback /// Task completion callback; on connection abortion most fields are 0
typedef void (*mpd_client_task_cb) (const struct mpd_response *response, typedef void (*mpd_client_task_cb) (const struct mpd_response *response,
const struct strv *data, void *user_data); const struct strv *data, void *user_data);
@ -1449,10 +1449,31 @@ mpd_client_free (struct mpd_client *self)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static void
mpd_client_dispatch (struct mpd_client *self, struct mpd_response *response)
{
struct mpd_client_task *task;
if (!(task = self->tasks))
return;
if (task->callback)
task->callback (response, &self->data, task->user_data);
strv_reset (&self->data);
LIST_UNLINK_WITH_TAIL (self->tasks, self->tasks_tail, task);
free (task);
}
/// Reinitialize the interface so that you can reconnect anew /// Reinitialize the interface so that you can reconnect anew
static void static void
mpd_client_reset (struct mpd_client *self) mpd_client_reset (struct mpd_client *self)
{ {
// Get rid of all pending tasks to release resources etc.
strv_reset (&self->data);
struct mpd_response aborted = { .message_text = "Disconnected" };
while (self->tasks)
mpd_client_dispatch (self, &aborted);
if (self->state == MPD_CONNECTING) if (self->state == MPD_CONNECTING)
mpd_client_destroy_connector (self); mpd_client_destroy_connector (self);
@ -1468,17 +1489,11 @@ mpd_client_reset (struct mpd_client *self)
str_reset (&self->read_buffer); str_reset (&self->read_buffer);
str_reset (&self->write_buffer); str_reset (&self->write_buffer);
strv_reset (&self->data);
self->got_hello = false; self->got_hello = false;
self->idling = false; self->idling = false;
self->idling_subsystems = 0; self->idling_subsystems = 0;
self->in_list = false; self->in_list = false;
LIST_FOR_EACH (struct mpd_client_task, iter, self->tasks)
free (iter);
self->tasks = self->tasks_tail = NULL;
self->state = MPD_DISCONNECTED; self->state = MPD_DISCONNECTED;
} }
@ -1529,21 +1544,6 @@ mpd_client_parse_response (const char *p, struct mpd_response *response)
return true; return true;
} }
static void
mpd_client_dispatch (struct mpd_client *self, struct mpd_response *response)
{
struct mpd_client_task *task;
if (!(task = self->tasks))
return;
if (task->callback)
task->callback (response, &self->data, task->user_data);
strv_reset (&self->data);
LIST_UNLINK_WITH_TAIL (self->tasks, self->tasks_tail, task);
free (task);
}
static bool static bool
mpd_client_parse_hello (struct mpd_client *self, const char *line) mpd_client_parse_hello (struct mpd_client *self, const char *line)
{ {