diff --git a/Userland/Libraries/LibCore/MimeData.cpp b/Userland/Libraries/LibCore/MimeData.cpp index 0f434cec8e..eb149c29ad 100644 --- a/Userland/Libraries/LibCore/MimeData.cpp +++ b/Userland/Libraries/LibCore/MimeData.cpp @@ -6,6 +6,7 @@ #include #include +#include #include namespace Core { @@ -184,4 +185,19 @@ Optional guess_mime_type_based_on_sniffed_bytes(ReadonlyBytes #undef __ENUMERATE_MIME_TYPE_HEADER return {}; } + +Optional guess_mime_type_based_on_sniffed_bytes(Core::File& file) +{ + // Read accounts for longest possible offset + signature we currently match against (extra/iso-9660) + auto maybe_buffer = ByteBuffer::create_uninitialized(0x9006); + if (maybe_buffer.is_error()) + return {}; + + auto maybe_bytes = file.read_some(maybe_buffer.value()); + if (maybe_bytes.is_error()) + return {}; + + return Core::guess_mime_type_based_on_sniffed_bytes(maybe_bytes.value()); +} + } diff --git a/Userland/Libraries/LibCore/MimeData.h b/Userland/Libraries/LibCore/MimeData.h index 8947fb7a8f..91b7f6dd05 100644 --- a/Userland/Libraries/LibCore/MimeData.h +++ b/Userland/Libraries/LibCore/MimeData.h @@ -51,5 +51,6 @@ private: StringView guess_mime_type_based_on_filename(StringView); Optional guess_mime_type_based_on_sniffed_bytes(ReadonlyBytes); +Optional guess_mime_type_based_on_sniffed_bytes(Core::File&); } diff --git a/Userland/Utilities/file.cpp b/Userland/Utilities/file.cpp index a12240aedb..8096764d33 100644 --- a/Userland/Utilities/file.cpp +++ b/Userland/Utilities/file.cpp @@ -210,8 +210,6 @@ ErrorOr serenity_main(Main::Arguments arguments) args_parser.parse(arguments); bool all_ok = true; - // Read accounts for longest possible offset + signature we currently match against. - auto buffer = TRY(ByteBuffer::create_uninitialized(0x9006)); for (auto const& path : paths) { auto file_or_error = Core::File::open(path, Core::File::OpenMode::Read); @@ -230,9 +228,8 @@ ErrorOr serenity_main(Main::Arguments arguments) } else if (!file_size_in_bytes) { outln("{}: empty", path); } else { - auto bytes = TRY(file->read_some(buffer)); auto file_name_guess = Core::guess_mime_type_based_on_filename(path); - auto mime_type = Core::guess_mime_type_based_on_sniffed_bytes(bytes).value_or(file_name_guess); + auto mime_type = Core::guess_mime_type_based_on_sniffed_bytes(*file).value_or(file_name_guess); auto human_readable_description = get_description_from_mime_type(mime_type, path).value_or(mime_type); outln("{}: {}", path, flag_mime_only ? mime_type : human_readable_description); }