]> git.draconx.ca Git - upkg.git/commitdiff
upkg: Implement batch export.
authorNick Bowler <nbowler@draconx.ca>
Mon, 13 Jul 2009 00:17:12 +0000 (20:17 -0400)
committerNick Bowler <nbowler@draconx.ca>
Mon, 13 Jul 2009 00:17:12 +0000 (20:17 -0400)
src/upkg.c

index e104cc969081a2bbb55842fd08832dc7d05435f7..ed6d4dfdeaf8a9844d51e4f22d3a6eda1912699d 100644 (file)
@@ -38,9 +38,10 @@ enum {
 int verbose = 0;
 
 static const char *progname = "upkg";
-static const char *sopts = "ivVH";
+static const char *sopts = "ixvVH";
 static const struct option lopts[] = {
        { "info",     0, NULL, 'i' },
+       { "export",   0, NULL, 'x' },
        { "verbose",  0, NULL, 'v' },
        { "version",  0, NULL, 'V' },
        { "help",     0, NULL, 'H' },
@@ -150,6 +151,60 @@ int package_info(struct upkg *pkg)
        return EXIT_SUCCESS;
 }
 
+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;
+
+       if (u_object_deserialize(obj, f) != 0) {
+               return -1;
+       }
+       u_object_export_name(obj, name, sizeof name);
+
+       printf("exporting %s to %s\n", upkg_export_name(pkg, idx), name);
+       of = fopen(name, "wb");
+       if (!of) {
+               perror(name);
+               return -1;
+       }
+
+       rc = u_object_export(obj, of);
+
+       if (fclose(of) != 0) {
+               perror(name);
+               return -1;
+       }
+
+       return rc;
+}
+
+int package_export(struct upkg *pkg)
+{
+       const char *class, *package;
+       GObject *obj;
+       GType type;
+       int rc = EXIT_SUCCESS;
+
+       for (unsigned i = 0; i < pkg->export_count; i++) {
+               class = upkg_export_class(pkg, i, &package);
+
+               type = module_get_class(package, class);
+               if (!type) continue;
+
+               obj = g_object_new(type, NULL);
+               if (U_OBJECT_IS_EXPORTABLE(obj)) {
+                       if (export(pkg, obj, i) != 0) {
+                               rc = EXIT_FAILURE;
+                       }
+               }
+               g_object_unref(obj);
+       }
+
+       return rc;
+}
+
 int main(int argc, char **argv)
 {
        struct upkg *pkg;
@@ -163,6 +218,9 @@ int main(int argc, char **argv)
                case 'i':
                        mode = MODE_INFO;
                        break;
+               case 'x':
+                       mode = MODE_EXPORT;
+                       break;
                case 'v':
                        verbose++;
                        break;
@@ -196,6 +254,9 @@ int main(int argc, char **argv)
        case MODE_INFO:
                rc = package_info(pkg);
                break;
+       case MODE_EXPORT:
+               rc = package_export(pkg);
+               break;
        }
 
        upkg_close(pkg);