+/*
+ * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
#include "para.h"
#include "error.h"
+#include "string.h"
#include "afh.h"
#include "afs.h"
-#include "string.h"
/** \file playlist.c Functions for loading and saving playlists. */
}
ret = score_add(aft_row, -playlist->length);
if (ret < 0) {
- PARA_ERROR_LOG("failed to add %s: %d\n", path, ret);
+ PARA_ERROR_LOG("failed to add %s: %s\n", path, PARA_STRERROR(-ret));
return ret;
}
playlist->length++;
PARA_NOTICE_LOG("failed to load playlist %s\n", name);
return ret;
}
- return load_playlist(row, ¤t_playlist);
+ ret = load_playlist(row, ¤t_playlist);
+ return (ret == -E_PLAYLIST_LOADED)? 1 : ret;
+}
+
+static int search_path(char *path, void *data)
+{
+ if (strcmp(path, data))
+ return 1;
+ return -E_PATH_FOUND;
+}
+
+static int handle_audio_file_event(enum afs_events event, void *data)
+{
+ int ret, was_admissible = 0, is_admissible;
+ struct osl_object playlist_def;
+ char *new_path;
+ const struct osl_row *row = data;
+
+ if (!current_playlist.name)
+ return 1;
+ if (event == AUDIO_FILE_RENAME) {
+ ret = row_belongs_to_score_table(row, NULL);
+ if (ret < 0)
+ return ret;
+ was_admissible = ret;
+ }
+ ret = get_audio_file_path_of_row(row, &new_path);
+ if (ret < 0)
+ return ret;
+ ret = pl_get_def_by_name(current_playlist.name, &playlist_def);
+ if (ret < 0)
+ return ret;
+ ret = for_each_line_ro(playlist_def.data, playlist_def.size,
+ search_path, new_path);
+ osl_close_disk_object(&playlist_def);
+ is_admissible = (ret < 0);
+ if (was_admissible && is_admissible)
+ return 1;
+ if (!was_admissible && !is_admissible)
+ return 1;
+ if (was_admissible && !is_admissible) {
+ current_playlist.length--;
+ return score_delete(row);
+ }
+ /* !was_admissible && is_admissible */
+ current_playlist.length++;
+ return score_add(row, 0); /* play it immediately */
+}
+
+int playlists_event_handler(enum afs_events event, struct para_buffer *pb,
+ void *data)
+{
+ int ret;
+
+ switch(event) {
+ case AUDIO_FILE_RENAME:
+ case AUDIO_FILE_ADD:
+ return handle_audio_file_event(event, data);
+ case AUDIO_FILE_REMOVE:
+ ret = row_belongs_to_score_table(data, NULL);
+ if (ret < 0)
+ return ret;
+ if (!ret)
+ return 1;
+ current_playlist.length--;
+ return score_delete(data);
+ default:
+ return 1;
+ }
}