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