Home | History | Annotate | Download | only in media
      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