|
From: <ny...@us...> - 2007-02-21 17:36:25
|
Revision: 383
http://svn.sourceforge.net/pmplib/?rev=383&view=rev
Author: nyaochi
Date: 2007-02-21 09:36:23 -0800 (Wed, 21 Feb 2007)
Log Message:
-----------
Incremental commit: free allocated memory blocks.
Modified Paths:
--------------
trunk/pmplib/lib/pmp_ipod/ipod.c
trunk/pmplib/lib/pmp_ipod/itunesdb.c
trunk/pmplib/lib/pmp_ipod/itunesdb.h
trunk/pmplib/lib/pmp_ipod/pmp_ipod.c
trunk/pmplib/lib/pmp_ipod/serialize.c
trunk/pmplib/lib/pmp_ipod/serialize.h
Modified: trunk/pmplib/lib/pmp_ipod/ipod.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/ipod.c 2007-02-21 15:56:22 UTC (rev 382)
+++ trunk/pmplib/lib/pmp_ipod/ipod.c 2007-02-21 17:36:23 UTC (rev 383)
@@ -19,7 +19,7 @@
*
*/
-/* $Id:$ */
+/* $Id$ */
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -45,7 +45,7 @@
void ipod_finish(ipod_t* ipod)
{
-
+ itunesdb_finish(ipod->itunesdb);
}
result_t ipod_read(ipod_t* ipod, const ucs2char_t* itunesdb)
Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-02-21 15:56:22 UTC (rev 382)
+++ trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-02-21 17:36:23 UTC (rev 383)
@@ -19,7 +19,7 @@
*
*/
-/* $Id:$ */
+/* $Id$ */
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -38,6 +38,26 @@
#include "util.h"
#include "itunesdb.h"
+
+
+static void chunk_finish(itunesdb_chunk_t* chunk)
+{
+ free(chunk->data);
+ memset(chunk, 0, sizeof(*chunk));
+}
+
+static int mhbd_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhbd", 4);
+ chunk->size = sizeof(chunk_mhbd_t) + 12;
+ chunk->overall_size = chunk->size;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhbd_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhbd_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhbd_t* mhbd = (chunk_mhbd_t*)chunk->data;
@@ -45,10 +65,10 @@
if (serialize_uint32le(sio, "unknown1", "%d", &mhbd->unknown1)) return 1;
if (serialize_uint32le(sio, "version", "%d", &mhbd->version)) return 1;
if (serialize_uint32le(sio, "num_children", "%d", &mhbd->num_children)) return 1;
- if (serialize_uint64le(sio, "identifier", "%lX", &mhbd->identifier)) return 1;
+ if (serialize_uint64le(sio, "identifier", "%016llX", &mhbd->identifier)) return 1;
if (serialize_uint16le(sio, "unkonwn2", "%d", &mhbd->unknown2)) return 1;
if (serialize_uint16le(sio, "unkonwn3", "%d", &mhbd->unknown3)) return 1;
- if (serialize_uint64le(sio, "unknown4", "%lX", &mhbd->unknown4)) return 1;
+ 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;
@@ -56,6 +76,20 @@
return 0;
}
+
+
+static mhsd_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhsd", 4);
+ chunk->size = sizeof(chunk_mhsd_t) + 12;
+ chunk->overall_size = chunk->size;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhsd_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhsd_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhsd_t* mhsd = (chunk_mhsd_t*)chunk->data;
@@ -66,6 +100,20 @@
return 0;
}
+
+
+static mhlt_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhlt", 4);
+ chunk->size = 0; /* stands for number of children for "mhlt" chunk. */
+ chunk->overall_size = sizeof(chunk_mhlt_t) + 12;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhlt_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhlt_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhlt_t* mhlt = (chunk_mhlt_t*)chunk->data;
@@ -75,6 +123,20 @@
return 0;
}
+
+
+static mhit_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhit", 4);
+ chunk->size = sizeof(chunk_mhit_t) + 12;
+ chunk->overall_size = chunk->size;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhit_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhit_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhit_t* mhit = (chunk_mhit_t*)chunk->data;
@@ -108,7 +170,7 @@
if (serialize_uint32le(sio, "user_id", "%u", &mhit->user_id)) return 1;
if (serialize_uint32le(sio, "date_added", "%u", &mhit->date_added)) return 1;
if (serialize_uint32le(sio, "bookmark_time", "%u", &mhit->bookmark_time)) return 1;
- if (serialize_uint64le(sio, "dbid", "%X", &mhit->dbid)) return 1;
+ if (serialize_uint64le(sio, "dbid", "%016llX", &mhit->dbid)) return 1;
if (serialize_uint8(sio, "is_checked", "%u", &mhit->is_checked)) return 1;
if (serialize_uint8(sio, "rating_itunes", "%u", &mhit->rating_itunes)) return 1;
if (serialize_uint16le(sio, "bpm", "%u", &mhit->bpm)) return 1;
@@ -128,14 +190,14 @@
if (serialize_uint8(sio, "skip_when_shuffling", "%u", &mhit->skip_when_shuffling)) return 1;
if (serialize_uint8(sio, "remember_playback_position", "%u", &mhit->remember_playback_position)) return 1;
if (serialize_uint8(sio, "flag4", "%u", &mhit->flag4)) return 1;
- if (serialize_uint64le(sio, "dbid2", "%X", &mhit->dbid2)) return 1;
+ if (serialize_uint64le(sio, "dbid2", "%016llX", &mhit->dbid2)) return 1;
if (serialize_uint8(sio, "has_lyrics", "%u", &mhit->has_lyrics)) return 1;
if (serialize_uint8(sio, "is_movie", "%u", &mhit->is_movie)) return 1;
if (serialize_uint8(sio, "is_played", "%u", &mhit->is_played)) return 1;
if (serialize_uint8(sio, "unk17", "%u", &mhit->unk17)) return 1;
if (serialize_uint32le(sio, "unk21", "%u", &mhit->unk21)) return 1;
if (serialize_int32le(sio, "encoder_delay", "%d", &mhit->encoder_delay)) return 1;
- if (serialize_uint64le(sio, "num_samples", "%u", &mhit->num_samples)) return 1;
+ if (serialize_uint64le(sio, "num_samples", "%llu", &mhit->num_samples)) return 1;
if (serialize_uint32le(sio, "unk25", "%u", &mhit->unk25)) return 1;
if (serialize_int32le(sio, "padding_samples", "%d", &mhit->padding_samples)) return 1;
if (serialize_uint32le(sio, "unk27", "%u", &mhit->unk27)) return 1;
@@ -157,6 +219,20 @@
return 0;
}
+
+
+static mhlp_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhlp", 4);
+ chunk->size = 0; /* stands for number of children for "mhlt" chunk. */
+ chunk->overall_size = sizeof(chunk_mhlp_t) + 12;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhlp_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhlp_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhlp_t* mhlp = (chunk_mhlp_t*)chunk->data;
@@ -166,6 +242,20 @@
return 0;
}
+
+
+static mhyp_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhyp", 4);
+ chunk->size = sizeof(chunk_mhyp_t) + 12;
+ chunk->overall_size = chunk->size;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhyp_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhyp_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhyp_t* mhyp = (chunk_mhyp_t*)chunk->data;
@@ -177,7 +267,7 @@
if (serialize_uint8(sio, "flag_unkonwn2", "%u", &mhyp->flag_unkonwn2)) return 1;
if (serialize_uint8(sio, "flag_unkonwn3", "%u", &mhyp->flag_unkonwn3)) return 1;
if (serialize_uint32le(sio, "timestamp", "%u", &mhyp->timestamp)) return 1;
- if (serialize_uint64le(sio, "id", "%u", &mhyp->id)) return 1;
+ if (serialize_uint64le(sio, "id", "%016llX", &mhyp->id)) return 1;
if (serialize_uint32le(sio, "unk3", "%u", &mhyp->unk3)) return 1;
if (serialize_uint16le(sio, "unk4", "%u", &mhyp->unk4)) return 1;
if (serialize_uint16le(sio, "flag_podcast", "%u", &mhyp->flag_podcast)) return 1;
@@ -187,6 +277,20 @@
return 0;
}
+
+
+static mhip_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhip", 4);
+ chunk->size = sizeof(chunk_mhip_t) + 12;
+ chunk->overall_size = chunk->size;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhip_t));
+ return chunk->data ? 0 : 1;
+}
+
static int mhip_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhip_t* mhyp = (chunk_mhip_t*)chunk->data;
@@ -201,12 +305,20 @@
return 0;
}
+
+
+static void mhod_string_finish(itunesdb_chunk_t* chunk)
+{
+ chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
+ chunk_mhod_string_t* string = &mhod->data.str;
+ ucs2free(string->value);
+ memset(string, 0, sizeof(*string));
+}
+
static int mhod_string_serialize(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio)
{
chunk_mhod_string_t* string = &((chunk_mhod_t*)chunk->data)->data.str;
- if (serialize_uint32le(sio, "unk1", "%u", &string->unk1)) return 1;
- if (serialize_uint32le(sio, "unk2", "%u", &string->unk2)) return 1;
if (serialize_uint32le(sio, "position", "%u", &string->position)) return 1;
if (serialize_uint32le(sio, "size", "%u", &string->size)) return 1;
if (serialize_uint32le(sio, "unknown", "%u", &string->unknown)) return 1;
@@ -216,26 +328,38 @@
return 0;
}
+static void mhod_url_finish(itunesdb_chunk_t* chunk)
+{
+ chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
+ chunk_mhod_url_t* url = &mhod->data.url;
+ ucs2free(url->value);
+ memset(url, 0, sizeof(*url));
+}
+
static int mhod_url_serialize(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio)
{
chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
chunk_mhod_url_t* url = &mhod->data.url;
- if (serialize_uint32le(sio, "unk1", "%u", &url->unk1)) return 1;
- if (serialize_uint32le(sio, "unk2", "%u", &url->unk2)) return 1;
- if (serialize_utf8str_fixed(sio, name, "%s", &url->value, chunk->data_size - chunk->chunk_size)) return 1;
+ if (serialize_utf8str_fixed(sio, name, "%s", &url->value, chunk->size - chunk->overall_size)) return 1;
return 0;
}
+static void mhod_index_finish(itunesdb_chunk_t* chunk)
+{
+ chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
+ chunk_mhod_index_t* index = &mhod->data.index;
+ ucs2free(index->entries);
+ memset(index, 0, sizeof(*index));
+}
+
static int mhod_index_serialize(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio)
{
uint32_t i;
chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
chunk_mhod_index_t* index = &mhod->data.index;
- if (serialize_uint32le(sio, "unk1", "%u", &index->unk1)) return 1;
- if (serialize_uint32le(sio, "unk2", "%u", &index->unk2)) return 1;
if (serialize_uint32le(sio, "type", "%u", &index->type)) return 1;
if (serialize_uint32le(sio, "num_entries", "%u", &index->num_entries)) return 1;
if (serialize_uint8_array(sio, "padding", "%02X ", index->padding, sizeof(index->padding))) return 1;
@@ -257,16 +381,22 @@
return 0;
}
+static void mhod_playlist_column_finish(itunesdb_chunk_t* chunk)
+{
+ chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
+ chunk_mhod_playlist_column_t* pc = &mhod->data.pc;
+ ucs2free(pc->columns);
+ memset(pc, 0, sizeof(*pc));
+}
+
static int mhod_playlist_column_serialize(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio)
{
uint32_t i;
chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
chunk_mhod_playlist_column_t* pc = &mhod->data.pc;
- if (serialize_uint32le(sio, "unk1", "%u", &pc->unk1)) return 1;
- if (serialize_uint32le(sio, "unk2", "%u", &pc->unk2)) return 1;
if (serialize_uint32le(sio, "unk3", "%u", &pc->unk3)) return 1;
- if (serialize_uint64le(sio, "unk4", "%u", &pc->unk4)) return 1;
+ if (serialize_uint64le(sio, "unk4", "%016llX", &pc->unk4)) return 1;
if (serialize_uint32le(sio, "unk8", "%u", &pc->unk8)) return 1;
if (serialize_uint16le(sio, "unk9", "%u", &pc->unk9)) return 1;
if (serialize_uint16le(sio, "unk10", "%u", &pc->unk10)) return 1;
@@ -294,19 +424,24 @@
sprintf(fieldname, "columns[%d].sort_direction", i);
if (serialize_uint32le(sio, fieldname, "%u", &def->sort_direction)) return 1;
sprintf(fieldname, "columns[%d].padding", i);
- if (serialize_uint64le(sio, fieldname, "%u", &def->padding)) return 1;
+ if (serialize_uint64le(sio, fieldname, "%016llX", &def->padding)) return 1;
}
return 0;
}
+static void mhod_playlist_order_finish(itunesdb_chunk_t* chunk)
+{
+ chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
+ chunk_mhod_playlist_order_t* po = &mhod->data.po;
+ memset(po, 0, sizeof(*po));
+}
+
static int mhod_playlist_order_serialize(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio)
{
chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
chunk_mhod_playlist_order_t* po = &mhod->data.po;
- if (serialize_uint32le(sio, "unk1", "%u", &po->unk1)) return 1;
- if (serialize_uint32le(sio, "unk2", "%u", &po->unk2)) return 1;
if (serialize_uint32le(sio, "position", "%u", &po->position)) return 1;
if (serialize_uint8_array(sio, "padding", "%02X ", po->padding, sizeof(po->padding))) return 1;
@@ -316,23 +451,23 @@
static const itunesdb_mhoddecl_t* find_mhoddecl(itunesdb_chunk_t* chunk)
{
static const itunesdb_mhoddecl_t mds[] = {
- {1, "title", 0, mhod_string_serialize},
- {2, "location", 0, mhod_string_serialize},
- {3, "album", 0, mhod_string_serialize},
- {4, "artist", 0, mhod_string_serialize},
- {5, "genre", 0, mhod_string_serialize},
- {6, "filetype", 0, mhod_string_serialize},
- {7, "EQ setting", 0, mhod_string_serialize},
- {8, "comment", 0, mhod_string_serialize},
- {9, "category", 0, mhod_string_serialize},
- {12, "composer", 0, mhod_string_serialize},
- {13, "grouping", 0, mhod_string_serialize},
- {14, "description", 0, mhod_string_serialize},
- {15, "podcast_enclosure_url", 0, mhod_url_serialize},
- {16, "podcast_rss_url", 0, mhod_url_serialize},
- {52, "index", 0, mhod_index_serialize},
- {100, "playlist_column", 0x288, mhod_playlist_column_serialize},
- {100, "playlist_order", 0x2C, mhod_playlist_order_serialize},
+ {1, "title", 0, mhod_string_finish, mhod_string_serialize},
+ {2, "location", 0, mhod_string_finish, mhod_string_serialize},
+ {3, "album", 0, mhod_string_finish, mhod_string_serialize},
+ {4, "artist", 0, mhod_string_finish, mhod_string_serialize},
+ {5, "genre", 0, mhod_string_finish, mhod_string_serialize},
+ {6, "filetype", 0, mhod_string_finish, mhod_string_serialize},
+ {7, "EQ setting", 0, mhod_string_finish, mhod_string_serialize},
+ {8, "comment", 0, mhod_string_finish, mhod_string_serialize},
+ {9, "category", 0, mhod_string_finish, mhod_string_serialize},
+ {12, "composer", 0, mhod_string_finish, mhod_string_serialize},
+ {13, "grouping", 0, mhod_string_finish, mhod_string_serialize},
+ {14, "description", 0, mhod_string_finish, mhod_string_serialize},
+ {15, "podcast_enclosure_url", 0, mhod_url_finish, mhod_url_serialize},
+ {16, "podcast_rss_url", 0, mhod_url_finish, mhod_url_serialize},
+ {52, "index", 0, mhod_index_finish, mhod_index_serialize},
+ {100, "playlist_column", 0x288, mhod_playlist_column_finish, mhod_playlist_column_serialize},
+ {100, "playlist_order", 0x2C, mhod_playlist_order_finish, mhod_playlist_order_serialize},
{0, NULL, 0, NULL},
};
const itunesdb_mhoddecl_t* decl = mds;
@@ -340,7 +475,7 @@
while (decl->name) {
if (decl->type == mhod->type) {
- if (decl->chunk_size == 0 || decl->chunk_size == chunk->chunk_size) {
+ if (decl->overall_size == 0 || decl->overall_size == chunk->overall_size) {
return decl;
}
}
@@ -349,12 +484,36 @@
return NULL;
}
+static int mhod_init(itunesdb_chunk_t* chunk, int dataonly)
+{
+ if (!dataonly) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhod", 4);
+ chunk->size = 0x18;
+ chunk->overall_size = chunk->size;
+ }
+ chunk->data = calloc(1, sizeof(chunk_mhod_t));
+ return chunk->data ? 0 : 1;
+}
+
+static void mhod_finish(itunesdb_chunk_t* chunk)
+{
+ chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
+ const itunesdb_mhoddecl_t* decl = NULL;
+ decl = find_mhoddecl(chunk);
+ if (decl) {
+ decl->finish(chunk);
+ }
+}
+
static int mhod_serialize(itunesdb_chunk_t* chunk, serializer_t* sio)
{
chunk_mhod_t* mhod = (chunk_mhod_t*)chunk->data;
const itunesdb_mhoddecl_t* decl = NULL;
if (serialize_uint32le(sio, "type", "%u", &mhod->type)) return 1;
+ if (serialize_uint32le(sio, "unk1", "%u", &mhod->unk1)) return 1;
+ if (serialize_uint32le(sio, "unk2", "%u", &mhod->unk2)) return 1;
decl = find_mhoddecl(chunk);
if (decl) {
@@ -373,15 +532,15 @@
static const itunesdb_chunkdecl_t* find_chunkdecl(itunesdb_chunk_t* chunk)
{
static const itunesdb_chunkdecl_t cds[] = {
- {"mhbd", sizeof(chunk_mhbd_t), mhbd_serialize},
- {"mhsd", sizeof(chunk_mhsd_t), mhsd_serialize},
- {"mhlt", sizeof(chunk_mhlt_t), mhlt_serialize},
- {"mhit", sizeof(chunk_mhit_t), mhit_serialize},
- {"mhlp", sizeof(chunk_mhlp_t), mhlp_serialize},
- {"mhyp", sizeof(chunk_mhyp_t), mhyp_serialize},
- {"mhip", sizeof(chunk_mhip_t), mhip_serialize},
- {"mhod", sizeof(chunk_mhod_t), mhod_serialize},
- {NULL, 0, NULL},
+ {"mhbd", mhbd_init, chunk_finish, mhbd_serialize},
+ {"mhsd", mhsd_init, chunk_finish, mhsd_serialize},
+ {"mhlt", mhlt_init, chunk_finish, mhlt_serialize},
+ {"mhit", mhit_init, chunk_finish, mhit_serialize},
+ {"mhlp", mhlp_init, chunk_finish, mhlp_serialize},
+ {"mhyp", mhyp_init, chunk_finish, mhyp_serialize},
+ {"mhip", mhip_init, chunk_finish, mhip_serialize},
+ {"mhod", mhod_init, mhod_finish, mhod_serialize},
+ {NULL, NULL, NULL, NULL},
};
const itunesdb_chunkdecl_t* decl = cds;
@@ -394,6 +553,21 @@
return NULL;
}
+void itunesdb_finish(itunesdb_chunk_t* chunk)
+{
+ uint32_t i;
+ const itunesdb_chunkdecl_t* decl = NULL;
+
+ for (i = 0;i < chunk->num_children;++i) {
+ itunesdb_finish(&chunk->childlen[i]);
+ }
+
+ decl = find_chunkdecl(chunk);
+ if (decl) {
+ decl->finish(chunk);
+ }
+}
+
int itunesdb_repr(itunesdb_chunk_t* chunk, size_t index, serializer_t* sio)
{
uint32_t i;
@@ -409,9 +583,9 @@
serialize_indent(sio);
fprintf(sio->fp, "offset: %08X\n", chunk->offset);
serialize_indent(sio);
- fprintf(sio->fp, "data_size: %d\n", chunk->data_size);
+ fprintf(sio->fp, "size: %d\n", chunk->size);
serialize_indent(sio);
- fprintf(sio->fp, "chunk_size: %d\n", chunk->chunk_size);
+ fprintf(sio->fp, "overall_size: %d\n", chunk->overall_size);
/* Show fields in the chunk data */
decl = find_chunkdecl(chunk);
@@ -449,26 +623,25 @@
/* Read the chunk ID and header information */
chunk->offset = begin;
if (serialize_uint8_array(sio, "id", "%c ", chunk->id, sizeof(chunk->id))) return 1;
- if (serialize_uint32le(sio, "data_size", "%d", &chunk->data_size)) return 1;
- if (serialize_uint32le(sio, "chunk_size", "%d", &chunk->chunk_size)) return 1;
+ if (serialize_uint32le(sio, "size", "%d", &chunk->size)) return 1;
+ if (serialize_uint32le(sio, "overall_size", "%d", &chunk->overall_size)) return 1;
/* Read the chunk data if this chunk is 'known' */
decl = find_chunkdecl(chunk);
if (decl) {
- chunk->data = calloc(1, decl->data_size);
- if (chunk->data) {
+ if (decl->init(chunk, 1) == 0) {
if (decl->serialize(chunk, sio)) return 1;
}
}
if (strncmp(chunk->id, "mhod", 4) == 0) {
- uint32_t next = begin + chunk->chunk_size;
+ uint32_t next = begin + chunk->overall_size;
if (next < serialize_tell(sio)) {
fprintf(stderr, "WARNING: backward seeking.\n");
}
serialize_seek(sio, next);
} else {
- uint32_t next = begin + chunk->data_size;
+ uint32_t next = begin + chunk->size;
if (next < serialize_tell(sio)) {
fprintf(stderr, "WARNING: backward seeking.\n");
}
@@ -477,17 +650,17 @@
/* Read children for this chunk. */
if (strncmp(chunk->id, "mhlt", 4) == 0 || strncmp(chunk->id, "mhlp", 4) == 0) {
- /* chunk->chunk_size represents the number of children for "mhlt" and "mhlp" chunks */
- chunk->num_children = chunk->chunk_size;
+ /* chunk->overall_size represents the number of children for "mhlt" and "mhlp" chunks */
+ chunk->num_children = chunk->overall_size;
chunk->childlen = (itunesdb_chunk_t*)calloc(chunk->num_children, sizeof(itunesdb_chunk_t));
for (i = 0;i < chunk->num_children;++i) {
itunesdb_read(&chunk->childlen[i], sio);
}
} else {
- /* chunk->chunk_size represents the size in bytes of this chunk */
+ /* chunk->overall_size represents the size in bytes of this chunk */
chunk->num_children = 0;
chunk->childlen = NULL;
- while (sio->offset - begin < chunk->chunk_size) {
+ while (sio->offset - begin < chunk->overall_size) {
chunk->num_children;
chunk->childlen = realloc(chunk->childlen, sizeof(itunesdb_chunk_t) * (chunk->num_children + 1));
memset(&chunk->childlen[chunk->num_children], 0, sizeof(itunesdb_chunk_t));
@@ -498,29 +671,3 @@
return 0;
}
-
-#if 0
-int main(int argc, char *argv[])
-{
- FILE *fp = fopen("C:\\pmplib\\ipod_nano\\iPod_Control\\iTunes\\iTunesDB", "rb");
- if (fp) {
- serializer_t sio;
- uint8_t* buffer = NULL;
- long size = 0;
- itunesdb_chunk_t root;
-
- fread_all(fp, &buffer, &size);
- fclose(fp);
-
- serialize_init_read(&sio, buffer, (size_t)size);
- chunk_read(&root, &sio);
- serialize_finish(&sio);
-
- serialize_init_dump(&sio, stdout, 2);
- chunk_repr(&root, 0, &sio);
- serialize_finish(&sio);
- }
-
- return 0;
-}
-#endif
\ No newline at end of file
Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.h
===================================================================
--- trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-02-21 15:56:22 UTC (rev 382)
+++ trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-02-21 17:36:23 UTC (rev 383)
@@ -19,7 +19,7 @@
*
*/
-/* $Id:$ */
+/* $Id$ */
#ifndef __ITUNESDB_H__
#define __ITUNESDB_H__
@@ -153,8 +153,6 @@
} chunk_mhip_t;
typedef struct {
- uint32_t unk1;
- uint32_t unk2;
uint32_t position;
uint32_t size;
uint32_t unknown;
@@ -163,14 +161,10 @@
} chunk_mhod_string_t;
typedef struct {
- uint32_t unk1;
- uint32_t unk2;
char* value;
} chunk_mhod_url_t;
typedef struct {
- uint32_t unk1;
- uint32_t unk2;
uint32_t type;
uint32_t num_entries;
uint8_t padding[40];
@@ -199,14 +193,14 @@
} chunk_mhod_playlist_column_t;
typedef struct {
- uint32_t unk1;
- uint32_t unk2;
uint32_t position;
uint8_t padding[16];
} chunk_mhod_playlist_order_t;
typedef struct {
uint32_t type;
+ uint32_t unk1;
+ uint32_t unk2;
union {
chunk_mhod_string_t str;
chunk_mhod_url_t url;
@@ -219,8 +213,8 @@
struct tag_itunesdb_chunk {
int8_t id[4];
- uint32_t data_size;
- uint32_t chunk_size;
+ uint32_t size;
+ uint32_t overall_size;
void* data;
uint32_t num_children; /* This field does not exist in iTunesDB. */
@@ -231,17 +225,20 @@
typedef struct {
uint32_t type;
const char* name;
- size_t chunk_size;
+ size_t overall_size;
+ void (*finish)(itunesdb_chunk_t* chunk);
int (*serialize)(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio);
} itunesdb_mhoddecl_t;
typedef struct {
const char* name;
- size_t data_size;
+ int (*init)(itunesdb_chunk_t* chunk, int dataonly);
+ void (*finish)(itunesdb_chunk_t* chunk);
int (*serialize)(itunesdb_chunk_t* chunk, serializer_t* sio);
} itunesdb_chunkdecl_t;
-int itunesdb_repr(itunesdb_chunk_t* chunk, size_t index, serializer_t* sio);
-int itunesdb_read(itunesdb_chunk_t* chunk, serializer_t* sio);
+void itunesdb_finish(itunesdb_chunk_t* mhbd);
+int itunesdb_repr(itunesdb_chunk_t* mhbd, size_t index, serializer_t* sio);
+int itunesdb_read(itunesdb_chunk_t* mhbd, serializer_t* sio);
#endif/*__ITUNESDB_H__*/
Modified: trunk/pmplib/lib/pmp_ipod/pmp_ipod.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/pmp_ipod.c 2007-02-21 15:56:22 UTC (rev 382)
+++ trunk/pmplib/lib/pmp_ipod/pmp_ipod.c 2007-02-21 17:36:23 UTC (rev 383)
@@ -19,7 +19,7 @@
*
*/
-/* $Id:$ */
+/* $Id$ */
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -63,7 +63,7 @@
static const ipod_descriptor_t g_model_descriptions[] = {
{
- "ipod", "Apple", "iPod", "UM",
+ "apple_ipod", "Apple", "iPod", "UM",
"---", "---",
"iPod_Control\\iTunes\\iTunesDB",
".mp3\0",
Modified: trunk/pmplib/lib/pmp_ipod/serialize.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/serialize.c 2007-02-21 15:56:22 UTC (rev 382)
+++ trunk/pmplib/lib/pmp_ipod/serialize.c 2007-02-21 17:36:23 UTC (rev 383)
@@ -251,7 +251,7 @@
serialize_uint8(sio, name, format, (uint8_t*)&str[i]);
}
} else if (sio->mode < 0) {
- char* str = calloc(size+1, sizeof(char));
+ char* str = (char*)ucs2calloc(sizeof(char) * (size+1));
for (i = 0;i < size;++i) {
serialize_uint8(sio, name, format, (uint8_t*)&str[i]);
}
@@ -276,7 +276,7 @@
return 0;
}
-uint32_t serialize_tell(serializer_t* sio)
+size_t serialize_tell(serializer_t* sio)
{
return sio->offset;
}
Modified: trunk/pmplib/lib/pmp_ipod/serialize.h
===================================================================
--- trunk/pmplib/lib/pmp_ipod/serialize.h 2007-02-21 15:56:22 UTC (rev 382)
+++ trunk/pmplib/lib/pmp_ipod/serialize.h 2007-02-21 17:36:23 UTC (rev 383)
@@ -54,7 +54,7 @@
int serialize_utf8str_fixed(serializer_t* sio, const char *name, const char *format, char** value, size_t size);
int serialize_seek(serializer_t* sio, size_t offset);
-uint32_t serialize_tell(serializer_t* sio);
+size_t serialize_tell(serializer_t* sio);
void serialize_indent(serializer_t* sio);
void serialize_indent_ascend(serializer_t* sio);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|