X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=93c96cb49c8e01bd3e5259e380d413d047f92344;hp=85ceee9f1d7312c74f29114f63976fc6f5decd51;hb=35726e230f83270ef01000fc57328101a8b0d89f;hpb=7a711d24a3cae6feba02de127df5ad90cd35c0bb diff --git a/aft.c b/aft.c index 85ceee9f..93c96cb4 100644 --- a/aft.c +++ b/aft.c @@ -99,7 +99,7 @@ struct ls_widths { /** Data passed to the different compare functions (called by qsort()). */ struct ls_data { /** Usual audio format handler information. */ - struct audio_format_info afhi; + struct afh_info afhi; /** Audio file selector information. */ struct afs_info afsi; /** The full path of the audio file. */ @@ -110,16 +110,27 @@ struct ls_data { HASH_TYPE *hash; }; +/** Data passed from the ls command handler to its callback function. */ struct ls_options { + /** The given command line flags. */ unsigned flags; + /** The sorting method given at the command line. */ enum ls_sorting_method sorting; + /** The given listing mode (short, long, verbose, mbox). */ enum ls_listing_mode mode; + /** The arguments passed to the ls command. */ char **patterns; + /** Number of non-option arguments. */ int num_patterns; + /** Used for long listing mode to align the output fields. */ struct ls_widths widths; + /** Size of the \a data array. */ uint32_t array_size; + /** Number of used entries in the data array. */ uint32_t num_matching_paths; + /** Array of matching entries. */ struct ls_data *data; + /** Used to sort the array. */ struct ls_data **data_ptr; }; @@ -312,22 +323,28 @@ enum afhi_offsets { AFHI_BITRATE_OFFSET = 4, /** Position of the frequency. */ AFHI_FREQUENCY_OFFSET = 8, + /** Location of the audio file header. */ + AFHI_HEADER_OFFSET_OFFSET = 12, + /* Length of the audio file header. Zero means: No header. */ + AFHI_HEADER_LEN_OFFSET = 16, /** Number of channels is stored here. */ - AFHI_CHANNELS_OFFSET = 12, + AFHI_CHANNELS_OFFSET = 20, + /** EOF timeout in ms. */ + AFHI_EOF_OFFSET = 21, /** The tag info position. */ - AFHI_INFO_STRING_OFFSET = 13, + AFHI_INFO_STRING_OFFSET = 23, /** Minimal on-disk size of a valid afhi struct. */ - MIN_AFHI_SIZE = 14 + MIN_AFHI_SIZE = 24 }; -static unsigned sizeof_afhi_buf(const struct audio_format_info *afhi) +static unsigned sizeof_afhi_buf(const struct afh_info *afhi) { if (!afhi) return 0; return strlen(afhi->info_string) + MIN_AFHI_SIZE; } -static void save_afhi(struct audio_format_info *afhi, char *buf) +static void save_afhi(struct afh_info *afhi, char *buf) { if (!afhi) return; @@ -335,23 +352,29 @@ static void save_afhi(struct audio_format_info *afhi, char *buf) afhi->seconds_total); write_u32(buf + AFHI_BITRATE_OFFSET, afhi->bitrate); write_u32(buf + AFHI_FREQUENCY_OFFSET, afhi->frequency); + write_u32(buf + AFHI_HEADER_OFFSET_OFFSET, afhi->header_offset); + write_u32(buf + AFHI_HEADER_LEN_OFFSET, afhi->header_len); write_u8(buf + AFHI_CHANNELS_OFFSET, afhi->channels); + write_u16(buf + AFHI_EOF_OFFSET, tv2ms(&afhi->eof_tv)); strcpy(buf + AFHI_INFO_STRING_OFFSET, afhi->info_string); /* OK */ PARA_DEBUG_LOG("last byte written: %p\n", buf + AFHI_INFO_STRING_OFFSET + strlen(afhi->info_string)); } -static void load_afhi(const char *buf, struct audio_format_info *afhi) +static void load_afhi(const char *buf, struct afh_info *afhi) { afhi->seconds_total = read_u32(buf + AFHI_SECONDS_TOTAL_OFFSET); afhi->bitrate = read_u32(buf + AFHI_BITRATE_OFFSET); afhi->frequency = read_u32(buf + AFHI_FREQUENCY_OFFSET); afhi->channels = read_u8(buf + AFHI_CHANNELS_OFFSET); + afhi->header_offset = read_u32(buf + AFHI_HEADER_OFFSET_OFFSET); + afhi->header_len = read_u32(buf + AFHI_HEADER_LEN_OFFSET); + ms2tv(read_u16(buf + AFHI_EOF_OFFSET), &afhi->eof_tv); strcpy(afhi->info_string, buf + AFHI_INFO_STRING_OFFSET); } //#define SIZEOF_CHUNK_TABLE(afhi) (((afhi)->chunks_total + 1) * sizeof(uint32_t)) -static unsigned sizeof_chunk_info_buf(struct audio_format_info *afhi) +static unsigned sizeof_chunk_info_buf(struct afh_info *afhi) { if (!afhi) return 0; @@ -375,16 +398,16 @@ enum chunk_info_offsets{ CHUNK_TABLE_OFFSET = 20, }; -static void save_chunk_table(struct audio_format_info *afhi, char *buf) +static void save_chunk_table(struct afh_info *afhi, char *buf) { int i; - PARA_NOTICE_LOG("%lu chunks\n", afhi->chunks_total); + PARA_DEBUG_LOG("%lu chunks\n", afhi->chunks_total); for (i = 0; i <= afhi->chunks_total; i++) write_u32(buf + 4 * i, afhi->chunk_table[i]); } -static void load_chunk_table(struct audio_format_info *afhi, char *buf) +static void load_chunk_table(struct afh_info *afhi, char *buf) { int i; for (i = 0; i <= afhi->chunks_total; i++) @@ -392,7 +415,7 @@ static void load_chunk_table(struct audio_format_info *afhi, char *buf) } /* TODO: audio format handlers could just produce this */ -static void save_chunk_info(struct audio_format_info *afhi, char *buf) +static void save_chunk_info(struct afh_info *afhi, char *buf) { if (!afhi) return; @@ -404,7 +427,7 @@ static void save_chunk_info(struct audio_format_info *afhi, char *buf) save_chunk_table(afhi, buf + CHUNK_TABLE_OFFSET); } -static int load_chunk_info(struct osl_object *obj, struct audio_format_info *afhi) +static int load_chunk_info(struct osl_object *obj, struct afh_info *afhi) { char *buf = obj->data; @@ -587,7 +610,7 @@ static int get_hash_of_row(const struct osl_row *row, HASH_TYPE **hash) * * \sa get_chunk_table_of_row(). */ -int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi) +int get_afhi_of_row(const struct osl_row *row, struct afh_info *afhi) { struct osl_object obj; int ret = osl_get_object(audio_file_table, row, AFTCOL_AFHI, @@ -604,7 +627,7 @@ static int save_afd(struct audio_file_data *afd) size_t size = sizeof(*afd) + 4 * (afd->afhi.chunks_total + 1); - PARA_NOTICE_LOG("size: %zu\n", size); + PARA_DEBUG_LOG("size: %zu\n", size); int shmid, ret = shm_new(size); void *shm_afd; char *buf; @@ -708,8 +731,9 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * ret = get_attribute_text(&afd->afsi.attributes, " ", &tmp); if (ret < 0) goto err; - tmp[sizeof(afd->attributes_string) - 1] = '\0'; - strcpy(afd->attributes_string, tmp); /* OK */ + assert(tmp); + strncpy(afd->attributes_string, tmp, sizeof(afd->attributes_string)); + afd->attributes_string[sizeof(afd->attributes_string) - 1] = '\0'; free(tmp); aced.aft_row = aft_row; @@ -780,16 +804,17 @@ static void get_duration_buf(int seconds, char *buf, short unsigned max_width) seconds % 60); } -static char *make_attribute_line(const char *att_bitmap, struct afs_info *afsi) +static char *make_attribute_lines(const char *att_bitmap, struct afs_info *afsi) { - char *att_text, *att_line; + char *att_text, *att_lines; get_attribute_text(&afsi->attributes, " ", &att_text); if (!att_text) return para_strdup(att_bitmap); - att_line = make_message("%s (%s)", att_bitmap, att_text); + att_lines = make_message("%s\nattributes_txt: %s", + att_bitmap, att_text); free(att_text); - return att_line; + return att_lines; } static char *make_lyrics_line(struct afs_info *afsi) @@ -820,11 +845,11 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, char duration_buf[30]; /* nobody has an audio file long enough to overflow this */ char score_buf[30] = ""; struct afs_info *afsi = &d->afsi; - struct audio_format_info *afhi = &d->afhi; + struct afh_info *afhi = &d->afhi; struct ls_widths *w = &opts->widths; int have_score = opts->flags & LS_FLAG_ADMISSIBLE_ONLY; char asc_hash[2 * HASH_SIZE + 1]; - char *att_line, *lyrics_line, *image_line; + char *att_lines, *lyrics_line, *image_line; if (opts->mode == LS_MODE_SHORT) { para_printf(b, "%s\n", d->path); @@ -873,11 +898,11 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, return 1; } hash_to_asc(d->hash, asc_hash); - att_line = make_attribute_line(att_buf, afsi); + 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 */ "%s%s%s" /* score */ @@ -897,7 +922,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, "path" : "file", d->path, have_score? "score: " : "", score_buf, have_score? "\n" : "", - att_line, + att_lines, asc_hash, image_line, lyrics_line, @@ -918,7 +943,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, "Received: from\nTo: bar\nFrom: a\n" "Subject: %s\n\n" /* path */ "%s%s%s" /* score */ - "attributes: %s\n" + "%s\n" /* attributes */ "hash: %s\n" "image_id: %s\n" "lyrics_id: %s\n" @@ -934,7 +959,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, d->path, have_score? "score: " : "", score_buf, have_score? "\n" : "", - att_line, + att_lines, asc_hash, image_line, lyrics_line, @@ -951,7 +976,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, if (lyrics_def.data) osl_close_disk_object(lyrics_def.data); } - free(att_line); + free(att_lines); free(lyrics_line); free(image_line); return 1; @@ -1209,12 +1234,8 @@ out: } /* - * 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 - * - * */ + * TODO: flags -h (sort by hash) + */ int com_ls(int fd, int argc, char * const * const argv) { int i, ret; @@ -1361,7 +1382,7 @@ enum aft_row_offsets { /* never save the afsi, as the server knows it too. Note that afhi might be NULL. * In this case, afhi won't be stored in the buffer */ static void save_audio_file_info(HASH_TYPE *hash, const char *path, - struct audio_format_info *afhi, uint32_t flags, + struct afh_info *afhi, uint32_t flags, uint8_t audio_format_num, struct osl_object *obj) { size_t path_len = strlen(path) + 1; @@ -1570,8 +1591,11 @@ out: return 1; } +/** Used by com_add(). */ struct private_add_data { + /** The socket file descriptor. */ int fd; + /** The given add flags. */ uint32_t flags; }; @@ -1609,7 +1633,7 @@ static int add_one_audio_file(const char *path, const void *private_data) int ret, ret2; uint8_t format_num = -1; const struct private_add_data *pad = private_data; - struct audio_format_info afhi, *afhi_ptr = NULL; + struct afh_info afhi, *afhi_ptr = NULL; struct osl_row *pb = NULL, *hs = NULL; /* path brother/hash sister */ struct osl_object map, obj = {.data = NULL}, query, result = {.data = NULL}; HASH_TYPE hash[HASH_SIZE]; @@ -1778,16 +1802,25 @@ enum touch_flags { TOUCH_FLAG_VERBOSE = 2 }; +/** Options used by com_touch(). */ struct com_touch_options { + /** New num_played value. */ int32_t num_played; + /** New last played count. */ int64_t last_played; + /** new lyrics id. */ int32_t lyrics_id; + /** new image id. */ int32_t image_id; + /** command line flags (see \ref touch_flags). */ unsigned flags; }; +/** Data passed to the action handler of com_touch(). */ struct touch_action_data { + /** Command line options (see \ref com_touch_options). */ struct com_touch_options *cto; + /** Message buffer. */ struct para_buffer pb; }; @@ -1932,22 +1965,30 @@ int com_touch(int fd, int argc, char * const * const argv) return ret; } +/** Flags for com_rm(). */ enum rm_flags { + /** -v */ RM_FLAG_VERBOSE = 1, + /** -f */ RM_FLAG_FORCE = 2, + /** -p */ RM_FLAG_FNM_PATHNAME = 4 }; -struct com_rm_data { +/** Data passed to the action handler of com_rm(). */ +struct com_rm_action_data { + /** Command line flags ((see \ref rm_flags). */ uint32_t flags; + /** Message buffer. */ struct para_buffer pb; + /** Number of audio files removed. */ unsigned num_removed; }; static int remove_audio_file(__a_unused struct osl_table *table, struct osl_row *row, const char *name, void *data) { - struct com_rm_data *crd = data; + struct com_rm_action_data *crd = data; int ret; if (crd->flags & RM_FLAG_VERBOSE) @@ -1964,7 +2005,7 @@ static int remove_audio_file(__a_unused struct osl_table *table, static int com_rm_callback(const struct osl_object *query, __a_unused struct osl_object *result) { - struct com_rm_data crd = {.flags = *(uint32_t *)query->data}; + struct com_rm_action_data crd = {.flags = *(uint32_t *)query->data}; int ret; struct pattern_match_data pmd = { .table = audio_file_table, @@ -2056,10 +2097,15 @@ enum cpsi_flags { CPSI_FLAG_VERBOSE = 32, }; +/** Data passed to the action handler of com_cpsi(). */ struct cpsi_action_data { + /** command line flags (see \ref cpsi_flags). */ unsigned flags; + /** Number of audio files changed. */ unsigned num_copied; + /** Message buffer. */ struct para_buffer pb; + /** Values are copied from here. */ struct afs_info source_afsi; }; @@ -2253,7 +2299,7 @@ int aft_check_callback(__a_unused const struct osl_object *query, struct osl_obj /** * Close the audio file table. * - * \param flags Ususal flags that are passed to osl_close_table(). + * \param flags Usual flags that are passed to osl_close_table(). * * \sa osl_close_table(). */