3 #include <glib-object.h>
5 #include "exportable.h"
8 #include "music-module.h"
12 #define MUSIC_GET_PRIV(o) \
13 G_TYPE_INSTANCE_GET_PRIVATE(o, ENGINE_MUSIC_TYPE, struct music_priv)
17 struct music_mod *mod;
21 static void exportable_init(UObjectExportable *);
22 static void loadable_init(UObjectLoadable *);
24 G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, U_OBJECT_TYPE, 0,
25 G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_EXPORTABLE, exportable_init)
26 G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_LOADABLE, loadable_init)
29 static int load(GObject *o)
31 struct music_priv *priv = MUSIC_GET_PRIV(o);
34 g_return_val_if_fail(priv->f != NULL, -1);
36 if (upkg_export_seek(priv->f, 0, SEEK_SET) != 0) {
40 priv->mod = music_mod_open(priv->f);
50 static void unload(GObject *o)
52 struct music_priv *priv = MUSIC_GET_PRIV(o);
53 g_return_if_fail(priv->loaded > 0);
55 if (--priv->loaded == 0) {
56 music_mod_close(priv->mod);
60 static int export(GObject *o, FILE *f)
62 struct music_priv *priv = MUSIC_GET_PRIV(o);
68 rc = music_mod_dump(priv->mod, f);
75 static int export_name(GObject *o, char *buf, size_t n)
77 struct music_priv *priv = MUSIC_GET_PRIV(o);
86 type = music_mod_type(priv->mod);
87 rc = snprintf(buf, n, "%s.%s", priv->f->name, type);
94 static void exportable_init(UObjectExportable *e)
97 e->export_name = export_name;
100 static void loadable_init(UObjectLoadable *l)
106 static int deserialize(UObject *o, struct upkg_file *f)
108 struct music_priv *priv = MUSIC_GET_PRIV(o);
109 size_t rc, pos = 0, buflen;
110 unsigned char buf[32];
113 U_OBJECT_CLASS(engine_music_parent_class)->deserialize(o, f);
115 buflen = upkg_export_read(f, buf, sizeof buf);
117 /* Random field #1 */
118 if (buflen - pos < 1)
122 if (f->pkg->version > 61) {
123 /* Random field #2 */
124 if (buflen - pos < 4)
129 rc = upkg_decode_index(&size, buf+pos, buflen-pos);
130 if (rc == 0 || size < 0)
136 upkg_export_seek(f, 0, SEEK_SET);
142 void music_register(GTypeModule *m)
144 engine_music_register_type(m);
147 static void engine_music_init(EngineMusic *m)
149 struct music_priv *priv = MUSIC_GET_PRIV(m);
150 *priv = (struct music_priv){0};
153 static void engine_music_finalize(GObject *o)
155 struct music_priv *priv = MUSIC_GET_PRIV(o);
157 if (priv->loaded >= 1) {
163 static void engine_music_class_init(EngineMusicClass *class)
165 UObjectClass *uo = U_OBJECT_CLASS(class);
166 GObjectClass *go = G_OBJECT_CLASS(class);
167 g_type_class_add_private(class, sizeof (struct music_priv));
169 uo->deserialize = deserialize;
170 go->finalize = engine_music_finalize;
175 static void engine_music_class_finalize(EngineMusicClass *class)