2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Piotr Bartosiewicz <p.bartosiewi@partner.samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
21 * @author Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
22 * @brief Implementation of a class for communication with server
27 #include "host-connection.hpp"
28 #include "host-dbus-definitions.hpp"
29 #include "exception.hpp"
30 #include "api/dbus-method-result-builder.hpp"
31 #include "api/messages.hpp"
33 #include "logger/logger.hpp"
34 #include "config/manager.hpp"
40 // Timeout in ms for waiting for dbus name.
41 // Can happen if glib loop is busy or not present.
42 // TODO: this should be in host's configuration file
43 const unsigned int NAME_ACQUIRED_TIMEOUT = 5 * 1000;
48 HostConnection::HostConnection()
49 : mNameAcquired(false)
52 LOGT("Connecting to host system DBUS");
53 mDbusConnection = dbus::DbusConnection::createSystem();
55 LOGT("Setting DBUS name");
56 mDbusConnection->setName(api::host::BUS_NAME,
57 std::bind(&HostConnection::onNameAcquired, this),
58 std::bind(&HostConnection::onNameLost, this));
60 if (!waitForName(NAME_ACQUIRED_TIMEOUT)) {
61 LOGE("Could not acquire dbus name: " << api::host::BUS_NAME);
62 throw HostConnectionException("Could not acquire dbus name: " + api::host::BUS_NAME);
65 LOGT("Registering DBUS interface");
66 using namespace std::placeholders;
67 mDbusConnection->registerObject(api::host::OBJECT_PATH,
68 api::host::DEFINITION,
69 std::bind(&HostConnection::onMessageCall,
70 this, _1, _2, _3, _4, _5));
75 HostConnection::~HostConnection()
79 bool HostConnection::waitForName(const unsigned int timeoutMs)
81 std::unique_lock<std::mutex> lock(mNameMutex);
82 mNameCondition.wait_for(lock,
83 std::chrono::milliseconds(timeoutMs),
85 return mNameAcquired || mNameLost;
91 void HostConnection::onNameAcquired()
93 std::unique_lock<std::mutex> lock(mNameMutex);
95 mNameCondition.notify_one();
98 void HostConnection::onNameLost()
100 std::unique_lock<std::mutex> lock(mNameMutex);
102 mNameCondition.notify_one();
105 // TODO implement reconnecting
106 LOGE("TODO Reconnect !!!");
110 void HostConnection::setProxyCallCallback(const ProxyCallCallback& callback)
112 mProxyCallCallback = callback;
115 void HostConnection::setGetZoneDbusesCallback(const GetZoneDbusesCallback& callback)
117 mGetZoneDbusesCallback = callback;
120 void HostConnection::setGetZoneIdsCallback(const GetZoneIdsCallback& callback)
122 mGetZoneIdsCallback = callback;
125 void HostConnection::setGetActiveZoneIdCallback(const GetActiveZoneIdCallback& callback)
127 mGetActiveZoneIdCallback = callback;
130 void HostConnection::setGetZoneInfoCallback(const GetZoneInfoCallback& callback)
132 mGetZoneInfoCallback = callback;
135 void HostConnection::setSetNetdevAttrsCallback(const SetNetdevAttrsCallback& callback)
137 mSetNetdevAttrsCallback = callback;
140 void HostConnection::setGetNetdevAttrsCallback(const GetNetdevAttrsCallback& callback)
142 mGetNetdevAttrsCallback = callback;
145 void HostConnection::setGetNetdevListCallback(const GetNetdevListCallback& callback)
147 mGetNetdevListCallback = callback;
150 void HostConnection::setCreateNetdevVethCallback(const CreateNetdevVethCallback& callback)
152 mCreateNetdevVethCallback = callback;
155 void HostConnection::setCreateNetdevMacvlanCallback(const CreateNetdevMacvlanCallback& callback)
157 mCreateNetdevMacvlanCallback = callback;
160 void HostConnection::setCreateNetdevPhysCallback(const CreateNetdevPhysCallback& callback)
162 mCreateNetdevPhysCallback = callback;
165 void HostConnection::setDestroyNetdevCallback(const DestroyNetdevCallback& callback)
167 mDestroyNetdevCallback = callback;
170 void HostConnection::setDeclareFileCallback(const DeclareFileCallback& callback)
172 mDeclareFileCallback = callback;
175 void HostConnection::setDeclareMountCallback(const DeclareMountCallback& callback)
177 mDeclareMountCallback = callback;
180 void HostConnection::setDeclareLinkCallback(const DeclareLinkCallback& callback)
182 mDeclareLinkCallback = callback;
185 void HostConnection::setGetDeclarationsCallback(const GetDeclarationsCallback& callback)
187 mGetDeclarationsCallback = callback;
190 void HostConnection::setRemoveDeclarationCallback(const RemoveDeclarationCallback& callback)
192 mRemoveDeclarationCallback = callback;
195 void HostConnection::setSetActiveZoneCallback(const SetActiveZoneCallback& callback)
197 mSetActiveZoneCallback = callback;
200 void HostConnection::setCreateZoneCallback(const CreateZoneCallback& callback)
202 mCreateZoneCallback = callback;
205 void HostConnection::setDestroyZoneCallback(const DestroyZoneCallback& callback)
207 mDestroyZoneCallback = callback;
210 void HostConnection::setShutdownZoneCallback(const ShutdownZoneCallback& callback)
212 mShutdownZoneCallback = callback;
215 void HostConnection::setStartZoneCallback(const StartZoneCallback& callback)
217 mStartZoneCallback = callback;
220 void HostConnection::setLockZoneCallback(const LockZoneCallback& callback)
222 mLockZoneCallback = callback;
225 void HostConnection::setUnlockZoneCallback(const UnlockZoneCallback& callback)
227 mUnlockZoneCallback = callback;
230 void HostConnection::setGrantDeviceCallback(const GrantDeviceCallback& callback)
232 mGrantDeviceCallback = callback;
235 void HostConnection::setRevokeDeviceCallback(const RevokeDeviceCallback& callback)
237 mRevokeDeviceCallback = callback;
241 void HostConnection::onMessageCall(const std::string& objectPath,
242 const std::string& interface,
243 const std::string& methodName,
244 GVariant* parameters,
245 dbus::MethodResultBuilder::Pointer result)
247 if (objectPath != api::host::OBJECT_PATH || interface != api::host::INTERFACE) {
251 if (methodName == api::host::METHOD_SET_ACTIVE_ZONE) {
253 config::loadFromGVariant(parameters, zoneId);
255 if (mSetActiveZoneCallback) {
256 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
257 mSetActiveZoneCallback(zoneId, rb);
262 if (methodName == api::host::METHOD_GET_ZONE_DBUSES) {
263 if (mGetZoneDbusesCallback) {
264 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Dbuses>>(result);
265 mGetZoneDbusesCallback(rb);
270 if (methodName == api::METHOD_PROXY_CALL) {
271 const gchar* target = NULL;
272 const gchar* targetBusName = NULL;
273 const gchar* targetObjectPath = NULL;
274 const gchar* targetInterface = NULL;
275 const gchar* targetMethod = NULL;
276 GVariant* rawArgs = NULL;
277 g_variant_get(parameters,
285 dbus::GVariantPtr args(rawArgs, g_variant_unref);
287 if (mProxyCallCallback) {
288 mProxyCallCallback(target,
299 if (methodName == api::host::METHOD_GET_ZONE_ID_LIST) {
300 if (mGetZoneIdsCallback) {
301 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::ZoneIds>>(result);
302 mGetZoneIdsCallback(rb);
307 if (methodName == api::host::METHOD_GET_ACTIVE_ZONE_ID) {
308 if (mGetActiveZoneIdCallback) {
309 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::ZoneId>>(result);
310 mGetActiveZoneIdCallback(rb);
315 if (methodName == api::host::METHOD_GET_ZONE_INFO) {
317 config::loadFromGVariant(parameters, zoneId);
319 if (mGetZoneInfoCallback) {
320 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::ZoneInfoOut>>(result);
321 mGetZoneInfoCallback(zoneId, rb);
326 if (methodName == api::host::METHOD_SET_NETDEV_ATTRS) {
327 api::SetNetDevAttrsIn data;
328 config::loadFromGVariant(parameters, data);
330 if (mSetNetdevAttrsCallback) {
331 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
332 mSetNetdevAttrsCallback(data, rb);
337 if (methodName == api::host::METHOD_GET_NETDEV_ATTRS) {
338 api::GetNetDevAttrsIn data;
339 config::loadFromGVariant(parameters, data);
341 if (mGetNetdevAttrsCallback) {
342 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::GetNetDevAttrs>>(result);
343 mGetNetdevAttrsCallback(data, rb);
348 if (methodName == api::host::METHOD_GET_NETDEV_LIST) {
350 config::loadFromGVariant(parameters, data);
352 if (mGetNetdevListCallback) {
353 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::GetNetDevAttrs>>(result);
354 mGetNetdevListCallback(data, rb);
359 if (methodName == api::host::METHOD_CREATE_NETDEV_VETH) {
360 api::CreateNetDevVethIn data;
361 config::loadFromGVariant(parameters, data);
363 if (mCreateNetdevVethCallback) {
364 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
365 mCreateNetdevVethCallback(data, rb);
370 if (methodName == api::host::METHOD_CREATE_NETDEV_MACVLAN) {
371 api::CreateNetDevMacvlanIn data;
372 config::loadFromGVariant(parameters, data);
374 if (mCreateNetdevMacvlanCallback) {
375 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
376 mCreateNetdevMacvlanCallback(data, rb);
380 if (methodName == api::host::METHOD_CREATE_NETDEV_PHYS) {
381 api::CreateNetDevPhysIn data;
382 config::loadFromGVariant(parameters, data);
384 if (mCreateNetdevPhysCallback) {
385 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
386 mCreateNetdevPhysCallback(data, rb);
390 if (methodName == api::host::METHOD_DESTROY_NETDEV) {
391 api::DestroyNetDevIn data;
392 config::loadFromGVariant(parameters, data);
394 if (mDestroyNetdevCallback) {
395 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
396 mDestroyNetdevCallback(data, rb);
400 if (methodName == api::host::METHOD_DECLARE_FILE) {
401 api::DeclareFileIn data;
402 config::loadFromGVariant(parameters, data);
404 if (mDeclareFileCallback) {
405 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Declaration>>(result);
406 mDeclareFileCallback(data, rb);
411 if (methodName == api::host::METHOD_DECLARE_MOUNT) {
412 api::DeclareMountIn data;
413 config::loadFromGVariant(parameters, data);
415 if (mDeclareMountCallback) {
416 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Declaration>>(result);
417 mDeclareMountCallback(data, rb);
422 if (methodName == api::host::METHOD_DECLARE_LINK) {
423 api::DeclareLinkIn data;
424 config::loadFromGVariant(parameters, data);
426 if (mDeclareLinkCallback) {
427 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Declaration>>(result);
428 mDeclareLinkCallback(data, rb);
433 if (methodName == api::host::METHOD_GET_DECLARATIONS) {
435 config::loadFromGVariant(parameters, data);
437 if (mGetDeclarationsCallback) {
438 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Declarations>>(result);
439 mGetDeclarationsCallback(data, rb);
444 if (methodName == api::host::METHOD_REMOVE_DECLARATION) {
445 api::RemoveDeclarationIn data;
446 config::loadFromGVariant(parameters, data);
448 if (mRemoveDeclarationCallback) {
449 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
450 mRemoveDeclarationCallback(data, rb);
455 if (methodName == api::host::METHOD_CREATE_ZONE) {
456 api::CreateZoneIn data;
457 config::loadFromGVariant(parameters, data);
459 if (mCreateZoneCallback) {
460 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
461 mCreateZoneCallback(data, rb);
466 if (methodName == api::host::METHOD_DESTROY_ZONE) {
468 config::loadFromGVariant(parameters, data);
470 if (mDestroyZoneCallback) {
471 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
472 mDestroyZoneCallback(data, rb);
477 if (methodName == api::host::METHOD_SHUTDOWN_ZONE) {
479 config::loadFromGVariant(parameters, data);
481 if (mShutdownZoneCallback) {
482 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
483 mShutdownZoneCallback(data, rb);
487 if (methodName == api::host::METHOD_START_ZONE) {
489 config::loadFromGVariant(parameters, data);
491 if (mStartZoneCallback) {
492 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
493 mStartZoneCallback(data, rb);
497 if (methodName == api::host::METHOD_LOCK_ZONE) {
499 config::loadFromGVariant(parameters, data);
501 if (mLockZoneCallback) {
502 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
503 mLockZoneCallback(data, rb);
508 if (methodName == api::host::METHOD_UNLOCK_ZONE) {
510 config::loadFromGVariant(parameters, data);
512 if (mUnlockZoneCallback) {
513 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
514 mUnlockZoneCallback(data, rb);
519 if (methodName == api::host::METHOD_GRANT_DEVICE) {
520 api::GrantDeviceIn data;
521 config::loadFromGVariant(parameters, data);
523 if (mGrantDeviceCallback) {
524 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
525 mGrantDeviceCallback(data, rb);
530 if (methodName == api::host::METHOD_REVOKE_DEVICE) {
531 api::RevokeDeviceIn data;
532 config::loadFromGVariant(parameters, data);
534 if (mRevokeDeviceCallback) {
535 auto rb = std::make_shared<api::DbusMethodResultBuilder<api::Void>>(result);
536 mRevokeDeviceCallback(data, rb);
542 void HostConnection::proxyCallAsync(const std::string& busName,
543 const std::string& objectPath,
544 const std::string& interface,
545 const std::string& method,
546 GVariant* parameters,
547 const dbus::DbusConnection::AsyncMethodCallCallback& callback)
549 mDbusConnection->callMethodAsync(busName,
558 void HostConnection::signalZoneDbusState(const std::string& zoneId,
559 const std::string& dbusAddress)
561 GVariant* parameters = g_variant_new("(ss)", zoneId.c_str(), dbusAddress.c_str());
562 mDbusConnection->emitSignal(api::host::OBJECT_PATH,
563 api::host::INTERFACE,
564 api::host::SIGNAL_ZONE_DBUS_STATE,