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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ceb6ad9d76adaa46b4208d0a8890ec0418935a0b |
--- /dev/null |
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_session.cc |
@@ -0,0 +1,118 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "extensions/renderer/api/display_source/wifi_display/wifi_display_session.h" |
+ |
+#include "base/logging.h" |
+#include "base/timer/timer.h" |
+#include "content/public/common/service_registry.h" |
+#include "content/public/renderer/render_frame.h" |
+ |
+namespace { |
+const char kErrorInternal[] = "An internal error has occurred"; |
+} // namespace |
+ |
+namespace extensions { |
+ |
+using api::display_source::ErrorType; |
+ |
+WiFiDisplaySession::WiFiDisplaySession( |
+ const DisplaySourceSessionParams& params) |
+ : binding_(this), |
+ params_(params), |
+ weak_factory_(this) { |
+ DCHECK(params_.render_frame); |
+ params.render_frame->GetServiceRegistry()->ConnectToRemoteService( |
+ mojo::GetProxy(&service_)); |
+ service_.set_connection_error_handler(base::Bind( |
+ &WiFiDisplaySession::OnConnectionError, |
+ weak_factory_.GetWeakPtr())); |
+ |
+ WiFiDisplaySessionServiceClientPtr client_ptr; |
+ binding_.Bind(GetProxy(&client_ptr)); |
+ binding_.set_connection_error_handler(base::Bind( |
+ &WiFiDisplaySession::OnConnectionError, |
+ weak_factory_.GetWeakPtr())); |
+ DCHECK(client_ptr); |
+ service_->SetClient(std::move(client_ptr)); |
+} |
+ |
+WiFiDisplaySession::~WiFiDisplaySession() { |
+} |
+ |
+void WiFiDisplaySession::Start() { |
+ DCHECK(state_ == DisplaySourceSession::Idle); |
+ service_->Connect(params_.sink_id, params_.auth_method, params_.auth_data); |
+ state_ = DisplaySourceSession::Establishing; |
+} |
+ |
+void WiFiDisplaySession::Terminate() { |
+ DCHECK(state_ != DisplaySourceSession::Idle); |
+ switch (state_) { |
+ case DisplaySourceSession::Idle: |
+ case DisplaySourceSession::Terminating: |
+ // Nothing to do. |
+ return; |
+ case DisplaySourceSession::Establishing: |
+ case DisplaySourceSession::Established: |
+ service_->Disconnect(); |
+ state_ = DisplaySourceSession::Terminating; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+} |
+ |
+void WiFiDisplaySession::OnConnected( |
+ int32_t sink_id, const mojo::String& ip_address) { |
+ if (sink_id == params_.sink_id) { |
+ DCHECK(state_ != DisplaySourceSession::Established); |
+ ip_address_ = ip_address; |
+ state_ = DisplaySourceSession::Established; |
+ } |
+ |
+ if (!started_callback_.is_null()) |
+ started_callback_.Run(sink_id); |
+} |
+ |
+void WiFiDisplaySession::OnDisconnected(int32_t sink_id) { |
+ if (sink_id == params_.sink_id) { |
+ DCHECK(state_ == DisplaySourceSession::Established || |
+ state_ == DisplaySourceSession::Terminating); |
+ state_ = DisplaySourceSession::Idle; |
+ } |
+ |
+ if (!terminated_callback_.is_null()) |
+ terminated_callback_.Run(sink_id); |
+} |
+ |
+void WiFiDisplaySession::OnError( |
+ int32_t sink_id, int32_t type, const mojo::String& description) { |
+ DCHECK(type > api::display_source::ERROR_TYPE_NONE |
+ && type <= api::display_source::ERROR_TYPE_LAST); |
+ if (!error_callback_.is_null()) |
+ error_callback_.Run(sink_id, static_cast<ErrorType>(type), description); |
+} |
+ |
+void WiFiDisplaySession::OnMessage(const mojo::String& data) { |
+ DCHECK(state_ == DisplaySourceSession::Established); |
+} |
+ |
+void WiFiDisplaySession::OnConnectionError() { |
+ if (!error_callback_.is_null()) { |
+ error_callback_.Run(params_.sink_id, |
+ api::display_source::ERROR_TYPE_UNKNOWN_ERROR, |
+ kErrorInternal); |
+ } |
+ |
+ if (state_ == DisplaySourceSession::Established || |
+ state_ == DisplaySourceSession::Terminating) { |
+ // We must explicitly notify the session termination as it will never |
+ // arrive from browser process (IPC is broken). |
+ if (!terminated_callback_.is_null()) |
+ terminated_callback_.Run(params_.sink_id); |
+ } |
+} |
+ |
+} // namespace extensions |