test[rust]: protocol test

This commit is contained in:
godotg
2024-07-21 16:09:55 +08:00
parent 54d1c45436
commit 293ccb4e21
10 changed files with 1186 additions and 0 deletions
+82
View File
@@ -0,0 +1,82 @@
mod zfoorust;
use std::fs::File;
use std::io::Read;
use std::path::Path;
use crate::zfoorust::byte_buffer::{ByteBuffer};
use crate::zfoorust::i_byte_buffer::{IByteBuffer, IPacket};
use crate::zfoorust::protocol_manager::{write, read};
use crate::zfoorust::normalObject::NormalObject;
fn main() {
byte_buffer_test();
// let path = Path::new("C:\\github\\zfoo\\protocol\\src\\test\\resources\\compatible\\normal-no-compatible.bytes");
// let path = Path::new("C:\\github\\zfoo\\protocol\\src\\test\\resources\\compatible\\normal-out-compatible.bytes");
// let path = Path::new("C:\\github\\zfoo\\protocol\\src\\test\\resources\\compatible\\normal-inner-compatible.bytes");
// let path = Path::new("C:\\github\\zfoo\\protocol\\src\\test\\resources\\compatible\\normal-out-inner-compatible.bytes");
let path = Path::new("C:\\github\\zfoo\\protocol\\src\\test\\resources\\compatible\\normal-out-inner-inner-compatible.bytes");
let mut file = File::open(path).expect("Failed to open file");
let mut content = Vec::new();
file.read_to_end(&mut content).expect("Failed to read file");
println!("File content: {:?}", content.len());
let mut byte_buffer = ByteBuffer::new();
byte_buffer.writeUBytes(&content);
println!("buffer length:[{}]", byte_buffer.getWriteOffset());
let message = read(&mut byte_buffer);
let packet = message.downcast_ref::<NormalObject>().unwrap();
// read
let mut new_byte_buffer = ByteBuffer::new();
write(&mut new_byte_buffer, packet, packet.protocolId());
println!("new_byte_buffer length:[{}]", new_byte_buffer.getWriteOffset());
let new_message = read(&mut new_byte_buffer);
let new_packet = new_message.downcast_ref::<NormalObject>().unwrap();
println!("hello {}", new_packet.g);
}
fn byte_buffer_test() {
let mut buffer = ByteBuffer::new();
buffer.ensureCapacity(200);
assert_eq!(buffer.getCapacity(), 128 * 2);
buffer.writeBool(true);
assert_eq!(buffer.readBool(), true);
buffer.writeBool(false);
assert_eq!(buffer.readBool(), false);
let bytes: [i8; 6] = [1, 2, 3, 4, 5, 6];
buffer.writeBytes(&bytes);
let toBytes = buffer.toBytes();
let expectBytes: [i8; 8] = [1, 0, 1, 2, 3, 4, 5, 6];
assert_eq!(toBytes, expectBytes);
let bytes1 = buffer.readBytes(6);
buffer.writeShort(9999);
assert_eq!(buffer.readShort(), 9999);
buffer.writeShort(-9999);
assert_eq!(buffer.readShort(), -9999);
buffer.writeInt(-2147483648);
assert_eq!(buffer.readInt(), -2147483648);
buffer.writeInt(2147483647);
assert_eq!(buffer.readInt(), 2147483647);
buffer.writeLong(-9223372036854775808);
assert_eq!(buffer.readLong(), -9223372036854775808);
buffer.writeLong(9223372036854775807);
assert_eq!(buffer.readLong(), 9223372036854775807);
buffer.writeFloat(3.1415926);
assert_eq!(buffer.readFloat(), 3.1415926);
buffer.writeFloat(-3.1415926);
assert_eq!(buffer.readFloat(), -3.1415926);
buffer.writeDouble(3.1415926);
assert_eq!(buffer.readDouble(), 3.1415926);
buffer.writeDouble(-3.1415926);
assert_eq!(buffer.readDouble(), -3.1415926);
buffer.writeString(String::from("hello"));
assert_eq!(buffer.readString(), String::from("hello"));
}
@@ -0,0 +1,452 @@
#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use crate::zfoorust::i_byte_buffer::IByteBuffer;
use crate::zfoorust::protocol_manager::writeNoProtocolId;
use crate::zfoorust::protocol_manager::readNoProtocolId;
#[allow(non_snake_case)]
pub struct ByteBuffer {
buffer: Vec<i8>,
writeOffset: i32,
readOffset: i32,
}
#[allow(non_snake_case)]
#[allow(dead_code)]
#[allow(unused_parens)]
impl ByteBuffer {
pub fn new() -> ByteBuffer {
let mut buffer = ByteBuffer {
buffer: Vec::new(),
writeOffset: 0,
readOffset: 0,
};
buffer.buffer.resize(128, 0);
return buffer;
}
}
#[allow(non_snake_case)]
#[allow(dead_code)]
#[allow(unused_parens)]
impl IByteBuffer for ByteBuffer {
fn adjustPadding(&mut self, predictionLength: i32, beforeWriteIndex: i32) {
let currentWriteIndex = self.getWriteOffset();
let predictionCount = self.writeIntCount(predictionLength);
let length = currentWriteIndex - beforeWriteIndex - predictionCount;
let lengthCount = self.writeIntCount(length);
let padding = lengthCount - predictionCount;
if (padding == 0) {
self.setWriteOffset(beforeWriteIndex);
self.writeInt(length);
self.setWriteOffset(currentWriteIndex);
} else {
let mut bytes: Vec<i8> = Vec::with_capacity(length as usize);
bytes.extend(&self.buffer[(currentWriteIndex - length) as usize..currentWriteIndex as usize]);
self.setWriteOffset(beforeWriteIndex);
self.writeInt(length);
self.writeBytes(bytes.as_slice());
}
}
fn compatibleRead(&mut self, beforeReadIndex: i32, length: i32) -> bool{
return length != -1 && self.getReadOffset() < length + beforeReadIndex;
}
fn getBuffer(&self) -> &Vec<i8> {
return &self.buffer;
}
fn getWriteOffset(&self) -> i32 {
return self.writeOffset;
}
fn setWriteOffset(&mut self, writeIndex: i32) {
self.writeOffset = writeIndex;
}
fn getReadOffset(&self) -> i32 {
return self.readOffset;
}
fn setReadOffset(&mut self, readIndex: i32) {
self.readOffset = readIndex;
}
fn getCapacity(&self) -> i32 {
return self.buffer.capacity() as i32 - self.writeOffset;
}
fn ensureCapacity(&mut self, capacity: i32) {
while capacity > self.getCapacity() {
self.buffer.resize(self.buffer.capacity() * 2, 0);
}
}
fn isReadable(&self) -> bool {
return self.writeOffset > self.readOffset;
}
fn writeBytes(&mut self, bytes: &[i8]) {
let length = bytes.len() as i32;
self.ensureCapacity(length);
for byte in bytes {
self.writeByte(*byte);
}
}
fn readBytes(&mut self, count: i32) -> &[i8] {
let value = &self.buffer[self.readOffset as usize..(self.readOffset + count) as usize];
self.readOffset += count;
return value;
}
fn writeUBytes(&mut self, bytes: &[u8]) {
let length = bytes.len() as i32;
self.ensureCapacity(length);
for byte in bytes {
self.writeUByte(*byte);
}
}
fn readUBytes(&mut self, count: i32) -> Vec<u8> {
let mut bytes: Vec<u8> = Vec::new();
bytes.resize(count as usize, 0);
for i in 0..count {
bytes[i as usize] = self.readUByte();
}
return bytes;
}
fn toBytes(&self) -> &[i8] {
return &self.buffer[0..self.writeOffset as usize];
}
fn writeBool(&mut self, value: bool) {
self.ensureCapacity(1);
self.buffer[self.writeOffset as usize] = if value { 1 } else { 0 };
self.writeOffset += 1;
}
fn readBool(&mut self) -> bool {
let value = self.buffer[self.readOffset as usize];
self.readOffset += 1;
return value != 0;
}
fn writeByte(&mut self, value: i8) {
self.ensureCapacity(1);
self.buffer[self.writeOffset as usize] = value;
self.writeOffset += 1;
}
fn readByte(&mut self) -> i8 {
let value = self.buffer[self.readOffset as usize];
self.readOffset += 1;
return value;
}
fn writeUByte(&mut self, value: u8) {
self.ensureCapacity(1);
self.buffer[self.writeOffset as usize] = value as i8;
self.writeOffset += 1;
}
fn readUByte(&mut self) -> u8 {
let value = self.buffer[self.readOffset as usize];
self.readOffset += 1;
return value as u8;
}
fn writeShort(&mut self, value: i16) {
self.ensureCapacity(2);
self.buffer[self.writeOffset as usize] = (value >> 8) as i8;
self.buffer[self.writeOffset as usize + 1] = value as i8;
self.writeOffset += 2;
}
fn readShort(&mut self) -> i16 {
let value = (self.buffer[self.readOffset as usize] as i16) << 8
| (self.buffer[self.readOffset as usize + 1] as u8) as i16;
self.readOffset += 2;
return value;
}
fn writeRawInt(&mut self, value: i32) {
self.writeByte((value >> 24) as i8);
self.writeByte((value >> 16) as i8);
self.writeByte((value >> 8) as i8);
self.writeByte(value as i8);
}
fn readRawInt(&mut self) -> i32 {
let value = (self.readUByte() as i32) << 24
| (self.readUByte() as i32) << 16
| (self.readUByte() as i32) << 8
| (self.readUByte() as i32);
return value;
}
fn writeInt(&mut self, intValue: i32) {
let value = ((intValue << 1) ^ (intValue >> 31)) as u32;
if (value >> 7 == 0) {
self.writeByte(value as i8);
return;
}
if (value >> 14 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte((value >> 7) as i8);
return;
}
if (value >> 21 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte((value >> 14) as i8);
return;
}
if (value >> 28 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte((value >> 21) as i8);
return;
}
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte(((value >> 21) | 0x80) as i8);
self.writeByte((value >> 28) as i8);
}
fn writeIntCount(&mut self, intValue: i32) -> i32 {
let value = ((intValue << 1) ^ (intValue >> 31)) as u32;
if (value >> 7 == 0) {
return 1;
}
if (value >> 14 == 0) {
return 2;
}
if (value >> 21 == 0) {
return 3;
}
if (value >> 28 == 0) {
return 4;
}
return 5;
}
fn readInt(&mut self) -> i32 {
let mut b = self.readUByte() as u32;
let mut value = b & 0x7F;
if ((b & 0x80) != 0) {
b = self.readUByte() as u32;
value |= (b & 0x7F) << 7;
if ((b & 0x80) != 0) {
b = self.readUByte() as u32;
value |= (b & 0x7F) << 14;
if ((b & 0x80) != 0) {
b = self.readUByte() as u32;
value |= (b & 0x7F) << 21;
if ((b & 0x80) != 0) {
b = self.readUByte() as u32;
value |= (b & 0x7F) << 28;
}
}
}
}
return (value >> 1) as i32 ^ -((value as i32) & 1);
}
fn writeRawLong(&mut self, value: i64) {
self.writeByte((value >> 56) as i8);
self.writeByte((value >> 48) as i8);
self.writeByte((value >> 40) as i8);
self.writeByte((value >> 32) as i8);
self.writeByte((value >> 24) as i8);
self.writeByte((value >> 16) as i8);
self.writeByte((value >> 8) as i8);
self.writeByte(value as i8);
}
fn readRawLong(&mut self) -> i64 {
let value = (self.readUByte() as i64) << 56
| (self.readUByte() as i64) << 48
| (self.readUByte() as i64) << 40
| (self.readUByte() as i64) << 32
| (self.readUByte() as i64) << 24
| (self.readUByte() as i64) << 16
| (self.readUByte() as i64) << 8
| (self.readUByte() as i64);
return value;
}
fn writeLong(&mut self, longValue: i64) {
let value = ((longValue << 1) ^ (longValue >> 63)) as u64;
if (value >> 7 == 0) {
self.writeByte(value as i8);
return;
}
if (value >> 14 == 0) {
self.writeByte(((value & 0x7F) | 0x80) as i8);
self.writeByte((value >> 7) as i8);
return;
}
if (value >> 21 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte((value >> 14) as i8);
return;
}
if ((value >> 28) == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte((value >> 21) as i8);
return;
}
if (value >> 35 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte(((value >> 21) | 0x80) as i8);
self.writeByte((value >> 28) as i8);
return;
}
if (value >> 42 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte(((value >> 21) | 0x80) as i8);
self.writeByte(((value >> 28) | 0x80) as i8);
self.writeByte((value >> 35) as i8);
return;
}
if (value >> 49 == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte(((value >> 21) | 0x80) as i8);
self.writeByte(((value >> 28) | 0x80) as i8);
self.writeByte(((value >> 35) | 0x80) as i8);
self.writeByte((value >> 42) as i8);
return;
}
if ((value >> 56) == 0) {
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte(((value >> 21) | 0x80) as i8);
self.writeByte(((value >> 28) | 0x80) as i8);
self.writeByte(((value >> 35) | 0x80) as i8);
self.writeByte(((value >> 42) | 0x80) as i8);
self.writeByte((value >> 49) as i8);
return;
}
self.writeByte((value | 0x80) as i8);
self.writeByte(((value >> 7) | 0x80) as i8);
self.writeByte(((value >> 14) | 0x80) as i8);
self.writeByte(((value >> 21) | 0x80) as i8);
self.writeByte(((value >> 28) | 0x80) as i8);
self.writeByte(((value >> 35) | 0x80) as i8);
self.writeByte(((value >> 42) | 0x80) as i8);
self.writeByte(((value >> 49) | 0x80) as i8);
self.writeByte((value >> 56) as i8);
}
fn readLong(&mut self) -> i64 {
let mut b = self.readUByte() as u64;
let mut value = b & 0x7F;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 7;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 14;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 21;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 28;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 35;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 42;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= (b & 0x7F) << 49;
if ((b & 0x80) != 0) {
b = self.readUByte() as u64;
value |= b << 56;
}
}
}
}
}
}
}
}
return (value >> 1) as i64 ^ -(value as i64 & 1);
}
fn writeFloat(&mut self, value: f32) {
self.writeRawInt(value.to_bits() as i32);
}
fn readFloat(&mut self) -> f32 {
return f32::from_bits(self.readRawInt() as u32);
}
fn writeDouble(&mut self, value: f64) {
self.writeRawLong(value.to_bits() as i64);
}
fn readDouble(&mut self) -> f64 {
return f64::from_bits(self.readRawLong() as u64);
}
fn writeString(&mut self, value: String) {
if (value == "" || value.is_empty()) {
self.writeInt(0);
}
let bytes = value.as_bytes();
self.writeInt(bytes.len() as i32);
self.writeUBytes(bytes);
}
fn readString(&mut self) -> String {
let length = self.readInt();
if (length <= 0) {
return String::from("");
}
let bytes = self.readUBytes(length);
return String::from_utf8(bytes).unwrap();
}
fn writePacket(&mut self, packet: &dyn Any, protocolId: i16) {
writeNoProtocolId(self, packet, protocolId);
}
fn readPacket(&mut self, protocolId: i16) -> Box<dyn Any> {
return readNoProtocolId(self, protocolId);
}
}
@@ -0,0 +1,50 @@
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use std::collections::HashMap;
use std::collections::HashSet;
use crate::zfoorust::i_byte_buffer::{IByteBuffer, IPacket};
#[derive(Clone)]
pub struct EmptyObject {
}
impl IPacket for EmptyObject {
fn protocolId(&self) -> i16 {
return 0;
}
}
impl EmptyObject {
pub fn new() -> EmptyObject {
let packet = EmptyObject {
};
return packet;
}
}
pub fn writeEmptyObject(buffer: &mut dyn IByteBuffer, packet: &dyn Any) {
let message = packet.downcast_ref::<EmptyObject>().unwrap();
buffer.writeInt(-1);
}
pub fn readEmptyObject(buffer: &mut dyn IByteBuffer) -> Box<dyn Any> {
let length = buffer.readInt();
let mut packet = EmptyObject::new();
if length == 0 {
return Box::new(packet);
}
let beforeReadIndex = buffer.getReadOffset();
if length > 0 {
buffer.setReadOffset(beforeReadIndex + length);
}
return Box::new(packet);
}
@@ -0,0 +1,55 @@
#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
pub trait IPacket {
fn protocolId(&self) -> i16;
}
#[allow(non_snake_case)]
#[allow(dead_code)]
#[allow(unused_parens)]
pub trait IByteBuffer {
fn adjustPadding(&mut self, predictionLength: i32, beforeWriteIndex: i32);
fn compatibleRead(&mut self, beforeReadIndex: i32, length: i32) -> bool;
fn getBuffer(&self) -> &Vec<i8>;
fn getWriteOffset(&self) -> i32;
fn setWriteOffset(&mut self, writeIndex: i32);
fn getReadOffset(&self) -> i32;
fn setReadOffset(&mut self, readIndex: i32);
fn getCapacity(&self) -> i32;
fn ensureCapacity(&mut self, capacity: i32);
fn isReadable(&self) -> bool;
fn writeBytes(&mut self, bytes: &[i8]);
fn readBytes(&mut self, count: i32) -> &[i8];
fn writeUBytes(&mut self, bytes: &[u8]);
fn readUBytes(&mut self, count: i32) -> Vec<u8>;
fn toBytes(&self) -> &[i8];
fn writeBool(&mut self, value: bool);
fn readBool(&mut self) -> bool;
fn writeByte(&mut self, value: i8);
fn readByte(&mut self) -> i8;
fn writeUByte(&mut self, value: u8);
fn readUByte(&mut self) -> u8;
fn writeShort(&mut self, value: i16);
fn readShort(&mut self) -> i16;
fn writeRawInt(&mut self, value: i32);
fn readRawInt(&mut self) -> i32;
fn writeInt(&mut self, intValue: i32);
fn writeIntCount(&mut self, intValue: i32) -> i32;
fn readInt(&mut self) -> i32;
fn writeRawLong(&mut self, value: i64);
fn readRawLong(&mut self) -> i64;
fn writeLong(&mut self, longValue: i64);
fn readLong(&mut self) -> i64;
fn writeFloat(&mut self, value: f32);
fn readFloat(&mut self) -> f32;
fn writeDouble(&mut self, value: f64);
fn readDouble(&mut self) -> f64;
fn writeString(&mut self, value: String);
fn readString(&mut self) -> String;
fn writePacket(&mut self, packet: &dyn Any, protocolId: i16);
fn readPacket(&mut self, protocolId: i16) -> Box<dyn Any>;
}
+8
View File
@@ -0,0 +1,8 @@
pub mod i_byte_buffer;
pub mod byte_buffer;
pub mod protocol_manager;
pub mod emptyObject;
pub mod normalObject;
pub mod objectA;
pub mod objectB;
pub mod simpleObject;
@@ -0,0 +1,288 @@
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use std::collections::HashMap;
use std::collections::HashSet;
use crate::zfoorust::i_byte_buffer::{IByteBuffer, IPacket};
use crate::zfoorust::objectA::ObjectA;
// 常规的对象,取所有语言语法的交集,基本上所有语言都支持下面的语法
#[derive(Clone)]
pub struct NormalObject {
pub a: i8,
pub aaa: Vec<i8>,
pub b: i16,
// 整数类型
pub c: i32,
pub d: i64,
pub e: f32,
pub f: f64,
pub g: bool,
pub jj: String,
pub kk: ObjectA,
pub l: Vec<i32>,
pub ll: Vec<i64>,
pub lll: Vec<ObjectA>,
pub llll: Vec<String>,
pub m: HashMap<i32, String>,
pub mm: HashMap<i32, ObjectA>,
pub s: HashSet<i32>,
pub ssss: HashSet<String>,
pub outCompatibleValue: i32,
pub outCompatibleValue2: i32,
}
impl IPacket for NormalObject {
fn protocolId(&self) -> i16 {
return 101;
}
}
impl NormalObject {
pub fn new() -> NormalObject {
let packet = NormalObject {
a: 0,
aaa: Vec::new(),
b: 0,
// 整数类型
c: 0,
d: 0,
e: 0f32,
f: 0f64,
g: false,
jj: String::from(""),
kk: ObjectA::new(),
l: Vec::new(),
ll: Vec::new(),
lll: Vec::new(),
llll: Vec::new(),
m: HashMap::new(),
mm: HashMap::new(),
s: HashSet::new(),
ssss: HashSet::new(),
outCompatibleValue: 0,
outCompatibleValue2: 0,
};
return packet;
}
}
pub fn writeNormalObject(buffer: &mut dyn IByteBuffer, packet: &dyn Any) {
let message = packet.downcast_ref::<NormalObject>().unwrap();
let beforeWriteIndex = buffer.getWriteOffset();
buffer.writeInt(857);
buffer.writeByte(message.a);
if message.aaa.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.aaa.len() as i32);
for element0 in message.aaa.clone() {
buffer.writeByte(element0);
}
}
buffer.writeShort(message.b);
buffer.writeInt(message.c);
buffer.writeLong(message.d);
buffer.writeFloat(message.e);
buffer.writeDouble(message.f);
buffer.writeBool(message.g);
buffer.writeString(message.jj.clone());
buffer.writePacket(&message.kk, 102);
if message.l.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.l.len() as i32);
for element1 in message.l.clone() {
buffer.writeInt(element1);
}
}
if message.ll.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.ll.len() as i32);
for element2 in message.ll.clone() {
buffer.writeLong(element2);
}
}
if message.lll.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.lll.len() as i32);
for element3 in message.lll.clone() {
buffer.writePacket(&element3, 102);
}
}
if message.llll.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.llll.len() as i32);
for element4 in message.llll.clone() {
buffer.writeString(element4.clone());
}
}
if message.m.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.m.len() as i32);
for (key5, value6) in message.m.clone() {
buffer.writeInt(key5);
buffer.writeString(value6.clone());
}
}
if message.mm.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.mm.len() as i32);
for (key7, value8) in message.mm.clone() {
buffer.writeInt(key7);
buffer.writePacket(&value8, 102);
}
}
if message.s.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.s.len() as i32);
for element9 in message.s.clone() {
buffer.writeInt(element9);
}
}
if message.ssss.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.ssss.len() as i32);
for element10 in message.ssss.clone() {
buffer.writeString(element10.clone());
}
}
buffer.writeInt(message.outCompatibleValue);
buffer.writeInt(message.outCompatibleValue2);
buffer.adjustPadding(857, beforeWriteIndex);
}
pub fn readNormalObject(buffer: &mut dyn IByteBuffer) -> Box<dyn Any> {
let length = buffer.readInt();
let mut packet = NormalObject::new();
if length == 0 {
return Box::new(packet);
}
let beforeReadIndex = buffer.getReadOffset();
let result0 = buffer.readByte();
packet.a = result0;
let mut result1: Vec<i8> = Vec::new();
let size3 = buffer.readInt();
if size3 > 0 {
for index2 in 0 .. size3 {
let result4 = buffer.readByte();
result1.push(result4);
}
}
packet.aaa = result1;
let result5 = buffer.readShort();
packet.b = result5;
let result6 = buffer.readInt();
packet.c = result6;
let result7 = buffer.readLong();
packet.d = result7;
let result8 = buffer.readFloat();
packet.e = result8;
let result9 = buffer.readDouble();
packet.f = result9;
let result10 = buffer.readBool();
packet.g = result10;
let result11 = buffer.readString();
packet.jj = result11;
let result12 = buffer.readPacket(102);
let result13 = result12.downcast_ref::<ObjectA>().unwrap().clone();
packet.kk = result13;
let mut result14: Vec<i32> = Vec::new();
let size15 = buffer.readInt();
if size15 > 0 {
for index16 in 0 .. size15 {
let result17 = buffer.readInt();
result14.push(result17);
}
}
packet.l = result14;
let mut result18: Vec<i64> = Vec::new();
let size19 = buffer.readInt();
if size19 > 0 {
for index20 in 0 .. size19 {
let result21 = buffer.readLong();
result18.push(result21);
}
}
packet.ll = result18;
let mut result22: Vec<ObjectA> = Vec::new();
let size23 = buffer.readInt();
if size23 > 0 {
for index24 in 0 .. size23 {
let result25 = buffer.readPacket(102);
let result26 = result25.downcast_ref::<ObjectA>().unwrap().clone();
result22.push(result26);
}
}
packet.lll = result22;
let mut result27: Vec<String> = Vec::new();
let size28 = buffer.readInt();
if size28 > 0 {
for index29 in 0 .. size28 {
let result30 = buffer.readString();
result27.push(result30);
}
}
packet.llll = result27;
let mut result31: HashMap<i32, String> = HashMap::new();
let size32 = buffer.readInt();
if size32 > 0 {
for index33 in 0 .. size32 {
let result34 = buffer.readInt();
let result35 = buffer.readString();
result31.insert(result34, result35);
}
}
packet.m = result31;
let mut result36: HashMap<i32, ObjectA> = HashMap::new();
let size37 = buffer.readInt();
if size37 > 0 {
for index38 in 0 .. size37 {
let result39 = buffer.readInt();
let result40 = buffer.readPacket(102);
let result41 = result40.downcast_ref::<ObjectA>().unwrap().clone();
result36.insert(result39, result41);
}
}
packet.mm = result36;
let mut result42: HashSet<i32> = HashSet::new();
let size43 = buffer.readInt();
if size43 > 0 {
for index44 in 0 .. size43 {
let result45 = buffer.readInt();
result42.insert(result45);
}
}
packet.s = result42;
let mut result46: HashSet<String> = HashSet::new();
let size47 = buffer.readInt();
if size47 > 0 {
for index48 in 0 .. size47 {
let result49 = buffer.readString();
result46.insert(result49);
}
}
packet.ssss = result46;
if buffer.compatibleRead(beforeReadIndex, length) {
let result50 = buffer.readInt();
packet.outCompatibleValue = result50;
}
if buffer.compatibleRead(beforeReadIndex, length) {
let result51 = buffer.readInt();
packet.outCompatibleValue2 = result51;
}
if length > 0 {
buffer.setReadOffset(beforeReadIndex + length);
}
return Box::new(packet);
}
@@ -0,0 +1,88 @@
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use std::collections::HashMap;
use std::collections::HashSet;
use crate::zfoorust::i_byte_buffer::{IByteBuffer, IPacket};
use crate::zfoorust::objectB::ObjectB;
#[derive(Clone)]
pub struct ObjectA {
pub a: i32,
pub m: HashMap<i32, String>,
pub objectB: ObjectB,
pub innerCompatibleValue: i32,
}
impl IPacket for ObjectA {
fn protocolId(&self) -> i16 {
return 102;
}
}
impl ObjectA {
pub fn new() -> ObjectA {
let packet = ObjectA {
a: 0,
m: HashMap::new(),
objectB: ObjectB::new(),
innerCompatibleValue: 0,
};
return packet;
}
}
pub fn writeObjectA(buffer: &mut dyn IByteBuffer, packet: &dyn Any) {
let message = packet.downcast_ref::<ObjectA>().unwrap();
let beforeWriteIndex = buffer.getWriteOffset();
buffer.writeInt(201);
buffer.writeInt(message.a);
if message.m.is_empty() {
buffer.writeInt(0);
} else {
buffer.writeInt(message.m.len() as i32);
for (key0, value1) in message.m.clone() {
buffer.writeInt(key0);
buffer.writeString(value1.clone());
}
}
buffer.writePacket(&message.objectB, 103);
buffer.writeInt(message.innerCompatibleValue);
buffer.adjustPadding(201, beforeWriteIndex);
}
pub fn readObjectA(buffer: &mut dyn IByteBuffer) -> Box<dyn Any> {
let length = buffer.readInt();
let mut packet = ObjectA::new();
if length == 0 {
return Box::new(packet);
}
let beforeReadIndex = buffer.getReadOffset();
let result0 = buffer.readInt();
packet.a = result0;
let mut result1: HashMap<i32, String> = HashMap::new();
let size2 = buffer.readInt();
if size2 > 0 {
for index3 in 0 .. size2 {
let result4 = buffer.readInt();
let result5 = buffer.readString();
result1.insert(result4, result5);
}
}
packet.m = result1;
let result6 = buffer.readPacket(103);
let result7 = result6.downcast_ref::<ObjectB>().unwrap().clone();
packet.objectB = result7;
if buffer.compatibleRead(beforeReadIndex, length) {
let result8 = buffer.readInt();
packet.innerCompatibleValue = result8;
}
if length > 0 {
buffer.setReadOffset(beforeReadIndex + length);
}
return Box::new(packet);
}
@@ -0,0 +1,61 @@
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use std::collections::HashMap;
use std::collections::HashSet;
use crate::zfoorust::i_byte_buffer::{IByteBuffer, IPacket};
#[derive(Clone)]
pub struct ObjectB {
pub flag: bool,
pub innerCompatibleValue: i32,
}
impl IPacket for ObjectB {
fn protocolId(&self) -> i16 {
return 103;
}
}
impl ObjectB {
pub fn new() -> ObjectB {
let packet = ObjectB {
flag: false,
innerCompatibleValue: 0,
};
return packet;
}
}
pub fn writeObjectB(buffer: &mut dyn IByteBuffer, packet: &dyn Any) {
let message = packet.downcast_ref::<ObjectB>().unwrap();
let beforeWriteIndex = buffer.getWriteOffset();
buffer.writeInt(4);
buffer.writeBool(message.flag);
buffer.writeInt(message.innerCompatibleValue);
buffer.adjustPadding(4, beforeWriteIndex);
}
pub fn readObjectB(buffer: &mut dyn IByteBuffer) -> Box<dyn Any> {
let length = buffer.readInt();
let mut packet = ObjectB::new();
if length == 0 {
return Box::new(packet);
}
let beforeReadIndex = buffer.getReadOffset();
let result0 = buffer.readBool();
packet.flag = result0;
if buffer.compatibleRead(beforeReadIndex, length) {
let result1 = buffer.readInt();
packet.innerCompatibleValue = result1;
}
if length > 0 {
buffer.setReadOffset(beforeReadIndex + length);
}
return Box::new(packet);
}
@@ -0,0 +1,45 @@
#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use crate::zfoorust::i_byte_buffer::IByteBuffer;
use crate::zfoorust::emptyObject::{writeEmptyObject, readEmptyObject};
use crate::zfoorust::normalObject::{writeNormalObject, readNormalObject};
use crate::zfoorust::objectA::{writeObjectA, readObjectA};
use crate::zfoorust::objectB::{writeObjectB, readObjectB};
use crate::zfoorust::simpleObject::{writeSimpleObject, readSimpleObject};
pub fn write(buffer: &mut dyn IByteBuffer, packet: &dyn Any, protocolId: i16) {
buffer.writeShort(protocolId);
writeNoProtocolId(buffer, packet, protocolId);
}
pub fn writeNoProtocolId(buffer: &mut dyn IByteBuffer, packet: &dyn Any, protocolId: i16) {
match protocolId {
0 => writeEmptyObject(buffer, packet),
101 => writeNormalObject(buffer, packet),
102 => writeObjectA(buffer, packet),
103 => writeObjectB(buffer, packet),
104 => writeSimpleObject(buffer, packet),
_ => println!("protocolId:[{}] not found", protocolId)
}
}
pub fn read(buffer: &mut dyn IByteBuffer) -> Box<dyn Any> {
let protocolId = buffer.readShort();
return readNoProtocolId(buffer, protocolId);
}
pub fn readNoProtocolId(buffer: &mut dyn IByteBuffer, protocolId: i16) -> Box<dyn Any> {
let packet = match protocolId {
0 => readEmptyObject(buffer),
101 => readNormalObject(buffer),
102 => readObjectA(buffer),
103 => readObjectB(buffer),
104 => readSimpleObject(buffer),
_ => Box::new(String::from("protocolId not found"))
};
return packet;
}
@@ -0,0 +1,57 @@
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(unused_mut)]
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use std::any::Any;
use std::collections::HashMap;
use std::collections::HashSet;
use crate::zfoorust::i_byte_buffer::{IByteBuffer, IPacket};
#[derive(Clone)]
pub struct SimpleObject {
pub c: i32,
pub g: bool,
}
impl IPacket for SimpleObject {
fn protocolId(&self) -> i16 {
return 104;
}
}
impl SimpleObject {
pub fn new() -> SimpleObject {
let packet = SimpleObject {
c: 0,
g: false,
};
return packet;
}
}
pub fn writeSimpleObject(buffer: &mut dyn IByteBuffer, packet: &dyn Any) {
let message = packet.downcast_ref::<SimpleObject>().unwrap();
buffer.writeInt(-1);
buffer.writeInt(message.c);
buffer.writeBool(message.g);
}
pub fn readSimpleObject(buffer: &mut dyn IByteBuffer) -> Box<dyn Any> {
let length = buffer.readInt();
let mut packet = SimpleObject::new();
if length == 0 {
return Box::new(packet);
}
let beforeReadIndex = buffer.getReadOffset();
let result0 = buffer.readInt();
packet.c = result0;
let result1 = buffer.readBool();
packet.g = result1;
if length > 0 {
buffer.setReadOffset(beforeReadIndex + length);
}
return Box::new(packet);
}