]> git.draconx.ca Git - upkg.git/commitdiff
uobject: Take a package/index tuple instead of a upkg_file for deserialize.
authorNick Bowler <nbowler@draconx.ca>
Fri, 17 Jul 2009 20:10:04 +0000 (16:10 -0400)
committerNick Bowler <nbowler@draconx.ca>
Fri, 17 Jul 2009 20:10:04 +0000 (16:10 -0400)
src/uobject.c
src/uobject.h
src/upkg.c

index d58ba33eb68bd1c4500691083b9db6e1088e90a6..175a6243dc202d1c5ee84a7b3af25cfe20c7b49b 100644 (file)
@@ -61,6 +61,8 @@ struct uobject_priv {
        unsigned long nbuf;
 };
 
+G_DEFINE_TYPE(UObject, u_object, G_TYPE_OBJECT);
+
 static unsigned long
 get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n)
 {
@@ -194,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 u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
 {
        g_return_val_if_fail(IS_U_OBJECT(obj), -1);
-       return U_OBJECT_GET_CLASS(obj)->deserialize(U_OBJECT(obj), f);
+       UObject *uo = U_OBJECT(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 = U_OBJECT_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 u_object_init(UObject *o)
 {
-       struct uobject_priv *priv = U_OBJECT_GET_PRIV(o);
+       o->pkg      = NULL;
+       o->pkg_file = NULL;
+       o->pkg_idx  = 0;
+}
+
+static void u_object_finalize(GObject *o)
+{
+       UObject *uo = U_OBJECT(o);
+
+       if (uo->pkg_file) {
+               upkg_export_close(uo->pkg_file);
+       }
+
+       G_OBJECT_CLASS(u_object_parent_class)->finalize(o);
 }
 
 static void u_object_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       = u_object_finalize;
 }
-
-G_DEFINE_TYPE(UObject, u_object, G_TYPE_OBJECT);
index dc8e088769342676620551917af719c917ff0c03..efbe28ddf556f37083cbf78ceacabe67fde804cc 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <glib-object.h>
 #include "upkg.h"
-#include "avl.h"
 
 #define U_OBJECT_TYPE u_object_get_type()
 #define U_OBJECT(obj) \
@@ -41,6 +40,10 @@ typedef struct UObjectClass UObjectClass;
 
 struct UObject {
        GObject parent;
+
+       struct upkg *pkg;
+       struct upkg_file *pkg_file;
+       unsigned long pkg_idx;
 };
 
 struct UObjectClass {
@@ -54,6 +57,6 @@ GType u_object_get_type(void);
 const GValue *u_object_get_property(UObject *obj, const char *name);
 void u_object_set_property(UObject *obj, const char *name, const GValue *val);
 
-int u_object_deserialize(GObject *obj, struct upkg_file *f);
+int u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx);
 
 #endif
index 4a76fa2cdcbfaeb096daaf41d3f547371bd3e32d..ef44bf68e48a47934e43851a8a9d4ae53c4df480 100644 (file)
@@ -154,17 +154,15 @@ int package_info(struct upkg *pkg)
 
 static int export(struct upkg *pkg, GObject *obj, unsigned idx)
 {
-       struct upkg_file *f = upkg_export_open(pkg, idx);
        char name[256];
        FILE *of;
-       int rc = -1;
 
-       if (u_object_deserialize(obj, f) != 0) {
-               goto out;
+       if (u_object_deserialize(obj, pkg, idx) != 0) {
+               return -1;
        }
 
        if (U_OBJECT_IS_LOADABLE(obj) && u_object_load(obj) != 0) {
-               goto out;
+               return -1;
        }
 
        u_object_export_name(obj, name, sizeof name);
@@ -173,24 +171,21 @@ static int export(struct upkg *pkg, GObject *obj, unsigned idx)
        of = fopen(name, "wb");
        if (!of) {
                perror(name);
-               goto out;
+               return -1;
        }
 
-       rc = u_object_export(obj, of);
+       u_object_export(obj, of);
 
        if (fclose(of) != 0) {
                perror(name);
-               rc = -1;
-               goto out;
+               return -1;
        }
 
        if (U_OBJECT_IS_LOADABLE(obj)) {
                u_object_unload(obj);
        }
 
-out:
-       upkg_export_close(f);
-       return rc;
+       return 0;
 }
 
 int package_export(struct upkg *pkg)