Home | History | Annotate | Download | only in protocol
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "remoting/protocol/protobuf_video_writer.h"
      6 
      7 #include "base/bind.h"
      8 #include "net/socket/stream_socket.h"
      9 #include "remoting/base/constants.h"
     10 #include "remoting/proto/video.pb.h"
     11 #include "remoting/protocol/channel_factory.h"
     12 #include "remoting/protocol/session.h"
     13 #include "remoting/protocol/util.h"
     14 
     15 namespace remoting {
     16 namespace protocol {
     17 
     18 ProtobufVideoWriter::ProtobufVideoWriter()
     19     : channel_factory_(NULL) {
     20 }
     21 
     22 ProtobufVideoWriter::~ProtobufVideoWriter() {
     23   Close();
     24 }
     25 
     26 void ProtobufVideoWriter::Init(protocol::Session* session,
     27                                const InitializedCallback& callback) {
     28   channel_factory_ = session->GetTransportChannelFactory();
     29   initialized_callback_ = callback;
     30 
     31   channel_factory_->CreateStreamChannel(
     32       kVideoChannelName,
     33       base::Bind(&ProtobufVideoWriter::OnChannelReady, base::Unretained(this)));
     34 }
     35 
     36 void ProtobufVideoWriter::OnChannelReady(scoped_ptr<net::StreamSocket> socket) {
     37   if (!socket.get()) {
     38     initialized_callback_.Run(false);
     39     return;
     40   }
     41 
     42   DCHECK(!channel_.get());
     43   channel_ = socket.Pass();
     44   // TODO(sergeyu): Provide WriteFailedCallback for the buffered writer.
     45   buffered_writer_.Init(
     46       channel_.get(), BufferedSocketWriter::WriteFailedCallback());
     47 
     48   initialized_callback_.Run(true);
     49 }
     50 
     51 void ProtobufVideoWriter::Close() {
     52   buffered_writer_.Close();
     53   channel_.reset();
     54   if (channel_factory_) {
     55     channel_factory_->CancelChannelCreation(kVideoChannelName);
     56     channel_factory_ = NULL;
     57   }
     58 }
     59 
     60 bool ProtobufVideoWriter::is_connected() {
     61   return channel_.get() != NULL;
     62 }
     63 
     64 void ProtobufVideoWriter::ProcessVideoPacket(scoped_ptr<VideoPacket> packet,
     65                                              const base::Closure& done) {
     66   buffered_writer_.Write(SerializeAndFrameMessage(*packet), done);
     67 }
     68 
     69 }  // namespace protocol
     70 }  // namespace remoting
     71