From 6f0d2d5de449ce235d094b0da84368952c05f75c Mon Sep 17 00:00:00 2001 From: Ondrej Babec Date: Sun, 20 Feb 2022 15:49:34 +0100 Subject: [PATCH] Fixed failures --- src/encoding/variable_byte_integer.rs | 4 ++-- src/main.rs | 13 +++++++++++-- src/packet/packet_type.rs | 2 +- src/packet/subscription_packet.rs | 25 ++++++++++++++++++++----- src/utils/buffer_writer.rs | 15 +++++++++------ 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/encoding/variable_byte_integer.rs b/src/encoding/variable_byte_integer.rs index 2964375..c0904fb 100644 --- a/src/encoding/variable_byte_integer.rs +++ b/src/encoding/variable_byte_integer.rs @@ -54,11 +54,11 @@ impl VariableByteIntegerEncoder { loop { let mut encoded_byte: u8; encoded_byte = var_int[i]; - + i = i + 1; if (encoded_byte & 128) == 0 { break; } - i = i + 1; + } return i; } diff --git a/src/main.rs b/src/main.rs index dd0bc92..c332a7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,12 +4,21 @@ use rust_mqtt::packet::property::*;*/ use std::fs::File; use std::io::Read;*/ +use rust_mqtt::packet::mqtt_packet::Packet; +use rust_mqtt::packet::subscription_packet::SubscriptionPacket; + fn main() { env_logger::builder() .filter_level(log::LevelFilter::Info) .format_timestamp_nanos() .init(); - + + let mut pckt: SubscriptionPacket<1> = SubscriptionPacket::new(); + let mut res = vec![0; 14]; + pckt.encode(&mut res); + println!("{:02X?}", res); + log::info!("xxx"); + /*let fl = File::open("/Users/obabec/development/school/rust-mqtt/mqtt_control_example.bin"); let mut f = File::open("/Users/obabec/development/school/rust-mqtt/mqtt_control_example.bin").expect("no file found"); @@ -17,7 +26,7 @@ fn main() { f.read(&mut buffer).expect("buffer overflow"); - //let mut txt = Vec::new(); + // let mut payld = *b"xxxxx";*/ //let packet = Packet::clean(txt, &mut payld); /*let mut buffer_reader = BuffReader::new(&buffer); diff --git a/src/packet/packet_type.rs b/src/packet/packet_type.rs index 7502580..679a4a3 100644 --- a/src/packet/packet_type.rs +++ b/src/packet/packet_type.rs @@ -55,7 +55,7 @@ impl Into for PacketType { PacketType::Pubrec => 0x50, PacketType::Pubrel => 0x60, PacketType::Pubcomp => 0x70, - PacketType::Subscribe => 0x80, + PacketType::Subscribe => 0x82, PacketType::Suback => 0x90, PacketType::Unsubscribe => 0xA0, PacketType::Unsuback => 0xB0, diff --git a/src/packet/subscription_packet.rs b/src/packet/subscription_packet.rs index eb15677..af3c610 100644 --- a/src/packet/subscription_packet.rs +++ b/src/packet/subscription_packet.rs @@ -32,9 +32,15 @@ pub struct SubscriptionPacket<'a, const MAX_FILTERS: usize> { } impl<'a, const MAX_FILTERS: usize> SubscriptionPacket<'a, MAX_FILTERS> { - /*pub fn new() -> Self { - - }*/ + pub fn new() -> Self { + let mut x = Self { fixed_header: PacketType::Subscribe.into(), remain_len: 0, packet_identifier: 1, + property_len: 0, properties: Vec::, MAX_PROPERTIES>::new(), topic_filter_len: 1, topic_filters: Vec::, MAX_FILTERS>::new() }; + let mut p = TopicFilter::new(); + p.filter.len = 6; + p.filter.string = "test/#"; + x.topic_filters.push(p); + return x; + } } impl<'a, const MAX_FILTERS: usize> Packet<'a> for SubscriptionPacket<'a, MAX_FILTERS> { @@ -44,14 +50,23 @@ impl<'a, const MAX_FILTERS: usize> Packet<'a> for SubscriptionPacket<'a, MAX_FIL let mut rm_ln = self.property_len; let property_len_enc: [u8; 4] = VariableByteIntegerEncoder::encode(self.property_len).unwrap(); let property_len_len = VariableByteIntegerEncoder::len(property_len_enc); - rm_ln = rm_ln + property_len_len as u32 + 4 + self.topic_filter_len as u32; + + let mut lt = 0; + let mut filters_len = 0; + loop { + filters_len = filters_len + self.topic_filters.get(lt).unwrap().filter.len + 3; + lt = lt + 1; + if lt == self.topic_filter_len as usize { + break; + } + } + rm_ln = rm_ln + property_len_len as u32 + 2 + filters_len as u32; buff_writer.write_u8(self.fixed_header); buff_writer.write_variable_byte_int(rm_ln); buff_writer.write_u16(self.packet_identifier); buff_writer.write_variable_byte_int(self.property_len); buff_writer.encode_properties::(&self.properties); - buff_writer.write_u16(self.topic_filter_len); buff_writer.encode_topic_filters_ref(false, self.topic_filter_len as usize, & self.topic_filters); } diff --git a/src/utils/buffer_writer.rs b/src/utils/buffer_writer.rs index ed6abb1..f148044 100644 --- a/src/utils/buffer_writer.rs +++ b/src/utils/buffer_writer.rs @@ -107,12 +107,14 @@ impl<'a> BuffWriter<'a> { pub fn encode_properties(& mut self, properties: & Vec, LEN>) { let mut i = 0; - loop { - let prop: &Property = properties.get(i).unwrap(); - self.encode_property(prop); - i = i + 1; - if i == LEN { - break; + if properties.len() != 0 { + loop { + let prop: &Property = properties.get(i).unwrap(); + self.encode_property(prop); + i = i + 1; + if i == LEN { + break; + } } } } @@ -129,6 +131,7 @@ impl<'a> BuffWriter<'a> { loop { let topic_filter: & TopicFilter<'a> = filters.get(i).unwrap(); self.encode_topic_filter_ref(sub, topic_filter); + i = i + 1; if i == len { break; }