Index: remoting/host/disconnect_window_mac.mm |
diff --git a/remoting/host/disconnect_window_mac.mm b/remoting/host/disconnect_window_mac.mm |
index bc3015afed7c9af0cd44e10954e79c3914d23274..3121766b88eb15d4f498c8ddafaeb01a5a9c688b 100644 |
--- a/remoting/host/disconnect_window_mac.mm |
+++ b/remoting/host/disconnect_window_mac.mm |
@@ -6,10 +6,14 @@ |
#import "remoting/host/disconnect_window_mac.h" |
+#include "base/bind.h" |
#include "base/compiler_specific.h" |
+#include "base/location.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/single_thread_task_runner.h" |
#include "base/string_util.h" |
#include "base/strings/sys_string_conversions.h" |
-#include "remoting/host/disconnect_window.h" |
+#include "remoting/host/host_window.h" |
#include "remoting/host/ui_strings.h" |
@interface DisconnectWindowController() |
@@ -17,58 +21,99 @@ |
- (void)Hide; |
@end |
+const int kMaximumConnectedNameWidthInPixels = 400; |
+ |
namespace remoting { |
-class DisconnectWindowMac : public remoting::DisconnectWindow { |
+class DisconnectWindowMac : public HostWindow::Core { |
public: |
- explicit DisconnectWindowMac(const UiStrings* ui_strings); |
+ DisconnectWindowMac( |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ const base::Closure& disconnect_callback, |
+ const std::string& username, |
+ const UiStrings& ui_strings); |
+ |
+ private: |
+ friend class base::RefCountedThreadSafe<Core>; |
virtual ~DisconnectWindowMac(); |
- virtual bool Show(const base::Closure& disconnect_callback, |
- const std::string& username) OVERRIDE; |
- virtual void Hide() OVERRIDE; |
+ // HostWindow::Core overrides. |
+ virtual void StartOnUiThread() OVERRIDE; |
+ virtual void StopOnUiThread() OVERRIDE; |
- private: |
- DisconnectWindowController* window_controller_; |
+ // Posts |disconnect_callback_| to the |caller_task_runner_| thread. |
+ void DisconnectSession(); |
+ |
+ // Invoked in the |caller_task_runner_| thread to disconnect the client |
+ // session. |
+ base::Closure disconnect_callback_; |
- // Points to the localized strings. |
- const UiStrings* ui_strings_; |
+ // Specifies the remote user name. |
+ std::string username_; |
+ |
+ DisconnectWindowController* window_controller_; |
DISALLOW_COPY_AND_ASSIGN(DisconnectWindowMac); |
}; |
-DisconnectWindowMac::DisconnectWindowMac(const UiStrings* ui_strings) |
- : window_controller_(nil), |
- ui_strings_(ui_strings) { |
+DisconnectWindowMac::DisconnectWindowMac( |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ const base::Closure& disconnect_callback, |
+ const std::string& username, |
+ const UiStrings& ui_strings) |
+ : HostWindow::Core(caller_task_runner, |
+ ui_task_runner, |
+ ui_strings), |
+ disconnect_callback_(disconnect_callback), |
+ username_(username), |
+ window_controller_(NULL) { |
} |
DisconnectWindowMac::~DisconnectWindowMac() { |
- Hide(); |
} |
-bool DisconnectWindowMac::Show(const base::Closure& disconnect_callback, |
- const std::string& username) { |
- DCHECK(!disconnect_callback.is_null()); |
+void DisconnectWindowMac::StartOnUiThread() { |
+ DCHECK(ui_task_runner()->BelongsToCurrentThread()); |
DCHECK(window_controller_ == nil); |
+ base::Closure disconnect_callback = |
+ base::Bind(&DisconnectWindowMac::DisconnectSession, this); |
window_controller_ = |
- [[DisconnectWindowController alloc] initWithUiStrings:ui_strings_ |
+ [[DisconnectWindowController alloc] initWithUiStrings:&ui_strings() |
callback:disconnect_callback |
- username:username]; |
+ username:username_]; |
[window_controller_ showWindow:nil]; |
- return true; |
} |
-void DisconnectWindowMac::Hide() { |
+void DisconnectWindowMac::StopOnUiThread() { |
+ DCHECK(ui_task_runner()->BelongsToCurrentThread()); |
+ |
// DisconnectWindowController is responsible for releasing itself in its |
// windowWillClose: method. |
[window_controller_ Hide]; |
window_controller_ = nil; |
} |
-scoped_ptr<DisconnectWindow> DisconnectWindow::Create( |
- const UiStrings* ui_strings) { |
- return scoped_ptr<DisconnectWindow>(new DisconnectWindowMac(ui_strings)); |
+scoped_ptr<HostWindow> HostWindow::CreateDisconnectWindow( |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ const base::Closure& disconnect_callback, |
+ const std::string& username, |
+ const UiStrings& ui_strings) { |
+ scoped_refptr<Core> core = new DisconnectWindowMac(caller_task_runner, |
+ ui_task_runner, |
+ disconnect_callback, |
+ username, |
+ ui_strings); |
+ return scoped_ptr<HostWindow>(new HostWindow(core)); |
+} |
+ |
+void DisconnectWindowMac::DisconnectSession() { |
+ DCHECK(ui_task_runner()->BelongsToCurrentThread()); |
+ |
+ caller_task_runner()->PostTask(FROM_HERE, disconnect_callback_); |
Sergey Ulanov
2013/04/02 19:04:22
This may not be safe. disconnect_callback_ may be
alexeypa (please no reviews)
2013/04/03 20:26:43
This code uses a weak pointer to an interface so i
|
} |
} // namespace remoting |
@@ -120,10 +165,8 @@ scoped_ptr<DisconnectWindow> DisconnectWindow::Create( |
CGFloat newConnectedWidth = NSWidth(connectedToFrame); |
// Set a max width for the connected to text field. |
- if (newConnectedWidth > |
- remoting::DisconnectWindow::kMaximumConnectedNameWidthInPixels) { |
- newConnectedWidth |
- = remoting::DisconnectWindow::kMaximumConnectedNameWidthInPixels; |
+ if (newConnectedWidth > kMaximumConnectedNameWidthInPixels) { |
+ newConnectedWidth = kMaximumConnectedNameWidthInPixels; |
connectedToFrame.size.width = newConnectedWidth; |
[connectedToField_ setFrame:connectedToFrame]; |
} |