]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - playlist.c
Implement afs events.
[paraslash.git] / playlist.c
index 429ad2b53a116ffc1da2d4710b51e6db39161324..56e19fed307459fb7fd487bfa82c02db7c7b2f8b 100644 (file)
@@ -1,8 +1,8 @@
 #include "para.h"
 #include "error.h"
 #include "para.h"
 #include "error.h"
+#include "string.h"
 #include "afh.h"
 #include "afs.h"
 #include "afh.h"
 #include "afs.h"
-#include "string.h"
 
 /** \file playlist.c Functions for loading and saving playlists. */
 
 
 /** \file playlist.c Functions for loading and saving playlists. */
 
@@ -40,25 +40,13 @@ static int add_playlist_entry(char *path, void *data)
        }
        ret = score_add(aft_row, -playlist->length);
        if (ret < 0) {
        }
        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++;
        return 1;
 }
 
                return ret;
        }
        playlist->length++;
        return 1;
 }
 
-static int get_playlist_data(struct osl_row *row, char **playlist_name,
-               struct osl_object *playlist_def)
-{
-       struct osl_object obj;
-       int ret = osl_get_object(playlists_table, row, BLOBCOL_NAME, &obj);
-       if (ret < 0)
-               return ret;
-       *playlist_name = obj.data;
-       return osl_open_disk_object(playlists_table, row, BLOBCOL_DEF,
-               playlist_def);
-}
-
 /* returns -E_PLAYLIST_LOADED on _success_ to terminate the loop */
 static int load_playlist(struct osl_row *row, void *data)
 {
 /* returns -E_PLAYLIST_LOADED on _success_ to terminate the loop */
 static int load_playlist(struct osl_row *row, void *data)
 {
@@ -67,7 +55,7 @@ static int load_playlist(struct osl_row *row, void *data)
        char *playlist_name;
        int ret;
 
        char *playlist_name;
        int ret;
 
-       ret = get_playlist_data(row, &playlist_name, &playlist_def);
+       ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def);
        if (ret < 0)
                goto err;
        playlist->length = 0;
        if (ret < 0)
                goto err;
        playlist->length = 0;
@@ -118,7 +106,7 @@ static int check_playlist(struct osl_row *row, void *data)
        struct para_buffer *pb = data;
        struct osl_object playlist_def;
        char *playlist_name;
        struct para_buffer *pb = data;
        struct osl_object playlist_def;
        char *playlist_name;
-       int ret = get_playlist_data(row, &playlist_name, &playlist_def);
+       int ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def);
 
        if (ret < 0) {
                para_printf(pb, "failed to get playlist data: %s\n",
 
        if (ret < 0) {
                para_printf(pb, "failed to get playlist data: %s\n",
@@ -134,6 +122,14 @@ static int check_playlist(struct osl_row *row, void *data)
        return 1;
 }
 
        return 1;
 }
 
+/**
+ * Check the playlist table for inconsistencies.
+ *
+ * \param query Unused.
+ * \param result Contains messages about inconsistencies.
+ *
+ * \return The return value of the underlying call to osl_rbtree_loop().
+ */
 int playlist_check_callback(__a_unused const struct osl_object *query,
                struct osl_object *result)
 {
 int playlist_check_callback(__a_unused const struct osl_object *query,
                struct osl_object *result)
 {
@@ -185,5 +181,73 @@ int playlist_open(char *name)
                PARA_NOTICE_LOG("failed to load playlist %s\n", name);
                return ret;
        }
                PARA_NOTICE_LOG("failed to load playlist %s\n", name);
                return ret;
        }
-       return load_playlist(row, &current_playlist);
+       ret = load_playlist(row, &current_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;
+       }
 }
 }