Index: ipc/ipc_message.h |
diff --git a/ipc/ipc_message.h b/ipc/ipc_message.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6357c0bc3175c899edfe94590fd311ba5144e815 |
--- /dev/null |
+++ b/ipc/ipc_message.h |
@@ -0,0 +1,279 @@ |
+// Copyright (c) 2006-2008 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 IPC_IPC_MESSAGE_H__ |
+#define IPC_IPC_MESSAGE_H__ |
+ |
+#include <string> |
+ |
+#include "base/basictypes.h" |
+#include "base/pickle.h" |
+ |
+#ifndef NDEBUG |
+#define IPC_MESSAGE_LOG_ENABLED |
+#endif |
+ |
+#if defined(OS_POSIX) |
+#include "base/ref_counted.h" |
+#endif |
+ |
+namespace base { |
+class FileDescriptor; |
+} |
+ |
+class FileDescriptorSet; |
+ |
+namespace IPC { |
+ |
+//------------------------------------------------------------------------------ |
+ |
+class Channel; |
+class Message; |
+struct LogData; |
+ |
+class Message : public Pickle { |
+ public: |
+ // Implemented by objects that can send IPC messages across a channel. |
+ class Sender { |
+ public: |
+ virtual ~Sender() {} |
+ |
+ // Sends the given IPC message. The implementor takes ownership of the |
+ // given Message regardless of whether or not this method succeeds. This |
+ // is done to make this method easier to use. Returns true on success and |
+ // false otherwise. |
+ virtual bool Send(Message* msg) = 0; |
+ }; |
+ |
+ enum PriorityValue { |
+ PRIORITY_LOW = 1, |
+ PRIORITY_NORMAL, |
+ PRIORITY_HIGH |
+ }; |
+ |
+ virtual ~Message(); |
+ |
+ Message(); |
+ |
+ // Initialize a message with a user-defined type, priority value, and |
+ // destination WebView ID. |
+ Message(int32 routing_id, uint16 type, PriorityValue priority); |
+ |
+ // Initializes a message from a const block of data. The data is not copied; |
+ // instead the data is merely referenced by this message. Only const methods |
+ // should be used on the message when initialized this way. |
+ Message(const char* data, int data_len); |
+ |
+ Message(const Message& other); |
+ Message& operator=(const Message& other); |
+ |
+ PriorityValue priority() const { |
+ return static_cast<PriorityValue>(header()->flags & PRIORITY_MASK); |
+ } |
+ |
+ // True if this is a synchronous message. |
+ bool is_sync() const { |
+ return (header()->flags & SYNC_BIT) != 0; |
+ } |
+ |
+ // Set this on a reply to a synchronous message. |
+ void set_reply() { |
+ header()->flags |= REPLY_BIT; |
+ } |
+ |
+ bool is_reply() const { |
+ return (header()->flags & REPLY_BIT) != 0; |
+ } |
+ |
+ // Set this on a reply to a synchronous message to indicate that no receiver |
+ // was found. |
+ void set_reply_error() { |
+ header()->flags |= REPLY_ERROR_BIT; |
+ } |
+ |
+ bool is_reply_error() const { |
+ return (header()->flags & REPLY_ERROR_BIT) != 0; |
+ } |
+ |
+ // Normally when a receiver gets a message and they're blocked on a |
+ // synchronous message Send, they buffer a message. Setting this flag causes |
+ // the receiver to be unblocked and the message to be dispatched immediately. |
+ void set_unblock(bool unblock) { |
+ if (unblock) { |
+ header()->flags |= UNBLOCK_BIT; |
+ } else { |
+ header()->flags &= ~UNBLOCK_BIT; |
+ } |
+ } |
+ |
+ bool should_unblock() const { |
+ return (header()->flags & UNBLOCK_BIT) != 0; |
+ } |
+ |
+ // Tells the receiver that the caller is pumping messages while waiting |
+ // for the result. |
+ bool is_caller_pumping_messages() const { |
+ return (header()->flags & PUMPING_MSGS_BIT) != 0; |
+ } |
+ |
+ uint16 type() const { |
+ return header()->type; |
+ } |
+ |
+ int32 routing_id() const { |
+ return header()->routing; |
+ } |
+ |
+ void set_routing_id(int32 new_id) { |
+ header()->routing = new_id; |
+ } |
+ |
+ template<class T> |
+ static bool Dispatch(const Message* msg, T* obj, void (T::*func)()) { |
+ (obj->*func)(); |
+ return true; |
+ } |
+ |
+ template<class T> |
+ static bool Dispatch(const Message* msg, T* obj, void (T::*func)() const) { |
+ (obj->*func)(); |
+ return true; |
+ } |
+ |
+ template<class T> |
+ static bool Dispatch(const Message* msg, T* obj, |
+ void (T::*func)(const Message&)) { |
+ (obj->*func)(*msg); |
+ return true; |
+ } |
+ |
+ template<class T> |
+ static bool Dispatch(const Message* msg, T* obj, |
+ void (T::*func)(const Message&) const) { |
+ (obj->*func)(*msg); |
+ return true; |
+ } |
+ |
+ // Used for async messages with no parameters. |
+ static void Log(const Message* msg, std::wstring* l) { |
+ } |
+ |
+ // Find the end of the message data that starts at range_start. Returns NULL |
+ // if the entire message is not found in the given data range. |
+ static const char* FindNext(const char* range_start, const char* range_end) { |
+ return Pickle::FindNext(sizeof(Header), range_start, range_end); |
+ } |
+ |
+#if defined(OS_POSIX) |
+ // On POSIX, a message supports reading / writing FileDescriptor objects. |
+ // This is used to pass a file descriptor to the peer of an IPC channel. |
+ |
+ // Add a descriptor to the end of the set. Returns false iff the set is full. |
+ bool WriteFileDescriptor(const base::FileDescriptor& descriptor); |
+ // Get a file descriptor from the message. Returns false on error. |
+ // iter: a Pickle iterator to the current location in the message. |
+ bool ReadFileDescriptor(void** iter, base::FileDescriptor* descriptor) const; |
+#endif |
+ |
+#ifdef IPC_MESSAGE_LOG_ENABLED |
+ // Adds the outgoing time from Time::Now() at the end of the message and sets |
+ // a bit to indicate that it's been added. |
+ void set_sent_time(int64 time); |
+ int64 sent_time() const; |
+ |
+ void set_received_time(int64 time) const; |
+ int64 received_time() const { return received_time_; } |
+ void set_output_params(const std::wstring& op) const { output_params_ = op; } |
+ const std::wstring& output_params() const { return output_params_; } |
+ // The following four functions are needed so we can log sync messages with |
+ // delayed replies. We stick the log data from the sent message into the |
+ // reply message, so that when it's sent and we have the output parameters |
+ // we can log it. As such, we set a flag on the sent message to not log it. |
+ void set_sync_log_data(LogData* data) const { log_data_ = data; } |
+ LogData* sync_log_data() const { return log_data_; } |
+ void set_dont_log() const { dont_log_ = true; } |
+ bool dont_log() const { return dont_log_; } |
+#endif |
+ |
+ protected: |
+ friend class Channel; |
+ friend class MessageReplyDeserializer; |
+ friend class SyncMessage; |
+ |
+ void set_sync() { |
+ header()->flags |= SYNC_BIT; |
+ } |
+ |
+ // flags |
+ enum { |
+ PRIORITY_MASK = 0x0003, |
+ SYNC_BIT = 0x0004, |
+ REPLY_BIT = 0x0008, |
+ REPLY_ERROR_BIT = 0x0010, |
+ UNBLOCK_BIT = 0x0020, |
+ PUMPING_MSGS_BIT= 0x0040, |
+ HAS_SENT_TIME_BIT = 0x0080, |
+ }; |
+ |
+#pragma pack(push, 2) |
+ struct Header : Pickle::Header { |
+ int32 routing; // ID of the view that this message is destined for |
+ uint16 type; // specifies the user-defined message type |
+ uint16 flags; // specifies control flags for the message |
+#if defined(OS_POSIX) |
+ uint32 num_fds; // the number of descriptors included with this message |
+#endif |
+ }; |
+#pragma pack(pop) |
+ |
+ Header* header() { |
+ return headerT<Header>(); |
+ } |
+ const Header* header() const { |
+ return headerT<Header>(); |
+ } |
+ |
+ void InitLoggingVariables(); |
+ |
+#if defined(OS_POSIX) |
+ // The set of file descriptors associated with this message. |
+ scoped_refptr<FileDescriptorSet> file_descriptor_set_; |
+ |
+ // Ensure that a FileDescriptorSet is allocated |
+ void EnsureFileDescriptorSet(); |
+ |
+ FileDescriptorSet* file_descriptor_set() { |
+ EnsureFileDescriptorSet(); |
+ return file_descriptor_set_.get(); |
+ } |
+ const FileDescriptorSet* file_descriptor_set() const { |
+ return file_descriptor_set_.get(); |
+ } |
+#endif |
+ |
+#ifdef IPC_MESSAGE_LOG_ENABLED |
+ // Used for logging. |
+ mutable int64 received_time_; |
+ mutable std::wstring output_params_; |
+ mutable LogData* log_data_; |
+ mutable bool dont_log_; |
+#endif |
+}; |
+ |
+//------------------------------------------------------------------------------ |
+ |
+} // namespace IPC |
+ |
+enum SpecialRoutingIDs { |
+ // indicates that we don't have a routing ID yet. |
+ MSG_ROUTING_NONE = -2, |
+ |
+ // indicates a general message not sent to a particular tab. |
+ MSG_ROUTING_CONTROL = kint32max, |
+}; |
+ |
+#define IPC_REPLY_ID 0xFFF0 // Special message id for replies |
+#define IPC_LOGGING_ID 0xFFF1 // Special message id for logging |
+ |
+#endif // IPC_IPC_MESSAGE_H__ |