@@ -240,133 +240,7 @@ where
240
240
//let imports_hash_set: HashSet<String> = HashSet::new();
241
241
let mut entries = HashMap :: default ( ) ;
242
242
for ( path, hash) in file_info {
243
- // read file
244
- let mut file = File :: open ( & path) ?;
245
- let mut file_buffer = Vec :: new ( ) ;
246
- file. read_to_end ( & mut file_buffer) ?;
247
-
248
- let mut file_cursor = Cursor :: new ( & file_buffer) ;
249
-
250
- //let firstimportidx = imports_hash_set.len();
251
- //let mut lastimportidx = imports_hash_set.len();
252
- let mut flags = 0 ;
253
- let mut segment: FileSegment ;
254
- let mut buffers = vec ! [ ] ;
255
-
256
- if let Ok ( info) = read_cr2w_header ( & mut file_cursor) {
257
- // get main file
258
- file_cursor. seek ( SeekFrom :: Start ( 0 ) ) ?;
259
- let size = info. header . objects_end ;
260
- let mut resource_buffer = vec ! [ 0 ; size as usize ] ;
261
- file_cursor. read_exact ( & mut resource_buffer[ ..] ) ?;
262
- // get archive offset before writing
263
- let archive_offset = archive_writer. stream_position ( ) ?;
264
-
265
- // kark file
266
- let compressed_size_needed = get_compressed_buffer_size_needed ( size as u64 ) ;
267
- let mut compressed_buffer = vec ! [ 0 ; compressed_size_needed as usize ] ;
268
- let zsize = compress (
269
- & resource_buffer,
270
- & mut compressed_buffer,
271
- CompressionLevel :: Normal ,
272
- ) ;
273
- assert ! ( ( zsize as u32 ) <= size) ;
274
- compressed_buffer. resize ( zsize as usize , 0 ) ;
275
-
276
- // write compressed main file archive
277
- // KARK header
278
- archive_writer. write_u32 :: < LittleEndian > ( kraken:: MAGIC ) ?; //magic
279
- archive_writer. write_u32 :: < LittleEndian > ( size) ?; //uncompressed buffer length
280
- archive_writer. write_all ( & compressed_buffer) ?;
281
-
282
- // add metadata to archive
283
- segment = FileSegment :: new ( archive_offset, zsize as u32 , size) ;
284
-
285
- // write buffers (bytes after the main file)
286
- for buffer_info in info. buffers_table . iter ( ) {
287
- let mut buffer = vec ! [ 0 ; buffer_info. disk_size as usize ] ;
288
- file_cursor. read_exact ( & mut buffer[ ..] ) ?;
289
-
290
- let bsize = buffer_info. mem_size ;
291
- let bzsize = buffer_info. disk_size ;
292
- let boffset = archive_writer. stream_position ( ) ?;
293
- archive_writer. write_all ( buffer. as_slice ( ) ) ?;
294
-
295
- // add metadata to archive
296
- buffers. push ( FileSegment :: new ( boffset, bzsize, bsize) ) ;
297
- }
298
-
299
- //register imports
300
- // NOTE don't use a dependency list for mods
301
- //for import in info.imports.iter() {
302
- // if (cr2WImportWrapper.Flags is not InternalEnums.EImportFlags.Soft and not InternalEnums.EImportFlags.Embedded)
303
- //imports_hash_set.insert(import.depot_path.to_owned());
304
- //}
305
-
306
- //lastimportidx = imports_hash_set.len();
307
-
308
- flags = if !info. buffers_table . is_empty ( ) {
309
- info. buffers_table . len ( ) - 1
310
- } else {
311
- 0
312
- } ;
313
- } else {
314
- // write non-cr2w file
315
- file_cursor. seek ( SeekFrom :: Start ( 0 ) ) ?;
316
- let os_ext = path. extension ( ) . unwrap ( ) ;
317
- let ext = os_ext. to_ascii_lowercase ( ) . to_string_lossy ( ) . to_string ( ) ;
318
- if get_aligned_file_extensions ( ) . contains ( & ext) {
319
- pad_until_page ( & mut archive_writer) ?;
320
- }
321
-
322
- let offset = archive_writer. stream_position ( ) ?;
323
- let size = file_buffer. len ( ) as u32 ;
324
- let final_zsize;
325
- if get_uncompressed_file_extensions ( ) . contains ( & ext) {
326
- // direct copy
327
- archive_writer. write_all ( & file_buffer) ?;
328
- final_zsize = size;
329
- } else {
330
- // kark file
331
- let compressed_size_needed = get_compressed_buffer_size_needed ( size as u64 ) ;
332
- let mut compressed_buffer = vec ! [ 0 ; compressed_size_needed as usize ] ;
333
- let zsize = compress (
334
- & file_buffer,
335
- & mut compressed_buffer,
336
- CompressionLevel :: Normal ,
337
- ) ;
338
- assert ! ( ( zsize as u32 ) <= size) ;
339
- compressed_buffer. resize ( zsize as usize , 0 ) ;
340
- final_zsize = zsize as u32 ;
341
- // write
342
- archive_writer. write_all ( & compressed_buffer) ?;
343
- }
344
-
345
- // add metadata to archive
346
- segment = FileSegment :: new ( offset, final_zsize, size) ;
347
- }
348
-
349
- // update archive metadata
350
- let sha1_hash = sha1_hash_file ( & file_buffer) ;
351
-
352
- let entry = FileEntry :: new (
353
- hash,
354
- 0 ,
355
- flags as u32 ,
356
- 0 , //firstoffsetidx as u32,
357
- 0 , //lastoffsetidx as u32,
358
- 0 , //firstimportidx as u32,
359
- 0 , //lastimportidx as u32,
360
- sha1_hash,
361
- ) ;
362
-
363
- let wrapped_entry = ZipEntry {
364
- hash,
365
- name : None ,
366
- entry,
367
- segment,
368
- buffers,
369
- } ;
243
+ let wrapped_entry = make_entry ( path, & mut archive_writer, hash) ?;
370
244
371
245
entries. insert ( hash, wrapped_entry) ;
372
246
}
@@ -408,6 +282,133 @@ where
408
282
Ok ( ( ) )
409
283
}
410
284
285
+ fn make_entry < W : Write + Seek > (
286
+ path : PathBuf ,
287
+ archive_writer : & mut BufWriter < W > ,
288
+ hash : u64 ,
289
+ ) -> Result < ZipEntry > {
290
+ let mut file = File :: open ( & path) ?;
291
+ let mut file_buffer = Vec :: new ( ) ;
292
+ file. read_to_end ( & mut file_buffer) ?;
293
+ let mut file_cursor = Cursor :: new ( & file_buffer) ;
294
+
295
+ let mut flags = 0 ;
296
+ let segment: FileSegment ;
297
+ let mut buffers = vec ! [ ] ;
298
+
299
+ if let Ok ( info) = read_cr2w_header ( & mut file_cursor) {
300
+ // get main file
301
+ file_cursor. seek ( SeekFrom :: Start ( 0 ) ) ?;
302
+ let size = info. header . objects_end ;
303
+ let mut resource_buffer = vec ! [ 0 ; size as usize ] ;
304
+ file_cursor. read_exact ( & mut resource_buffer[ ..] ) ?;
305
+ // get archive offset before writing
306
+ let archive_offset = archive_writer. stream_position ( ) ?;
307
+
308
+ // kark file
309
+ let compressed_size_needed = get_compressed_buffer_size_needed ( size as u64 ) ;
310
+ let mut compressed_buffer = vec ! [ 0 ; compressed_size_needed as usize ] ;
311
+ let zsize = compress (
312
+ & resource_buffer,
313
+ & mut compressed_buffer,
314
+ CompressionLevel :: Normal ,
315
+ ) ;
316
+ assert ! ( ( zsize as u32 ) <= size) ;
317
+ compressed_buffer. resize ( zsize as usize , 0 ) ;
318
+
319
+ // write compressed main file archive
320
+ // KARK header
321
+ archive_writer. write_u32 :: < LittleEndian > ( kraken:: MAGIC ) ?; //magic
322
+ archive_writer. write_u32 :: < LittleEndian > ( size) ?; //uncompressed buffer length
323
+ archive_writer. write_all ( & compressed_buffer) ?;
324
+
325
+ // add metadata to archive
326
+ segment = FileSegment :: new ( archive_offset, zsize as u32 , size) ;
327
+
328
+ // write buffers (bytes after the main file)
329
+ for buffer_info in info. buffers_table . iter ( ) {
330
+ let mut buffer = vec ! [ 0 ; buffer_info. disk_size as usize ] ;
331
+ file_cursor. read_exact ( & mut buffer[ ..] ) ?;
332
+
333
+ let bsize = buffer_info. mem_size ;
334
+ let bzsize = buffer_info. disk_size ;
335
+ let boffset = archive_writer. stream_position ( ) ?;
336
+ archive_writer. write_all ( buffer. as_slice ( ) ) ?;
337
+
338
+ // add metadata to archive
339
+ buffers. push ( FileSegment :: new ( boffset, bzsize, bsize) ) ;
340
+ }
341
+
342
+ //register imports
343
+ // NOTE don't use a dependency list for mods
344
+ //for import in info.imports.iter() {
345
+ // if (cr2WImportWrapper.Flags is not InternalEnums.EImportFlags.Soft and not InternalEnums.EImportFlags.Embedded)
346
+ //imports_hash_set.insert(import.depot_path.to_owned());
347
+ //}
348
+
349
+ //lastimportidx = imports_hash_set.len();
350
+
351
+ flags = if !info. buffers_table . is_empty ( ) {
352
+ info. buffers_table . len ( ) - 1
353
+ } else {
354
+ 0
355
+ } ;
356
+ } else {
357
+ // write non-cr2w file
358
+ file_cursor. seek ( SeekFrom :: Start ( 0 ) ) ?;
359
+ let os_ext = path. extension ( ) . unwrap ( ) ;
360
+ let ext = os_ext. to_ascii_lowercase ( ) . to_string_lossy ( ) . to_string ( ) ;
361
+ if get_aligned_file_extensions ( ) . contains ( & ext) {
362
+ pad_until_page ( archive_writer) ?;
363
+ }
364
+
365
+ let offset = archive_writer. stream_position ( ) ?;
366
+ let size = file_buffer. len ( ) as u32 ;
367
+ let final_zsize;
368
+ if get_uncompressed_file_extensions ( ) . contains ( & ext) {
369
+ // direct copy
370
+ archive_writer. write_all ( & file_buffer) ?;
371
+ final_zsize = size;
372
+ } else {
373
+ // kark file
374
+ let compressed_size_needed = get_compressed_buffer_size_needed ( size as u64 ) ;
375
+ let mut compressed_buffer = vec ! [ 0 ; compressed_size_needed as usize ] ;
376
+ let zsize = compress (
377
+ & file_buffer,
378
+ & mut compressed_buffer,
379
+ CompressionLevel :: Normal ,
380
+ ) ;
381
+ assert ! ( ( zsize as u32 ) <= size) ;
382
+ compressed_buffer. resize ( zsize as usize , 0 ) ;
383
+ final_zsize = zsize as u32 ;
384
+ // write
385
+ archive_writer. write_all ( & compressed_buffer) ?;
386
+ }
387
+
388
+ // add metadata to archive
389
+ segment = FileSegment :: new ( offset, final_zsize, size) ;
390
+ }
391
+ let sha1_hash = sha1_hash_file ( & file_buffer) ;
392
+ let entry = FileEntry :: new (
393
+ hash,
394
+ 0 ,
395
+ flags as u32 ,
396
+ 0 , //firstoffsetidx as u32,
397
+ 0 , //lastoffsetidx as u32,
398
+ 0 , //firstimportidx as u32,
399
+ 0 , //lastimportidx as u32,
400
+ sha1_hash,
401
+ ) ;
402
+ let wrapped_entry = ZipEntry {
403
+ hash,
404
+ name : None ,
405
+ entry,
406
+ segment,
407
+ buffers,
408
+ } ;
409
+ Ok ( wrapped_entry)
410
+ }
411
+
411
412
fn collect_resource_files < P : AsRef < Path > > ( in_folder : & P ) -> Vec < PathBuf > {
412
413
// collect files
413
414
let mut included_extensions = ERedExtension :: iter ( )
0 commit comments