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