OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/rtc_dtmf_sender_handler.h" | 5 #include "content/renderer/media/rtc_dtmf_sender_handler.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
| 9 #include "base/bind.h" |
| 10 #include "base/location.h" |
9 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop/message_loop_proxy.h" |
10 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/threading/thread_checker.h" |
11 | 15 |
12 using webrtc::DtmfSenderInterface; | 16 using webrtc::DtmfSenderInterface; |
13 | 17 |
14 namespace content { | 18 namespace content { |
15 | 19 |
| 20 class RtcDtmfSenderHandler::Observer : |
| 21 public base::RefCountedThreadSafe<Observer>, |
| 22 public webrtc::DtmfSenderObserverInterface { |
| 23 public: |
| 24 explicit Observer(const base::WeakPtr<RtcDtmfSenderHandler>& handler) |
| 25 : main_thread_(base::MessageLoopProxy::current()), handler_(handler) {} |
| 26 |
| 27 private: |
| 28 friend class base::RefCountedThreadSafe<Observer>; |
| 29 |
| 30 ~Observer() override {} |
| 31 |
| 32 void OnToneChange(const std::string& tone) override { |
| 33 main_thread_->PostTask(FROM_HERE, |
| 34 base::Bind(&RtcDtmfSenderHandler::Observer::OnToneChangeOnMainThread, |
| 35 this, tone)); |
| 36 } |
| 37 |
| 38 void OnToneChangeOnMainThread(const std::string& tone) { |
| 39 DCHECK(thread_checker_.CalledOnValidThread()); |
| 40 if (handler_) |
| 41 handler_->OnToneChange(tone); |
| 42 } |
| 43 |
| 44 base::ThreadChecker thread_checker_; |
| 45 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; |
| 46 base::WeakPtr<RtcDtmfSenderHandler> handler_; |
| 47 }; |
| 48 |
16 RtcDtmfSenderHandler::RtcDtmfSenderHandler(DtmfSenderInterface* dtmf_sender) | 49 RtcDtmfSenderHandler::RtcDtmfSenderHandler(DtmfSenderInterface* dtmf_sender) |
17 : dtmf_sender_(dtmf_sender), | 50 : dtmf_sender_(dtmf_sender), |
18 webkit_client_(NULL) { | 51 webkit_client_(NULL), |
| 52 weak_factory_(this), |
| 53 observer_(new Observer(weak_factory_.GetWeakPtr())) { |
19 DVLOG(1) << "::ctor"; | 54 DVLOG(1) << "::ctor"; |
20 dtmf_sender_->RegisterObserver(this); | 55 dtmf_sender_->RegisterObserver(observer_.get()); |
21 } | 56 } |
22 | 57 |
23 RtcDtmfSenderHandler::~RtcDtmfSenderHandler() { | 58 RtcDtmfSenderHandler::~RtcDtmfSenderHandler() { |
24 DVLOG(1) << "::dtor"; | 59 DVLOG(1) << "::dtor"; |
25 dtmf_sender_->UnregisterObserver(); | 60 dtmf_sender_->UnregisterObserver(); |
26 } | 61 } |
27 | 62 |
28 void RtcDtmfSenderHandler::setClient( | 63 void RtcDtmfSenderHandler::setClient( |
29 blink::WebRTCDTMFSenderHandlerClient* client) { | 64 blink::WebRTCDTMFSenderHandlerClient* client) { |
30 webkit_client_ = client; | 65 webkit_client_ = client; |
(...skipping 18 matching lines...) Expand all Loading... |
49 void RtcDtmfSenderHandler::OnToneChange(const std::string& tone) { | 84 void RtcDtmfSenderHandler::OnToneChange(const std::string& tone) { |
50 if (!webkit_client_) { | 85 if (!webkit_client_) { |
51 LOG(ERROR) << "WebRTCDTMFSenderHandlerClient not set."; | 86 LOG(ERROR) << "WebRTCDTMFSenderHandlerClient not set."; |
52 return; | 87 return; |
53 } | 88 } |
54 webkit_client_->didPlayTone(base::UTF8ToUTF16(tone)); | 89 webkit_client_->didPlayTone(base::UTF8ToUTF16(tone)); |
55 } | 90 } |
56 | 91 |
57 } // namespace content | 92 } // namespace content |
58 | 93 |
OLD | NEW |