1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_MESSAGE_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_MESSAGE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <string> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/pickle.h" 17*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 18*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_buildflags.h" 19*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_support_export.h" 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker namespace mojo { 22*6777b538SAndroid Build Coastguard Worker namespace internal { 23*6777b538SAndroid Build Coastguard Worker struct UnmappedNativeStructSerializerImpl; 24*6777b538SAndroid Build Coastguard Worker } 25*6777b538SAndroid Build Coastguard Worker } // namespace mojo 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker namespace IPC { 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker namespace internal { 30*6777b538SAndroid Build Coastguard Worker class ChannelReader; 31*6777b538SAndroid Build Coastguard Worker } // namespace internal 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------ 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker struct LogData; 36*6777b538SAndroid Build Coastguard Worker class MessageAttachmentSet; 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker class IPC_MESSAGE_SUPPORT_EXPORT Message : public base::Pickle { 39*6777b538SAndroid Build Coastguard Worker public: 40*6777b538SAndroid Build Coastguard Worker enum PriorityValue { 41*6777b538SAndroid Build Coastguard Worker PRIORITY_LOW = 1, 42*6777b538SAndroid Build Coastguard Worker PRIORITY_NORMAL, 43*6777b538SAndroid Build Coastguard Worker PRIORITY_HIGH 44*6777b538SAndroid Build Coastguard Worker }; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // Bit values used in the flags field. 47*6777b538SAndroid Build Coastguard Worker // Upper 24 bits of flags store a reference number, so this enum is limited to 48*6777b538SAndroid Build Coastguard Worker // 8 bits. 49*6777b538SAndroid Build Coastguard Worker enum { 50*6777b538SAndroid Build Coastguard Worker PRIORITY_MASK = 0x03, // Low 2 bits of store the priority value. 51*6777b538SAndroid Build Coastguard Worker SYNC_BIT = 0x04, 52*6777b538SAndroid Build Coastguard Worker REPLY_BIT = 0x08, 53*6777b538SAndroid Build Coastguard Worker REPLY_ERROR_BIT = 0x10, 54*6777b538SAndroid Build Coastguard Worker UNBLOCK_BIT = 0x20, 55*6777b538SAndroid Build Coastguard Worker PUMPING_MSGS_BIT = 0x40, // Deprecated. 56*6777b538SAndroid Build Coastguard Worker HAS_SENT_TIME_BIT = 0x80, 57*6777b538SAndroid Build Coastguard Worker }; 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker ~Message() override; 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker Message(); 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // Initialize a message with a user-defined type, priority value, and 64*6777b538SAndroid Build Coastguard Worker // destination WebView ID. 65*6777b538SAndroid Build Coastguard Worker Message(int32_t routing_id, uint32_t type, PriorityValue priority); 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker // Initializes a message from a const block of data. The data is not copied; 68*6777b538SAndroid Build Coastguard Worker // instead the data is merely referenced by this message. Only const methods 69*6777b538SAndroid Build Coastguard Worker // should be used on the message when initialized this way. 70*6777b538SAndroid Build Coastguard Worker Message(const char* data, size_t data_len); 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker Message(const Message& other); 73*6777b538SAndroid Build Coastguard Worker Message& operator=(const Message& other); 74*6777b538SAndroid Build Coastguard Worker IsValid()75*6777b538SAndroid Build Coastguard Worker bool IsValid() const { return header_size() == sizeof(Header) && header(); } 76*6777b538SAndroid Build Coastguard Worker priority()77*6777b538SAndroid Build Coastguard Worker PriorityValue priority() const { 78*6777b538SAndroid Build Coastguard Worker return static_cast<PriorityValue>(header()->flags & PRIORITY_MASK); 79*6777b538SAndroid Build Coastguard Worker } 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // True if this is a synchronous message. set_sync()82*6777b538SAndroid Build Coastguard Worker void set_sync() { 83*6777b538SAndroid Build Coastguard Worker header()->flags |= SYNC_BIT; 84*6777b538SAndroid Build Coastguard Worker } is_sync()85*6777b538SAndroid Build Coastguard Worker bool is_sync() const { 86*6777b538SAndroid Build Coastguard Worker return (header()->flags & SYNC_BIT) != 0; 87*6777b538SAndroid Build Coastguard Worker } 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker // Set this on a reply to a synchronous message. set_reply()90*6777b538SAndroid Build Coastguard Worker void set_reply() { 91*6777b538SAndroid Build Coastguard Worker header()->flags |= REPLY_BIT; 92*6777b538SAndroid Build Coastguard Worker } 93*6777b538SAndroid Build Coastguard Worker is_reply()94*6777b538SAndroid Build Coastguard Worker bool is_reply() const { 95*6777b538SAndroid Build Coastguard Worker return (header()->flags & REPLY_BIT) != 0; 96*6777b538SAndroid Build Coastguard Worker } 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker // Set this on a reply to a synchronous message to indicate that no receiver 99*6777b538SAndroid Build Coastguard Worker // was found. set_reply_error()100*6777b538SAndroid Build Coastguard Worker void set_reply_error() { 101*6777b538SAndroid Build Coastguard Worker header()->flags |= REPLY_ERROR_BIT; 102*6777b538SAndroid Build Coastguard Worker } 103*6777b538SAndroid Build Coastguard Worker is_reply_error()104*6777b538SAndroid Build Coastguard Worker bool is_reply_error() const { 105*6777b538SAndroid Build Coastguard Worker return (header()->flags & REPLY_ERROR_BIT) != 0; 106*6777b538SAndroid Build Coastguard Worker } 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker // Normally when a receiver gets a message and they're blocked on a 109*6777b538SAndroid Build Coastguard Worker // synchronous message Send, they buffer a message. Setting this flag causes 110*6777b538SAndroid Build Coastguard Worker // the receiver to be unblocked and the message to be dispatched immediately. set_unblock(bool unblock)111*6777b538SAndroid Build Coastguard Worker void set_unblock(bool unblock) { 112*6777b538SAndroid Build Coastguard Worker if (unblock) { 113*6777b538SAndroid Build Coastguard Worker header()->flags |= UNBLOCK_BIT; 114*6777b538SAndroid Build Coastguard Worker } else { 115*6777b538SAndroid Build Coastguard Worker header()->flags &= static_cast<uint32_t>(~UNBLOCK_BIT); 116*6777b538SAndroid Build Coastguard Worker } 117*6777b538SAndroid Build Coastguard Worker } 118*6777b538SAndroid Build Coastguard Worker should_unblock()119*6777b538SAndroid Build Coastguard Worker bool should_unblock() const { 120*6777b538SAndroid Build Coastguard Worker return (header()->flags & UNBLOCK_BIT) != 0; 121*6777b538SAndroid Build Coastguard Worker } 122*6777b538SAndroid Build Coastguard Worker set_dispatch_error()123*6777b538SAndroid Build Coastguard Worker void set_dispatch_error() const { 124*6777b538SAndroid Build Coastguard Worker dispatch_error_ = true; 125*6777b538SAndroid Build Coastguard Worker } 126*6777b538SAndroid Build Coastguard Worker dispatch_error()127*6777b538SAndroid Build Coastguard Worker bool dispatch_error() const { 128*6777b538SAndroid Build Coastguard Worker return dispatch_error_; 129*6777b538SAndroid Build Coastguard Worker } 130*6777b538SAndroid Build Coastguard Worker type()131*6777b538SAndroid Build Coastguard Worker uint32_t type() const { 132*6777b538SAndroid Build Coastguard Worker return header()->type; 133*6777b538SAndroid Build Coastguard Worker } 134*6777b538SAndroid Build Coastguard Worker routing_id()135*6777b538SAndroid Build Coastguard Worker int32_t routing_id() const { 136*6777b538SAndroid Build Coastguard Worker return header()->routing; 137*6777b538SAndroid Build Coastguard Worker } 138*6777b538SAndroid Build Coastguard Worker set_routing_id(int32_t new_id)139*6777b538SAndroid Build Coastguard Worker void set_routing_id(int32_t new_id) { 140*6777b538SAndroid Build Coastguard Worker header()->routing = new_id; 141*6777b538SAndroid Build Coastguard Worker } 142*6777b538SAndroid Build Coastguard Worker flags()143*6777b538SAndroid Build Coastguard Worker uint32_t flags() const { 144*6777b538SAndroid Build Coastguard Worker return header()->flags; 145*6777b538SAndroid Build Coastguard Worker } 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker // Sets all the given header values. The message should be empty at this 148*6777b538SAndroid Build Coastguard Worker // call. 149*6777b538SAndroid Build Coastguard Worker void SetHeaderValues(int32_t routing, uint32_t type, uint32_t flags); 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard Worker template<class T, class S, class P> Dispatch(const Message * msg,T * obj,S * sender,P * parameter,void (T::* func)())152*6777b538SAndroid Build Coastguard Worker static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, 153*6777b538SAndroid Build Coastguard Worker void (T::*func)()) { 154*6777b538SAndroid Build Coastguard Worker (obj->*func)(); 155*6777b538SAndroid Build Coastguard Worker return true; 156*6777b538SAndroid Build Coastguard Worker } 157*6777b538SAndroid Build Coastguard Worker 158*6777b538SAndroid Build Coastguard Worker template<class T, class S, class P> Dispatch(const Message * msg,T * obj,S * sender,P * parameter,void (T::* func)(P *))159*6777b538SAndroid Build Coastguard Worker static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, 160*6777b538SAndroid Build Coastguard Worker void (T::*func)(P*)) { 161*6777b538SAndroid Build Coastguard Worker (obj->*func)(parameter); 162*6777b538SAndroid Build Coastguard Worker return true; 163*6777b538SAndroid Build Coastguard Worker } 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Worker // Used for async messages with no parameters. Log(std::string * name,const Message * msg,std::string * l)166*6777b538SAndroid Build Coastguard Worker static void Log(std::string* name, const Message* msg, std::string* l) { 167*6777b538SAndroid Build Coastguard Worker } 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker // The static method FindNext() returns several pieces of information, which 170*6777b538SAndroid Build Coastguard Worker // are aggregated into an instance of this struct. 171*6777b538SAndroid Build Coastguard Worker struct IPC_MESSAGE_SUPPORT_EXPORT NextMessageInfo { 172*6777b538SAndroid Build Coastguard Worker NextMessageInfo(); 173*6777b538SAndroid Build Coastguard Worker ~NextMessageInfo(); 174*6777b538SAndroid Build Coastguard Worker 175*6777b538SAndroid Build Coastguard Worker // Total message size. Always valid if |message_found| is true. 176*6777b538SAndroid Build Coastguard Worker // If |message_found| is false but we could determine message size 177*6777b538SAndroid Build Coastguard Worker // from the header, this field is non-zero. Otherwise it's zero. 178*6777b538SAndroid Build Coastguard Worker size_t message_size; 179*6777b538SAndroid Build Coastguard Worker // Whether an entire message was found in the given memory range. 180*6777b538SAndroid Build Coastguard Worker bool message_found; 181*6777b538SAndroid Build Coastguard Worker // Only filled in if |message_found| is true. 182*6777b538SAndroid Build Coastguard Worker // The start address is passed into FindNext() by the caller, so isn't 183*6777b538SAndroid Build Coastguard Worker // repeated in this struct. The end address of the pickle should be used to 184*6777b538SAndroid Build Coastguard Worker // construct a base::Pickle. 185*6777b538SAndroid Build Coastguard Worker const char* pickle_end; 186*6777b538SAndroid Build Coastguard Worker // Only filled in if |message_found| is true. 187*6777b538SAndroid Build Coastguard Worker // The end address of the message should be used to determine the start 188*6777b538SAndroid Build Coastguard Worker // address of the next message. 189*6777b538SAndroid Build Coastguard Worker const char* message_end; 190*6777b538SAndroid Build Coastguard Worker }; 191*6777b538SAndroid Build Coastguard Worker 192*6777b538SAndroid Build Coastguard Worker // |info| is an output parameter and must not be nullptr. 193*6777b538SAndroid Build Coastguard Worker static void FindNext(const char* range_start, 194*6777b538SAndroid Build Coastguard Worker const char* range_end, 195*6777b538SAndroid Build Coastguard Worker NextMessageInfo* info); 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker // WriteAttachment appends |attachment| to the end of the set. It returns 198*6777b538SAndroid Build Coastguard Worker // false iff the set is full. 199*6777b538SAndroid Build Coastguard Worker bool WriteAttachment( 200*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> attachment) override; 201*6777b538SAndroid Build Coastguard Worker // ReadAttachment parses an attachment given the parsing state |iter| and 202*6777b538SAndroid Build Coastguard Worker // writes it to |*attachment|. It returns true on success. 203*6777b538SAndroid Build Coastguard Worker bool ReadAttachment( 204*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter, 205*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment>* attachment) const override; 206*6777b538SAndroid Build Coastguard Worker // Returns true if there are any attachment in this message. 207*6777b538SAndroid Build Coastguard Worker bool HasAttachments() const override; 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED) 210*6777b538SAndroid Build Coastguard Worker // Adds the outgoing time from Time::Now() at the end of the message and sets 211*6777b538SAndroid Build Coastguard Worker // a bit to indicate that it's been added. 212*6777b538SAndroid Build Coastguard Worker void set_sent_time(int64_t time); 213*6777b538SAndroid Build Coastguard Worker int64_t sent_time() const; 214*6777b538SAndroid Build Coastguard Worker 215*6777b538SAndroid Build Coastguard Worker void set_received_time(int64_t time) const; received_time()216*6777b538SAndroid Build Coastguard Worker int64_t received_time() const { return received_time_; } set_output_params(const std::string & op)217*6777b538SAndroid Build Coastguard Worker void set_output_params(const std::string& op) const { output_params_ = op; } output_params()218*6777b538SAndroid Build Coastguard Worker const std::string& output_params() const { return output_params_; } 219*6777b538SAndroid Build Coastguard Worker // The following four functions are needed so we can log sync messages with 220*6777b538SAndroid Build Coastguard Worker // delayed replies. We stick the log data from the sent message into the 221*6777b538SAndroid Build Coastguard Worker // reply message, so that when it's sent and we have the output parameters 222*6777b538SAndroid Build Coastguard Worker // we can log it. As such, we set a flag on the sent message to not log it. set_sync_log_data(LogData * data)223*6777b538SAndroid Build Coastguard Worker void set_sync_log_data(LogData* data) const { log_data_ = data; } sync_log_data()224*6777b538SAndroid Build Coastguard Worker LogData* sync_log_data() const { return log_data_; } set_dont_log()225*6777b538SAndroid Build Coastguard Worker void set_dont_log() const { dont_log_ = true; } dont_log()226*6777b538SAndroid Build Coastguard Worker bool dont_log() const { return dont_log_; } 227*6777b538SAndroid Build Coastguard Worker #endif 228*6777b538SAndroid Build Coastguard Worker 229*6777b538SAndroid Build Coastguard Worker protected: 230*6777b538SAndroid Build Coastguard Worker friend class Channel; 231*6777b538SAndroid Build Coastguard Worker friend class ChannelMojo; 232*6777b538SAndroid Build Coastguard Worker friend class ChannelNacl; 233*6777b538SAndroid Build Coastguard Worker friend class ChannelPosix; 234*6777b538SAndroid Build Coastguard Worker friend class ChannelWin; 235*6777b538SAndroid Build Coastguard Worker friend class internal::ChannelReader; 236*6777b538SAndroid Build Coastguard Worker friend class MessageReplyDeserializer; 237*6777b538SAndroid Build Coastguard Worker friend class SyncMessage; 238*6777b538SAndroid Build Coastguard Worker 239*6777b538SAndroid Build Coastguard Worker friend struct mojo::internal::UnmappedNativeStructSerializerImpl; 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Worker #pragma pack(push, 4) 242*6777b538SAndroid Build Coastguard Worker struct Header : base::Pickle::Header { 243*6777b538SAndroid Build Coastguard Worker int32_t routing; // ID of the view that this message is destined for 244*6777b538SAndroid Build Coastguard Worker uint32_t type; // specifies the user-defined message type 245*6777b538SAndroid Build Coastguard Worker uint32_t flags; // specifies control flags for the message 246*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) 247*6777b538SAndroid Build Coastguard Worker uint16_t num_fds; // the number of descriptors included with this message 248*6777b538SAndroid Build Coastguard Worker uint16_t pad; // explicitly initialize this to appease valgrind 249*6777b538SAndroid Build Coastguard Worker #endif 250*6777b538SAndroid Build Coastguard Worker }; 251*6777b538SAndroid Build Coastguard Worker #pragma pack(pop) 252*6777b538SAndroid Build Coastguard Worker header()253*6777b538SAndroid Build Coastguard Worker Header* header() { 254*6777b538SAndroid Build Coastguard Worker return headerT<Header>(); 255*6777b538SAndroid Build Coastguard Worker } header()256*6777b538SAndroid Build Coastguard Worker const Header* header() const { 257*6777b538SAndroid Build Coastguard Worker return headerT<Header>(); 258*6777b538SAndroid Build Coastguard Worker } 259*6777b538SAndroid Build Coastguard Worker 260*6777b538SAndroid Build Coastguard Worker void Init(); 261*6777b538SAndroid Build Coastguard Worker 262*6777b538SAndroid Build Coastguard Worker // Used internally to support IPC::Listener::OnBadMessageReceived. 263*6777b538SAndroid Build Coastguard Worker mutable bool dispatch_error_; 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard Worker // The set of file descriptors associated with this message. 266*6777b538SAndroid Build Coastguard Worker scoped_refptr<MessageAttachmentSet> attachment_set_; 267*6777b538SAndroid Build Coastguard Worker 268*6777b538SAndroid Build Coastguard Worker // Ensure that a MessageAttachmentSet is allocated 269*6777b538SAndroid Build Coastguard Worker void EnsureMessageAttachmentSet(); 270*6777b538SAndroid Build Coastguard Worker attachment_set()271*6777b538SAndroid Build Coastguard Worker MessageAttachmentSet* attachment_set() { 272*6777b538SAndroid Build Coastguard Worker EnsureMessageAttachmentSet(); 273*6777b538SAndroid Build Coastguard Worker return attachment_set_.get(); 274*6777b538SAndroid Build Coastguard Worker } attachment_set()275*6777b538SAndroid Build Coastguard Worker const MessageAttachmentSet* attachment_set() const { 276*6777b538SAndroid Build Coastguard Worker return attachment_set_.get(); 277*6777b538SAndroid Build Coastguard Worker } 278*6777b538SAndroid Build Coastguard Worker 279*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED) 280*6777b538SAndroid Build Coastguard Worker // Used for logging. 281*6777b538SAndroid Build Coastguard Worker mutable int64_t received_time_; 282*6777b538SAndroid Build Coastguard Worker mutable std::string output_params_; 283*6777b538SAndroid Build Coastguard Worker mutable raw_ptr<LogData> log_data_; 284*6777b538SAndroid Build Coastguard Worker mutable bool dont_log_; 285*6777b538SAndroid Build Coastguard Worker #endif 286*6777b538SAndroid Build Coastguard Worker 287*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(IPCMessageTest, FindNext); 288*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(IPCMessageTest, FindNextOverflow); 289*6777b538SAndroid Build Coastguard Worker }; 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------ 292*6777b538SAndroid Build Coastguard Worker 293*6777b538SAndroid Build Coastguard Worker } // namespace IPC 294*6777b538SAndroid Build Coastguard Worker 295*6777b538SAndroid Build Coastguard Worker enum SpecialRoutingIDs { 296*6777b538SAndroid Build Coastguard Worker // indicates that we don't have a routing ID yet. 297*6777b538SAndroid Build Coastguard Worker MSG_ROUTING_NONE = -2, 298*6777b538SAndroid Build Coastguard Worker 299*6777b538SAndroid Build Coastguard Worker // indicates a general message not sent to a particular tab. 300*6777b538SAndroid Build Coastguard Worker MSG_ROUTING_CONTROL = INT32_MAX, 301*6777b538SAndroid Build Coastguard Worker }; 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker #define IPC_REPLY_ID 0xFFFFFFF0 // Special message id for replies 304*6777b538SAndroid Build Coastguard Worker #define IPC_LOGGING_ID 0xFFFFFFF1 // Special message id for logging 305*6777b538SAndroid Build Coastguard Worker 306*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_MESSAGE_H_ 307