use crate::ffi::errors::{ErrorHandle, Status};
use crate::ffi::helpers::fields::{Field, Fields};
use crate::ffi::{Buffer, Slice};
use crate::helpers::hpack::{Decoder, Encoder};
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_hpack_encoder_new() -> *mut Encoder {
Box::into_raw(Box::new(Encoder::new()))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_encoder_free(encoder: *mut Encoder) {
if !encoder.is_null() {
drop(unsafe { Box::from_raw(encoder) });
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_encoder_set_max_capacity(encoder: *mut Encoder, max_capacity: usize) -> bool {
let Some(encoder) = (unsafe { encoder.as_mut() }) else {
return false;
};
encoder.set_max_capacity(max_capacity);
true
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_encoder_set_capacity_limit(encoder: *mut Encoder, capacity_limit: usize) -> bool {
let Some(encoder) = (unsafe { encoder.as_mut() }) else {
return false;
};
encoder.set_capacity_limit(capacity_limit);
true
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_encode(encoder: *mut Encoder, fields: *const Field, field_count: usize) -> Buffer {
let (Some(encoder), Some(fields)) = (unsafe { encoder.as_mut() }, unsafe { Field::parse_all(fields, field_count) }) else {
return Buffer::EMPTY;
};
Buffer::new(encoder.encode(&fields))
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_hpack_decoder_new() -> *mut Decoder {
Box::into_raw(Box::new(Decoder::new()))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_decoder_free(decoder: *mut Decoder) {
if !decoder.is_null() {
drop(unsafe { Box::from_raw(decoder) });
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_decoder_set_max_decoded_size(decoder: *mut Decoder, max_size: usize) -> bool {
let Some(decoder) = (unsafe { decoder.as_mut() }) else {
return false;
};
decoder.set_max_decoded_size(max_size);
true
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_decoder_set_max_capacity(decoder: *mut Decoder, max_capacity: usize) -> bool {
let Some(decoder) = (unsafe { decoder.as_mut() }) else {
return false;
};
decoder.set_max_capacity(max_capacity);
true
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_hpack_decode(decoder: *mut Decoder, block: *const u8, block_len: usize, out: *mut *mut Fields, error: *mut *mut ErrorHandle) -> Status {
let Some(decoder) = (unsafe { decoder.as_mut() }) else {
return unsafe { ErrorHandle::raise(error, Status::Invalid) };
};
if out.is_null() {
return unsafe { ErrorHandle::raise(error, Status::Invalid) };
}
let Some(block) = (unsafe { Slice::borrow(block, block_len) }) else {
return unsafe { ErrorHandle::raise(error, Status::Invalid) };
};
match decoder.decode(block) {
Ok(fields) => {
unsafe { *out = Box::into_raw(Box::new(Fields(fields))) };
Status::Ok
}
Err(failure) => unsafe { ErrorHandle::report(error, &crate::errors::Error::from(failure)) },
}
}