diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java index 9b8885009..2f6fcae2a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java @@ -30,6 +30,7 @@ import com.jpexs.decompiler.flash.amf.amf3.Amf3InputStream; import com.jpexs.decompiler.flash.amf.amf3.NoSerializerExistsException; import com.jpexs.decompiler.flash.dumpview.DumpInfo; import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.exporters.amf.amf0.Amf0Exporter; import com.jpexs.helpers.Helper; import com.jpexs.helpers.MemoryInputStream; import java.io.DataInputStream; @@ -37,6 +38,7 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -322,93 +324,118 @@ public class Amf0InputStream extends InputStream { */ public Object readValue(String name) throws IOException, NoSerializerExistsException { newDumpLevel(name, "value-type"); - try { - int marker = readInternal(); - switch (marker) { - case Marker.NUMBER: - return readDouble("DOUBLE"); - case Marker.BOOLEAN: - return readU8("U8") > 0; - case Marker.STRING: - return readUtf8("UTF-8"); - case Marker.OBJECT_END: - return BasicType.OBJECT_END; - case Marker.OBJECT: - ObjectType object = new ObjectType(); - String propName; - Object val; + Object result = null; + int marker = readInternal(); + System.err.println("marker " + Integer.toHexString(marker)); + switch (marker) { + case Marker.NUMBER: + result = readDouble("DOUBLE"); + break; + case Marker.BOOLEAN: + result = readU8("U8") > 0; + break; + case Marker.STRING: + result = readUtf8("UTF-8"); + break; + case Marker.OBJECT_END: + result = BasicType.OBJECT_END; + break; + case Marker.OBJECT: + ObjectType object = new ObjectType(); + String propName; + Object val; - while (true) { - propName = readUtf8("propertyName"); - val = readValue("propertyValue"); - if (propName.equals("")) { - break; - } - object.properties.put(propName, val); - } - return object; - case Marker.MOVIECLIP: - throw new IllegalArgumentException("MovieClip not supported in AMF0"); - case Marker.NULL: - return BasicType.NULL; - case Marker.UNDEFINED: - return BasicType.UNDEFINED; - case Marker.REFERENCE: - return new ReferenceType(readU16("referenceIndex")); - case Marker.ECMA_ARRAY: - int associativeCount = (int) readU32("associative-count"); - EcmaArrayType ea = new EcmaArrayType(); - for (int a = 0; a < associativeCount; a++) { - String eaKey = readUtf8("key"); - Object eaVal = readValue("value"); - ea.values.put(eaKey, eaVal); + while (true) { + propName = readUtf8("propertyName"); + val = readValue("propertyValue"); + if (propName.equals("")) { + break; } - readUtf8("UTF-8-empty"); - readValue("object-end"); - - return ea; - case Marker.STRICT_ARRAY: - int arrayCount = (int) readU32("array-count"); - ArrayType at = new ArrayType(); - for (int a = 0; a < arrayCount; a++) { - at.values.add(readValue("value")); + object.properties.put(propName, val); + } + result = object; + break; + case Marker.MOVIECLIP: + throw new IllegalArgumentException("MovieClip not supported in AMF0"); + case Marker.NULL: + result = BasicType.NULL; + break; + case Marker.UNDEFINED: + result = BasicType.UNDEFINED; + break; + case Marker.REFERENCE: + result = new ReferenceType(readU16("referenceIndex")); + break; + case Marker.ECMA_ARRAY: + int associativeCount = (int) readU32("associative-count"); + System.err.println("associativeCount = " + associativeCount); + EcmaArrayType ea = new EcmaArrayType(); + for (int a = 0; a < associativeCount; a++) { + String eaKey = readUtf8("key"); + Object eaVal = readValue("value"); + ea.denseValues.put(eaKey, eaVal); + } + while (true) { + String eaKey = readUtf8("key"); + Object eaVal = readValue("value"); + if ("".equals(eaKey)) { + break; } - return at; - case Marker.DATE: - double dval = readDouble("epoch-millis"); - int timezone = readS16("time-zone"); - return new DateType(dval, timezone); - case Marker.LONG_STRING: - return readUtf8Long("long-string"); - case Marker.UNSUPPORTED: - throw new IllegalArgumentException("Unsupported type"); - case Marker.RECORDSET: - throw new IllegalArgumentException("RecordSet not supported in AMF0"); - case Marker.XML_DOCUMENT: - return new XmlDocumentType(readUtf8Long("xml")); - case Marker.TYPED_OBJECT: - String className = readUtf8("class-name"); - TypedObjectType typedObject = new TypedObjectType(); - typedObject.className = className; + ea.associativeValues.put(eaKey, eaVal); + } - while (true) { - propName = readUtf8("propertyName"); - val = readValue("propertyValue"); - if (propName.equals("")) { - break; - } - typedObject.properties.put(propName, val); + result = ea; + break; + case Marker.STRICT_ARRAY: + int arrayCount = (int) readU32("array-count"); + ArrayType at = new ArrayType(); + for (int a = 0; a < arrayCount; a++) { + at.values.add(readValue("value")); + } + result = at; + break; + case Marker.DATE: + double dval = readDouble("epoch-millis"); + int timezone = readS16("time-zone"); + result = new DateType(dval, timezone); + break; + case Marker.LONG_STRING: + result = readUtf8Long("long-string"); + break; + case Marker.UNSUPPORTED: + throw new IllegalArgumentException("Unsupported type"); + case Marker.RECORDSET: + throw new IllegalArgumentException("RecordSet not supported in AMF0"); + case Marker.XML_DOCUMENT: + return new XmlDocumentType(readUtf8Long("xml")); + case Marker.TYPED_OBJECT: + String className = readUtf8("class-name"); + TypedObjectType typedObject = new TypedObjectType(); + typedObject.className = className; + + while (true) { + propName = readUtf8("propertyName"); + val = readValue("propertyValue"); + if (propName.equals("")) { + break; } - return typedObject; - case Marker.AVMPLUS_OBJECT: - Amf3InputStream amf3 = new Amf3InputStream(is); - return amf3.readValue("avm-plus-object"); - default: - throw new IllegalArgumentException("Unsupported type"); - } - } finally { - endDumpLevel(); + typedObject.properties.put(propName, val); + } + result = typedObject; + break; + case Marker.AVMPLUS_OBJECT: + Amf3InputStream amf3 = new Amf3InputStream(is); + result = amf3.readValue("avm-plus-object"); + break; + default: + throw new IllegalArgumentException("Unsupported type"); } + + if (result != null) { + System.err.println("Read: " + Amf0Exporter.amfToString(result, 0, "\r\n", new ArrayList<>(), new HashMap<>(), new HashMap<>())); + } + endDumpLevel(); + return result; } public void resolveMapReferences(Map map) { @@ -439,8 +466,11 @@ public class Amf0InputStream extends InputStream { } if (value instanceof EcmaArrayType) { EcmaArrayType eat = (EcmaArrayType) value; - for (String key : eat.values.keySet()) { - eat.values.put(key, resolveReferences(eat.values.get(key), complexObjects)); + for (String key : eat.denseValues.keySet()) { + eat.denseValues.put(key, resolveReferences(eat.denseValues.get(key), complexObjects)); + } + for (String key : eat.associativeValues.keySet()) { + eat.associativeValues.put(key, resolveReferences(eat.associativeValues.get(key), complexObjects)); } } if (value instanceof ArrayType) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0OutputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0OutputStream.java index 53a8879da..bdc3d0e6a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0OutputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0OutputStream.java @@ -209,9 +209,12 @@ public class Amf0OutputStream extends OutputStream { } else if (value instanceof EcmaArrayType) { write(Marker.ECMA_ARRAY); EcmaArrayType ea = (EcmaArrayType) value; - writeU32(ea.values.size()); - for (String key : ea.values.keySet()) { - writeObjectProperty(key, ea.values.get(key), complexObjectsList); + writeU32(ea.denseValues.size()); + for (String key : ea.denseValues.keySet()) { + writeObjectProperty(key, ea.denseValues.get(key), complexObjectsList); + } + for (String key : ea.associativeValues.keySet()) { + writeObjectProperty(key, ea.associativeValues.get(key), complexObjectsList); } writeUtf8Empty(); write(Marker.OBJECT_END); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/types/EcmaArrayType.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/types/EcmaArrayType.java index a5d71f4d7..653eb7267 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/types/EcmaArrayType.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/types/EcmaArrayType.java @@ -26,7 +26,8 @@ import java.util.Map; * @author JPEXS */ public class EcmaArrayType implements ComplexObject { - public Map values = new LinkedHashMap<>(); + public Map denseValues = new LinkedHashMap<>(); + public Map associativeValues = new LinkedHashMap<>(); @Override public String toString() { @@ -35,6 +36,9 @@ public class EcmaArrayType implements ComplexObject { @Override public List getSubValues() { - return new ArrayList<>(values.values()); + List result = new ArrayList<>(); + result.addAll(denseValues.values()); + result.addAll(associativeValues.values()); + return result; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf0/Amf0Exporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf0/Amf0Exporter.java index 0e09e5872..0c3adfae7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf0/Amf0Exporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf0/Amf0Exporter.java @@ -129,7 +129,8 @@ public class Amf0Exporter { sb.append("{").append(newLine); sb.append(indent(level + 1)).append("\"type\": \"Object\",").append(newLine); sb.append(addId); - membersToString(sb, ot.properties, level + 1, newLine, processedObjects, referenceCount, objectAlias); + membersToString("members", sb, ot.properties, level + 1, newLine, processedObjects, referenceCount, objectAlias); + sb.append(newLine); sb.append(indent(level)).append("}"); return sb.toString(); } @@ -139,7 +140,10 @@ public class Amf0Exporter { sb.append("{").append(newLine); sb.append(indent(level + 1)).append("\"type\": \"EcmaArray\",").append(newLine); sb.append(addId); - membersToString(sb, eat.values, level + 1, newLine, processedObjects, referenceCount, objectAlias); + membersToString("denseValues", sb, eat.denseValues, level + 1, newLine, processedObjects, referenceCount, objectAlias); + sb.append(",").append(newLine); + membersToString("associativeValues", sb, eat.associativeValues, level + 1, newLine, processedObjects, referenceCount, objectAlias); + sb.append(newLine); sb.append(indent(level)).append("}"); return sb.toString(); } @@ -172,7 +176,8 @@ public class Amf0Exporter { sb.append(indent(level + 1)).append("\"type\": \"TypedObject\",").append(newLine); sb.append(addId); sb.append(indent(level + 1)).append("\"className\": \"").append(Helper.escapeActionScriptString(tot.className)).append("\",").append(newLine); - membersToString(sb, tot.properties, level + 1, newLine, processedObjects, referenceCount, objectAlias); + membersToString("members", sb, tot.properties, level + 1, newLine, processedObjects, referenceCount, objectAlias); + sb.append(newLine); sb.append(indent(level)).append("}"); return sb.toString(); } @@ -209,6 +214,7 @@ public class Amf0Exporter { } private static void membersToString( + String membersLabel, StringBuilder sb, Map members, int level, @@ -216,7 +222,7 @@ public class Amf0Exporter { List processedObjects, Map referenceCount, Map objectAlias) { - sb.append(indent(level)).append("\"members\": {").append(newLine); + sb.append(indent(level)).append("\"").append(membersLabel).append("\": {").append(newLine); boolean first = true; for (String key : members.keySet()) { if (!first) { @@ -227,7 +233,7 @@ public class Amf0Exporter { sb.append(amfToString(members.get(key), level + 1, newLine, processedObjects, referenceCount, objectAlias)); } sb.append(newLine); - sb.append(indent(level)).append("}").append(newLine); + sb.append(indent(level)).append("}"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java index 062b2898f..2e738fbb4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java @@ -395,7 +395,8 @@ public class Amf0Importer { case "EcmaArray": EcmaArrayType eat = new EcmaArrayType(); typedObject.resolve("members", objectTable, false); - eat.values = typedObject.getJsObject("members").getStringMapped(); + eat.denseValues = typedObject.getJsObject("denseValues").getStringMapped(); + eat.associativeValues = typedObject.getJsObject("associativeValues").getStringMapped(); resultObject = eat; break; case "Array": @@ -510,8 +511,11 @@ public class Amf0Importer { } } else if (object instanceof EcmaArrayType) { EcmaArrayType eat = (EcmaArrayType) object; - for (String key : eat.values.keySet()) { - eat.values.put(key, replaceReferences(eat.values.get(key), objectsTable)); + for (String key : eat.denseValues.keySet()) { + eat.denseValues.put(key, replaceReferences(eat.denseValues.get(key), objectsTable)); + } + for (String key : eat.associativeValues.keySet()) { + eat.associativeValues.put(key, replaceReferences(eat.associativeValues.get(key), objectsTable)); } } else if (object instanceof ArrayType) { ArrayType at = (ArrayType) object; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java index 2728c3a40..089c8bf7a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java @@ -81,7 +81,7 @@ public class LsoTag extends Tag { while (ais.available() > 0) { String varName = ais.readUtf8("varName"); try { - Object varValue = ais.readValue("varValue"); + Object varValue = ais.readValue("varValue"); amfValues.put(varName, varValue); } catch (NoSerializerExistsException ex) { throw new IllegalArgumentException("Serializer for class " + ex.getClassName() + " not found"); diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/MyClass.as b/libsrc/ffdec_lib/testdata/sharedobjects/MyClass.as index c22f60d52..78f3292b1 100644 --- a/libsrc/ffdec_lib/testdata/sharedobjects/MyClass.as +++ b/libsrc/ffdec_lib/testdata/sharedobjects/MyClass.as @@ -1,12 +1,8 @@ package { - public class MyClass { + public dynamic class MyClass { public var a:int = 1; public var b:int = 2; - public function MyClass() { - // constructor code - } - } } \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf index 8232bc320..f0603286c 100644 Binary files a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf and b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf differ diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml index ce8d7bf8b..d5950a1f3 100644 --- a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml +++ b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml @@ -18,6 +18,8 @@ import flash.events.MouseEvent; import flash.net.ObjectEncoding; import flash.xml.XMLDocument; import flash.net.registerClassAlias; +import flash.utils.ByteArray; +import flash.utils.Dictionary; var s:String = ""; for (var i = 0; i < 70000; i++) { @@ -41,6 +43,36 @@ reftest["c"] = reftest; registerClassAlias("MyClassAlias", MyClass); +var arr = ["a","b","c"]; +arr["akey"] = "hello"; + +var cls = new MyClass(); +cls["c"] = "dynamicValue" + +var ba = new ByteArray(); +ba.writeByte(0x12); +ba.writeByte(0x34); +ba.writeByte(0xAB); + +var vi:Vector. = new Vector.(); +vi.push(10); +vi.push(20); +vi.push(30); + +var di:Dictionary = new Dictionary(false); + +var key1:Object = { id: 1 }; +var key2:Object = { id: 2 }; + +di[key1] = "First"; +di[key2] = "Second"; + +var diso:SharedObject = SharedObject.getLocal("dict"); +diso.objectEncoding = ObjectEncoding.AMF3; +diso.data.mydict = di; +diso.flush(); + + var data = { mynumber : 1.5, mybool : true, @@ -48,14 +80,17 @@ var data = { myobj : {a:1, b:2}, mynull : null, myundefined : undefined, - myarray : ["a","b","c"], + myarray : arr, mydate : dt, mydate2 : dt, myref: reftest, mylongstring : s, myxml : xm, myxml2 : xm, - mytypedobject : new MyClass() + mytypedobject : cls, + mybytearray : ba, + myvectorint: vi, + mydictionary: di }; amf0test.data.tref = reftest; @@ -134,6 +169,17 @@ function fonLoad(event:MouseEvent):void { + + + + + + + + + + + @@ -143,16 +189,5 @@ function fonLoad(event:MouseEvent):void { - - - - - - - - - - - \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/META-INF/metadata.xml index c425966c0..0f4dfd91d 100644 --- a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/META-INF/metadata.xml +++ b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/META-INF/metadata.xml @@ -5,8 +5,8 @@ xmlns:xmp="http://ns.adobe.com/xap/1.0/"> Adobe Flash Professional CS6 - build 481 2024-11-03T09:46:34-08:00 - 2024-11-09T06:55:03-08:00 - 2024-11-09T06:55:03-08:00 + 2024-11-10T00:46:15-08:00 + 2024-11-10T00:46:15-08:00 @@ -15,7 +15,7 @@ - xmp.iid:10BB9B99AA9EEF11A208DFE3564218EE + xmp.iid:EAE3DCBBDD9EEF11A208DFE3564218EE xmp.did:329919207399EF119BABD30F3587D305 xmp.did:329919207399EF119BABD30F3587D305 @@ -32,6 +32,12 @@ 2024-11-03T09:46:34-08:00 Adobe Flash Professional CS6 - build 481 + + created + xmp.iid:EAE3DCBBDD9EEF11A208DFE3564218EE + 2024-11-03T09:46:34-08:00 + Adobe Flash Professional CS6 - build 481 + diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache index 4fcde481f..4801afbc1 100644 Binary files a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache and b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache differ diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 74b553f73..4ed108882 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -665,20 +665,46 @@ public class Main { private static void deleteCookiesAfterRun(File tempFile) { SharedObjectsStorage.removeChangedListener(tempFile, runCookieListener); - View.execInEventDispatchLater(new Runnable() { - public void run() { - File solDir = SharedObjectsStorage.getSolDirectoryForLocalFile(tempFile); - if (solDir == null) { - return; + File solDir = SharedObjectsStorage.getSolDirectoryForLocalFile(tempFile); + File origSolDir = runningSWF.getFile() == null ? null : SharedObjectsStorage.getSolDirectoryForLocalFile(new File(runningSWF.getFile())); + if (solDir != null) { + WatchKey foundKey = null; + for (WatchKey key : SharedObjectsStorage.watchedCookieDirectories.keySet()) { + if (SharedObjectsStorage.watchedCookieDirectories.get(key).equals(solDir)) { + foundKey = key; + break; } - if (solDir.exists()) { - for (File f : solDir.listFiles()) { - f.delete(); - } - solDir.delete(); - } + } + if (foundKey != null) { + SharedObjectsStorage.watchedCookieDirectories.remove(foundKey); } - }); + + View.execInEventDispatchLater(new Runnable() { + public void run() { + if (solDir.exists()) { + + if (origSolDir != null && origSolDir.exists()) { + for (File f : origSolDir.listFiles()) { + f.delete(); + } + + for (File f : solDir.listFiles()) { + try { + Files.copy(f.toPath(), origSolDir.toPath().resolve(f.getName()), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); + } catch (IOException ex) { + //ignored + } + } + } + + for (File f : solDir.listFiles()) { + f.delete(); + } + solDir.delete(); + } + } + }); + } synchronized (Main.class) { runCookieListener = null; } @@ -704,7 +730,7 @@ public class Main { } catch (IOException ex) { //ignored } - } + } } runCookieListener = new CookiesChangedListener() { @@ -727,7 +753,7 @@ public class Main { } catch (IOException ex) { //ignored } - } + } } }; SharedObjectsStorage.addChangedListener(tempFile, runCookieListener); @@ -1986,9 +2012,30 @@ public class Main { if (fileName != null) { Configuration.addRecentFile(fileName); SharedObjectsStorage.addChangedListener(new File(fileName), new CookiesChangedListener() { + + Timer timer; + @Override - public void cookiesChanged(File swfFile, List cookies) { - getMainFrame().getPanel().refreshTree(); + public void cookiesChanged(File swfFile, List cookies) { + if (timer != null) { + return; + } + + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + View.execInEventDispatchLater(new Runnable(){ + @Override + public void run() { + getMainFrame().getPanel().refreshTree(); + timer = null; + } + }); + + } + }, 500); + } }); if (watcher != null && Configuration.checkForModifications.get()) { @@ -2517,7 +2564,6 @@ public class Main { for (WatchEvent event : key.pollEvents()) { WatchEvent.Kind kind = event.kind(); if (kind == StandardWatchEventKinds.OVERFLOW) { - System.err.println("overflow"); continue; } @@ -2530,10 +2576,10 @@ public class Main { File dir = SharedObjectsStorage.watchedCookieDirectories.get(key); java.nio.file.Path child = dir.toPath().resolve(filename); File fullPath = child.toFile(); - + View.execInEventDispatchLater(new Runnable() { @Override - public void run() { + public void run() { SharedObjectsStorage.watchedDirectoryChanged(fullPath); } }); diff --git a/src/com/jpexs/decompiler/flash/gui/soleditor/SharedObjectsStorage.java b/src/com/jpexs/decompiler/flash/gui/soleditor/SharedObjectsStorage.java index f786add07..12dfdeaca 100644 --- a/src/com/jpexs/decompiler/flash/gui/soleditor/SharedObjectsStorage.java +++ b/src/com/jpexs/decompiler/flash/gui/soleditor/SharedObjectsStorage.java @@ -42,6 +42,8 @@ import java.util.regex.Pattern; */ public class SharedObjectsStorage { + public static boolean watchingPaused = false; + public static Map watchedCookieDirectories = new HashMap<>(); @@ -77,7 +79,6 @@ public class SharedObjectsStorage { try { WatchKey key = dir.toPath().register(Main.getWatcher(), StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); watchedCookieDirectories.put(key, dir); - //System.err.println("started monitoring " + dir.getAbsolutePath()); } catch (IOException ex) { //ignored //ex.printStackTrace(); @@ -348,11 +349,9 @@ public class SharedObjectsStorage { } public static void watchedDirectoryChanged(File file) { - //System.err.println("changed file: " + file.getAbsolutePath()); - if (!file.exists()) { - //System.err.println("no exist"); - //return; - } + if (watchingPaused) { + return; + } List swfFiles = new ArrayList<>(swfFileToListeners.keySet()); for (File swfFile : swfFiles) { @@ -379,6 +378,7 @@ public class SharedObjectsStorage { //System.err.println("- firing changed " + swfFile.getAbsolutePath()); List listeners = swfFileToListeners.get(swfFile); if (listeners != null) { + listeners = new ArrayList<>(listeners); for (CookiesChangedListener l:listeners) { l.cookiesChanged(swfFile, files); }