3 #include <glib-object.h>
5 #include "exportable.h"
11 #define MUSIC_GET_PRIV(o) \
12 G_TYPE_INSTANCE_GET_PRIVATE(o, ENGINE_MUSIC_TYPE, struct music_priv)
19 static void exportable_init(UObjectExportable *);
20 static void loadable_init(UObjectLoadable *);
22 G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, U_OBJECT_TYPE, 0,
23 G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_EXPORTABLE, exportable_init)
24 G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_LOADABLE, loadable_init)
27 static int load(GObject *o)
29 struct music_priv *priv = MUSIC_GET_PRIV(o);
32 g_return_val_if_fail(priv->f != NULL, -1);
34 if (upkg_export_seek(priv->f, 0, SEEK_SET) != 0) {
43 static void unload(GObject *o)
45 struct music_priv *priv = MUSIC_GET_PRIV(o);
46 g_return_if_fail(priv->loaded > 0);
51 static int export(GObject *o, FILE *f)
53 struct music_priv *priv = MUSIC_GET_PRIV(o);
54 unsigned char buf[1024];
56 if (!priv->f || upkg_export_seek(priv->f, 0, SEEK_SET) != 0)
59 while (!priv->f->eof) {
60 size_t rc = upkg_export_read(priv->f, buf, sizeof buf);
62 if (priv->f->eof) break;
66 if (fwrite(buf, 1, rc, f) != rc)
73 static int export_name(GObject *o, char *buf, size_t n)
75 struct music_priv *priv = MUSIC_GET_PRIV(o);
76 return snprintf(buf, n, "%s", priv->f ? priv->f->name : "");
79 static void exportable_init(UObjectExportable *e)
82 e->export_name = export_name;
85 static void loadable_init(UObjectLoadable *l)
91 static int deserialize(UObject *o, struct upkg_file *f)
93 struct music_priv *priv = MUSIC_GET_PRIV(o);
94 EngineMusic *m = ENGINE_MUSIC(o);
95 size_t rc, pos = 0, buflen;
96 unsigned char buf[32];
99 U_OBJECT_CLASS(engine_music_parent_class)->deserialize(o, f);
101 buflen = upkg_export_read(f, buf, sizeof buf);
103 /* Random field #1 */
104 if (buflen - pos < 1)
108 if (f->pkg->version > 61) {
109 /* Random field #2 */
110 if (buflen - pos < 4)
115 rc = upkg_decode_index(&size, buf+pos, buflen-pos);
116 if (rc == 0 || size < 0)
122 upkg_export_seek(f, 0, SEEK_SET);
129 void music_register(GTypeModule *m)
131 engine_music_register_type(m);
134 static void engine_music_init(EngineMusic *m)
136 struct music_priv *priv = MUSIC_GET_PRIV(m);
137 *priv = (struct music_priv){0};
140 static void engine_music_finalize(GObject *o)
142 struct music_priv *priv = MUSIC_GET_PRIV(o);
144 if (priv->loaded >= 1) {
150 static void engine_music_class_init(EngineMusicClass *class)
152 UObjectClass *uo = U_OBJECT_CLASS(class);
153 GObjectClass *go = G_OBJECT_CLASS(class);
154 g_type_class_add_private(class, sizeof (struct music_priv));
156 uo->deserialize = deserialize;
157 go->finalize = engine_music_finalize;
160 static void engine_music_class_finalize(EngineMusicClass *class)