]> git.draconx.ca Git - upkg.git/commitdiff
uobject: Make the relevant UPkg available to objects.
authorNick Bowler <nbowler@draconx.ca>
Wed, 16 May 2012 00:29:08 +0000 (20:29 -0400)
committerNick Bowler <nbowler@draconx.ca>
Wed, 16 May 2012 00:29:08 +0000 (20:29 -0400)
Instead of passing around raw "struct upkg" pointers, keep the
GTypeModule implementation around instead (which contains this
information).  This allows access to all package functions; in
particular, it allows access to the package name.

Modify implementations to get the raw "struct upkg" from the upkg_file
reference instead.

src/engine/music.gob
src/engine/texture.gob
src/uobject/uobject.c
src/uobject/uobject.h
src/upkg.c

index 3d1abdb19d0d444aa2a002969e6e730b81fa54f8..b4ed7d2db1724a22027ae4abe37862c84986d36f 100644 (file)
@@ -122,7 +122,7 @@ class Engine:Music from U:Object (dynamic)
                        return -1;
                pos += 1;
 
-               if (uo->pkg->version > 61) {
+               if (f->pkg->version > 61) {
                        /* Unknown field #2 */
                        if (buflen - pos < 4)
                                return -1;
index 8059c3adb9503bc149b6063a93ac28d108b84873..8e7bb4a54dc5be0fb93009bcf8f6486c7fc188a7 100644 (file)
@@ -52,7 +52,7 @@ struct engine_texture_data *decode_mipmap(UObject *uo)
        long datalen;
 
        buflen = upkg_export_read(f, buf, sizeof buf);
-       if (uo->pkg->version >= 63) {
+       if (f->pkg->version >= 63) {
                /*
                 * There's an offset to the end of the image data here; not
                 * clear why it's useful since it's implied by the very next
@@ -84,7 +84,7 @@ struct engine_texture_data *decode_mipmap(UObject *uo)
 
        /* At this point, the current file offset should match the one recorded
         * above. */
-       if (uo->pkg->version >= 63 && end_offset != (f->base + f->offset)) {
+       if (f->pkg->version >= 63 && end_offset != (f->base + f->offset)) {
                u_err(uo, "mipmap end offset does not match data size");
                goto err_free;
        }
index 47782922c5876ee84f93b1783c62ecaf0c02a9ce..df875b2ac8f608986bba0223602f90ee93190860 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <uobject/uobject.h>
 #include <uobject/module.h>
+#include <uobject/package.h>
 #include "upkg.h"
 #include "pack.h"
 
@@ -217,7 +218,7 @@ static unsigned long deserialize_property(UObject *uo, struct prop_head *head)
        unsigned long rc, len = 0;
        GValue val = {0};
 
-       rc = decode_prop_header(uo->pkg, head, priv->buf, priv->nbuf);
+       rc = decode_prop_header(uo->pkg_file->pkg, head, priv->buf, priv->nbuf);
        if (rc == 0)
                return 0;
        len += rc;
@@ -347,24 +348,27 @@ static char *get_obj_fullname(const struct upkg_export *e)
        return fullname;
 }
 
-int u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
+int u_object_deserialize(GObject *obj, GTypeModule *pkg, unsigned long idx)
 {
        g_return_val_if_fail(IS_U_OBJECT(obj), -1);
+       g_return_val_if_fail(IS_U_PKG(pkg), -1);
+
        UObject *uo = U_OBJECT(obj);
+       struct upkg *upkg = U_PKG(pkg)->pkg;
        const struct upkg_export *e;
        struct upkg_file *f;
        int rc;
 
        g_return_val_if_fail(uo->pkg_file == NULL, -1);
-       f = upkg_export_open(pkg, idx);
+       f = upkg_export_open(upkg, idx);
        if (!f) {
                return -1;
        }
 
-       uo->pkg      = pkg;
+       uo->pkg = pkg;
        uo->pkg_file = f;
 
-       e = upkg_get_export(pkg, idx);
+       e = upkg_get_export(upkg, idx);
        if (!e)
                return -1;
        uo->pkg_name = get_obj_fullname(e);
@@ -380,19 +384,21 @@ int u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
        return rc;
 }
 
-GObject *u_object_new_from_package(struct upkg *upkg, unsigned long idx)
+GObject *u_object_new_from_package(GTypeModule *pkg, unsigned long idx)
 {
+       g_return_val_if_fail(IS_U_PKG(pkg), NULL);
+
        const struct upkg_export *export;
        const char *class, *package;
        GObject *obj = NULL;
        GType type;
 
-       class = upkg_export_class(upkg, idx, &package);
+       class = upkg_export_class(U_PKG(pkg)->pkg, idx, &package);
 
        type = u_object_module_get_class(package, class);
        if (type) {
                obj = g_object_new(type, NULL);
-               if (u_object_deserialize(obj, upkg, idx) != 0) {
+               if (u_object_deserialize(obj, pkg, idx) != 0) {
                        g_object_unref(obj);
                        return NULL;
                }
index e0b22562beb25b5c2a6e3eb66d07cc72b77db424..00f742bd1d0b23a9696114d12cc73a8006aff911 100644 (file)
@@ -41,7 +41,7 @@ typedef struct UObjectClass UObjectClass;
 struct UObject {
        GObject parent;
 
-       struct upkg *pkg;
+       GTypeModule *pkg;
        struct upkg_file *pkg_file;
        char *pkg_name;
 };
@@ -54,9 +54,9 @@ struct UObjectClass {
 
 GType u_object_get_type(void);
 
-int u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx);
+int u_object_deserialize(GObject *obj, GTypeModule *pkg, unsigned long idx);
 
-GObject *u_object_new_from_package(struct upkg *pkg, unsigned long idx);
+GObject *u_object_new_from_package(GTypeModule *pkg, unsigned long idx);
 
 /* Logging helpers for UObject class implementations. */
 void u_vlog_full(GObject *o, GLogLevelFlags level, const char *fmt, va_list ap);
index 176eca9ca491adc39a62c4e62104e5ff1600a412..202876a9b7db37fb5e473219b063d069060b33e1 100644 (file)
@@ -290,7 +290,7 @@ static int object_info(GTypeModule *pkg, unsigned long idx)
                GObject *obj;
                unsigned n;
 
-               obj = u_object_new_from_package(upkg, idx);
+               obj = u_object_new_from_package(pkg, idx);
                if (!obj) {
                        fprintf(stderr, "%s: failed to load object.\n",
                                        progname);
@@ -391,11 +391,10 @@ static int export(GTypeModule *pkg, GObject *obj, unsigned idx)
 
 static int object_export(GTypeModule *pkg, unsigned long idx)
 {
-       struct upkg *upkg = U_PKG(pkg)->pkg;
        GObject *obj;
        int ret = -1;
 
-       obj = u_object_new_from_package(upkg, idx);
+       obj = u_object_new_from_package(pkg, idx);
        if (!obj) {
                fprintf(stderr, "%s: failed to load object.\n", progname);
                return -1;
@@ -419,7 +418,7 @@ int package_export(GTypeModule *pkg)
        int ret = 0;
 
        for (unsigned i = 0; i < upkg->export_count; i++) {
-               obj = u_object_new_from_package(upkg, i);
+               obj = u_object_new_from_package(pkg, i);
                if (U_OBJECT_IS_EXPORTABLE(obj) && export(pkg, obj, i) != 0) {
                        ret = -1;
                }