Index: webrtc/libjingle/session/sessionmanager.h |
diff --git a/webrtc/libjingle/session/sessionmanager.h b/webrtc/libjingle/session/sessionmanager.h |
deleted file mode 100644 |
index ec5cd98aa606e546183717e8a044c07a802ed01d..0000000000000000000000000000000000000000 |
--- a/webrtc/libjingle/session/sessionmanager.h |
+++ /dev/null |
@@ -1,436 +0,0 @@ |
-/* |
- * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#ifndef WEBRTC_LIBJINGLE_SESSION_SESSIONMANAGER_H_ |
-#define WEBRTC_LIBJINGLE_SESSION_SESSIONMANAGER_H_ |
- |
-#include <map> |
-#include <string> |
-#include <utility> |
-#include <vector> |
- |
-#include "webrtc/base/sigslot.h" |
-#include "webrtc/base/thread.h" |
-#include "webrtc/libjingle/session/parsing.h" |
-#include "webrtc/libjingle/session/sessionclient.h" |
-#include "webrtc/libjingle/session/sessionmessages.h" |
-#include "webrtc/libjingle/xmllite/xmlelement.h" |
-#include "webrtc/libjingle/xmpp/constants.h" |
-#include "webrtc/p2p/base/portallocator.h" |
-#include "webrtc/p2p/base/session.h" |
-#include "webrtc/p2p/base/transportdescriptionfactory.h" |
- |
-namespace buzz { |
-class QName; |
-class XmlElement; |
-} |
- |
-namespace cricket { |
- |
-class BaseSession; |
-class SessionClient; |
-class SessionManager; |
- |
-// Used for errors that will send back a specific error message to the |
-// remote peer. We add "type" to the errors because it's needed for |
-// SignalErrorMessage. |
-struct MessageError : ParseError { |
- buzz::QName type; |
- |
- // if unset, assume type is a parse error |
- MessageError() : ParseError(), type(buzz::QN_STANZA_BAD_REQUEST) {} |
- |
- void SetType(const buzz::QName type) { |
- this->type = type; |
- } |
-}; |
- |
-// Used for errors that may be returned by public session methods that |
-// can fail. |
-// TODO: Use this error in Session::Initiate and |
-// Session::Accept. |
-struct SessionError : WriteError { |
-}; |
- |
-// A specific Session created by the SessionManager, using XMPP for protocol. |
-class Session : public BaseSession { |
- public: |
- // Returns the manager that created and owns this session. |
- SessionManager* session_manager() const { return session_manager_; } |
- |
- // Returns the client that is handling the application data of this session. |
- SessionClient* client() const { return client_; } |
- |
- // Returns the JID of this client. |
- const std::string& local_name() const { return local_name_; } |
- |
- // Returns the JID of the other peer in this session. |
- const std::string& remote_name() const { return remote_name_; } |
- |
- // Set the JID of the other peer in this session. |
- // Typically the remote_name_ is set when the session is initiated. |
- // However, sometimes (e.g when a proxy is used) the peer name is |
- // known after the BaseSession has been initiated and it must be updated |
- // explicitly. |
- void set_remote_name(const std::string& name) { remote_name_ = name; } |
- |
- // Set the JID of the initiator of this session. Allows for the overriding |
- // of the initiator to be a third-party, eg. the MUC JID when creating p2p |
- // sessions. |
- void set_initiator_name(const std::string& name) { initiator_name_ = name; } |
- |
- // Indicates the JID of the entity who initiated this session. |
- // In special cases, may be different than both local_name and remote_name. |
- const std::string& initiator_name() const { return initiator_name_; } |
- |
- SignalingProtocol current_protocol() const { return current_protocol_; } |
- |
- void set_current_protocol(SignalingProtocol protocol) { |
- current_protocol_ = protocol; |
- } |
- |
- // Updates the error state, signaling if necessary. |
- virtual void SetError(Error error, const std::string& error_desc); |
- |
- // When the session needs to send signaling messages, it beings by requesting |
- // signaling. The client should handle this by calling OnSignalingReady once |
- // it is ready to send the messages. |
- // (These are called only by SessionManager.) |
- sigslot::signal1<Session*> SignalRequestSignaling; |
- void OnSignalingReady() { BaseSession::OnSignalingReady(); } |
- |
- // Takes ownership of session description. |
- // TODO: Add an error argument to pass back to the caller. |
- bool Initiate(const std::string& to, |
- const SessionDescription* sdesc); |
- |
- // When we receive an initiate, we create a session in the |
- // RECEIVEDINITIATE state and respond by accepting or rejecting. |
- // Takes ownership of session description. |
- // TODO: Add an error argument to pass back to the caller. |
- bool Accept(const SessionDescription* sdesc); |
- bool Reject(const std::string& reason); |
- bool Terminate() { |
- return TerminateWithReason(STR_TERMINATE_SUCCESS); |
- } |
- bool TerminateWithReason(const std::string& reason); |
- // Fired whenever we receive a terminate message along with a reason |
- sigslot::signal2<Session*, const std::string&> SignalReceivedTerminateReason; |
- |
- // The two clients in the session may also send one another |
- // arbitrary XML messages, which are called "info" messages. Sending |
- // takes ownership of the given elements. The signal does not; the |
- // parent element will be deleted after the signal. |
- bool SendInfoMessage(const XmlElements& elems, |
- const std::string& remote_name); |
- bool SendDescriptionInfoMessage(const ContentInfos& contents); |
- sigslot::signal2<Session*, const buzz::XmlElement*> SignalInfoMessage; |
- |
- private: |
- // Creates or destroys a session. (These are called only SessionManager.) |
- Session(SessionManager *session_manager, |
- const std::string& local_name, const std::string& initiator_name, |
- const std::string& sid, const std::string& content_type, |
- SessionClient* client); |
- ~Session(); |
- // For each transport info, create a transport proxy. Can fail for |
- // incompatible transport types. |
- bool CreateTransportProxies(const TransportInfos& tinfos, |
- SessionError* error); |
- bool OnRemoteCandidates(const TransportInfos& tinfos, |
- ParseError* error); |
- // Returns a TransportInfo without candidates for each content name. |
- // Uses the transport_type_ of the session. |
- TransportInfos GetEmptyTransportInfos(const ContentInfos& contents) const; |
- |
- // Maps passed to serialization functions. |
- TransportParserMap GetTransportParsers(); |
- ContentParserMap GetContentParsers(); |
- CandidateTranslatorMap GetCandidateTranslators(); |
- |
- virtual void OnTransportRequestSignaling(Transport* transport); |
- virtual void OnTransportConnecting(Transport* transport); |
- virtual void OnTransportWritable(Transport* transport); |
- virtual void OnTransportProxyCandidatesReady(TransportProxy* proxy, |
- const Candidates& candidates); |
- virtual void OnMessage(rtc::Message *pmsg); |
- |
- // Send various kinds of session messages. |
- bool SendInitiateMessage(const SessionDescription* sdesc, |
- SessionError* error); |
- bool SendAcceptMessage(const SessionDescription* sdesc, SessionError* error); |
- bool SendRejectMessage(const std::string& reason, SessionError* error); |
- bool SendTerminateMessage(const std::string& reason, SessionError* error); |
- bool SendTransportInfoMessage(const TransportInfo& tinfo, |
- SessionError* error); |
- bool SendTransportInfoMessage(const TransportProxy* transproxy, |
- const Candidates& candidates, |
- SessionError* error); |
- |
- bool ResendAllTransportInfoMessages(SessionError* error); |
- bool SendAllUnsentTransportInfoMessages(SessionError* error); |
- |
- // All versions of SendMessage send a message of the given type to |
- // the other client. Can pass either a set of elements or an |
- // "action", which must have a WriteSessionAction method to go along |
- // with it. Sending with an action supports sending a "hybrid" |
- // message. Sending with elements must be sent as Jingle or Gingle. |
- |
- // When passing elems, must be either Jingle or Gingle protocol. |
- // Takes ownership of action_elems. |
- bool SendMessage(ActionType type, const XmlElements& action_elems, |
- SessionError* error); |
- // Sends a messge, but overrides the remote name. |
- bool SendMessage(ActionType type, const XmlElements& action_elems, |
- const std::string& remote_name, |
- SessionError* error); |
- // When passing an action, may be Hybrid protocol. |
- template <typename Action> |
- bool SendMessage(ActionType type, const Action& action, |
- SessionError* error); |
- |
- // Helper methods to write the session message stanza. |
- template <typename Action> |
- bool WriteActionMessage(ActionType type, const Action& action, |
- buzz::XmlElement* stanza, WriteError* error); |
- template <typename Action> |
- bool WriteActionMessage(SignalingProtocol protocol, |
- ActionType type, const Action& action, |
- buzz::XmlElement* stanza, WriteError* error); |
- |
- // Sending messages in hybrid form requires being able to write them |
- // on a per-protocol basis with a common method signature, which all |
- // of these have. |
- bool WriteSessionAction(SignalingProtocol protocol, |
- const SessionInitiate& init, |
- XmlElements* elems, WriteError* error); |
- bool WriteSessionAction(SignalingProtocol protocol, |
- const TransportInfo& tinfo, |
- XmlElements* elems, WriteError* error); |
- bool WriteSessionAction(SignalingProtocol protocol, |
- const SessionTerminate& term, |
- XmlElements* elems, WriteError* error); |
- |
- // Sends a message back to the other client indicating that we have received |
- // and accepted their message. |
- void SendAcknowledgementMessage(const buzz::XmlElement* stanza); |
- |
- // Once signaling is ready, the session will use this signal to request the |
- // sending of each message. When messages are received by the other client, |
- // they should be handed to OnIncomingMessage. |
- // (These are called only by SessionManager.) |
- sigslot::signal2<Session* , const buzz::XmlElement*> SignalOutgoingMessage; |
- void OnIncomingMessage(const SessionMessage& msg); |
- |
- void OnIncomingResponse(const buzz::XmlElement* orig_stanza, |
- const buzz::XmlElement* response_stanza, |
- const SessionMessage& msg); |
- void OnInitiateAcked(); |
- void OnFailedSend(const buzz::XmlElement* orig_stanza, |
- const buzz::XmlElement* error_stanza); |
- |
- // Invoked when an error is found in an incoming message. This is translated |
- // into the appropriate XMPP response by SessionManager. |
- sigslot::signal6<BaseSession*, |
- const buzz::XmlElement*, |
- const buzz::QName&, |
- const std::string&, |
- const std::string&, |
- const buzz::XmlElement*> SignalErrorMessage; |
- |
- // Handlers for the various types of messages. These functions may take |
- // pointers to the whole stanza or to just the session element. |
- bool OnInitiateMessage(const SessionMessage& msg, MessageError* error); |
- bool OnAcceptMessage(const SessionMessage& msg, MessageError* error); |
- bool OnRejectMessage(const SessionMessage& msg, MessageError* error); |
- bool OnInfoMessage(const SessionMessage& msg); |
- bool OnTerminateMessage(const SessionMessage& msg, MessageError* error); |
- bool OnTransportInfoMessage(const SessionMessage& msg, MessageError* error); |
- bool OnTransportAcceptMessage(const SessionMessage& msg, MessageError* error); |
- bool OnDescriptionInfoMessage(const SessionMessage& msg, MessageError* error); |
- bool OnRedirectError(const SessionRedirect& redirect, SessionError* error); |
- |
- // Verifies that we are in the appropriate state to receive this message. |
- bool CheckState(State state, MessageError* error); |
- |
- SessionManager* session_manager_; |
- bool initiate_acked_; |
- std::string local_name_; |
- std::string initiator_name_; |
- std::string remote_name_; |
- SessionClient* client_; |
- TransportParser* transport_parser_; |
- // Keeps track of what protocol we are speaking. |
- SignalingProtocol current_protocol_; |
- |
- friend class SessionManager; // For access to constructor, destructor, |
- // and signaling related methods. |
-}; |
- |
-// SessionManager manages session instances. |
-class SessionManager : public sigslot::has_slots<> { |
- public: |
- SessionManager(PortAllocator *allocator, |
- rtc::Thread *worker_thread = NULL); |
- virtual ~SessionManager(); |
- |
- PortAllocator *port_allocator() const { return allocator_; } |
- rtc::Thread *worker_thread() const { return worker_thread_; } |
- rtc::Thread *signaling_thread() const { return signaling_thread_; } |
- |
- int session_timeout() const { return timeout_; } |
- void set_session_timeout(int timeout) { timeout_ = timeout; } |
- |
- // Set what transport protocol we want to default to. |
- void set_transport_protocol(TransportProtocol proto) { |
- transport_desc_factory_.set_protocol(proto); |
- } |
- |
- // Control use of DTLS. An identity must be supplied if DTLS is enabled. |
- void set_secure(SecurePolicy policy) { |
- transport_desc_factory_.set_secure(policy); |
- } |
- void set_identity(rtc::SSLIdentity* identity) { |
- transport_desc_factory_.set_identity(identity); |
- } |
- const TransportDescriptionFactory* transport_desc_factory() const { |
- return &transport_desc_factory_; |
- } |
- |
- // Registers support for the given client. If we receive an initiate |
- // describing a session of the given type, we will automatically create a |
- // Session object and notify this client. The client may then accept or |
- // reject the session. |
- void AddClient(const std::string& content_type, SessionClient* client); |
- void RemoveClient(const std::string& content_type); |
- SessionClient* GetClient(const std::string& content_type); |
- |
- // Creates a new session. The given name is the JID of the client on whose |
- // behalf we initiate the session. |
- Session *CreateSession(const std::string& local_name, |
- const std::string& content_type); |
- |
- Session *CreateSession(const std::string& id, |
- const std::string& local_name, |
- const std::string& content_type); |
- |
- // Destroys the given session. |
- void DestroySession(Session *session); |
- |
- // Returns the session with the given ID or NULL if none exists. |
- Session *GetSession(const std::string& sid); |
- |
- // Terminates all of the sessions created by this manager. |
- void TerminateAll(); |
- |
- // These are signaled whenever the set of existing sessions changes. |
- sigslot::signal2<Session *, bool> SignalSessionCreate; |
- sigslot::signal1<Session *> SignalSessionDestroy; |
- |
- // Determines whether the given stanza is intended for some session. |
- bool IsSessionMessage(const buzz::XmlElement* stanza); |
- |
- // Given a sid, initiator, and remote_name, this finds the matching Session |
- Session* FindSession(const std::string& sid, |
- const std::string& remote_name); |
- |
- // Called when we receive a stanza for which IsSessionMessage is true. |
- void OnIncomingMessage(const buzz::XmlElement* stanza); |
- |
- // Called when we get a response to a message that we sent. |
- void OnIncomingResponse(const buzz::XmlElement* orig_stanza, |
- const buzz::XmlElement* response_stanza); |
- |
- // Called if an attempted to send times out or an error is returned. In the |
- // timeout case error_stanza will be NULL |
- void OnFailedSend(const buzz::XmlElement* orig_stanza, |
- const buzz::XmlElement* error_stanza); |
- |
- // Signalled each time a session generates a signaling message to send. |
- // Also signalled on errors, but with a NULL session. |
- sigslot::signal2<SessionManager*, |
- const buzz::XmlElement*> SignalOutgoingMessage; |
- |
- // Signaled before sessions try to send certain signaling messages. The |
- // client should call OnSignalingReady once it is safe to send them. These |
- // steps are taken so that we don't send signaling messages trying to |
- // re-establish the connectivity of a session when the client cannot send |
- // the messages (and would probably just drop them on the floor). |
- // |
- // Note: you can connect this directly to OnSignalingReady(), if a signalling |
- // check is not supported. |
- sigslot::signal0<> SignalRequestSignaling; |
- void OnSignalingReady(); |
- |
- // Signaled when this SessionManager is deleted. |
- sigslot::signal0<> SignalDestroyed; |
- |
- private: |
- typedef std::map<std::string, Session*> SessionMap; |
- typedef std::map<std::string, SessionClient*> ClientMap; |
- |
- // Helper function for CreateSession. This is also invoked when we receive |
- // a message attempting to initiate a session with this client. |
- Session *CreateSession(const std::string& local_name, |
- const std::string& initiator, |
- const std::string& sid, |
- const std::string& content_type, |
- bool received_initiate); |
- |
- // Attempts to find a registered session type whose description appears as |
- // a child of the session element. Such a child should be present indicating |
- // the application they hope to initiate. |
- std::string FindClient(const buzz::XmlElement* session); |
- |
- // Sends a message back to the other client indicating that we found an error |
- // in the stanza they sent. name identifies the error, type is one of the |
- // standard XMPP types (cancel, continue, modify, auth, wait), and text is a |
- // description for debugging purposes. |
- void SendErrorMessage(const buzz::XmlElement* stanza, |
- const buzz::QName& name, |
- const std::string& type, |
- const std::string& text, |
- const buzz::XmlElement* extra_info); |
- |
- // Creates and returns an error message from the given components. The |
- // caller is responsible for deleting this. |
- buzz::XmlElement* CreateErrorMessage( |
- const buzz::XmlElement* stanza, |
- const buzz::QName& name, |
- const std::string& type, |
- const std::string& text, |
- const buzz::XmlElement* extra_info); |
- |
- // Called each time a session requests signaling. |
- void OnRequestSignaling(Session* session); |
- |
- // Called each time a session has an outgoing message. |
- void OnOutgoingMessage(Session* session, const buzz::XmlElement* stanza); |
- |
- // Called each time a session has an error to send. |
- void OnErrorMessage(BaseSession* session, |
- const buzz::XmlElement* stanza, |
- const buzz::QName& name, |
- const std::string& type, |
- const std::string& text, |
- const buzz::XmlElement* extra_info); |
- |
- PortAllocator *allocator_; |
- rtc::Thread *signaling_thread_; |
- rtc::Thread *worker_thread_; |
- int timeout_; |
- TransportDescriptionFactory transport_desc_factory_; |
- SessionMap session_map_; |
- ClientMap client_map_; |
-}; |
- |
-} // namespace cricket |
- |
-#endif // WEBRTC_LIBJINGLE_SESSION_SESSIONMANAGER_H_ |