X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=aft.c;h=d201c08092172f252808519d7fca0cda6faac9a7;hb=5e54609eda6f4417e8b7042db59ecf47fd720751;hp=b09745541438d37bfb2a2082256a154334be69a1;hpb=af6f663e6aca0e57017db693cf3dda95fc2cfb48;p=paraslash.git diff --git a/aft.c b/aft.c index b0974554..d201c080 100644 --- a/aft.c +++ b/aft.c @@ -524,7 +524,10 @@ int get_afsi_of_path(const char *path, struct afs_info *afsi) * \param row Pointer to a row in the audio file table. * \param path Result pointer. * - * \return Positive on success, negative on errors. + * The result is a pointer to mmapped data. The caller must not attempt + * to free it. + * + * \return Standard. */ int get_audio_file_path_of_row(const struct osl_row *row, char **path) { @@ -595,35 +598,10 @@ int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi) return 1; } -#if 0 -/** - * Get the chunk table of an audio file, given a row of the audio file table. - * - * \param row Pointer to a row of the audio file table. - * \param afhi Result pointer. - * - * \return The return value of the underlying call to osl_open_disk_object(). - * - * \sa get_afhi_of_row(). - */ -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, - &obj); - if (ret < 0) - return ret; - ret = load_chunk_info(&obj, afhi); - osl_close_disk_object(&obj); - return ret; -} -#endif - /* returns shmid on success */ static int save_afd(struct audio_file_data *afd) { - size_t path_size = strlen(afd->path) + 1; - size_t size = sizeof(*afd) + path_size + size_t size = sizeof(*afd) + 4 * (afd->afhi.chunks_total + 1); PARA_NOTICE_LOG("size: %zu\n", size); @@ -640,8 +618,6 @@ static int save_afd(struct audio_file_data *afd) *(struct audio_file_data *)shm_afd = *afd; buf = shm_afd; buf += sizeof(*afd); - strcpy(buf, afd->path); - buf += path_size; save_chunk_table(&afd->afhi, buf); shm_detach(shm_afd); return shmid; @@ -662,8 +638,6 @@ int load_afd(int shmid, struct audio_file_data *afd) *afd = *(struct audio_file_data *)shm_afd; buf = shm_afd; buf += sizeof(*afd); - afd->path = para_strdup(buf); - buf += strlen(buf) + 1; afd->afhi.chunk_table = para_malloc((afd->afhi.chunks_total + 1) * 4); load_chunk_table(&afd->afhi, buf); shm_detach(shm_afd); @@ -690,12 +664,15 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * 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; if (ret < 0) return ret; - ret = get_audio_file_path_of_row(aft_row, &afd->path); + ret = get_audio_file_path_of_row(aft_row, &path); if (ret < 0) return ret; + strncpy(afd->path, path, sizeof(afd->path) - 1); + afd->path[sizeof(afd->path) - 1] = '\0'; ret = get_afsi_object_of_row(aft_row, &afsi_obj); if (ret < 0) return ret; @@ -709,7 +686,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * AFTCOL_CHUNKS, &chunk_table_obj); if (ret < 0) return ret; - ret = mmap_full_file(afd->path, O_RDONLY, &map.data, + ret = mmap_full_file(path, O_RDONLY, &map.data, &map.size, &afd->fd); if (ret < 0) goto err; @@ -728,6 +705,12 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * 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; + tmp[sizeof(afd->attributes_string) - 1] = '\0'; + strcpy(afd->attributes_string, tmp); /* OK */ + free(tmp); aced.aft_row = aft_row; aced.old_afsi = &afd->afsi; @@ -797,16 +780,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("attributes: %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) @@ -841,7 +825,7 @@ 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_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); @@ -890,11 +874,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 */ @@ -914,7 +898,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, @@ -935,7 +919,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" "hash: %s\n" "image_id: %s\n" "lyrics_id: %s\n" @@ -951,7 +935,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, @@ -968,7 +952,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; @@ -1232,7 +1216,7 @@ out: * full list: list everything, including afsi, afhi, atts as clear text * * */ -int com_afs_ls(int fd, int argc, char * const * const argv) +int com_ls(int fd, int argc, char * const * const argv) { int i, ret; unsigned flags = 0; @@ -1944,7 +1928,7 @@ int com_touch(int fd, int argc, char * const * const argv) if (ret > 0) { send_buffer(fd, (char *)result.data); free(result.data); - } else + } else if (ret < 0) send_va_buffer(fd, "%s\n", PARA_STRERROR(-ret)); return ret; } @@ -2012,7 +1996,7 @@ static int com_rm_callback(const struct osl_object *query, } /* TODO options: -r (recursive) */ -int com_afs_rm(int fd, int argc, char * const * const argv) +int com_rm(int fd, int argc, char * const * const argv) { uint32_t flags = 0; struct osl_object query = {.data = &flags, .size = sizeof(flags)},