Chromium Code Reviews| Index: extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc |
| diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc |
| index f6d1104fd7ddf10170690c1efd65126fec35d275..4c267d3268c24bfc96f6296e0c89eb1969b22cd4 100644 |
| --- a/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc |
| +++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc |
| @@ -8,9 +8,23 @@ |
| #include "base/timer/timer.h" |
| #include "content/public/common/service_registry.h" |
| #include "content/public/renderer/render_frame.h" |
| +#include "extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.h" |
| +#include "third_party/wds/src/libwds/public/logging.h" |
| +#include "third_party/wds/src/libwds/public/media_manager.h" |
| namespace { |
| const char kErrorInternal[] = "An internal error has occurred"; |
| +const char kErrorTimeout[] = "Sink became unresponsive"; |
| + |
| +static void LogWDSError(const char* format, ...) { |
| + va_list args; |
| + va_start(args, format); |
| + char buffer[256]; |
| + vsnprintf(buffer, 256, format, args); |
| + va_end(args); |
| + LOG(ERROR) << "[WDS] " << buffer; |
|
asargent_no_longer_on_chrome
2016/02/25 22:09:39
nit: the general policy is not to leave in logging
|
| +} |
| + |
| } // namespace |
| namespace extensions { |
| @@ -21,17 +35,20 @@ WiFiDisplaySession::WiFiDisplaySession( |
| const DisplaySourceSessionParams& params) |
| : binding_(this), |
| params_(params), |
| + cseq_(0), |
| + timer_id_(0), |
| weak_factory_(this) { |
| DCHECK(params_.render_frame); |
| + wds::LogSystem::set_error_func(&LogWDSError); |
| params.render_frame->GetServiceRegistry()->ConnectToRemoteService( |
| mojo::GetProxy(&service_)); |
| service_.set_connection_error_handler(base::Bind( |
| - &WiFiDisplaySession::OnConnectionError, |
| + &WiFiDisplaySession::OnIPCConnectionError, |
| weak_factory_.GetWeakPtr())); |
| service_->SetClient(binding_.CreateInterfacePtrAndBind()); |
| binding_.set_connection_error_handler(base::Bind( |
| - &WiFiDisplaySession::OnConnectionError, |
| + &WiFiDisplaySession::OnIPCConnectionError, |
| weak_factory_.GetWeakPtr())); |
| } |
| @@ -66,12 +83,17 @@ void WiFiDisplaySession::Terminate() { |
| void WiFiDisplaySession::OnEstablished(const mojo::String& ip_address) { |
| DCHECK(state_ != DisplaySourceSession::Established); |
| ip_address_ = ip_address; |
| + media_manager_.reset(new WiFiDisplayMediaManager()); |
| + wfd_source_.reset(wds::Source::Create(this, media_manager_.get(), this)); |
| + wfd_source_->Start(); |
| state_ = DisplaySourceSession::Established; |
| } |
| void WiFiDisplaySession::OnTerminated() { |
| DCHECK(state_ != DisplaySourceSession::Idle); |
| state_ = DisplaySourceSession::Idle; |
| + media_manager_.reset(); |
| + wfd_source_.reset(); |
| if (!terminated_callback_.is_null()) |
| terminated_callback_.Run(params_.sink_id); |
| } |
| @@ -87,9 +109,63 @@ void WiFiDisplaySession::OnError(int32_t type, |
| void WiFiDisplaySession::OnMessage(const mojo::String& data) { |
| DCHECK(state_ == DisplaySourceSession::Established); |
| + DCHECK(wfd_source_); |
| + wfd_source_->RTSPDataReceived(data); |
| +} |
| + |
| +std::string WiFiDisplaySession::GetLocalIPAddress() const { |
| + return ip_address_; |
| +} |
| + |
| +int WiFiDisplaySession::GetNextCSeq(int* initial_peer_cseq) const { |
| + return ++cseq_; |
| +} |
| + |
| +void WiFiDisplaySession::SendRTSPData(const std::string& message) { |
| + service_->SendMessage(message); |
| +} |
| + |
| +unsigned WiFiDisplaySession::CreateTimer(int seconds) { |
| + scoped_ptr<base::Timer> timer(new base::Timer(true, true)); |
| + auto insert_ret = timers_.insert( |
| + std::pair<unsigned, scoped_ptr<base::Timer>>( |
| + ++timer_id_, std::move(timer))); |
| + DCHECK(insert_ret.second); |
| + timer->Start(FROM_HERE, |
| + base::TimeDelta::FromSeconds(seconds), |
| + base::Bind(&wds::Source::OnTimerEvent, |
| + base::Unretained(wfd_source_.get()), |
| + timer_id_)); |
| + return timer_id_; |
| +} |
| + |
| +void WiFiDisplaySession::ReleaseTimer(unsigned timer_id) { |
| + auto it = timers_.find(timer_id); |
| + if (it != timers_.end()) |
| + timers_.erase(it); |
| +} |
| + |
| +void WiFiDisplaySession::ErrorOccurred(wds::ErrorType error) { |
| + if (!error_callback_.is_null()) { |
| + if (error == wds::TimeoutError) { |
| + error_callback_.Run(params_.sink_id, |
| + api::display_source::ERROR_TYPE_TIMEOUT_ERROR, |
| + kErrorTimeout); |
| + } else { |
| + error_callback_.Run(params_.sink_id, |
| + api::display_source::ERROR_TYPE_UNKNOWN_ERROR, |
| + kErrorInternal); |
| + } |
| + } |
| + |
| + Terminate(); |
| +} |
| + |
| +void WiFiDisplaySession::SessionCompleted() { |
| + Terminate(); |
| } |
| -void WiFiDisplaySession::OnConnectionError() { |
| +void WiFiDisplaySession::OnIPCConnectionError() { |
| if (!error_callback_.is_null()) { |
| error_callback_.Run(params_.sink_id, |
| api::display_source::ERROR_TYPE_UNKNOWN_ERROR, |