]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - aft.c
afs: Move some ls-related stuff from afs.h to aft.c.
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index 0013b2a2f52ce434a6826bd5a352a996ae28b875..e643e01a18b1121703ddac0445421cc6f910195b 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -1,3 +1,11 @@
+/*
+ * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
+/** \file aft.c Audio file table functions. */
+
 #include "para.h"
 #include "error.h"
 #include <sys/mman.h>
 
 static struct osl_table *audio_file_table;
 
+enum ls_listing_mode {
+       LS_MODE_SHORT,
+       LS_MODE_LONG,
+       LS_MODE_VERBOSE,
+       LS_MODE_MBOX
+};
+
+enum ls_flags {
+       LS_FLAG_FULL_PATH = 1,
+       LS_FLAG_ADMISSIBLE_ONLY = 2,
+       LS_FLAG_REVERSE = 4,
+};
+
+struct ls_widths {
+       unsigned short score_width;
+       unsigned short image_id_width;
+       unsigned short lyrics_id_width;
+       unsigned short bitrate_width;
+       unsigned short frequency_width;
+       unsigned short duration_width;
+       unsigned short num_played_width;
+};
+
+struct ls_data {
+       struct audio_format_info afhi;
+       struct afs_info afsi;
+       char *path;
+       long score;
+       HASH_TYPE *hash;
+};
+
+struct ls_options {
+       unsigned flags;
+       enum ls_sorting_method sorting;
+       enum ls_listing_mode mode;
+       char **patterns;
+       int num_patterns;
+       struct ls_widths widths;
+       uint32_t array_size;
+       uint32_t num_matching_paths;
+       struct ls_data *data;
+       struct ls_data **data_ptr;
+};
+
 /**
  * Describes the layout of the mmapped-afs info struct.
  *
@@ -827,7 +879,7 @@ static int ls_path_compare(const void *a, const void *b)
 static int sort_matching_paths(struct ls_options *options)
 {
        size_t nmemb = options->num_matching_paths;
-       size_t size = sizeof(uint32_t);
+       size_t size = sizeof(*options->data_ptr);
        int (*compar)(const void *, const void *);
        int i;
 
@@ -1695,6 +1747,54 @@ err:
        return ret;
 }
 
+/* TODO: optionally fix problems by removing offending rows */
+static int check_audio_file(struct osl_row *row, void *data)
+{
+       char *path;
+       struct para_buffer *pb = data;
+       struct stat statbuf;
+       int ret = get_audio_file_path_of_row(row, &path);
+       struct afs_info afsi;
+       char *blob_name;
+
+       if (ret < 0) {
+               para_printf(pb, "%s\n", PARA_STRERROR(-ret));
+               return 1;
+       }
+       if (stat(path, &statbuf) < 0)
+               para_printf(pb, "%s: stat error (%s)\n", path, strerror(errno));
+       else {
+               if (!S_ISREG(statbuf.st_mode))
+                       para_printf(pb, "%s: not a regular file\n", path);
+       }
+       ret = get_afsi_of_row(row, &afsi);
+       if (ret < 0) {
+               para_printf(pb, "%s: %s\n", path, PARA_STRERROR(-ret));
+               return 1;
+       }
+       ret = lyr_get_name_by_id(afsi.lyrics_id, &blob_name);
+       if (ret < 0)
+               para_printf(pb, "%s lyrics id %u: %s\n", path, afsi.lyrics_id,
+                       PARA_STRERROR(-ret));
+       ret = img_get_name_by_id(afsi.image_id, &blob_name);
+       if (ret < 0)
+               para_printf(pb, "%s image id %u: %s\n", path, afsi.image_id,
+                       PARA_STRERROR(-ret));
+       return 1;
+}
+
+int aft_check_callback(__a_unused const struct osl_object *query, struct osl_object *result)
+{
+       struct para_buffer pb = {.buf = NULL};
+
+       para_printf(&pb, "checking audio file table...\n");
+       audio_file_loop(&pb, check_audio_file);
+       result->data = pb.buf;
+       result->size = pb.size;
+       return 1;
+
+}
+
 /**
  * Close the audio file table.
  *