From: <ny...@us...> - 2006-12-25 15:15:35
|
Revision: 201 http://svn.sourceforge.net/pmplib/?rev=201&view=rev Author: nyaochi Date: 2006-12-25 07:15:36 -0800 (Mon, 25 Dec 2006) Log Message: ----------- Implemented pmpdb_write() interface for pmp_iriverplus3. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c trunk/pmplib/lib/pmp_iriverplus3/ip3db.c trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-25 14:33:57 UTC (rev 200) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2006-12-25 15:15:36 UTC (rev 201) @@ -84,7 +84,12 @@ switch (var->type) { case IP3DBVT_STRING: if (is_storing) { - p += (serialize_ucs2be_string_var(p, var->value.str, is_storing) + 1) * sizeof(ucs2char_t); + if (var->value.str) { + p += (serialize_ucs2be_string_var(p, var->value.str, is_storing) + 1) * sizeof(ucs2char_t); + } else { + ucs2char_t v = 0; + p += serialize_ucs2be(p, &v, is_storing); + } } else { p += (serialize_ucs2be_string_var_alloc(p, &var->value.str) + 1) * sizeof(ucs2char_t); } @@ -162,11 +167,13 @@ uint8_t *p = buffer; uint8_t *q = buffer + 0x00020000 - sizeof(uint32_t); + /* Serialize the header (with a dummy size for writing). */ p += serialize_uint32be(p, &list->size, is_storing); p += serialize_uint32be(p, &list->num_entries, is_storing); p += serialize_uint32be(p, &list->unknown1, is_storing); p += serialize_uint32be(p, &list->unknown2, is_storing); + /* Initialize fields when reading. */ if (!is_storing) { free(list->entries); list->entries = (dat_entry_t*)calloc(list->num_entries, sizeof(dat_entry_t)); @@ -175,12 +182,20 @@ } } + /* Serialize entries in this table. */ for (i = 0;i < list->num_entries;++i) { dat_entry_t* entry = &list->entries[i]; + entry->offset = (uint32_t)(p - buffer); /* compute the current offset address */ p += dat_entry_serialize(entry, p, q, is_storing); q -= sizeof(uint32_t); } + /* Write the final size when writing. */ + if (is_storing) { + uint32_t size = (uint32_t)(p - buffer); + serialize_uint32be(buffer, &size, is_storing); + } + return (size_t)(p - buffer); } Modified: trunk/pmplib/lib/pmp_iriverplus3/ip3db.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/ip3db.c 2006-12-25 14:33:57 UTC (rev 200) +++ trunk/pmplib/lib/pmp_iriverplus3/ip3db.c 2006-12-25 15:15:36 UTC (rev 201) @@ -163,6 +163,55 @@ return 0; } +result_t ip3db_write(ip3db_t* db, const ucs2char_t* datfn, const ucs2char_t* dicfn, const ucs2char_t* idxfn) +{ + FILE *fp = 0; + + free(db->dat_buffer); + free(db->idx_buffer); + + db->dat_size = 0x00040000; + //db->dat_buffer = (uint8_t*)calloc(db->dat_size, sizeof(uint8_t)); + db->dat_buffer = (uint8_t*)malloc(db->dat_size); + + if (dat_serialize(db->dat, db->dic, db->dat_buffer, 1) != 0) { + ip3db_finish(db); + return 1; + } + + if (dic_serialize(db->dic, db->dic_buffer, 1) != 0) { + ip3db_finish(db); + return 1; + } + + fp = ucs2fopen(datfn, "wb"); + if (!fp) { + return 1; + } + fwrite(db->dat_buffer, 1, db->dat_size, fp); + fclose(fp); + + /* + fp = ucs2fopen(dicfn, "rb"); + if (!fp) { + ip3db_finish(db); + return 1; + } + fread_all(fp, &db->dic_buffer, &db->dic_size); + fclose(fp); + + fp = ucs2fopen(idxfn, "rb"); + if (!fp) { + ip3db_finish(db); + return 1; + } + fread_all(fp, &db->idx_buffer, &db->idx_size); + fclose(fp); +*/ + + return 0; +} + result_t ip3db_dump(ip3db_t* db, FILE *fpo) { /* Dump db.dic */ Modified: trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c 2006-12-25 14:33:57 UTC (rev 200) +++ trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c 2006-12-25 15:15:36 UTC (rev 201) @@ -497,8 +497,12 @@ { pmpdb_internal_t* pmpdbi = (pmpdb_internal_t*)pmpdb->instance; pmp_internal_t* pmpi = (pmp_internal_t*)pmpdb->pmp->instance; - return PMP_NOTIMPLIMENTED; - //return ip2db_write(&pmpdbi->ip2db, pmpi->env.dat_filename, pmpi->env.idx_filename); + return ip3db_write( + &pmpdbi->ip3db, + pmpi->env.dat_filename, + pmpi->env.dic_filename, + pmpi->env.idx_filename + ); } static result_t pmpdb_set(pmpdb_t* pmpdb, const pmp_record_t* records, uint32_t num_records) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |