state_file: don't rewind the stream while reading the state file

Parse the state file line by line, let each subsystem probe a line.
Only the playlist_state code gets the FILE pointer to read the
following lines.
This commit is contained in:
Max Kellermann
2009-07-15 16:57:37 +02:00
parent df7d7732c6
commit f7cc5b2efd
7 changed files with 68 additions and 61 deletions

View File

@@ -49,35 +49,34 @@ saveAudioDevicesState(FILE *fp)
}
}
void
readAudioDevicesState(FILE *fp)
bool
readAudioDevicesState(const char *line)
{
char buffer[1024];
long value;
char *endptr;
const char *name;
struct audio_output *ao;
while (fgets(buffer, sizeof(buffer), fp)) {
char *c, *name;
struct audio_output *ao;
if (!g_str_has_prefix(line, AUDIO_DEVICE_STATE))
return false;
g_strchomp(buffer);
line += sizeof(AUDIO_DEVICE_STATE) - 1;
if (!g_str_has_prefix(buffer, AUDIO_DEVICE_STATE))
continue;
value = strtol(line, &endptr, 10);
if (*endptr != ':' || (value != 0 && value != 1))
return false;
c = strchr(buffer, ':');
if (!c || !(++c))
goto errline;
if (value != 0)
/* state is "enabled": no-op */
return true;
name = strchr(c, ':');
if (!name || !(++name))
goto errline;
ao = audio_output_find(name);
if (ao != NULL && atoi(c) == 0)
ao->enabled = false;
continue;
errline:
/* nonfatal */
g_warning("invalid line in state_file: %s\n", buffer);
name = endptr + 1;
ao = audio_output_find(name);
if (ao == NULL) {
g_debug("Ignoring device state for '%s'", name);
return true;
}
ao->enabled = false;
return true;
}