| // Copyright 2014 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/it2me/it2me_confirmation_dialog_proxy.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/callback_helpers.h" | 
 | #include "base/location.h" | 
 | #include "base/macros.h" | 
 | #include "base/threading/thread_task_runner_handle.h" | 
 |  | 
 | namespace remoting { | 
 |  | 
 | class It2MeConfirmationDialogProxy::Core { | 
 |  public: | 
 |   Core(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, | 
 |        scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 
 |        base::WeakPtr<It2MeConfirmationDialogProxy> parent, | 
 |        std::unique_ptr<It2MeConfirmationDialog> dialog); | 
 |   ~Core(); | 
 |  | 
 |   // Shows the wrapped dialog. Must be called on the UI thread. | 
 |   void Show(const std::string& remote_user_email); | 
 |  | 
 |   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() { | 
 |     return ui_task_runner_; | 
 |   } | 
 |  | 
 |   scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner() { | 
 |     return caller_task_runner_; | 
 |   } | 
 |  | 
 |  private: | 
 |   // Reports the dialog result on the caller's thread. | 
 |   void ReportResult(It2MeConfirmationDialog::Result result); | 
 |  | 
 |   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; | 
 |   scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; | 
 |   base::WeakPtr<It2MeConfirmationDialogProxy> parent_; | 
 |   std::unique_ptr<It2MeConfirmationDialog> dialog_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(Core); | 
 | }; | 
 |  | 
 | It2MeConfirmationDialogProxy::Core::Core( | 
 |     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, | 
 |     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 
 |     base::WeakPtr<It2MeConfirmationDialogProxy> parent, | 
 |     std::unique_ptr<It2MeConfirmationDialog> dialog) | 
 |     : ui_task_runner_(ui_task_runner), | 
 |       caller_task_runner_(caller_task_runner), | 
 |       parent_(parent), | 
 |       dialog_(std::move(dialog)) {} | 
 |  | 
 | It2MeConfirmationDialogProxy::Core::~Core() { | 
 |   DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 
 | } | 
 |  | 
 | void It2MeConfirmationDialogProxy::Core::Show( | 
 |     const std::string& remote_user_email) { | 
 |   DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 
 |  | 
 |   dialog_->Show(remote_user_email, | 
 |                 base::Bind(&It2MeConfirmationDialogProxy::Core::ReportResult, | 
 |                            base::Unretained(this))); | 
 | } | 
 |  | 
 | void It2MeConfirmationDialogProxy::Core::ReportResult( | 
 |     It2MeConfirmationDialog::Result result) { | 
 |   DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 
 |   caller_task_runner_->PostTask( | 
 |       FROM_HERE, | 
 |       base::Bind(&It2MeConfirmationDialogProxy::ReportResult, parent_, result)); | 
 | } | 
 |  | 
 | It2MeConfirmationDialogProxy::It2MeConfirmationDialogProxy( | 
 |     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, | 
 |     std::unique_ptr<It2MeConfirmationDialog> dialog) | 
 |     : weak_factory_(this) { | 
 |   core_.reset(new Core(ui_task_runner, base::ThreadTaskRunnerHandle::Get(), | 
 |                        weak_factory_.GetWeakPtr(), std::move(dialog))); | 
 | } | 
 |  | 
 | It2MeConfirmationDialogProxy::~It2MeConfirmationDialogProxy() { | 
 |   DCHECK(core_->caller_task_runner()->BelongsToCurrentThread()); | 
 |  | 
 |   auto ui_task_runner = core_->ui_task_runner(); | 
 |   ui_task_runner->DeleteSoon(FROM_HERE, core_.release()); | 
 | } | 
 |  | 
 | void It2MeConfirmationDialogProxy::Show( | 
 |     const std::string& remote_user_email, | 
 |     const It2MeConfirmationDialog::ResultCallback& callback) { | 
 |   DCHECK(core_->caller_task_runner()->BelongsToCurrentThread()); | 
 |  | 
 |   callback_ = callback; | 
 |   core_->ui_task_runner()->PostTask( | 
 |       FROM_HERE, base::Bind(&Core::Show, base::Unretained(core_.get()), | 
 |                             remote_user_email)); | 
 | } | 
 |  | 
 | void It2MeConfirmationDialogProxy::ReportResult( | 
 |     It2MeConfirmationDialog::Result result) { | 
 |   DCHECK(core_->caller_task_runner()->BelongsToCurrentThread()); | 
 |   base::ResetAndReturn(&callback_).Run(result); | 
 | } | 
 |  | 
 | }  // namespace remoting |