1 /* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef MessageID_h 27 #define MessageID_h 28 29 namespace CoreIPC { 30 31 enum MessageClass { 32 MessageClassReserved = 0, 33 34 // Messages sent by Core IPC. 35 MessageClassCoreIPC, 36 37 // Messages sent by the UI process to the web process. 38 MessageClassAuthenticationManager, 39 MessageClassDrawingArea, 40 MessageClassDrawingAreaLegacy, 41 MessageClassInjectedBundle, 42 MessageClassWebApplicationCacheManager, 43 MessageClassWebCookieManager, 44 MessageClassWebDatabaseManager, 45 MessageClassWebFullScreenManager, 46 MessageClassWebGeolocationManagerProxy, 47 MessageClassWebIconDatabaseProxy, 48 MessageClassWebInspector, 49 MessageClassWebKeyValueStorageManager, 50 MessageClassWebMediaCacheManager, 51 MessageClassWebPage, 52 MessageClassWebProcess, 53 MessageClassWebResourceCacheManager, 54 55 // Messages sent by the web process to the UI process. 56 MessageClassDownloadProxy, 57 MessageClassDrawingAreaProxy, 58 MessageClassDrawingAreaProxyLegacy, 59 MessageClassWebApplicationCacheManagerProxy, 60 MessageClassWebContext, 61 MessageClassWebContextLegacy, 62 MessageClassWebCookieManagerProxy, 63 MessageClassWebDatabaseManagerProxy, 64 MessageClassWebFullScreenManagerProxy, 65 MessageClassWebGeolocationManager, 66 MessageClassWebIconDatabase, 67 MessageClassWebInspectorProxy, 68 MessageClassWebKeyValueStorageManagerProxy, 69 MessageClassWebMediaCacheManagerProxy, 70 MessageClassWebPageProxy, 71 MessageClassWebProcessProxy, 72 MessageClassWebResourceCacheManagerProxy, 73 74 // Messages sent by the UI process to the plug-in process. 75 MessageClassPluginProcess, 76 77 // Messages sent by the plug-in process to the UI process. 78 MessageClassPluginProcessProxy, 79 80 // Messages sent by the web process to the plug-in process. 81 MessageClassWebProcessConnection, 82 MessageClassPluginControllerProxy, 83 84 // Messages sent by the plug-in process to the web process. 85 MessageClassPluginProxy, 86 87 // NPObject messages sent by both the plug-in process and the web process. 88 MessageClassNPObjectMessageReceiver, 89 }; 90 91 template<typename> struct MessageKindTraits { }; 92 93 94 /* 95 MessageID Layout (the most significant bit is reserved and therefore always zero) 96 97 --------- 98 | Flags | 7 bits 99 |-------| 100 | Class | 8 bits 101 |-------| 102 | Msg | 16 bits 103 | Kind | 104 --------- 105 */ 106 107 class MessageID { 108 public: 109 enum Flags { 110 SyncMessage = 1 << 0, 111 DispatchMessageWhenWaitingForSyncReply = 1 << 1, 112 }; 113 MessageID()114 MessageID() 115 : m_messageID(0) 116 { 117 } 118 119 template <typename EnumType> 120 explicit MessageID(EnumType messageKind, unsigned char flags = 0) 121 : m_messageID(stripMostSignificantBit(flags << 24 | (MessageKindTraits<EnumType>::messageClass) << 16 | messageKind)) 122 { 123 } 124 messageIDWithAddedFlags(unsigned char flags)125 MessageID messageIDWithAddedFlags(unsigned char flags) 126 { 127 MessageID messageID; 128 129 messageID.m_messageID = stripMostSignificantBit(m_messageID | (flags << 24)); 130 return messageID; 131 } 132 133 template <typename EnumType> get()134 EnumType get() const 135 { 136 ASSERT(getClass() == MessageKindTraits<EnumType>::messageClass); 137 return static_cast<EnumType>(m_messageID & 0xffff); 138 } 139 140 template <MessageClass K> is()141 bool is() const 142 { 143 return getClass() == K; 144 } 145 146 template <typename EnumType> 147 bool operator==(EnumType messageKind) const 148 { 149 return m_messageID == MessageID(messageKind).m_messageID; 150 } 151 fromInt(unsigned i)152 static MessageID fromInt(unsigned i) 153 { 154 MessageID messageID; 155 messageID.m_messageID = stripMostSignificantBit(i); 156 157 return messageID; 158 } 159 toInt()160 unsigned toInt() const { return m_messageID; } 161 shouldDispatchMessageWhenWaitingForSyncReply()162 bool shouldDispatchMessageWhenWaitingForSyncReply() const { return getFlags() & DispatchMessageWhenWaitingForSyncReply; } isSync()163 bool isSync() const { return getFlags() & SyncMessage; } 164 165 private: stripMostSignificantBit(unsigned value)166 static inline unsigned stripMostSignificantBit(unsigned value) 167 { 168 return value & 0x7fffffff; 169 } 170 getFlags()171 unsigned char getFlags() const { return (m_messageID & 0xff000000) >> 24; } getClass()172 unsigned char getClass() const { return (m_messageID & 0x00ff0000) >> 16; } 173 174 unsigned m_messageID; 175 }; 176 177 } // namespace CoreIPC 178 179 #endif // MessageID_h 180