enum play_mode {PLAY_MODE_MOOD, PLAY_MODE_PLAYLIST};
+/**
+ * Data about one audio file.
+ *
+ * Needed to produce ls and stat output.
+ */
+struct ls_data {
+ /** Usual audio format handler information. */
+ struct afh_info afhi;
+ /** Audio file selector information. */
+ struct afs_info afsi;
+ /** The full path of the audio file. */
+ char *path;
+ /** The score value (if -a was given). */
+ long score;
+ /** The sha1 hash of audio file. */
+ HASH_TYPE *hash;
+};
+int make_status_items(struct ls_data *d, struct para_buffer *pb);
+
+#define AFS_STATUS_INFO_SIZE 4096
+
struct audio_file_data {
enum play_mode current_play_mode;
char attributes_string[MAXLINE];
char path[_POSIX_PATH_MAX];
+ char afs_status_info[AFS_STATUS_INFO_SIZE];
int fd;
long score;
struct afs_info afsi;
unsigned short num_played_width;
};
-/** Data passed to the different compare functions (called by qsort()). */
-struct ls_data {
- /** Usual audio format handler information. */
- struct afh_info afhi;
- /** Audio file selector information. */
- struct afs_info afsi;
- /** The full path of the audio file. */
- char *path;
- /** The score value (if -a was given). */
- long score;
- /** The sha1 hash of audio file. */
- HASH_TYPE *hash;
-};
-
/** Data passed from the ls command handler to its callback function. */
struct ls_options {
/** The given command line flags. */
afd->attributes_string[sizeof(afd->attributes_string) - 1] = '\0';
free(tmp);
+ {
+ struct ls_data d = {
+ .afhi = afd->afhi,
+ .afsi = afd->afsi,
+ .path = path,
+ .score = afd->score,
+ .hash = file_hash
+ };
+ struct para_buffer pb = {.buf = NULL};
+ ret = make_status_items(&d, &pb);
+ if (ret < 0)
+ goto err;
+ strncpy(afd->afs_status_info, pb.buf, AFS_STATUS_INFO_SIZE);
+ afd->afs_status_info[AFS_STATUS_INFO_SIZE] = '\0';
+ free(pb.buf);
+ }
aced.aft_row = aft_row;
aced.old_afsi = &afd->afsi;
afs_event(AFSI_CHANGE, NULL, &aced);
att_lines = make_attribute_lines(att_buf, afsi);
lyrics_line = make_lyrics_line(afsi);
image_line = make_image_line(afsi);
- /* TODO: Merge this with status items */
if (opts->mode == LS_MODE_VERBOSE) {
para_printf(b,
"%s: %s\n" /* path */
return 1;
}
+int make_status_items(struct ls_data *d, struct para_buffer *pb)
+{
+ struct ls_options opts = {
+ .flags = LS_FLAG_FULL_PATH | LS_FLAG_ADMISSIBLE_ONLY,
+ .mode = LS_MODE_VERBOSE,
+ };
+ time_t current_time;
+
+ time(¤t_time);
+ return print_list_item(d, &opts, pb, current_time);
+}
+
+
static int ls_audio_format_compare(const void *a, const void *b)
{
struct ls_data *d1 = *(struct ls_data **)a, *d2 = *(struct ls_data **)b;
int get_audio_format_num(char *name)
{
int i;
+
+ while (isspace(*name))
+ name++;
FOR_EACH_AUDIO_FORMAT(i)
if (!strcmp(name, audio_formats[i]))
return i;
"%s:%s\n" "%s:%s\n" "%s:%s\n" "%s:%u\n"
"%s:%li\n" "%s:%s\n" "%s:%s\n" "%s"
"%s:%s\n" "%s:%lu.%lu\n" "%s:%lu.%lu\n" "%s:%s\n"
- "%s:%s\n" "%s:%u\n",
+ "%s:%s\n" "%s:%u\n" "%s\n",
status_item_list[SI_FILE_SIZE], nmmd->size / 1024,
status_item_list[SI_MTIME], mtime,
status_item_list[SI_LENGTH], nmmd->afd.afhi.seconds_total,
status_item_list[SI_ATTRIBUTES], mmd->afd.attributes_string,
status_item_list[SI_DIRECTORY], dirname? dirname : "(none)",
- status_item_list[SI_LYRICS_ID], nmmd->afd.afsi.lyrics_id
+ status_item_list[SI_LYRICS_ID], nmmd->afd.afsi.lyrics_id,
+ nmmd->afd.afs_status_info
);
free(basename);