From 2dcc3e79305150081df2fd99b9fabd18292a843b Mon Sep 17 00:00:00 2001 From: sleepycatcoding <131554884+sleepycatcoding@users.noreply.github.com> Date: Fri, 14 Jul 2023 15:41:45 +0300 Subject: [PATCH] avm2: Add read_buffer and implement bytesAvailable --- core/src/avm2/globals/flash/net/Socket.as | 5 +---- core/src/avm2/globals/flash/net/socket.rs | 12 ++++++++++++ core/src/avm2/object/socket_object.rs | 7 +++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/core/src/avm2/globals/flash/net/Socket.as b/core/src/avm2/globals/flash/net/Socket.as index 2ab5108a7..c65d12eae 100644 --- a/core/src/avm2/globals/flash/net/Socket.as +++ b/core/src/avm2/globals/flash/net/Socket.as @@ -39,10 +39,7 @@ package flash.net { stub_method("flash.net.Socket", "close"); } - public function get bytesAvailable():uint { - stub_getter("flash.net.Socket", "bytesAvailable"); - return 0; - } + public native function get bytesAvailable():uint; public function get bytesPending():uint { stub_getter("flash.net.Socket", "bytesPending"); diff --git a/core/src/avm2/globals/flash/net/socket.rs b/core/src/avm2/globals/flash/net/socket.rs index 09bda4a0a..bddc99220 100644 --- a/core/src/avm2/globals/flash/net/socket.rs +++ b/core/src/avm2/globals/flash/net/socket.rs @@ -44,6 +44,18 @@ pub fn connect<'gc>( Ok(Value::Undefined) } +pub fn get_bytes_available<'gc>( + _activation: &mut Activation<'_, 'gc>, + this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error<'gc>> { + if let Some(socket) = this.as_socket() { + return Ok(socket.read_buffer().len().into()); + } + + Ok(Value::Undefined) +} + pub fn get_endian<'gc>( _activation: &mut Activation<'_, 'gc>, this: Object<'gc>, diff --git a/core/src/avm2/object/socket_object.rs b/core/src/avm2/object/socket_object.rs index ff93f104d..967e64beb 100644 --- a/core/src/avm2/object/socket_object.rs +++ b/core/src/avm2/object/socket_object.rs @@ -8,6 +8,7 @@ use gc_arena::barrier::unlock; use gc_arena::{lock::RefLock, Collect, Gc}; use gc_arena::{GcWeak, Mutation}; use std::cell::{Cell, Ref, RefCell, RefMut}; +use std::collections::VecDeque; use std::fmt; /// A class instance allocator that allocates ShaderData objects. @@ -24,6 +25,7 @@ pub fn socket_allocator<'gc>( // Default endianness is Big. endian: Cell::new(Endian::Big), handle: Cell::new(None), + read_buffer: RefCell::new(VecDeque::new()), write_buffer: RefCell::new(vec![]), }, )) @@ -77,6 +79,10 @@ impl<'gc> SocketObject<'gc> { self.0.handle.replace(Some(handle)) } + pub fn read_buffer(&self) -> RefMut<'_, VecDeque> { + self.0.read_buffer.borrow_mut() + } + pub fn write_bytes(&self, bytes: &[u8]) { self.0.write_buffer.borrow_mut().extend_from_slice(bytes) } @@ -96,6 +102,7 @@ pub struct SocketObjectData<'gc> { #[collect(require_static)] handle: Cell>, endian: Cell, + read_buffer: RefCell>, write_buffer: RefCell>, }