Index: obsolete/breakpad/common/mac/MachIPC.h |
diff --git a/obsolete/breakpad/common/mac/MachIPC.h b/obsolete/breakpad/common/mac/MachIPC.h |
deleted file mode 100644 |
index 89924123f6271a5a2387c92f02ada60c0d37bbb0..0000000000000000000000000000000000000000 |
--- a/obsolete/breakpad/common/mac/MachIPC.h |
+++ /dev/null |
@@ -1,304 +0,0 @@ |
-// Copyright (c) 2007, Google Inc. |
-// All rights reserved. |
-// |
-// Redistribution and use in source and binary forms, with or without |
-// modification, are permitted provided that the following conditions are |
-// met: |
-// |
-// * Redistributions of source code must retain the above copyright |
-// notice, this list of conditions and the following disclaimer. |
-// * Redistributions in binary form must reproduce the above |
-// copyright notice, this list of conditions and the following disclaimer |
-// in the documentation and/or other materials provided with the |
-// distribution. |
-// * Neither the name of Google Inc. nor the names of its |
-// contributors may be used to endorse or promote products derived from |
-// this software without specific prior written permission. |
-// |
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-// |
-// MachIPC.h |
-// |
-// Some helpful wrappers for using Mach IPC calls |
- |
-#ifndef MACH_IPC_H__ |
-#define MACH_IPC_H__ |
- |
-#import <mach/mach.h> |
-#import <mach/message.h> |
-#import <servers/bootstrap.h> |
-#import <sys/types.h> |
- |
-#import <CoreServices/CoreServices.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); |
-// |
-// kern_return_t result = sender.SendMessage(message, 1000); // timeout 1000ms |
-// |
- |
-#define PRINT_MACH_RESULT(result_, message_) \ |
- printf(message_" %s (%d)\n", mach_error_string(result_), result_ ); |
- |
-//============================================================================== |
-// 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_COPY_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; |
- } |
- |
- // We're just a simple wrapper for mach_msg_port_descriptor_t |
- // and have the same memory layout |
- operator mach_msg_port_descriptor_t&() { |
- return *this; |
- } |
- |
- // 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. |
-// |
-// Currently the combined size of the descriptors plus data must be |
-// less than 1024. But as a benefit no memory allocation is necessary. |
-// |
-// TODO: could consider adding malloc() support for very large messages |
-// |
-// A MachMessage object is used by ReceivePort::WaitForMessage |
-// and MachPortSender::SendMessage |
-// |
-class MachMessage { |
- public: |
- |
- // The receiver of the message can retrieve the raw data this way |
- u_int8_t *GetData() { |
- return GetDataLength() > 0 ? GetDataPacket()->data : NULL; |
- } |
- |
- u_int32_t GetDataLength() { |
- 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() { 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 body.msgh_descriptor_count; } |
- MachMsgPortDescriptor *GetDescriptor(int n); |
- |
- // Convenience method which gets the mach port described by the descriptor |
- mach_port_t GetTranslatedPort(int n); |
- |
- // 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(void *data, int32_t data_length); |
- |
- protected: |
- // Consider this an abstract base class - must create an actual instance |
- // of MachReceiveMessage or MachSendMessage |
- |
- MachMessage() { |
- memset(this, 0, sizeof(MachMessage)); |
- } |
- |
- 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 sizeof(MachMessage) |
- }; |
- |
- MessageDataPacket* GetDataPacket(); |
- |
- 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(); |
- |
- mach_msg_header_t head; |
- mach_msg_body_t body; |
- u_int8_t padding[1024]; // descriptors and data may be embedded here |
-}; |
- |
-//============================================================================== |
-// 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() {}; |
-}; |
- |
-//============================================================================== |
-class MachSendMessage : public MachMessage { |
- public: |
- MachSendMessage(int32_t message_id); |
-}; |
- |
-//============================================================================== |
-// Represents a mach port for which we have receive rights |
-class ReceivePort { |
- public: |
- // Creates a new mach port for receiving messages and registers a name for it |
- 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. |
- 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 |
- 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: |
- ReceivePort(const ReceivePort&); // disable copy c-tor |
- |
- mach_port_t port_; |
- kern_return_t init_result_; |
-}; |
- |
-//============================================================================== |
-// Represents a mach port for which we have send rights |
-class MachPortSender { |
- public: |
- // get a port with send rights corresponding to a named registered service |
- MachPortSender(const char *receive_port_name); |
- |
- |
- // Given an already existing mach port, use it. |
- MachPortSender(mach_port_t send_port); |
- |
- kern_return_t SendMessage(MachSendMessage &message, |
- mach_msg_timeout_t timeout); |
- |
- private: |
- MachPortSender(const MachPortSender&); // disable copy c-tor |
- |
- mach_port_t send_port_; |
- kern_return_t init_result_; |
-}; |
- |
-#endif // MACH_IPC_H__ |