+
+ tag = swf->firstTag;
+ asset_bundle_list_t*b = asset_bundles;
+ /* pass 2 */
+ while(tag) {
+ if(tag->id == ST_DOABC || tag->id == ST_RAWABC) {
+ asset_bundle_t*a = b->asset_bundle;
+ abc_file_t*abc = a->file;
+ swf_ResolveAssets(assets, abc);
+ if(deps && abc->name) {
+ deps_t*d = dict_lookup(deps, abc->name);
+ while(d) {
+ if(d->name) {
+ asset_bundle_t*other = dict_lookup(name2bundle, d->name);
+ list_append(a->dependencies, other);
+ }
+ d = d->next;
+ }
+ }
+ registry_add_asset(a);
+ import_code(abc, filename, 1, a);
+ b=b->next;
+ }
+ tag = tag->next;
+ }
+
+ dict_destroy(name2bundle);
+ list_free(asset_bundles);
+
+ //swf_FreeTags(swf); // FIXME: mem leak
+}
+
+void as3_import_swf(char*filename)
+{
+ reader_t reader;
+ reader_init_filereader2(&reader, filename);
+ as3_import_swf2(&reader, filename, 0);
+ reader.dealloc(&reader);
+}
+
+#ifdef HAVE_ZZIP
+typedef struct _catalog_state {
+ char*xml_filename;
+ char in_libraries;
+ char*library;
+ char*script;
+ dict_t*deps;
+ deps_t*current_deps;
+ dict_t*name2deps;
+ dict_t*id2script;
+ ZZIP_DIR*dir;
+} catalog_state_t;
+
+const char* fa(catalog_state_t*state, xmlattribute_t*attr, const char*name)
+{
+ while(attr) {
+ if(!strcmp(attr->name, name)) return attr->value;
+ attr = attr->next;
+ }
+ syntaxerror("error parsing %s: attribute %s missing", state->xml_filename, name);
+}
+
+void catalog_start_tag(xmlconsumer_t*c, char*name, xmlattribute_t*attr)
+{
+ catalog_state_t*state = (catalog_state_t*)c->internal;
+ if(!strcmp(name, "libraries")) {
+ state->in_libraries = 1;
+ } else if(!strcmp(name, "library")) {
+ state->library = strdup(fa(state, attr, "path"));
+ } else if(!strcmp(name, "script")) {
+ state->script = strdup(fa(state, attr, "name"));
+ } else if(!strcmp(name, "def")) {
+ dict_put(state->id2script, strdup(fa(state, attr, "id")), strdup(state->script));
+ } else if(!strcmp(name, "dep")) {
+ NEW(deps_t,d);
+ d->name = strdup(fa(state, attr, "id"));
+ d->next = state->current_deps;
+ state->current_deps = d;
+ }
+}
+void catalog_data(xmlconsumer_t*c, char*data, int len)
+{
+ catalog_state_t*state = (catalog_state_t*)c->internal;
+}
+void catalog_end_tag(xmlconsumer_t*c, char*name)
+{
+ catalog_state_t*state = (catalog_state_t*)c->internal;
+ if(!strcmp(name, "libraries")) {
+ state->in_libraries = 0;
+ } else if(!strcmp(name, "library")) {
+ ZZIP_FILE*file = zzip_file_open(state->dir, state->library, 0);
+
+ DICT_ITERATE_DATA(state->deps,deps_t*,deps) {
+ while(deps) {
+ char*script = dict_lookup(state->id2script, deps->name);
+ if(!script) {
+ //as3_warning("when importing %s: depencency %s referenced in catalog.xml, but not found.", state->xml_filename, deps->name);
+ }
+ deps->name = script;
+ deps = deps->next;
+ }
+ }
+
+ if(!file) {
+ as3_warning("when importing %s: %s referenced in catalog.xml, but not found.", state->xml_filename, state->library);
+ } else {
+ reader_t r;
+ reader_init_zzipreader(&r, file);
+ as3_import_swf2(&r, state->library, state->deps);
+ r.dealloc(&r);
+ zzip_file_close(file);
+ }
+ dict_destroy(state->deps);
+ state->deps = 0;
+ free(state->library);
+ state->library = 0;
+ } else if(!strcmp(name, "script")) {
+ dict_put(state->deps, state->script, state->current_deps);
+ free(state->script);
+ state->current_deps = 0;
+ state->script = 0;
+ }