3 #include <glib-object.h>
5 #include "exportable.h"
10 #define MUSIC_GET_PRIV(o) \
11 G_TYPE_INSTANCE_GET_PRIVATE(o, ENGINE_MUSIC_TYPE, struct music_priv)
19 unsigned char buf[2048];
23 static void exportable_init(UObjectExportable *);
25 G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, U_OBJECT_TYPE, 0,
26 G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_EXPORTABLE, exportable_init)
29 static int export(GObject *o, FILE *f)
31 struct music_priv *priv = MUSIC_GET_PRIV(o);
32 size_t left = priv->len, rc;
34 unsigned char buf[1024];
39 if (upkg_export_seek(priv->f, priv->base, SEEK_SET) != 0)
43 rc = upkg_export_read(priv->f, buf, MIN(left, sizeof buf));
46 if (fwrite(buf, 1, rc, f) != rc)
54 static int export_name(GObject *o, char *buf, size_t n)
56 struct music_priv *priv = MUSIC_GET_PRIV(o);
57 return snprintf(buf, n, "%s", priv->f ? priv->f->name : "");
60 static void exportable_init(UObjectExportable *e)
63 e->export_name = export_name;
66 static int deserialize(UObject *o, struct upkg_file *f)
68 struct music_priv *priv = MUSIC_GET_PRIV(o);
69 EngineMusic *m = ENGINE_MUSIC(o);
74 U_OBJECT_CLASS(engine_music_parent_class)->deserialize(o, f);
76 priv->nbuf = upkg_export_read(f, priv->buf, sizeof priv->buf);
80 if (priv->nbuf - priv->base < 1)
82 // unpack_16_le(priv->buf+0);
85 if (f->pkg->version > 61) {
87 if (priv->nbuf - priv->base < 4)
89 // unpack_32_le(priv->buf+2);
93 rc = upkg_decode_index(&size, priv->buf+priv->base, priv->nbuf-priv->base);
94 if (rc == 0 || size < 0)
100 priv->nbuf -= priv->base;
101 memmove(priv->buf, priv->buf+priv->base, priv->nbuf);
107 void music_register(GTypeModule *m)
109 engine_music_register_type(m);
112 static void engine_music_init(EngineMusic *m)
116 static void engine_music_class_init(EngineMusicClass *class)
118 UObjectClass *uo = U_OBJECT_CLASS(class);
120 g_type_class_add_private(class, sizeof (struct music_priv));
122 uo->deserialize = deserialize;
125 static void engine_music_class_finalize(EngineMusicClass *class)