165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Portions Copyright (c) 2010 Motorola Mobility, Inc.  All rights reserved.
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef Connection_h
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define Connection_h
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentDecoder.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentEncoder.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Arguments.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "MessageID.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WorkQueue.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/HashMap.h>
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/OwnPtr.h>
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/Threading.h>
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <mach/mach_port.h>
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(WIN)
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <string>
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(QT)
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass QSocketNotifier;
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(QT) || PLATFORM(GTK)
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "PlatformProcessIdentifier.h"
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass RunLoop;
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace CoreIPC {
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass MessageID;
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochenum SyncReplyMode {
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AutomaticReply,
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ManualReply
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockenum MessageSendFlags {
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Whether this message should be dispatched when waiting for a sync reply.
662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // This is the default for synchronous messages.
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DispatchMessageEvenWhenWaitingForSyncReply = 1 << 0,
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define MESSAGE_CHECK_BASE(assertion, connection) do \
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!(assertion)) { \
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(assertion); \
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        (connection)->markCurrentlyDispatchedMessageAsInvalid(); \
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return; \
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } \
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochwhile (0)
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
782bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass Connection : public ThreadSafeRefCounted<Connection> {
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    class MessageReceiver {
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    protected:
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        virtual ~MessageReceiver() { }
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    public:
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        virtual void didReceiveMessage(Connection*, MessageID, ArgumentDecoder*) = 0;
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        virtual SyncReplyMode didReceiveSyncMessage(Connection*, MessageID, ArgumentDecoder*, ArgumentEncoder*) { ASSERT_NOT_REACHED(); return AutomaticReply; }
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    class Client : public MessageReceiver {
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    protected:
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        virtual ~Client() { }
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    public:
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        virtual void didClose(Connection*) = 0;
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        virtual void didReceiveInvalidMessage(Connection*, MessageID) = 0;
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        virtual void syncMessageSendTimedOut(Connection*) = 0;
972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(WIN)
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        virtual Vector<HWND> windowsToReceiveSentMessagesWhileWaitingForSyncReply() = 0;
1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    typedef mach_port_t Identifier;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(WIN)
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    typedef HANDLE Identifier;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool createServerAndClientIdentifiers(Identifier& serverIdentifier, Identifier& clientIdentifier);
1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(UNIX_DOMAIN_SOCKETS)
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    typedef int Identifier;
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static PassRefPtr<Connection> createServerConnection(Identifier, Client*, RunLoop* clientRunLoop);
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static PassRefPtr<Connection> createClientConnection(Identifier, Client*, RunLoop* clientRunLoop);
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ~Connection();
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setShouldCloseConnectionOnMachExceptions();
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(QT) || PLATFORM(GTK)
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setShouldCloseConnectionOnProcessTermination(WebKit::PlatformProcessIdentifier);
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(bool);
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void setShouldExitOnSyncMessageSendFailure(bool shouldExitOnSyncMessageSendFailure);
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The set callback will be called on the connection work queue when the connection is closed,
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // before didCall is called on the client thread. Must be called before the connection is opened.
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // In the future we might want a more generic way to handle sync or async messages directly
1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // on the work queue, for example if we want to handle them on some other thread we could avoid
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // handling the message on the client thread first.
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    typedef void (*DidCloseOnConnectionWorkQueueCallback)(WorkQueue&, Connection*);
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setDidCloseOnConnectionWorkQueueCallback(DidCloseOnConnectionWorkQueueCallback callback);
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool open();
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void invalidate();
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void markCurrentlyDispatchedMessageAsInvalid();
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void setDefaultSyncMessageTimeout(double);
1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static const int DefaultTimeout = 0;
1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static const int NoTimeout = -1;
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    template<typename T> bool send(const T& message, uint64_t destinationID, unsigned messageSendFlags = 0);
1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    template<typename T> bool sendSync(const T& message, const typename T::Reply& reply, uint64_t destinationID, double timeout = DefaultTimeout);
144ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    template<typename T> bool waitForAndDispatchImmediately(uint64_t destinationID, double timeout);
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PassOwnPtr<ArgumentEncoder> createSyncMessageArgumentEncoder(uint64_t destinationID, uint64_t& syncRequestID);
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool sendMessage(MessageID, PassOwnPtr<ArgumentEncoder>, unsigned messageSendFlags = 0);
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool sendSyncReply(PassOwnPtr<ArgumentEncoder>);
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: These variants of send, sendSync and waitFor are all deprecated.
151ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // All clients should move to the overloads that take a message type.
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    template<typename E, typename T> bool deprecatedSend(E messageID, uint64_t destinationID, const T& arguments);
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    template<typename E, typename T, typename U> bool deprecatedSendSync(E messageID, uint64_t destinationID, const T& arguments, const U& reply, double timeout = NoTimeout);
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    template<typename E> PassOwnPtr<ArgumentDecoder> deprecatedWaitFor(E messageID, uint64_t destinationID, double timeout);
155ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate:
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    template<typename T> class Message {
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    public:
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Message()
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            : m_arguments(0)
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Message(MessageID messageID, PassOwnPtr<T> arguments)
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            : m_messageID(messageID)
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            , m_arguments(arguments.leakPtr())
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        MessageID messageID() const { return m_messageID; }
1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        uint64_t destinationID() const { return m_arguments->destinationID(); }
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        T* arguments() const { return m_arguments; }
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        PassOwnPtr<T> releaseArguments()
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            T* arguments = m_arguments;
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_arguments = 0;
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return arguments;
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    private:
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        MessageID m_messageID;
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        T* m_arguments;
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    typedef Message<ArgumentEncoder> OutgoingMessage;
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate:
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Connection(Identifier, bool isServer, Client*, RunLoop* clientRunLoop);
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void platformInitialize(Identifier);
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void platformInvalidate();
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool isValid() const { return m_client; }
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PassOwnPtr<ArgumentDecoder> waitForMessage(MessageID, uint64_t destinationID, double timeout);
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PassOwnPtr<ArgumentDecoder> sendSyncMessage(MessageID, uint64_t syncRequestID, PassOwnPtr<ArgumentEncoder>, double timeout);
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PassOwnPtr<ArgumentDecoder> waitForSyncReply(uint64_t syncRequestID, double timeout);
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Called on the connection work queue.
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void processIncomingMessage(MessageID, PassOwnPtr<ArgumentDecoder>);
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block    void processIncomingSyncReply(PassOwnPtr<ArgumentDecoder>);
2062bde8e466a4451c7319e3a072d118917957d6554Steve Block
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool canSendOutgoingMessages() const;
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool platformCanSendOutgoingMessages() const;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void sendOutgoingMessages();
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool sendOutgoingMessage(MessageID, PassOwnPtr<ArgumentEncoder>);
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void connectionDidClose();
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    typedef Message<ArgumentDecoder> IncomingMessage;
2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Called on the listener thread.
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void dispatchConnectionDidClose();
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void dispatchMessage(IncomingMessage&);
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void dispatchMessages();
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void dispatchSyncMessage(MessageID, ArgumentDecoder*);
2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void didFailToSendSyncMessage();
2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Can be called on any thread.
2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void enqueueIncomingMessage(IncomingMessage&);
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Client* m_client;
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool m_isServer;
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t m_syncRequestID;
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2292bde8e466a4451c7319e3a072d118917957d6554Steve Block    bool m_onlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage;
2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool m_shouldExitOnSyncMessageSendFailure;
2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DidCloseOnConnectionWorkQueueCallback m_didCloseOnConnectionWorkQueueCallback;
2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool m_isConnected;
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkQueue m_connectionQueue;
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RunLoop* m_clientRunLoop;
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2372bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned m_inDispatchMessageCount;
2382bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount;
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool m_didReceiveInvalidMessage;
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    double m_defaultSyncMessageTimeout;
2422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Incoming messages.
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Mutex m_incomingMessagesLock;
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<IncomingMessage> m_incomingMessages;
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Outgoing messages.
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Mutex m_outgoingMessagesLock;
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Deque<OutgoingMessage> m_outgoingMessages;
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ThreadCondition m_waitForMessageCondition;
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Mutex m_waitForMessageMutex;
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HashMap<std::pair<unsigned, uint64_t>, ArgumentDecoder*> m_waitForMessageMap;
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Represents a sync request for which we're waiting on a reply.
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    struct PendingSyncReply {
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // The request ID.
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        uint64_t syncRequestID;
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // The reply decoder, will be null if there was an error processing the sync
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // message on the other side.
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ArgumentDecoder* replyDecoder;
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Will be set to true once a reply has been received or an error occurred.
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool didReceiveReply;
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        PendingSyncReply()
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            : syncRequestID(0)
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            , replyDecoder(0)
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            , didReceiveReply(false)
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        explicit PendingSyncReply(uint64_t syncRequestID)
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            : syncRequestID(syncRequestID)
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            , replyDecoder(0)
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            , didReceiveReply(0)
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        PassOwnPtr<ArgumentDecoder> releaseReplyDecoder()
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            OwnPtr<ArgumentDecoder> reply = adoptPtr(replyDecoder);
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            replyDecoder = 0;
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return reply.release();
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    class SyncMessageState;
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    friend class SyncMessageState;
2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<SyncMessageState> m_syncMessageState;
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Mutex m_syncReplyStateMutex;
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool m_shouldWaitForSyncReplies;
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<PendingSyncReply> m_pendingSyncReplies;
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Called on the connection queue.
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void receiveSourceEventHandler();
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void initializeDeadNameSource();
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void exceptionSourceEventHandler();
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mach_port_t m_sendPort;
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mach_port_t m_receivePort;
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If setShouldCloseConnectionOnMachExceptions has been called, this has
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // the exception port that exceptions from the other end will be sent on.
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mach_port_t m_exceptionPort;
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(WIN)
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Called on the connection queue.
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void readEventHandler();
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void writeEventHandler();
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<uint8_t> m_readBuffer;
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OVERLAPPED m_readState;
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<ArgumentEncoder> m_pendingWriteArguments;
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OVERLAPPED m_writeState;
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HANDLE m_connectionPipe;
3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(UNIX_DOMAIN_SOCKETS)
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Called on the connection queue.
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void readyReadHandler();
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<uint8_t> m_readBuffer;
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    size_t m_currentMessageSize;
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int m_socketDescriptor;
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(QT)
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QSocketNotifier* m_socketNotifier;
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocktemplate<typename T> bool Connection::send(const T& message, uint64_t destinationID, unsigned messageSendFlags)
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<ArgumentEncoder> argumentEncoder = ArgumentEncoder::create(destinationID);
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    argumentEncoder->encode(message);
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return sendMessage(MessageID(T::messageID), argumentEncoder.release(), messageSendFlags);
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
343ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtemplate<typename T> bool Connection::sendSync(const T& message, const typename T::Reply& reply, uint64_t destinationID, double timeout)
344ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
345ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    uint64_t syncRequestID = 0;
346ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    OwnPtr<ArgumentEncoder> argumentEncoder = createSyncMessageArgumentEncoder(destinationID, syncRequestID);
347ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
348ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Encode the rest of the input arguments.
349ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    argumentEncoder->encode(message);
350ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
351ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Now send the message and wait for a reply.
3522bde8e466a4451c7319e3a072d118917957d6554Steve Block    OwnPtr<ArgumentDecoder> replyDecoder = sendSyncMessage(MessageID(T::messageID), syncRequestID, argumentEncoder.release(), timeout);
353ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!replyDecoder)
354ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return false;
355ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
356ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Decode the reply.
357ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return replyDecoder->decode(const_cast<typename T::Reply&>(reply));
358ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
359ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
360ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtemplate<typename T> bool Connection::waitForAndDispatchImmediately(uint64_t destinationID, double timeout)
361ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
362ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    OwnPtr<ArgumentDecoder> decoder = waitForMessage(MessageID(T::messageID), destinationID, timeout);
363ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!decoder)
364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return false;
365ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
366ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ASSERT(decoder->destinationID() == destinationID);
367ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_client->didReceiveMessage(this, MessageID(T::messageID), decoder.get());
368ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return true;
369ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
370ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
371ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch// These three member functions are all deprecated.
372ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename E, typename T, typename U>
3742fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool Connection::deprecatedSendSync(E messageID, uint64_t destinationID, const T& arguments, const U& reply, double timeout)
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t syncRequestID = 0;
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<ArgumentEncoder> argumentEncoder = createSyncMessageArgumentEncoder(destinationID, syncRequestID);
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Encode the input arguments.
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    argumentEncoder->encode(arguments);
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Now send the message and wait for a reply.
3832bde8e466a4451c7319e3a072d118917957d6554Steve Block    OwnPtr<ArgumentDecoder> replyDecoder = sendSyncMessage(MessageID(messageID), syncRequestID, argumentEncoder.release(), timeout);
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!replyDecoder)
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Decode the reply.
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return replyDecoder->decode(const_cast<U&>(reply));
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtemplate<typename E, typename T>
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool Connection::deprecatedSend(E messageID, uint64_t destinationID, const T& arguments)
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
394ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    OwnPtr<ArgumentEncoder> argumentEncoder = ArgumentEncoder::create(destinationID);
395ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    argumentEncoder->encode(arguments);
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
397ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return sendMessage(MessageID(messageID), argumentEncoder.release());
39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocktemplate<typename E> inline PassOwnPtr<ArgumentDecoder> Connection::deprecatedWaitFor(E messageID, uint64_t destinationID, double timeout)
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return waitForMessage(MessageID(messageID), destinationID, timeout);
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace CoreIPC
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // Connection_h
408