// Copyright 2014 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #include #include "common/common_types.h" #include "core/hle/kernel/session.h" #include "core/hle/result.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // Namespace Service namespace Service { static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters) /// Interface to a CTROS service class Interface : public Kernel::ServerPort { // TODO(yuriks): An "Interface" being a Kernel::Object is mostly non-sense. Interface should be // just something that encapsulates a session and acts as a helper to implement service // processes. public: typedef void (*Function)(Interface*); struct FunctionInfo { u32 id; Function func; const char* name; }; ResultVal SyncRequest() override; bool IsHLE() const override { return true; } protected: /** * Registers the functions in the service */ template inline void Register(const FunctionInfo (&functions)[N]) { Register(functions, N); } void Register(const FunctionInfo* functions, size_t n); private: boost::container::flat_map m_functions; }; /// Initialize ServiceManager void Init(); /// Shutdown ServiceManager void Shutdown(); /// Map of named ports managed by the kernel, which can be retrieved using the ConnectToPort SVC. extern std::unordered_map> g_kernel_named_ports; /// Map of services registered with the "srv:" service, retrieved using GetServiceHandle. extern std::unordered_map> g_srv_services; /// Adds a service to the services table void AddService(Kernel::ServerPort* interface_); } // namespace