This commit is contained in:
parent
311755c812
commit
c6b1893bb0
30 changed files with 181 additions and 108 deletions
|
|
@ -5,12 +5,19 @@ pub struct ByteBuffer<const N: usize> {
|
|||
buffer: Box<[u8; N]>,
|
||||
}
|
||||
|
||||
impl<const N: usize> ByteBuffer<N> {
|
||||
pub fn new() -> Self {
|
||||
impl<const N: usize> Default for ByteBuffer<N> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
buffer: Box::new([0; N]),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<const N: usize> ByteBuffer<N> {
|
||||
pub fn new() -> Self {
|
||||
ByteBuffer::default()
|
||||
}
|
||||
|
||||
pub fn size(&self) -> u64 {
|
||||
N as u64
|
||||
}
|
||||
|
|
@ -54,7 +61,7 @@ impl<const N: usize> ByteBuffer<N> {
|
|||
if (len + offset) > N {
|
||||
return Err(ZError::BUFFER_SIZE);
|
||||
}
|
||||
Ok(alloc::str::from_utf8(&self.buffer[offset..offset + len])
|
||||
.map_err(|_| ZError::INVALID_ARGUMENT)?)
|
||||
alloc::str::from_utf8(&self.buffer[offset..offset + len])
|
||||
.map_err(|_| ZError::INVALID_ARGUMENT)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,5 +34,5 @@ pub fn call_endpoint<Req: YunqMessage, Resp: YunqMessage, const N: usize>(
|
|||
return Err(ZError::from(resp_code));
|
||||
}
|
||||
|
||||
Ok(Resp::parse_from_request(&byte_buffer, &cap_buffer)?)
|
||||
Resp::parse_from_request(byte_buffer, &cap_buffer)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ pub fn parse_repeated_message<T: YunqMessage, const N: usize>(
|
|||
buf: &ByteBuffer<N>,
|
||||
mut offset: usize,
|
||||
len: usize,
|
||||
caps: &Vec<z_cap_t>,
|
||||
caps: &[z_cap_t],
|
||||
) -> Result<Vec<T>, ZError> {
|
||||
let mut repeated = Vec::new();
|
||||
for _ in 0..len {
|
||||
|
|
@ -43,18 +43,18 @@ pub fn parse_repeated_message<T: YunqMessage, const N: usize>(
|
|||
pub fn serialize_repeated<T: Copy, const N: usize>(
|
||||
buf: &mut ByteBuffer<N>,
|
||||
offset: usize,
|
||||
data: &Vec<T>,
|
||||
data: &[T],
|
||||
) -> Result<usize, ZError> {
|
||||
for i in 0..data.len() {
|
||||
buf.write_at(offset + (i * size_of::<T>()), data[i])?;
|
||||
for (i, val) in data.iter().enumerate() {
|
||||
buf.write_at(offset + (i * size_of::<T>()), val)?;
|
||||
}
|
||||
Ok(offset + (data.len() * size_of::<T>()))
|
||||
Ok(offset + size_of_val(data))
|
||||
}
|
||||
|
||||
pub fn serialize_repeated_message<T: YunqMessage, const N: usize>(
|
||||
buf: &mut ByteBuffer<N>,
|
||||
mut offset: usize,
|
||||
data: &Vec<T>,
|
||||
data: &[T],
|
||||
caps: &mut Vec<z_cap_t>,
|
||||
) -> Result<usize, ZError> {
|
||||
for item in data {
|
||||
|
|
@ -76,14 +76,14 @@ pub trait YunqMessage {
|
|||
fn parse<const N: usize>(
|
||||
buf: &ByteBuffer<N>,
|
||||
offset: usize,
|
||||
caps: &Vec<z_cap_t>,
|
||||
caps: &[z_cap_t],
|
||||
) -> Result<Self, ZError>
|
||||
where
|
||||
Self: Sized;
|
||||
|
||||
fn parse_from_request<const N: usize>(
|
||||
buf: &ByteBuffer<N>,
|
||||
caps: &Vec<z_cap_t>,
|
||||
caps: &[z_cap_t],
|
||||
) -> Result<Self, ZError>
|
||||
where
|
||||
Self: Sized,
|
||||
|
|
@ -92,7 +92,7 @@ pub trait YunqMessage {
|
|||
return Err(ZError::INVALID_RESPONSE);
|
||||
}
|
||||
|
||||
Ok(Self::parse(&buf, 16, &caps)?)
|
||||
Self::parse(buf, 16, caps)
|
||||
}
|
||||
|
||||
fn serialize<const N: usize>(
|
||||
|
|
@ -109,7 +109,7 @@ pub trait YunqMessage {
|
|||
caps: &mut Vec<z_cap_t>,
|
||||
) -> Result<usize, ZError> {
|
||||
buf.write_at(0, SENTINEL)?;
|
||||
buf.write_at(8, request_id as u64)?;
|
||||
buf.write_at(8, request_id)?;
|
||||
|
||||
let length = self.serialize(buf, 16, caps)?;
|
||||
|
||||
|
|
@ -125,7 +125,7 @@ impl YunqMessage for Empty {
|
|||
fn parse<const N: usize>(
|
||||
_buf: &ByteBuffer<N>,
|
||||
_offset: usize,
|
||||
_caps: &Vec<z_cap_t>,
|
||||
_caps: &[z_cap_t],
|
||||
) -> Result<Self, ZError>
|
||||
where
|
||||
Self: Sized,
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ pub trait YunqServer {
|
|||
.expect("Failed to reply"),
|
||||
Err(err) => {
|
||||
crate::message::serialize_error(&mut byte_buffer, err);
|
||||
syscall::reply_port_send(reply_port_cap, &byte_buffer.slice(0x10), &[])
|
||||
syscall::reply_port_send(reply_port_cap, byte_buffer.slice(0x10), &[])
|
||||
.expect("Failed to reply w/ error")
|
||||
}
|
||||
}
|
||||
|
|
@ -84,11 +84,11 @@ where
|
|||
.at::<u64>(8)
|
||||
.expect("Failed to access request length.");
|
||||
let self_clone = self.clone();
|
||||
spawner.spawn(Task::new((async move || {
|
||||
spawner.spawn(Task::new(async move {
|
||||
self_clone
|
||||
.handle_request_and_response(method, byte_buffer, cap_buffer, reply_port_cap)
|
||||
.await;
|
||||
})()));
|
||||
.await
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -113,12 +113,10 @@ where
|
|||
.expect("Failed to reply"),
|
||||
Err(err) => {
|
||||
crate::message::serialize_error(&mut byte_buffer, err);
|
||||
syscall::reply_port_send(reply_port_cap, &byte_buffer.slice(0x10), &[])
|
||||
syscall::reply_port_send(reply_port_cap, byte_buffer.slice(0x10), &[])
|
||||
.expect("Failed to reply w/ error")
|
||||
}
|
||||
}
|
||||
|
||||
()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue