smpp_pdu/pdu/data/
bind_data.rs1use std::io;
2
3use crate::pdu::formats::{COctetString, Integer1, WriteStream};
4use crate::pdu::pduparseerror::fld;
5use crate::pdu::{PduParseError, PduParseErrorBody};
6
7const MAX_LENGTH_SYSTEM_ID: usize = 16;
8const MAX_LENGTH_PASSWORD: usize = 9;
9const MAX_LENGTH_SYSTEM_TYPE: usize = 13;
10const MAX_LENGTH_ADDRESS_RANGE: usize = 41;
11
12#[derive(Debug, PartialEq)]
13pub struct BindData {
14 pub system_id: COctetString,
15 pub password: COctetString,
16 pub system_type: COctetString,
17 pub interface_version: Integer1,
18 pub addr_ton: Integer1,
19 pub addr_npi: Integer1,
20 pub address_range: COctetString,
21}
22
23impl BindData {
24 pub fn new(
25 system_id: &str,
26 password: &str,
27 system_type: &str,
28 interface_version: u8,
29 addr_ton: u8,
30 addr_npi: u8,
31 address_range: &str,
32 ) -> Result<Self, PduParseError> {
33 Ok(Self {
34 system_id: fld(
35 "system_id",
36 COctetString::from_str(system_id, MAX_LENGTH_SYSTEM_ID),
37 )?,
38 password: fld(
39 "password",
40 COctetString::from_str(password, MAX_LENGTH_PASSWORD),
41 )?,
42 system_type: fld(
43 "system_type",
44 COctetString::from_str(system_type, MAX_LENGTH_SYSTEM_TYPE),
45 )?,
46 interface_version: Integer1::new(interface_version),
47 addr_ton: Integer1::new(addr_ton),
48 addr_npi: Integer1::new(addr_npi),
49 address_range: fld(
50 "address_range",
51 COctetString::from_str(address_range, MAX_LENGTH_ADDRESS_RANGE),
52 )?,
53 })
54 }
55
56 pub async fn write(&self, _stream: &mut WriteStream) -> io::Result<()> {
57 todo!()
58 }
59
60 pub fn parse(
61 bytes: &mut dyn io::BufRead,
62 _command_status: u32,
63 ) -> Result<Self, PduParseError> {
64 let system_id =
65 fld("system_id", COctetString::read(bytes, MAX_LENGTH_SYSTEM_ID))?;
66 let password =
67 fld("password", COctetString::read(bytes, MAX_LENGTH_PASSWORD))?;
68 let system_type = fld(
69 "system_type",
70 COctetString::read(bytes, MAX_LENGTH_SYSTEM_TYPE),
71 )?;
72 let interface_version =
73 fld("interface_version", Integer1::read(bytes))?;
74 let addr_ton = fld("addr_ton", Integer1::read(bytes))?;
75 let addr_npi = fld("addr_npi", Integer1::read(bytes))?;
76 let address_range = fld(
77 "address_range",
78 COctetString::read(bytes, MAX_LENGTH_ADDRESS_RANGE),
79 )?;
80
81 Ok(Self {
82 system_id,
83 password,
84 system_type,
85 interface_version,
86 addr_ton,
87 addr_npi,
88 address_range,
89 })
90 }
91
92 pub fn validate_command_status(
93 self,
94 command_status: u32,
95 ) -> Result<Self, PduParseError> {
96 if command_status == 0x00000000 {
97 Ok(self)
98 } else {
99 Err(PduParseError::new(PduParseErrorBody::StatusIsNotZero))
100 }
101 }
102}