165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef MessageID_h
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define MessageID_h
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace CoreIPC {
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochenum MessageClass {
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassReserved = 0,
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by Core IPC.
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassCoreIPC,
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by the UI process to the web process.
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassAuthenticationManager,
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassDrawingArea,
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassDrawingAreaLegacy,
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassInjectedBundle,
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebApplicationCacheManager,
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebCookieManager,
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebDatabaseManager,
452bde8e466a4451c7319e3a072d118917957d6554Steve Block    MessageClassWebFullScreenManager,
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebGeolocationManagerProxy,
472bde8e466a4451c7319e3a072d118917957d6554Steve Block    MessageClassWebIconDatabaseProxy,
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebInspector,
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebKeyValueStorageManager,
502bde8e466a4451c7319e3a072d118917957d6554Steve Block    MessageClassWebMediaCacheManager,
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebPage,
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebProcess,
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebResourceCacheManager,
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by the web process to the UI process.
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassDownloadProxy,
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassDrawingAreaProxy,
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassDrawingAreaProxyLegacy,
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebApplicationCacheManagerProxy,
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebContext,
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebContextLegacy,
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebCookieManagerProxy,
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebDatabaseManagerProxy,
642bde8e466a4451c7319e3a072d118917957d6554Steve Block    MessageClassWebFullScreenManagerProxy,
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebGeolocationManager,
662bde8e466a4451c7319e3a072d118917957d6554Steve Block    MessageClassWebIconDatabase,
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebInspectorProxy,
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebKeyValueStorageManagerProxy,
692bde8e466a4451c7319e3a072d118917957d6554Steve Block    MessageClassWebMediaCacheManagerProxy,
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebPageProxy,
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebProcessProxy,
7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    MessageClassWebResourceCacheManagerProxy,
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by the UI process to the plug-in process.
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassPluginProcess,
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by the plug-in process to the UI process.
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassPluginProcessProxy,
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by the web process to the plug-in process.
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassWebProcessConnection,
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassPluginControllerProxy,
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Messages sent by the plug-in process to the web process.
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassPluginProxy,
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // NPObject messages sent by both the plug-in process and the web process.
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageClassNPObjectMessageReceiver,
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename> struct MessageKindTraits { };
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageID Layout (the most significant bit is reserved and therefore always zero)
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ---------
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    | Flags | 7 bits
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    |-------|
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    | Class | 8 bits
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    |-------|
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    |  Msg  | 16 bits
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    |  Kind |
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ---------
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch*/
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass MessageID {
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    enum Flags {
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SyncMessage = 1 << 0,
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        DispatchMessageWhenWaitingForSyncReply = 1 << 1,
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MessageID()
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        : m_messageID(0)
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    template <typename EnumType>
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    explicit MessageID(EnumType messageKind, unsigned char flags = 0)
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        : m_messageID(stripMostSignificantBit(flags << 24 | (MessageKindTraits<EnumType>::messageClass) << 16 | messageKind))
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    MessageID messageIDWithAddedFlags(unsigned char flags)
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        MessageID messageID;
1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        messageID.m_messageID = stripMostSignificantBit(m_messageID | (flags << 24));
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return messageID;
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    template <typename EnumType>
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EnumType get() const
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(getClass() == MessageKindTraits<EnumType>::messageClass);
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return static_cast<EnumType>(m_messageID & 0xffff);
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    template <MessageClass K>
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool is() const
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return getClass() == K;
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    template <typename EnumType>
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool operator==(EnumType messageKind) const
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return m_messageID == MessageID(messageKind).m_messageID;
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static MessageID fromInt(unsigned i)
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        MessageID messageID;
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        messageID.m_messageID = stripMostSignificantBit(i);
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return messageID;
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned toInt() const { return m_messageID; }
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool shouldDispatchMessageWhenWaitingForSyncReply() const { return getFlags() & DispatchMessageWhenWaitingForSyncReply; }
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool isSync() const { return getFlags() & SyncMessage; }
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate:
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static inline unsigned stripMostSignificantBit(unsigned value)
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return value & 0x7fffffff;
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned char getFlags() const { return (m_messageID & 0xff000000) >> 24; }
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned char getClass() const { return (m_messageID & 0x00ff0000) >> 16; }
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned m_messageID;
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace CoreIPC
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // MessageID_h
180