use self::protocol_v1::ProtocolV1Reader;
use crate::service::sys_service_api::ServiceKey;
use std::hash::Hash;
pub mod protocol_ipc;
pub mod protocol_v1;
pub const IPC_INITED_REQ_ID: i64 = -1;
pub const SYSTEM_CALL_FINALIZE_REQ_ID: i64 = -2;
#[derive(PartialEq, Debug)]
pub enum MsgType {
HeartBit, NormalMsg, RspNormalMsg, AckNormalMsg, System, }
impl MsgType {
fn from(value: i32) -> Option<Self> {
match value {
0 => Some(MsgType::HeartBit),
1 => Some(MsgType::NormalMsg),
2 => Some(MsgType::RspNormalMsg),
3 => Some(MsgType::AckNormalMsg),
4 => Some(MsgType::System),
_ => None,
}
}
}
#[derive(Copy, Clone)]
pub struct XID {
pub conn_id: i64,
pub request_id: i64,
}
impl Hash for XID {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.conn_id.hash(state);
self.request_id.hash(state);
}
}
impl PartialEq for XID {
fn eq(&self, other: &Self) -> bool {
self.conn_id == other.conn_id && self.request_id == other.request_id
}
}
impl Eq for XID {}
impl Default for XID {
fn default() -> XID {
XID {
conn_id: 0,
request_id: 0,
}
}
}
impl XID {
pub fn new(conn_id: i64, msg_id: i64) -> Self {
XID {
conn_id,
request_id: msg_id,
}
}
pub fn is_empty(&self) -> bool {
self.request_id == 0
}
}
pub fn get_version(message: &[u8]) -> u16 {
unsafe {
let ptr = message.as_ptr().offset(4);
let bytes = *(ptr as *const [u8; 2]);
u16::from_le_bytes(bytes)
}
}
pub fn get_msg_type(message: &[u8]) -> Option<MsgType> {
let version = get_version(message);
match version {
1 => {
let v1_reader = ProtocolV1Reader::new(message);
v1_reader.msg_type()
}
_ => None,
}
}
pub fn get_sender_service_key(message: &[u8]) -> Option<ServiceKey> {
let version = get_version(message);
match version {
1 => {
let v1_reader = ProtocolV1Reader::new(message);
Some(v1_reader.sender())
}
_ => None,
}
}
pub fn get_receiver_service_key(message: &[u8]) -> Option<ServiceKey> {
let version = get_version(message);
match version {
1 => {
let v1_reader = ProtocolV1Reader::new(message);
Some(v1_reader.receiver())
}
_ => None,
}
}