Skip to main content

sbd_lib/mt/
confirmation_status.rs

1use crate::Result;
2use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
3use std::io::{Read, Write};
4
5/// The Message Delivery Confirmation of a mobile-originated session.
6///
7/// The descriptions for these codes are taken directly from the `DirectIP` documentation.
8#[derive(Copy, Clone, Debug, Eq, PartialEq)]
9pub struct ConfirmationStatus {
10    /// The Unique Client Message ID this message.
11    pub message_id: u32,
12    /// The device id.
13    pub imei: [u8; 15],
14    /// The Iridium Gateway id for this message.
15    pub auto_id: u32,
16    /// Message Status
17    pub status: i16,
18}
19impl ConfirmationStatus {
20    pub fn status(&self) -> bool {
21        self.status > 0
22    }
23
24    pub fn read_from(read: &mut dyn Read) -> Result<Self> {
25        use crate::Error;
26
27        let message_id = read.read_u32::<BigEndian>().map_err(Error::Io)?;
28        let mut imei = [0; 15];
29        read.read_exact(&mut imei).map_err(Error::Io)?;
30        let auto_id = read.read_u32::<BigEndian>().map_err(Error::Io)?;
31
32        let status = read.read_i16::<BigEndian>().map_err(Error::Io)?;
33
34        Ok(ConfirmationStatus {
35            message_id,
36            auto_id,
37            imei,
38            status,
39        })
40    }
41
42    pub fn write_to<W: Write>(&self, write: &mut W) -> Result<()> {
43        write.write_u8(0x44)?;
44        write.write_u16::<BigEndian>(25)?;
45        write.write_u32::<BigEndian>(self.message_id)?;
46        write.write_all(&self.imei)?;
47        write.write_u32::<BigEndian>(self.auto_id)?;
48        write.write_i16::<BigEndian>(self.status)?;
49        Ok(())
50    }
51
52    pub fn len(&self) -> usize {
53        28
54    }
55}