| Index: remoting/protocol/pepper_transport_factory.cc
 | 
| diff --git a/remoting/protocol/pepper_stream_channel.cc b/remoting/protocol/pepper_transport_factory.cc
 | 
| similarity index 54%
 | 
| rename from remoting/protocol/pepper_stream_channel.cc
 | 
| rename to remoting/protocol/pepper_transport_factory.cc
 | 
| index 19c6bf5b18caa03e373221268dde7e92de5110b2..26e04cf49f8f9be0472ac86f569756bb52c34a13 100644
 | 
| --- a/remoting/protocol/pepper_stream_channel.cc
 | 
| +++ b/remoting/protocol/pepper_transport_factory.cc
 | 
| @@ -2,7 +2,7 @@
 | 
|  // Use of this source code is governed by a BSD-style license that can be
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
| -#include "remoting/protocol/pepper_stream_channel.h"
 | 
| +#include "remoting/protocol/pepper_transport_factory.h"
 | 
|  
 | 
|  #include "base/bind.h"
 | 
|  #include "crypto/hmac.h"
 | 
| @@ -18,6 +18,7 @@
 | 
|  #include "ppapi/cpp/var.h"
 | 
|  #include "remoting/protocol/channel_authenticator.h"
 | 
|  #include "remoting/protocol/pepper_session.h"
 | 
| +#include "remoting/protocol/pepper_transport_socket_adapter.h"
 | 
|  #include "remoting/protocol/transport_config.h"
 | 
|  #include "third_party/libjingle/source/talk/p2p/base/candidate.h"
 | 
|  
 | 
| @@ -35,35 +36,97 @@ const int kTcpAckDelayMilliseconds = 10;
 | 
|  const int kTcpReceiveBufferSize = 256 * 1024;
 | 
|  const int kTcpSendBufferSize = kTcpReceiveBufferSize + 30 * 1024;
 | 
|  
 | 
| -}  // namespace
 | 
| -
 | 
| -PepperStreamChannel::PepperStreamChannel(
 | 
| -    PepperSession* session,
 | 
| -    const std::string& name,
 | 
| -    const Session::StreamChannelCallback& callback)
 | 
| -    : session_(session),
 | 
| -      name_(name),
 | 
| -      callback_(callback),
 | 
| +class PepperStreamTransport : public StreamTransport,
 | 
| +                              public PepperTransportSocketAdapter::Observer {
 | 
| + public:
 | 
| +  PepperStreamTransport(pp::Instance* pp_instance);
 | 
| +  virtual ~PepperStreamTransport();
 | 
| +
 | 
| +  // StreamTransport interface.
 | 
| +  virtual void Initialize(
 | 
| +      const std::string& name,
 | 
| +      const TransportConfig& config,
 | 
| +      Transport::EventHandler* event_handler,
 | 
| +      scoped_ptr<ChannelAuthenticator> authenticator) OVERRIDE;
 | 
| +  virtual void Connect(
 | 
| +      const StreamTransport::ConnectedCallback& callback) OVERRIDE;
 | 
| +  virtual void AddRemoteCandidate(const cricket::Candidate& candidate) OVERRIDE;
 | 
| +  virtual const std::string& name() const OVERRIDE;
 | 
| +  virtual bool is_connected() const OVERRIDE;
 | 
| +
 | 
| +  // PepperTransportSocketAdapter::Observer interface.
 | 
| +  virtual void OnChannelDeleted() OVERRIDE;
 | 
| +  virtual void OnChannelNewLocalCandidate(
 | 
| +      const std::string& candidate) OVERRIDE;
 | 
| +
 | 
| + private:
 | 
| +  void OnP2PConnect(int result);
 | 
| +  void OnAuthenticationDone(net::Error error,
 | 
| +                            scoped_ptr<net::StreamSocket> socket);
 | 
| +
 | 
| +  void NotifyConnected(scoped_ptr<net::StreamSocket> socket);
 | 
| +  void NotifyConnectFailed();
 | 
| +
 | 
| +  pp::Instance* pp_instance_;
 | 
| +  std::string name_;
 | 
| +  TransportConfig config_;
 | 
| +  EventHandler* event_handler_;
 | 
| +  Session::StreamChannelCallback callback_;
 | 
| +  scoped_ptr<ChannelAuthenticator> authenticator_;
 | 
| +
 | 
| +  // We own |channel_| until it is connected. After that
 | 
| +  // |authenticator_| owns it.
 | 
| +  scoped_ptr<PepperTransportSocketAdapter> owned_channel_;
 | 
| +  PepperTransportSocketAdapter* channel_;
 | 
| +
 | 
| +  // Indicates that we've finished connecting.
 | 
| +  bool connected_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(PepperStreamTransport);
 | 
| +};
 | 
