瀏覽代碼

LibCore+file: Factorize code to detect mime-type from bytes of a file

This is always nice to factorize code, but even better when it contains
magic numbers.
Lucas CHOLLET 2 年之前
父節點
當前提交
50b5528746
共有 3 個文件被更改,包括 18 次插入4 次删除
  1. 16 0
      Userland/Libraries/LibCore/MimeData.cpp
  2. 1 0
      Userland/Libraries/LibCore/MimeData.h
  3. 1 4
      Userland/Utilities/file.cpp

+ 16 - 0
Userland/Libraries/LibCore/MimeData.cpp

@@ -6,6 +6,7 @@
 
 #include <AK/LexicalPath.h>
 #include <AK/StringBuilder.h>
+#include <LibCore/File.h>
 #include <LibCore/MimeData.h>
 
 namespace Core {
@@ -184,4 +185,19 @@ Optional<DeprecatedString> guess_mime_type_based_on_sniffed_bytes(ReadonlyBytes
 #undef __ENUMERATE_MIME_TYPE_HEADER
     return {};
 }
+
+Optional<DeprecatedString> 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());
+}
+
 }

+ 1 - 0
Userland/Libraries/LibCore/MimeData.h

@@ -51,5 +51,6 @@ private:
 StringView guess_mime_type_based_on_filename(StringView);
 
 Optional<DeprecatedString> guess_mime_type_based_on_sniffed_bytes(ReadonlyBytes);
+Optional<DeprecatedString> guess_mime_type_based_on_sniffed_bytes(Core::File&);
 
 }

+ 1 - 4
Userland/Utilities/file.cpp

@@ -210,8 +210,6 @@ ErrorOr<int> 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<int> 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);
         }