From: <ny...@us...> - 2006-12-24 18:21:20
|
Revision: 198 http://svn.sourceforge.net/pmplib/?rev=198&view=rev Author: nyaochi Date: 2006-12-24 10:21:20 -0800 (Sun, 24 Dec 2006) Log Message: ----------- Trivial source code clean-up. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-24 18:03:21 UTC (rev 197) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-24 18:21:20 UTC (rev 198) @@ -27,7 +27,7 @@ - 0x00020000-0x0003FFFF: music (media information) chunk - Each chunk has a 16-bytes header at the beginning - Each chunk has an array of offsets to actual entries at the end (backward) -- Field names in db.dat seem to be defined in db.dic (Music and Objects) +- Field names in db.dat are defined in db.dic (Music and Objects) */ #ifdef HAVE_CONFIG_H @@ -48,12 +48,14 @@ static void dat_entry_init(dat_entry_t* entry, const dic_list_t* dic_list) { - int i; memset(entry, 0, sizeof(*entry)); - entry->num_fields = dic_list->num_fields; - entry->fields = (ip3db_variant_t*)malloc(sizeof(ip3db_variant_t) * entry->num_fields); - for (i = 0;i < entry->num_fields;++i) { - ip3db_variant_init(&entry->fields[i], dic_list->fields[i].type); + entry->fields = (ip3db_variant_t*)malloc(sizeof(ip3db_variant_t) * dic_list->num_fields); + if (entry->fields) { + int i; + entry->num_fields = dic_list->num_fields; + for (i = 0;i < entry->num_fields;++i) { + ip3db_variant_init(&entry->fields[i], dic_list->fields[i].type); + } } } @@ -67,13 +69,15 @@ memset(entry, 0, sizeof(*entry)); } -static size_t dat_entry_serialize(uint8_t* block, uint8_t* q, dat_entry_t* entry, int is_storing) +static size_t dat_entry_serialize(dat_entry_t* entry, uint8_t* block, uint8_t* q, int is_storing) { int i; uint8_t *p = block; + /* Serialize offset address of this entry. */ q -= serialize_uint32be(q, &entry->offset, is_storing); + /* Serialize all fields in this entry. */ for (i = 0;i < entry->num_fields;++i) { ip3db_variant_t* var = &entry->fields[i]; switch (var->type) { @@ -99,7 +103,7 @@ return (size_t)(p - block); } -static void dat_entry_dump(dat_entry_t* entry, FILE *fp, const dic_list_t* dic_list) +static void dat_entry_dump(dat_entry_t* entry, const dic_list_t* dic_list, FILE *fp) { int i; @@ -139,7 +143,7 @@ dat_list_init(list); } -static size_t dat_list_serialize(uint8_t* buffer, dat_list_t* list, int is_storing, const dic_list_t* dic_list) +static size_t dat_list_serialize(dat_list_t* list, const dic_list_t* dic_list, uint8_t* buffer, int is_storing) { uint32_t i; uint8_t *p = buffer; @@ -160,14 +164,14 @@ for (i = 0;i < list->num_entries;++i) { dat_entry_t* entry = &list->entries[i]; - p += dat_entry_serialize(p, q, entry, is_storing); + p += dat_entry_serialize(entry, p, q, is_storing); q -= sizeof(uint32_t); } return (size_t)(p - buffer); } -static void dat_list_dump(dat_list_t* list, FILE *fp, const dic_list_t* dic_list) +static void dat_list_dump(dat_list_t* list, const dic_list_t* dic_list, FILE *fp) { uint32_t i; @@ -179,7 +183,7 @@ for (i = 0;i < list->num_entries;++i) { dat_entry_t* entry = &list->entries[i]; fprintf(fp, " ENTRY %d (0x%08X) = {\n", i, entry->offset); - dat_entry_dump(entry, fp, dic_list); + dat_entry_dump(entry, dic_list, fp); fprintf(fp, " }\n"); } } @@ -203,8 +207,8 @@ size_t dat_serialize(dat_t* dat, const dic_t* dic, uint8_t* buffer, int is_storing) { - dat_list_serialize(buffer, &dat->objects, is_storing, &dic->objects); - dat_list_serialize(buffer + 0x00020000, &dat->musics, is_storing, &dic->music); + dat_list_serialize(&dat->objects, &dic->objects, buffer, is_storing); + dat_list_serialize(&dat->musics, &dic->music, buffer + 0x00020000, is_storing); return 0; } @@ -212,9 +216,9 @@ { fprintf(fp, "===== db.dat =====\n"); fprintf(fp, "OBJECTS = {\n"); - dat_list_dump(&dat->objects, fp, &dic->objects); + dat_list_dump(&dat->objects, &dic->objects, fp); fprintf(fp, "}\n"); fprintf(fp, "MUSIC = {\n"); - dat_list_dump(&dat->musics, fp, &dic->music); + dat_list_dump(&dat->musics, &dic->music, fp); fprintf(fp, "}\n"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ny...@us...> - 2006-12-27 19:11:11
|
Revision: 210 http://svn.sourceforge.net/pmplib/?rev=210&view=rev Author: nyaochi Date: 2006-12-27 11:11:11 -0800 (Wed, 27 Dec 2006) Log Message: ----------- Trivial comments in dat.c Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-27 19:04:23 UTC (rev 209) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-27 19:11:11 UTC (rev 210) @@ -522,6 +522,7 @@ p = q; } + /* Create a new object for the file name (FileType = 2). */ uid = dato->num_entries; entry = dat_list_expand(dato); dat_entry_init(entry, &dic->objects); @@ -530,6 +531,7 @@ ip3db_variant_set_word(&entry->fields[IP3DBF_OBJECTS_FILETYPE], 2); ip3db_variant_set_str(&entry->fields[IP3DBF_OBJECTS_OBJECTNAME], file); + /* Create a music record with UID referring to the file name. */ entry = dat_list_expand(datm); dat_entry_init(entry, &dic->music); for (j = 0;j < entry->num_fields;++j) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ny...@us...> - 2006-12-28 03:48:25
|
Revision: 213 http://svn.sourceforge.net/pmplib/?rev=213&view=rev Author: nyaochi Date: 2006-12-27 19:48:26 -0800 (Wed, 27 Dec 2006) Log Message: ----------- Fixed a crash bug. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-28 03:20:31 UTC (rev 212) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-28 03:48:26 UTC (rev 213) @@ -61,12 +61,14 @@ static void dat_entry_finish(dat_entry_t* entry) { - int i; - for (i = 0;i < entry->num_fields;++i) { - ip3db_variant_finish(&entry->fields[i]); + if (entry) { + int i; + for (i = 0;i < entry->num_fields;++i) { + ip3db_variant_finish(&entry->fields[i]); + } + free(entry->fields); + memset(entry, 0, sizeof(*entry)); } - free(entry->fields); - memset(entry, 0, sizeof(*entry)); } static size_t dat_entry_serialize(dat_entry_t* entry, uint8_t* block, uint8_t* q, uint32_t start, int is_storing) @@ -157,12 +159,16 @@ static void dat_list_finish(dat_list_t* list) { - uint32_t i; - for (i = 0;i < list->num_entries;++i) { - dat_entry_finish(&list->entries[i]); + if (list) { + if (list->entries) { + uint32_t i; + for (i = 0;i < list->num_entries;++i) { + dat_entry_finish(&list->entries[i]); + } + free(list->entries); + } + memset(list, 0, sizeof(*list)); } - free(list->entries); - memset(list, 0, sizeof(*list)); } static dat_entry_t *dat_list_expand(dat_list_t* list) @@ -190,7 +196,7 @@ /* Initialize fields according to db.dic when reading. */ if (!is_storing) { - dat_list_finish(list); + free(list->entries); list->entries = (dat_entry_t*)calloc(list->num_entries, sizeof(dat_entry_t)); for (i = 0;i < list->num_entries;++i) { dat_entry_init(&list->entries[i], dic_list); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ny...@us...> - 2006-12-28 17:40:06
|
Revision: 221 http://svn.sourceforge.net/pmplib/?rev=221&view=rev Author: nyaochi Date: 2006-12-28 09:40:06 -0800 (Thu, 28 Dec 2006) Log Message: ----------- Fixed a bug in db.dat generator. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-28 17:19:09 UTC (rev 220) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-28 17:40:06 UTC (rev 221) @@ -379,6 +379,7 @@ /* Write Music page(s) */ i = 0; + ph.next_page = dic->header.num_dat_pages + 2; dat_list_write(&dat->musics, i, &ph, buffer, PAGESIZE * 1); dic->header.num_dat_pages += 1; while (ph.next_page) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ny...@us...> - 2007-01-17 18:00:52
|
Revision: 267 http://svn.sourceforge.net/pmplib/?rev=267&view=rev Author: nyaochi Date: 2007-01-17 10:00:48 -0800 (Wed, 17 Jan 2007) Log Message: ----------- Use offset tables in db.dat for reading. It seems that db.dat has abandoned records according to my analysis with iriver plus 3. We cannot read the records sequentially. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2007-01-17 17:44:42 UTC (rev 266) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2007-01-17 18:00:48 UTC (rev 267) @@ -110,25 +110,11 @@ return size; } -static size_t dat_entry_serialize(dat_entry_t* entry, uint8_t* block, uint8_t* q, uint32_t start, int is_storing) +static size_t dat_entry_serialize(dat_entry_t* entry, uint8_t* block, int is_storing) { int i; uint8_t *p = block; - uint32_t offset; - /* - * Serialize offset address of this entry. - * entry->offset: The offset address in the whole db.dat buffer (e.g., 0x00020123) - * offset (written in db.dat): The one within the chunk (e.g., 0x00000123) - */ - if (is_storing) { - offset = entry->offset - start; - q -= serialize_uint32be(q, &offset, is_storing); - } else { - q -= serialize_uint32be(q, &offset, is_storing); - entry->offset = offset + start; - } - /* Serialize all fields in this entry. */ for (i = 0;i < entry->num_fields;++i) { ip3db_variant_t* var = &entry->fields[i]; @@ -236,10 +222,14 @@ /* Read the new records. */ for (i = 0;i < header->num_entries;++i) { + uint32_t offset = 0; dat_entry_t* entry = &list->entries[list->num_entries+i]; - entry->offset = (uint32_t)(p - buffer); /* compute the current offset address */ - p += dat_entry_serialize(entry, p, q, start, 0); - q -= sizeof(uint32_t); + + /* Read the offset table. */ + q -= serialize_uint32be(q, &offset, 0); + entry->offset = offset + start; + + p += dat_entry_serialize(entry, buffer + entry->offset, 0); } list->num_entries += header->num_entries; @@ -259,14 +249,18 @@ /* Write records. */ while (i < list->num_entries) { + uint32_t offset = 0; size_t free_space = (size_t)(q-p); dat_entry_t* entry = &list->entries[i]; if (free_space < dat_entry_size(entry)) { break; } entry->offset = (uint32_t)(p - buffer); /* compute the current offset address */ - p += dat_entry_serialize(entry, p, q, start, 1); - q -= sizeof(uint32_t); + + offset = entry->offset - start; + q -= serialize_uint32be(q, &offset, 1); + + p += dat_entry_serialize(entry, p, 1); header->num_entries++; i++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ny...@us...> - 2007-01-17 18:38:17
|
Revision: 268 http://svn.sourceforge.net/pmplib/?rev=268&view=rev Author: nyaochi Date: 2007-01-17 10:38:14 -0800 (Wed, 17 Jan 2007) Log Message: ----------- Preparation for proper playlist conversion for iriver E10. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2007-01-17 18:00:48 UTC (rev 267) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2007-01-17 18:38:14 UTC (rev 268) @@ -596,18 +596,21 @@ } +typedef struct { + const ucs2char_t* filepath; + const ucs2char_t* filename; + uint8_t filetype; + int index; +} object_record_t; -static int comp_pathname(const void *__x, const void *__y) + +static int comp_pathname(const void *_x, const void *_y) { - const sort_index_t* _x = (const sort_index_t*)__x; - const sort_index_t* _y = (const sort_index_t*)__y; - const ip3db_music_record_t* _xb = (const ip3db_music_record_t*)_x->base; - const ip3db_music_record_t* _yb = (const ip3db_music_record_t*)_y->base; - const ip3db_variant_t* x = _xb[_x->index]; - const ip3db_variant_t* y = _yb[_y->index]; - int ret = ucs2cmp(x[IP3DBF_MUSIC_FILEPATH].value.str, y[IP3DBF_MUSIC_FILEPATH].value.str); + const object_record_t* x = (const object_record_t*)_x; + const object_record_t* y = (const object_record_t*)_y; + int ret = ucs2cmp(x->filepath, y->filepath); if (ret == 0) { - return ucs2cmp(x[IP3DBF_MUSIC_FILENAME].value.str, y[IP3DBF_MUSIC_FILENAME].value.str); + return ucs2cmp(x->filename, y->filename); } else { return ret; } @@ -656,7 +659,8 @@ static const ucs2char_t ucs2cs_root[] = {'/', 0}; dat_list_t* dato = &dat->objects; dat_list_t* datm = &dat->musics; - sort_index_t *si = (sort_index_t*)malloc(sizeof(sort_index_t) * num_records); + uint32_t num_objects = num_records; + object_record_t *objects = (object_record_t*)malloc(sizeof(object_record_t) * num_objects); dircache_t dc; dircache_init(&dc); @@ -676,22 +680,23 @@ dircache_push(&dc, ucs2cs_root, uid_root); /* Sort the records in alphabetical order of their path names. */ - for (i = 0;i < num_records;++i) { - si[i].base = records; - si[i].index = i; + for (i = 0;i < num_objects;++i) { + objects[i].filepath = records[i][IP3DBF_MUSIC_FILEPATH].value.str; + objects[i].filename = records[i][IP3DBF_MUSIC_FILENAME].value.str; + objects[i].filetype = 2; + objects[i].index = i; } - qsort(si, num_records, sizeof(si[0]), comp_pathname); + qsort(objects, num_objects, sizeof(objects[0]), comp_pathname); /* Loop for the records. */ - for (i = 0;i < num_records;++i) { + for (i = 0;i < num_objects;++i) { /* * Split a path name into two parts: a prefix that have already been * registered in the Object table: and a postfix that is being registered * as Object records. */ - const ip3db_variant_t* record = records[si[i].index]; - const ucs2char_t* path = record[IP3DBF_MUSIC_FILEPATH].value.str; - const ucs2char_t* file = record[IP3DBF_MUSIC_FILENAME].value.str; + const ucs2char_t* path = objects[i].filepath; + const ucs2char_t* file = objects[i].filename; int k = dircache_findprefix(&dc, path); const dircache_element_t* com = dircache_get(&dc, k); const ucs2char_t* p = path + ucs2len(com->path); /* the prefix */ @@ -731,21 +736,25 @@ } /* Create a new object for the file name (FileType = 2). */ - uid = dato->num_entries; - entry = dat_list_expand(dato); - dat_entry_init(entry, &dic->objects); - ip3db_variant_set_dword(&entry->fields[IP3DBF_OBJECTS_UID], uid); - ip3db_variant_set_dword(&entry->fields[IP3DBF_OBJECTS_PARENTUID], puid); - ip3db_variant_set_word(&entry->fields[IP3DBF_OBJECTS_FILETYPE], 2); - ip3db_variant_set_str(&entry->fields[IP3DBF_OBJECTS_OBJECTNAME], file); + if (objects[i].filetype == 2) { + const ip3db_variant_t* record = records[objects[i].index]; - /* Create a music record with UID referring to the file name. */ - entry = dat_list_expand(datm); - dat_entry_init(entry, &dic->music); - for (j = 0;j < entry->num_fields;++j) { - ip3db_variant_clone(&entry->fields[j], &record[j]); + uid = dato->num_entries; + entry = dat_list_expand(dato); + dat_entry_init(entry, &dic->objects); + ip3db_variant_set_dword(&entry->fields[IP3DBF_OBJECTS_UID], uid); + ip3db_variant_set_dword(&entry->fields[IP3DBF_OBJECTS_PARENTUID], puid); + ip3db_variant_set_word(&entry->fields[IP3DBF_OBJECTS_FILETYPE], 2); + ip3db_variant_set_str(&entry->fields[IP3DBF_OBJECTS_OBJECTNAME], file); + + /* Create a music record with UID referring to the file name. */ + entry = dat_list_expand(datm); + dat_entry_init(entry, &dic->music); + for (j = 0;j < entry->num_fields;++j) { + ip3db_variant_clone(&entry->fields[j], &record[j]); + } + ip3db_variant_set_dword(&entry->fields[IP3DBF_MUSIC_UID], uid); } - ip3db_variant_set_dword(&entry->fields[IP3DBF_MUSIC_UID], uid); } dircache_finish(&dc); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |