static bool_t id3v24_write_tag (const Tuple * tuple, VFSFile * f) { int version, header_size, data_size, footer_size; bool_t syncsafe; int64_t offset; if (! read_header (f, & version, & syncsafe, & offset, & header_size, & data_size, & footer_size)) return FALSE; //read all frames into generic frames; GHashTable * dict = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) str_unref, (GDestroyNotify) free_frame_list); read_all_frames (f, version, syncsafe, data_size, dict); //make the new frames from tuple and replace in the dictionary the old frames with the new ones add_frameFromTupleStr (tuple, FIELD_TITLE, ID3_TITLE, dict); add_frameFromTupleStr (tuple, FIELD_ARTIST, ID3_ARTIST, dict); add_frameFromTupleStr (tuple, FIELD_ALBUM, ID3_ALBUM, dict); add_frameFromTupleInt (tuple, FIELD_YEAR, ID3_YEAR, dict); add_frameFromTupleInt (tuple, FIELD_TRACK_NUMBER, ID3_TRACKNR, dict); add_frameFromTupleStr (tuple, FIELD_GENRE, ID3_GENRE, dict); char * comment = tuple_get_str (tuple, FIELD_COMMENT); add_comment_frame (comment, dict); str_unref (comment); if (! offset) { if (! cut_beginning_tag (f, header_size + data_size + footer_size)) goto ERR; } else { if (offset + header_size + data_size + footer_size != vfs_fsize (f)) goto ERR; if (vfs_ftruncate (f, offset)) goto ERR; } offset = vfs_fsize (f); if (offset < 0 || vfs_fseek (f, offset, SEEK_SET) || ! write_header (f, 0, FALSE)) goto ERR; data_size = write_all_frames (f, dict); if (! write_header (f, data_size, TRUE) || vfs_fseek (f, offset, SEEK_SET) || ! write_header (f, data_size, FALSE)) goto ERR; g_hash_table_destroy (dict); return TRUE; ERR: g_hash_table_destroy (dict); return FALSE; }
static gboolean id3v24_write_tag (const Tuple * tuple, VFSFile * f) { gint version, header_size, data_size, footer_size; gboolean syncsafe; gint64 offset; if (! read_header (f, & version, & syncsafe, & offset, & header_size, & data_size, & footer_size)) return FALSE; //read all frames into generic frames; mowgli_dictionary_t * dict = mowgli_dictionary_create (strcasecmp); read_all_frames (f, version, syncsafe, data_size, dict); //make the new frames from tuple and replace in the dictionary the old frames with the new ones add_frameFromTupleStr (tuple, FIELD_TITLE, ID3_TITLE, dict); add_frameFromTupleStr (tuple, FIELD_ARTIST, ID3_ARTIST, dict); add_frameFromTupleStr (tuple, FIELD_ALBUM, ID3_ALBUM, dict); add_frameFromTupleInt (tuple, FIELD_YEAR, ID3_YEAR, dict); add_frameFromTupleInt (tuple, FIELD_TRACK_NUMBER, ID3_TRACKNR, dict); add_frameFromTupleStr (tuple, FIELD_GENRE, ID3_GENRE, dict); add_comment_frame (tuple_get_string (tuple, FIELD_COMMENT, NULL), dict); if (! offset) { if (! cut_beginning_tag (f, header_size + data_size + footer_size)) goto ERR; } else { if (offset + header_size + data_size + footer_size != vfs_fsize (f)) goto ERR; if (vfs_ftruncate (f, offset)) goto ERR; } offset = vfs_fsize (f); if (offset < 0 || vfs_fseek (f, offset, SEEK_SET) || ! write_header (f, 0, FALSE)) goto ERR; data_size = writeAllFramesToFile (f, dict); if (! write_header (f, data_size, TRUE) || vfs_fseek (f, offset, SEEK_SET) || ! write_header (f, data_size, FALSE)) goto ERR; mowgli_dictionary_destroy (dict, free_frame_cb, NULL); return TRUE; ERR: mowgli_dictionary_destroy (dict, free_frame_cb, NULL); return FALSE; }