From 76b8a4bf05701afcd1be69ff4490a7c6be431dc4 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Tue, 15 May 2012 20:29:08 -0400 Subject: [PATCH] uobject: Make the relevant UPkg available to objects. 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 | 2 +- src/engine/texture.gob | 4 ++-- src/uobject/uobject.c | 22 ++++++++++++++-------- src/uobject/uobject.h | 6 +++--- src/upkg.c | 7 +++---- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/engine/music.gob b/src/engine/music.gob index 3d1abdb..b4ed7d2 100644 --- a/src/engine/music.gob +++ b/src/engine/music.gob @@ -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; diff --git a/src/engine/texture.gob b/src/engine/texture.gob index 8059c3a..8e7bb4a 100644 --- a/src/engine/texture.gob +++ b/src/engine/texture.gob @@ -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; } diff --git a/src/uobject/uobject.c b/src/uobject/uobject.c index 4778292..df875b2 100644 --- a/src/uobject/uobject.c +++ b/src/uobject/uobject.c @@ -27,6 +27,7 @@ #include #include +#include #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; } diff --git a/src/uobject/uobject.h b/src/uobject/uobject.h index e0b2256..00f742b 100644 --- a/src/uobject/uobject.h +++ b/src/uobject/uobject.h @@ -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); diff --git a/src/upkg.c b/src/upkg.c index 176eca9..202876a 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -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; } -- 2.43.0