X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/5944f3d64f5675df6eb8bd82ab45cc5ad31504a7..03eb9c441bba9f41d36cfd8f2cf1d43a5ee42252:/src/uobject.c diff --git a/src/uobject.c b/src/uobject.c index a52a3ef..e271a67 100644 --- a/src/uobject.c +++ b/src/uobject.c @@ -1,15 +1,34 @@ +/* + * upkg: tool for manipulating Unreal Tournament packages. + * Copyright (C) 2009 Nick Bowler + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include #include #include #include -#include "uobject.h" +#include #include "upkg.h" #include "pack.h" -#define U_OBJECT_GET_PRIV(o) \ - G_TYPE_INSTANCE_GET_PRIVATE(o, U_OBJECT_TYPE, struct uobject_priv) +#define UOBJECT_GET_PRIV(o) \ + G_TYPE_INSTANCE_GET_PRIVATE(o, UOBJECT_TYPE, struct uobject_priv) enum { PROPERTY_BYTE = 1, @@ -42,6 +61,8 @@ struct uobject_priv { unsigned long nbuf; }; +G_DEFINE_TYPE(UObject, uobject, G_TYPE_OBJECT); + static unsigned long get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n) { @@ -74,7 +95,7 @@ get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n) static unsigned long decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long len) { - struct uobject_priv *priv = U_OBJECT_GET_PRIV(o); + struct uobject_priv *priv = UOBJECT_GET_PRIV(o); unsigned long real_size, rc; int type, size, top; GValue val = {0}; @@ -128,7 +149,7 @@ decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long /* Deserialize properties from an Unreal package. */ static int deserialize(UObject *o, struct upkg_file *f) { - struct uobject_priv *priv = U_OBJECT_GET_PRIV(o); + struct uobject_priv *priv = UOBJECT_GET_PRIV(o); unsigned long rc, tot_len = 0; while (1) { @@ -160,7 +181,7 @@ static int deserialize(UObject *o, struct upkg_file *f) break; } - rc = decode_property(U_OBJECT(o), name, f, len); + rc = decode_property(UOBJECT(o), name, f, len); if (rc == 0) return -1; len = rc; @@ -175,22 +196,54 @@ static int deserialize(UObject *o, struct upkg_file *f) return 0; } -int u_object_deserialize(GObject *obj, struct upkg_file *f) +int uobject_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx) +{ + g_return_val_if_fail(IS_UOBJECT(obj), -1); + UObject *uo = UOBJECT(obj); + struct upkg_file *f; + int rc; + + g_return_val_if_fail(uo->pkg_file == NULL, -1); + f = upkg_export_open(pkg, idx); + if (!f) { + return -1; + } + + rc = UOBJECT_GET_CLASS(obj)->deserialize(uo, f); + if (rc != 0) { + upkg_export_close(f); + } else { + uo->pkg = pkg; + uo->pkg_idx = idx; + uo->pkg_file = f; + } + + return rc; +} + +static void uobject_init(UObject *o) { - g_return_val_if_fail(IS_U_OBJECT(obj), -1); - U_OBJECT_GET_CLASS(obj)->deserialize(U_OBJECT(obj), f); + o->pkg = NULL; + o->pkg_file = NULL; + o->pkg_idx = 0; } -static void u_object_init(UObject *o) +static void uobject_finalize(GObject *o) { - struct uobject_priv *priv = U_OBJECT_GET_PRIV(o); + UObject *uo = UOBJECT(o); + + if (uo->pkg_file) { + upkg_export_close(uo->pkg_file); + } + + G_OBJECT_CLASS(uobject_parent_class)->finalize(o); } -static void u_object_class_init(UObjectClass *class) +static void uobject_class_init(UObjectClass *class) { g_type_class_add_private(class, sizeof (struct uobject_priv)); + GObjectClass *go = G_OBJECT_CLASS(class); class->deserialize = deserialize; + go->finalize = uobject_finalize; } - -G_DEFINE_TYPE(UObject, u_object, G_TYPE_OBJECT);