| Index: remoting/host/it2me/it2me_confirmation_dialog_proxy.cc
|
| diff --git a/remoting/host/it2me/it2me_confirmation_dialog_proxy.cc b/remoting/host/it2me/it2me_confirmation_dialog_proxy.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e26b7d7a1bf7ed603b1e0c9fc6b9a2d547cfc48
|
| --- /dev/null
|
| +++ b/remoting/host/it2me/it2me_confirmation_dialog_proxy.cc
|
| @@ -0,0 +1,106 @@
|
| +// 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 "base/bind.h"
|
| +#include "base/callback_helpers.h"
|
| +#include "base/location.h"
|
| +#include "base/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,
|
| + scoped_ptr<It2MeConfirmationDialog> dialog);
|
| + ~Core();
|
| +
|
| + // Shows the wrapped dialog. Must be called on the UI thread.
|
| + void Show();
|
| +
|
| + 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_;
|
| + scoped_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,
|
| + scoped_ptr<It2MeConfirmationDialog> dialog)
|
| + : ui_task_runner_(ui_task_runner),
|
| + caller_task_runner_(caller_task_runner),
|
| + parent_(parent),
|
| + dialog_(dialog.Pass()) {
|
| +}
|
| +
|
| +It2MeConfirmationDialogProxy::Core::~Core() {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| +}
|
| +
|
| +void It2MeConfirmationDialogProxy::Core::Show() {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| +
|
| + dialog_->Show(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,
|
| + scoped_ptr<It2MeConfirmationDialog> dialog)
|
| + : weak_factory_(this) {
|
| + core_.reset(new Core(ui_task_runner, base::ThreadTaskRunnerHandle::Get(),
|
| + weak_factory_.GetWeakPtr(), dialog.Pass()));
|
| +}
|
| +
|
| +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 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())));
|
| +}
|
| +
|
| +void It2MeConfirmationDialogProxy::ReportResult(
|
| + It2MeConfirmationDialog::Result result) {
|
| + DCHECK(core_->caller_task_runner()->BelongsToCurrentThread());
|
| + base::ResetAndReturn(&callback_).Run(result);
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|