|
From: <ny...@us...> - 2007-10-05 14:47:50
|
Revision: 420
http://pmplib.svn.sourceforge.net/pmplib/?rev=420&view=rev
Author: nyaochi
Date: 2007-10-05 07:47:54 -0700 (Fri, 05 Oct 2007)
Log Message:
-----------
Initial commit of ArtworkDB routines.
Added Paths:
-----------
trunk/pmplib/lib/pmp_ipod/artworkdb.c
trunk/pmplib/lib/pmp_ipod/artworkdb.h
Added: trunk/pmplib/lib/pmp_ipod/artworkdb.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/artworkdb.c (rev 0)
+++ trunk/pmplib/lib/pmp_ipod/artworkdb.c 2007-10-05 14:47:54 UTC (rev 420)
@@ -0,0 +1,375 @@
+/*
+ * ArtworkDB reader/writer/dumper.
+ *
+ * Copyright (c) 2005-2007 Naoaki Okazaki
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+/* $Id:$ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif/*HAVE_CONFIG_H*/
+
+#include <os.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif/*HAVE_STRING_H*/
+#include <pmplib/ucs2char.h>
+
+#include "status.h"
+#include "ipod.h"
+#include "serialize.h"
+#include "util.h"
+#include "artworkdb.h"
+
+static void chunk_finish(artworkdb_chunk_t* chunk)
+{
+ free(chunk->data);
+ free(chunk->padding);
+ memset(chunk, 0, sizeof(*chunk));
+}
+
+static int mhfd_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhfd_t* mhfd = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhfd", 4);
+ chunk->size = 132;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhfd = (artworkdb_mhfd_t*)calloc(1, sizeof(artworkdb_mhfd_t));
+ if (def && mhfd) {
+ mhfd->unknown1 = 0;
+ mhfd->version = 2; /* iTunes 4.9 or above */
+ mhfd->num_children = 0; /* to be filled */
+ mhfd->unknown3 = 0;
+ mhfd->next_nhii = 0;
+ mhfd->unknown5 = 0;
+ mhfd->unknown6 = 0;
+ mhfd->unknown7 = 2;
+ mhfd->unknown8 = 0;
+ mhfd->unknown9 = 0;
+ mhfd->unknown10 = 0;
+ mhfd->unknown11 = 0;
+ }
+ chunk->data = mhfd;
+ return mhfd ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhfd_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhfd_t* mhfd = (artworkdb_mhfd_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "unknown1", "%d", &mhfd->unknown1)) return ret;
+ if (ret = serialize_uint32le(sio, "version", "%d", &mhfd->version)) return ret;
+ if (ret = serialize_uint32le(sio, "num_children", "%d", &mhfd->num_children)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown3", "%d", &mhfd->unknown3)) return ret;
+ if (ret = serialize_uint32le(sio, "next_nhii", "%d", &mhfd->next_nhii)) return ret;
+ if (ret = serialize_uint64le(sio, "unknown5", "%016llX", &mhfd->unknown5)) return ret;
+ if (ret = serialize_uint64le(sio, "unknown6", "%016llX", &mhfd->unknown6)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown7", "%d", &mhfd->unknown7)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown8", "%d", &mhfd->unknown8)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown9", "%d", &mhfd->unknown9)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown10", "%d", &mhfd->unknown10)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown11", "%d", &mhfd->unknown10)) return ret;
+
+ return 0;
+}
+
+
+
+static mhsd_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhsd_t* mhsd = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhsd", 4);
+ chunk->size = 96;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhsd = (artworkdb_mhsd_t*)calloc(1, sizeof(artworkdb_mhsd_t));
+ if (mhsd && def) {
+ mhsd->type = 0; /* to be filled */
+ }
+
+ chunk->data = mhsd;
+ return mhsd ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhsd_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhsd_t* mhsd = (artworkdb_mhsd_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "type", "%d", &mhsd->type)) return ret;
+
+ return 0;
+}
+
+
+
+static mhli_init(artworkdb_chunk_t* chunk, int def)
+{
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhli", 4);
+ chunk->size = 96;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ chunk->data = 0;
+ return 0;
+}
+
+static int mhli_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ return 0;
+}
+
+
+
+static int mhii_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhii_t* mhii = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhii", 4);
+ chunk->size = 104;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhii = (artworkdb_mhii_t*)calloc(1, sizeof(artworkdb_mhii_t));
+ if (def && mhii) {
+ mhii->num_children = 0;
+ mhii->id = 0;
+ mhii->song_id = 0;
+ mhii->unknown4 = 0;
+ mhii->rating = 0;
+ mhii->unknown6 = 0;
+ mhii->ts_file = 0;
+ mhii->ts_import = 0;
+ mhii->original_size = 0;
+ }
+ chunk->data = mhii;
+ return mhii ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhii_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhii_t* mhii = (artworkdb_mhii_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "num_children", "%d", &mhii->num_children)) return ret;
+ if (ret = serialize_uint32le(sio, "id", "%d", &mhii->id)) return ret;
+ if (ret = serialize_uint64le(sio, "song_id", "%016llX", &mhii->song_id)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown4", "%d", &mhii->unknown4)) return ret;
+ if (ret = serialize_uint32le(sio, "rating", "%d", &mhii->rating)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown6", "%d", &mhii->unknown6)) return ret;
+ if (ret = serialize_uint32le(sio, "ts_file", "%d", &mhii->ts_file)) return ret;
+ if (ret = serialize_uint32le(sio, "ts_import", "%d", &mhii->ts_import)) return ret;
+ if (ret = serialize_uint32le(sio, "original_size", "%d", &mhii->original_size)) return ret;
+
+ return 0;
+}
+
+
+static int mhni_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhni_t* mhni = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhni", 4);
+ chunk->size = 104;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhni = (artworkdb_mhni_t*)calloc(1, sizeof(artworkdb_mhni_t));
+ if (def && mhni) {
+ mhni->num_children = 0;
+ mhni->correlation_id = 0;
+ mhni->ithmb_offset = 0;
+ mhni->ithmb_size = 0;
+ mhni->vertical_padding = 0;
+ mhni->horizontal_padding = 0;
+ mhni->height = 0;
+ mhni->width = 0;
+ }
+ chunk->data = mhni;
+ return mhni ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhni_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhni_t* mhni = (artworkdb_mhni_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "num_children", "%d", &mhni->num_children)) return ret;
+ if (ret = serialize_uint32le(sio, "correlation_id", "%d", &mhni->correlation_id)) return ret;
+ if (ret = serialize_uint32le(sio, "ithmb_offset", "%d", &mhni->ithmb_offset)) return ret;
+ if (ret = serialize_uint32le(sio, "ithmb_size", "%d", &mhni->ithmb_size)) return ret;
+ if (ret = serialize_uint16le(sio, "vertical_padding", "%d", &mhni->vertical_padding)) return ret;
+ if (ret = serialize_uint16le(sio, "horizontal_padding", "%d", &mhni->horizontal_padding)) return ret;
+ if (ret = serialize_uint16le(sio, "height", "%d", &mhni->height)) return ret;
+ if (ret = serialize_uint16le(sio, "width", "%d", &mhni->width)) return ret;
+ if (ret = serialize_uint32le(sio, "unknown", "%d", &mhni->unknown)) return ret;
+ if (ret = serialize_uint32le(sio, "image_size", "%d", &mhni->image_size)) return ret;
+
+ return 0;
+}
+
+
+
+static int mhba_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhba_t* mhba = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhba", 4);
+ chunk->size = 104;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhba = (artworkdb_mhba_t*)calloc(1, sizeof(artworkdb_mhba_t));
+ if (def && mhba) {
+ }
+ chunk->data = mhba;
+ return mhba ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhba_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhba_t* mhba = (artworkdb_mhba_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "num_mhod", "%d", &mhba->num_mhod)) return ret;
+ if (ret = serialize_uint32le(sio, "num_mhia", "%d", &mhba->num_mhia)) return ret;
+ if (ret = serialize_uint32le(sio, "playlist_id", "%d", &mhba->playlist_id)) return ret;
+ if (ret = serialize_uint32le(sio, "unk2", "%d", &mhba->unk2)) return ret;
+ if (ret = serialize_uint16le(sio, "unk3", "%d", &mhba->unk3)) return ret;
+ if (ret = serialize_uint8(sio, "album_type", "%d", &mhba->album_type)) return ret;
+ if (ret = serialize_uint8(sio, "play_music", "%d", &mhba->play_music)) return ret;
+ if (ret = serialize_uint8(sio, "repeat", "%d", &mhba->repeat)) return ret;
+ if (ret = serialize_uint8(sio, "random", "%d", &mhba->random)) return ret;
+ if (ret = serialize_uint8(sio, "show_titles", "%d", &mhba->show_titles)) return ret;
+ if (ret = serialize_uint8(sio, "transition_direction", "%d", &mhba->transition_direction)) return ret;
+ if (ret = serialize_uint32le(sio, "slide_duration", "%d", &mhba->slide_duration)) return ret;
+ if (ret = serialize_uint32le(sio, "transition_duration", "%d", &mhba->transition_duration)) return ret;
+ if (ret = serialize_uint32le(sio, "unk7", "%d", &mhba->unk7)) return ret;
+ if (ret = serialize_uint32le(sio, "unk8", "%d", &mhba->unk8)) return ret;
+ if (ret = serialize_uint64le(sio, "dbid2", "%016llX", &mhba->dbid2)) return ret;
+ if (ret = serialize_uint32le(sio, "prev_playlist_id", "%d", &mhba->prev_playlist_id)) return ret;
+
+ return 0;
+}
+
+
+
+static mhia_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhia_t* mhia = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhia", 4);
+ chunk->size = 96;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhia = (artworkdb_mhia_t*)calloc(1, sizeof(artworkdb_mhia_t));
+ if (mhia && def) {
+ }
+
+ chunk->data = mhia;
+ return mhia ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhia_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhia_t* mhia = (artworkdb_mhia_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "unk1", "%d", &mhia->unk1)) return ret;
+ if (ret = serialize_uint32le(sio, "image_id", "%d", &mhia->image_id)) return ret;
+
+ return 0;
+}
+
+
+
+static mhlf_init(artworkdb_chunk_t* chunk, int def)
+{
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhlf", 4);
+ chunk->size = 96;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ chunk->data = 0;
+ return 0;
+}
+
+static int mhlf_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ return 0;
+}
+
+
+
+static mhif_init(artworkdb_chunk_t* chunk, int def)
+{
+ artworkdb_mhif_t* mhif = NULL;
+
+ if (def) {
+ memset(chunk, 0, sizeof(*chunk));
+ strncpy(chunk->id, "mhif", 4);
+ chunk->size = 96;
+ chunk->overall_size = 0; /* to be filled */
+ }
+
+ mhif = (artworkdb_mhif_t*)calloc(1, sizeof(artworkdb_mhif_t));
+ if (mhif && def) {
+ }
+
+ chunk->data = mhif;
+ return mhif ? 0 : IPODE_OUTOFMEMORY;
+}
+
+static int mhif_serialize(artworkdb_chunk_t* chunk, serializer_t* sio)
+{
+ int ret = 0;
+ artworkdb_mhif_t* mhif = (artworkdb_mhif_t*)chunk->data;
+
+ if (ret = serialize_uint32le(sio, "unknown1", "%d", &mhif->unknown1)) return ret;
+ if (ret = serialize_uint32le(sio, "correlation_id", "%d", &mhif->correlation_id)) return ret;
+ if (ret = serialize_uint32le(sio, "image_size", "%d", &mhif->image_size)) return ret;
+
+ return 0;
+}
+
Property changes on: trunk/pmplib/lib/pmp_ipod/artworkdb.c
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: trunk/pmplib/lib/pmp_ipod/artworkdb.h
===================================================================
--- trunk/pmplib/lib/pmp_ipod/artworkdb.h (rev 0)
+++ trunk/pmplib/lib/pmp_ipod/artworkdb.h 2007-10-05 14:47:54 UTC (rev 420)
@@ -0,0 +1,183 @@
+/*
+ * ArtworkDB reader/writer/dumper.
+ *
+ * Copyright (c) 2005-2007 Naoaki Okazaki
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+/* $Id:$ */
+
+#ifndef __ARTWORKDB_H__
+#define __ARTWORKDB_H__
+
+typedef struct {
+ uint32_t unknown1; /* always set to 0. */
+ uint32_t version; /* should be 2. */
+ uint32_t num_children; /* usually 3. */
+ uint32_t unknown3; /* always set to 0. */
+ uint32_t next_nhii;
+ uint64_t unknown5;
+ uint64_t unknown6;
+ uint32_t unknown7; /* always set to 2. */
+ uint32_t unknown8; /* always set to 0. */
+ uint32_t unknown9; /* always set to 0. */
+ uint32_t unknown10;
+ uint32_t unknown11;
+} artworkdb_mhfd_t;
+
+typedef struct {
+ uint32_t type; /* 1 (image list), 2 (album list), or 3 (file list). */
+} artworkdb_mhsd_t;
+
+typedef struct {
+ uint8_t unknown; /* zero padded. */
+} artworkdb_mhli_t;
+
+typedef struct {
+ uint32_t num_children;
+ uint32_t id;
+ uint64_t song_id;
+ uint32_t unknown4;
+ uint32_t rating;
+ uint32_t unknown6;
+ uint32_t ts_file;
+ uint32_t ts_import;
+ uint32_t original_size;
+} artworkdb_mhii_t;
+
+typedef struct {
+ uint32_t num_children;
+ uint32_t correlation_id;
+ uint32_t ithmb_offset;
+ uint32_t ithmb_size;
+ uint16_t vertical_padding;
+ uint16_t horizontal_padding;
+ uint16_t height;
+ uint16_t width;
+ uint32_t unknown;
+ uint32_t image_size;
+} artworkdb_mhni_t;
+
+typedef struct {
+ uint32_t num_mhod;
+ uint32_t num_mhia;
+ uint32_t playlist_id;
+ uint32_t unk2;
+ uint16_t unk3;
+ uint8_t album_type;
+ uint8_t play_music;
+ uint8_t repeat;
+ uint8_t random;
+ uint8_t show_titles;
+ uint8_t transition_direction;
+ uint32_t slide_duration;
+ uint32_t transition_duration;
+ uint32_t unk7;
+ uint32_t unk8;
+ uint64_t dbid2;
+ uint32_t prev_playlist_id;
+} artworkdb_mhba_t;
+
+typedef struct {
+ uint32_t unk1;
+ uint32_t image_id;
+} artworkdb_mhia_t;
+
+typedef struct {
+ uint32_t unknown1;
+ uint32_t correlation_id;
+ uint32_t image_size;
+} artworkdb_mhif_t;
+
+typedef struct {
+ uint32_t length;
+ uint32_t encoding;
+ uint32_t unknown;
+ ucs2char_t* value;
+} artworkdb_mhod_ucs2string_t;
+
+typedef struct {
+ uint32_t length;
+ uint32_t encoding;
+ uint32_t unknown;
+ char* value;
+} artworkdb_mhod_utf8string_t;
+
+typedef struct {
+ uint16_t type;
+ uint16_t unk1;
+ union {
+ artworkdb_mhod_ucs2string_t ucs2str;
+ artworkdb_mhod_utf8string_t ucs8str;
+ } data;
+} artworkdb_mhod_t;
+
+
+struct tag_artworkdb_chunk {
+ int8_t id[4];
+ uint32_t size;
+ uint32_t overall_size;
+
+ void* data;
+
+ uint32_t num_children; /* This field does not exist in the actual database. */
+ struct tag_artworkdb_chunk* childlen;
+
+ int32_t padding_size;
+ uint8_t* padding;
+
+ uint32_t offset; /* This field does not exist in the actual database. */
+};
+
+typedef struct tag_artworkdb_chunk artworkdb_chunk_t;
+
+typedef struct {
+ uint32_t type;
+ const char* name;
+ uint32_t overall_size;
+ void (*finish)(artworkdb_chunk_t* chunk);
+ int (*serialize)(artworkdb_chunk_t* chunk, const char *name, serializer_t* sio);
+} albumartdb_mhoddecl_t;
+
+typedef struct {
+ const char* name;
+ int (*init)(artworkdb_chunk_t* chunk, int dataonly);
+ void (*finish)(artworkdb_chunk_t* chunk);
+ int (*serialize)(artworkdb_chunk_t* chunk, serializer_t* sio);
+} albumartdb_chunkdecl_t;
+
+int albumartdb_init(artworkdb_chunk_t* chunk, const char *identifer, const char *subtype);
+
+int albumartdb_ischunk(artworkdb_chunk_t* chunk, const char *name, const char *subtype);
+
+artworkdb_chunk_t* albumartdb_new_child(artworkdb_chunk_t* chunk);
+
+void albumartdb_finish(artworkdb_chunk_t* chunk);
+
+int albumartdb_set_mhod_ucs2string(artworkdb_chunk_t* chunk, const ucs2char_t* str);
+
+int albumartdb_get_mhod_ucs2string(artworkdb_chunk_t* chunk, ucs2char_t** str);
+
+int albumartdb_set_mhod_utf8string(artworkdb_chunk_t* chunk, const char* str);
+
+int albumartdb_get_mhod_utf8string(artworkdb_chunk_t* chunk, char** str);
+
+int albumartdb_repr(artworkdb_chunk_t* chunk, size_t index, serializer_t* sio);
+int albumartdb_read(artworkdb_chunk_t* chunk, serializer_t* sio);
+int albumartdb_write(artworkdb_chunk_t* chunk, serializer_t* sio);
+
+#endif/*__ARTWORKDB_H__*/
Property changes on: trunk/pmplib/lib/pmp_ipod/artworkdb.h
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|