Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Unified Diff: remoting/host/host_user_interface.cc

Issue 10384127: Chromoting: the Me2me host now presents a notification on the console allowing a user to disconnect… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Unix-line endings. The license text. Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/host_user_interface.h ('k') | remoting/host/it2me_host_user_interface.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/host_user_interface.cc
diff --git a/remoting/host/host_user_interface.cc b/remoting/host/host_user_interface.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0009ea0013130ec52e0af6ea5a1e1f3a0b48b90d
--- /dev/null
+++ b/remoting/host/host_user_interface.cc
@@ -0,0 +1,150 @@
+// Copyright (c) 2012 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 "remoting/host/host_user_interface.h"
+
+#include "base/bind.h"
+#include "remoting/host/chromoting_host.h"
+#include "remoting/host/chromoting_host_context.h"
+#include "remoting/host/disconnect_window.h"
+#include "remoting/host/local_input_monitor.h"
+
+namespace remoting {
+
+HostUserInterface::HostUserInterface(ChromotingHostContext* context)
+ : host_(NULL),
+ context_(context),
+ is_monitoring_local_inputs_(false),
+ ui_thread_proxy_(context->ui_message_loop()) {
+}
+
+HostUserInterface::~HostUserInterface() {
+ DCHECK(ui_message_loop()->BelongsToCurrentThread());
+
+ MonitorLocalInputs(false);
+ ShowDisconnectWindow(false, std::string());
+
+ ui_thread_proxy_.Detach();
+}
+
+void HostUserInterface::Start(ChromotingHost* host,
+ const base::Closure& disconnect_callback) {
+ DCHECK(network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_ == NULL);
+ DCHECK(disconnect_callback_.is_null());
+
+ host_ = host;
+ disconnect_callback_ = disconnect_callback;
+ disconnect_window_ = DisconnectWindow::Create();
+ local_input_monitor_ = LocalInputMonitor::Create();
+ host_->AddStatusObserver(this);
+}
+
+void HostUserInterface::OnClientAuthenticated(const std::string& jid) {
+ authenticated_jid_ = jid;
+
+ std::string username = jid.substr(0, jid.find('/'));
+ ui_thread_proxy_.PostTask(FROM_HERE, base::Bind(
+ &HostUserInterface::ProcessOnClientAuthenticated,
+ base::Unretained(this), username));
+}
+
+void HostUserInterface::OnClientDisconnected(const std::string& jid) {
+ if (jid == authenticated_jid_) {
+ ui_thread_proxy_.PostTask(FROM_HERE, base::Bind(
+ &HostUserInterface::ProcessOnClientDisconnected,
+ base::Unretained(this)));
+ }
+}
+
+void HostUserInterface::OnAccessDenied(const std::string& jid) {
+}
+
+void HostUserInterface::OnShutdown() {
+ // Host status observers must be removed on the network thread, so
+ // it must happen here instead of in the destructor.
+ host_->RemoveStatusObserver(this);
+ host_ = NULL;
+ disconnect_callback_ = base::Closure();
+}
+
+void HostUserInterface::OnDisconnectCallback() {
+ DCHECK(ui_message_loop()->BelongsToCurrentThread());
+ DCHECK(!disconnect_callback_.is_null());
+
+ MonitorLocalInputs(false);
+ ShowDisconnectWindow(false, std::string());
+ disconnect_callback_.Run();
+}
+
+base::MessageLoopProxy* HostUserInterface::network_message_loop() const {
+ return context_->network_message_loop();
+}
+base::MessageLoopProxy* HostUserInterface::ui_message_loop() const {
+ return context_->ui_message_loop();
+}
+
+void HostUserInterface::DisconnectSession() const {
+ return disconnect_callback_.Run();
+}
+
+void HostUserInterface::ProcessOnClientAuthenticated(
+ const std::string& username) {
+ DCHECK(ui_message_loop()->BelongsToCurrentThread());
+
+ MonitorLocalInputs(true);
+ ShowDisconnectWindow(true, username);
+}
+
+void HostUserInterface::ProcessOnClientDisconnected() {
+ DCHECK(ui_message_loop()->BelongsToCurrentThread());
+
+ MonitorLocalInputs(false);
+ ShowDisconnectWindow(false, std::string());
+}
+
+void HostUserInterface::StartForTest(
+ ChromotingHost* host,
+ const base::Closure& disconnect_callback,
+ scoped_ptr<DisconnectWindow> disconnect_window,
+ scoped_ptr<LocalInputMonitor> local_input_monitor) {
+ DCHECK(network_message_loop()->BelongsToCurrentThread());
+ DCHECK(host_ == NULL);
+ DCHECK(disconnect_callback_.is_null());
+
+ host_ = host;
+ disconnect_callback_ = disconnect_callback;
+ disconnect_window_ = disconnect_window.Pass();
+ local_input_monitor_ = local_input_monitor.Pass();
+}
+
+void HostUserInterface::MonitorLocalInputs(bool enable) {
+ DCHECK(ui_message_loop()->BelongsToCurrentThread());
+
+ if (enable != is_monitoring_local_inputs_) {
+ if (enable) {
+ local_input_monitor_->Start(host_);
+ } else {
+ local_input_monitor_->Stop();
+ }
+ is_monitoring_local_inputs_ = enable;
+ }
+}
+
+void HostUserInterface::ShowDisconnectWindow(bool show,
+ const std::string& username) {
+ DCHECK(ui_message_loop()->BelongsToCurrentThread());
+
+ if (show) {
+ disconnect_window_->Show(
+ host_,
+ base::Bind(&HostUserInterface::OnDisconnectCallback,
+ base::Unretained(this)),
+ username);
+ } else {
+ disconnect_window_->Hide();
+ }
+}
+
+} // namespace remoting
« no previous file with comments | « remoting/host/host_user_interface.h ('k') | remoting/host/it2me_host_user_interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698