From 58c9d2f2ccb69b331db1bcb8e04f74c2fab2ae2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 10 Nov 2024 13:38:52 +0100 Subject: [PATCH] AMF0 EcmaArray has dense and associative parts --- .../flash/amf/amf0/Amf0InputStream.java | 196 ++++++++++-------- .../flash/amf/amf0/Amf0OutputStream.java | 9 +- .../flash/amf/amf0/types/EcmaArrayType.java | 8 +- .../exporters/amf/amf0/Amf0Exporter.java | 16 +- .../importers/amf/amf0/Amf0Importer.java | 10 +- .../jpexs/decompiler/flash/sol/LsoTag.java | 2 +- .../testdata/sharedobjects/MyClass.as | 6 +- .../testdata/sharedobjects/sharedobjects.swf | Bin 21571 -> 21916 bytes .../sharedobjects/DOMDocument.xml | 61 ++++-- .../sharedobjects/META-INF/metadata.xml | 12 +- .../sharedobjects/bin/SymDepend.cache | Bin 64 -> 64 bytes src/com/jpexs/decompiler/flash/gui/Main.java | 84 ++++++-- .../gui/soleditor/SharedObjectsStorage.java | 12 +- 13 files changed, 273 insertions(+), 143 deletions(-) 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 8232bc3200fc4d41557f5229f1e2a7aa1709252b..f0603286c88882c9a95429f3932afb72f0f46866 100644 GIT binary patch delta 20471 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 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 4fcde481fb8d828e93439d66b2bcfd586a5cd1c6..4801afbc1ea435920c41c2819ba35d777b382ffd 100644 GIT binary patch literal 64 zcmYdiU|@K`&J85F7+4sj7!-gkCLrcv@X1e1aVjk-$ 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); }