X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=0f15cd28e96cf726275508faa63b07d4a75e190b;hp=0b07fa17145bcabfb48a0dc2ac3d277b62ece897;hb=2d8f0c21ac8735fc06d1aa88e7873614392e3042;hpb=c91ff5bca6a9161354e9baf85423d1498c832696 diff --git a/aft.c b/aft.c index 0b07fa17..0f15cd28 100644 --- a/aft.c +++ b/aft.c @@ -376,7 +376,7 @@ int aft_get_row_of_hash(HASH_TYPE *hash, struct osl_row **row) * * \return The return value of the underlying call to osl_get_object(). */ -int get_afsi_object_of_row(const void *row, struct osl_object *obj) +int get_afsi_object_of_row(const struct osl_row *row, struct osl_object *obj) { return osl_get_object(audio_file_table, row, AFTCOL_AFSI, obj); } @@ -445,7 +445,7 @@ int get_audio_file_path_of_row(const struct osl_row *row, char **path) * * \sa get_hash_of_row(). */ -int get_hash_object_of_aft_row(const void *row, struct osl_object *obj) +static int get_hash_object_of_aft_row(const struct osl_row *row, struct osl_object *obj) { return osl_get_object(audio_file_table, row, AFTCOL_HASH, obj); } @@ -461,7 +461,7 @@ int get_hash_object_of_aft_row(const void *row, struct osl_object *obj) * \return The return value of the underlying call to * get_hash_object_of_aft_row(). */ -static int get_hash_of_row(const void *row, HASH_TYPE **hash) +static int get_hash_of_row(const struct osl_row *row, HASH_TYPE **hash) { struct osl_object obj; int ret = get_hash_object_of_aft_row(row, &obj); @@ -482,7 +482,7 @@ static int get_hash_of_row(const void *row, HASH_TYPE **hash) * * \sa get_chunk_table_of_row(). */ -int get_afhi_of_row(const void *row, struct audio_format_info *afhi) +static int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi) { struct osl_object obj; int ret = osl_get_object(audio_file_table, row, AFTCOL_AFHI, @@ -503,7 +503,7 @@ int get_afhi_of_row(const void *row, struct audio_format_info *afhi) * * \sa get_afhi_of_row(). */ -int get_chunk_table_of_row(const void *row, struct audio_format_info *afhi) +static int get_chunk_table_of_row(const struct osl_row *row, struct audio_format_info *afhi) { struct osl_object obj; int ret = osl_open_disk_object(audio_file_table, row, AFTCOL_CHUNKS, @@ -572,15 +572,14 @@ err: return ret; } -time_t now; - -static int get_local_time(uint64_t *seconds, char *buf, size_t size) +static int get_local_time(uint64_t *seconds, char *buf, size_t size, + time_t current_time) { struct tm t; if (!localtime_r((time_t *)seconds, &t)) return -E_LOCALTIME; - if (*seconds + 6 * 30 * 24 * 3600 > now) { + if (*seconds + 6 * 30 * 24 * 3600 > current_time) { if (!strftime(buf, size, "%b %e %k:%M", &t)) return -E_STRFTIME; return 1; @@ -654,7 +653,7 @@ static char *make_image_line(struct afs_info *afsi) } static int print_list_item(struct ls_data *d, struct ls_options *opts, - struct para_buffer *b) + struct para_buffer *b, time_t current_time) { int ret; char att_buf[65]; @@ -672,7 +671,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, } get_attribute_bitmap(&afsi->attributes, att_buf); ret = get_local_time(&afsi->last_played, last_played_time, - sizeof(last_played_time)); + sizeof(last_played_time), current_time); if (ret < 0) return ret; get_duration_buf(afhi->seconds_total, duration_buf, w->duration_width); @@ -828,7 +827,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; @@ -963,6 +962,8 @@ static int com_ls_callback(const struct osl_object *query, char *p, *pattern_start = (char *)query->data + sizeof(*opts); struct para_buffer b = {.buf = NULL, .size = 0}; int i = 0, ret; + time_t current_time; + PARA_NOTICE_LOG("%d patterns\n", opts->num_patterns); if (opts->num_patterns) { @@ -989,15 +990,16 @@ static int com_ls_callback(const struct osl_object *query, ret = sort_matching_paths(opts); if (ret < 0) goto out; + time(¤t_time); if (opts->flags & LS_FLAG_REVERSE) for (i = opts->num_matching_paths - 1; i >= 0; i--) { - ret = print_list_item(opts->data_ptr[i], opts, &b); + ret = print_list_item(opts->data_ptr[i], opts, &b, current_time); if (ret < 0) break; } else for (i = 0; i < opts->num_matching_paths; i++) { - ret = print_list_item(opts->data_ptr[i], opts, &b); + ret = print_list_item(opts->data_ptr[i], opts, &b, current_time); if (ret < 0) break; } @@ -1013,7 +1015,7 @@ out: } /* - * TODO: flags -h (sort by hash) + * TODO: flags -h (sort by hash) -lm (list in mbox format) * * long list: list hash, attributes as (xx--x-x-), file size, lastplayed * full list: list everything, including afsi, afhi, atts as clear text @@ -1117,7 +1119,6 @@ int com_afs_ls(int fd, int argc, char * const * const argv) } return -E_AFT_SYNTAX; } - time(&now); opts.flags = flags; opts.sorting = sort; opts.mode = mode; @@ -1326,7 +1327,7 @@ static int com_add_callback(const struct osl_object *query, return ret; } if (hs || pb) { /* (hs != NULL and pb != NULL) implies hs == pb */ - const void *row = pb? pb : hs; + const struct osl_row *row = pb? pb : hs; /* update afhi and chunk_table */ if (flags & ADD_FLAG_VERBOSE) PARA_DEBUG_LOG("updating audio format handler info (%zd bytes)\n", @@ -1694,6 +1695,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. *