Home | History | Annotate | Download | only in media
      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 "content/renderer/media/rtc_data_channel_handler.h"
      6 
      7 #include <string>
      8 
      9 #include "base/logging.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 
     12 namespace content {
     13 
     14 RtcDataChannelHandler::RtcDataChannelHandler(
     15     webrtc::DataChannelInterface* channel)
     16     : channel_(channel),
     17       webkit_client_(NULL) {
     18   DVLOG(1) << "::ctor";
     19   channel_->RegisterObserver(this);
     20 }
     21 
     22 RtcDataChannelHandler::~RtcDataChannelHandler() {
     23   DVLOG(1) << "::dtor";
     24   channel_->UnregisterObserver();
     25 }
     26 
     27 void RtcDataChannelHandler::setClient(
     28     WebKit::WebRTCDataChannelHandlerClient* client) {
     29   webkit_client_ = client;
     30 }
     31 
     32 WebKit::WebString RtcDataChannelHandler::label() {
     33   return UTF8ToUTF16(channel_->label());
     34 }
     35 
     36 bool RtcDataChannelHandler::isReliable() {
     37   return channel_->reliable();
     38 }
     39 
     40 unsigned long RtcDataChannelHandler::bufferedAmount() {
     41   return channel_->buffered_amount();
     42 }
     43 
     44 bool RtcDataChannelHandler::sendStringData(const WebKit::WebString& data) {
     45   std::string utf8_buffer = UTF16ToUTF8(data);
     46   talk_base::Buffer buffer(utf8_buffer.c_str(), utf8_buffer.length());
     47   webrtc::DataBuffer data_buffer(buffer, false);
     48   return channel_->Send(data_buffer);
     49 }
     50 
     51 bool RtcDataChannelHandler::sendRawData(const char* data, size_t length) {
     52   talk_base::Buffer buffer(data, length);
     53   webrtc::DataBuffer data_buffer(buffer, true);
     54   return channel_->Send(data_buffer);
     55 }
     56 
     57 void RtcDataChannelHandler::close() {
     58   channel_->Close();
     59 }
     60 
     61 void RtcDataChannelHandler::OnStateChange() {
     62   if (!webkit_client_) {
     63     LOG(ERROR) << "WebRTCDataChannelHandlerClient not set.";
     64     return;
     65   }
     66   DVLOG(1) << "OnStateChange " << channel_->state();
     67   switch (channel_->state()) {
     68     case webrtc::DataChannelInterface::kConnecting:
     69       webkit_client_->didChangeReadyState(
     70           WebKit::WebRTCDataChannelHandlerClient::ReadyStateConnecting);
     71       break;
     72     case webrtc::DataChannelInterface::kOpen:
     73       webkit_client_->didChangeReadyState(
     74           WebKit::WebRTCDataChannelHandlerClient::ReadyStateOpen);
     75       break;
     76     case webrtc::DataChannelInterface::kClosing:
     77       webkit_client_->didChangeReadyState(
     78           WebKit::WebRTCDataChannelHandlerClient::ReadyStateClosing);
     79       break;
     80     case webrtc::DataChannelInterface::kClosed:
     81       webkit_client_->didChangeReadyState(
     82           WebKit::WebRTCDataChannelHandlerClient::ReadyStateClosed);
     83       break;
     84     default:
     85       NOTREACHED();
     86       break;
     87   }
     88 }
     89 
     90 void RtcDataChannelHandler::OnMessage(const webrtc::DataBuffer& buffer) {
     91   if (!webkit_client_) {
     92     LOG(ERROR) << "WebRTCDataChannelHandlerClient not set.";
     93     return;
     94   }
     95 
     96   if (buffer.binary) {
     97     webkit_client_->didReceiveRawData(buffer.data.data(), buffer.data.length());
     98   } else {
     99     string16 utf16;
    100     if (!UTF8ToUTF16(buffer.data.data(), buffer.data.length(), &utf16)) {
    101       LOG(ERROR) << "Failed convert received data to UTF16";
    102       return;
    103     }
    104     webkit_client_->didReceiveStringData(utf16);
    105   }
    106 }
    107 
    108 }  // namespace content
    109