Chromium Code Reviews| Index: webrtc/p2p/base/transport.h |
| diff --git a/webrtc/p2p/base/transport.h b/webrtc/p2p/base/transport.h |
| index 6064bdb54db257c978b6edeaa1f4613b9cd9641f..d566bf0ea6686f11a41c4ae2eadae577c29d3365 100644 |
| --- a/webrtc/p2p/base/transport.h |
| +++ b/webrtc/p2p/base/transport.h |
| @@ -15,15 +15,8 @@ |
| // state changes (in order to update the manager's state), and forwards |
| // requests to begin connecting or to reset to each of the channels. |
| // |
| -// On Threading: Transport performs work on both the signaling and worker |
| -// threads. For subclasses, the rule is that all signaling related calls will |
| -// be made on the signaling thread and all channel related calls (including |
| -// signaling for a channel) will be made on the worker thread. When |
| -// information needs to be sent between the two threads, this class should do |
| -// the work (e.g., OnRemoteCandidate). |
| -// |
| -// Note: Subclasses must call DestroyChannels() in their own constructors. |
| -// It is not possible to do so here because the subclass constructor will |
| +// Note: Subclasses must call DestroyChannels() in their own destructors. |
| +// It is not possible to do so here because the subclass destructor will |
| // already have run. |
| #ifndef WEBRTC_P2P_BASE_TRANSPORT_H_ |
| @@ -36,15 +29,10 @@ |
| #include "webrtc/p2p/base/constants.h" |
| #include "webrtc/p2p/base/sessiondescription.h" |
| #include "webrtc/p2p/base/transportinfo.h" |
| -#include "webrtc/base/criticalsection.h" |
| #include "webrtc/base/messagequeue.h" |
| #include "webrtc/base/sigslot.h" |
| #include "webrtc/base/sslstreamadapter.h" |
| -namespace rtc { |
| -class Thread; |
| -} |
| - |
| namespace cricket { |
| class PortAllocator; |
| @@ -135,21 +123,19 @@ bool IceCredentialsChanged(const std::string& old_ufrag, |
| const std::string& new_ufrag, |
| const std::string& new_pwd); |
| -class Transport : public rtc::MessageHandler, |
| - public sigslot::has_slots<> { |
| +class Transport : public sigslot::has_slots<> { |
| public: |
| - Transport(rtc::Thread* signaling_thread, |
| - rtc::Thread* worker_thread, |
| - const std::string& content_name, |
| + enum CandidateGatheringState { |
| + kGatheringNew = 0, |
| + kGatheringGathering, |
| + kGatheringDone, |
|
pthatcher1
2015/08/10 20:40:17
Done => Complete
Also, this enum should probably
Taylor Brandstetter
2015/08/11 01:20:08
Done.
|
| + }; |
| + |
| + Transport(const std::string& content_name, |
| const std::string& type, |
| PortAllocator* allocator); |
| virtual ~Transport(); |
| - // Returns the signaling thread. The app talks to Transport on this thread. |
| - rtc::Thread* signaling_thread() { return signaling_thread_; } |
| - // Returns the worker thread. The actual networking is done on this thread. |
| - rtc::Thread* worker_thread() { return worker_thread_; } |
| - |
| // Returns the content_name of this transport. |
| const std::string& content_name() const { return content_name_; } |
| // Returns the type of this transport. |
| @@ -184,6 +170,19 @@ class Transport : public rtc::MessageHandler, |
| return (receiving_ == TRANSPORT_STATE_SOME || |
| receiving_ == TRANSPORT_STATE_ALL); |
| } |
| + bool local_description_set() const { |
| + return local_description_set_; |
| + } |
| + bool remote_description_set() const { |
| + return remote_description_set_; |
| + } |
| + |
| + // Checks if all channels are completed |
| + bool Completed() const; |
| + |
| + CandidateGatheringState candidate_gathering_state() const { |
| + return candidate_gathering_state_; |
| + } |
| sigslot::signal1<Transport*> SignalReadableState; |
| sigslot::signal1<Transport*> SignalWritableState; |
| @@ -203,10 +202,10 @@ class Transport : public rtc::MessageHandler, |
| void SetChannelReceivingTimeout(int timeout_ms); |
| // Must be called before applying local session description. |
| - void SetIdentity(rtc::SSLIdentity* identity); |
| + virtual void SetIdentity(rtc::SSLIdentity* identity) {} |
| // Get a copy of the local identity provided by SetIdentity. |
| - bool GetIdentity(rtc::SSLIdentity** identity); |
| + virtual bool GetIdentity(rtc::SSLIdentity** identity) { return false; } |
| // Get a copy of the remote certificate in use by the specified channel. |
| bool GetRemoteCertificate(rtc::SSLCertificate** cert); |
| @@ -215,10 +214,9 @@ class Transport : public rtc::MessageHandler, |
| // Create, destroy, and lookup the channels of this type by their components. |
| TransportChannelImpl* CreateChannel(int component); |
| - // Note: GetChannel may lead to race conditions, since the mutex is not held |
| - // after the pointer is returned. |
| + |
| TransportChannelImpl* GetChannel(int component); |
| - // Note: HasChannel does not lead to race conditions, unlike GetChannel. |
| + |
| bool HasChannel(int component) { |
| return (NULL != GetChannel(component)); |
| } |
| @@ -250,20 +248,18 @@ class Transport : public rtc::MessageHandler, |
| bool GetStats(TransportStats* stats); |
| - // Before any stanza is sent, the manager will request signaling. Once |
| - // signaling is available, the client should call OnSignalingReady. Once |
| - // this occurs, the transport (or its channels) can send any waiting stanzas. |
| - // OnSignalingReady invokes OnTransportSignalingReady and then forwards this |
| - // signal to each channel. |
| - sigslot::signal1<Transport*> SignalRequestSignaling; |
| - void OnSignalingReady(); |
| + sigslot::signal1<Transport*> SignalCandidatesAllocationStarted; |
| // Handles sending of ready candidates and receiving of remote candidates. |
| sigslot::signal2<Transport*, |
| const std::vector<Candidate>&> SignalCandidatesReady; |
| - |
| sigslot::signal1<Transport*> SignalCandidatesAllocationDone; |
| - void OnRemoteCandidates(const std::vector<Candidate>& candidates); |
| + |
| + // Called when one or more candidates are ready from the remote peer. |
| + bool AddRemoteCandidates( |
| + const std::vector<Candidate>& candidates, std::string* error); |
| + |
| + void AddRemoteCandidate(const Candidate& candidate); |
|
pthatcher1
2015/08/10 20:40:17
Why do we need both of these?
Taylor Brandstetter
2015/08/11 01:20:08
I'm not sure; this was left over from your origina
|
| // If candidate is not acceptable, returns false and sets error. |
| // Call this before calling OnRemoteCandidates. |
| @@ -278,10 +274,12 @@ class Transport : public rtc::MessageHandler, |
| // Forwards the signal from TransportChannel to BaseSession. |
| sigslot::signal0<> SignalRoleConflict; |
| - virtual bool GetSslRole(rtc::SSLRole* ssl_role) const; |
| + virtual bool GetSslRole(rtc::SSLRole* ssl_role) const { return false; } |
| // Must be called before channel is starting to connect. |
| - virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version); |
| + virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) { |
| + return false; |
| + } |
| protected: |
| // These are called by Create/DestroyChannel above in order to create or |
| @@ -289,9 +287,6 @@ class Transport : public rtc::MessageHandler, |
| virtual TransportChannelImpl* CreateTransportChannel(int component) = 0; |
| virtual void DestroyTransportChannel(TransportChannelImpl* channel) = 0; |
| - // Informs the subclass that we received the signaling ready message. |
| - virtual void OnTransportSignalingReady() {} |
| - |
| // The current local transport description, for use by derived classes |
| // when performing transport description negotiation. |
| const TransportDescription* local_description() const { |
| @@ -304,21 +299,15 @@ class Transport : public rtc::MessageHandler, |
| return remote_description_.get(); |
| } |
| - virtual void SetIdentity_w(rtc::SSLIdentity* identity) {} |
| - |
| - virtual bool GetIdentity_w(rtc::SSLIdentity** identity) { |
| - return false; |
| - } |
| - |
| // Pushes down the transport parameters from the local description, such |
| // as the ICE ufrag and pwd. |
| // Derived classes can override, but must call the base as well. |
| - virtual bool ApplyLocalTransportDescription_w(TransportChannelImpl* channel, |
| + virtual bool ApplyLocalTransportDescription(TransportChannelImpl* channel, |
| std::string* error_desc); |
| // Pushes down remote ice credentials from the remote description to the |
| // transport channel. |
| - virtual bool ApplyRemoteTransportDescription_w(TransportChannelImpl* ch, |
| + virtual bool ApplyRemoteTransportDescription(TransportChannelImpl* ch, |
| std::string* error_desc); |
| // Negotiates the transport parameters based on the current local and remote |
| @@ -326,29 +315,20 @@ class Transport : public rtc::MessageHandler, |
| // should be activated. |
| // Derived classes can negotiate their specific parameters here, but must call |
| // the base as well. |
| - virtual bool NegotiateTransportDescription_w(ContentAction local_role, |
| + virtual bool NegotiateTransportDescription(ContentAction local_role, |
| std::string* error_desc); |
| // Pushes down the transport parameters obtained via negotiation. |
| // Derived classes can set their specific parameters here, but must call the |
| // base as well. |
| - virtual bool ApplyNegotiatedTransportDescription_w( |
| + virtual bool ApplyNegotiatedTransportDescription( |
| TransportChannelImpl* channel, std::string* error_desc); |
| - virtual bool GetSslRole_w(rtc::SSLRole* ssl_role) const { |
| - return false; |
| - } |
| - |
| - virtual bool SetSslMaxProtocolVersion_w(rtc::SSLProtocolVersion version) { |
| - return false; |
| - } |
| - |
| private: |
| struct ChannelMapEntry { |
| - ChannelMapEntry() : impl_(NULL), candidates_allocated_(false), ref_(0) {} |
| + ChannelMapEntry() : impl_(NULL), ref_(0) {} |
| explicit ChannelMapEntry(TransportChannelImpl *impl) |
| : impl_(impl), |
| - candidates_allocated_(false), |
| ref_(0) { |
| } |
| @@ -361,14 +341,9 @@ class Transport : public rtc::MessageHandler, |
| TransportChannelImpl* get() const { return impl_; } |
| TransportChannelImpl* operator->() const { return impl_; } |
| - void set_candidates_allocated(bool status) { |
| - candidates_allocated_ = status; |
| - } |
| - bool candidates_allocated() const { return candidates_allocated_; } |
| - private: |
| - TransportChannelImpl *impl_; |
| - bool candidates_allocated_; |
| + private: |
| + TransportChannelImpl* impl_; |
| int ref_; |
| }; |
| @@ -382,11 +357,9 @@ class Transport : public rtc::MessageHandler, |
| // Called when the receiving state of a channel changes. |
| void OnChannelReceivingState(TransportChannel* channel); |
| - // Called when a channel requests signaling. |
| - void OnChannelRequestSignaling(TransportChannelImpl* channel); |
| + // Called when a channel starts allocating candidates for a new ICE session |
| + void OnChannelCandidatesAllocationStarted(TransportChannelImpl* channel); |
| - // Called when a candidate is ready from remote peer. |
| - void OnRemoteCandidate(const Candidate& candidate); |
| // Called when a candidate is ready from channel. |
| void OnChannelCandidateReady(TransportChannelImpl* channel, |
| const Candidate& candidate); |
| @@ -398,55 +371,24 @@ class Transport : public rtc::MessageHandler, |
| // Called when the channel removes a connection. |
| void OnChannelConnectionRemoved(TransportChannelImpl* channel); |
| - // Dispatches messages to the appropriate handler (below). |
| - void OnMessage(rtc::Message* msg); |
| - |
| - // These are versions of the above methods that are called only on a |
| - // particular thread (s = signaling, w = worker). The above methods post or |
| - // send a message to invoke this version. |
| - TransportChannelImpl* CreateChannel_w(int component); |
| - void DestroyChannel_w(int component); |
| - void ConnectChannels_w(); |
| - void ResetChannels_w(); |
| - void DestroyAllChannels_w(); |
| - void OnRemoteCandidate_w(const Candidate& candidate); |
| - void OnChannelReadableState_s(); |
| - void OnChannelWritableState_s(); |
| - void OnChannelReceivingState_s(); |
| - void OnChannelRequestSignaling_s(); |
| - void OnConnecting_s(); |
| - void OnChannelRouteChange_s(const TransportChannel* channel, |
| - const Candidate& remote_candidate); |
| - void OnChannelCandidatesAllocationDone_s(); |
| - |
| // Helper function that invokes the given function on every channel. |
| typedef void (TransportChannelImpl::* TransportChannelFunc)(); |
| - void CallChannels_w(TransportChannelFunc func); |
| + void CallChannels(TransportChannelFunc func); |
| // Computes the AND and OR of the channel's read/write/receiving state |
| // (argument picks the operation). |
| - TransportState GetTransportState_s(TransportStateType type); |
| - |
| - void OnChannelCandidateReady_s(); |
| + TransportState GetTransportState(TransportStateType type); |
| - void SetIceRole_w(IceRole role); |
| - void SetRemoteIceMode_w(IceMode mode); |
| - bool SetLocalTransportDescription_w(const TransportDescription& desc, |
| - ContentAction action, |
| - std::string* error_desc); |
| - bool SetRemoteTransportDescription_w(const TransportDescription& desc, |
| - ContentAction action, |
| - std::string* error_desc); |
| - bool GetStats_w(TransportStats* infos); |
| - bool GetRemoteCertificate_w(rtc::SSLCertificate** cert); |
| + // Sends SignalCompleted if we are now in that state. |
| + void CheckIfCompleted(); |
| - void SetChannelReceivingTimeout_w(int timeout_ms); |
| + // Sends SignalCandidatesAllocationDone if all channels are done |
| + void CheckIfCandidatesAllocationDone(); |
| - // Sends SignalCompleted if we are now in that state. |
| - void MaybeCompleted_w(); |
| + void UpdateReadableState(); |
| + void UpdateWritableState(); |
| + void UpdateReceivingState(); |
| - rtc::Thread* const signaling_thread_; |
| - rtc::Thread* const worker_thread_; |
| const std::string content_name_; |
| const std::string type_; |
| PortAllocator* const allocator_; |
| @@ -463,14 +405,14 @@ class Transport : public rtc::MessageHandler, |
| int channel_receiving_timeout_; |
| rtc::scoped_ptr<TransportDescription> local_description_; |
| rtc::scoped_ptr<TransportDescription> remote_description_; |
| + bool local_description_set_; |
| + bool remote_description_set_; |
| + CandidateGatheringState candidate_gathering_state_; |
| - // TODO(tommi): Make sure we only use this on the worker thread. |
| ChannelMap channels_; |
| // Buffers the ready_candidates so that SignalCanidatesReady can |
| // provide them in multiples. |
| std::vector<Candidate> ready_candidates_; |
| - // Protects changes to channels and messages |
| - rtc::CriticalSection crit_; |
| DISALLOW_COPY_AND_ASSIGN(Transport); |
| }; |