Merge pull request #4014 from wwylele/old-service
service: remove deprecated service interface
This commit is contained in:
commit
05eb0ccb03
|
@ -28,18 +28,6 @@ inline u32* GetCommandBuffer(const int offset = 0) {
|
|||
offset);
|
||||
}
|
||||
|
||||
/// Offset into static buffers, relative to command buffer header
|
||||
static const int kStaticBuffersOffset = 0x100;
|
||||
|
||||
/**
|
||||
* Returns a pointer to the static buffers area in the current thread's TLS
|
||||
* TODO(Subv): cf. GetCommandBuffer
|
||||
* @param offset Optional offset into static buffers area (in bytes)
|
||||
* @return Pointer to static buffers area
|
||||
*/
|
||||
inline u32* GetStaticBuffers(const int offset = 0) {
|
||||
return GetCommandBuffer(kStaticBuffersOffset + offset);
|
||||
}
|
||||
} // namespace Kernel
|
||||
|
||||
namespace IPC {
|
||||
|
|
|
@ -10,8 +10,6 @@
|
|||
|
||||
namespace Service {
|
||||
|
||||
class Interface;
|
||||
|
||||
namespace FRD {
|
||||
|
||||
struct FriendKey {
|
||||
|
|
|
@ -81,42 +81,6 @@ static std::string MakeFunctionString(const char* name, const char* port_name,
|
|||
return function_string;
|
||||
}
|
||||
|
||||
Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {}
|
||||
Interface::~Interface() = default;
|
||||
|
||||
void Interface::HandleSyncRequest(SharedPtr<ServerSession> server_session) {
|
||||
// TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which
|
||||
// session triggered each command.
|
||||
|
||||
u32* cmd_buff = Kernel::GetCommandBuffer();
|
||||
auto itr = m_functions.find(cmd_buff[0]);
|
||||
|
||||
if (itr == m_functions.end() || itr->second.func == nullptr) {
|
||||
std::string function_name = (itr == m_functions.end())
|
||||
? Common::StringFromFormat("0x%08X", cmd_buff[0])
|
||||
: itr->second.name;
|
||||
LOG_ERROR(Service, "unknown / unimplemented {}",
|
||||
MakeFunctionString(function_name.c_str(), GetPortName().c_str(), cmd_buff));
|
||||
|
||||
// TODO(bunnei): Hack - ignore error
|
||||
cmd_buff[1] = 0;
|
||||
return;
|
||||
}
|
||||
LOG_TRACE(Service, "{}", MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff));
|
||||
|
||||
itr->second.func(this);
|
||||
}
|
||||
|
||||
void Interface::Register(const FunctionInfo* functions, size_t n) {
|
||||
m_functions.reserve(n);
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
// Usually this array is sorted by id already, so hint to instead at the end
|
||||
m_functions.emplace_hint(m_functions.cend(), functions[i].id, functions[i]);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ServiceFrameworkBase::ServiceFrameworkBase(const char* service_name, u32 max_sessions,
|
||||
InvokerFn* handler_invoker)
|
||||
: service_name(service_name), max_sessions(max_sessions), handler_invoker(handler_invoker) {}
|
||||
|
@ -202,24 +166,6 @@ void AddNamedPort(std::string name, SharedPtr<ClientPort> port) {
|
|||
g_kernel_named_ports.emplace(std::move(name), std::move(port));
|
||||
}
|
||||
|
||||
static void AddNamedPort(Interface* interface_) {
|
||||
SharedPtr<ServerPort> server_port;
|
||||
SharedPtr<ClientPort> client_port;
|
||||
std::tie(server_port, client_port) =
|
||||
ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName());
|
||||
|
||||
server_port->SetHleHandler(std::shared_ptr<Interface>(interface_));
|
||||
AddNamedPort(interface_->GetPortName(), std::move(client_port));
|
||||
}
|
||||
|
||||
void AddService(Interface* interface_) {
|
||||
auto server_port = Core::System::GetInstance()
|
||||
.ServiceManager()
|
||||
.RegisterService(interface_->GetPortName(), interface_->GetMaxSessions())
|
||||
.Unwrap();
|
||||
server_port->SetHleHandler(std::shared_ptr<Interface>(interface_));
|
||||
}
|
||||
|
||||
/// Initialize ServiceManager
|
||||
void Init(std::shared_ptr<SM::ServiceManager>& sm) {
|
||||
SM::ServiceManager::InstallInterfaces(sm);
|
||||
|
|
|
@ -32,87 +32,6 @@ static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 character
|
|||
/// Arbitrary default number of maximum connections to an HLE service.
|
||||
static const u32 DefaultMaxSessions = 10;
|
||||
|
||||
/**
|
||||
* Framework for implementing HLE service handlers which dispatch incoming SyncRequests based on a
|
||||
* table mapping header ids to handler functions.
|
||||
*
|
||||
* @deprecated Use ServiceFramework for new services instead. It allows services to be stateful and
|
||||
* is more extensible going forward.
|
||||
*/
|
||||
class Interface : public Kernel::SessionRequestHandler {
|
||||
public:
|
||||
/**
|
||||
* Creates an HLE interface with the specified max sessions.
|
||||
* @param max_sessions Maximum number of sessions that can be
|
||||
* connected to this service at the same time.
|
||||
*/
|
||||
Interface(u32 max_sessions = DefaultMaxSessions);
|
||||
|
||||
virtual ~Interface();
|
||||
|
||||
std::string GetName() const {
|
||||
return GetPortName();
|
||||
}
|
||||
|
||||
virtual void SetVersion(u32 raw_version) {
|
||||
version.raw = raw_version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the maximum allowed number of sessions that can be connected to this service
|
||||
* at the same time.
|
||||
* @returns The maximum number of connections allowed.
|
||||
*/
|
||||
u32 GetMaxSessions() const {
|
||||
return max_sessions;
|
||||
}
|
||||
|
||||
typedef void (*Function)(Interface*);
|
||||
|
||||
struct FunctionInfo {
|
||||
u32 id;
|
||||
Function func;
|
||||
const char* name;
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the string name used by CTROS for a service
|
||||
* @return Port name of service
|
||||
*/
|
||||
virtual std::string GetPortName() const {
|
||||
return "[UNKNOWN SERVICE PORT]";
|
||||
}
|
||||
|
||||
protected:
|
||||
void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
||||
|
||||
std::unique_ptr<SessionDataBase> MakeSessionData() const override {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the functions in the service
|
||||
*/
|
||||
template <size_t N>
|
||||
inline void Register(const FunctionInfo (&functions)[N]) {
|
||||
Register(functions, N);
|
||||
}
|
||||
|
||||
void Register(const FunctionInfo* functions, size_t n);
|
||||
|
||||
union {
|
||||
u32 raw;
|
||||
BitField<0, 8, u32> major;
|
||||
BitField<8, 8, u32> minor;
|
||||
BitField<16, 8, u32> build;
|
||||
BitField<24, 8, u32> revision;
|
||||
} version = {};
|
||||
|
||||
private:
|
||||
u32 max_sessions; ///< Maximum number of concurrent sessions that this service can handle.
|
||||
boost::container::flat_map<u32, FunctionInfo> m_functions;
|
||||
};
|
||||
|
||||
/**
|
||||
* This is an non-templated base of ServiceFramework to reduce code bloat and compilation times, it
|
||||
* is not meant to be used directly.
|
||||
|
@ -272,7 +191,5 @@ extern std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_
|
|||
|
||||
/// Adds a port to the named port table
|
||||
void AddNamedPort(std::string name, Kernel::SharedPtr<Kernel::ClientPort> port);
|
||||
/// Adds a service to the services table
|
||||
void AddService(Interface* interface_);
|
||||
|
||||
} // namespace Service
|
||||
|
|
Reference in New Issue