// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_RENDERER_MEDIA_PEERCONNECTION_TRACKER_H_ #define CONTENT_RENDERER_MEDIA_PEERCONNECTION_TRACKER_H_ #include <map> #include "base/compiler_specific.h" #include "content/public/renderer/render_process_observer.h" #include "third_party/WebKit/public/platform/WebMediaStream.h" #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h" #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h" namespace blink { class WebFrame; class WebRTCICECandidate; class WebString; class WebRTCSessionDescription; } // namespace blink namespace webrtc { class DataChannelInterface; } // namespace webrtc namespace content { class RTCMediaConstraints; class RTCPeerConnectionHandler; // This class collects data about each peer connection, // sends it to the browser process, and handles messages // from the browser process. class CONTENT_EXPORT PeerConnectionTracker : public RenderProcessObserver { public: PeerConnectionTracker(); virtual ~PeerConnectionTracker(); enum Source { SOURCE_LOCAL, SOURCE_REMOTE }; enum Action { ACTION_SET_LOCAL_DESCRIPTION, ACTION_SET_REMOTE_DESCRIPTION, ACTION_CREATE_OFFER, ACTION_CREATE_ANSWER }; // RenderProcessObserver implementation. virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE; // // The following methods send an update to the browser process when a // PeerConnection update happens. The caller should call the Track* methods // after calling RegisterPeerConnection and before calling // UnregisterPeerConnection, otherwise the Track* call has no effect. // // Sends an update when a PeerConnection has been created in Javascript. // This should be called once and only once for each PeerConnection. // The |pc_handler| is the handler object associated with the PeerConnection, // the |servers| are the server configurations used to establish the // connection, the |constraints| are the media constraints used to initialize // the PeerConnection, the |frame| is the WebFrame object representing the // page in which the PeerConnection is created. void RegisterPeerConnection( RTCPeerConnectionHandler* pc_handler, const std::vector<webrtc::PeerConnectionInterface::IceServer>& servers, const RTCMediaConstraints& constraints, const blink::WebFrame* frame); // Sends an update when a PeerConnection has been destroyed. virtual void UnregisterPeerConnection(RTCPeerConnectionHandler* pc_handler); // Sends an update when createOffer/createAnswer has been called. // The |pc_handler| is the handler object associated with the PeerConnection, // the |constraints| is the media constraints used to create the offer/answer. virtual void TrackCreateOffer(RTCPeerConnectionHandler* pc_handler, const RTCMediaConstraints& constraints); virtual void TrackCreateAnswer(RTCPeerConnectionHandler* pc_handler, const RTCMediaConstraints& constraints); // Sends an update when setLocalDescription or setRemoteDescription is called. virtual void TrackSetSessionDescription( RTCPeerConnectionHandler* pc_handler, const blink::WebRTCSessionDescription& desc, Source source); // Sends an update when Ice candidates are updated. virtual void TrackUpdateIce( RTCPeerConnectionHandler* pc_handler, const std::vector<webrtc::PeerConnectionInterface::IceServer>& servers, const RTCMediaConstraints& options); // Sends an update when an Ice candidate is added. virtual void TrackAddIceCandidate( RTCPeerConnectionHandler* pc_handler, const blink::WebRTCICECandidate& candidate, Source source); // Sends an update when a media stream is added. virtual void TrackAddStream( RTCPeerConnectionHandler* pc_handler, const blink::WebMediaStream& stream, Source source); // Sends an update when a media stream is removed. virtual void TrackRemoveStream( RTCPeerConnectionHandler* pc_handler, const blink::WebMediaStream& stream, Source source); // Sends an update when a DataChannel is created. virtual void TrackCreateDataChannel( RTCPeerConnectionHandler* pc_handler, const webrtc::DataChannelInterface* data_channel, Source source); // Sends an update when a PeerConnection has been stopped. virtual void TrackStop(RTCPeerConnectionHandler* pc_handler); // Sends an update when the signaling state of a PeerConnection has changed. virtual void TrackSignalingStateChange( RTCPeerConnectionHandler* pc_handler, blink::WebRTCPeerConnectionHandlerClient::SignalingState state); // Sends an update when the Ice connection state // of a PeerConnection has changed. virtual void TrackIceConnectionStateChange( RTCPeerConnectionHandler* pc_handler, blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState state); // Sends an update when the Ice gathering state // of a PeerConnection has changed. virtual void TrackIceGatheringStateChange( RTCPeerConnectionHandler* pc_handler, blink::WebRTCPeerConnectionHandlerClient::ICEGatheringState state); // Sends an update when the SetSessionDescription or CreateOffer or // CreateAnswer callbacks are called. virtual void TrackSessionDescriptionCallback( RTCPeerConnectionHandler* pc_handler, Action action, const std::string& type, const std::string& value); // Sends an update when onRenegotiationNeeded is called. virtual void TrackOnRenegotiationNeeded(RTCPeerConnectionHandler* pc_handler); // Sends an update when a DTMFSender is created. virtual void TrackCreateDTMFSender( RTCPeerConnectionHandler* pc_handler, const blink::WebMediaStreamTrack& track); private: // Assign a local ID to a peer connection so that the browser process can // uniquely identify a peer connection in the renderer process. int GetNextLocalID(); // IPC Message handler for getting all stats. void OnGetAllStats(); void SendPeerConnectionUpdate(RTCPeerConnectionHandler* pc_handler, const std::string& callback_type, const std::string& value); // This map stores the local ID assigned to each RTCPeerConnectionHandler. typedef std::map<RTCPeerConnectionHandler*, int> PeerConnectionIdMap; PeerConnectionIdMap peer_connection_id_map_; // This keeps track of the next available local ID. int next_lid_; DISALLOW_COPY_AND_ASSIGN(PeerConnectionTracker); }; } // namespace content #endif // CONTENT_RENDERER_MEDIA_PEERCONNECTION_TRACKER_H_