pepper_broker.h revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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/plugin_delegate.h" 13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_broker_impl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/proxy_channel.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChannelHandle; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrokerDispatcher; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PepperPluginDelegateImpl; 2958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochclass PluginModule; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object is NOT thread-safe. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT PepperBrokerDispatcherWrapper { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PepperBrokerDispatcherWrapper(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PepperBrokerDispatcherWrapper(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Init(base::ProcessId broker_pid, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::ChannelHandle& channel_handle); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t SendHandleToBroker(PP_Instance instance, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SyncSocket::Handle handle); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::proxy::BrokerDispatcher> dispatcher_; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::proxy::ProxyChannel::Delegate> dispatcher_delegate_; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PepperBroker : public base::RefCountedThreadSafe<PepperBroker>{ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperBroker(PluginModule* plugin_module, 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperPluginDelegateImpl* delegate_); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Decrements the references to the broker. 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // When there are no more references, this renderer's dispatcher is 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // destroyed, allowing the broker to shutdown if appropriate. 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Callers should not reference this object after calling Disconnect(). 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void Disconnect(PPB_Broker_Impl* client); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a pending connection to the broker. Balances out Disconnect() calls. 6058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void AddPendingConnect(PPB_Broker_Impl* client); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the channel to the broker has been established. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnBrokerChannelConnected(base::ProcessId broker_pid, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::ChannelHandle& channel_handle); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we know whether permission to access the PPAPI broker was 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // granted. 6858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void OnBrokerPermissionResult(PPB_Broker_Impl* client, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch friend class base::RefCountedThreadSafe<PepperBroker>; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingConnection { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingConnection(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PendingConnection(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_authorized; 7958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::WeakPtr<PPB_Broker_Impl> client; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual ~PepperBroker(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports failure to all clients that had pending operations. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportFailureToClients(int error_code); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connects the plugin to the broker via a pipe. 8858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void ConnectPluginToBroker(PPB_Broker_Impl* client); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PepperBrokerDispatcherWrapper> dispatcher_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A map of pointers to objects that have requested a connection to the weak 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer we can use to reference them. The mapping is needed so we can clean 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up entries for objects that may have been deleted. 9558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch typedef std::map<PPB_Broker_Impl*, PendingConnection> ClientMap; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMap pending_connects_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to the associated plugin module. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always set and cleared at the same time as the module's pointer to this. 10058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PluginModule* plugin_module_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<PepperPluginDelegateImpl> delegate_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(PepperBroker); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif // CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_ 110