TYPE3
[iec.git] / src / type3_AndroidCloud / anbox-master / src / anbox / container / management_api_skeleton.cpp
diff --git a/src/type3_AndroidCloud/anbox-master/src/anbox/container/management_api_skeleton.cpp b/src/type3_AndroidCloud/anbox-master/src/anbox/container/management_api_skeleton.cpp
new file mode 100644 (file)
index 0000000..93a43bb
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * 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/management_api_skeleton.h"
+#include "anbox/container/configuration.h"
+#include "anbox/container/container.h"
+#include "anbox/defer_action.h"
+#include "anbox/logger.h"
+#include "anbox/utils.h"
+
+#include "anbox_container.pb.h"
+#include "anbox_rpc.pb.h"
+
+#ifdef USE_PROTOBUF_CALLBACK_HEADER
+#include <google/protobuf/stubs/callback.h>
+#endif
+
+namespace anbox {
+namespace container {
+ManagementApiSkeleton::ManagementApiSkeleton(
+    const std::shared_ptr<rpc::PendingCallCache> &pending_calls,
+    const std::shared_ptr<Container> &container)
+    : pending_calls_(pending_calls), container_(container) {}
+
+ManagementApiSkeleton::~ManagementApiSkeleton() {}
+
+void ManagementApiSkeleton::start_container(
+    anbox::protobuf::container::StartContainer const *request,
+    anbox::protobuf::rpc::Void *response, google::protobuf::Closure *done) {
+  DEBUG("");
+
+  if (container_->state() == Container::State::running) {
+    response->set_error("Container is already running");
+    done->Run();
+    return;
+  }
+
+  Configuration container_configuration;
+
+  const auto configuration = request->configuration();
+  for (int n = 0; n < configuration.bind_mounts_size(); n++) {
+    const auto bind_mount = configuration.bind_mounts(n);
+    container_configuration.bind_mounts.insert({bind_mount.source(), bind_mount.target()});
+  }
+
+  for (int n = 0; n < configuration.devices_size(); n++) {
+    const auto device = configuration.devices(n);
+    container_configuration.devices.insert({device.path(), {device.permission()}});
+  }
+
+  for (int n = 0; n < configuration.extra_properties_size(); n++) {
+    const auto prop = configuration.extra_properties(n);
+    container_configuration.extra_properties.push_back(prop);
+  }
+
+  try {
+    container_->start(container_configuration);
+  } catch (std::exception &err) {
+    response->set_error(utils::string_format("Failed to start container: %s", err.what()));
+  }
+
+  done->Run();
+}
+
+void ManagementApiSkeleton::stop_container(
+    anbox::protobuf::container::StopContainer const *request,
+    anbox::protobuf::rpc::Void *response, google::protobuf::Closure *done) {
+
+  (void)request;
+
+  if (container_->state() != Container::State::running) {
+    response->set_error("Container is not running");
+    done->Run();
+    return;
+  }
+
+  try {
+    container_->stop();
+  } catch (std::exception &err) {
+    response->set_error(utils::string_format("Failed to stop container: %s", err.what()));
+  }
+
+  done->Run();
+}
+}  // namespace container
+}  // namespace anbox