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
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessConnectionManager.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(PLUGIN_PROCESS)
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentDecoder.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentEncoder.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginProcessConnection.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcess.h"
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebProcessProxyMessages.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/StdLibExtras.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC)
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "MachPort.h"
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcessConnectionManager& PluginProcessConnectionManager::shared()
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DEFINE_STATIC_LOCAL(PluginProcessConnectionManager, pluginProcessConnectionManager, ());
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return pluginProcessConnectionManager;
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcessConnectionManager::PluginProcessConnectionManager()
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcessConnectionManager::~PluginProcessConnectionManager()
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginProcessConnection* PluginProcessConnectionManager::getPluginProcessConnection(const String& pluginPath)
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < m_pluginProcessConnections.size(); ++i) {
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (m_pluginProcessConnections[i]->pluginPath() == pluginPath)
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return m_pluginProcessConnections[i].get();
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CoreIPC::Connection::Identifier connectionIdentifier;
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC)
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CoreIPC::MachPort connectionMachPort;
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::GetPluginProcessConnection(pluginPath), Messages::WebProcessProxy::GetPluginProcessConnection::Reply(connectionMachPort), 0))
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    connectionIdentifier = connectionMachPort.port();
742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: Implement.
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    connectionIdentifier = 0;
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT_NOT_REACHED();
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!connectionIdentifier)
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<PluginProcessConnection> pluginProcessConnection = PluginProcessConnection::create(this, pluginPath, connectionIdentifier);
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginProcessConnections.append(pluginProcessConnection);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return pluginProcessConnection.get();
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginProcessConnectionManager::removePluginProcessConnection(PluginProcessConnection* pluginProcessConnection)
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    size_t vectorIndex = m_pluginProcessConnections.find(pluginProcessConnection);
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(vectorIndex != notFound);
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginProcessConnections.remove(vectorIndex);
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(PLUGIN_PROCESS)
99