|
@@ -75,7 +75,7 @@ Optional<Zip> Zip::try_create(ReadonlyBytes buffer)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-bool Zip::for_each_member(Function<IterationDecision(ZipMember const&)> callback)
|
|
|
+ErrorOr<bool> Zip::for_each_member(Function<IterationDecision(ZipMember const&)> callback)
|
|
|
{
|
|
|
size_t member_offset = m_members_start_offset;
|
|
|
for (size_t i = 0; i < m_member_count; i++) {
|
|
@@ -85,15 +85,12 @@ bool Zip::for_each_member(Function<IterationDecision(ZipMember const&)> callback
|
|
|
VERIFY(local_file_header.read(m_input_data.slice(central_directory_record.local_file_header_offset)));
|
|
|
|
|
|
ZipMember member;
|
|
|
- char null_terminated_name[central_directory_record.name_length + 1];
|
|
|
- memcpy(null_terminated_name, central_directory_record.name, central_directory_record.name_length);
|
|
|
- null_terminated_name[central_directory_record.name_length] = 0;
|
|
|
- member.name = DeprecatedString { null_terminated_name };
|
|
|
+ member.name = TRY(String::from_utf8({ central_directory_record.name, central_directory_record.name_length }));
|
|
|
member.compressed_data = { local_file_header.compressed_data, central_directory_record.compressed_size };
|
|
|
member.compression_method = central_directory_record.compression_method;
|
|
|
member.uncompressed_size = central_directory_record.uncompressed_size;
|
|
|
member.crc32 = central_directory_record.crc32;
|
|
|
- member.is_directory = central_directory_record.external_attributes & zip_directory_external_attribute || member.name.ends_with('/'); // FIXME: better directory detection
|
|
|
+ member.is_directory = central_directory_record.external_attributes & zip_directory_external_attribute || member.name.bytes_as_string_view().ends_with('/'); // FIXME: better directory detection
|
|
|
|
|
|
if (callback(member) == IterationDecision::Break)
|
|
|
return false;
|
|
@@ -117,7 +114,7 @@ static u16 minimum_version_needed(ZipCompressionMethod method)
|
|
|
ErrorOr<void> ZipOutputStream::add_member(ZipMember const& member)
|
|
|
{
|
|
|
VERIFY(!m_finished);
|
|
|
- VERIFY(member.name.length() <= UINT16_MAX);
|
|
|
+ VERIFY(member.name.bytes_as_string_view().length() <= UINT16_MAX);
|
|
|
VERIFY(member.compressed_data.size() <= UINT32_MAX);
|
|
|
TRY(m_members.try_append(member));
|
|
|
|
|
@@ -130,9 +127,9 @@ ErrorOr<void> ZipOutputStream::add_member(ZipMember const& member)
|
|
|
.crc32 = member.crc32,
|
|
|
.compressed_size = static_cast<u32>(member.compressed_data.size()),
|
|
|
.uncompressed_size = member.uncompressed_size,
|
|
|
- .name_length = static_cast<u16>(member.name.length()),
|
|
|
+ .name_length = static_cast<u16>(member.name.bytes_as_string_view().length()),
|
|
|
.extra_data_length = 0,
|
|
|
- .name = reinterpret_cast<u8 const*>(member.name.characters()),
|
|
|
+ .name = reinterpret_cast<u8 const*>(member.name.bytes_as_string_view().characters_without_null_termination()),
|
|
|
.extra_data = nullptr,
|
|
|
.compressed_data = member.compressed_data.data(),
|
|
|
};
|
|
@@ -158,18 +155,18 @@ ErrorOr<void> ZipOutputStream::finish()
|
|
|
.crc32 = member.crc32,
|
|
|
.compressed_size = static_cast<u32>(member.compressed_data.size()),
|
|
|
.uncompressed_size = member.uncompressed_size,
|
|
|
- .name_length = static_cast<u16>(member.name.length()),
|
|
|
+ .name_length = static_cast<u16>(member.name.bytes_as_string_view().length()),
|
|
|
.extra_data_length = 0,
|
|
|
.comment_length = 0,
|
|
|
.start_disk = 0,
|
|
|
.internal_attributes = 0,
|
|
|
.external_attributes = member.is_directory ? zip_directory_external_attribute : 0,
|
|
|
.local_file_header_offset = file_header_offset, // FIXME: we assume the wrapped output stream was never written to before us
|
|
|
- .name = reinterpret_cast<u8 const*>(member.name.characters()),
|
|
|
+ .name = reinterpret_cast<u8 const*>(member.name.bytes_as_string_view().characters_without_null_termination()),
|
|
|
.extra_data = nullptr,
|
|
|
.comment = nullptr,
|
|
|
};
|
|
|
- file_header_offset += sizeof(LocalFileHeader::signature) + (sizeof(LocalFileHeader) - (sizeof(u8*) * 3)) + member.name.length() + member.compressed_data.size();
|
|
|
+ file_header_offset += sizeof(LocalFileHeader::signature) + (sizeof(LocalFileHeader) - (sizeof(u8*) * 3)) + member.name.bytes_as_string_view().length() + member.compressed_data.size();
|
|
|
TRY(central_directory_record.write(*m_stream));
|
|
|
central_directory_size += central_directory_record.size();
|
|
|
}
|