Index: mojo/shell/external_application_registrar_connection.cc |
diff --git a/mojo/shell/external_application_registrar_connection.cc b/mojo/shell/external_application_registrar_connection.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8afe0c13733788a636f7909d54565e1ac1b452fe |
--- /dev/null |
+++ b/mojo/shell/external_application_registrar_connection.cc |
@@ -0,0 +1,83 @@ |
+// 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 "mojo/shell/external_application_registrar_connection.h" |
+ |
+#include "base/bind.h" |
+#include "base/files/file_path.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop/message_loop.h" |
+#include "mojo/embedder/channel_init.h" |
+#include "mojo/public/cpp/bindings/error_handler.h" |
+#include "mojo/public/interfaces/application/application.mojom.h" |
+#include "mojo/public/interfaces/application/shell.mojom.h" |
+#include "mojo/shell/external_application_registrar.mojom.h" |
+#include "net/base/net_errors.h" |
+#include "net/socket/socket_descriptor.h" |
+#include "net/socket/unix_domain_client_socket_posix.h" |
+#include "url/gurl.h" |
+ |
+namespace mojo { |
+namespace shell { |
+ |
+ExternalApplicationRegistrarConnection::ExternalApplicationRegistrarConnection( |
+ const base::FilePath& socket_path) |
+ : client_socket_( |
+ new net::UnixDomainClientSocket(socket_path.value(), false)) { |
+} |
+ |
+ExternalApplicationRegistrarConnection:: |
+ ~ExternalApplicationRegistrarConnection() { |
+ channel_init_.WillDestroySoon(); |
+} |
+ |
+void ExternalApplicationRegistrarConnection::OnConnectionError() { |
+ channel_init_.WillDestroySoon(); |
+} |
+ |
+void ExternalApplicationRegistrarConnection::Connect( |
+ const net::CompletionCallback& callback) { |
+ DCHECK(client_socket_) << "Single use only."; |
+ int rv = client_socket_->Connect( |
+ base::Bind(&ExternalApplicationRegistrarConnection::OnConnect, |
+ base::Unretained(this), |
+ callback)); |
+ if (rv != net::ERR_IO_PENDING) { |
+ DVLOG(1) << "Connect returning immediately: " << net::ErrorToString(rv); |
+ OnConnect(callback, rv); |
+ return; |
+ } |
+ DVLOG(1) << "Waiting for connection."; |
+} |
+ |
+void ExternalApplicationRegistrarConnection::Register( |
+ const GURL& app_url, |
+ ShellPtr* shell, |
+ base::Closure register_complete_callback) { |
+ DCHECK(!client_socket_); |
+ registrar_->Register( |
+ String::From(app_url), Get(shell), register_complete_callback); |
+} |
+ |
+void ExternalApplicationRegistrarConnection::OnConnect( |
+ net::CompletionCallback callback, |
+ int rv) { |
+ DVLOG(1) << "OnConnect called: " << net::ErrorToString(rv); |
+ if (rv != net::OK) { |
+ callback.Run(rv); |
+ return; |
+ } |
+ |
+ mojo::ScopedMessagePipeHandle ptr_message_pipe_handle = |
+ channel_init_.Init(client_socket_->ReleaseConnectedSocket(), |
+ base::MessageLoopProxy::current()); |
+ CHECK(ptr_message_pipe_handle.is_valid()); |
+ client_socket_.reset(); // This is dead now, ensure it can't be reused. |
+ |
+ registrar_.Bind(ptr_message_pipe_handle.Pass()); |
+ callback.Run(rv); |
+} |
+ |
+} // namespace shell |
+} // namespace mojo |