/* * 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 "upkg.h" #include "module.h" #include "serializable.h" #include "exportable.h" #include "music.h" void print_upkg_flags(const char *prefix, unsigned long flags) { if (flags & UPKG_FLAG_ALLOW_DOWNLOAD) printf("%sAllowDownload\n", prefix); if (flags & UPKG_FLAG_CLIENT_OPTIONAL) printf("%sClientOptional\n", prefix); if (flags & UPKG_FLAG_SERVER_ONLY) printf("%sServerOnly\n", prefix); if (flags & UPKG_FLAG_BROKEN_LINKS) printf("%sBrokenLinks\n", prefix); if (flags & UPKG_FLAG_INSECURE) printf("%sInsecure\n", prefix); if (flags & UPKG_FLAG_REQUIRED) printf("%sRequired\n", prefix); } void print_guid(unsigned char guid[static 16]) { for (unsigned i = 0; i < 16; i++) { printf("%02hhx", guid[i]); if (i == 15) putchar('\n'); else putchar(' '); } } int main(int argc, char **argv) { struct upkg *pkg; if (argc < 2) { fprintf(stderr, "usage: upkg file\n"); return EXIT_FAILURE; } if (module_init() != 0) return EXIT_FAILURE; pkg = upkg_fopen(argv[1]); if (!pkg) { fprintf(stderr, "failed to open package!\n"); return EXIT_FAILURE; } printf("Version: %u\n", pkg->version); printf("License: %u\n", pkg->license); printf("GUID: "); print_guid(pkg->guid); printf("Flags: %lx\n", pkg->flags); print_upkg_flags("\t", pkg->flags); printf("Names: %lu\n", pkg->name_count); for (unsigned long i = 0; i < pkg->name_count; i++) { printf("\t%s\n", upkg_get_name(pkg, i)); } printf("Exports: %lu\n", pkg->export_count); printf("Imports: %lu\n", pkg->import_count); GObject *music = u_music_new(); struct upkg_file *f = upkg_export_open(pkg, 0); upkg_deserialize(music, f); char name[256]; upkg_export_name(music, name, sizeof name); FILE *fp = fopen(name, "wb"); if (!fp) return EXIT_FAILURE; upkg_export(music, fp); fclose(fp); printf("Wrote %s\n", name); upkg_close(pkg); module_exit(); return 0; }