1 // Copyright 2013 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 "chrome/renderer/media/chrome_webrtc_log_message_delegate.h" 6 7 #include "base/logging.h" 8 #include "base/message_loop/message_loop_proxy.h" 9 #include "chrome/common/partial_circular_buffer.h" 10 #include "chrome/renderer/media/webrtc_logging_message_filter.h" 11 12 ChromeWebRtcLogMessageDelegate::ChromeWebRtcLogMessageDelegate( 13 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, 14 WebRtcLoggingMessageFilter* message_filter) 15 : io_message_loop_(io_message_loop), 16 message_filter_(message_filter), 17 log_initialized_(false) { 18 content::InitWebRtcLoggingDelegate(this); 19 } 20 21 ChromeWebRtcLogMessageDelegate::~ChromeWebRtcLogMessageDelegate() { 22 DCHECK(CalledOnValidThread()); 23 } 24 25 void ChromeWebRtcLogMessageDelegate::InitLogging( 26 const std::string& app_session_id, 27 const std::string& app_url) { 28 DCHECK(CalledOnValidThread()); 29 30 if (!log_initialized_) { 31 log_initialized_ = true; 32 message_filter_->InitLogging(app_session_id, app_url); 33 } 34 } 35 36 void ChromeWebRtcLogMessageDelegate::LogMessage(const std::string& message) { 37 if (!CalledOnValidThread()) { 38 io_message_loop_->PostTask( 39 FROM_HERE, base::Bind( 40 &ChromeWebRtcLogMessageDelegate::LogMessage, 41 base::Unretained(this), 42 message)); 43 return; 44 } 45 46 if (circular_buffer_) { 47 circular_buffer_->Write(message.c_str(), message.length()); 48 const char eol = '\n'; 49 circular_buffer_->Write(&eol, 1); 50 } 51 } 52 53 void ChromeWebRtcLogMessageDelegate::OnFilterRemoved() { 54 DCHECK(CalledOnValidThread()); 55 message_filter_ = NULL; 56 } 57 58 void ChromeWebRtcLogMessageDelegate::OnLogOpened( 59 base::SharedMemoryHandle handle, 60 uint32 length) { 61 DCHECK(CalledOnValidThread()); 62 63 shared_memory_.reset(new base::SharedMemory(handle, false)); 64 CHECK(shared_memory_->Map(length)); 65 circular_buffer_.reset( 66 new PartialCircularBuffer(shared_memory_->memory(), 67 length, 68 length / 2, 69 true)); 70 } 71 72 void ChromeWebRtcLogMessageDelegate::OnOpenLogFailed() { 73 DCHECK(CalledOnValidThread()); 74 DLOG(ERROR) << "Could not open log."; 75 // TODO(grunell): Implement. 76 NOTIMPLEMENTED(); 77 } 78