/* * Copyright (c) 2024, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Web::HTML { ErrorOr SelectedFile::from_file_path(ByteString const& file_path) { // https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file):concept-input-file-path // Filenames must not contain path components, even in the case that a user has selected an entire directory // hierarchy or multiple files with the same name from different directories. auto name = LexicalPath::basename(file_path); auto file = TRY(Core::File::open(file_path, Core::File::OpenMode::Read)); return SelectedFile { move(name), IPC::File::adopt_file(move(file)) }; } SelectedFile::SelectedFile(ByteString name, ByteBuffer contents) : m_name(move(name)) , m_file_or_contents(move(contents)) { } SelectedFile::SelectedFile(ByteString name, IPC::File file) : m_name(move(name)) , m_file_or_contents(move(file)) { } ByteBuffer SelectedFile::take_contents() { VERIFY(m_file_or_contents.has()); return move(m_file_or_contents.get()); } } template<> ErrorOr IPC::encode(Encoder& encoder, Web::HTML::SelectedFile const& file) { TRY(encoder.encode(file.name())); TRY(encoder.encode(file.file_or_contents())); return {}; } template<> ErrorOr IPC::decode(Decoder& decoder) { auto name = TRY(decoder.decode()); auto file_or_contents = TRY((decoder.decode>())); ByteBuffer contents; if (file_or_contents.has()) { auto file = TRY(Core::File::adopt_fd(file_or_contents.get().take_fd(), Core::File::OpenMode::Read)); contents = TRY(file->read_until_eof()); } else { contents = move(file_or_contents.get()); } return Web::HTML::SelectedFile { move(name), move(contents) }; }