mHostConnection.setGetContainerDbusesCallback(bind(
&ContainersManager::handleGetContainerDbuses, this, _1));
+ mHostConnection.setGetContainerIdsCallback(bind(&ContainersManager::handleGetContainerIdsCall,
+ this, _1));
+
+ mHostConnection.setGetActiveContainerIdCallback(bind(&ContainersManager::handleGetActiveContainerIdCall,
+ this, _1));
+
for (auto& containerConfig : mConfig.containerConfigs) {
std::string containerConfigPath;
mHostConnection.signalContainerDbusState(containerId, dbusAddress);
}
+void ContainersManager::handleGetContainerIdsCall(dbus::MethodResultBuilder::Pointer result)
+{
+ std::vector<GVariant*> containerIds;
+ for(auto& container: mContainers){
+ containerIds.push_back(g_variant_new_string(container.first.c_str()));
+ }
+
+ GVariant* array = g_variant_new_array(G_VARIANT_TYPE("s"),
+ containerIds.data(),
+ containerIds.size());
+ result->set(g_variant_new("(*)", array));
+}
+
+void ContainersManager::handleGetActiveContainerIdCall(dbus::MethodResultBuilder::Pointer result)
+{
+ LOGI("GetActiveContainerId call");
+ if (mContainers[mConfig.foregroundId]->isRunning()){
+ result->set(g_variant_new("(s)", mConfig.foregroundId.c_str()));
+ } else {
+ result->set(g_variant_new("(s)", ""));
+ }
+}
} // namespace security_containers
void handleGetContainerDbuses(dbus::MethodResultBuilder::Pointer result);
void handleDbusStateChanged(const std::string& containerId, const std::string& dbusAddress);
+ void handleGetContainerIdsCall(dbus::MethodResultBuilder::Pointer result);
+ void handleGetActiveContainerIdCall(dbus::MethodResultBuilder::Pointer result);
};
mDbusConnection->registerObject(hostapi::OBJECT_PATH,
hostapi::DEFINITION,
std::bind(&HostConnection::onMessageCall,
- this,
- _1,
- _2,
- _3,
- _4,
- _5));
+ this, _1, _2, _3, _4, _5));
LOGD("Connected");
}
mGetContainerDbusesCallback = callback;
}
+void HostConnection::setGetContainerIdsCallback(const GetContainerIdsCallback& callback)
+{
+ mGetContainerIdsCallback = callback;
+}
+
+void HostConnection::setGetActiveContainerIdCallback(const GetActiveContainerIdCallback& callback)
+{
+ mGetActiveContainerIdCallback = callback;
+}
+
void HostConnection::onMessageCall(const std::string& objectPath,
const std::string& interface,
const std::string& methodName,
}
return;
}
+
+ if (methodName == hostapi::METHOD_GET_CONTAINER_ID_LIST){
+ if (mGetContainerIdsCallback){
+ mGetContainerIdsCallback(result);
+ }
+ return;
+ }
+
+ if (methodName == hostapi::METHOD_GET_ACTIVE_CONTAINER_ID){
+ if (mGetActiveContainerIdCallback){
+ mGetActiveContainerIdCallback(result);
+ }
+ return;
+ }
}
void HostConnection::proxyCallAsync(const std::string& busName,
typedef std::function<void(dbus::MethodResultBuilder::Pointer result
)> GetContainerDbusesCallback;
+ typedef std::function<void(dbus::MethodResultBuilder::Pointer result)> GetContainerIdsCallback;
+ typedef std::function<void(dbus::MethodResultBuilder::Pointer result
+ )> GetActiveContainerIdCallback;
+
/**
* Register proxy call callback
void signalContainerDbusState(const std::string& containerId, const std::string& dbusAddress);
/**
+ * Register a callback called to get a list of domain ids
+ */
+ void setGetContainerIdsCallback(const GetContainerIdsCallback& callback);
+
+ /**
+ * Register a callback called to get the active container id
+ */
+ void setGetActiveContainerIdCallback(const GetContainerIdsCallback& callback);
+
+ /**
* Make a proxy call
*/
void proxyCallAsync(const std::string& busName,
bool mNameLost;
ProxyCallCallback mProxyCallCallback;
GetContainerDbusesCallback mGetContainerDbusesCallback;
+ GetContainerIdsCallback mGetContainerIdsCallback;
+ GetActiveContainerIdCallback mGetActiveContainerIdCallback;
void onNameAcquired();
void onNameLost();
const std::string METHOD_PROXY_CALL = "ProxyCall";
const std::string METHOD_GET_CONTAINER_DBUSES = "GetContainerDbuses";
+const std::string METHOD_GET_CONTAINER_ID_LIST = "GetContainerIds";
+const std::string METHOD_GET_ACTIVE_CONTAINER_ID = "GetActiveContainerId";
const std::string SIGNAL_CONTAINER_DBUS_STATE = "ContainerDbusState";
" <method name='" + METHOD_GET_CONTAINER_DBUSES + "'>"
" <arg type='a{ss}' name='dbuses' direction='out'/>"
" </method>"
+ " <method name='" + METHOD_GET_CONTAINER_ID_LIST + "'>"
+ " <arg type='as' name='result' direction='out'/>"
+ " </method>"
+ " <method name='" + METHOD_GET_ACTIVE_CONTAINER_ID + "'>"
+ " <arg type='s' name='result' direction='out'/>"
+ " </method>"
" <signal name='" + SIGNAL_CONTAINER_DBUS_STATE + "'>"
" <arg type='s' name='container'/>"
" <arg type='s' name='dbusAddress'/>"
return GVariantPtr(unpackedResult, g_variant_unref);
}
- Dbuses callMethodGetContainerDbuses() {
+ Dbuses callMethodGetContainerDbuses()
+ {
assert(isHost());
Dbuses dbuses;
GVariantPtr result = mClient->callMethod(hostapi::BUS_NAME,
}
return dbuses;
}
+
+ std::vector<std::string> callMethodGetContainerIds()
+ {
+ assert(isHost());
+ GVariantPtr result = mClient->callMethod(hostapi::BUS_NAME,
+ hostapi::OBJECT_PATH,
+ hostapi::INTERFACE,
+ hostapi::METHOD_GET_CONTAINER_ID_LIST,
+ NULL,
+ "(as)");
+
+ GVariant* array = NULL;
+ g_variant_get(result.get(), "(*)", &array);
+
+ size_t arraySize = g_variant_n_children(array);
+ std::vector<std::string> containerIds;
+ for (size_t i = 0; i < arraySize; ++i) {
+ const char* id = NULL;
+ g_variant_get_child(array, i, "&s", &id);
+ containerIds.push_back(id);
+ }
+
+ g_variant_unref(array);
+ return containerIds;
+ }
+
+ std::string callMethodGetActiveContainerId()
+ {
+ assert(isHost());
+ GVariantPtr result = mClient->callMethod(hostapi::BUS_NAME,
+ hostapi::OBJECT_PATH,
+ hostapi::INTERFACE,
+ hostapi::METHOD_GET_ACTIVE_CONTAINER_ID,
+ NULL,
+ "(s)");
+
+ const char* containerId = NULL;
+ g_variant_get(result.get(), "(&s)", &containerId);
+ return containerId;
+ }
+
private:
const int mId;
DbusConnection::Pointer mClient;
}
+BOOST_AUTO_TEST_CASE(GetContainerIdsTest)
+{
+ ContainersManager cm(TEST_DBUS_CONFIG_PATH);
+
+ DbusAccessory dbus(DbusAccessory::HOST_ID);
+
+ std::vector<std::string> containerIds = {"ut-containers-manager-console1-dbus",
+ "ut-containers-manager-console2-dbus",
+ "ut-containers-manager-console3-dbus"};
+ std::vector<std::string> returnedIds = dbus.callMethodGetContainerIds();
+
+ BOOST_CHECK(std::is_permutation(returnedIds.begin(),
+ returnedIds.end(),
+ containerIds.begin()));
+}
+
+BOOST_AUTO_TEST_CASE(GetActiveContainerIdTest)
+{
+ ContainersManager cm(TEST_DBUS_CONFIG_PATH);
+ cm.startAll();
+
+ DbusAccessory dbus(DbusAccessory::HOST_ID);
+
+ std::vector<std::string> containerIds = {"ut-containers-manager-console1-dbus",
+ "ut-containers-manager-console2-dbus",
+ "ut-containers-manager-console3-dbus"};
+
+ for (std::string& containerId: containerIds){
+ cm.focus(containerId);
+ BOOST_CHECK(dbus.callMethodGetActiveContainerId() == containerId);
+ }
+
+ cm.stopAll();
+ BOOST_CHECK(dbus.callMethodGetActiveContainerId() == "");
+}
+
BOOST_AUTO_TEST_SUITE_END()