// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include "core/hle/service/event.h" #include "core/hle/service/kernel_helpers.h" union Result; namespace Service::AM { struct Applet; class IStorage; class AppletStorageChannel { public: explicit AppletStorageChannel(KernelHelpers::ServiceContext& ctx); ~AppletStorageChannel(); void Push(std::shared_ptr storage); Result Pop(std::shared_ptr* out_storage); Kernel::KReadableEvent* GetEvent(); private: std::mutex m_lock{}; std::deque> m_data{}; Event m_event; }; class AppletDataBroker { public: explicit AppletDataBroker(Core::System& system_); ~AppletDataBroker(); AppletStorageChannel& GetInData() { return in_data; } AppletStorageChannel& GetInteractiveInData() { return interactive_in_data; } AppletStorageChannel& GetOutData() { return out_data; } AppletStorageChannel& GetInteractiveOutData() { return interactive_out_data; } Event& GetStateChangedEvent() { return state_changed_event; } bool IsCompleted() const { return is_completed; } void SignalCompletion(); private: Core::System& system; KernelHelpers::ServiceContext context; AppletStorageChannel in_data; AppletStorageChannel interactive_in_data; AppletStorageChannel out_data; AppletStorageChannel interactive_out_data; Event state_changed_event; std::mutex lock; bool is_completed; }; } // namespace Service::AM