smpp_pdu/pdu/data/
bind_data.rs

1use 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}