Kernel: Add a dedicated SetHleHandler method to ServerPort/ServerSession
This allows attaching a HLE handle to a ServerPort at any point after it is created, allowing port/session creation to be generic between HLE and regular services.
This commit is contained in:
parent
7e5dd46cf4
commit
6354d08359
11 changed files with 73 additions and 62 deletions
|
@ -84,6 +84,10 @@ File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path&
|
|||
File::~File() {}
|
||||
|
||||
void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
|
||||
using Kernel::ClientSession;
|
||||
using Kernel::ServerSession;
|
||||
using Kernel::SharedPtr;
|
||||
|
||||
u32* cmd_buff = Kernel::GetCommandBuffer();
|
||||
FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]);
|
||||
switch (cmd) {
|
||||
|
@ -162,10 +166,9 @@ void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_ses
|
|||
|
||||
case FileCommand::OpenLinkFile: {
|
||||
LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str());
|
||||
auto sessions = Kernel::ServerSession::CreateSessionPair(GetName(), shared_from_this());
|
||||
ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions));
|
||||
cmd_buff[3] = Kernel::g_handle_table
|
||||
.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions))
|
||||
auto sessions = ServerSession::CreateSessionPair(GetName());
|
||||
ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
|
||||
cmd_buff[3] = Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions))
|
||||
.ValueOr(INVALID_HANDLE);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ enum class MediaType : u32 { NAND = 0, SDMC = 1, GameCard = 2 };
|
|||
|
||||
typedef u64 ArchiveHandle;
|
||||
|
||||
class File final : public Kernel::SessionRequestHandler, public std::enable_shared_from_this<File> {
|
||||
class File final : public Kernel::SessionRequestHandler {
|
||||
public:
|
||||
File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path);
|
||||
~File();
|
||||
|
|
|
@ -20,8 +20,9 @@
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Namespace FS_User
|
||||
|
||||
using Kernel::SharedPtr;
|
||||
using Kernel::ClientSession;
|
||||
using Kernel::ServerSession;
|
||||
using Kernel::SharedPtr;
|
||||
|
||||
namespace Service {
|
||||
namespace FS {
|
||||
|
@ -79,11 +80,11 @@ static void OpenFile(Service::Interface* self) {
|
|||
rb.Push(file_res.Code());
|
||||
if (file_res.Succeeded()) {
|
||||
std::shared_ptr<File> file = *file_res;
|
||||
auto sessions = ServerSession::CreateSessionPair(file->GetName(), file);
|
||||
file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions));
|
||||
rb.PushMoveHandles(Kernel::g_handle_table
|
||||
.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions))
|
||||
.MoveFrom());
|
||||
auto sessions = ServerSession::CreateSessionPair(file->GetName());
|
||||
file->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
|
||||
|
||||
rb.PushMoveHandles(
|
||||
Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom());
|
||||
} else {
|
||||
rb.PushMoveHandles(0);
|
||||
LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str());
|
||||
|
@ -145,11 +146,11 @@ static void OpenFileDirectly(Service::Interface* self) {
|
|||
cmd_buff[1] = file_res.Code().raw;
|
||||
if (file_res.Succeeded()) {
|
||||
std::shared_ptr<File> file = *file_res;
|
||||
auto sessions = ServerSession::CreateSessionPair(file->GetName(), file);
|
||||
file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions));
|
||||
cmd_buff[3] = Kernel::g_handle_table
|
||||
.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions))
|
||||
.MoveFrom();
|
||||
auto sessions = ServerSession::CreateSessionPair(file->GetName());
|
||||
file->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
|
||||
|
||||
cmd_buff[3] =
|
||||
Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom();
|
||||
} else {
|
||||
cmd_buff[3] = 0;
|
||||
LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u",
|
||||
|
@ -412,11 +413,11 @@ static void OpenDirectory(Service::Interface* self) {
|
|||
cmd_buff[1] = dir_res.Code().raw;
|
||||
if (dir_res.Succeeded()) {
|
||||
std::shared_ptr<Directory> directory = *dir_res;
|
||||
auto sessions = ServerSession::CreateSessionPair(directory->GetName(), directory);
|
||||
directory->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions));
|
||||
cmd_buff[3] = Kernel::g_handle_table
|
||||
.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions))
|
||||
.MoveFrom();
|
||||
auto sessions = ServerSession::CreateSessionPair(directory->GetName());
|
||||
directory->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
|
||||
|
||||
cmd_buff[3] =
|
||||
Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom();
|
||||
} else {
|
||||
LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s",
|
||||
dirname_type, dirname_size, dir_path.DebugStr().c_str());
|
||||
|
|
|
@ -105,18 +105,22 @@ void Interface::Register(const FunctionInfo* functions, size_t n) {
|
|||
// Module interface
|
||||
|
||||
static void AddNamedPort(Interface* interface_) {
|
||||
auto ports =
|
||||
Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(),
|
||||
std::shared_ptr<Interface>(interface_));
|
||||
auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports);
|
||||
Kernel::SharedPtr<Kernel::ServerPort> server_port;
|
||||
Kernel::SharedPtr<Kernel::ClientPort> client_port;
|
||||
std::tie(server_port, client_port) =
|
||||
Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName());
|
||||
|
||||
server_port->SetHleHandler(std::shared_ptr<Interface>(interface_));
|
||||
g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port));
|
||||
}
|
||||
|
||||
void AddService(Interface* interface_) {
|
||||
auto ports =
|
||||
Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(),
|
||||
std::shared_ptr<Interface>(interface_));
|
||||
auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports);
|
||||
Kernel::SharedPtr<Kernel::ServerPort> server_port;
|
||||
Kernel::SharedPtr<Kernel::ClientPort> client_port;
|
||||
std::tie(server_port, client_port) =
|
||||
Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName());
|
||||
|
||||
server_port->SetHleHandler(std::shared_ptr<Interface>(interface_));
|
||||
g_srv_services.emplace(interface_->GetPortName(), std::move(client_port));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue