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
12ChromeWebRtcLogMessageDelegate::ChromeWebRtcLogMessageDelegate(
13    const scoped_refptr<base::MessageLoopProxy>& io_message_loop,
14    WebRtcLoggingMessageFilter* message_filter)
15    : io_message_loop_(io_message_loop),
16      logging_started_(false),
17      message_filter_(message_filter) {
18  content::InitWebRtcLoggingDelegate(this);
19}
20
21ChromeWebRtcLogMessageDelegate::~ChromeWebRtcLogMessageDelegate() {
22  DCHECK(CalledOnValidThread());
23}
24
25void ChromeWebRtcLogMessageDelegate::LogMessage(const std::string& message) {
26  WebRtcLoggingMessageData data(base::Time::Now(), message);
27
28  io_message_loop_->PostTask(
29      FROM_HERE, base::Bind(
30          &ChromeWebRtcLogMessageDelegate::LogMessageOnIOThread,
31          base::Unretained(this),
32          data));
33}
34
35void ChromeWebRtcLogMessageDelegate::LogMessageOnIOThread(
36    const WebRtcLoggingMessageData& message) {
37  DCHECK(CalledOnValidThread());
38
39  if (logging_started_ && message_filter_) {
40    if (!log_buffer_.empty()) {
41      // A delayed task has already been posted for sending the buffer contents.
42      // Just add the message to the buffer.
43      log_buffer_.push_back(message);
44      return;
45    }
46
47    log_buffer_.push_back(message);
48
49    if (base::TimeTicks::Now() - last_log_buffer_send_ >
50        base::TimeDelta::FromMilliseconds(100)) {
51      SendLogBuffer();
52    } else {
53      io_message_loop_->PostDelayedTask(
54          FROM_HERE,
55          base::Bind(&ChromeWebRtcLogMessageDelegate::SendLogBuffer,
56                     base::Unretained(this)),
57          base::TimeDelta::FromMilliseconds(200));
58    }
59  }
60}
61
62void ChromeWebRtcLogMessageDelegate::OnFilterRemoved() {
63  DCHECK(CalledOnValidThread());
64  message_filter_ = NULL;
65}
66
67void ChromeWebRtcLogMessageDelegate::OnStartLogging() {
68  DCHECK(CalledOnValidThread());
69  logging_started_ = true;
70  content::InitWebRtcLogging();
71}
72
73void ChromeWebRtcLogMessageDelegate::OnStopLogging() {
74  DCHECK(CalledOnValidThread());
75  if (!log_buffer_.empty())
76    SendLogBuffer();
77  if (message_filter_)
78    message_filter_->LoggingStopped();
79  logging_started_ = false;
80}
81
82void ChromeWebRtcLogMessageDelegate::SendLogBuffer() {
83  DCHECK(CalledOnValidThread());
84  if (logging_started_ && message_filter_) {
85    message_filter_->AddLogMessages(log_buffer_);
86    last_log_buffer_send_ = base::TimeTicks::Now();
87  }
88  log_buffer_.clear();
89}
90