15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#ifndef CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_ 6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 9bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/sync_socket.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_broker_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/proxy_channel.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChannelHandle; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrokerDispatcher; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochclass PluginModule; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object is NOT thread-safe. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT PepperBrokerDispatcherWrapper { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PepperBrokerDispatcherWrapper(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PepperBrokerDispatcherWrapper(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Init(base::ProcessId broker_pid, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::ChannelHandle& channel_handle); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t SendHandleToBroker(PP_Instance instance, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SyncSocket::Handle handle); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::proxy::BrokerDispatcher> dispatcher_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::proxy::ProxyChannel::Delegate> dispatcher_delegate_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PepperBroker : public base::RefCountedThreadSafe<PepperBroker>{ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch explicit PepperBroker(PluginModule* plugin_module); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Decrements the references to the broker. 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // When there are no more references, this renderer's dispatcher is 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // destroyed, allowing the broker to shutdown if appropriate. 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Callers should not reference this object after calling Disconnect(). 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void Disconnect(PPB_Broker_Impl* client); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a pending connection to the broker. Balances out Disconnect() calls. 5758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void AddPendingConnect(PPB_Broker_Impl* client); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the channel to the broker has been established. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnBrokerChannelConnected(base::ProcessId broker_pid, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::ChannelHandle& channel_handle); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we know whether permission to access the PPAPI broker was 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // granted. 6558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void OnBrokerPermissionResult(PPB_Broker_Impl* client, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch friend class base::RefCountedThreadSafe<PepperBroker>; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingConnection { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingConnection(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PendingConnection(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_authorized; 7658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::WeakPtr<PPB_Broker_Impl> client; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual ~PepperBroker(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports failure to all clients that had pending operations. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportFailureToClients(int error_code); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connects the plugin to the broker via a pipe. 8558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void ConnectPluginToBroker(PPB_Broker_Impl* client); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PepperBrokerDispatcherWrapper> dispatcher_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A map of pointers to objects that have requested a connection to the weak 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer we can use to reference them. The mapping is needed so we can clean 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up entries for objects that may have been deleted. 9258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch typedef std::map<PPB_Broker_Impl*, PendingConnection> ClientMap; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMap pending_connects_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to the associated plugin module. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always set and cleared at the same time as the module's pointer to this. 9758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PluginModule* plugin_module_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(PepperBroker); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif // CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_ 105