| +
 | 
| +PepperStreamTransport::PepperStreamTransport(pp::Instance* pp_instance)
 | 
| +    : pp_instance_(pp_instance),
 | 
| +      event_handler_(NULL),
 | 
|        channel_(NULL),
 | 
|        connected_(false) {
 | 
|  }
 | 
|  
 | 
| -PepperStreamChannel::~PepperStreamChannel() {
 | 
| -  session_->OnDeleteChannel(this);
 | 
| +PepperStreamTransport::~PepperStreamTransport() {
 | 
| +  DCHECK(event_handler_);
 | 
| +  event_handler_->OnChannelDeleted(this);
 | 
|    // Channel should be already destroyed if we were connected.
 | 
|    DCHECK(!connected_ || channel_ == NULL);
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::Connect(
 | 
| -    pp::Instance* pp_instance,
 | 
| -    const TransportConfig& transport_config,
 | 
| +void PepperStreamTransport::Initialize(
 | 
| +    const std::string& name,
 | 
| +    const TransportConfig& config,
 | 
| +    Transport::EventHandler* event_handler,
 | 
|      scoped_ptr<ChannelAuthenticator> authenticator) {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|  
 | 
| +  DCHECK(!name.empty());
 | 
| +  DCHECK(event_handler);
 | 
| +
 | 
| +  // Can be initialized only once.
 | 
| +  DCHECK(name_.empty());
 | 
| +
 | 
| +  name_ = name;
 | 
| +  config_ = config;
 | 
| +  event_handler_ = event_handler;
 | 
|    authenticator_ = authenticator.Pass();
 | 
| +}
 | 
| +
 | 
| +void PepperStreamTransport::Connect(
 | 
| +    const StreamTransport::ConnectedCallback& callback) {
 | 
| +  DCHECK(CalledOnValidThread());
 | 
| +
 | 
| +  // Initialize() must be called first.
 | 
| +  DCHECK(!name_.empty());
 | 
|  
 | 
|    pp::Transport_Dev* transport =
 | 
| -      new pp::Transport_Dev(pp_instance, name_.c_str(),
 | 
| +      new pp::Transport_Dev(pp_instance_, name_.c_str(),
 | 
|                              PP_TRANSPORTTYPE_STREAM);
 | 
|  
 | 
|    if (transport->SetProperty(PP_TRANSPORTPROPERTY_TCP_RECEIVE_WINDOW,
 | 
| @@ -85,22 +148,22 @@ void PepperStreamChannel::Connect(
 | 
|      LOG(ERROR) << "Failed to set TCP ACK delay.";
 | 
|    }
 | 
|  
 | 
| -  if (transport_config.nat_traversal) {
 | 
| +  if (config_.nat_traversal) {
 | 
|      if (transport->SetProperty(
 | 
|              PP_TRANSPORTPROPERTY_STUN_SERVER,
 | 
| -            pp::Var(transport_config.stun_server)) != PP_OK) {
 | 
| +            pp::Var(config_.stun_server)) != PP_OK) {
 | 
|        LOG(ERROR) << "Failed to set STUN server.";
 | 
|      }
 | 
|  
 | 
|      if (transport->SetProperty(
 | 
|              PP_TRANSPORTPROPERTY_RELAY_SERVER,
 | 
| -            pp::Var(transport_config.relay_server)) != PP_OK) {
 | 
| +            pp::Var(config_.relay_server)) != PP_OK) {
 | 
|        LOG(ERROR) << "Failed to set relay server.";
 | 
|      }
 | 
|  
 | 
|      if (transport->SetProperty(
 | 
|              PP_TRANSPORTPROPERTY_RELAY_PASSWORD,
 | 
| -            pp::Var(transport_config.relay_token)) != PP_OK) {
 | 
| +            pp::Var(config_.relay_token)) != PP_OK) {
 | 
|        LOG(ERROR) << "Failed to set relay token.";
 | 
|      }
 | 
|  
 | 
| @@ -119,30 +182,30 @@ void PepperStreamChannel::Connect(
 | 
|    channel_ = new PepperTransportSocketAdapter(transport, name_, this);
 | 
|    owned_channel_.reset(channel_);
 | 
|  
 | 
| -  int result = channel_->Connect(base::Bind(&PepperStreamChannel::OnP2PConnect,
 | 
| -                                            base::Unretained(this)));
 | 
| +  int result = channel_->Connect(
 | 
| +      base::Bind(&PepperStreamTransport::OnP2PConnect, base::Unretained(this)));
 | 
|    if (result != net::ERR_IO_PENDING)
 | 
|      OnP2PConnect(result);
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::AddRemoteCandidate(
 | 
| +void PepperStreamTransport::AddRemoteCandidate(
 | 
|      const cricket::Candidate& candidate) {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|    if (channel_)
 | 
|      channel_->AddRemoteCandidate(jingle_glue::SerializeP2PCandidate(candidate));
 | 
|  }
 | 
|  
 | 
| -const std::string& PepperStreamChannel::name() const {
 | 
| +const std::string& PepperStreamTransport::name() const {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|    return name_;
 | 
|  }
 | 
|  
 | 
| -bool PepperStreamChannel::is_connected() const {
 | 
| +bool PepperStreamTransport::is_connected() const {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|    return connected_;
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::OnChannelDeleted() {
 | 
| +void PepperStreamTransport::OnChannelDeleted() {
 | 
|    if (connected_) {
 | 
|      channel_ = NULL;
 | 
|      // The PepperTransportSocketAdapter is being deleted, so delete
 | 
| @@ -151,7 +214,7 @@ void PepperStreamChannel::OnChannelDeleted() {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::OnChannelNewLocalCandidate(
 | 
| +void PepperStreamTransport::OnChannelNewLocalCandidate(
 | 
|      const std::string& candidate) {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|  
 | 
| @@ -159,10 +222,10 @@ void PepperStreamChannel::OnChannelNewLocalCandidate(
 | 
|    if (!jingle_glue::DeserializeP2PCandidate(candidate, &candidate_value)) {
 | 
|      LOG(ERROR) << "Failed to parse candidate " << candidate;
 | 
|    }
 | 
| -  session_->AddLocalCandidate(candidate_value);
 | 
| +  event_handler_->OnChannelCandidate(this, candidate_value);
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::OnP2PConnect(int result) {
 | 
| +void PepperStreamTransport::OnP2PConnect(int result) {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|  
 | 
|    if (result != net::OK)
 | 
| @@ -170,12 +233,12 @@ void PepperStreamChannel::OnP2PConnect(int result) {
 | 
|  
 | 
|    authenticator_->SecureAndAuthenticate(
 | 
|        owned_channel_.PassAs<net::StreamSocket>(),
 | 
| -      base::Bind(&PepperStreamChannel::OnAuthenticationDone,
 | 
| +      base::Bind(&PepperStreamTransport::OnAuthenticationDone,
 | 
|                   base::Unretained(this)));
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void PepperStreamChannel::OnAuthenticationDone(
 | 
| +void PepperStreamTransport::OnAuthenticationDone(
 | 
|      net::Error error, scoped_ptr<net::StreamSocket> socket) {
 | 
|    DCHECK(CalledOnValidThread());
 | 
|    if (error != net::OK) {
 | 
| @@ -186,14 +249,14 @@ void PepperStreamChannel::OnAuthenticationDone(
 | 
|    NotifyConnected(socket.Pass());
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::NotifyConnected(
 | 
| +void PepperStreamTransport::NotifyConnected(
 | 
|      scoped_ptr<net::StreamSocket> socket) {
 | 
|    DCHECK(!connected_);
 | 
|    callback_.Run(socket.Pass());
 | 
|    connected_ = true;
 | 
|  }
 | 
|  
 | 
| -void PepperStreamChannel::NotifyConnectFailed() {
 | 
| +void PepperStreamTransport::NotifyConnectFailed() {
 | 
|    channel_ = NULL;
 | 
|    owned_channel_.reset();
 | 
|    authenticator_.reset();
 | 
| @@ -201,5 +264,25 @@ void PepperStreamChannel::NotifyConnectFailed() {
 | 
|    NotifyConnected(scoped_ptr<net::StreamSocket>(NULL));
 | 
|  }
 | 
|  
 | 
| +}  // namespace
 | 
| +
 | 
| +PepperTransportFactory::PepperTransportFactory(
 | 
| +    pp::Instance* pp_instance)
 | 
| +    : pp_instance_(pp_instance) {
 | 
| +}
 | 
| +
 | 
| +PepperTransportFactory::~PepperTransportFactory() {
 | 
| +}
 | 
| +
 | 
| +scoped_ptr<StreamTransport> PepperTransportFactory::CreateStreamTransport() {
 | 
| +  return scoped_ptr<StreamTransport>(new PepperStreamTransport(pp_instance_));
 | 
| +}
 | 
| +
 | 
| +scoped_ptr<DatagramTransport>
 | 
| +PepperTransportFactory::CreateDatagramTransport() {
 | 
| +  NOTIMPLEMENTED();
 | 
| +  return scoped_ptr<DatagramTransport>(NULL);
 | 
| +}
 | 
| +
 | 
|  }  // namespace protocol
 | 
|  }  // namespace remoting
 | 
| 
 |