From: <ny...@us...> - 2007-02-23 06:58:34
|
Revision: 386 http://svn.sourceforge.net/pmplib/?rev=386&view=rev Author: nyaochi Date: 2007-02-22 22:58:35 -0800 (Thu, 22 Feb 2007) Log Message: ----------- Compute the size of padded data automatically. Modified Paths: -------------- trunk/pmplib/lib/pmp_ipod/itunesdb.c trunk/pmplib/lib/pmp_ipod/itunesdb.h trunk/pmplib/lib/pmp_ipod/serialize.c Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-02-23 06:22:53 UTC (rev 385) +++ trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-02-23 06:58:35 UTC (rev 386) @@ -86,7 +86,6 @@ if (serialize_uint64le(sio, "unknown4", "%016llX", &mhbd->unknown4)) return 1; if (serialize_uint8_array(sio, "unknown5", "%02X ", mhbd->unknown5, sizeof(mhbd->unknown5))) return 1; if (serialize_uint8_array(sio, "language", "%c ", mhbd->language, sizeof(mhbd->language))) return 1; - if (serialize_uint8_array(sio, "unknown6", "%02X ", mhbd->unknown6, sizeof(mhbd->unknown6))) return 1; return 0; } @@ -118,7 +117,6 @@ chunk_mhsd_t* mhsd = (chunk_mhsd_t*)chunk->data; if (serialize_uint32le(sio, "type", "%d", &mhsd->type)) return 1; - if (serialize_uint8_array(sio, "unknown1", "%02X ", mhsd->unknown1, sizeof(mhsd->unknown1))) return 1; return 0; } @@ -145,7 +143,7 @@ { chunk_mhlt_t* mhlt = (chunk_mhlt_t*)chunk->data; - if (serialize_uint8_array(sio, "unknown1", "%02X ", mhlt->unknown1, sizeof(mhlt->unknown1))) return 1; + if (serialize_uint8(sio, "unknown", "%02X", &mhlt->unknown)) return 1; return 0; } @@ -276,7 +274,7 @@ { chunk_mhlp_t* mhlp = (chunk_mhlp_t*)chunk->data; - if (serialize_uint8_array(sio, "unknown1", "%02X ", mhlp->unknown1, sizeof(mhlp->unknown1))) return 1; + if (serialize_uint8(sio, "unknown", "%02X", &mhlp->unknown)) return 1; return 0; } @@ -315,7 +313,6 @@ if (serialize_uint16le(sio, "unk4", "%u", &mhyp->unk4)) return 1; if (serialize_uint16le(sio, "flag_podcast", "%u", &mhyp->flag_podcast)) return 1; if (serialize_uint32le(sio, "sort_order", "%u", &mhyp->sort_order)) return 1; - if (serialize_uint8_array(sio, "padding", "%02X ", mhyp->padding, sizeof(mhyp->padding))) return 1; return 0; } @@ -490,7 +487,7 @@ chunk_mhod_playlist_order_t* po = &mhod->data.po; if (serialize_uint32le(sio, "position", "%u", &po->position)) return 1; - if (serialize_uint8_array(sio, "padding", "%02X ", po->padding, sizeof(po->padding))) return 1; + if (serialize_uint8_array(sio, "unknown", "%02X ", po->unknown, sizeof(po->unknown))) return 1; return 0; } @@ -676,6 +673,13 @@ fprintf(sio->fp, "!unknown_chunk!\n"); } + /* Show padded data. */ + if (chunk->padding && chunk->padding_size) { + char msg[128]; + sprintf(msg, "padding (%d)", chunk->padding_size); + if (serialize_uint8_array(sio, msg, "%02X ", chunk->padding, chunk->padding_size)) return 1; + } + /* Show number of children */ serialize_indent(sio); fprintf(sio->fp, "#children: %d\n", chunk->num_children); @@ -696,8 +700,8 @@ int itunesdb_read(itunesdb_chunk_t* chunk, serializer_t* sio) { - uint32_t i; - size_t begin = serialize_tell(sio); + uint32_t i, next; + uint32_t begin = (uint32_t)serialize_tell(sio); const itunesdb_chunkdecl_t* decl = NULL; /* Read the chunk ID and header information */ @@ -714,17 +718,27 @@ } } + /* Determine the size of padded data for this chunk. */ if (strncmp(chunk->id, "mhod", 4) == 0) { - uint32_t next = begin + chunk->overall_size; - if (next < serialize_tell(sio)) { - fprintf(stderr, "WARNING: backward seeking.\n"); - } - serialize_seek(sio, next); + next = begin + chunk->overall_size; + chunk->padding_size = next - serialize_tell(sio); } else { - uint32_t next = begin + chunk->size; - if (next < serialize_tell(sio)) { - fprintf(stderr, "WARNING: backward seeking.\n"); + next = begin + chunk->size; + chunk->padding_size = next - serialize_tell(sio); + } + + /* Read the padded data. */ + if (0 < chunk->padding_size) { + chunk->padding = (uint8_t*)calloc(chunk->padding_size, sizeof(uint8_t)); + if (chunk->padding) { + if (serialize_uint8_array(sio, "padding", "%02X ", chunk->padding, chunk->padding_size)) return 1; } + } else if (chunk->padding_size < 0) { + /* For some reason, we read too much data for this chunk. */ + fprintf(stderr, "WARNING: backward seeking.\n"); + chunk->padding_size = 0; + chunk->padding = NULL; + /* Rewind to the correct position. */ serialize_seek(sio, next); } @@ -758,7 +772,7 @@ const itunesdb_chunkdecl_t* decl = NULL; /* Store the offset position of this chunk for the future use of rewind. */ - chunk->offset = serialize_tell(sio); + chunk->offset = (uint32_t)serialize_tell(sio); /* Write the chunk ID and header information. The overall_size may be incorrect at this moment. */ if (serialize_uint8_array(sio, "id", "%c ", chunk->id, sizeof(chunk->id))) return 1; @@ -772,7 +786,7 @@ } /* Pad 0x00 in the rest of file header. */ - for (i = serialize_tell(sio);i < chunk->offset + chunk->size;++i) { + for (i = (uint32_t)serialize_tell(sio);i < chunk->offset + chunk->size;++i) { serialize_uint8(sio, NULL, NULL, &zero); } @@ -787,10 +801,10 @@ chunk->overall_size = chunk->num_children; } else { /* chunk->overall_size represents the size in bytes of this chunk */ - chunk->overall_size = serialize_tell(sio) - chunk->offset; + chunk->overall_size = (uint32_t)serialize_tell(sio) - chunk->offset; } - offset = serialize_tell(sio); + offset = (uint32_t)serialize_tell(sio); serialize_seek(sio, chunk->offset + 2 * sizeof(uint32_t)); if (serialize_uint32le(sio, "overall_size", "%d", &chunk->overall_size)) return 1; serialize_seek(sio, offset); @@ -824,7 +838,7 @@ /* Store the string value. */ str->position = 1; - str->size = ucs2len(value) * sizeof(ucs2char_t); + str->size = (uint32_t)(ucs2len(value) * sizeof(ucs2char_t)); str->unknown = 1; str->value = ucs2ndup(value, 512); return 0; Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.h =================================================================== --- trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-02-23 06:22:53 UTC (rev 385) +++ trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-02-23 06:58:35 UTC (rev 386) @@ -34,16 +34,14 @@ uint64_t unknown4; uint8_t unknown5[26]; /* zero padded. */ uint8_t language[2]; /* e.g., "en", "ja" */ - uint8_t unknown6[32]; /* zero padded. */ } chunk_mhbd_t; typedef struct { uint32_t type; /* 1 (track list), 2 (playlist list), or 3 (podcast list). */ - uint8_t unknown1[16*5]; /* zero padded. */ } chunk_mhsd_t; typedef struct { - uint8_t unknown1[16*5]; /* zero padded. */ + uint8_t unknown; /* zero padded. */ } chunk_mhlt_t; typedef struct { @@ -124,7 +122,7 @@ } chunk_mhit_t; typedef struct { - uint8_t unknown1[16*5]; /* zero padded. */ + uint8_t unknown; /* zero padded. */ } chunk_mhlp_t; typedef struct { @@ -140,7 +138,6 @@ uint16_t unk4; uint16_t flag_podcast; uint32_t sort_order; - uint8_t padding[0x3C]; } chunk_mhyp_t; typedef struct { @@ -194,7 +191,7 @@ typedef struct { uint32_t position; - uint8_t padding[16]; + uint8_t unknown[16]; } chunk_mhod_playlist_order_t; typedef struct { @@ -217,15 +214,20 @@ uint32_t overall_size; void* data; + uint32_t num_children; /* This field does not exist in iTunesDB. */ struct tag_itunesdb_chunk* childlen; + + int32_t padding_size; + uint8_t* padding; + uint32_t offset; /* This field does not exist in iTunesDB. */ }; typedef struct { uint32_t type; const char* name; - size_t overall_size; + uint32_t overall_size; void (*finish)(itunesdb_chunk_t* chunk); int (*serialize)(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio); } itunesdb_mhoddecl_t; Modified: trunk/pmplib/lib/pmp_ipod/serialize.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/serialize.c 2007-02-23 06:22:53 UTC (rev 385) +++ trunk/pmplib/lib/pmp_ipod/serialize.c 2007-02-23 06:58:35 UTC (rev 386) @@ -267,7 +267,6 @@ return 0; } - int serialize_seek(serializer_t* sio, size_t offset) { sio->offset = offset; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |