1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SANDBOX_MAC_XPC_MESSAGE_SERVER_H_ 6 #define SANDBOX_MAC_XPC_MESSAGE_SERVER_H_ 7 8 #include "base/mac/scoped_mach_port.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "sandbox/mac/message_server.h" 11 #include "sandbox/mac/xpc.h" 12 #include "sandbox/sandbox_export.h" 13 14 namespace sandbox { 15 16 class DispatchSourceMach; 17 18 // An implementation of MessageServer that uses XPC pipes to read and write XPC 19 // messages from a Mach port. 20 class SANDBOX_EXPORT XPCMessageServer : public MessageServer { 21 public: 22 // Creates a new XPC message server that will send messages to |demuxer| 23 // for handling. If the |server_receive_right| is non-NULL, this class will 24 // take ownership of the port and it will be used to receive messages. 25 // Otherwise the server will create a new receive right on which to listen. 26 XPCMessageServer(MessageDemuxer* demuxer, 27 mach_port_t server_receive_right); 28 virtual ~XPCMessageServer(); 29 30 // MessageServer: 31 virtual bool Initialize() OVERRIDE; 32 virtual pid_t GetMessageSenderPID(IPCMessage request) OVERRIDE; 33 virtual IPCMessage CreateReply(IPCMessage request) OVERRIDE; 34 virtual bool SendReply(IPCMessage reply) OVERRIDE; 35 virtual void ForwardMessage(IPCMessage request, 36 mach_port_t destination) OVERRIDE; 37 // Creates an error reply message with a field "error" set to |error_code|. 38 virtual void RejectMessage(IPCMessage request, int error_code) OVERRIDE; 39 virtual mach_port_t GetServerPort() const OVERRIDE; 40 41 private: 42 // Reads a message from the XPC pipe. 43 void ReceiveMessage(); 44 45 // The demuxer delegate. Weak. 46 MessageDemuxer* demuxer_; 47 48 // The Mach port on which the server is receiving requests. 49 base::mac::ScopedMachReceiveRight server_port_; 50 51 // MACH_RECV dispatch source that handles the |server_port_|. 52 scoped_ptr<DispatchSourceMach> dispatch_source_; 53 54 // The reply message, if one has been created. 55 xpc_object_t reply_message_; 56 57 DISALLOW_COPY_AND_ASSIGN(XPCMessageServer); 58 }; 59 60 } // namespace sandbox 61 62 #endif // SANDBOX_MAC_XPC_MESSAGE_SERVER_H_ 63