X-Git-Url: http://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/90b53df329f9a114770dccab6b7e41f9094dfac9..109a6cdf134bce9390c96cbb77531ec4f7eca08e:/src/engine/music.c?ds=sidebyside diff --git a/src/engine/music.c b/src/engine/music.c index 0c0cdf8..7d57bdb 100644 --- a/src/engine/music.c +++ b/src/engine/music.c @@ -2,8 +2,8 @@ #include #include -#include "serializable.h" #include "exportable.h" +#include "uobject.h" #include "music.h" #include "upkg.h" @@ -20,6 +20,12 @@ struct music_priv { unsigned long nbuf; }; +static void exportable_init(UObjectExportable *); + +G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, U_OBJECT_TYPE, 0, + G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_EXPORTABLE, exportable_init) +); + static int export(GObject *o, FILE *f) { struct music_priv *priv = MUSIC_GET_PRIV(o); @@ -27,6 +33,9 @@ static int export(GObject *o, FILE *f) unsigned char buf[1024]; + if (!priv->f) + return -1; + if (upkg_export_seek(priv->f, priv->base, SEEK_SET) != 0) return -1; @@ -45,17 +54,16 @@ static int export(GObject *o, FILE *f) static int export_name(GObject *o, char *buf, size_t n) { struct music_priv *priv = MUSIC_GET_PRIV(o); - - return snprintf(buf, n, "%s", priv->f->name); + return snprintf(buf, n, "%s", priv->f ? priv->f->name : ""); } -static void exportable_init(UPkgExportable *e) +static void exportable_init(UObjectExportable *e) { e->export = export; e->export_name = export_name; } -static int deserialize(GObject *o, struct upkg_file *f) +static int deserialize(UObject *o, struct upkg_file *f) { struct music_priv *priv = MUSIC_GET_PRIV(o); EngineMusic *m = ENGINE_MUSIC(o); @@ -63,14 +71,16 @@ static int deserialize(GObject *o, struct upkg_file *f) size_t rc; + U_OBJECT_CLASS(engine_music_parent_class)->deserialize(o, f); + priv->nbuf = upkg_export_read(f, priv->buf, sizeof priv->buf); priv->base = 0; /* Random field #1 */ - if (priv->nbuf - priv->base < 2) + if (priv->nbuf - priv->base < 1) return -1; // unpack_16_le(priv->buf+0); - priv->base += 2; + priv->base += 1; if (f->pkg->version > 61) { /* Random field #2 */ @@ -94,9 +104,9 @@ static int deserialize(GObject *o, struct upkg_file *f) return 0; } -static void serializable_init(UPkgSerializable *s) +void music_register(GTypeModule *m) { - s->deserialize = deserialize; + engine_music_register_type(m); } static void engine_music_init(EngineMusic *m) @@ -105,19 +115,13 @@ static void engine_music_init(EngineMusic *m) static void engine_music_class_init(EngineMusicClass *class) { + UObjectClass *uo = U_OBJECT_CLASS(class); + g_type_class_add_private(class, sizeof (struct music_priv)); -} -static void engine_music_class_finalize(EngineMusicClass *class) -{ + uo->deserialize = deserialize; } -G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, G_TYPE_OBJECT, 0, - G_IMPLEMENT_INTERFACE(UPKG_TYPE_SERIALIZABLE, serializable_init) - G_IMPLEMENT_INTERFACE(UPKG_TYPE_EXPORTABLE, exportable_init) -); - -void music_register(GTypeModule *m) +static void engine_music_class_finalize(EngineMusicClass *class) { - engine_music_register_type(m); }