]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mood.c
Implement afs events.
[paraslash.git] / mood.c
diff --git a/mood.c b/mood.c
index 64cfe835ece10c98210613f57a1178fceaaee121..a8d87cde122c9bc03d6cab301695fe97bf2896e8 100644 (file)
--- a/mood.c
+++ b/mood.c
@@ -852,13 +852,13 @@ static int delete_from_statistics_and_score_table(const struct osl_row *aft_row)
  *
  * \return Positive on success, negative on errors.
  *
- * \sa score_delete(), mood_update_audio_file().
+ * \sa score_delete().
  */
-int mood_delete_audio_file(const struct osl_row *aft_row)
+static int mood_delete_audio_file(const struct osl_row *aft_row)
 {
        int ret;
 
-       ret = row_belongs_to_score_table(aft_row);
+       ret = row_belongs_to_score_table(aft_row, NULL);
        if (ret < 0)
                return ret;
        if (!ret) /* not admissible, nothing to do */
@@ -877,15 +877,17 @@ int mood_delete_audio_file(const struct osl_row *aft_row)
  *
  * \return Positive on success, negative on errors.
  */
-int mood_update_audio_file(const struct osl_row *aft_row, struct afs_info *old_afsi)
+static int mood_update_audio_file(const struct osl_row *aft_row,
+               struct afs_info *old_afsi)
 {
        long score, percent;
        int ret, is_admissible, was_admissible = 0;
        struct afs_info afsi;
+       unsigned rank;
 
        if (!current_mood)
                return 1; /* nothing to do */
-       ret = row_belongs_to_score_table(aft_row);
+       ret = row_belongs_to_score_table(aft_row, &rank);
        if (ret < 0)
                return ret;
        was_admissible = ret;
@@ -919,7 +921,7 @@ int mood_update_audio_file(const struct osl_row *aft_row, struct afs_info *old_a
                percent = 100;
        else if (percent < 0)
                percent = 0;
-       PARA_DEBUG_LOG("re-inserting at %lu%%\n", percent);
+       PARA_DEBUG_LOG("moving from rank %u to %lu%%\n", rank, percent);
        return score_update(aft_row, percent);
 }
 
@@ -1047,10 +1049,34 @@ int reload_current_mood(void)
 
        if (!current_mood)
                return 1;
-//     score_close(0);
        mood_name = para_strdup(current_mood->name);
        close_current_mood();
        ret = change_current_mood(mood_name);
        free(mood_name);
        return ret;
 }
+
+int moods_event_handler(enum afs_events event, struct para_buffer *pb,
+               void *data)
+{
+       switch(event) {
+       case ATTRIBUTE_ADD:
+       case ATTRIBUTE_REMOVE:
+       case ATTRIBUTE_RENAME:
+               return reload_current_mood();
+       case AFSI_CHANGE: {
+               struct afsi_change_event_data *aced = data;
+               return mood_update_audio_file(aced->aft_row, aced->old_afsi);
+               }
+       case AFHI_CHANGE:
+       case AUDIO_FILE_RENAME:
+       case AUDIO_FILE_ADD:
+               return mood_update_audio_file(data, NULL);
+       case AUDIO_FILE_REMOVE:
+               return mood_delete_audio_file(data);
+       default:
+               return 1;
+       }
+       return 1;
+}
+