Reason for revert: This CL just landed: https://codereview.chromium.org/1323243006/ Which fixes the FYI bots for the original CL, and breaks them for this revert. Original issue's description: > Revert of TransportController refactoring. (patchset #6 id:100001 of https://codereview.webrtc.org/1350523003/ ) > > Reason for revert: > This CL causes problems with the WebRTC-in-Chromium FYI bots. Presumably it needs to be done in several steps, where removed files are emptied instead of removed in the first step. > > Original issue's description: > > TransportController refactoring. > > > > Getting rid of TransportProxy, and in its place adding a > > TransportController class which will facilitate access to and manage > > the lifetimes of Transports. These Transports will now be accessed > > solely from the worker thread, simplifying their implementation. > > > > This refactoring also pulls Transport-related code out of BaseSession. > > Which means that BaseChannels will now rely on the TransportController > > interface to create channels, rather than BaseSession. > > > > Committed: https://crrev.com/47ee2f3b9f33e8938948c482c921d4e13a3acd83 > > Cr-Commit-Position: refs/heads/master@{#10022} > > TBR=pthatcher@webrtc.org,deadbeef@webrtc.org > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > > Committed: https://crrev.com/a81a42f584baa0d93a4b93da9632415e8922450c > Cr-Commit-Position: refs/heads/master@{#10024} TBR=pthatcher@webrtc.org,torbjorng@webrtc.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Review URL: https://codereview.webrtc.org/1361773005 Cr-Commit-Position: refs/heads/master@{#10036}
203 lines
7.6 KiB
C++
203 lines
7.6 KiB
C++
/*
|
|
* 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_P2P_BASE_SESSION_H_
|
|
#define WEBRTC_P2P_BASE_SESSION_H_
|
|
|
|
#include <list>
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "webrtc/base/refcount.h"
|
|
#include "webrtc/base/rtccertificate.h"
|
|
#include "webrtc/base/scoped_ptr.h"
|
|
#include "webrtc/base/scoped_ref_ptr.h"
|
|
#include "webrtc/base/socketaddress.h"
|
|
#include "webrtc/p2p/base/candidate.h"
|
|
#include "webrtc/p2p/base/port.h"
|
|
#include "webrtc/p2p/base/transport.h"
|
|
|
|
namespace cricket {
|
|
|
|
class BaseSession;
|
|
class P2PTransportChannel;
|
|
class Transport;
|
|
class TransportChannel;
|
|
class TransportChannelImpl;
|
|
class TransportController;
|
|
|
|
// Statistics for all the transports of this session.
|
|
typedef std::map<std::string, TransportStats> TransportStatsMap;
|
|
typedef std::map<std::string, std::string> ProxyTransportMap;
|
|
|
|
// TODO(pthatcher): Think of a better name for this. We already have
|
|
// a TransportStats in transport.h. Perhaps TransportsStats?
|
|
struct SessionStats {
|
|
ProxyTransportMap proxy_to_transport;
|
|
TransportStatsMap transport_stats;
|
|
};
|
|
|
|
// A BaseSession manages general session state. This includes negotiation
|
|
// of both the application-level and network-level protocols: the former
|
|
// defines what will be sent and the latter defines how it will be sent. Each
|
|
// network-level protocol is represented by a Transport object. Each Transport
|
|
// participates in the network-level negotiation. The individual streams of
|
|
// packets are represented by TransportChannels. The application-level protocol
|
|
// is represented by SessionDecription objects.
|
|
class BaseSession : public sigslot::has_slots<>,
|
|
public rtc::MessageHandler {
|
|
public:
|
|
enum {
|
|
MSG_TIMEOUT = 0,
|
|
MSG_ERROR,
|
|
MSG_STATE,
|
|
};
|
|
|
|
enum State {
|
|
STATE_INIT = 0,
|
|
STATE_SENTINITIATE, // sent initiate, waiting for Accept or Reject
|
|
STATE_RECEIVEDINITIATE, // received an initiate. Call Accept or Reject
|
|
STATE_SENTPRACCEPT, // sent provisional Accept
|
|
STATE_SENTACCEPT, // sent accept. begin connecting transport
|
|
STATE_RECEIVEDPRACCEPT, // received provisional Accept, waiting for Accept
|
|
STATE_RECEIVEDACCEPT, // received accept. begin connecting transport
|
|
STATE_SENTMODIFY, // sent modify, waiting for Accept or Reject
|
|
STATE_RECEIVEDMODIFY, // received modify, call Accept or Reject
|
|
STATE_SENTREJECT, // sent reject after receiving initiate
|
|
STATE_RECEIVEDREJECT, // received reject after sending initiate
|
|
STATE_SENTREDIRECT, // sent direct after receiving initiate
|
|
STATE_SENTTERMINATE, // sent terminate (any time / either side)
|
|
STATE_RECEIVEDTERMINATE, // received terminate (any time / either side)
|
|
STATE_INPROGRESS, // session accepted and in progress
|
|
STATE_DEINIT, // session is being destroyed
|
|
};
|
|
|
|
enum Error {
|
|
ERROR_NONE = 0, // no error
|
|
ERROR_TIME = 1, // no response to signaling
|
|
ERROR_RESPONSE = 2, // error during signaling
|
|
ERROR_NETWORK = 3, // network error, could not allocate network resources
|
|
ERROR_CONTENT = 4, // channel errors in SetLocalContent/SetRemoteContent
|
|
ERROR_TRANSPORT = 5, // transport error of some kind
|
|
};
|
|
|
|
// Convert State to a readable string.
|
|
static std::string StateToString(State state);
|
|
|
|
BaseSession(rtc::Thread* signaling_thread,
|
|
rtc::Thread* worker_thread,
|
|
PortAllocator* port_allocator,
|
|
const std::string& sid,
|
|
bool initiator);
|
|
virtual ~BaseSession();
|
|
|
|
// These are const to allow them to be called from const methods.
|
|
rtc::Thread* signaling_thread() const { return signaling_thread_; }
|
|
rtc::Thread* worker_thread() const { return worker_thread_; }
|
|
PortAllocator* port_allocator() const { return port_allocator_; }
|
|
|
|
// The ID of this session.
|
|
const std::string& id() const { return sid_; }
|
|
|
|
// Returns the application-level description given by our client.
|
|
// If we are the recipient, this will be NULL until we send an accept.
|
|
const SessionDescription* local_description() const;
|
|
|
|
// Returns the application-level description given by the other client.
|
|
// If we are the initiator, this will be NULL until we receive an accept.
|
|
const SessionDescription* remote_description() const;
|
|
|
|
SessionDescription* remote_description();
|
|
|
|
// Takes ownership of SessionDescription*
|
|
void set_local_description(const SessionDescription* sdesc);
|
|
|
|
// Takes ownership of SessionDescription*
|
|
void set_remote_description(SessionDescription* sdesc);
|
|
|
|
void set_initiator(bool initiator);
|
|
bool initiator() const { return initiator_; }
|
|
|
|
const SessionDescription* initiator_description() const;
|
|
|
|
// Returns the current state of the session. See the enum above for details.
|
|
// Each time the state changes, we will fire this signal.
|
|
State state() const { return state_; }
|
|
sigslot::signal2<BaseSession* , State> SignalState;
|
|
|
|
// Returns the last error in the session. See the enum above for details.
|
|
// Each time the an error occurs, we will fire this signal.
|
|
Error error() const { return error_; }
|
|
const std::string& error_desc() const { return error_desc_; }
|
|
sigslot::signal2<BaseSession* , Error> SignalError;
|
|
|
|
// Updates the state, signaling if necessary.
|
|
virtual void SetState(State state);
|
|
|
|
// Updates the error state, signaling if necessary.
|
|
// TODO(ronghuawu): remove the SetError method that doesn't take |error_desc|.
|
|
virtual void SetError(Error error, const std::string& error_desc);
|
|
|
|
void SetIceConnectionReceivingTimeout(int timeout_ms);
|
|
|
|
// Start gathering candidates for any new transports, or transports doing an
|
|
// ICE restart.
|
|
void MaybeStartGathering();
|
|
|
|
protected:
|
|
bool PushdownTransportDescription(ContentSource source,
|
|
ContentAction action,
|
|
std::string* error_desc);
|
|
|
|
// Handles messages posted to us.
|
|
virtual void OnMessage(rtc::Message *pmsg);
|
|
|
|
TransportController* transport_controller() {
|
|
return transport_controller_.get();
|
|
}
|
|
|
|
protected:
|
|
State state_;
|
|
Error error_;
|
|
std::string error_desc_;
|
|
|
|
private:
|
|
// Helper methods to push local and remote transport descriptions.
|
|
bool PushdownLocalTransportDescription(
|
|
const SessionDescription* sdesc, ContentAction action,
|
|
std::string* error_desc);
|
|
bool PushdownRemoteTransportDescription(
|
|
const SessionDescription* sdesc, ContentAction action,
|
|
std::string* error_desc);
|
|
|
|
// Log session state.
|
|
void LogState(State old_state, State new_state);
|
|
|
|
// Returns true and the TransportInfo of the given |content_name|
|
|
// from |description|. Returns false if it's not available.
|
|
static bool GetTransportDescription(const SessionDescription* description,
|
|
const std::string& content_name,
|
|
TransportDescription* info);
|
|
|
|
rtc::Thread* const signaling_thread_;
|
|
rtc::Thread* const worker_thread_;
|
|
PortAllocator* const port_allocator_;
|
|
const std::string sid_;
|
|
bool initiator_;
|
|
rtc::scoped_ptr<TransportController> transport_controller_;
|
|
rtc::scoped_ptr<const SessionDescription> local_description_;
|
|
rtc::scoped_ptr<SessionDescription> remote_description_;
|
|
};
|
|
|
|
} // namespace cricket
|
|
|
|
#endif // WEBRTC_P2P_BASE_SESSION_H_
|