diff options
Diffstat (limited to 'talk/examples/call/callclient.h')
-rw-r--r-- | talk/examples/call/callclient.h | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/talk/examples/call/callclient.h b/talk/examples/call/callclient.h new file mode 100644 index 0000000000..075dc6efd8 --- /dev/null +++ b/talk/examples/call/callclient.h @@ -0,0 +1,352 @@ +/* + * libjingle + * Copyright 2004--2005, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TALK_EXAMPLES_CALL_CALLCLIENT_H_ +#define TALK_EXAMPLES_CALL_CALLCLIENT_H_ + +#include <map> +#include <string> +#include <vector> + +#include "talk/examples/call/console.h" +#include "talk/media/base/mediachannel.h" +#include "webrtc/p2p/base/session.h" +#include "talk/session/media/mediamessages.h" +#include "talk/session/media/mediasessionclient.h" +#include "webrtc/libjingle/xmpp/hangoutpubsubclient.h" +#include "webrtc/libjingle/xmpp/presencestatus.h" +#include "webrtc/libjingle/xmpp/xmppclient.h" +#include "webrtc/base/scoped_ptr.h" +#include "webrtc/base/sslidentity.h" + +namespace buzz { +class PresencePushTask; +class PresenceOutTask; +class MucInviteRecvTask; +class MucInviteSendTask; +class FriendInviteSendTask; +class DiscoInfoQueryTask; +class Muc; +class PresenceStatus; +class IqTask; +class MucRoomConfigTask; +class MucRoomLookupTask; +class MucPresenceStatus; +class XmlElement; +class HangoutPubSubClient; +struct AvailableMediaEntry; +struct MucRoomInfo; +} // namespace buzz + +namespace rtc { +class Thread; +class NetworkManager; +} // namespace rtc + +namespace cricket { +class PortAllocator; +class MediaEngineInterface; +class MediaSessionClient; +class Call; +class SessionManagerTask; +struct CallOptions; +struct MediaStreams; +struct StreamParams; +} // namespace cricket + +struct RosterItem { + buzz::Jid jid; + buzz::PresenceStatus::Show show; + std::string status; +}; + +struct StaticRenderedView { + StaticRenderedView(const cricket::StaticVideoView& view, + cricket::VideoRenderer* renderer) : + view(view), + renderer(renderer) { + } + + cricket::StaticVideoView view; + cricket::VideoRenderer* renderer; +}; + +// Maintain a mapping of (session, ssrc) to rendered view. +typedef std::map<std::pair<cricket::Session*, uint32>, + StaticRenderedView> StaticRenderedViews; + +class CallClient: public sigslot::has_slots<> { + public: + CallClient(buzz::XmppClient* xmpp_client, + const std::string& caps_node, + const std::string& version); + ~CallClient(); + + cricket::MediaSessionClient* media_client() const { return media_client_; } + void SetMediaEngine(cricket::MediaEngineInterface* media_engine) { + media_engine_ = media_engine; + } + void SetAutoAccept(bool auto_accept) { + auto_accept_ = auto_accept; + } + void SetPmucDomain(const std::string &pmuc_domain) { + pmuc_domain_ = pmuc_domain; + } + void SetRender(bool render) { + render_ = render; + } + void SetDataChannelType(cricket::DataChannelType data_channel_type) { + data_channel_type_ = data_channel_type; + } + void SetMultiSessionEnabled(bool multisession_enabled) { + multisession_enabled_ = multisession_enabled; + } + void SetConsole(Console *console) { + console_ = console; + } + void SetPriority(int priority) { + my_status_.set_priority(priority); + } + void SendStatus() { + SendStatus(my_status_); + } + void SendStatus(const buzz::PresenceStatus& status); + + void ParseLine(const std::string &str); + + void SendChat(const std::string& to, const std::string msg); + void SendData(const std::string& stream_name, + const std::string& text); + void InviteFriend(const std::string& user); + void JoinMuc(const buzz::Jid& room_jid); + void JoinMuc(const std::string& room_jid_str); + void LookupAndJoinMuc(const std::string& room_name); + void InviteToMuc(const std::string& user, const std::string& room); + bool InMuc(); + const buzz::Jid* FirstMucJid(); + void LeaveMuc(const std::string& room); + void SetNick(const std::string& muc_nick); + void SetPortAllocatorFlags(uint32 flags) { portallocator_flags_ = flags; } + void SetAllowLocalIps(bool allow_local_ips) { + allow_local_ips_ = allow_local_ips; + } + + void SetSignalingProtocol(cricket::SignalingProtocol protocol) { + signaling_protocol_ = protocol; + } + void SetTransportProtocol(cricket::TransportProtocol protocol) { + transport_protocol_ = protocol; + } + void SetSecurePolicy(cricket::SecurePolicy sdes_policy, + cricket::SecurePolicy dtls_policy) { + sdes_policy_ = sdes_policy; + dtls_policy_ = dtls_policy; + } + void SetSslIdentity(rtc::SSLIdentity* identity) { + ssl_identity_.reset(identity); + } + + typedef std::map<buzz::Jid, buzz::Muc*> MucMap; + + const MucMap& mucs() const { + return mucs_; + } + + void SetShowRosterMessages(bool show_roster_messages) { + show_roster_messages_ = show_roster_messages; + } + + private: + void AddStream(uint32 audio_src_id, uint32 video_src_id); + void RemoveStream(uint32 audio_src_id, uint32 video_src_id); + void OnStateChange(buzz::XmppEngine::State state); + + void InitMedia(); + void InitPresence(); + void StartXmppPing(); + void OnPingTimeout(); + void OnRequestSignaling(); + void OnSessionCreate(cricket::Session* session, bool initiate); + void OnCallCreate(cricket::Call* call); + void OnCallDestroy(cricket::Call* call); + void OnSessionState(cricket::Call* call, + cricket::Session* session, + cricket::Session::State state); + void OnStatusUpdate(const buzz::PresenceStatus& status); + void OnMucInviteReceived(const buzz::Jid& inviter, const buzz::Jid& room, + const std::vector<buzz::AvailableMediaEntry>& avail); + void OnMucJoined(const buzz::Jid& endpoint); + void OnMucStatusUpdate(const buzz::Jid& jid, + const buzz::MucPresenceStatus& status); + void OnMucLeft(const buzz::Jid& endpoint, int error); + void OnPresenterStateChange(const std::string& nick, + bool was_presenting, bool is_presenting); + void OnAudioMuteStateChange(const std::string& nick, + bool was_muted, bool is_muted); + void OnRecordingStateChange(const std::string& nick, + bool was_recording, bool is_recording); + void OnRemoteMuted(const std::string& mutee_nick, + const std::string& muter_nick, + bool should_mute_locally); + void OnMediaBlocked(const std::string& blockee_nick, + const std::string& blocker_nick); + void OnHangoutRequestError(const std::string& node, + const buzz::XmlElement* stanza); + void OnHangoutPublishAudioMuteError(const std::string& task_id, + const buzz::XmlElement* stanza); + void OnHangoutPublishPresenterError(const std::string& task_id, + const buzz::XmlElement* stanza); + void OnHangoutPublishRecordingError(const std::string& task_id, + const buzz::XmlElement* stanza); + void OnHangoutRemoteMuteError(const std::string& task_id, + const std::string& mutee_nick, + const buzz::XmlElement* stanza); + void OnDevicesChange(); + void OnMediaStreamsUpdate(cricket::Call* call, + cricket::Session* session, + const cricket::MediaStreams& added, + const cricket::MediaStreams& removed); + void OnSpeakerChanged(cricket::Call* call, + cricket::Session* session, + const cricket::StreamParams& speaker_stream); + void OnRoomLookupResponse(buzz::MucRoomLookupTask* task, + const buzz::MucRoomInfo& room_info); + void OnRoomLookupError(buzz::IqTask* task, + const buzz::XmlElement* stanza); + void OnRoomConfigResult(buzz::MucRoomConfigTask* task); + void OnRoomConfigError(buzz::IqTask* task, + const buzz::XmlElement* stanza); + void OnDataReceived(cricket::Call*, + const cricket::ReceiveDataParams& params, + const rtc::Buffer& payload); + buzz::Jid GenerateRandomMucJid(); + + // Depending on |enable|, render (or don't) all the streams in |session|. + void RenderAllStreams(cricket::Call* call, + cricket::Session* session, + bool enable); + + // Depending on |enable|, render (or don't) the streams in |video_streams|. + void RenderStreams(cricket::Call* call, + cricket::Session* session, + const std::vector<cricket::StreamParams>& video_streams, + bool enable); + + // Depending on |enable|, render (or don't) the supplied |stream|. + void RenderStream(cricket::Call* call, + cricket::Session* session, + const cricket::StreamParams& stream, + bool enable); + void AddStaticRenderedView( + cricket::Session* session, + uint32 ssrc, int width, int height, int framerate, + int x_offset, int y_offset); + bool RemoveStaticRenderedView(uint32 ssrc); + void RemoveCallsStaticRenderedViews(cricket::Call* call); + void SendViewRequest(cricket::Call* call, cricket::Session* session); + bool SelectFirstDesktopScreencastId(cricket::ScreencastId* screencastid); + + static const std::string strerror(buzz::XmppEngine::Error err); + + void PrintRoster(); + bool FindJid(const std::string& name, + buzz::Jid* found_jid, + cricket::CallOptions* options); + bool PlaceCall(const std::string& name, cricket::CallOptions options); + bool InitiateAdditionalSession(const std::string& name, + cricket::CallOptions options); + void TerminateAndRemoveSession(cricket::Call* call, const std::string& id); + void PrintCalls(); + void SwitchToCall(uint32 call_id); + void Accept(const cricket::CallOptions& options); + void Reject(); + void Quit(); + + void GetDevices(); + void PrintDevices(const std::vector<std::string>& names); + + void SetVolume(const std::string& level); + + cricket::Session* GetFirstSession() { return sessions_[call_->id()][0]; } + void AddSession(cricket::Session* session) { + sessions_[call_->id()].push_back(session); + } + + void PrintStats() const; + void SetupAcceptedCall(); + + typedef std::map<std::string, RosterItem> RosterMap; + + Console *console_; + buzz::XmppClient* xmpp_client_; + rtc::Thread* worker_thread_; + rtc::NetworkManager* network_manager_; + cricket::PortAllocator* port_allocator_; + cricket::SessionManager* session_manager_; + cricket::SessionManagerTask* session_manager_task_; + cricket::MediaEngineInterface* media_engine_; + cricket::DataEngineInterface* data_engine_; + cricket::MediaSessionClient* media_client_; + MucMap mucs_; + + cricket::Call* call_; + typedef std::map<uint32, std::vector<cricket::Session *> > SessionMap; + SessionMap sessions_; + + buzz::HangoutPubSubClient* hangout_pubsub_client_; + bool incoming_call_; + bool auto_accept_; + std::string pmuc_domain_; + bool render_; + cricket::DataChannelType data_channel_type_; + bool multisession_enabled_; + cricket::VideoRenderer* local_renderer_; + StaticRenderedViews static_rendered_views_; + uint32 static_views_accumulated_count_; + uint32 screencast_ssrc_; + + buzz::PresenceStatus my_status_; + buzz::PresencePushTask* presence_push_; + buzz::PresenceOutTask* presence_out_; + buzz::MucInviteRecvTask* muc_invite_recv_; + buzz::MucInviteSendTask* muc_invite_send_; + buzz::FriendInviteSendTask* friend_invite_send_; + RosterMap* roster_; + uint32 portallocator_flags_; + + bool allow_local_ips_; + cricket::SignalingProtocol signaling_protocol_; + cricket::TransportProtocol transport_protocol_; + cricket::SecurePolicy sdes_policy_; + cricket::SecurePolicy dtls_policy_; + rtc::scoped_ptr<rtc::SSLIdentity> ssl_identity_; + std::string last_sent_to_; + + bool show_roster_messages_; +}; + +#endif // TALK_EXAMPLES_CALL_CALLCLIENT_H_ |