bms_sm/
string_data.rs

1// FalconSharedMemoryAreaString
2mod string_id;
3use std::{collections::HashMap, mem::size_of};
4
5pub use string_id::*;
6
7use crate::{MemoryFile, RawMemoryFile};
8
9#[repr(C)]
10#[derive(Debug, Default)]
11pub struct StringAreaHeader {
12    version_num: u32,
13    no_of_strings: u32,
14    data_size: u32,
15}
16
17#[repr(C)]
18#[derive(Debug, Default)]
19pub struct StringHeader {
20    str_id: StringId,
21    length: u32,
22}
23
24pub struct StringData;
25
26impl StringData {
27    pub fn read() -> Result<HashMap<StringId, String>, Box<dyn std::error::Error + Send + Sync>> {
28        let header =
29            unsafe { MemoryFile::<StringAreaHeader>::new("FalconSharedMemoryAreaString")? };
30
31        let header = header.read();
32
33        let mut offset = size_of::<StringAreaHeader>();
34        let mut strings: HashMap<StringId, String> = HashMap::new();
35
36        for _ in 0..header.no_of_strings {
37            if offset >= header.data_size as usize {
38                break;
39            }
40
41            let header_size = size_of::<StringHeader>();
42            let string_header = unsafe {
43                MemoryFile::<StringHeader>::new_with_offset_and_size(
44                    "FalconSharedMemoryAreaString",
45                    offset,
46                    header_size,
47                )?
48            };
49
50            offset += header_size;
51            if offset >= header.data_size as usize {
52                break;
53            }
54
55            let string_data = string_header.read();
56
57            let string = unsafe {
58                RawMemoryFile::new_with_offset_and_size(
59                    "FalconSharedMemoryAreaString",
60                    offset,
61                    string_data.length as usize,
62                )?
63            };
64            let string = String::from_utf8_lossy(string.read());
65
66            strings.insert(string_data.str_id, string.to_string());
67
68            offset += string_data.length as usize + 1;
69        }
70
71        Ok(strings)
72    }
73}