10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004 Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_SESSION_MEDIA_MEDIASESSIONCLIENT_H_ 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_SESSION_MEDIA_MEDIASESSIONCLIENT_H_ 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 31cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <algorithm> 32cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <map> 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/cryptoparams.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/session.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessionclient.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessiondescription.h" 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessionmanager.h" 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/call.h" 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediasession.h" 43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/messagequeue.h" 44cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h" 45cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslotrepeater.h" 46cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/thread.h" 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Call; 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaSessionClient : public SessionClient, public sigslot::has_slots<> { 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#if !defined(DISABLE_MEDIA_ENGINE_FACTORY) 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaSessionClient(const buzz::Jid& jid, SessionManager *manager); 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Alternative constructor, allowing injection of media_engine 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and device_manager. 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaSessionClient(const buzz::Jid& jid, SessionManager *manager, 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaEngineInterface* media_engine, 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataEngineInterface* data_media_engine, 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeviceManagerInterface* device_manager); 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ~MediaSessionClient(); 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::Jid &jid() const { return jid_; } 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionManager* session_manager() const { return session_manager_; } 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChannelManager* channel_manager() const { return channel_manager_; } 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Return mapping of call ids to Calls. 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::map<uint32, Call *>& calls() const { return calls_; } 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The settings below combine with the settings on SessionManager to choose 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // whether SDES-SRTP, DTLS-SRTP, or no security should be used. The possible 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // combinations are shown in the following table. Note that where either DTLS 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // or SDES is possible, DTLS is preferred. Thus to require either SDES or 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // DTLS, but not mandate DTLS, set SDES to require and DTLS to enable. 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // | SDES:Disable | SDES:Enable | SDES:Require | 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ----------------------------------------------------------------| 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // DTLS:Disable | No SRTP | SDES Optional | SDES Mandatory | 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // DTLS:Enable | DTLS Optional | DTLS/SDES Opt | DTLS/SDES Mand | 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // DTLS:Require | DTLS Mandatory | DTLS Mandatory | DTLS Mandatory | 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Control use of SDES-SRTP. 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SecurePolicy secure() const { return desc_factory_.secure(); } 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_secure(SecurePolicy s) { desc_factory_.set_secure(s); } 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Control use of multiple sessions in a call. 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_multisession_enabled(bool multisession_enabled) { 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org multisession_enabled_ = multisession_enabled; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int GetCapabilities() { return channel_manager_->GetCapabilities(); } 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Call *CreateCall(); 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DestroyCall(Call *call); 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Call *GetFocus(); 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetFocus(Call *call); 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void JoinCalls(Call *call_to_join, Call *call); 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetAudioInputDevices(std::vector<std::string>* names) { 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return channel_manager_->GetAudioInputDevices(names); 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetAudioOutputDevices(std::vector<std::string>* names) { 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return channel_manager_->GetAudioOutputDevices(names); 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetVideoCaptureDevices(std::vector<std::string>* names) { 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return channel_manager_->GetVideoCaptureDevices(names); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetAudioOptions(const std::string& in_name, const std::string& out_name, 1155528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org const AudioOptions& options) { 1165528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org return channel_manager_->SetAudioOptions(in_name, out_name, options); 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetOutputVolume(int level) { 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return channel_manager_->SetOutputVolume(level); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetCaptureDevice(const std::string& cam_device) { 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return channel_manager_->SetCaptureDevice(cam_device); 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescription* CreateOffer(const CallOptions& options) { 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return desc_factory_.CreateOffer(options, NULL); 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionDescription* CreateAnswer(const SessionDescription* offer, 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CallOptions& options) { 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return desc_factory_.CreateAnswer(offer, options, NULL); 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<Call *, Call *> SignalFocus; 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Call *> SignalCallCreate; 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Call *> SignalCallDestroy; 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::repeater0<> SignalDevicesChange; 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool ParseContent(SignalingProtocol protocol, 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::XmlElement* elem, 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ContentDescription** content, 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ParseError* error); 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool IsWritable(SignalingProtocol protocol, 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentDescription* content); 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool WriteContent(SignalingProtocol protocol, 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ContentDescription* content, 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement** elem, 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WriteError* error); 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void Construct(); 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSessionCreate(Session *session, bool received_initiate); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSessionState(BaseSession *session, BaseSession::State state); 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSessionDestroy(Session *session); 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Session *CreateSession(Call *call); 155f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org Session *CreateSession(const std::string& id, Call* call); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Call *FindCallByRemoteName(const std::string &remote_name); 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::Jid jid_; 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionManager* session_manager_; 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Call *focus_call_; 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChannelManager *channel_manager_; 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaSessionDescriptionFactory desc_factory_; 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool multisession_enabled_; 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::map<uint32, Call *> calls_; 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Maintain a mapping of session id to call. 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org typedef std::map<std::string, Call *> SessionMap; 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SessionMap session_map_; 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org friend class Call; 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_SESSION_MEDIA_MEDIASESSIONCLIENT_H_ 176