TYPE3
[iec.git] / src / type3_AndroidCloud / anbox-master / src / anbox / container / client.cpp
diff --git a/src/type3_AndroidCloud/anbox-master/src/anbox/container/client.cpp b/src/type3_AndroidCloud/anbox-master/src/anbox/container/client.cpp
new file mode 100644 (file)
index 0000000..99251e2
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3, as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranties of
+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+ * PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "anbox/container/client.h"
+#include "anbox/system_configuration.h"
+#include "anbox/container/management_api_stub.h"
+#include "anbox/logger.h"
+#include "anbox/network/local_socket_messenger.h"
+#include "anbox/rpc/channel.h"
+#include "anbox/rpc/message_processor.h"
+#include "anbox/rpc/pending_call_cache.h"
+
+namespace ba = boost::asio;
+namespace bs = boost::system;
+
+namespace anbox {
+namespace container {
+Client::Client(const std::shared_ptr<Runtime> &rt)
+    : messenger_(std::make_shared<network::LocalSocketMessenger>(
+          SystemConfiguration::instance().container_socket_path(), rt)),
+      pending_calls_(std::make_shared<rpc::PendingCallCache>()),
+      rpc_channel_(std::make_shared<rpc::Channel>(pending_calls_, messenger_)),
+      management_api_(std::make_shared<ManagementApiStub>(rpc_channel_)),
+      processor_(
+          std::make_shared<rpc::MessageProcessor>(messenger_, pending_calls_)) {
+  read_next_message();
+}
+
+Client::~Client() {}
+
+void Client::start(const Configuration &configuration) {
+  try {
+    management_api_->start_container(configuration);
+  } catch (const std::exception &e) {
+    ERROR("Failed to start container: %s", e.what());
+    if (terminate_callback_)
+      terminate_callback_();
+  }
+}
+
+void Client::stop() {
+  management_api_->stop_container();
+}
+
+void Client::register_terminate_handler(const TerminateCallback &callback) {
+  terminate_callback_ = callback;
+}
+
+void Client::read_next_message() {
+  auto callback = std::bind(&Client::on_read_size, this, std::placeholders::_1,
+                            std::placeholders::_2);
+  messenger_->async_receive_msg(callback, ba::buffer(buffer_));
+}
+
+void Client::on_read_size(const boost::system::error_code &error,
+                          std::size_t bytes_read) {
+  if (error) {
+    if (terminate_callback_)
+      terminate_callback_();
+    return;
+  }
+
+  std::vector<std::uint8_t> data(bytes_read);
+  std::copy(buffer_.data(), buffer_.data() + bytes_read, data.data());
+
+  if (processor_->process_data(data)) read_next_message();
+}
+}  // namespace container
+}  // namespace anbox