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. |