47fdf01e84577804cdd4c9c4784f6bdac674d4a1
[WebKit-https.git] / Source / WebKit2 / Platform / CoreIPC / MessageID.h
1 /*
2  * Copyright (C) 2010, 2012 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     MessageClassInvalid = 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     MessageClassLayerTreeCoordinator,
41     MessageClassWebApplicationCacheManager,
42     MessageClassWebBatteryManagerProxy,
43     MessageClassWebCookieManager,
44     MessageClassWebDatabaseManager,
45     MessageClassWebFullScreenManager,
46     MessageClassWebGeolocationManagerProxy,
47     MessageClassWebIconDatabaseProxy,
48     MessageClassWebInspector,
49     MessageClassWebKeyValueStorageManager,
50     MessageClassWebMediaCacheManager,
51     MessageClassWebNetworkInfoManagerProxy,
52     MessageClassWebNotificationManager,
53     MessageClassWebPage,
54     MessageClassWebPageGroupProxy,
55     MessageClassWebProcess,
56     MessageClassWebResourceCacheManager,
57     MessageClassEventDispatcher,
58 #if USE(SOUP)
59     MessageClassWebSoupRequestManager,
60 #endif
61
62     // Messages sent by the web process to the UI process.
63     MessageClassDownloadProxy,
64     MessageClassDrawingAreaProxy,
65     MessageClassLayerTreeCoordinatorProxy,
66     MessageClassWebApplicationCacheManagerProxy,
67     MessageClassWebBatteryManager,
68     MessageClassWebConnection,
69     MessageClassWebContext,
70     MessageClassWebContextLegacy,
71     MessageClassWebCookieManagerProxy,
72     MessageClassWebDatabaseManagerProxy,
73     MessageClassWebFullScreenManagerProxy,
74     MessageClassWebGeolocationManager,
75     MessageClassWebIconDatabase,
76     MessageClassWebInspectorProxy,
77     MessageClassWebKeyValueStorageManagerProxy,
78     MessageClassWebMediaCacheManagerProxy,
79     MessageClassWebNetworkInfoManager,
80     MessageClassWebNotificationManagerProxy,
81     MessageClassWebPageProxy,
82     MessageClassWebProcessProxy,
83     MessageClassWebResourceCacheManagerProxy,
84 #if USE(SOUP)
85     MessageClassWebSoupRequestManagerProxy,
86 #endif
87     MessageClassWebVibrationProxy,
88     MessageClassRemoteLayerTreeHost,
89
90     // Messages sent to a WebConnection
91     MessageClassWebConnectionLegacy,
92
93     // Messages sent by the UI process to the plug-in process.
94     MessageClassPluginProcess,
95
96     // Messages sent by the plug-in process to the UI process.
97     MessageClassPluginProcessProxy,
98
99     // Messages sent by the web process to the plug-in process.
100     MessageClassWebProcessConnection,
101     MessageClassPluginControllerProxy,
102
103     // Messages sent by the plug-in process to the web process.
104     MessageClassPluginProcessConnection,
105     MessageClassPluginProxy,
106
107     // NPObject messages sent by both the plug-in process and the web process.
108     MessageClassNPObjectMessageReceiver,
109
110     // Messages sent by the UI process to the network process.
111     MessageClassNetworkProcess,
112
113     // Messages sent by the network process to the UI process.
114     MessageClassNetworkProcessProxy,
115
116     // Messages sent by the web process to the network process.
117     MessageClassNetworkConnectionToWebProcess,
118
119     // Messages sent by the network process to a web process.
120     MessageClassNetworkProcessConnection,
121     
122 #if ENABLE(SHARED_WORKER_PROCESS)
123     // Messages sent by the UI process to the shared worker process.
124     MessageClassSharedWorkerProcess,
125 #endif // ENABLE(SHARED_WORKER_PROCESS)
126
127     // Messages sent by the shared worker process to the UI process.
128     MessageClassSharedWorkerProcessProxy,
129     
130 #if ENABLE(CUSTOM_PROTOCOLS)
131     // Messages sent by the UI process to a web process (soon the network process).
132     MessageClassCustomProtocolManager,
133
134     // Messages sent by a web process (soon the network process) to the UI process.
135     MessageClassCustomProtocolManagerProxy,
136 #endif
137 };
138
139 template<typename> struct MessageKindTraits { };
140
141
142 /*
143     MessageID Layout (the most significant bit is reserved and therefore always zero)
144
145     ---------
146     | Flags | 7 bits
147     |-------|
148     | Class | 8 bits
149     |-------|
150     |  Msg  | 16 bits
151     |  Kind |
152     ---------
153 */
154
155 class MessageID {
156 public:
157     enum Flags {
158         SyncMessage = 1 << 0,
159         DispatchMessageWhenWaitingForSyncReply = 1 << 1,
160     };
161
162     MessageID()
163         : m_messageID(0)
164     {
165     }
166
167     template <typename EnumType>
168     explicit MessageID(EnumType messageKind, unsigned char flags = 0)
169         : m_messageID(stripMostSignificantBit(flags << 24 | (MessageKindTraits<EnumType>::messageClass) << 16 | messageKind))
170     {
171     }
172
173     MessageID messageIDWithAddedFlags(unsigned char flags)
174     {
175         MessageID messageID;
176
177         messageID.m_messageID = stripMostSignificantBit(m_messageID | (flags << 24));
178         return messageID;
179     }
180
181     template <typename EnumType>
182     EnumType get() const
183     {
184         ASSERT(getClass() == MessageKindTraits<EnumType>::messageClass);
185         return static_cast<EnumType>(m_messageID & 0xffff);
186     }
187
188     template <MessageClass K>
189     bool is() const
190     {
191         return getClass() == K;
192     }
193     
194     template <typename EnumType>
195     bool operator==(EnumType messageKind) const
196     {
197         return m_messageID == MessageID(messageKind).m_messageID;
198     }
199
200     static MessageID fromInt(unsigned i)
201     {
202         MessageID messageID;
203         messageID.m_messageID = stripMostSignificantBit(i);
204         
205         return messageID;
206     }
207     
208     unsigned toInt() const { return m_messageID; }
209
210     bool shouldDispatchMessageWhenWaitingForSyncReply() const { return getFlags() & DispatchMessageWhenWaitingForSyncReply; }
211     bool isSync() const { return getFlags() & SyncMessage; }
212
213     MessageClass messageClass() const
214     {
215         return static_cast<MessageClass>(getClass());
216     }
217
218 private:
219     static inline unsigned stripMostSignificantBit(unsigned value)
220     {
221         return value & 0x7fffffff;
222     }
223
224     unsigned char getFlags() const { return (m_messageID & 0xff000000) >> 24; }
225     unsigned char getClass() const { return (m_messageID & 0x00ff0000) >> 16; }
226
227     unsigned m_messageID;
228 };
229
230 } // namespace CoreIPC
231     
232 #endif // MessageID_h