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