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/webrtc_logging_message_filter.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/message_loop/message_loop_proxy.h"
      9 #include "chrome/common/media/webrtc_logging_messages.h"
     10 #include "chrome/renderer/media/chrome_webrtc_log_message_delegate.h"
     11 #include "ipc/ipc_logging.h"
     12 
     13 WebRtcLoggingMessageFilter::WebRtcLoggingMessageFilter(
     14     const scoped_refptr<base::MessageLoopProxy>& io_message_loop)
     15     : log_message_delegate_(NULL),
     16       io_message_loop_(io_message_loop),
     17       channel_(NULL) {
     18   io_message_loop_->PostTask(
     19       FROM_HERE, base::Bind(
     20           &WebRtcLoggingMessageFilter::CreateLoggingHandler,
     21           base::Unretained(this)));
     22 }
     23 
     24 WebRtcLoggingMessageFilter::~WebRtcLoggingMessageFilter() {
     25 }
     26 
     27 bool WebRtcLoggingMessageFilter::OnMessageReceived(
     28     const IPC::Message& message) {
     29   DCHECK(io_message_loop_->BelongsToCurrentThread());
     30   bool handled = true;
     31   IPC_BEGIN_MESSAGE_MAP(WebRtcLoggingMessageFilter, message)
     32     IPC_MESSAGE_HANDLER(WebRtcLoggingMsg_LogOpened, OnLogOpened)
     33     IPC_MESSAGE_HANDLER(WebRtcLoggingMsg_OpenLogFailed, OnOpenLogFailed)
     34     IPC_MESSAGE_UNHANDLED(handled = false)
     35   IPC_END_MESSAGE_MAP()
     36   return handled;
     37 }
     38 
     39 void WebRtcLoggingMessageFilter::OnFilterAdded(IPC::Channel* channel) {
     40   DCHECK(io_message_loop_->BelongsToCurrentThread());
     41   channel_ = channel;
     42 }
     43 
     44 void WebRtcLoggingMessageFilter::OnFilterRemoved() {
     45   DCHECK(io_message_loop_->BelongsToCurrentThread());
     46   channel_ = NULL;
     47   log_message_delegate_->OnFilterRemoved();
     48 }
     49 
     50 void WebRtcLoggingMessageFilter::OnChannelClosing() {
     51   DCHECK(io_message_loop_->BelongsToCurrentThread());
     52   channel_ = NULL;
     53   log_message_delegate_->OnFilterRemoved();
     54 }
     55 
     56 void WebRtcLoggingMessageFilter::InitLogging(
     57     const std::string& app_session_id,
     58     const std::string& app_url) {
     59   DCHECK(io_message_loop_->BelongsToCurrentThread());
     60   Send(new WebRtcLoggingMsg_OpenLog(app_session_id, app_url));
     61 }
     62 
     63 void WebRtcLoggingMessageFilter::CreateLoggingHandler() {
     64   DCHECK(io_message_loop_->BelongsToCurrentThread());
     65   log_message_delegate_ =
     66       new ChromeWebRtcLogMessageDelegate(io_message_loop_, this);
     67 }
     68 
     69 void WebRtcLoggingMessageFilter::OnLogOpened(
     70     base::SharedMemoryHandle handle,
     71     uint32 length) {
     72   DCHECK(io_message_loop_->BelongsToCurrentThread());
     73   log_message_delegate_->OnLogOpened(handle, length);
     74 }
     75 
     76 void WebRtcLoggingMessageFilter::OnOpenLogFailed() {
     77   DCHECK(io_message_loop_->BelongsToCurrentThread());
     78   log_message_delegate_->OnOpenLogFailed();
     79 }
     80 
     81 void WebRtcLoggingMessageFilter::Send(IPC::Message* message) {
     82   DCHECK(io_message_loop_->BelongsToCurrentThread());
     83   if (!channel_) {
     84     DLOG(ERROR) << "IPC channel not available.";
     85     delete message;
     86   } else {
     87     channel_->Send(message);
     88   }
     89 }
     90