From: <ny...@us...> - 2007-02-18 08:01:53
|
Revision: 376 http://svn.sourceforge.net/pmplib/?rev=376&view=rev Author: nyaochi Date: 2007-02-18 00:01:54 -0800 (Sun, 18 Feb 2007) Log Message: ----------- Bug fix for database dump in pmp_irivnavi. Modified Paths: -------------- trunk/pmplib/lib/pmp_irivnavi/pmp_irivnavi.c Modified: trunk/pmplib/lib/pmp_irivnavi/pmp_irivnavi.c =================================================================== --- trunk/pmplib/lib/pmp_irivnavi/pmp_irivnavi.c 2007-02-18 07:53:06 UTC (rev 375) +++ trunk/pmplib/lib/pmp_irivnavi/pmp_irivnavi.c 2007-02-18 08:01:54 UTC (rev 376) @@ -88,7 +88,6 @@ } pmp_internal_t; typedef struct { - irivnavi_t db; pmp_music_record_t* records; int num_records; pmp_playlist_t* playlists; @@ -343,6 +342,7 @@ uint32_t pmpmusic_open(pmp_music_t* music) { pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; + irivnavi_t db; result_t ret = 0; FILE *fp = NULL; ucs2char_t filename[MAX_PATH]; @@ -354,7 +354,7 @@ static const ucs2char_t ucs2cs_wma[] = {'.','w','m','a',0}; static const ucs2char_t ucs2cs_wav[] = {'.','w','a','v',0}; - irivnavi_init(&pmpmi->db); + irivnavi_init(&db); if (music->pmp->flag & PMPOF_MUSIC_DB_READ) { // Open a database file in the root directory. @@ -388,23 +388,25 @@ fread(buffer, 1, size, fp); // Read the data from the buffer. - if (irivnavi_serialize(&pmpmi->db, buffer, 0) == 0) { + if (irivnavi_serialize(&db, buffer, 0) == 0) { ret = PMPERR_INCONSISTENCY; goto error_exit; } // Free the buffer and file. free(buffer); + buffer = NULL; fclose(fp); + fp = NULL; // - pmpmi->num_records = pmpmi->db.num_records; + pmpmi->num_records = db.num_records; pmpmi->records = (pmp_music_record_t*)ucs2malloc(sizeof(pmp_music_record_t) * pmpmi->num_records); for (i = 0, j = 0;i < pmpmi->num_records;++i) { size_t length = 0; ucs2char_t* tmp = NULL; - const record_t* src = &pmpmi->db.records[i]; + const record_t* src = &db.records[i]; pmp_music_record_t* dst = &pmpmi->records[j]; pmplib_record_init(dst); @@ -438,13 +440,13 @@ ++j; } } - irivnavi_finish(&pmpmi->db); + irivnavi_finish(&db); return 0; error_exit: free(buffer); if (fp) fclose(fp); - irivnavi_finish(&pmpmi->db); + irivnavi_finish(&db); return ret; } @@ -452,6 +454,7 @@ { int i, j; pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; + irivnavi_t db; result_t ret = 0; FILE *fp = NULL; ucs2char_t filename[MAX_PATH]; @@ -459,15 +462,11 @@ static const ucs2char_t ucs2cs_unknown[] = {'u','n','k','n','o','w','n',0}; static const ucs2char_t m3u_ext[] = {'.','m','3','u',0}; - irivnavi_init(&pmpmi->db); + irivnavi_init(&db); if (music->pmp->flag & PMPOF_MUSIC_DB_WRITE) { - // Clear the database. - irivnavi_finish(&pmpmi->db); - irivnavi_init(&pmpmi->db); - // Initialize the record array. - if (irivnavi_init_records(&pmpmi->db, pmpmi->num_records) != 0) { + if (irivnavi_init_records(&db, pmpmi->num_records) != 0) { ret = PMPERR_INSUFFICIENTMEMORY; goto error_exit; } @@ -475,7 +474,7 @@ // Convert records from pmp_music_record_t to ip2db_record_t. for (i = 0, j = 0;i < pmpmi->num_records;++i) { const pmp_music_record_t* src = &pmpmi->records[i]; - record_t* dst = &pmpmi->db.records[j]; + record_t* dst = &db.records[j]; // Set record fields. record_init(dst); @@ -489,7 +488,7 @@ ++j; } - pmpmi->db.num_records = pmpmi->num_records; + db.num_records = pmpmi->num_records; // Open a database file in the root directory. ucs2cpy(filename, music->pmp->info.path_to_root); @@ -502,23 +501,23 @@ goto error_exit; } - irivnavi_update(&pmpmi->db); + irivnavi_update(&db); // Allocate a buffer that stores the whole data. - buffer = (uint8_t*)malloc(pmpmi->db.size); + buffer = (uint8_t*)malloc(db.size); if (!buffer) { ret = PMPERR_INSUFFICIENTMEMORY; goto error_exit; } // Write the data to the buffer. - if (irivnavi_serialize(&pmpmi->db, buffer, 1) == 0) { + if (irivnavi_serialize(&db, buffer, 1) == 0) { ret = PMPERR_INCONSISTENCY; goto error_exit; } // Write at one time. - fwrite(buffer, 1, pmpmi->db.size, fp); + fwrite(buffer, 1, db.size, fp); free(buffer); fclose(fp); @@ -550,13 +549,13 @@ } } - irivnavi_finish(&pmpmi->db); + irivnavi_finish(&db); return 0; error_exit: free(buffer); if (fp) fclose(fp); - irivnavi_finish(&pmpmi->db); + irivnavi_finish(&db); return ret; } @@ -592,11 +591,67 @@ } } -static result_t pmpmusic_dump(pmp_music_t* music, FILE *fp, int level) +static result_t pmpmusic_dump(pmp_music_t* music, FILE *fpo, int level) { + irivnavi_t db; + result_t ret = 0; + long size = 0; + FILE *fpi = NULL; + uint8_t *buffer = NULL; + ucs2char_t filename[MAX_PATH]; pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; - irivnavi_repr(&pmpmi->db, fp, level); - return 0; + + irivnavi_init(&db); + + // Open a database file in the root directory. + ucs2cpy(filename, music->pmp->info.path_to_root); + filepath_addslash(filename); + ucs2cat(filename, ucs2cs_irivnavi_idb); + fpi = ucs2fopen(filename, "rb"); + if (!fpi) { + return PMPERR_OPENFORREAD; + } + + // Obtain the stream size. + if (fseek(fpi, 0, SEEK_END) != 0) { + return PMPERR_OPENFORREAD; + } + if ((size = ftell(fpi)) == -1) { + return PMPERR_OPENFORREAD; + } + if (fseek(fpi, 0, SEEK_SET) != 0) { + return PMPERR_OPENFORREAD; + } + + // Allocate a buffer that stores the whole data. + buffer = (uint8_t*)malloc(size); + if (!buffer) { + ret = PMPERR_INSUFFICIENTMEMORY; + goto error_exit; + } + + // Read at one time. + fread(buffer, 1, size, fpi); + + // Read the data from the buffer. + if (irivnavi_serialize(&db, buffer, 0) == 0) { + ret = PMPERR_INCONSISTENCY; + goto error_exit; + } + + // Free the buffer and file. + free(buffer); + buffer = NULL; + fclose(fpi); + fpi = NULL; + + irivnavi_repr(&db, fpo, level); + +error_exit: + free(buffer); + if (fpi) fclose(fpi); + irivnavi_finish(&db); + return ret; } static result_t pmpmusic_set_playlists(pmp_music_t* music, const pmp_playlist_t* playlists, uint32_t num_playlists) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |