From 08c707caa65901ee7248176378f0a825f5acf3b1 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Thu, 2 Nov 2023 18:33:08 +0100 Subject: [PATCH] avm2: Implement NetConnection.close() --- .../avm2/globals/flash/net/NetConnection.as | 4 +- .../avm2/globals/flash/net/net_connection.rs | 15 +++++ .../swfs/avm2/netconnection_close/Test.as | 59 ++++++++++++++++++ .../swfs/avm2/netconnection_close/output.txt | 56 +++++++++++++++++ .../swfs/avm2/netconnection_close/test.fla | Bin 0 -> 4587 bytes .../swfs/avm2/netconnection_close/test.swf | Bin 0 -> 1265 bytes .../swfs/avm2/netconnection_close/test.toml | 1 + 7 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 tests/tests/swfs/avm2/netconnection_close/Test.as create mode 100644 tests/tests/swfs/avm2/netconnection_close/output.txt create mode 100644 tests/tests/swfs/avm2/netconnection_close/test.fla create mode 100644 tests/tests/swfs/avm2/netconnection_close/test.swf create mode 100644 tests/tests/swfs/avm2/netconnection_close/test.toml diff --git a/core/src/avm2/globals/flash/net/NetConnection.as b/core/src/avm2/globals/flash/net/NetConnection.as index 161e86795..8a8af6641 100644 --- a/core/src/avm2/globals/flash/net/NetConnection.as +++ b/core/src/avm2/globals/flash/net/NetConnection.as @@ -21,8 +21,6 @@ package flash.net { stub_method("flash.net.NetConnection", "call"); } - public function close():void { - stub_method("flash.net.NetConnection", "close"); - } + public native function close():void; } } diff --git a/core/src/avm2/globals/flash/net/net_connection.rs b/core/src/avm2/globals/flash/net/net_connection.rs index be93938a6..2b2778de2 100644 --- a/core/src/avm2/globals/flash/net/net_connection.rs +++ b/core/src/avm2/globals/flash/net/net_connection.rs @@ -43,3 +43,18 @@ pub fn connect<'gc>( Ok(Value::Undefined) } + +pub fn close<'gc>( + activation: &mut Activation<'_, 'gc>, + this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error<'gc>> { + let connection = this + .as_net_connection() + .expect("Must be NetConnection object"); + if let Some(previous_handle) = connection.set_handle(None) { + NetConnections::close(&mut activation.context, previous_handle); + } + + Ok(Value::Undefined) +} diff --git a/tests/tests/swfs/avm2/netconnection_close/Test.as b/tests/tests/swfs/avm2/netconnection_close/Test.as new file mode 100644 index 000000000..467fcacd5 --- /dev/null +++ b/tests/tests/swfs/avm2/netconnection_close/Test.as @@ -0,0 +1,59 @@ +package { + + import flash.display.MovieClip; + import flash.net.NetConnection; + import flash.events.NetStatusEvent; + + + public class Test extends MovieClip { + + + public function Test() { + var connection:NetConnection = new NetConnection(); + connection.addEventListener(NetStatusEvent.NET_STATUS, onStatusChange); + + trace("/// connection.close()"); + connection.close(); + trace(""); + + trace("/// connection.connect(null)"); + connection.connect(null); + trace(""); + + trace("/// connection.connect(null)"); + connection.connect(null); + trace(""); + + trace("/// connection.close()"); + connection.close(); + trace(""); + + trace("/// connection.connect(\"http://example.org\")"); + connection.connect("http://example.org"); + trace(""); + + trace("/// connection.close()"); + connection.close(); + trace(""); + } + + function onStatusChange(event: NetStatusEvent) { + trace("-- NetStatusEvent.NET_STATUS event start --"); + trace("event.type = " + event.type); + trace("event.bubbles = " + event.bubbles); + trace("event.cancelable = " + event.cancelable); + + var keys = []; + for (var key in event.info) { + keys.push(key); + } + keys.sort(); + for each (var key in keys) { + trace("event.info." + key + " = " + event.info[key] + " (" + typeof(event.info[key]) + ")"); + } + + trace("-- NetStatusEvent.NET_STATUS event end --"); + } + } + +} diff --git a/tests/tests/swfs/avm2/netconnection_close/output.txt b/tests/tests/swfs/avm2/netconnection_close/output.txt new file mode 100644 index 000000000..95825e151 --- /dev/null +++ b/tests/tests/swfs/avm2/netconnection_close/output.txt @@ -0,0 +1,56 @@ +/// connection.close() + +/// connection.connect(null) +-- NetStatusEvent.NET_STATUS event start -- +event.type = netStatus +event.bubbles = false +event.cancelable = false +event.info.code = NetConnection.Connect.Success (string) +event.info.level = status (string) +-- NetStatusEvent.NET_STATUS event end -- + +/// connection.connect(null) +-- NetStatusEvent.NET_STATUS event start -- +event.type = netStatus +event.bubbles = false +event.cancelable = false +event.info.code = NetConnection.Connect.Closed (string) +event.info.level = status (string) +-- NetStatusEvent.NET_STATUS event end -- +-- NetStatusEvent.NET_STATUS event start -- +event.type = netStatus +event.bubbles = false +event.cancelable = false +event.info.code = NetConnection.Connect.Success (string) +event.info.level = status (string) +-- NetStatusEvent.NET_STATUS event end -- + +/// connection.close() +-- NetStatusEvent.NET_STATUS event start -- +event.type = netStatus +event.bubbles = false +event.cancelable = false +event.info.code = NetConnection.Connect.Closed (string) +event.info.level = status (string) +-- NetStatusEvent.NET_STATUS event end -- + +/// connection.connect("http://example.org") + +/// connection.close() +-- NetStatusEvent.NET_STATUS event start -- +event.type = netStatus +event.bubbles = false +event.cancelable = false +event.info.code = NetConnection.Connect.Closed (string) +event.info.level = status (string) +-- NetStatusEvent.NET_STATUS event end -- +-- NetStatusEvent.NET_STATUS event start -- +event.type = netStatus +event.bubbles = false +event.cancelable = false +event.info.code = (string) +event.info.description = (string) +event.info.details = (string) +event.info.level = status (string) +-- NetStatusEvent.NET_STATUS event end -- + diff --git a/tests/tests/swfs/avm2/netconnection_close/test.fla b/tests/tests/swfs/avm2/netconnection_close/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..c930cd722bbdf6e081fedd66dc7ba40e1e1729ba GIT binary patch literal 4587 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/netconnection_close/test.swf b/tests/tests/swfs/avm2/netconnection_close/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..8a455dea502d02239583330ac13c63ed945304e9 GIT binary patch literal 1265 zcmV)KmIf)c8>7PN)$eAk3Qfax_`DAiYlywK`ewjnI9 zDI3z&$V*(XjQ_U^a$za2D0x|FC@bpHimEIv%8Dw>mtsR?7`h9QW@tzo4K6g4Rdq>G zmzB%GBiKQ>Ygp#tM+ILXg$?P7k{_q7p`T0Zb$z?vFGH804Li_50hU+k%WLSW>G~ZF zZE2ooTe?OFrCvU0yZX-u+CI#iMCuLc0{E#Z;mUS*Z*O>~BMs33+Jolp=%8`vL1_;L zZr9f#hR+WMW_MTJaRQ_{I@~F5VTWj0hFYww7oJzktJT%jwMs=%woB{F>)Vyp>RM^J zS}cazkA@D}%C6oex((Qj|G;)BbjViot=ASF*_&9O7q`ommFK0k+gWd*IL{UO);=_< zzT4?{!PEQz5~VgXL#c>NeSKBy2AQ`1t*~pMLpI}63c40LWOM(IOdq5W&Kq-~)6F9- z4KBeg0hH*ov$HpM9wi zd%!kefD$3XumaE44x_v7z6DFR=QWImFbARpW+}Oj19g&D>_w&Vs@^Cz zzON@W!{`%#YXu0Ww~L@p}F96Z9B^kcDWCLh94vB zX&ujoEcD!LSGvJ&yJ6Td_K|NiU`lAuqm))O@^*kx7D&?fW7>{ zoDL6kGIh3wJ@_nkv12XAbXl((w4V%ey0|im^(Cnw%PSK3eL$8oJJJR9ybCj<{<`N| z2tFNkmczBy`U#7IJA*U}i~o2OwBsO%yMgeCg~0o_kUY3NHELfma;_o04ShCneH0H% zCl!heE}Iq>sBHElbcT+BRUQl9GkJwNF_Oj9wVYEompT^8GL@oIOp2RhXPH!l100Av zNVDmO=|}0uX(9b2ouLyv%|)VYEIyu?m`u*`6wT8t&y4XL&yPiUI>ys+o*w7v37$^! z^j)5w<>`AoosQn8qVv>!il?(Y^##u?@=T6r@;oE5VDM1khes@$iL!vASPIa1$51r3 zh$9+fPUNqNi;l&AqfX?L9q^L-h6BHHf1WlebL_-qYdrljl1tPg)M+gWu*qN(FO$S0 z)MC`FuIq7A#FM*o8wzJcvtzONA2_2YNAIzBI>gPKn(^b%Or4tJ19R@wOc3)2aP-$x zptGmu#F5S=697b8T#J2l^#1L;+9Xxr*r~tI&LUideOpTcf_zJG*#U08|E8z!j&q+K zV~Tg?)N$_ff%W@w?iqOn;W!C7Fm@r#m7%ec&rW0rns?;pwA`GLn|I}AN^Z`|O$Pt{ b2p)z{o5t`jr=uXe6v=G|zQV>oo8}bvB&u~l literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/netconnection_close/test.toml b/tests/tests/swfs/avm2/netconnection_close/test.toml new file mode 100644 index 000000000..dbee897f5 --- /dev/null +++ b/tests/tests/swfs/avm2/netconnection_close/test.toml @@ -0,0 +1 @@ +num_frames = 1