Skip to content

Commit 736e3db

Browse files
committed
Update mod.rs
1 parent 350d7b4 commit 736e3db

File tree

1 file changed

+128
-127
lines changed

1 file changed

+128
-127
lines changed

src/archive/mod.rs

Lines changed: 128 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -240,133 +240,7 @@ where
240240
//let imports_hash_set: HashSet<String> = HashSet::new();
241241
let mut entries = HashMap::default();
242242
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)?;
370244

371245
entries.insert(hash, wrapped_entry);
372246
}
@@ -408,6 +282,133 @@ where
408282
Ok(())
409283
}
410284

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+
411412
fn collect_resource_files<P: AsRef<Path>>(in_folder: &P) -> Vec<PathBuf> {
412413
// collect files
413414
let mut included_extensions = ERedExtension::iter()

0 commit comments

Comments
 (0)