From 8f11141426534d96e139c7533350ccf6036916ce Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Thu, 27 Aug 2020 23:27:54 +0200 Subject: [PATCH] core: Add initial ExternalInterface structs --- core/src/external.rs | 20 ++++++++++++++++++++ core/src/lib.rs | 1 + core/src/player.rs | 13 +++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 core/src/external.rs diff --git a/core/src/external.rs b/core/src/external.rs new file mode 100644 index 000000000..f0f753859 --- /dev/null +++ b/core/src/external.rs @@ -0,0 +1,20 @@ +pub trait ExternalInterfaceProvider {} + +#[derive(Default)] +pub struct ExternalInterface { + providers: Vec>, +} + +impl ExternalInterface { + pub fn new() -> Self { + Self::default() + } + + pub fn add_provider(&mut self, provider: Box) { + self.providers.push(provider); + } + + pub fn available(&self) -> bool { + !self.providers.is_empty() + } +} diff --git a/core/src/lib.rs b/core/src/lib.rs index 53367d3c0..d65e1457b 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -38,6 +38,7 @@ mod transform; mod xml; pub mod backend; +pub mod external; pub use chrono; pub use events::PlayerEvent; diff --git a/core/src/player.rs b/core/src/player.rs index 7a880508c..43bd7a02f 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -12,6 +12,7 @@ use crate::backend::{audio::AudioBackend, render::Letterbox, render::RenderBacke use crate::context::{ActionQueue, ActionType, RenderContext, UpdateContext}; use crate::display_object::{EditText, MorphShape, MovieClip}; use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult, KeyCode, PlayerEvent}; +use crate::external::{ExternalInterface, ExternalInterfaceProvider}; use crate::library::Library; use crate::loader::LoadManager; use crate::prelude::*; @@ -180,6 +181,9 @@ pub struct Player { /// contexts to other parts of the player. It can be used to ensure the /// player lives across `await` calls in async code. self_reference: Option>>, + + /// External interface for (for example) Javascript <-> Actionscript interaction + external_interface: ExternalInterface, } impl Player { @@ -262,6 +266,7 @@ impl Player { instance_counter: 0, time_til_next_timer: None, storage, + external_interface: ExternalInterface::new(), }; player.mutate_with_update_context(|context| Avm2::load_player_globals(context))?; @@ -1153,6 +1158,14 @@ impl Player { pub fn should_prevent_scrolling(&mut self) -> bool { self.mutate_with_update_context(|context| context.avm1.has_mouse_listener()) } + + pub fn external_interface(&self) -> &ExternalInterface { + &self.external_interface + } + + pub fn add_external_interface(&mut self, provider: Box) { + self.external_interface.add_provider(provider); + } } pub struct DragObject<'gc> {