diff --git a/CHANGELOG.md b/CHANGELOG.md index edf76cc36..88b336804 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Hex view for unknown tags was not scrollable - [#2269] Nullpointer on importing (ImportAssets) a character that does not exists +- Asking more than once for the same imported (ImportAssets) URL ## [21.0.1] - 2024-08-08 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 303464cf6..03bba0d39 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -2304,12 +2304,21 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * @param resolver URL resolver */ private synchronized void resolveImported(UrlResolver resolver) { + Map importedSwfs = new HashMap<>(); for (int p = 0; p < tags.size(); p++) { Tag t = tags.get(p); if (t instanceof ImportTag) { ImportTag importTag = (ImportTag) t; - SWF iSwf = resolver.resolveUrl(importTag.getUrl()); + String url = importTag.getUrl(); + + SWF iSwf; + if (importedSwfs.containsKey(url)) { + iSwf = importedSwfs.get(url); + } else { + iSwf = resolver.resolveUrl(url); + importedSwfs.put(url, iSwf); + } if (iSwf != null) { Map importedIdToNameMap = importTag.getAssets(); @@ -2327,7 +2336,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { SymbolClassTag sc = (SymbolClassTag) t2; for (int i = 0; i < sc.names.size(); i++) { importedClassToCharacter.put(sc.names.get(i), iSwf.getCharacter(sc.tags.get(i))); - importedClassSourceUrls.put(sc.names.get(i), importTag.getUrl()); + importedClassSourceUrls.put(sc.names.get(i), url); } } } @@ -2337,12 +2346,14 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { if (exportedNameToIdsMap.containsKey(importedName)) { int exportedId = exportedNameToIdsMap.get(importedName); if (iSwf.getCharacter(exportedId) == null) { - logger.log(Level.WARNING, "Imported character from URL {0} not found: exported id = {1}, exported name = {2}, imported id = {3}", new Object[]{importTag.getUrl(), exportedId, importedName, importedId}); + logger.log(Level.WARNING, "Imported character from URL {0} not found: exported id = {1}, exported name = {2}, imported id = {3}", new Object[]{url, exportedId, importedName, importedId}); continue; } importedCharacterSourceSwfs.put(importedId, iSwf); importedCharacterIds.put(importedId, exportedId); importedNameToCharacter.put(importedName, importedId); + } else { + logger.log(Level.WARNING, "Imported character from URL {0} not found: imported name = {1}, imported id = {2}", new Object[]{url, importedName, importedId}); } } }