msg_tool\ext/
io.rs

1//!Extensions for IO operations.
2use crate::scripts::base::ReadSeek;
3use crate::types::Encoding;
4use crate::utils::encoding::{decode_to_string, encode_string};
5use crate::utils::struct_pack::{StructPack, StructUnpack};
6use std::ffi::CString;
7use std::io::*;
8use std::sync::{Arc, Mutex};
9
10/// A trait to help to peek data from a reader.
11pub trait Peek {
12    /// Peeks data from the reader into the provided buffer.
13    /// Returns the number of bytes read.
14    fn peek(&mut self, buf: &mut [u8]) -> Result<usize>;
15    /// Peeks data from the reader into the provided buffer.
16    /// Returns an error if the buffer is not filled completely.
17    fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()>;
18    /// Peeks data from the reader at a specific offset into the provided buffer.
19    /// Returns the number of bytes read.
20    fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize>;
21    /// Peeks data from the reader at a specific offset into the provided buffer.
22    /// Returns an error if the buffer is not filled completely.
23    fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()>;
24    /// Peeks data from the reader at a specific offset into a vector.
25    /// Returns the vector containing the data read.
26    fn peek_at_vec(&mut self, offset: u64, len: usize) -> Result<Vec<u8>> {
27        let mut buf = vec![0u8; len];
28        let bytes_read = self.peek_at(offset, &mut buf)?;
29        if bytes_read < len {
30            buf.truncate(bytes_read);
31        }
32        Ok(buf)
33    }
34    /// Peeks data from the reader at a specific offset into a vector.
35    /// Returns an error if the buffer is not filled completely.
36    fn peek_exact_at_vec(&mut self, offset: u64, len: usize) -> Result<Vec<u8>> {
37        let mut buf = vec![0u8; len];
38        self.peek_exact_at(offset, &mut buf)?;
39        Ok(buf)
40    }
41
42    /// Peeks a [u8] from the reader.
43    fn peek_u8(&mut self) -> Result<u8> {
44        let mut buf = [0u8; 1];
45        self.peek_exact(&mut buf)?;
46        Ok(buf[0])
47    }
48    /// Peeks a [u16] from the reader in little-endian order.
49    fn peek_u16(&mut self) -> Result<u16> {
50        let mut buf = [0u8; 2];
51        self.peek_exact(&mut buf)?;
52        Ok(u16::from_le_bytes(buf))
53    }
54    /// Peeks a [u16] from the reader in big-endian order.
55    fn peek_u16_be(&mut self) -> Result<u16> {
56        let mut buf = [0u8; 2];
57        self.peek_exact(&mut buf)?;
58        Ok(u16::from_be_bytes(buf))
59    }
60    /// Peeks a [u32] from the reader in little-endian order.
61    fn peek_u32(&mut self) -> Result<u32> {
62        let mut buf = [0u8; 4];
63        self.peek_exact(&mut buf)?;
64        Ok(u32::from_le_bytes(buf))
65    }
66    /// Peeks a [u32] from the reader in big-endian order.
67    fn peek_u32_be(&mut self) -> Result<u32> {
68        let mut buf = [0u8; 4];
69        self.peek_exact(&mut buf)?;
70        Ok(u32::from_be_bytes(buf))
71    }
72    /// Peeks a [u64] from the reader in little-endian order.
73    fn peek_u64(&mut self) -> Result<u64> {
74        let mut buf = [0u8; 8];
75        self.peek_exact(&mut buf)?;
76        Ok(u64::from_le_bytes(buf))
77    }
78    /// Peeks a [u64] from the reader in big-endian order.
79    fn peek_u64_be(&mut self) -> Result<u64> {
80        let mut buf = [0u8; 8];
81        self.peek_exact(&mut buf)?;
82        Ok(u64::from_be_bytes(buf))
83    }
84    /// Peeks a [u128] from the reader in little-endian order.
85    fn peek_u128(&mut self) -> Result<u128> {
86        let mut buf = [0u8; 16];
87        self.peek_exact(&mut buf)?;
88        Ok(u128::from_le_bytes(buf))
89    }
90    /// Peeks a [u128] from the reader in big-endian order.
91    fn peek_u128_be(&mut self) -> Result<u128> {
92        let mut buf = [0u8; 16];
93        self.peek_exact(&mut buf)?;
94        Ok(u128::from_be_bytes(buf))
95    }
96    /// Peeks an [i8] from the reader.
97    fn peek_i8(&mut self) -> Result<i8> {
98        let mut buf = [0u8; 1];
99        self.peek_exact(&mut buf)?;
100        Ok(i8::from_le_bytes(buf))
101    }
102    /// Peeks an [i16] from the reader in little-endian order.
103    fn peek_i16(&mut self) -> Result<i16> {
104        let mut buf = [0u8; 2];
105        self.peek_exact(&mut buf)?;
106        Ok(i16::from_le_bytes(buf))
107    }
108    /// Peeks an [i16] from the reader in big-endian order.
109    fn peek_i16_be(&mut self) -> Result<i16> {
110        let mut buf = [0u8; 2];
111        self.peek_exact(&mut buf)?;
112        Ok(i16::from_be_bytes(buf))
113    }
114    /// Peeks an [i32] from the reader in little-endian order.
115    fn peek_i32(&mut self) -> Result<i32> {
116        let mut buf = [0u8; 4];
117        self.peek_exact(&mut buf)?;
118        Ok(i32::from_le_bytes(buf))
119    }
120    /// Peeks an [i32] from the reader in big-endian order.
121    fn peek_i32_be(&mut self) -> Result<i32> {
122        let mut buf = [0u8; 4];
123        self.peek_exact(&mut buf)?;
124        Ok(i32::from_be_bytes(buf))
125    }
126    /// Peeks an [i64] from the reader in little-endian order.
127    fn peek_i64(&mut self) -> Result<i64> {
128        let mut buf = [0u8; 8];
129        self.peek_exact(&mut buf)?;
130        Ok(i64::from_le_bytes(buf))
131    }
132    /// Peeks an [i64] from the reader in big-endian order.
133    fn peek_i64_be(&mut self) -> Result<i64> {
134        let mut buf = [0u8; 8];
135        self.peek_exact(&mut buf)?;
136        Ok(i64::from_be_bytes(buf))
137    }
138    /// Peeks an [i128] from the reader in little-endian order.
139    fn peek_i128(&mut self) -> Result<i128> {
140        let mut buf = [0u8; 16];
141        self.peek_exact(&mut buf)?;
142        Ok(i128::from_le_bytes(buf))
143    }
144    /// Peeks an [i128] from the reader in big-endian order.
145    fn peek_i128_be(&mut self) -> Result<i128> {
146        let mut buf = [0u8; 16];
147        self.peek_exact(&mut buf)?;
148        Ok(i128::from_be_bytes(buf))
149    }
150    /// Peeks a [u8] at a specific offset from the reader.
151    fn peek_u8_at(&mut self, offset: u64) -> Result<u8> {
152        let mut buf = [0u8; 1];
153        self.peek_exact_at(offset, &mut buf)?;
154        Ok(buf[0])
155    }
156    /// Peeks a [u16] at a specific offset from the reader in little-endian order.
157    fn peek_u16_at(&mut self, offset: u64) -> Result<u16> {
158        let mut buf = [0u8; 2];
159        self.peek_exact_at(offset, &mut buf)?;
160        Ok(u16::from_le_bytes(buf))
161    }
162    /// Peeks a [u16] at a specific offset from the reader in big-endian order.
163    fn peek_u16_be_at(&mut self, offset: u64) -> Result<u16> {
164        let mut buf = [0u8; 2];
165        self.peek_exact_at(offset, &mut buf)?;
166        Ok(u16::from_be_bytes(buf))
167    }
168    /// Peeks a [u32] at a specific offset from the reader in little-endian order.
169    fn peek_u32_at(&mut self, offset: u64) -> Result<u32> {
170        let mut buf = [0u8; 4];
171        self.peek_exact_at(offset, &mut buf)?;
172        Ok(u32::from_le_bytes(buf))
173    }
174    /// Peeks a [u32] at a specific offset from the reader in big-endian order.
175    fn peek_u32_be_at(&mut self, offset: u64) -> Result<u32> {
176        let mut buf = [0u8; 4];
177        self.peek_exact_at(offset, &mut buf)?;
178        Ok(u32::from_be_bytes(buf))
179    }
180    /// Peeks a [u64] at a specific offset from the reader in little-endian order.
181    fn peek_u64_at(&mut self, offset: u64) -> Result<u64> {
182        let mut buf = [0u8; 8];
183        self.peek_exact_at(offset, &mut buf)?;
184        Ok(u64::from_le_bytes(buf))
185    }
186    /// Peeks a [u64] at a specific offset from the reader in big-endian order.
187    fn peek_u64_be_at(&mut self, offset: u64) -> Result<u64> {
188        let mut buf = [0u8; 8];
189        self.peek_exact_at(offset, &mut buf)?;
190        Ok(u64::from_be_bytes(buf))
191    }
192    /// Peeks a [u128] at a specific offset from the reader in little-endian order.
193    fn peek_u128_at(&mut self, offset: u64) -> Result<u128> {
194        let mut buf = [0u8; 16];
195        self.peek_exact_at(offset, &mut buf)?;
196        Ok(u128::from_le_bytes(buf))
197    }
198    /// Peeks a [u128] at a specific offset from the reader in big-endian order.
199    fn peek_u128_be_at(&mut self, offset: u64) -> Result<u128> {
200        let mut buf = [0u8; 16];
201        self.peek_exact_at(offset, &mut buf)?;
202        Ok(u128::from_be_bytes(buf))
203    }
204    /// Peeks an [i8] at a specific offset from the reader.
205    fn peek_i8_at(&mut self, offset: u64) -> Result<i8> {
206        let mut buf = [0u8; 1];
207        self.peek_exact_at(offset, &mut buf)?;
208        Ok(i8::from_le_bytes(buf))
209    }
210    /// Peeks an [i16] at a specific offset from the reader in little-endian order.
211    fn peek_i16_at(&mut self, offset: u64) -> Result<i16> {
212        let mut buf = [0u8; 2];
213        self.peek_exact_at(offset, &mut buf)?;
214        Ok(i16::from_le_bytes(buf))
215    }
216    /// Peeks an [i16] at a specific offset from the reader in big-endian order.
217    fn peek_i16_be_at(&mut self, offset: u64) -> Result<i16> {
218        let mut buf = [0u8; 2];
219        self.peek_exact_at(offset, &mut buf)?;
220        Ok(i16::from_be_bytes(buf))
221    }
222    /// Peeks an [i32] at a specific offset from the reader in little-endian order.
223    fn peek_i32_at(&mut self, offset: u64) -> Result<i32> {
224        let mut buf = [0u8; 4];
225        self.peek_exact_at(offset, &mut buf)?;
226        Ok(i32::from_le_bytes(buf))
227    }
228    /// Peeks an [i32] at a specific offset from the reader in big-endian order.
229    fn peek_i32_be_at(&mut self, offset: u64) -> Result<i32> {
230        let mut buf = [0u8; 4];
231        self.peek_exact_at(offset, &mut buf)?;
232        Ok(i32::from_be_bytes(buf))
233    }
234    /// Peeks an [i64] at a specific offset from the reader in little-endian order.
235    fn peek_i64_at(&mut self, offset: u64) -> Result<i64> {
236        let mut buf = [0u8; 8];
237        self.peek_exact_at(offset, &mut buf)?;
238        Ok(i64::from_le_bytes(buf))
239    }
240    /// Peeks an [i64] at a specific offset from the reader in big-endian order.
241    fn peek_i64_be_at(&mut self, offset: u64) -> Result<i64> {
242        let mut buf = [0u8; 8];
243        self.peek_exact_at(offset, &mut buf)?;
244        Ok(i64::from_be_bytes(buf))
245    }
246    /// Peeks an [i128] at a specific offset from the reader in little-endian order.
247    fn peek_i128_at(&mut self, offset: u64) -> Result<i128> {
248        let mut buf = [0u8; 16];
249        self.peek_exact_at(offset, &mut buf)?;
250        Ok(i128::from_le_bytes(buf))
251    }
252    /// Peeks an [i128] at a specific offset from the reader in big-endian order.
253    fn peek_i128_be_at(&mut self, offset: u64) -> Result<i128> {
254        let mut buf = [0u8; 16];
255        self.peek_exact_at(offset, &mut buf)?;
256        Ok(i128::from_be_bytes(buf))
257    }
258
259    /// Peeks a C-style string (null-terminated) from the reader.
260    fn peek_cstring(&mut self) -> Result<CString>;
261    /// Peeks a C-style string (null-terminated) from the reader at a specific offset.
262    fn peek_cstring_at(&mut self, offset: u64) -> Result<CString>;
263    /// Peeks a fixed-length string from the reader.
264    fn peek_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
265        let mut buf = vec![0u8; len];
266        self.peek_exact(&mut buf)?;
267        if trim {
268            let first_zero = buf.iter().position(|&b| b == 0);
269            if let Some(pos) = first_zero {
270                buf.truncate(pos);
271            }
272        }
273        let s = decode_to_string(encoding, &buf, true)
274            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
275        Ok(s)
276    }
277    /// Peeks a fixed-length string from the reader at a specific offset.
278    fn peek_fstring_at(
279        &mut self,
280        offset: u64,
281        len: usize,
282        encoding: Encoding,
283        trim: bool,
284    ) -> Result<String> {
285        let mut buf = vec![0u8; len];
286        self.peek_exact_at(offset, &mut buf)?;
287        if trim {
288            let first_zero = buf.iter().position(|&b| b == 0);
289            if let Some(pos) = first_zero {
290                buf.truncate(pos);
291            }
292        }
293        let s = decode_to_string(encoding, &buf, true)
294            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
295        Ok(s)
296    }
297
298    /// Peeks a UTF-16 string (null-terminated) from the reader.
299    /// Returns the raw bytes of the UTF-16 string. (Null terminator is not included)
300    fn peek_u16string(&mut self) -> Result<Vec<u8>>;
301    /// Peeks a UTF-16 string (null-terminated) from the reader at a specific offset.
302    /// Returns the raw bytes of the UTF-16 string. (Null terminator is not included)
303    fn peek_u16string_at(&mut self, offset: u64) -> Result<Vec<u8>>;
304
305    /// Reads a struct from the reader.
306    /// The struct must implement the `StructUnpack` trait.
307    ///
308    /// * `big` indicates whether the struct is in big-endian format.
309    /// * `encoding` specifies the encoding to use for string fields in the struct.
310    /// Returns the unpacked struct.
311    fn read_struct<T: StructUnpack>(
312        &mut self,
313        big: bool,
314        encoding: Encoding,
315        info: &Option<Box<dyn std::any::Any>>,
316    ) -> Result<T>;
317    /// Reads a vector of structs from the reader.
318    /// The structs must implement the `StructUnpack` trait.
319    ///
320    /// * `count` is the number of structs to read.
321    /// * `big` indicates whether the structs are in big-endian format.
322    /// * `encoding` specifies the encoding to use for string fields in the structs.
323    /// Returns a vector of unpacked structs.
324    fn read_struct_vec<T: StructUnpack>(
325        &mut self,
326        count: usize,
327        big: bool,
328        encoding: Encoding,
329        info: &Option<Box<dyn std::any::Any>>,
330    ) -> Result<Vec<T>> {
331        self.read_struct_vec2(count, big, encoding, info, 4194304)
332    }
333    /// Reads a vector of structs from the reader.
334    /// The structs must implement the `StructUnpack` trait.
335    ///
336    /// * `count` is the number of structs to read.
337    /// * `big` indicates whether the structs are in big-endian format.
338    /// * `encoding` specifies the encoding to use for string fields in the structs.
339    /// Returns a vector of unpacked structs.
340    fn read_struct_vec2<T: StructUnpack>(
341        &mut self,
342        count: usize,
343        big: bool,
344        encoding: Encoding,
345        info: &Option<Box<dyn std::any::Any>>,
346        max_preallocated_size: usize,
347    ) -> Result<Vec<T>> {
348        let mut vec = if size_of::<T>() * count <= max_preallocated_size {
349            Vec::with_capacity(count)
350        } else {
351            Vec::new()
352        };
353        for _ in 0..count {
354            vec.push(self.read_struct(big, encoding, info)?);
355        }
356        Ok(vec)
357    }
358
359    /// Peeks data and checks if it matches the provided data.
360    fn peek_and_equal(&mut self, data: &[u8]) -> Result<()> {
361        let mut buf = vec![0u8; data.len()];
362        self.peek_exact(&mut buf)?;
363        if buf != data {
364            return Err(std::io::Error::new(
365                std::io::ErrorKind::InvalidData,
366                "Data does not match",
367            ));
368        }
369        Ok(())
370    }
371    /// Peeks data at a specific offset and checks if it matches the provided data.
372    fn peek_and_equal_at(&mut self, offset: u64, data: &[u8]) -> Result<()> {
373        let mut buf = vec![0u8; data.len()];
374        self.peek_exact_at(offset, &mut buf)?;
375        if buf != data {
376            return Err(std::io::Error::new(
377                std::io::ErrorKind::InvalidData,
378                "Data does not match at offset",
379            ));
380        }
381        Ok(())
382    }
383}
384
385impl<T: Read + Seek> Peek for T {
386    fn peek(&mut self, buf: &mut [u8]) -> Result<usize> {
387        let current_pos = self.stream_position()?;
388        let bytes_read = self.read(buf)?;
389        self.seek(SeekFrom::Start(current_pos))?;
390        Ok(bytes_read)
391    }
392
393    fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()> {
394        let current_pos = self.stream_position()?;
395        self.read_exact(buf)?;
396        self.seek(SeekFrom::Start(current_pos))?;
397        Ok(())
398    }
399
400    fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize> {
401        let current_pos = self.stream_position()?;
402        self.seek(SeekFrom::Start(offset))?;
403        let bytes_read = self.read(buf)?;
404        self.seek(SeekFrom::Start(current_pos))?;
405        Ok(bytes_read)
406    }
407
408    fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()> {
409        let current_pos = self.stream_position()?;
410        self.seek(SeekFrom::Start(offset))?;
411        self.read_exact(buf)?;
412        self.seek(SeekFrom::Start(current_pos))?;
413        Ok(())
414    }
415
416    fn peek_cstring(&mut self) -> Result<CString> {
417        let current_pos = self.stream_position()?;
418        let mut buf = Vec::new();
419        loop {
420            let mut byte = [0u8; 1];
421            self.read_exact(&mut byte)?;
422            if byte[0] == 0 {
423                break;
424            }
425            buf.push(byte[0]);
426        }
427        self.seek(SeekFrom::Start(current_pos))?;
428        CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
429    }
430
431    fn peek_cstring_at(&mut self, offset: u64) -> Result<CString> {
432        let current_pos = self.stream_position()?;
433        let mut buf = Vec::new();
434        self.seek(SeekFrom::Start(offset as u64))?;
435        loop {
436            let mut byte = [0u8; 1];
437            self.read_exact(&mut byte)?;
438            if byte[0] == 0 {
439                break;
440            }
441            buf.push(byte[0]);
442        }
443        self.seek(SeekFrom::Start(current_pos))?;
444        CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
445    }
446
447    fn peek_u16string(&mut self) -> Result<Vec<u8>> {
448        let current_pos = self.stream_position()?;
449        let mut buf = Vec::new();
450        loop {
451            let mut bytes = [0u8; 2];
452            self.read_exact(&mut bytes)?;
453            if bytes == [0, 0] {
454                break;
455            }
456            buf.extend_from_slice(&bytes);
457        }
458        self.seek(SeekFrom::Start(current_pos))?;
459        Ok(buf)
460    }
461
462    fn peek_u16string_at(&mut self, offset: u64) -> Result<Vec<u8>> {
463        let current_pos = self.stream_position()?;
464        let mut buf = Vec::new();
465        self.seek(SeekFrom::Start(offset as u64))?;
466        loop {
467            let mut bytes = [0u8; 2];
468            self.read_exact(&mut bytes)?;
469            if bytes == [0, 0] {
470                break;
471            }
472            buf.extend_from_slice(&bytes);
473        }
474        self.seek(SeekFrom::Start(current_pos))?;
475        Ok(buf)
476    }
477
478    fn read_struct<S: StructUnpack>(
479        &mut self,
480        big: bool,
481        encoding: Encoding,
482        info: &Option<Box<dyn std::any::Any>>,
483    ) -> Result<S> {
484        S::unpack(self, big, encoding, info)
485            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
486    }
487}
488
489/// A trait to help to peek data from a reader in a thread-safe manner.
490pub trait CPeek {
491    /// Peeks data from the reader into the provided buffer.
492    /// Returns the number of bytes read.
493    fn cpeek(&self, buf: &mut [u8]) -> Result<usize>;
494    /// Peeks data from the reader into the provided buffer.
495    /// Returns an error if the buffer is not filled completely.
496    fn cpeek_exact(&self, buf: &mut [u8]) -> Result<()> {
497        let bytes_read = self.cpeek(buf)?;
498        if bytes_read < buf.len() {
499            return Err(std::io::Error::new(
500                std::io::ErrorKind::UnexpectedEof,
501                "Not enough data to read",
502            ));
503        }
504        Ok(())
505    }
506    /// Peeks data from the reader at a specific offset into the provided buffer.
507    /// Returns the number of bytes read.
508    fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize>;
509    /// Peeks data from the reader at a specific offset into the provided buffer.
510    /// Returns an error if the buffer is not filled completely.
511    fn cpeek_exact_at(&self, offset: u64, buf: &mut [u8]) -> Result<()> {
512        let bytes_read = self.cpeek_at(offset, buf)?;
513        if bytes_read < buf.len() {
514            return Err(std::io::Error::new(
515                std::io::ErrorKind::UnexpectedEof,
516                "Not enough data to read",
517            ));
518        }
519        Ok(())
520    }
521    /// Peeks data from the reader at a specific offset into a vector.
522    /// Returns the vector containing the data read.
523    fn cpeek_at_vec(&self, offset: u64, len: usize) -> Result<Vec<u8>> {
524        let mut buf = vec![0u8; len];
525        let bytes_read = self.cpeek_at(offset, &mut buf)?;
526        if bytes_read < len {
527            buf.truncate(bytes_read);
528        }
529        Ok(buf)
530    }
531    /// Peeks data from the reader at a specific offset into a vector.
532    /// Returns an error if the buffer is not filled completely.
533    fn cpeek_exact_at_vec(&self, offset: u64, len: usize) -> Result<Vec<u8>> {
534        let mut buf = vec![0u8; len];
535        self.cpeek_exact_at(offset, &mut buf)?;
536        Ok(buf)
537    }
538
539    /// Peeks a [u8] from the reader.
540    fn cpeek_u8(&self) -> Result<u8> {
541        let mut buf = [0u8; 1];
542        self.cpeek_exact(&mut buf)?;
543        Ok(buf[0])
544    }
545    /// Peeks a [u16] from the reader in little-endian order.
546    fn cpeek_u16(&self) -> Result<u16> {
547        let mut buf = [0u8; 2];
548        self.cpeek_exact(&mut buf)?;
549        Ok(u16::from_le_bytes(buf))
550    }
551    /// Peeks a [u16] from the reader in big-endian order.
552    fn cpeek_u16_be(&self) -> Result<u16> {
553        let mut buf = [0u8; 2];
554        self.cpeek_exact(&mut buf)?;
555        Ok(u16::from_be_bytes(buf))
556    }
557    /// Peeks a [u32] from the reader in little-endian order.
558    fn cpeek_u32(&self) -> Result<u32> {
559        let mut buf = [0u8; 4];
560        self.cpeek_exact(&mut buf)?;
561        Ok(u32::from_le_bytes(buf))
562    }
563    /// Peeks a [u32] from the reader in big-endian order.
564    fn cpeek_u32_be(&self) -> Result<u32> {
565        let mut buf = [0u8; 4];
566        self.cpeek_exact(&mut buf)?;
567        Ok(u32::from_be_bytes(buf))
568    }
569    /// Peeks a [u64] from the reader in little-endian order.
570    fn cpeek_u64(&self) -> Result<u64> {
571        let mut buf = [0u8; 8];
572        self.cpeek_exact(&mut buf)?;
573        Ok(u64::from_le_bytes(buf))
574    }
575    /// Peeks a [u64] from the reader in big-endian order.
576    fn cpeek_u64_be(&self) -> Result<u64> {
577        let mut buf = [0u8; 8];
578        self.cpeek_exact(&mut buf)?;
579        Ok(u64::from_be_bytes(buf))
580    }
581    /// Peeks a [u128] from the reader in little-endian order.
582    fn cpeek_u128(&self) -> Result<u128> {
583        let mut buf = [0u8; 16];
584        self.cpeek_exact(&mut buf)?;
585        Ok(u128::from_le_bytes(buf))
586    }
587    /// Peeks a [u128] from the reader in big-endian order.
588    fn cpeek_u128_be(&self) -> Result<u128> {
589        let mut buf = [0u8; 16];
590        self.cpeek_exact(&mut buf)?;
591        Ok(u128::from_be_bytes(buf))
592    }
593    /// Peeks an [i8] from the reader.
594    fn cpeek_i8(&self) -> Result<i8> {
595        let mut buf = [0u8; 1];
596        self.cpeek_exact(&mut buf)?;
597        Ok(i8::from_le_bytes(buf))
598    }
599    /// Peeks an [i16] from the reader in little-endian order.
600    fn cpeek_i16(&self) -> Result<i16> {
601        let mut buf = [0u8; 2];
602        self.cpeek_exact(&mut buf)?;
603        Ok(i16::from_le_bytes(buf))
604    }
605    /// Peeks an [i16] from the reader in big-endian order.
606    fn cpeek_i16_be(&self) -> Result<i16> {
607        let mut buf = [0u8; 2];
608        self.cpeek_exact(&mut buf)?;
609        Ok(i16::from_be_bytes(buf))
610    }
611    /// Peeks an [i32] from the reader in little-endian order.
612    fn cpeek_i32(&self) -> Result<i32> {
613        let mut buf = [0u8; 4];
614        self.cpeek_exact(&mut buf)?;
615        Ok(i32::from_le_bytes(buf))
616    }
617    /// Peeks an [i32] from the reader in big-endian order.
618    fn cpeek_i32_be(&self) -> Result<i32> {
619        let mut buf = [0u8; 4];
620        self.cpeek_exact(&mut buf)?;
621        Ok(i32::from_be_bytes(buf))
622    }
623    /// Peeks an [i64] from the reader in little-endian order.
624    fn cpeek_i64(&self) -> Result<i64> {
625        let mut buf = [0u8; 8];
626        self.cpeek_exact(&mut buf)?;
627        Ok(i64::from_le_bytes(buf))
628    }
629    /// Peeks an [i64] from the reader in big-endian order.
630    fn cpeek_i64_be(&self) -> Result<i64> {
631        let mut buf = [0u8; 8];
632        self.cpeek_exact(&mut buf)?;
633        Ok(i64::from_be_bytes(buf))
634    }
635    /// Peeks an [i128] from the reader in little-endian order.
636    fn cpeek_i128(&self) -> Result<i128> {
637        let mut buf = [0u8; 16];
638        self.cpeek_exact(&mut buf)?;
639        Ok(i128::from_le_bytes(buf))
640    }
641    /// Peeks an [i128] from the reader in big-endian order.
642    fn cpeek_i128_be(&self) -> Result<i128> {
643        let mut buf = [0u8; 16];
644        self.cpeek_exact(&mut buf)?;
645        Ok(i128::from_be_bytes(buf))
646    }
647    /// Peeks a [u8] at a specific offset from the reader.
648    fn cpeek_u8_at(&self, offset: u64) -> Result<u8> {
649        let mut buf = [0u8; 1];
650        self.cpeek_exact_at(offset, &mut buf)?;
651        Ok(buf[0])
652    }
653    /// Peeks a [u16] at a specific offset from the reader in little-endian order.
654    fn cpeek_u16_at(&self, offset: u64) -> Result<u16> {
655        let mut buf = [0u8; 2];
656        self.cpeek_exact_at(offset, &mut buf)?;
657        Ok(u16::from_le_bytes(buf))
658    }
659    /// Peeks a [u16] at a specific offset from the reader in big-endian order.
660    fn cpeek_u16_be_at(&self, offset: u64) -> Result<u16> {
661        let mut buf = [0u8; 2];
662        self.cpeek_exact_at(offset, &mut buf)?;
663        Ok(u16::from_be_bytes(buf))
664    }
665    /// Peeks a [u32] at a specific offset from the reader in little-endian order.
666    fn cpeek_u32_at(&self, offset: u64) -> Result<u32> {
667        let mut buf = [0u8; 4];
668        self.cpeek_exact_at(offset, &mut buf)?;
669        Ok(u32::from_le_bytes(buf))
670    }
671    /// Peeks a [u32] at a specific offset from the reader in big-endian order.
672    fn cpeek_u32_be_at(&self, offset: u64) -> Result<u32> {
673        let mut buf = [0u8; 4];
674        self.cpeek_exact_at(offset, &mut buf)?;
675        Ok(u32::from_be_bytes(buf))
676    }
677    /// Peeks a [u64] at a specific offset from the reader in little-endian order.
678    fn cpeek_u64_at(&self, offset: u64) -> Result<u64> {
679        let mut buf = [0u8; 8];
680        self.cpeek_exact_at(offset, &mut buf)?;
681        Ok(u64::from_le_bytes(buf))
682    }
683    /// Peeks a [u64] at a specific offset from the reader in big-endian order.
684    fn cpeek_u64_be_at(&self, offset: u64) -> Result<u64> {
685        let mut buf = [0u8; 8];
686        self.cpeek_exact_at(offset, &mut buf)?;
687        Ok(u64::from_be_bytes(buf))
688    }
689    /// Peeks a [u128] at a specific offset from the reader in little-endian order.
690    fn cpeek_u128_at(&self, offset: u64) -> Result<u128> {
691        let mut buf = [0u8; 16];
692        self.cpeek_exact_at(offset, &mut buf)?;
693        Ok(u128::from_le_bytes(buf))
694    }
695    /// Peeks a [u128] at a specific offset from the reader in big-endian order.
696    fn cpeek_u128_be_at(&self, offset: u64) -> Result<u128> {
697        let mut buf = [0u8; 16];
698        self.cpeek_exact_at(offset, &mut buf)?;
699        Ok(u128::from_be_bytes(buf))
700    }
701    /// Peeks an [i8] at a specific offset from the reader.
702    fn cpeek_i8_at(&self, offset: u64) -> Result<i8> {
703        let mut buf = [0u8; 1];
704        self.cpeek_exact_at(offset, &mut buf)?;
705        Ok(i8::from_le_bytes(buf))
706    }
707    /// Peeks an [i16] at a specific offset from the reader in little-endian order.
708    fn cpeek_i16_at(&self, offset: u64) -> Result<i16> {
709        let mut buf = [0u8; 2];
710        self.cpeek_exact_at(offset, &mut buf)?;
711        Ok(i16::from_le_bytes(buf))
712    }
713    /// Peeks an [i16] at a specific offset from the reader in big-endian order.
714    fn cpeek_i16_be_at(&self, offset: u64) -> Result<i16> {
715        let mut buf = [0u8; 2];
716        self.cpeek_exact_at(offset, &mut buf)?;
717        Ok(i16::from_be_bytes(buf))
718    }
719    /// Peeks an [i32] at a specific offset from the reader in little-endian order.
720    fn cpeek_i32_at(&self, offset: u64) -> Result<i32> {
721        let mut buf = [0u8; 4];
722        self.cpeek_exact_at(offset, &mut buf)?;
723        Ok(i32::from_le_bytes(buf))
724    }
725    /// Peeks an [i32] at a specific offset from the reader in big-endian order.
726    fn cpeek_i32_be_at(&self, offset: u64) -> Result<i32> {
727        let mut buf = [0u8; 4];
728        self.cpeek_exact_at(offset, &mut buf)?;
729        Ok(i32::from_be_bytes(buf))
730    }
731    /// Peeks an [i64] at a specific offset from the reader in little-endian order.
732    fn cpeek_i64_at(&self, offset: u64) -> Result<i64> {
733        let mut buf = [0u8; 8];
734        self.cpeek_exact_at(offset, &mut buf)?;
735        Ok(i64::from_le_bytes(buf))
736    }
737    /// Peeks an [i64] at a specific offset from the reader in big-endian order.
738    fn cpeek_i64_be_at(&self, offset: u64) -> Result<i64> {
739        let mut buf = [0u8; 8];
740        self.cpeek_exact_at(offset, &mut buf)?;
741        Ok(i64::from_be_bytes(buf))
742    }
743    /// Peeks an [i128] at a specific offset from the reader in little-endian order.
744    fn cpeek_i128_at(&self, offset: u64) -> Result<i128> {
745        let mut buf = [0u8; 16];
746        self.cpeek_exact_at(offset, &mut buf)?;
747        Ok(i128::from_le_bytes(buf))
748    }
749    /// Peeks an [i128] at a specific offset from the reader in big-endian order.
750    fn cpeek_i128_be_at(&self, offset: u64) -> Result<i128> {
751        let mut buf = [0u8; 16];
752        self.cpeek_exact_at(offset, &mut buf)?;
753        Ok(i128::from_be_bytes(buf))
754    }
755
756    /// Peeks a C-style string (null-terminated) from the reader.
757    fn cpeek_cstring(&self) -> Result<CString>;
758
759    /// Peeks a C-style string (null-terminated) from the reader at a specific offset.
760    fn cpeek_cstring_at(&self, offset: u64) -> Result<CString> {
761        let mut buf = Vec::new();
762        let mut byte = [0u8; 1];
763        self.cpeek_at(offset, &mut byte)?;
764        while byte[0] != 0 {
765            buf.push(byte[0]);
766            self.cpeek_at(offset + buf.len() as u64, &mut byte)?;
767        }
768        CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
769    }
770
771    /// Peeks a fixed-length string from the reader.
772    fn cpeek_fstring(&self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
773        let mut buf = vec![0u8; len];
774        self.cpeek_exact(&mut buf)?;
775        if trim {
776            let first_zero = buf.iter().position(|&b| b == 0);
777            if let Some(pos) = first_zero {
778                buf.truncate(pos);
779            }
780        }
781        let s = decode_to_string(encoding, &buf, true)
782            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
783        Ok(s)
784    }
785    /// Peeks a fixed-length string from the reader at a specific offset.
786    fn cpeek_fstring_at(
787        &self,
788        offset: u64,
789        len: usize,
790        encoding: Encoding,
791        trim: bool,
792    ) -> Result<String> {
793        let mut buf = vec![0u8; len];
794        self.cpeek_exact_at(offset, &mut buf)?;
795        if trim {
796            let first_zero = buf.iter().position(|&b| b == 0);
797            if let Some(pos) = first_zero {
798                buf.truncate(pos);
799            }
800        }
801        let s = decode_to_string(encoding, &buf, true)
802            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
803        Ok(s)
804    }
805
806    /// Peeks a UTF-16 string (null-terminated) from the reader.
807    /// Returns the raw bytes of the UTF-16 string. (Null terminator is not included)
808    fn cpeek_u16string(&self) -> Result<Vec<u8>>;
809    /// Peeks a UTF-16 string (null-terminated) from the reader at a specific offset.
810    /// Returns the raw bytes of the UTF-16 string. (Null terminator is not
811    fn cpeek_u16string_at(&self, offset: u64) -> Result<Vec<u8>> {
812        let mut buf = Vec::new();
813        let mut bytes = [0u8; 2];
814        let mut current_offset = offset;
815        loop {
816            self.cpeek_exact_at(current_offset, &mut bytes)?;
817            if bytes == [0, 0] {
818                break;
819            }
820            buf.extend_from_slice(&bytes);
821            current_offset += 2;
822        }
823        Ok(buf)
824    }
825
826    /// Peeks data and checks if it matches the provided data.
827    fn cpeek_and_equal(&self, data: &[u8]) -> Result<()> {
828        let mut buf = vec![0u8; data.len()];
829        self.cpeek_exact(&mut buf)?;
830        if buf != data {
831            return Err(std::io::Error::new(
832                std::io::ErrorKind::InvalidData,
833                "Data does not match",
834            ));
835        }
836        Ok(())
837    }
838    /// Peeks data at a specific offset and checks if it matches the provided data.
839    fn cpeek_and_equal_at(&self, offset: u64, data: &[u8]) -> Result<()> {
840        let mut buf = vec![0u8; data.len()];
841        self.cpeek_exact_at(offset, &mut buf)?;
842        if buf != data {
843            return Err(std::io::Error::new(
844                std::io::ErrorKind::InvalidData,
845                "Data does not match at offset",
846            ));
847        }
848        Ok(())
849    }
850}
851
852impl<T: Peek> CPeek for Mutex<T> {
853    fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
854        let mut lock = self.lock().map_err(|_| {
855            std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
856        })?;
857        lock.peek(buf)
858    }
859
860    fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
861        let mut lock = self.lock().map_err(|_| {
862            std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
863        })?;
864        lock.peek_at(offset, buf)
865    }
866
867    fn cpeek_cstring(&self) -> Result<CString> {
868        let mut lock = self.lock().map_err(|_| {
869            std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
870        })?;
871        lock.peek_cstring()
872    }
873
874    fn cpeek_u16string(&self) -> Result<Vec<u8>> {
875        let mut lock = self.lock().map_err(|_| {
876            std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
877        })?;
878        lock.peek_u16string()
879    }
880}
881
882/// A trait to help to read data from a reader.
883pub trait ReadExt {
884    /// Reads a [u8] from the reader.
885    fn read_u8(&mut self) -> Result<u8>;
886    /// Reads a [u16] from the reader in little-endian order.
887    fn read_u16(&mut self) -> Result<u16>;
888    /// Reads a [u16] from the reader in big-endian order.
889    fn read_u16_be(&mut self) -> Result<u16>;
890    /// Reads a [u32] from the reader in little-endian order.
891    fn read_u32(&mut self) -> Result<u32>;
892    /// Reads a [u32] from the reader in big-endian order.
893    fn read_u32_be(&mut self) -> Result<u32>;
894    /// Reads a [u64] from the reader in little-endian order.
895    fn read_u64(&mut self) -> Result<u64>;
896    /// Reads a [u64] from the reader in big-endian order.
897    fn read_u64_be(&mut self) -> Result<u64>;
898    /// Reads a [u128] from the reader in little-endian order.
899    fn read_u128(&mut self) -> Result<u128>;
900    /// Reads a [u128] from the reader in big-endian order.
901    fn read_u128_be(&mut self) -> Result<u128>;
902    /// Reads an [i8] from the reader.
903    fn read_i8(&mut self) -> Result<i8>;
904    /// Reads an [i16] from the reader in little-endian order.
905    fn read_i16(&mut self) -> Result<i16>;
906    /// Reads an [i16] from the reader in big-endian order.
907    fn read_i16_be(&mut self) -> Result<i16>;
908    /// Reads an [i32] from the reader in little-endian order.
909    fn read_i32(&mut self) -> Result<i32>;
910    /// Reads an [i32] from the reader in big-endian order.
911    fn read_i32_be(&mut self) -> Result<i32>;
912    /// Reads an [i64] from the reader in little-endian order.
913    fn read_i64(&mut self) -> Result<i64>;
914    /// Reads an [i64] from the reader in big-endian order.
915    fn read_i64_be(&mut self) -> Result<i64>;
916    /// Reads an [i128] from the reader in little-endian order.
917    fn read_i128(&mut self) -> Result<i128>;
918    /// Reads an [i128] from the reader in big-endian order.
919    fn read_i128_be(&mut self) -> Result<i128>;
920    /// Reads a [f32] from the reader in little-endian order.
921    fn read_f32(&mut self) -> Result<f32>;
922    /// Reads a [f32] from the reader in big-endian order.
923    fn read_f32_be(&mut self) -> Result<f32>;
924    /// Reads a [f64] from the reader in little-endian order.
925    fn read_f64(&mut self) -> Result<f64>;
926    /// Reads a [f64] from the reader in big-endian order.
927    fn read_f64_be(&mut self) -> Result<f64>;
928
929    /// Reads a C-style string (null-terminated) from the reader.
930    fn read_cstring(&mut self) -> Result<CString>;
931    /// Reads a C-style string (null-terminated) from the reader with maximum length.
932    /// * `len` is the maximum length of the string to read.
933    /// * `encoding` specifies the encoding to use for the string.
934    /// * `trim` indicates whether to trim the string after the first null byte.
935    fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String>;
936
937    /// Reads a UTF-16 string (null-terminated) from the reader.
938    /// Returns the raw bytes of the UTF-16 string. (Null terminator is not included)
939    fn read_u16string(&mut self) -> Result<Vec<u8>>;
940
941    /// Reads some data from the reader into a vector.
942    fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>>;
943
944    /// Reads data and checks if it matches the provided data.
945    fn read_and_equal(&mut self, data: &[u8]) -> Result<()>;
946
947    /// Reads as much data as possible into the provided buffer.
948    /// Returns the number of bytes read.
949    fn read_most(&mut self, buf: &mut [u8]) -> Result<usize>;
950}
951
952impl<T: Read> ReadExt for T {
953    fn read_u8(&mut self) -> Result<u8> {
954        let mut buf = [0u8; 1];
955        self.read_exact(&mut buf)?;
956        Ok(buf[0])
957    }
958    fn read_u16(&mut self) -> Result<u16> {
959        let mut buf = [0u8; 2];
960        self.read_exact(&mut buf)?;
961        Ok(u16::from_le_bytes(buf))
962    }
963    fn read_u16_be(&mut self) -> Result<u16> {
964        let mut buf = [0u8; 2];
965        self.read_exact(&mut buf)?;
966        Ok(u16::from_be_bytes(buf))
967    }
968    fn read_u32(&mut self) -> Result<u32> {
969        let mut buf = [0u8; 4];
970        self.read_exact(&mut buf)?;
971        Ok(u32::from_le_bytes(buf))
972    }
973    fn read_u32_be(&mut self) -> Result<u32> {
974        let mut buf = [0u8; 4];
975        self.read_exact(&mut buf)?;
976        Ok(u32::from_be_bytes(buf))
977    }
978    fn read_u64(&mut self) -> Result<u64> {
979        let mut buf = [0u8; 8];
980        self.read_exact(&mut buf)?;
981        Ok(u64::from_le_bytes(buf))
982    }
983    fn read_u64_be(&mut self) -> Result<u64> {
984        let mut buf = [0u8; 8];
985        self.read_exact(&mut buf)?;
986        Ok(u64::from_be_bytes(buf))
987    }
988    fn read_u128(&mut self) -> Result<u128> {
989        let mut buf = [0u8; 16];
990        self.read_exact(&mut buf)?;
991        Ok(u128::from_le_bytes(buf))
992    }
993    fn read_u128_be(&mut self) -> Result<u128> {
994        let mut buf = [0u8; 16];
995        self.read_exact(&mut buf)?;
996        Ok(u128::from_be_bytes(buf))
997    }
998    fn read_i8(&mut self) -> Result<i8> {
999        let mut buf = [0u8; 1];
1000        self.read_exact(&mut buf)?;
1001        Ok(i8::from_le_bytes(buf))
1002    }
1003    fn read_i16(&mut self) -> Result<i16> {
1004        let mut buf = [0u8; 2];
1005        self.read_exact(&mut buf)?;
1006        Ok(i16::from_le_bytes(buf))
1007    }
1008    fn read_i16_be(&mut self) -> Result<i16> {
1009        let mut buf = [0u8; 2];
1010        self.read_exact(&mut buf)?;
1011        Ok(i16::from_be_bytes(buf))
1012    }
1013    fn read_i32(&mut self) -> Result<i32> {
1014        let mut buf = [0u8; 4];
1015        self.read_exact(&mut buf)?;
1016        Ok(i32::from_le_bytes(buf))
1017    }
1018    fn read_i32_be(&mut self) -> Result<i32> {
1019        let mut buf = [0u8; 4];
1020        self.read_exact(&mut buf)?;
1021        Ok(i32::from_be_bytes(buf))
1022    }
1023    fn read_i64(&mut self) -> Result<i64> {
1024        let mut buf = [0u8; 8];
1025        self.read_exact(&mut buf)?;
1026        Ok(i64::from_le_bytes(buf))
1027    }
1028    fn read_i64_be(&mut self) -> Result<i64> {
1029        let mut buf = [0u8; 8];
1030        self.read_exact(&mut buf)?;
1031        Ok(i64::from_be_bytes(buf))
1032    }
1033    fn read_i128(&mut self) -> Result<i128> {
1034        let mut buf = [0u8; 16];
1035        self.read_exact(&mut buf)?;
1036        Ok(i128::from_le_bytes(buf))
1037    }
1038    fn read_i128_be(&mut self) -> Result<i128> {
1039        let mut buf = [0u8; 16];
1040        self.read_exact(&mut buf)?;
1041        Ok(i128::from_be_bytes(buf))
1042    }
1043    fn read_f32(&mut self) -> Result<f32> {
1044        let mut buf = [0u8; 4];
1045        self.read_exact(&mut buf)?;
1046        Ok(f32::from_le_bytes(buf))
1047    }
1048    fn read_f32_be(&mut self) -> Result<f32> {
1049        let mut buf = [0u8; 4];
1050        self.read_exact(&mut buf)?;
1051        Ok(f32::from_be_bytes(buf))
1052    }
1053    fn read_f64(&mut self) -> Result<f64> {
1054        let mut buf = [0u8; 8];
1055        self.read_exact(&mut buf)?;
1056        Ok(f64::from_le_bytes(buf))
1057    }
1058    fn read_f64_be(&mut self) -> Result<f64> {
1059        let mut buf = [0u8; 8];
1060        self.read_exact(&mut buf)?;
1061        Ok(f64::from_be_bytes(buf))
1062    }
1063
1064    fn read_cstring(&mut self) -> Result<CString> {
1065        let mut buf = Vec::new();
1066        loop {
1067            let mut byte = [0u8; 1];
1068            self.read_exact(&mut byte)?;
1069            if byte[0] == 0 {
1070                break;
1071            }
1072            buf.push(byte[0]);
1073        }
1074        CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
1075    }
1076    fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
1077        let mut buf = vec![0u8; len];
1078        self.read_exact(&mut buf)?;
1079        if trim {
1080            let first_zero = buf.iter().position(|&b| b == 0);
1081            if let Some(pos) = first_zero {
1082                buf.truncate(pos);
1083            }
1084        }
1085        let s = decode_to_string(encoding, &buf, true)
1086            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
1087        Ok(s)
1088    }
1089
1090    fn read_u16string(&mut self) -> Result<Vec<u8>> {
1091        let mut buf = Vec::new();
1092        loop {
1093            let mut bytes = [0u8; 2];
1094            self.read_exact(&mut bytes)?;
1095            if bytes == [0, 0] {
1096                break;
1097            }
1098            buf.extend_from_slice(&bytes);
1099        }
1100        Ok(buf)
1101    }
1102
1103    fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>> {
1104        let mut buf = vec![0u8; len];
1105        self.read_exact(&mut buf)?;
1106        Ok(buf)
1107    }
1108
1109    fn read_and_equal(&mut self, data: &[u8]) -> Result<()> {
1110        let mut buf = vec![0u8; data.len()];
1111        self.read_exact(&mut buf)?;
1112        if buf != data {
1113            return Err(std::io::Error::new(
1114                std::io::ErrorKind::InvalidData,
1115                "Data does not match",
1116            ));
1117        }
1118        Ok(())
1119    }
1120
1121    fn read_most(&mut self, buf: &mut [u8]) -> Result<usize> {
1122        let mut total_read = 0;
1123        while total_read < buf.len() {
1124            match self.read(&mut buf[total_read..]) {
1125                Ok(0) => break, // EOF reached
1126                Ok(n) => total_read += n,
1127                Err(e) => return Err(e),
1128            }
1129        }
1130        Ok(total_read)
1131    }
1132}
1133
1134/// A trait to help to write data to a writer.
1135pub trait WriteExt {
1136    /// Writes a [u8] to the writer.
1137    fn write_u8(&mut self, value: u8) -> Result<()>;
1138    /// Writes a [u16] to the writer in little-endian order.
1139    fn write_u16(&mut self, value: u16) -> Result<()>;
1140    /// Writes a [u16] to the writer in big-endian order.
1141    fn write_u16_be(&mut self, value: u16) -> Result<()>;
1142    /// Writes a [u32] to the writer in little-endian order.
1143    fn write_u32(&mut self, value: u32) -> Result<()>;
1144    /// Writes a [u32] to the writer in big-endian order.
1145    fn write_u32_be(&mut self, value: u32) -> Result<()>;
1146    /// Writes a [u64] to the writer in little-endian order.
1147    fn write_u64(&mut self, value: u64) -> Result<()>;
1148    /// Writes a [u64] to the writer in big-endian order.
1149    fn write_u64_be(&mut self, value: u64) -> Result<()>;
1150    /// Writes a [u128] to the writer in little-endian order.
1151    fn write_u128(&mut self, value: u128) -> Result<()>;
1152    /// Writes a [u128] to the writer in big-endian order.
1153    fn write_u128_be(&mut self, value: u128) -> Result<()>;
1154    /// Writes an [i8] to the writer.
1155    fn write_i8(&mut self, value: i8) -> Result<()>;
1156    /// Writes an [i16] to the writer in little-endian order.
1157    fn write_i16(&mut self, value: i16) -> Result<()>;
1158    /// Writes an [i16] to the writer in big-endian order.
1159    fn write_i16_be(&mut self, value: i16) -> Result<()>;
1160    /// Writes an [i32] to the writer in little-endian order.
1161    fn write_i32(&mut self, value: i32) -> Result<()>;
1162    /// Writes an [i32] to the writer in big-endian order.
1163    fn write_i32_be(&mut self, value: i32) -> Result<()>;
1164    /// Writes an [i64] to the writer in little-endian order.
1165    fn write_i64(&mut self, value: i64) -> Result<()>;
1166    /// Writes an [i64] to the writer in big-endian order.
1167    fn write_i64_be(&mut self, value: i64) -> Result<()>;
1168    /// Writes an [i128] to the writer in little-endian order.
1169    fn write_i128(&mut self, value: i128) -> Result<()>;
1170    /// Writes an [i128] to the writer in big-endian order.
1171    fn write_i128_be(&mut self, value: i128) -> Result<()>;
1172    /// Writes a [f32] to the writer in little-endian order.
1173    fn write_f32(&mut self, value: f32) -> Result<()>;
1174    /// Writes a [f32] to the writer in big-endian order.
1175    fn write_f32_be(&mut self, value: f32) -> Result<()>;
1176    /// Writes a [f64] to the writer in little-endian order.
1177    fn write_f64(&mut self, value: f64) -> Result<()>;
1178    /// Writes a [f64] to the writer in big-endian order.
1179    fn write_f64_be(&mut self, value: f64) -> Result<()>;
1180
1181    /// Writes a C-style string (null-terminated) to the writer.
1182    fn write_cstring(&mut self, value: &CString) -> Result<()>;
1183    /// Writes a C-style string (null-terminated) from the reader with maximum length.
1184    /// * `data` is the string data to write.
1185    /// * `len` is the maximum length of the string to write. If the string is longer, it will be truncated if `truncate` is true otherwise an error is returned.
1186    /// * `encoding` specifies the encoding to use for the string.
1187    /// * `padding` indicates how to pad the string if it's shorter than `len`.
1188    /// * `truncate` indicates whether to truncate the string if it's longer than `len`.
1189    fn write_fstring(
1190        &mut self,
1191        data: &str,
1192        len: usize,
1193        encoding: Encoding,
1194        padding: u8,
1195        truncate: bool,
1196    ) -> Result<()>;
1197    /// Write a struct to the writer.
1198    fn write_struct<V: StructPack>(
1199        &mut self,
1200        value: &V,
1201        big: bool,
1202        encoding: Encoding,
1203        info: &Option<Box<dyn std::any::Any>>,
1204    ) -> Result<()>;
1205    /// Writes data from a reader to the writer.
1206    fn write_from<R: Read + Seek>(&mut self, reader: &mut R, offset: u64, len: u64) -> Result<()>;
1207}
1208
1209impl<T: Write> WriteExt for T {
1210    fn write_u8(&mut self, value: u8) -> Result<()> {
1211        self.write_all(&value.to_le_bytes())
1212    }
1213    fn write_u16(&mut self, value: u16) -> Result<()> {
1214        self.write_all(&value.to_le_bytes())
1215    }
1216    fn write_u16_be(&mut self, value: u16) -> Result<()> {
1217        self.write_all(&value.to_be_bytes())
1218    }
1219    fn write_u32(&mut self, value: u32) -> Result<()> {
1220        self.write_all(&value.to_le_bytes())
1221    }
1222    fn write_u32_be(&mut self, value: u32) -> Result<()> {
1223        self.write_all(&value.to_be_bytes())
1224    }
1225    fn write_u64(&mut self, value: u64) -> Result<()> {
1226        self.write_all(&value.to_le_bytes())
1227    }
1228    fn write_u64_be(&mut self, value: u64) -> Result<()> {
1229        self.write_all(&value.to_be_bytes())
1230    }
1231    fn write_u128(&mut self, value: u128) -> Result<()> {
1232        self.write_all(&value.to_le_bytes())
1233    }
1234    fn write_u128_be(&mut self, value: u128) -> Result<()> {
1235        self.write_all(&value.to_be_bytes())
1236    }
1237    fn write_i8(&mut self, value: i8) -> Result<()> {
1238        self.write_all(&value.to_le_bytes())
1239    }
1240    fn write_i16(&mut self, value: i16) -> Result<()> {
1241        self.write_all(&value.to_le_bytes())
1242    }
1243    fn write_i16_be(&mut self, value: i16) -> Result<()> {
1244        self.write_all(&value.to_be_bytes())
1245    }
1246    fn write_i32(&mut self, value: i32) -> Result<()> {
1247        self.write_all(&value.to_le_bytes())
1248    }
1249    fn write_i32_be(&mut self, value: i32) -> Result<()> {
1250        self.write_all(&value.to_be_bytes())
1251    }
1252    fn write_i64(&mut self, value: i64) -> Result<()> {
1253        self.write_all(&value.to_le_bytes())
1254    }
1255    fn write_i64_be(&mut self, value: i64) -> Result<()> {
1256        self.write_all(&value.to_be_bytes())
1257    }
1258    fn write_i128(&mut self, value: i128) -> Result<()> {
1259        self.write_all(&value.to_le_bytes())
1260    }
1261    fn write_i128_be(&mut self, value: i128) -> Result<()> {
1262        self.write_all(&value.to_be_bytes())
1263    }
1264    fn write_f32(&mut self, value: f32) -> Result<()> {
1265        self.write_all(&value.to_le_bytes())
1266    }
1267    fn write_f32_be(&mut self, value: f32) -> Result<()> {
1268        self.write_all(&value.to_be_bytes())
1269    }
1270    fn write_f64(&mut self, value: f64) -> Result<()> {
1271        self.write_all(&value.to_le_bytes())
1272    }
1273    fn write_f64_be(&mut self, value: f64) -> Result<()> {
1274        self.write_all(&value.to_be_bytes())
1275    }
1276
1277    fn write_cstring(&mut self, value: &CString) -> Result<()> {
1278        self.write_all(value.as_bytes_with_nul())
1279    }
1280
1281    fn write_fstring(
1282        &mut self,
1283        data: &str,
1284        len: usize,
1285        encoding: Encoding,
1286        padding: u8,
1287        truncate: bool,
1288    ) -> Result<()> {
1289        let encoded = encode_string(encoding, data, true).map_err(|e| {
1290            std::io::Error::new(
1291                std::io::ErrorKind::InvalidInput,
1292                format!("Encoding error: {}", e),
1293            )
1294        })?;
1295        let final_data = if encoded.len() > len {
1296            if truncate {
1297                &encoded[..len]
1298            } else {
1299                return Err(std::io::Error::new(
1300                    std::io::ErrorKind::InvalidInput,
1301                    "String length exceeds the specified length and truncation is disabled",
1302                ));
1303            }
1304        } else {
1305            &encoded
1306        };
1307        self.write_all(final_data)?;
1308        let padding_len = len.saturating_sub(final_data.len());
1309        if padding_len > 0 {
1310            for _ in 0..padding_len {
1311                self.write_u8(padding)?;
1312            }
1313        }
1314        Ok(())
1315    }
1316
1317    fn write_struct<V: StructPack>(
1318        &mut self,
1319        value: &V,
1320        big: bool,
1321        encoding: Encoding,
1322        info: &Option<Box<dyn std::any::Any>>,
1323    ) -> Result<()> {
1324        value
1325            .pack(self, big, encoding, info)
1326            .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))
1327    }
1328
1329    fn write_from<R: Read + Seek>(&mut self, reader: &mut R, offset: u64, len: u64) -> Result<()> {
1330        reader.seek(SeekFrom::Start(offset))?;
1331        let mut remaining = len;
1332        let mut buffer = [0u8; 8192];
1333        while remaining > 0 {
1334            let to_read = std::cmp::min(remaining, buffer.len() as u64) as usize;
1335            let bytes_read = reader.read(&mut buffer[..to_read])?;
1336            if bytes_read == 0 {
1337                break; // EOF reached
1338            }
1339            self.write_all(&buffer[..bytes_read])?;
1340            remaining -= bytes_read as u64;
1341        }
1342        Ok(())
1343    }
1344}
1345
1346/// A trait to help to write data to a writer at a specific offset.
1347pub trait WriteAt {
1348    /// Writes data to the writer at a specific offset.
1349    /// Returns the number of bytes written.
1350    fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize>;
1351    /// Writes all data to the writer at a specific offset.
1352    /// Returns an error if the write fails.
1353    fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()>;
1354
1355    /// Writes a [u8] at a specific offset.
1356    fn write_u8_at(&mut self, offset: u64, value: u8) -> Result<()> {
1357        self.write_all_at(offset, &value.to_le_bytes())
1358    }
1359    /// Writes a [u16] at a specific offset in little-endian order.
1360    fn write_u16_at(&mut self, offset: u64, value: u16) -> Result<()> {
1361        self.write_all_at(offset, &value.to_le_bytes())
1362    }
1363    /// Writes a [u16] at a specific offset in big-endian order.
1364    fn write_u16_be_at(&mut self, offset: u64, value: u16) -> Result<()> {
1365        self.write_all_at(offset, &value.to_be_bytes())
1366    }
1367    /// Writes a [u32] at a specific offset in little-endian order.
1368    fn write_u32_at(&mut self, offset: u64, value: u32) -> Result<()> {
1369        self.write_all_at(offset, &value.to_le_bytes())
1370    }
1371    /// Writes a [u32] at a specific offset in big-endian order.
1372    fn write_u32_be_at(&mut self, offset: u64, value: u32) -> Result<()> {
1373        self.write_all_at(offset, &value.to_be_bytes())
1374    }
1375    /// Writes a [u64] at a specific offset in little-endian order.
1376    fn write_u64_at(&mut self, offset: u64, value: u64) -> Result<()> {
1377        self.write_all_at(offset, &value.to_le_bytes())
1378    }
1379    /// Writes a [u64] at a specific offset in big-endian order.
1380    fn write_u64_be_at(&mut self, offset: u64, value: u64) -> Result<()> {
1381        self.write_all_at(offset, &value.to_be_bytes())
1382    }
1383    /// Writes a [u128] at a specific offset in little-endian order.
1384    fn write_u128_at(&mut self, offset: u64, value: u128) -> Result<()> {
1385        self.write_all_at(offset, &value.to_le_bytes())
1386    }
1387    /// Writes a [u128] at a specific offset in big-endian order.
1388    fn write_u128_be_at(&mut self, offset: u64, value: u128) -> Result<()> {
1389        self.write_all_at(offset, &value.to_be_bytes())
1390    }
1391    /// Writes an [i8] at a specific offset.
1392    fn write_i8_at(&mut self, offset: u64, value: i8) -> Result<()> {
1393        self.write_all_at(offset, &value.to_le_bytes())
1394    }
1395    /// Writes an [i16] at a specific offset in little-endian order.
1396    fn write_i16_at(&mut self, offset: u64, value: i16) -> Result<()> {
1397        self.write_all_at(offset, &value.to_le_bytes())
1398    }
1399    /// Writes an [i16] at a specific offset in big-endian order.
1400    fn write_i16_be_at(&mut self, offset: u64, value: i16) -> Result<()> {
1401        self.write_all_at(offset, &value.to_be_bytes())
1402    }
1403    /// Writes an [i32] at a specific offset in little-endian order.
1404    fn write_i32_at(&mut self, offset: u64, value: i32) -> Result<()> {
1405        self.write_all_at(offset, &value.to_le_bytes())
1406    }
1407    /// Writes an [i32] at a specific offset in big-endian order.
1408    fn write_i32_be_at(&mut self, offset: u64, value: i32) -> Result<()> {
1409        self.write_all_at(offset, &value.to_be_bytes())
1410    }
1411    /// Writes an [i64] at a specific offset in little-endian order.
1412    fn write_i64_at(&mut self, offset: u64, value: i64) -> Result<()> {
1413        self.write_all_at(offset, &value.to_le_bytes())
1414    }
1415    /// Writes an [i64] at a specific offset in big-endian order.
1416    fn write_i64_be_at(&mut self, offset: u64, value: i64) -> Result<()> {
1417        self.write_all_at(offset, &value.to_be_bytes())
1418    }
1419    /// Writes an [i128] at a specific offset in little-endian order.
1420    fn write_i128_at(&mut self, offset: u64, value: i128) -> Result<()> {
1421        self.write_all_at(offset, &value.to_le_bytes())
1422    }
1423    /// Writes an [i128] at a specific offset in big-endian order.
1424    fn write_i128_be_at(&mut self, offset: u64, value: i128) -> Result<()> {
1425        self.write_all_at(offset, &value.to_be_bytes())
1426    }
1427
1428    /// Writes a C-style string (null-terminated) at a specific offset.
1429    fn write_cstring_at(&mut self, offset: u64, value: &CString) -> Result<()> {
1430        self.write_all_at(offset, value.as_bytes_with_nul())
1431    }
1432}
1433
1434impl<T: Write + Seek> WriteAt for T {
1435    fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize> {
1436        let current_pos = self.stream_position()?;
1437        self.seek(SeekFrom::Start(offset as u64))?;
1438        let bytes_written = self.write(buf)?;
1439        self.seek(SeekFrom::Start(current_pos))?;
1440        Ok(bytes_written)
1441    }
1442
1443    fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()> {
1444        let current_pos = self.stream_position()?;
1445        self.seek(SeekFrom::Start(offset as u64))?;
1446        self.write_all(buf)?;
1447        self.seek(SeekFrom::Start(current_pos))?;
1448        Ok(())
1449    }
1450}
1451
1452/// A trait to help to seek in a stream.
1453pub trait SeekExt {
1454    /// Returns the length of the stream.
1455    fn stream_length(&mut self) -> Result<u64>;
1456    /// Aligns the current position to the given alignment.
1457    /// Returns the new position after alignment.
1458    fn align(&mut self, align: u64) -> Result<u64>;
1459    /// Seeks to the end of the stream.
1460    fn seek_to_end(&mut self) -> Result<u64>;
1461}
1462
1463impl<T: Seek> SeekExt for T {
1464    fn stream_length(&mut self) -> Result<u64> {
1465        let current_pos = self.stream_position()?;
1466        let length = self.seek(SeekFrom::End(0))?;
1467        self.seek(SeekFrom::Start(current_pos))?;
1468        Ok(length)
1469    }
1470
1471    fn align(&mut self, align: u64) -> Result<u64> {
1472        let current_pos = self.stream_position()?;
1473        let aligned_pos = (current_pos + align - 1) & !(align - 1);
1474        if aligned_pos != current_pos {
1475            self.seek(SeekFrom::Start(aligned_pos))?;
1476        }
1477        Ok(aligned_pos)
1478    }
1479
1480    fn seek_to_end(&mut self) -> Result<u64> {
1481        self.seek(SeekFrom::End(0))
1482    }
1483}
1484
1485#[derive(Clone)]
1486/// A memory reader that can read data from a vector of bytes.
1487pub struct MemReader {
1488    /// The data to read from.
1489    pub data: Vec<u8>,
1490    /// The current position in the data.
1491    pub pos: usize,
1492}
1493
1494/// A memory reader that can read data from a slice of bytes.
1495#[derive(Clone)]
1496pub struct MemReaderRef<'a> {
1497    /// The data to read from.
1498    pub data: &'a [u8],
1499    /// The current position in the data.
1500    pub pos: usize,
1501}
1502
1503impl std::fmt::Debug for MemReader {
1504    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1505        f.debug_struct("MemReader")
1506            .field("pos", &self.pos)
1507            .field("data_length", &self.data.len())
1508            .finish_non_exhaustive()
1509    }
1510}
1511
1512impl<'a> std::fmt::Debug for MemReaderRef<'a> {
1513    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1514        f.debug_struct("MemReaderRef")
1515            .field("pos", &self.pos)
1516            .field("data_length", &self.data.len())
1517            .finish_non_exhaustive()
1518    }
1519}
1520
1521impl MemReader {
1522    /// Creates a new `MemReader` with the given data.
1523    pub fn new(data: Vec<u8>) -> Self {
1524        MemReader { data, pos: 0 }
1525    }
1526
1527    /// Creates a new [MemReaderRef] from the current data and position.
1528    pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1529        MemReaderRef {
1530            data: &self.data,
1531            pos: self.pos,
1532        }
1533    }
1534
1535    /// Checks if the reader has reached the end of the data.
1536    pub fn is_eof(&self) -> bool {
1537        self.pos >= self.data.len()
1538    }
1539
1540    /// Returns the inner data of the reader.
1541    pub fn inner(self) -> Vec<u8> {
1542        self.data
1543    }
1544}
1545
1546impl<'a> MemReaderRef<'a> {
1547    /// Creates a new `MemReaderRef` with the given data.
1548    pub fn new(data: &'a [u8]) -> Self {
1549        MemReaderRef { data, pos: 0 }
1550    }
1551
1552    /// Checks if the reader has reached the end of the data.
1553    pub fn is_eof(&self) -> bool {
1554        self.pos >= self.data.len()
1555    }
1556}
1557
1558impl Read for MemReader {
1559    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1560        if self.pos >= self.data.len() {
1561            return Ok(0);
1562        }
1563        let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1564        let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1565        bu.read(buf)?;
1566        self.pos += bytes_to_read;
1567        Ok(bytes_to_read)
1568    }
1569}
1570
1571impl Seek for MemReader {
1572    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1573        match pos {
1574            SeekFrom::Start(offset) => {
1575                if offset > self.data.len() as u64 {
1576                    return Err(std::io::Error::new(
1577                        std::io::ErrorKind::InvalidInput,
1578                        "Seek position is beyond the end of the data",
1579                    ));
1580                }
1581                self.pos = offset as usize;
1582            }
1583            SeekFrom::End(offset) => {
1584                let end_pos = self.data.len() as i64 + offset;
1585                if end_pos < 0 {
1586                    return Err(std::io::Error::new(
1587                        std::io::ErrorKind::InvalidInput,
1588                        "Seek from end resulted in negative position",
1589                    ));
1590                }
1591                self.pos = end_pos as usize;
1592            }
1593            SeekFrom::Current(offset) => {
1594                let new_pos = (self.pos as i64 + offset) as usize;
1595                if new_pos > self.data.len() {
1596                    return Err(std::io::Error::new(
1597                        std::io::ErrorKind::InvalidInput,
1598                        "Seek position is beyond the end of the data",
1599                    ));
1600                }
1601                self.pos = new_pos;
1602            }
1603        }
1604        Ok(self.pos as u64)
1605    }
1606
1607    fn stream_position(&mut self) -> Result<u64> {
1608        Ok(self.pos as u64)
1609    }
1610
1611    fn rewind(&mut self) -> Result<()> {
1612        self.pos = 0;
1613        Ok(())
1614    }
1615}
1616
1617impl CPeek for MemReader {
1618    fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1619        self.to_ref().cpeek(buf)
1620    }
1621
1622    fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1623        self.to_ref().cpeek_at(offset, buf)
1624    }
1625
1626    fn cpeek_cstring(&self) -> Result<CString> {
1627        self.to_ref().cpeek_cstring()
1628    }
1629
1630    fn cpeek_u16string(&self) -> Result<Vec<u8>> {
1631        self.to_ref().cpeek_u16string()
1632    }
1633}
1634
1635impl<'a> Read for MemReaderRef<'a> {
1636    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1637        if self.pos >= self.data.len() {
1638            return Ok(0);
1639        }
1640        let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1641        let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1642        bu.read(buf)?;
1643        self.pos += bytes_to_read;
1644        Ok(bytes_to_read)
1645    }
1646}
1647
1648impl<'a> Seek for MemReaderRef<'a> {
1649    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1650        match pos {
1651            SeekFrom::Start(offset) => {
1652                if offset > self.data.len() as u64 {
1653                    return Err(std::io::Error::new(
1654                        std::io::ErrorKind::InvalidInput,
1655                        "Seek position is beyond the end of the data",
1656                    ));
1657                }
1658                self.pos = offset as usize;
1659            }
1660            SeekFrom::End(offset) => {
1661                let end_pos = self.data.len() as i64 + offset;
1662                if end_pos < 0 {
1663                    return Err(std::io::Error::new(
1664                        std::io::ErrorKind::InvalidInput,
1665                        "Seek from end resulted in negative position",
1666                    ));
1667                }
1668                self.pos = end_pos as usize;
1669            }
1670            SeekFrom::Current(offset) => {
1671                let new_pos = (self.pos as i64 + offset) as usize;
1672                if new_pos > self.data.len() {
1673                    return Err(std::io::Error::new(
1674                        std::io::ErrorKind::InvalidInput,
1675                        "Seek position is beyond the end of the data",
1676                    ));
1677                }
1678                self.pos = new_pos;
1679            }
1680        }
1681        Ok(self.pos as u64)
1682    }
1683
1684    fn stream_position(&mut self) -> Result<u64> {
1685        Ok(self.pos as u64)
1686    }
1687
1688    fn rewind(&mut self) -> Result<()> {
1689        self.pos = 0;
1690        Ok(())
1691    }
1692}
1693
1694impl<'a> CPeek for MemReaderRef<'a> {
1695    fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1696        let len = self.data.len();
1697        let bytes_to_read = std::cmp::min(buf.len(), len - self.pos);
1698        buf[..bytes_to_read].copy_from_slice(&self.data[self.pos..self.pos + bytes_to_read]);
1699        Ok(bytes_to_read)
1700    }
1701
1702    fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1703        let len = self.data.len();
1704        let offset = offset as usize;
1705        if offset >= len {
1706            return Ok(0);
1707        }
1708        let bytes_to_read = std::cmp::min(buf.len(), len - offset);
1709        buf[..bytes_to_read].copy_from_slice(&self.data[offset..offset + bytes_to_read]);
1710        Ok(bytes_to_read)
1711    }
1712
1713    fn cpeek_cstring(&self) -> Result<CString> {
1714        let mut buf = Vec::new();
1715        for &byte in &self.data[self.pos..] {
1716            if byte == 0 {
1717                break;
1718            }
1719            buf.push(byte);
1720        }
1721        CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
1722    }
1723
1724    fn cpeek_u16string(&self) -> Result<Vec<u8>> {
1725        let mut buf = Vec::new();
1726        let mut i = self.pos;
1727        while i + 1 < self.data.len() {
1728            let bytes = &self.data[i..i + 2];
1729            if bytes == [0, 0] {
1730                break;
1731            }
1732            buf.extend_from_slice(bytes);
1733            i += 2;
1734        }
1735        Ok(buf)
1736    }
1737}
1738
1739/// A memory writer that can write data to a vector of bytes.
1740pub struct MemWriter {
1741    /// The data to write to.
1742    pub data: Vec<u8>,
1743    /// The current position in the data.
1744    pub pos: usize,
1745}
1746
1747impl MemWriter {
1748    /// Creates a new `MemWriter` with an empty data vector.
1749    pub fn new() -> Self {
1750        MemWriter {
1751            data: Vec::new(),
1752            pos: 0,
1753        }
1754    }
1755
1756    /// Creates a new `MemWriter` with the given capacity.
1757    pub fn with_capacity(capacity: usize) -> Self {
1758        MemWriter {
1759            data: Vec::with_capacity(capacity),
1760            pos: 0,
1761        }
1762    }
1763
1764    /// Creates a new `MemWriter` with the given data.
1765    pub fn from_vec(data: Vec<u8>) -> Self {
1766        MemWriter { data, pos: 0 }
1767    }
1768
1769    /// Returns the inner data of the writer.
1770    pub fn into_inner(self) -> Vec<u8> {
1771        self.data
1772    }
1773
1774    /// Returns a reference to the inner data of the writer.
1775    pub fn as_slice(&self) -> &[u8] {
1776        &self.data
1777    }
1778
1779    /// Returns a new `MemReaderRef` that references the current data and position.
1780    pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1781        MemReaderRef {
1782            data: &self.data,
1783            pos: self.pos,
1784        }
1785    }
1786}
1787
1788impl std::fmt::Debug for MemWriter {
1789    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1790        f.debug_struct("MemWriter")
1791            .field("pos", &self.pos)
1792            .field("data_length", &self.data.len())
1793            .finish_non_exhaustive()
1794    }
1795}
1796
1797impl Write for MemWriter {
1798    fn write(&mut self, buf: &[u8]) -> Result<usize> {
1799        if self.pos + buf.len() > self.data.len() {
1800            self.data.resize(self.pos + buf.len(), 0);
1801        }
1802        let bytes_written = buf.len();
1803        self.data[self.pos..self.pos + bytes_written].copy_from_slice(buf);
1804        self.pos += bytes_written;
1805        Ok(bytes_written)
1806    }
1807
1808    fn flush(&mut self) -> Result<()> {
1809        Ok(())
1810    }
1811}
1812
1813impl Seek for MemWriter {
1814    /// Seeks to a new position in the writer.
1815    /// If the new position is beyond the current length of the data, the data is resized when writing.
1816    /// (This means that seeking beyond the end does not immediately resize the data.)
1817    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1818        match pos {
1819            SeekFrom::Start(offset) => {
1820                self.pos = offset as usize;
1821            }
1822            SeekFrom::End(offset) => {
1823                let end_pos = self.data.len() as i64 + offset;
1824                if end_pos < 0 {
1825                    return Err(std::io::Error::new(
1826                        std::io::ErrorKind::InvalidInput,
1827                        "Seek from end resulted in negative position",
1828                    ));
1829                }
1830                self.pos = end_pos as usize;
1831            }
1832            SeekFrom::Current(offset) => {
1833                let new_pos = self.pos as i64 + offset;
1834                if new_pos < 0 {
1835                    return Err(std::io::Error::new(
1836                        std::io::ErrorKind::InvalidInput,
1837                        "Seek position is negative",
1838                    ));
1839                }
1840                self.pos = new_pos as usize;
1841            }
1842        }
1843        Ok(self.pos as u64)
1844    }
1845
1846    fn stream_position(&mut self) -> Result<u64> {
1847        Ok(self.pos as u64)
1848    }
1849
1850    fn rewind(&mut self) -> Result<()> {
1851        self.pos = 0;
1852        Ok(())
1853    }
1854}
1855
1856impl CPeek for MemWriter {
1857    fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1858        self.to_ref().cpeek(buf)
1859    }
1860
1861    fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1862        self.to_ref().cpeek_at(offset, buf)
1863    }
1864
1865    fn cpeek_cstring(&self) -> Result<CString> {
1866        self.to_ref().cpeek_cstring()
1867    }
1868
1869    fn cpeek_u16string(&self) -> Result<Vec<u8>> {
1870        self.to_ref().cpeek_u16string()
1871    }
1872}
1873
1874/// A memory reader that can read data from a slice of bytes.
1875pub struct MemWriterRef<'a> {
1876    /// The data to read from.
1877    pub data: &'a mut [u8],
1878    /// The current position in the data.
1879    pub pos: usize,
1880}
1881
1882impl<'a> MemWriterRef<'a> {
1883    /// Creates a new `MemWriterRef` with the given data.
1884    pub fn new(data: &'a mut [u8]) -> Self {
1885        MemWriterRef { data, pos: 0 }
1886    }
1887}
1888
1889impl<'a> Read for MemWriterRef<'a> {
1890    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1891        if self.pos >= self.data.len() {
1892            return Ok(0);
1893        }
1894        let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1895        let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1896        bu.read(buf)?;
1897        self.pos += bytes_to_read;
1898        Ok(bytes_to_read)
1899    }
1900}
1901
1902impl<'a> Seek for MemWriterRef<'a> {
1903    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1904        match pos {
1905            SeekFrom::Start(offset) => {
1906                if offset > self.data.len() as u64 {
1907                    return Err(std::io::Error::new(
1908                        std::io::ErrorKind::InvalidInput,
1909                        "Seek position is beyond the end of the data",
1910                    ));
1911                }
1912                self.pos = offset as usize;
1913            }
1914            SeekFrom::End(offset) => {
1915                let end_pos = self.data.len() as i64 + offset;
1916                if end_pos < 0 {
1917                    return Err(std::io::Error::new(
1918                        std::io::ErrorKind::InvalidInput,
1919                        "Seek from end resulted in negative position",
1920                    ));
1921                }
1922                if end_pos as usize > self.data.len() {
1923                    return Err(std::io::Error::new(
1924                        std::io::ErrorKind::InvalidInput,
1925                        "Seek position is beyond the end of the data",
1926                    ));
1927                }
1928                self.pos = end_pos as usize;
1929            }
1930            SeekFrom::Current(offset) => {
1931                let new_pos = (self.pos as i64 + offset) as usize;
1932                if new_pos > self.data.len() {
1933                    return Err(std::io::Error::new(
1934                        std::io::ErrorKind::InvalidInput,
1935                        "Seek position is beyond the end of the data",
1936                    ));
1937                }
1938                self.pos = new_pos;
1939            }
1940        }
1941        Ok(self.pos as u64)
1942    }
1943
1944    fn stream_position(&mut self) -> Result<u64> {
1945        Ok(self.pos as u64)
1946    }
1947
1948    fn rewind(&mut self) -> Result<()> {
1949        self.pos = 0;
1950        Ok(())
1951    }
1952}
1953
1954impl Write for MemWriterRef<'_> {
1955    fn write(&mut self, buf: &[u8]) -> Result<usize> {
1956        if self.pos >= self.data.len() {
1957            return Ok(0);
1958        }
1959        let bytes_to_write = buf.len().min(self.data.len() - self.pos);
1960        self.data[self.pos..self.pos + bytes_to_write].copy_from_slice(&buf[..bytes_to_write]);
1961        self.pos += bytes_to_write;
1962        Ok(bytes_to_write)
1963    }
1964
1965    fn flush(&mut self) -> Result<()> {
1966        Ok(())
1967    }
1968}
1969
1970/// A region of a stream that can be read/write and seeked within a specified range.
1971#[derive(Debug)]
1972pub struct StreamRegion<T: Seek> {
1973    stream: T,
1974    start_pos: u64,
1975    end_pos: u64,
1976    cur_pos: u64,
1977}
1978
1979impl<T: Seek> StreamRegion<T> {
1980    /// Creates a new `StreamRegion` with the specified stream and position range.
1981    pub fn new(stream: T, start_pos: u64, end_pos: u64) -> Result<Self> {
1982        if start_pos > end_pos {
1983            return Err(std::io::Error::new(
1984                std::io::ErrorKind::InvalidInput,
1985                "Start position cannot be greater than end position",
1986            ));
1987        }
1988        Ok(Self {
1989            stream,
1990            start_pos,
1991            end_pos,
1992            cur_pos: 0,
1993        })
1994    }
1995
1996    /// Creates a new `StreamRegion` with the specified stream and size.
1997    ///
1998    /// The start position is the current position of the stream, and the end position is calculated as `start_pos + size`.
1999    pub fn with_size(mut stream: T, size: u64) -> Result<Self> {
2000        let start_pos = stream.stream_position()?;
2001        let end_pos = start_pos + size;
2002        Self::new(stream, start_pos, end_pos)
2003    }
2004
2005    /// Creates a new `StreamRegion` with the specified stream and start position.
2006    /// The end position is determined by the length of the stream.
2007    pub fn with_start_pos(mut stream: T, start_pos: u64) -> Result<Self> {
2008        let end_pos = stream.stream_length()?;
2009        Self::new(stream, start_pos, end_pos)
2010    }
2011
2012    /// Returns the current position within the region.
2013    pub fn cur_pos(&self) -> u64 {
2014        self.cur_pos
2015    }
2016}
2017
2018impl<T: Read + Seek> Read for StreamRegion<T> {
2019    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2020        if self.cur_pos + self.start_pos >= self.end_pos {
2021            return Ok(0); // EOF
2022        }
2023        self.stream
2024            .seek(SeekFrom::Start(self.start_pos + self.cur_pos))?;
2025        let bytes_to_read = (self.end_pos - self.start_pos - self.cur_pos) as usize;
2026        let m = buf.len().min(bytes_to_read);
2027        let readed = self.stream.read(&mut buf[..m])?;
2028        self.cur_pos += readed as u64;
2029        Ok(readed)
2030    }
2031}
2032
2033impl<T: Seek> Seek for StreamRegion<T> {
2034    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2035        let new_pos = match pos {
2036            SeekFrom::Start(offset) => self.start_pos + offset,
2037            SeekFrom::End(offset) => (self.end_pos as i64 + offset as i64) as u64,
2038            SeekFrom::Current(offset) => {
2039                (self.start_pos as i64 + self.cur_pos as i64 + offset as i64) as u64
2040            }
2041        };
2042        if new_pos < self.start_pos || new_pos > self.end_pos {
2043            return Err(std::io::Error::new(
2044                std::io::ErrorKind::InvalidInput,
2045                "Seek position out of bounds",
2046            ));
2047        }
2048        self.cur_pos = new_pos - self.start_pos;
2049        self.stream.seek(SeekFrom::Start(new_pos))?;
2050        Ok(self.cur_pos)
2051    }
2052
2053    fn stream_position(&mut self) -> Result<u64> {
2054        Ok(self.cur_pos)
2055    }
2056
2057    fn rewind(&mut self) -> Result<()> {
2058        self.cur_pos = 0;
2059        self.stream.seek(SeekFrom::Start(self.start_pos))?;
2060        Ok(())
2061    }
2062}
2063
2064impl<T: Seek + Write> Write for StreamRegion<T> {
2065    fn write(&mut self, buf: &[u8]) -> Result<usize> {
2066        if self.cur_pos + self.start_pos >= self.end_pos {
2067            return Ok(0); // EOF
2068        }
2069        self.stream
2070            .seek(SeekFrom::Start(self.start_pos + self.cur_pos))?;
2071        let bytes_to_write = (self.end_pos - self.start_pos - self.cur_pos) as usize;
2072        let m = buf.len().min(bytes_to_write);
2073        let written = self.stream.write(&buf[..m])?;
2074        self.cur_pos += written as u64;
2075        Ok(written)
2076    }
2077
2078    fn flush(&mut self) -> Result<()> {
2079        self.stream.flush()
2080    }
2081}
2082
2083struct RangeMap {
2084    original: (u64, u64),
2085    new: (u64, u64),
2086}
2087
2088/// A binary patcher that can be used to apply patches to binary data.
2089pub struct BinaryPatcher<
2090    R: Read + Seek,
2091    W: Write + Seek,
2092    A: Fn(u64) -> Result<u64>,
2093    O: Fn(u64) -> Result<u64>,
2094> {
2095    pub input: R,
2096    pub output: W,
2097    input_len: u64,
2098    address_to_offset: A,
2099    offset_to_address: O,
2100    range_maps: Vec<RangeMap>,
2101}
2102
2103impl<R: Read + Seek, W: Write + Seek, A: Fn(u64) -> Result<u64>, O: Fn(u64) -> Result<u64>>
2104    BinaryPatcher<R, W, A, O>
2105{
2106    /// Creates a new `BinaryPatcher` with the specified input and output streams.
2107    pub fn new(
2108        mut input: R,
2109        output: W,
2110        address_to_offset: A,
2111        offset_to_address: O,
2112    ) -> Result<Self> {
2113        let input_len = input.stream_length()?;
2114        Ok(BinaryPatcher {
2115            input,
2116            output,
2117            input_len,
2118            address_to_offset,
2119            offset_to_address,
2120            range_maps: Vec::new(),
2121        })
2122    }
2123
2124    /// Copies data from the input stream to the output stream up to the specified address of original stream.
2125    pub fn copy_up_to(&mut self, original_offset: u64) -> Result<()> {
2126        let cur_pos = self.input.stream_position()?;
2127        if original_offset < cur_pos || original_offset > self.input_len {
2128            return Err(std::io::Error::new(
2129                std::io::ErrorKind::InvalidInput,
2130                "Original offset is out of bounds",
2131            ));
2132        }
2133        let bytes_to_copy = original_offset - cur_pos;
2134        std::io::copy(&mut (&mut self.input).take(bytes_to_copy), &mut self.output)?;
2135        Ok(())
2136    }
2137
2138    /// Maps an original offset to a new offset in the output stream.
2139    pub fn map_offset(&mut self, original_offset: u64) -> Result<u64> {
2140        if original_offset > self.input_len {
2141            return Err(std::io::Error::new(
2142                std::io::ErrorKind::InvalidInput,
2143                "Original offset is out of bounds",
2144            ));
2145        }
2146        let cur_pos = self.input.stream_position()?;
2147        if original_offset > cur_pos {
2148            return Err(std::io::Error::new(
2149                std::io::ErrorKind::InvalidInput,
2150                "Original offset is beyond current position",
2151            ));
2152        }
2153        let mut start = 0;
2154        let mut end = self.range_maps.len();
2155        while start < end {
2156            let pivot = (start + end) / 2;
2157            let range = &self.range_maps[pivot];
2158            if original_offset < range.original.0 {
2159                end = pivot;
2160            } else if original_offset == range.original.0 {
2161                return Ok(range.new.0);
2162            } else if original_offset >= range.original.1 {
2163                start = pivot + 1;
2164            } else {
2165                return Err(std::io::Error::new(
2166                    std::io::ErrorKind::InvalidInput,
2167                    "Can't map an offset inside a changed section",
2168                ));
2169            }
2170        }
2171        if start == 0 {
2172            return Ok(original_offset);
2173        }
2174        let index = start - 1;
2175        let range = &self.range_maps[index];
2176        let new_offset = original_offset + range.new.1 - range.original.1;
2177        let out_len = self.output.stream_length()?;
2178        if new_offset > out_len {
2179            return Err(std::io::Error::new(
2180                std::io::ErrorKind::InvalidInput,
2181                "Mapped offset is beyond the end of the output stream",
2182            ));
2183        }
2184        Ok(new_offset)
2185    }
2186
2187    /// Replaces bytes in the output stream with new data, starting from the current position in the input stream.
2188    ///
2189    /// * `original_length` - The length of the original data to be replaced.
2190    /// * `new_data` - The new data to write to the output stream.
2191    pub fn replace_bytes(&mut self, original_length: u64, new_data: &[u8]) -> Result<()> {
2192        self.replace_bytes_with_write(original_length, |writer| writer.write_all(new_data))
2193    }
2194
2195    /// Replaces bytes in the output stream with new data, starting from the current position in the input stream.
2196    ///
2197    /// * `original_length` - The length of the original data to be replaced.
2198    /// * `write` - A function that writes the new data to the output stream.
2199    pub fn replace_bytes_with_write<F: Fn(&mut W) -> Result<()>>(
2200        &mut self,
2201        original_length: u64,
2202        write: F,
2203    ) -> Result<()> {
2204        let cur_pos = self.input.stream_position()?;
2205        if cur_pos + original_length > self.input_len {
2206            return Err(std::io::Error::new(
2207                std::io::ErrorKind::InvalidInput,
2208                "Original length exceeds input length",
2209            ));
2210        }
2211        let new_data_offset = self.output.stream_position()?;
2212        write(&mut self.output)?;
2213        let new_data_length = self.output.stream_position()? - new_data_offset;
2214        if new_data_length != original_length {
2215            self.range_maps.push(RangeMap {
2216                original: (cur_pos, cur_pos + original_length),
2217                new: (new_data_offset, new_data_offset + new_data_length),
2218            });
2219        }
2220        self.input
2221            .seek(SeekFrom::Start(cur_pos + original_length))?;
2222        Ok(())
2223    }
2224
2225    /// Patches a u32 value in the output stream at the specified original offset.
2226    pub fn patch_u32(&mut self, original_offset: u64, value: u32) -> Result<()> {
2227        let input_pos = self.input.stream_position()?;
2228        if input_pos < original_offset + 4 {
2229            return Err(std::io::Error::new(
2230                std::io::ErrorKind::InvalidInput,
2231                "Original offset is out of bounds for u32 patching",
2232            ));
2233        }
2234        let new_offset = self.map_offset(original_offset)?;
2235        self.output.seek(SeekFrom::Start(new_offset))?;
2236        self.output.write_u32(value)?;
2237        self.output.seek(SeekFrom::End(0))?;
2238        Ok(())
2239    }
2240
2241    /// Patches a u32 value in big-endian order in the output stream at the specified original offset.
2242    pub fn patch_u32_be(&mut self, original_offset: u64, value: u32) -> Result<()> {
2243        let input_pos = self.input.stream_position()?;
2244        if input_pos < original_offset + 4 {
2245            return Err(std::io::Error::new(
2246                std::io::ErrorKind::InvalidInput,
2247                "Original offset is out of bounds for u32 patching",
2248            ));
2249        }
2250        let new_offset = self.map_offset(original_offset)?;
2251        self.output.seek(SeekFrom::Start(new_offset))?;
2252        self.output.write_u32_be(value)?;
2253        self.output.seek(SeekFrom::End(0))?;
2254        Ok(())
2255    }
2256
2257    /// Patches a u32 address in the output stream at the specified original offset.
2258    pub fn patch_u32_address(&mut self, original_offset: u64) -> Result<()> {
2259        let input_pos = self.input.stream_position()?;
2260        if input_pos < original_offset + 4 {
2261            return Err(std::io::Error::new(
2262                std::io::ErrorKind::InvalidInput,
2263                "Original offset is out of bounds for u32 address patching",
2264            ));
2265        }
2266        let original_address = self.input.peek_u32_at(original_offset)?;
2267        let new_offset = self.map_offset(original_offset)?;
2268        let offset = (self.address_to_offset)(original_address as u64)?;
2269        let offset = self.map_offset(offset)?;
2270        let new_addr = (self.offset_to_address)(offset)?;
2271        self.output.seek(SeekFrom::Start(new_offset))?;
2272        self.output.write_u32(new_addr as u32)?;
2273        self.output.seek(SeekFrom::End(0))?;
2274        Ok(())
2275    }
2276}
2277
2278/// A thread-safe wrapper around a Mutex-protected writer/reader.
2279#[derive(Debug)]
2280pub struct MutexWrapper<T> {
2281    inner: Arc<Mutex<T>>,
2282    pos: u64,
2283}
2284
2285impl<T> MutexWrapper<T> {
2286    /// Creates a new `MutexWrapper` with the given inner value.
2287    pub fn new(inner: Arc<Mutex<T>>, pos: u64) -> Self {
2288        MutexWrapper { inner, pos }
2289    }
2290}
2291
2292impl<T: Read + Seek> Read for MutexWrapper<T> {
2293    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2294        let mut lock = self.inner.lock().map_err(|_| {
2295            std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
2296        })?;
2297        lock.seek(SeekFrom::Start(self.pos))?;
2298        let readed = lock.read(buf)?;
2299        self.pos += readed as u64;
2300        Ok(readed)
2301    }
2302}
2303
2304impl<T: Read + Seek> Seek for MutexWrapper<T> {
2305    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2306        let mut lock = self.inner.lock().map_err(|_| {
2307            std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
2308        })?;
2309        let new_pos = match pos {
2310            SeekFrom::Start(offset) => offset,
2311            SeekFrom::End(offset) => {
2312                let len = lock.stream_length()?;
2313                (len as i64 + offset as i64) as u64
2314            }
2315            SeekFrom::Current(offset) => (self.pos as i64 + offset as i64) as u64,
2316        };
2317        if new_pos > lock.stream_length()? {
2318            return Err(std::io::Error::new(
2319                std::io::ErrorKind::InvalidInput,
2320                "Seek position is beyond the end of the stream",
2321            ));
2322        }
2323        self.pos = new_pos;
2324        Ok(self.pos)
2325    }
2326
2327    fn stream_position(&mut self) -> Result<u64> {
2328        Ok(self.pos)
2329    }
2330
2331    fn rewind(&mut self) -> Result<()> {
2332        self.pos = 0;
2333        Ok(())
2334    }
2335}
2336
2337/// A writer that does nothing and always succeeds.
2338pub struct EmptyWriter;
2339
2340impl EmptyWriter {
2341    /// Creates a new `EmptyWriter`.
2342    pub fn new() -> Self {
2343        Self {}
2344    }
2345}
2346
2347impl Write for EmptyWriter {
2348    fn write(&mut self, buf: &[u8]) -> Result<usize> {
2349        Ok(buf.len())
2350    }
2351
2352    fn flush(&mut self) -> Result<()> {
2353        Ok(())
2354    }
2355}
2356
2357#[derive(Debug)]
2358/// A readable stream that starts with a given prefix before the actual data.
2359pub struct PrefixStream<T> {
2360    prefix: Vec<u8>,
2361    pos: usize,
2362    inner: T,
2363}
2364
2365impl<T> PrefixStream<T> {
2366    /// Creates a new `PrefixStream` with the given prefix and inner stream.
2367    pub fn new(prefix: Vec<u8>, inner: T) -> Self {
2368        PrefixStream {
2369            prefix,
2370            pos: 0,
2371            inner,
2372        }
2373    }
2374}
2375
2376impl<T: Read> Read for PrefixStream<T> {
2377    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2378        if self.pos < self.prefix.len() {
2379            let bytes_to_read = std::cmp::min(buf.len(), self.prefix.len() - self.pos);
2380            buf[..bytes_to_read].copy_from_slice(&self.prefix[self.pos..self.pos + bytes_to_read]);
2381            self.pos += bytes_to_read;
2382            Ok(bytes_to_read)
2383        } else {
2384            self.inner.read(buf)
2385        }
2386    }
2387}
2388
2389impl<T: Seek> Seek for PrefixStream<T> {
2390    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2391        let prefix_len = self.prefix.len() as u64;
2392        let new_pos = match pos {
2393            SeekFrom::Start(offset) => offset,
2394            SeekFrom::End(offset) => {
2395                let inner_len = self.inner.stream_length()?;
2396                if offset < 0 {
2397                    if (-offset) as u64 > inner_len + prefix_len {
2398                        return Err(std::io::Error::new(
2399                            std::io::ErrorKind::InvalidInput,
2400                            "Seek position is before the start of the stream",
2401                        ));
2402                    }
2403                    inner_len + prefix_len - (-offset) as u64
2404                } else {
2405                    inner_len + prefix_len + offset as u64
2406                }
2407            }
2408            SeekFrom::Current(offset) => {
2409                let current_pos = self.stream_position()?;
2410                if offset < 0 {
2411                    if (-offset) as u64 > current_pos + prefix_len {
2412                        return Err(std::io::Error::new(
2413                            std::io::ErrorKind::InvalidInput,
2414                            "Seek position is before the start of the stream",
2415                        ));
2416                    }
2417                    prefix_len + current_pos - (-offset) as u64
2418                } else {
2419                    prefix_len + current_pos + offset as u64
2420                }
2421            }
2422        };
2423        if new_pos < prefix_len {
2424            self.pos = new_pos as usize;
2425            self.inner.rewind()?;
2426        } else {
2427            self.pos = self.prefix.len();
2428            self.inner.seek(SeekFrom::Start(new_pos - prefix_len))?;
2429        }
2430        Ok(new_pos)
2431    }
2432
2433    fn stream_position(&mut self) -> Result<u64> {
2434        Ok(self.pos as u64 + self.inner.stream_position()?)
2435    }
2436
2437    fn rewind(&mut self) -> Result<()> {
2438        self.pos = 0;
2439        self.inner.rewind()?;
2440        Ok(())
2441    }
2442}
2443
2444/// A readable stream that concatenates multiple streams.
2445#[derive(Debug)]
2446pub struct MultipleReadStream {
2447    streams: Vec<Box<dyn ReadSeek>>,
2448    stream_lengths: Vec<u64>,
2449    total_length: u64,
2450    pos: u64,
2451}
2452
2453impl MultipleReadStream {
2454    /// Creates a new `MultipleReadStream`.
2455    pub fn new() -> Self {
2456        MultipleReadStream {
2457            streams: Vec::new(),
2458            stream_lengths: Vec::new(),
2459            total_length: 0,
2460            pos: 0,
2461        }
2462    }
2463
2464    /// Adds a new stream to the end of the concatenated streams.
2465    pub fn add_stream<T: ReadSeek + 'static>(&mut self, mut stream: T) -> Result<()> {
2466        let length = stream.stream_length()?;
2467        self.streams.push(Box::new(stream));
2468        self.stream_lengths.push(self.total_length);
2469        self.total_length += length;
2470        Ok(())
2471    }
2472
2473    /// Adds a new boxed stream to the end of the concatenated streams.
2474    pub fn add_stream_boxed(&mut self, mut stream: Box<dyn ReadSeek>) -> Result<()> {
2475        let length = stream.stream_length()?;
2476        self.streams.push(stream);
2477        self.stream_lengths.push(self.total_length);
2478        self.total_length += length;
2479        Ok(())
2480    }
2481}
2482
2483impl Read for MultipleReadStream {
2484    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2485        if self.pos >= self.total_length {
2486            return Ok(0);
2487        }
2488        let (stream_index, stream_offset) = match self.stream_lengths.binary_search_by(|&len| {
2489            if len > self.pos {
2490                std::cmp::Ordering::Greater
2491            } else {
2492                std::cmp::Ordering::Less
2493            }
2494        }) {
2495            Ok(index) => (index, 0),
2496            Err(0) => (0, self.pos),
2497            Err(index) => (index - 1, self.pos - self.stream_lengths[index - 1]),
2498        };
2499        let stream = &mut self.streams[stream_index];
2500        stream.seek(SeekFrom::Start(stream_offset))?;
2501        let bytes_read = stream.read(buf)?;
2502        self.pos += bytes_read as u64;
2503        Ok(bytes_read)
2504    }
2505}
2506
2507impl Seek for MultipleReadStream {
2508    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2509        let new_pos = match pos {
2510            SeekFrom::Start(offset) => offset,
2511            SeekFrom::End(offset) => {
2512                if offset < 0 {
2513                    if (-offset) as u64 > self.total_length {
2514                        return Err(std::io::Error::new(
2515                            std::io::ErrorKind::InvalidInput,
2516                            "Seek position is before the start of the stream",
2517                        ));
2518                    }
2519                    self.total_length - (-offset) as u64
2520                } else {
2521                    self.total_length + offset as u64
2522                }
2523            }
2524            SeekFrom::Current(offset) => {
2525                if offset < 0 {
2526                    if (-offset) as u64 > self.pos {
2527                        return Err(std::io::Error::new(
2528                            std::io::ErrorKind::InvalidInput,
2529                            "Seek position is before the start of the stream",
2530                        ));
2531                    }
2532                    self.pos - (-offset) as u64
2533                } else {
2534                    self.pos + offset as u64
2535                }
2536            }
2537        };
2538        if new_pos > self.total_length {
2539            return Err(std::io::Error::new(
2540                std::io::ErrorKind::InvalidInput,
2541                "Seek position is beyond the end of the stream",
2542            ));
2543        }
2544        self.pos = new_pos;
2545        Ok(self.pos)
2546    }
2547
2548    fn stream_position(&mut self) -> Result<u64> {
2549        Ok(self.pos)
2550    }
2551
2552    fn rewind(&mut self) -> Result<()> {
2553        self.pos = 0;
2554        Ok(())
2555    }
2556}
2557
2558pub struct TrackStream<'a, T> {
2559    inner: T,
2560    total: &'a mut u64,
2561}
2562
2563impl<'a, T> TrackStream<'a, T> {
2564    pub fn new(inner: T, total: &'a mut u64) -> Self {
2565        TrackStream { inner, total }
2566    }
2567}
2568
2569impl<'a, T: Read> Read for TrackStream<'a, T> {
2570    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2571        let readed = self.inner.read(buf)?;
2572        *self.total += readed as u64;
2573        Ok(readed)
2574    }
2575}
2576
2577impl<'a, T: Write> Write for TrackStream<'a, T> {
2578    fn write(&mut self, buf: &[u8]) -> Result<usize> {
2579        let written = self.inner.write(buf)?;
2580        *self.total += written as u64;
2581        Ok(written)
2582    }
2583
2584    fn flush(&mut self) -> Result<()> {
2585        self.inner.flush()
2586    }
2587}
2588
2589/// A reader that forwards reads to an inner reader, but ensures that all reads are aligned to a specified alignment boundary.
2590#[derive(Debug)]
2591pub struct AlignedReader<const A: usize, T: Read> {
2592    inner: T,
2593    buffer: [u8; A],
2594    buffer_size: usize,
2595}
2596
2597impl<const A: usize, T: Read> AlignedReader<A, T> {
2598    /// Creates a new `AlignedReader` with the given inner reader.
2599    pub fn new(inner: T) -> Self {
2600        AlignedReader {
2601            inner,
2602            buffer: [0; A],
2603            buffer_size: 0,
2604        }
2605    }
2606}
2607
2608impl<const A: usize, T: Read> Read for AlignedReader<A, T> {
2609    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2610        let mut total_read = 0;
2611        let mut needed = buf.len();
2612        if needed <= self.buffer_size {
2613            buf[..needed].copy_from_slice(&self.buffer[..needed]);
2614            self.buffer.copy_within(needed..self.buffer_size, 0);
2615            self.buffer_size -= needed;
2616            return Ok(needed);
2617        }
2618        if self.buffer_size > 0 {
2619            buf[..self.buffer_size].copy_from_slice(&self.buffer[..self.buffer_size]);
2620            total_read += self.buffer_size;
2621            needed -= self.buffer_size;
2622            self.buffer_size = 0;
2623        }
2624        let read_len = needed / A * A;
2625        if read_len > 0 {
2626            let readed = self
2627                .inner
2628                .read(&mut buf[total_read..total_read + read_len])?;
2629            total_read += readed;
2630            needed -= readed;
2631            // EOF reached
2632            if readed < read_len {
2633                return Ok(total_read);
2634            }
2635        }
2636        if needed > 0 {
2637            let readed = self.inner.read(&mut self.buffer)?;
2638            let to_copy = needed.min(readed);
2639            buf[total_read..total_read + to_copy].copy_from_slice(&self.buffer[..to_copy]);
2640            total_read += to_copy;
2641            self.buffer_size = readed - to_copy;
2642            self.buffer.copy_within(to_copy..readed, 0);
2643        }
2644        Ok(total_read)
2645    }
2646}
2647
2648/// A writer that forwards reads to an inner writer, but ensures that all writes are aligned to a specified alignment boundary.
2649#[derive(Debug)]
2650pub struct AlignedWriter<const A: usize, T: Write> {
2651    inner: T,
2652    buffer: [u8; A],
2653    buffer_size: usize,
2654}
2655
2656impl<const A: usize, T: Write> AlignedWriter<A, T> {
2657    /// Creates a new `AlignedWriter` with the given inner writer.
2658    pub fn new(inner: T) -> Self {
2659        AlignedWriter {
2660            inner,
2661            buffer: [0; A],
2662            buffer_size: 0,
2663        }
2664    }
2665}
2666
2667impl<const A: usize, T: Write> Write for AlignedWriter<A, T> {
2668    fn write(&mut self, buf: &[u8]) -> Result<usize> {
2669        let mut total_writted = 0;
2670        let mut needed = buf.len();
2671        if self.buffer_size > 0 {
2672            let to_copy = (A - self.buffer_size).min(needed);
2673            self.buffer[self.buffer_size..self.buffer_size + to_copy]
2674                .copy_from_slice(&buf[..to_copy]);
2675            self.buffer_size += to_copy;
2676            total_writted += to_copy;
2677            needed -= to_copy;
2678            if self.buffer_size == A {
2679                let writed = self.inner.write(&self.buffer)?;
2680                if writed % A != 0 {
2681                    return Err(std::io::Error::new(
2682                        std::io::ErrorKind::WriteZero,
2683                        "Failed to write all aligned bytes",
2684                    ));
2685                }
2686                self.buffer_size -= writed;
2687            } else {
2688                return Ok(total_writted);
2689            }
2690        }
2691        let mut write_len = needed / A * A;
2692        while write_len > 0 {
2693            let writed = self
2694                .inner
2695                .write(&buf[total_writted..total_writted + write_len])?;
2696            if writed % A != 0 {
2697                return Err(std::io::Error::new(
2698                    std::io::ErrorKind::WriteZero,
2699                    "Failed to write all aligned bytes",
2700                ));
2701            }
2702            total_writted += writed;
2703            needed -= writed;
2704            write_len = needed / A * A;
2705        }
2706        if needed > 0 {
2707            self.buffer[..needed].copy_from_slice(&buf[total_writted..total_writted + needed]);
2708            self.buffer_size = needed;
2709            total_writted += needed;
2710        }
2711        Ok(total_writted)
2712    }
2713
2714    fn flush(&mut self) -> Result<()> {
2715        self.inner.flush()
2716    }
2717}
2718
2719impl<const A: usize, T: Write> Drop for AlignedWriter<A, T> {
2720    fn drop(&mut self) {
2721        if self.buffer_size > 0 {
2722            if let Err(err) = self.inner.write_all(&self.buffer[..self.buffer_size]) {
2723                eprintln!("Failed to flush AlignedWriter buffer: {}", err);
2724                crate::COUNTER.inc_error();
2725            }
2726            self.buffer_size = 0;
2727        }
2728    }
2729}