ipc: Add support for PopIpcInterface() method.

- This can be used for domain objects as inputs to service functions.
This commit is contained in:
bunnei 2018-04-30 23:24:31 -04:00
parent 8262aeeac8
commit fadab1d5f3
4 changed files with 23 additions and 0 deletions

View file

@ -167,6 +167,7 @@ struct DomainMessageHeader {
struct { struct {
union { union {
BitField<0, 8, CommandType> command; BitField<0, 8, CommandType> command;
BitField<8, 8, u32_le> input_object_count;
BitField<16, 16, u32_le> size; BitField<16, 16, u32_le> size;
}; };
u32_le object_id; u32_le object_id;

View file

@ -298,6 +298,13 @@ public:
template <typename T> template <typename T>
Kernel::SharedPtr<T> GetCopyObject(size_t index); Kernel::SharedPtr<T> GetCopyObject(size_t index);
template <class T>
std::shared_ptr<T> PopIpcInterface() {
ASSERT(context->Session()->IsDomain());
ASSERT(context->GetDomainMessageHeader()->input_object_count > 0);
return context->GetDomainRequestHandler<T>(Pop<u32>() - 1);
}
}; };
/// Pop /// /// Pop ///

View file

@ -202,6 +202,16 @@ public:
domain_objects.emplace_back(std::move(object)); domain_objects.emplace_back(std::move(object));
} }
template <typename T>
std::shared_ptr<T> GetDomainRequestHandler(size_t index) const {
return std::static_pointer_cast<T>(domain_request_handlers[index]);
}
void SetDomainRequestHandlers(
const std::vector<std::shared_ptr<SessionRequestHandler>>& handlers) {
domain_request_handlers = handlers;
}
/// Clears the list of objects so that no lingering objects are written accidentally to the /// Clears the list of objects so that no lingering objects are written accidentally to the
/// response buffer. /// response buffer.
void ClearIncomingObjects() { void ClearIncomingObjects() {
@ -245,6 +255,8 @@ private:
unsigned data_payload_offset{}; unsigned data_payload_offset{};
unsigned buffer_c_offset{}; unsigned buffer_c_offset{};
u32_le command{}; u32_le command{};
std::vector<std::shared_ptr<SessionRequestHandler>> domain_request_handlers;
}; };
} // namespace Kernel } // namespace Kernel

View file

@ -61,6 +61,9 @@ void ServerSession::Acquire(Thread* thread) {
ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& context) { ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& context) {
auto& domain_message_header = context.GetDomainMessageHeader(); auto& domain_message_header = context.GetDomainMessageHeader();
if (domain_message_header) { if (domain_message_header) {
// Set domain handlers in HLE context, used for domain objects (IPC interfaces) as inputs
context.SetDomainRequestHandlers(domain_request_handlers);
// If there is a DomainMessageHeader, then this is CommandType "Request" // If there is a DomainMessageHeader, then this is CommandType "Request"
const u32 object_id{context.GetDomainMessageHeader()->object_id}; const u32 object_id{context.GetDomainMessageHeader()->object_id};
switch (domain_message_header->command) { switch (domain_message_header->command) {