Index: base/mach_ipc_mac.h |
diff --git a/base/mach_ipc_mac.h b/base/mach_ipc_mac.h |
deleted file mode 100644 |
index 7f5f7d6e919fb0a5086b34c7341d7e8c1ce93e78..0000000000000000000000000000000000000000 |
--- a/base/mach_ipc_mac.h |
+++ /dev/null |
@@ -1,328 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef BASE_MACH_IPC_MAC_H_ |
-#define BASE_MACH_IPC_MAC_H_ |
- |
-#include <mach/mach.h> |
-#include <mach/message.h> |
-#include <servers/bootstrap.h> |
-#include <sys/types.h> |
- |
-#include <CoreServices/CoreServices.h> |
- |
-#include "base/base_export.h" |
-#include "base/basictypes.h" |
- |
-//============================================================================== |
-// DISCUSSION: |
-// |
-// The three main classes of interest are |
-// |
-// MachMessage: a wrapper for a Mach message of the following form |
-// mach_msg_header_t |
-// mach_msg_body_t |
-// optional descriptors |
-// optional extra message data |
-// |
-// MachReceiveMessage and MachSendMessage subclass MachMessage |
-// and are used instead of MachMessage which is an abstract base class |
-// |
-// ReceivePort: |
-// Represents a Mach port for which we have receive rights |
-// |
-// MachPortSender: |
-// Represents a Mach port for which we have send rights |
-// |
-// Here's an example to receive a message on a server port: |
-// |
-// // This creates our named server port |
-// ReceivePort receivePort("com.Google.MyService"); |
-// |
-// MachReceiveMessage message; |
-// kern_return_t result = receivePort.WaitForMessage(&message, 0); |
-// |
-// if (result == KERN_SUCCESS && message.GetMessageID() == 57) { |
-// mach_port_t task = message.GetTranslatedPort(0); |
-// mach_port_t thread = message.GetTranslatedPort(1); |
-// |
-// char *messageString = message.GetData(); |
-// |
-// printf("message string = %s\n", messageString); |
-// } |
-// |
-// Here is an example of using these classes to send a message to this port: |
-// |
-// // send to already named port |
-// MachPortSender sender("com.Google.MyService"); |
-// MachSendMessage message(57); // our message ID is 57 |
-// |
-// // add some ports to be translated for us |
-// message.AddDescriptor(mach_task_self()); // our task |
-// message.AddDescriptor(mach_thread_self()); // this thread |
-// |
-// char messageString[] = "Hello server!\n"; |
-// message.SetData(messageString, strlen(messageString)+1); |
-// // timeout 1000ms |
-// kern_return_t result = sender.SendMessage(message, 1000); |
-// |
- |
-#define PRINT_MACH_RESULT(result_, message_) \ |
- printf(message_" %s (%d)\n", mach_error_string(result_), result_ ); |
- |
-namespace base { |
- |
-//============================================================================== |
-// A wrapper class for mach_msg_port_descriptor_t (with same memory layout) |
-// with convenient constructors and accessors |
-class MachMsgPortDescriptor : public mach_msg_port_descriptor_t { |
- public: |
- // General-purpose constructor |
- MachMsgPortDescriptor(mach_port_t in_name, |
- mach_msg_type_name_t in_disposition) { |
- name = in_name; |
- pad1 = 0; |
- pad2 = 0; |
- disposition = in_disposition; |
- type = MACH_MSG_PORT_DESCRIPTOR; |
- } |
- |
- // For passing send rights to a port |
- MachMsgPortDescriptor(mach_port_t in_name) { |
- name = in_name; |
- pad1 = 0; |
- pad2 = 0; |
- disposition = MACH_MSG_TYPE_PORT_SEND; |
- type = MACH_MSG_PORT_DESCRIPTOR; |
- } |
- |
- // Copy constructor |
- MachMsgPortDescriptor(const MachMsgPortDescriptor& desc) { |
- name = desc.name; |
- pad1 = desc.pad1; |
- pad2 = desc.pad2; |
- disposition = desc.disposition; |
- type = desc.type; |
- } |
- |
- mach_port_t GetMachPort() const { |
- return name; |
- } |
- |
- mach_msg_type_name_t GetDisposition() const { |
- return disposition; |
- } |
- |
- // For convenience |
- operator mach_port_t() const { |
- return GetMachPort(); |
- } |
-}; |
- |
-//============================================================================== |
-// MachMessage: a wrapper for a Mach message |
-// (mach_msg_header_t, mach_msg_body_t, extra data) |
-// |
-// This considerably simplifies the construction of a message for sending |
-// and the getting at relevant data and descriptors for the receiver. |
-// |
-// This class can be initialized using external storage of an arbitrary size |
-// or it can manage storage internally. |
-// 1. If storage is allocated internally, the combined size of the descriptors |
-// plus data must be less than 1024. But as a benefit no memory allocation is |
-// necessary. |
-// 2. For external storage, a buffer of at least EmptyMessageSize() must be |
-// provided. |
-// |
-// A MachMessage object is used by ReceivePort::WaitForMessage |
-// and MachPortSender::SendMessage |
-// |
-class BASE_EXPORT MachMessage { |
- public: |
- static const size_t kEmptyMessageSize; |
- |
- virtual ~MachMessage(); |
- |
- // The receiver of the message can retrieve the raw data this way |
- u_int8_t *GetData() const { |
- return GetDataLength() > 0 ? GetDataPacket()->data : NULL; |
- } |
- |
- u_int32_t GetDataLength() const { |
- return EndianU32_LtoN(GetDataPacket()->data_length); |
- } |
- |
- // The message ID may be used as a code identifying the type of message |
- void SetMessageID(int32_t message_id) { |
- GetDataPacket()->id = EndianU32_NtoL(message_id); |
- } |
- |
- int32_t GetMessageID() const { return EndianU32_LtoN(GetDataPacket()->id); } |
- |
- // Adds a descriptor (typically a Mach port) to be translated |
- // returns true if successful, otherwise not enough space |
- bool AddDescriptor(const MachMsgPortDescriptor &desc); |
- |
- int GetDescriptorCount() const { |
- return storage_->body.msgh_descriptor_count; |
- } |
- |
- MachMsgPortDescriptor *GetDescriptor(int n) const; |
- |
- // Convenience method which gets the Mach port described by the descriptor |
- mach_port_t GetTranslatedPort(int n) const; |
- |
- // A simple message is one with no descriptors |
- bool IsSimpleMessage() const { return GetDescriptorCount() == 0; } |
- |
- // Sets raw data for the message (returns false if not enough space) |
- bool SetData(const void* data, int32_t data_length); |
- |
- protected: |
- // Consider this an abstract base class - must create an actual instance |
- // of MachReceiveMessage or MachSendMessage |
- MachMessage(); |
- |
- // Constructor for use with preallocate storage. |
- // storage_length must be >= EmptyMessageSize() |
- MachMessage(void *storage, size_t storage_length); |
- |
- friend class ReceivePort; |
- friend class MachPortSender; |
- |
- // Represents raw data in our message |
- struct MessageDataPacket { |
- int32_t id; // little-endian |
- int32_t data_length; // little-endian |
- u_int8_t data[1]; // actual size limited by storage_length_bytes_ |
- }; |
- |
- MessageDataPacket* GetDataPacket() const; |
- |
- void SetDescriptorCount(int n); |
- void SetDescriptor(int n, const MachMsgPortDescriptor &desc); |
- |
- // Returns total message size setting msgh_size in the header to this value |
- int CalculateSize(); |
- |
- // Returns total storage size that this object can grow to, this is inclusive |
- // of the Mach header. |
- size_t MaxSize() const { return storage_length_bytes_; } |
- |
- mach_msg_header_t *Head() const { return &(storage_->head); } |
- |
- private: |
- struct MachMessageData { |
- mach_msg_header_t head; |
- mach_msg_body_t body; |
- // descriptors and data may be embedded here. |
- u_int8_t padding[1024]; |
- }; |
- |
- MachMessageData *storage_; |
- size_t storage_length_bytes_; |
- bool own_storage_; // Is storage owned by this object? |
-}; |
- |
-//============================================================================== |
-// MachReceiveMessage and MachSendMessage are useful to separate the idea |
-// of a Mach message being sent and being received, and adds increased type |
-// safety: |
-// ReceivePort::WaitForMessage() only accepts a MachReceiveMessage |
-// MachPortSender::SendMessage() only accepts a MachSendMessage |
- |
-//============================================================================== |
-class MachReceiveMessage : public MachMessage { |
- public: |
- MachReceiveMessage() : MachMessage() {} |
- MachReceiveMessage(void *storage, size_t storage_length) |
- : MachMessage(storage, storage_length) {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MachReceiveMessage); |
-}; |
- |
-//============================================================================== |
-class BASE_EXPORT MachSendMessage : public MachMessage { |
- public: |
- explicit MachSendMessage(int32_t message_id); |
- MachSendMessage(void *storage, size_t storage_length, int32_t message_id); |
- |
- private: |
- void Initialize(int32_t message_id); |
- |
- DISALLOW_COPY_AND_ASSIGN(MachSendMessage); |
-}; |
- |
-//============================================================================== |
-// Represents a Mach port for which we have receive rights |
-class BASE_EXPORT ReceivePort { |
- public: |
- // Creates a new Mach port for receiving messages and registers a name for it |
- explicit ReceivePort(const char *receive_port_name); |
- |
- // Given an already existing Mach port, use it. We take ownership of the |
- // port and deallocate it in our destructor. |
- explicit ReceivePort(mach_port_t receive_port); |
- |
- // Create a new Mach port for receiving messages |
- ReceivePort(); |
- |
- ~ReceivePort(); |
- |
- // Waits on the Mach port until message received or timeout. If |timeout| is |
- // MACH_MSG_TIMEOUT_NONE, this method waits forever. |
- kern_return_t WaitForMessage(MachReceiveMessage *out_message, |
- mach_msg_timeout_t timeout); |
- |
- // The underlying Mach port that we wrap |
- mach_port_t GetPort() const { return port_; } |
- |
- private: |
- mach_port_t port_; |
- kern_return_t init_result_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ReceivePort); |
-}; |
- |
-//============================================================================== |
-// Represents a Mach port for which we have send rights |
-class BASE_EXPORT MachPortSender { |
- public: |
- // get a port with send rights corresponding to a named registered service |
- explicit MachPortSender(const char *receive_port_name); |
- |
- |
- // Given an already existing Mach port, use it. Does not take ownership of |
- // |send_port|. |
- explicit MachPortSender(mach_port_t send_port); |
- |
- kern_return_t SendMessage(const MachSendMessage& message, |
- mach_msg_timeout_t timeout); |
- |
- mach_port_t GetPort() const { return send_port_; } |
- |
- private: |
- mach_port_t send_port_; |
- kern_return_t init_result_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MachPortSender); |
-}; |
- |
-//============================================================================== |
-// Static utility functions. |
- |
-namespace mac { |
- |
-// Returns the number of Mach ports to which the given task has a right. |
-// Note that unless the calling task has send rights to the passed task port, |
-// this will fail unless the calling task is running as root. |
-kern_return_t BASE_EXPORT GetNumberOfMachPorts(mach_port_t task_port, |
- int* port_count); |
- |
-} // namespace mac |
- |
-} // namespace base |
- |
-#endif // BASE_MACH_IPC_MAC_H_ |