diff options
Diffstat (limited to 'src/core/hle/kernel/k_client_port.cpp')
-rw-r--r-- | src/core/hle/kernel/k_client_port.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_client_port.cpp b/src/core/hle/kernel/k_client_port.cpp new file mode 100644 index 000000000..15bf0d4fc --- /dev/null +++ b/src/core/hle/kernel/k_client_port.cpp @@ -0,0 +1,58 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/kernel/hle_ipc.h" +#include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_session.h" +#include "core/hle/kernel/object.h" +#include "core/hle/kernel/server_port.h" +#include "core/hle/kernel/svc_results.h" + +namespace Kernel { + +KClientPort::KClientPort(KernelCore& kernel) : KSynchronizationObject{kernel} {} +KClientPort::~KClientPort() = default; + +void KClientPort::Initialize(s32 max_sessions_, std::string&& name_) { + max_sessions = max_sessions_; + name = std::move(name_); +} + +std::shared_ptr<ServerPort> KClientPort::GetServerPort() const { + return server_port; +} + +ResultVal<KClientSession*> KClientPort::Connect() { + if (num_sessions >= max_sessions) { + return ResultOutOfSessions; + } + num_sessions++; + + auto* session = Kernel::KSession::Create(kernel); + session->Initialize(name + ":ClientPort"); + + if (server_port->HasHLEHandler()) { + server_port->GetHLEHandler()->ClientConnected(session); + } else { + server_port->AppendPendingSession(std::addressof(session->GetServerSession())); + } + + return MakeResult(std::addressof(session->GetClientSession())); +} + +void KClientPort::ConnectionClosed() { + if (num_sessions == 0) { + return; + } + + --num_sessions; +} + +void KClientPort::Destroy() {} + +bool KClientPort::IsSignaled() const { + return num_sessions < max_sessions; +} + +} // namespace Kernel |