mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #2756 from yuriks/service-framework
New service framework
This commit is contained in:
		@@ -21,4 +21,6 @@ void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_s
 | 
			
		||||
    boost::range::remove_erase(connected_sessions, server_session);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HLERequestContext::~HLERequestContext() = default;
 | 
			
		||||
 | 
			
		||||
} // namespace Kernel
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,14 @@
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/kernel/server_session.h"
 | 
			
		||||
 | 
			
		||||
namespace Service {
 | 
			
		||||
class ServiceFrameworkBase;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Kernel {
 | 
			
		||||
 | 
			
		||||
class ServerSession;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Interface implemented by HLE Session handlers.
 | 
			
		||||
 * This can be provided to a ServerSession in order to hook into several relevant events
 | 
			
		||||
@@ -19,6 +22,8 @@ class ServerSession;
 | 
			
		||||
 */
 | 
			
		||||
class SessionRequestHandler : public std::enable_shared_from_this<SessionRequestHandler> {
 | 
			
		||||
public:
 | 
			
		||||
    virtual ~SessionRequestHandler() = default;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles a sync request from the emulated application.
 | 
			
		||||
     * @param server_session The ServerSession that was triggered for this sync request,
 | 
			
		||||
@@ -27,27 +32,56 @@ public:
 | 
			
		||||
     * this request (ServerSession, Originator thread, Translated command buffer, etc).
 | 
			
		||||
     * @returns ResultCode the result code of the translate operation.
 | 
			
		||||
     */
 | 
			
		||||
    virtual void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
 | 
			
		||||
    virtual void HandleSyncRequest(SharedPtr<ServerSession> server_session) = 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Signals that a client has just connected to this HLE handler and keeps the
 | 
			
		||||
     * associated ServerSession alive for the duration of the connection.
 | 
			
		||||
     * @param server_session Owning pointer to the ServerSession associated with the connection.
 | 
			
		||||
     */
 | 
			
		||||
    void ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
 | 
			
		||||
    void ClientConnected(SharedPtr<ServerSession> server_session);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Signals that a client has just disconnected from this HLE handler and releases the
 | 
			
		||||
     * associated ServerSession.
 | 
			
		||||
     * @param server_session ServerSession associated with the connection.
 | 
			
		||||
     */
 | 
			
		||||
    void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
 | 
			
		||||
    void ClientDisconnected(SharedPtr<ServerSession> server_session);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    /// List of sessions that are connected to this handler.
 | 
			
		||||
    /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list
 | 
			
		||||
    // for the duration of the connection.
 | 
			
		||||
    std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions;
 | 
			
		||||
    std::vector<SharedPtr<ServerSession>> connected_sessions;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class containing information about an in-flight IPC request being handled by an HLE service
 | 
			
		||||
 * implementation. Services should avoid using old global APIs (e.g. Kernel::GetCommandBuffer()) and
 | 
			
		||||
 * when possible use the APIs in this class to service the request.
 | 
			
		||||
 */
 | 
			
		||||
class HLERequestContext {
 | 
			
		||||
public:
 | 
			
		||||
    ~HLERequestContext();
 | 
			
		||||
 | 
			
		||||
    /// Returns a pointer to the IPC command buffer for this request.
 | 
			
		||||
    u32* CommandBuffer() const {
 | 
			
		||||
        return cmd_buf;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the session through which this request was made. This can be used as a map key to
 | 
			
		||||
     * access per-client data on services.
 | 
			
		||||
     */
 | 
			
		||||
    SharedPtr<ServerSession> Session() const {
 | 
			
		||||
        return session;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    friend class Service::ServiceFrameworkBase;
 | 
			
		||||
 | 
			
		||||
    u32* cmd_buf = nullptr;
 | 
			
		||||
    SharedPtr<ServerSession> session;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Kernel
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user