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. */
int ret = get_hash_of_row(aft_row, &aft_hash);
struct afsi_change_event_data aced;
struct osl_object map, chunk_table_obj;
- char *tmp, *path;
+ char *path;
if (ret < 0)
return ret;
ret = load_chunk_info(&chunk_table_obj, &afd->afhi);
if (ret < 0)
goto err;
- ret = get_attribute_text(&afd->afsi.attributes, " ", &tmp);
- if (ret < 0)
- goto err;
- assert(tmp);
- strncpy(afd->attributes_string, tmp, sizeof(afd->attributes_string));
- 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 - 1] = '\0';
+ free(pb.buf);
+ }
aced.aft_row = aft_row;
aced.old_afsi = &afd->afsi;
afs_event(AFSI_CHANGE, NULL, &aced);
return att_lines;
}
-static char *make_lyrics_line(struct afs_info *afsi)
+static char *make_lyrics_lines(struct afs_info *afsi)
{
char *lyrics_name;
lyr_get_name_by_id(afsi->lyrics_id, &lyrics_name);
- if (!lyrics_name)
- return make_message("%u", afsi->lyrics_id);
- return make_message("%u (%s)", afsi->lyrics_id, lyrics_name);
+ return make_message("lyrics_id: %u\nlyrics_name: %s\n",
+ afsi->lyrics_id, lyrics_name? lyrics_name : "(none)");
}
-static char *make_image_line(struct afs_info *afsi)
+static char *make_image_lines(struct afs_info *afsi)
{
char *image_name;
img_get_name_by_id(afsi->image_id, &image_name);
- if (!image_name)
- return make_message("%u", afsi->image_id);
- return make_message("%u (%s)", afsi->image_id, image_name);
+ return make_message("image_id: %u\nimage_name: %s\n",
+ afsi->image_id, image_name? image_name : "(none)");
}
static int print_list_item(struct ls_data *d, struct ls_options *opts,
struct ls_widths *w = &opts->widths;
int have_score = opts->flags & LS_FLAG_ADMISSIBLE_ONLY;
char asc_hash[2 * HASH_SIZE + 1];
- char *att_lines, *lyrics_line, *image_line;
+ char *att_lines, *lyrics_lines, *image_lines;
if (opts->mode == LS_MODE_SHORT) {
para_printf(b, "%s\n", d->path);
}
hash_to_asc(d->hash, asc_hash);
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 */
+ lyrics_lines = make_lyrics_lines(afsi);
+ image_lines = make_image_lines(afsi);
if (opts->mode == LS_MODE_VERBOSE) {
para_printf(b,
"%s: %s\n" /* path */
"%s%s%s" /* score */
"attributes: %s\n"
"hash: %s\n"
- "image_id: %s\n"
- "lyrics_id: %s\n"
+ "%s" /* image id, image name */
+ "%s" /* lyrics */
"bitrate: %dkbit/s\n"
"format: %s\n"
"frequency: %dHz\n"
have_score? "\n" : "",
att_lines,
asc_hash,
- image_line,
- lyrics_line,
+ image_lines,
+ lyrics_lines,
afhi->bitrate,
audio_format_name(afsi->audio_format_id),
afhi->frequency,
"Received: from\nTo: bar\nFrom: a\n"
"Subject: %s\n\n" /* path */
"%s%s%s" /* score */
- "%s"
+ "%s\n" /* attributes */
"hash: %s\n"
- "image_id: %s\n"
+ "%s\n" /* image id, image name */
"lyrics_id: %s\n"
"bitrate: %dkbit/s\n"
"format: %s\n"
have_score? "\n" : "",
att_lines,
asc_hash,
- image_line,
- lyrics_line,
+ image_lines,
+ lyrics_lines,
afhi->bitrate,
audio_format_name(afsi->audio_format_id),
afhi->frequency,
osl_close_disk_object(lyrics_def.data);
}
free(att_lines);
- free(lyrics_line);
- free(image_line);
+ free(lyrics_lines);
+ free(image_lines);
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;
save_audio_file_info(hash, path, afhi_ptr, pad->flags, format_num, &obj);
/* Ask afs to consider this entry for adding. */
ret = send_callback_request(com_add_callback, &obj, &result);
- if (ret >= 0 && result.data && result.size) {
+ if (ret > 0) {
ret2 = send_va_buffer(pad->fd, "%s", (char *)result.data);
free(result.data);
if (ret >= 0 && ret2 < 0)