/* * Copyright (c) 2023, the SerenityOS developers. * Copyright (c) 2023, David Ganz * * SPDX-License-Identifier: BSD-2-Clause */ #include "EventManager.h" #include #include #include namespace Calendar { static constexpr StringView DATE_FORMAT = "%Y-%m-%dT%H:%M:%S"sv; EventManager::EventManager() { } OwnPtr EventManager::create() { return adopt_own(*new EventManager()); } void EventManager::add_event(Event event) { m_events.append(move(event)); m_dirty = true; on_events_change(); } void EventManager::set_events(Vector events) { m_events = move(events); m_dirty = true; on_events_change(); } ErrorOr EventManager::save(FileSystemAccessClient::File& file) { set_filename(file.filename()); auto stream = file.release_stream(); auto json = TRY(serialize_events()); TRY(stream->write_some(json.to_byte_string().bytes())); stream->close(); m_dirty = false; return {}; } ErrorOr EventManager::serialize_events() { JsonArray result; for (auto const& event : m_events) { JsonObject object; object.set("start", JsonValue(event.start.to_byte_string(DATE_FORMAT))); object.set("end", JsonValue(event.end.to_byte_string(DATE_FORMAT))); object.set("summary", JsonValue(event.summary)); TRY(result.append(object)); } return result; } ErrorOr> EventManager::deserialize_events(JsonArray const& json) { Vector result; for (auto const& value : json.values()) { auto const& object = value.as_object(); if (!object.has("summary"sv) || !object.has("start"sv) || !object.has("end"sv)) continue; auto summary = TRY(String::from_byte_string(object.get("summary"sv).release_value().as_string())); auto start = Core::DateTime::parse(DATE_FORMAT, object.get("start"sv).release_value().as_string()); if (!start.has_value()) continue; auto end = Core::DateTime::parse(DATE_FORMAT, object.get("end"sv).release_value().as_string()); if (!end.has_value()) continue; Event event = { .summary = summary, .start = start.release_value(), .end = end.release_value(), }; result.append(event); } return result; } ErrorOr EventManager::load_file(FileSystemAccessClient::File& file) { set_filename(file.filename()); auto content = TRY(file.stream().read_until_eof()); auto json = TRY(AK::JsonParser(content).parse()); auto events = TRY(deserialize_events(json.as_array())); set_events(events); m_dirty = false; return {}; } }