Simplify mpd_process_info()
At a cost but still a win as I see it.
This commit is contained in:
parent
fd1d918832
commit
5bf0410587
62
nncmpp.c
62
nncmpp.c
|
@ -2731,57 +2731,49 @@ mpd_update_playback_state (void)
|
|||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
static void
|
||||
mpd_init_response_map (struct str_map *map)
|
||||
{
|
||||
str_map_init (map);
|
||||
map->key_xfrm = tolower_ascii_strxfrm;
|
||||
map->free = free;
|
||||
}
|
||||
|
||||
static void
|
||||
mpd_process_info_chunk (struct str_map *map, char *file)
|
||||
{
|
||||
unsigned long n;
|
||||
if (!file)
|
||||
{
|
||||
if (xstrtoul_map (map, "playlistlength", &n))
|
||||
item_list_resize (&g_ctx.playlist, n);
|
||||
g_ctx.playback_info = *map;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (xstrtoul_map (map, "pos", &n))
|
||||
item_list_set (&g_ctx.playlist, n, map);
|
||||
str_map_free (map);
|
||||
}
|
||||
mpd_init_response_map (map);
|
||||
}
|
||||
|
||||
static void
|
||||
mpd_process_info (const struct str_vector *data)
|
||||
{
|
||||
struct str_map map;
|
||||
mpd_init_response_map (&map);
|
||||
str_map_init (&map);
|
||||
map.key_xfrm = tolower_ascii_strxfrm;
|
||||
map.free = free;
|
||||
|
||||
// First there's the status, followed by playlist items chunked by "file"
|
||||
char *key, *value, *file = NULL;
|
||||
// First there's the status, followed by playlist items chunked by "file".
|
||||
// Unfortunately we need a field from the front before we process the rest
|
||||
// but otherwise it's much better to process the list from the back.
|
||||
//
|
||||
// TODO: one thing that could help is command_list_ok_begin,
|
||||
// which can add NULL strings to the vector in place of list_OK
|
||||
unsigned long n;
|
||||
for (size_t i = 0; i < data->len; i++)
|
||||
{
|
||||
static const char needle[] = "playlistlength: ";
|
||||
if (!strncasecmp_ascii (data->vector[i], needle, sizeof needle - 1)
|
||||
&& xstrtoul (&n, data->vector[i] + sizeof needle - 1, 10))
|
||||
{
|
||||
item_list_resize (&g_ctx.playlist, n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char *key, *value;
|
||||
for (size_t i = data->len; i--; )
|
||||
{
|
||||
if (!(key = mpd_client_parse_kv (data->vector[i], &value)))
|
||||
{
|
||||
print_debug ("%s: %s", "erroneous MPD output", data->vector[i]);
|
||||
continue;
|
||||
}
|
||||
str_map_set (&map, key, xstrdup (value));
|
||||
if (!strcasecmp_ascii (key, "file"))
|
||||
{
|
||||
mpd_process_info_chunk (&map, file);
|
||||
file = value;
|
||||
if (xstrtoul_map (&map, "pos", &n))
|
||||
item_list_set (&g_ctx.playlist, n, &map);
|
||||
str_map_clear (&map);
|
||||
}
|
||||
str_map_set (&map, key, xstrdup (value));
|
||||
}
|
||||
mpd_process_info_chunk (&map, file);
|
||||
str_map_free (&map);
|
||||
g_ctx.playback_info = map;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in New Issue