ipc: Add support for PopIpcInterface() method.
- This can be used for domain objects as inputs to service functions.
This commit is contained in:
		
							parent
							
								
									8262aeeac8
								
							
						
					
					
						commit
						fadab1d5f3
					
				| @ -167,6 +167,7 @@ struct DomainMessageHeader { | ||||
|         struct { | ||||
|             union { | ||||
|                 BitField<0, 8, CommandType> command; | ||||
|                 BitField<8, 8, u32_le> input_object_count; | ||||
|                 BitField<16, 16, u32_le> size; | ||||
|             }; | ||||
|             u32_le object_id; | ||||
|  | ||||
| @ -298,6 +298,13 @@ public: | ||||
| 
 | ||||
|     template <typename T> | ||||
|     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 ///
 | ||||
|  | ||||
| @ -202,6 +202,16 @@ public: | ||||
|         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
 | ||||
|     /// response buffer.
 | ||||
|     void ClearIncomingObjects() { | ||||
| @ -245,6 +255,8 @@ private: | ||||
|     unsigned data_payload_offset{}; | ||||
|     unsigned buffer_c_offset{}; | ||||
|     u32_le command{}; | ||||
| 
 | ||||
|     std::vector<std::shared_ptr<SessionRequestHandler>> domain_request_handlers; | ||||
| }; | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
|  | ||||
| @ -61,6 +61,9 @@ void ServerSession::Acquire(Thread* thread) { | ||||
| ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& context) { | ||||
|     auto& domain_message_header = context.GetDomainMessageHeader(); | ||||
|     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"
 | ||||
|         const u32 object_id{context.GetDomainMessageHeader()->object_id}; | ||||
|         switch (domain_message_header->command) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei