avm1: Create simple XMLSocket stub
This commit is contained in:
parent
1c0426a747
commit
773168fe10
|
@ -61,6 +61,7 @@ pub(crate) mod transform;
|
||||||
mod video;
|
mod video;
|
||||||
pub(crate) mod xml;
|
pub(crate) mod xml;
|
||||||
mod xml_node;
|
mod xml_node;
|
||||||
|
pub(crate) mod xml_socket;
|
||||||
|
|
||||||
const GLOBAL_DECLS: &[Declaration] = declare_properties! {
|
const GLOBAL_DECLS: &[Declaration] = declare_properties! {
|
||||||
"trace" => method(trace; DONT_ENUM);
|
"trace" => method(trace; DONT_ENUM);
|
||||||
|
@ -576,6 +577,7 @@ pub fn create_globals<'gc>(
|
||||||
|
|
||||||
let video_proto = video::create_proto(context, object_proto, function_proto);
|
let video_proto = video::create_proto(context, object_proto, function_proto);
|
||||||
let netstream_proto = netstream::create_proto(context, object_proto, function_proto);
|
let netstream_proto = netstream::create_proto(context, object_proto, function_proto);
|
||||||
|
let xml_socket_proto = xml_socket::create_proto(context, object_proto, function_proto);
|
||||||
|
|
||||||
//TODO: These need to be constructors and should also set `.prototype` on each one
|
//TODO: These need to be constructors and should also set `.prototype` on each one
|
||||||
let object = object::create_object_object(context, object_proto, function_proto);
|
let object = object::create_object_object(context, object_proto, function_proto);
|
||||||
|
@ -669,6 +671,7 @@ pub fn create_globals<'gc>(
|
||||||
let boolean = boolean::create_boolean_object(context, boolean_proto, function_proto);
|
let boolean = boolean::create_boolean_object(context, boolean_proto, function_proto);
|
||||||
let date = date::create_constructor(context, object_proto, function_proto);
|
let date = date::create_constructor(context, object_proto, function_proto);
|
||||||
let netstream = netstream::create_class(context, netstream_proto, function_proto);
|
let netstream = netstream::create_class(context, netstream_proto, function_proto);
|
||||||
|
let xml_socket = xml_socket::create_class(context, xml_socket_proto, function_proto);
|
||||||
|
|
||||||
let flash = ScriptObject::new(gc_context, Some(object_proto));
|
let flash = ScriptObject::new(gc_context, Some(object_proto));
|
||||||
|
|
||||||
|
@ -1051,6 +1054,12 @@ pub fn create_globals<'gc>(
|
||||||
netstream.into(),
|
netstream.into(),
|
||||||
Attribute::DONT_ENUM,
|
Attribute::DONT_ENUM,
|
||||||
);
|
);
|
||||||
|
globals.define_value(
|
||||||
|
gc_context,
|
||||||
|
"XMLSocket",
|
||||||
|
xml_socket.into(),
|
||||||
|
Attribute::DONT_ENUM,
|
||||||
|
);
|
||||||
|
|
||||||
define_properties_on(GLOBAL_DECLS, context, globals, function_proto);
|
define_properties_on(GLOBAL_DECLS, context, globals, function_proto);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
use crate::avm1::function::FunctionObject;
|
||||||
|
use crate::avm1::object::{NativeObject, Object};
|
||||||
|
use crate::avm1::property_decl::define_properties_on;
|
||||||
|
use crate::avm1::{property_decl::Declaration, ScriptObject};
|
||||||
|
use crate::avm1::{Activation, Error, Executable, TObject, Value};
|
||||||
|
use crate::context::GcContext;
|
||||||
|
use crate::socket::SocketHandle;
|
||||||
|
use gc_arena::{Collect, GcCell, Mutation};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Collect)]
|
||||||
|
#[collect(require_static)]
|
||||||
|
struct XmlSocketData {
|
||||||
|
handle: Option<SocketHandle>,
|
||||||
|
/// Connection timeout in milliseconds.
|
||||||
|
timeout: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Collect)]
|
||||||
|
#[collect(no_drop)]
|
||||||
|
pub struct XmlSocket<'gc>(GcCell<'gc, XmlSocketData>);
|
||||||
|
|
||||||
|
impl<'gc> XmlSocket<'gc> {
|
||||||
|
pub fn handle(&self) -> Option<SocketHandle> {
|
||||||
|
self.0.read().handle
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_handle(
|
||||||
|
&self,
|
||||||
|
gc_context: &Mutation<'gc>,
|
||||||
|
handle: SocketHandle,
|
||||||
|
) -> Option<SocketHandle> {
|
||||||
|
std::mem::replace(&mut self.0.write(gc_context).handle, Some(handle))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const PROTO_DECLS: &[Declaration] = declare_properties! {};
|
||||||
|
|
||||||
|
pub fn constructor<'gc>(
|
||||||
|
activation: &mut Activation<'_, 'gc>,
|
||||||
|
this: Object<'gc>,
|
||||||
|
_args: &[Value<'gc>],
|
||||||
|
) -> Result<Value<'gc>, Error<'gc>> {
|
||||||
|
let xml_socket = XmlSocket(GcCell::new(
|
||||||
|
activation.gc(),
|
||||||
|
XmlSocketData {
|
||||||
|
handle: None,
|
||||||
|
/// Default timeout is 20_000 milliseconds (20 seconds)
|
||||||
|
timeout: 20000,
|
||||||
|
},
|
||||||
|
));
|
||||||
|
|
||||||
|
this.set_native(activation.gc(), NativeObject::XmlSocket(xml_socket));
|
||||||
|
|
||||||
|
Ok(this.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_proto<'gc>(
|
||||||
|
context: &mut GcContext<'_, 'gc>,
|
||||||
|
proto: Object<'gc>,
|
||||||
|
fn_proto: Object<'gc>,
|
||||||
|
) -> Object<'gc> {
|
||||||
|
let xml_socket_proto = ScriptObject::new(context.gc_context, Some(proto));
|
||||||
|
define_properties_on(PROTO_DECLS, context, xml_socket_proto, fn_proto);
|
||||||
|
xml_socket_proto.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_class<'gc>(
|
||||||
|
context: &mut GcContext<'_, 'gc>,
|
||||||
|
xml_socket_proto: Object<'gc>,
|
||||||
|
fn_proto: Object<'gc>,
|
||||||
|
) -> Object<'gc> {
|
||||||
|
FunctionObject::constructor(
|
||||||
|
context.gc_context,
|
||||||
|
Executable::Native(constructor),
|
||||||
|
constructor_to_fn!(constructor),
|
||||||
|
fn_proto,
|
||||||
|
xml_socket_proto,
|
||||||
|
)
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ use crate::avm1::globals::gradient_filter::GradientFilter;
|
||||||
use crate::avm1::globals::shared_object::SharedObject;
|
use crate::avm1::globals::shared_object::SharedObject;
|
||||||
use crate::avm1::globals::transform::TransformObject;
|
use crate::avm1::globals::transform::TransformObject;
|
||||||
use crate::avm1::globals::xml::Xml;
|
use crate::avm1::globals::xml::Xml;
|
||||||
|
use crate::avm1::globals::xml_socket::XmlSocket;
|
||||||
use crate::avm1::object::array_object::ArrayObject;
|
use crate::avm1::object::array_object::ArrayObject;
|
||||||
use crate::avm1::object::super_object::SuperObject;
|
use crate::avm1::object::super_object::SuperObject;
|
||||||
use crate::avm1::object::value_object::ValueObject;
|
use crate::avm1::object::value_object::ValueObject;
|
||||||
|
@ -59,6 +60,7 @@ pub enum NativeObject<'gc> {
|
||||||
Xml(Xml<'gc>),
|
Xml(Xml<'gc>),
|
||||||
XmlNode(XmlNode<'gc>),
|
XmlNode(XmlNode<'gc>),
|
||||||
SharedObject(GcCell<'gc, SharedObject>),
|
SharedObject(GcCell<'gc, SharedObject>),
|
||||||
|
XmlSocket(XmlSocket<'gc>),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents an object that can be directly interacted with by the AVM
|
/// Represents an object that can be directly interacted with by the AVM
|
||||||
|
|
Loading…
Reference in New Issue