/* * Copyright (c) 2023, Andrew Kaster * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include namespace Core { Resource::Resource(String path, Scheme scheme, NonnullOwnPtr file, time_t modified_time) : m_path(move(path)) , m_scheme(scheme) , m_data(move(file)) , m_modified_time(modified_time) { } Resource::Resource(String path, Scheme scheme, ByteBuffer buffer, time_t modified_time) : m_path(move(path)) , m_scheme(scheme) , m_data(move(buffer)) , m_modified_time(modified_time) { } Resource::Resource(String path, Scheme scheme, DirectoryTag, time_t modified_time) : m_path(move(path)) , m_scheme(scheme) , m_data(DirectoryTag {}) , m_modified_time(modified_time) { } ErrorOr> Resource::load_from_filesystem(StringView path) { auto filepath = LexicalPath(path); if (filepath.is_absolute()) return load_from_uri(TRY(String::formatted("file://{}", path))); auto cwd = TRY(Core::System::getcwd()); return load_from_uri(TRY(String::formatted("file://{}", filepath.prepend(cwd).string()))); } ErrorOr> Resource::load_from_uri(StringView uri) { return ResourceImplementation::the().load_from_uri(uri); } String Resource::uri() const { return MUST(String::formatted("{}://{}", m_scheme == Scheme::Resource ? "resource"sv : "file"sv, m_path)); } String Resource::filesystem_path() const { return ResourceImplementation::the().filesystem_path(*this); } String Resource::file_url() const { if (m_scheme == Scheme::File) return uri(); return MUST(String::formatted("file://{}", filesystem_path())); } Optional Resource::modified_time() const { return m_modified_time; } String Resource::filename() const { return MUST(String::from_utf8(LexicalPath(m_path.bytes_as_string_view()).basename())); } Vector Resource::children() const { return ResourceImplementation::the().child_names(*this); } ByteBuffer Resource::clone_data() const { return m_data.visit( [](NonnullOwnPtr const& file) { return MUST(ByteBuffer::copy(file->bytes())); }, [](ByteBuffer const& buffer) { return buffer; }, [](DirectoryTag) -> ByteBuffer { VERIFY_NOT_REACHED(); }); } ByteBuffer Resource::release_data() && { VERIFY(!m_data.has()); if (m_data.has>()) return MUST(ByteBuffer::copy(m_data.get>()->bytes())); return move(m_data).get(); } ReadonlyBytes Resource::data() const { return m_data.visit( [](NonnullOwnPtr const& file) { return file->bytes(); }, [](ByteBuffer const& buffer) { return buffer.bytes(); }, [](DirectoryTag) -> ReadonlyBytes { VERIFY_NOT_REACHED(); }); } FixedMemoryStream Resource::stream() const { return FixedMemoryStream(data()); } }