#![allow(unused)]
use std::io::Result;
use std::fmt::Debug;
use std::net::{SocketAddr, UdpSocket};
use std::sync::{Arc, atomic::{AtomicBool, Ordering}};
#[macro_use]
extern crate lazy_static;
use futures::future::{FutureExt, LocalBoxFuture};
use crossbeam_channel::Sender;
use bytes::Bytes;
use pi_async_rt::rt::serial_local_thread::LocalTaskRuntime;
pub mod connect;
pub mod terminal;
pub mod utils;
use crate::{connect::BlockingUdpSocket,
utils::{UdpMultiInterface, UdpSocketStatus, SocketContext}};
pub trait Socket: Debug + Send + Sync + 'static {
fn is_closed(&self) -> bool;
fn get_uid(&self) -> usize;
fn get_local(&self) -> &SocketAddr;
fn get_remote(&self) -> Option<&SocketAddr>;
fn get_status(&self) -> UdpSocketStatus;
fn set_ttl(&self, ttl: u32) -> Result<()>;
fn join_multicast_group(&self,
address: SocketAddr,
interface: UdpMultiInterface,
ttl: u32,
is_loop: bool) -> Result<()>;
fn leave_multicast_group(&self,
address: SocketAddr,
interface: UdpMultiInterface) -> Result<()>;
fn enable_broadcast(&self) -> Result<()>;
fn disable_boradcast(&self) -> Result<()>;
fn get_context(&self) -> &SocketContext;
fn get_read_block_len(&self) -> usize;
fn set_read_block_len(&self, len: usize);
fn get_write_block_len(&self) -> usize;
fn set_write_block_len(&self, len: usize);
fn spawn(&self, task: LocalBoxFuture<'static, TaskResult>);
fn connect(&self, to: SocketAddr) -> Result<()>;
fn write(&self,
buf: Vec<u8>,
peer: Option<SocketAddr>) -> Result<()>;
fn recv(&self) -> Result<(Vec<u8>, Option<SocketAddr>)>;
fn send(&self,
buf: Bytes,
peer: Option<SocketAddr>) -> Result<usize>;
fn close(&self, reason: Result<()>) -> Result<()>;
}
pub type SocketHandle = Arc<dyn Socket>;
pub type SocketHandleRef<'a> = &'a dyn Socket;
pub trait AsyncService: Send + Sync + 'static {
fn bind_runtime(&mut self, rt: LocalTaskRuntime<()>);
fn handle_binded(&self,
handle: SocketHandle,
result: Result<()>) -> LocalBoxFuture<'static, ()>;
fn handle_received(&self,
handle: SocketHandle,
result: Result<(Vec<u8>, Option<SocketAddr>)>) -> LocalBoxFuture<'static, ()>;
fn handle_sended(&self,
handle: SocketHandle,
result: Result<usize>) -> LocalBoxFuture<'static, ()>;
fn handle_closed(&self,
handle: SocketHandle,
result: Result<()>) -> LocalBoxFuture<'static, ()>;
}
pub enum UdpEvent {
Recv(usize, Vec<u8>, Option<SocketAddr>), Sent(usize, Vec<u8>, Option<SocketAddr>), Task(LocalBoxFuture<'static, TaskResult>), CloseConnection(usize, Result<()>), CloseListener(Result<()>), }
unsafe impl Send for UdpEvent {}
#[derive(Debug, Clone)]
pub enum TaskResult {
Continue, ExitReady, }