@@ -23,6 +23,7 @@ use crate::{
23
23
pub struct WadFs {
24
24
file : Box < dyn VfsFile > ,
25
25
wad : WadFile ,
26
+ mtime : Option < FileTime > ,
26
27
}
27
28
28
29
enum WadFindResult < ' a > {
@@ -34,9 +35,10 @@ enum WadFindResult<'a> {
34
35
35
36
impl WadFs {
36
37
pub fn new ( mut file : Box < dyn VfsFile > ) -> io:: Result < Self > {
38
+ let mtime = file. metadata ( ) ?. mtime ;
37
39
let wad = process_wad ( file. as_mut ( ) )
38
40
. map_err ( |e| io:: Error :: new ( io:: ErrorKind :: InvalidData , e) ) ?;
39
- Ok ( Self { file, wad } )
41
+ Ok ( Self { file, wad, mtime } )
40
42
}
41
43
42
44
fn find ( & self , path : & str ) -> Option < WadFindResult > {
@@ -81,7 +83,7 @@ impl Vfs for WadFs {
81
83
match result {
82
84
WadFindResult :: Root => Err ( VfsError :: IsADirectory ) ,
83
85
WadFindResult :: Static ( data) => {
84
- Ok ( Box :: new ( StaticFile :: new ( Arc :: from ( data) , self . file . metadata ( ) ? . mtime ) ) )
86
+ Ok ( Box :: new ( StaticFile :: new ( Arc :: from ( data) , self . mtime ) ) )
85
87
}
86
88
WadFindResult :: Content ( content_index, content) => {
87
89
let offset = self . wad . content_offset ( content_index) ;
@@ -93,7 +95,7 @@ impl Vfs for WadFs {
93
95
& self . wad . title_key ,
94
96
& content. iv ( ) ,
95
97
) ,
96
- self . file . metadata ( ) ? . mtime ,
98
+ self . mtime ,
97
99
) ) )
98
100
}
99
101
WadFindResult :: Window ( offset, len) => {
@@ -129,20 +131,23 @@ impl Vfs for WadFs {
129
131
}
130
132
131
133
fn metadata ( & mut self , path : & Utf8UnixPath ) -> VfsResult < VfsMetadata > {
132
- let mtime = self . file . metadata ( ) ?. mtime ;
133
134
if let Some ( result) = self . find ( path. as_str ( ) ) {
134
135
match result {
135
136
WadFindResult :: Root => {
136
- Ok ( VfsMetadata { file_type : VfsFileType :: Directory , len : 0 , mtime } )
137
- }
138
- WadFindResult :: Static ( data) => {
139
- Ok ( VfsMetadata { file_type : VfsFileType :: File , len : data. len ( ) as u64 , mtime } )
140
- }
141
- WadFindResult :: Content ( _, content) => {
142
- Ok ( VfsMetadata { file_type : VfsFileType :: File , len : content. size . get ( ) , mtime } )
137
+ Ok ( VfsMetadata { file_type : VfsFileType :: Directory , len : 0 , mtime : self . mtime } )
143
138
}
139
+ WadFindResult :: Static ( data) => Ok ( VfsMetadata {
140
+ file_type : VfsFileType :: File ,
141
+ len : data. len ( ) as u64 ,
142
+ mtime : self . mtime ,
143
+ } ) ,
144
+ WadFindResult :: Content ( _, content) => Ok ( VfsMetadata {
145
+ file_type : VfsFileType :: File ,
146
+ len : content. size . get ( ) ,
147
+ mtime : self . mtime ,
148
+ } ) ,
144
149
WadFindResult :: Window ( _, len) => {
145
- Ok ( VfsMetadata { file_type : VfsFileType :: File , len, mtime } )
150
+ Ok ( VfsMetadata { file_type : VfsFileType :: File , len, mtime : self . mtime } )
146
151
}
147
152
}
148
153
} else {
@@ -168,19 +173,21 @@ impl WadContent {
168
173
Self { inner : WadContentInner :: Stream ( inner) , mtime }
169
174
}
170
175
171
- fn convert_to_mapped ( & mut self ) {
176
+ fn convert_to_mapped ( & mut self ) -> io :: Result < ( ) > {
172
177
match & mut self . inner {
173
178
WadContentInner :: Stream ( stream) => {
174
- let pos = stream. stream_position ( ) . unwrap ( ) ;
175
- stream. seek ( SeekFrom :: Start ( 0 ) ) . unwrap ( ) ;
176
- let mut data = vec ! [ 0u8 ; stream. len( ) as usize ] ;
177
- stream. read_exact ( & mut data) . unwrap ( ) ;
178
- let mut cursor = Cursor :: new ( Arc :: from ( data. as_slice ( ) ) ) ;
179
+ let pos = stream. stream_position ( ) ?;
180
+ stream. seek ( SeekFrom :: Start ( 0 ) ) ?;
181
+ let mut data = <[ u8 ] >:: new_box_zeroed_with_elems ( stream. len ( ) as usize )
182
+ . map_err ( |_| io:: Error :: from ( io:: ErrorKind :: OutOfMemory ) ) ?;
183
+ stream. read_exact ( & mut data) ?;
184
+ let mut cursor = Cursor :: new ( Arc :: from ( data) ) ;
179
185
cursor. set_position ( pos) ;
180
186
self . inner = WadContentInner :: Mapped ( cursor) ;
181
187
}
182
188
WadContentInner :: Mapped ( _) => { }
183
189
} ;
190
+ Ok ( ( ) )
184
191
}
185
192
}
186
193
@@ -220,7 +227,7 @@ impl Seek for WadContent {
220
227
221
228
impl VfsFile for WadContent {
222
229
fn map ( & mut self ) -> io:: Result < & [ u8 ] > {
223
- self . convert_to_mapped ( ) ;
230
+ self . convert_to_mapped ( ) ? ;
224
231
match & mut self . inner {
225
232
WadContentInner :: Stream ( _) => unreachable ! ( ) ,
226
233
WadContentInner :: Mapped ( data) => Ok ( data. get_ref ( ) ) ,
0 commit comments