From 6031b990e20f8828484e9463dd249e9078ff6adb Mon Sep 17 00:00:00 2001
From: Piotr Kosko
Date: Fri, 20 Feb 2015 12:59:48 +0100
Subject: [PATCH] [Common] Added throw-free methods for dbus
Change-Id: Ia2714beac15eee5b49036f4321d3e806aba4cead
Signed-off-by: Piotr Kosko
---
src/common/dbus_operation.cc | 97 +++++++++++++++++++++++++++++++-----
src/common/dbus_operation.h | 14 ++++--
2 files changed, 93 insertions(+), 18 deletions(-)
diff --git a/src/common/dbus_operation.cc b/src/common/dbus_operation.cc
index 2d56e58f..610d007f 100644
--- a/src/common/dbus_operation.cc
+++ b/src/common/dbus_operation.cc
@@ -103,7 +103,7 @@ void DBusOperationArguments::AddArgumentString(const std::string& val) {
arguments_.push_back(ArgumentElement(ArgType::kTypeString, p_val));
}
-void DBusOperationArguments::AppendVariant(DBusMessageIter* bus_msg_iter) {
+PlatformResult DBusOperationArguments::AppendVariant(DBusMessageIter* bus_msg_iter) {
for (auto iter = arguments_.begin(); iter != arguments_.end(); ++iter) {
ArgType type = iter->first;
void *p_val = iter->second;
@@ -130,9 +130,10 @@ void DBusOperationArguments::AppendVariant(DBusMessageIter* bus_msg_iter) {
break;
default:
- throw UnknownException("Wrong debug parameter type");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Wrong debug parameter type");
}
}
+ return PlatformResult(ErrorCode::NO_ERROR);
}
DBusOperationListener::DBusOperationListener() {
@@ -234,14 +235,81 @@ int DBusOperation::InvokeSyncGetInt(const std::string& method,
return result;
}
-void DBusOperation::RegisterSignalListener(const std::string& signal_name,
+PlatformResult DBusOperation::InvokeSyncGetInt(const std::string& method,
+ DBusOperationArguments* args, int* result) {
+
+ if (!connection_) {
+ connection_ = dbus_bus_get_private(DBUS_BUS_SYSTEM, nullptr);
+ }
+
+ if (!connection_) {
+ LoggerE("dbus_bus_get_private error");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get dbus connection");
+ }
+
+ DBusMessage* msg = dbus_message_new_method_call(destination_.c_str(),
+ path_.c_str(),
+ interface_.c_str(),
+ method.c_str());
+
+ if (!msg) {
+ LoggerE("dbus_message_new_method_call error");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to create dbus message");
+ }
+
+ DBusMessageIter iter;
+ dbus_message_iter_init_append(msg, &iter);
+
+ if (nullptr != args) {
+ PlatformResult ret = args->AppendVariant(&iter);
+ if (ret.IsError()) {
+ LoggerE("append_variant error");
+ dbus_message_unref(msg);
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to append dbus variable");
+ }
+ }
+
+ DBusError err;
+ dbus_error_init(&err);
+ DBusMessage* reply = dbus_connection_send_with_reply_and_block(connection_,
+ msg,
+ DBUS_REPLY_TIMEOUT,
+ &err);
+ dbus_message_unref(msg);
+
+ if (!reply) {
+ LoggerE("dbus_connection_send_with_reply_and_block error %s: %s", err.name, err.message);
+ dbus_error_free(&err);
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to send request via dbus");
+ }
+
+ *result = 0;
+ dbus_bool_t ret = dbus_message_get_args(reply,
+ &err,
+ DBUS_TYPE_INT32,
+ result,
+ DBUS_TYPE_INVALID);
+ dbus_message_unref(reply);
+
+ if (!ret) {
+ LoggerE("dbus_message_get_args error %s: %s", err.name, err.message);
+ dbus_error_free(&err);
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get reply from dbus");
+ }
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult DBusOperation::RegisterSignalListener(const std::string& signal_name,
DBusOperationListener* listener) {
- AddDBusSignalFilter();
+ PlatformResult ret = AddDBusSignalFilter();
+ if (ret.IsError()) return ret;
listeners_.insert(std::make_pair(signal_name, listener));
+ return PlatformResult(ErrorCode::NO_ERROR);
}
-void DBusOperation::UnregisterSignalListener(const std::string& signal_name,
+PlatformResult DBusOperation::UnregisterSignalListener(const std::string& signal_name,
DBusOperationListener* listener) {
bool signal_found = false;
@@ -257,22 +325,23 @@ void DBusOperation::UnregisterSignalListener(const std::string& signal_name,
if (false == signal_found) {
LoggerE("Failed to find signal handler");
- throw UnknownException("Failed to find signal handler");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to find signal handler");
}
if (listeners_.size() == 0) {
- RemoveDBusSignalFilter();
+ return RemoveDBusSignalFilter();
}
+ return PlatformResult(ErrorCode::NO_ERROR);
}
-void DBusOperation::AddDBusSignalFilter() {
+PlatformResult DBusOperation::AddDBusSignalFilter() {
if (!connection_) {
connection_ = dbus_bus_get_private(DBUS_BUS_SYSTEM, nullptr);
}
if (!connection_) {
LoggerE("dbus_bus_get_private error");
- throw UnknownException("Failed to get dbus connection");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get dbus connection");
}
dbus_connection_setup_with_g_main(connection_, nullptr);
@@ -292,16 +361,17 @@ void DBusOperation::AddDBusSignalFilter() {
if (dbus_error_is_set(&err)) {
LoggerE("dbus_bus_add_match error %s: %s", err.name, err.message);
dbus_error_free(&err);
- throw UnknownException("Failed to set rule for dbus signal");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to set rule for dbus signal");
}
if (dbus_connection_add_filter(connection_, DBusSignalFilterHandler, this, nullptr) == FALSE) {
LoggerE("dbus_connection_add_filter error %s: %s", err.name, err.message);
- throw UnknownException("Failed to set handler for dbus signal");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to set handler for dbus signal");
}
+ return PlatformResult(ErrorCode::NO_ERROR);
}
-void DBusOperation::RemoveDBusSignalFilter() {
+PlatformResult DBusOperation::RemoveDBusSignalFilter() {
DBusError err;
dbus_error_init(&err);
dbus_bus_remove_match(connection_, rule_.c_str(), &err);
@@ -309,10 +379,11 @@ void DBusOperation::RemoveDBusSignalFilter() {
if (dbus_error_is_set(&err)) {
LoggerE("dbus_bus_remove_match error %s: %s", err.name, err.message);
dbus_error_free(&err);
- throw UnknownException("Failed to remove rule for dbus signal");
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to remove rule for dbus signal");
}
dbus_connection_remove_filter(connection_, DBusSignalFilterHandler, this);
+ return PlatformResult(ErrorCode::NO_ERROR);
}
DBusHandlerResult DBusOperation::DBusSignalFilter(DBusConnection* /* conn */,
diff --git a/src/common/dbus_operation.h b/src/common/dbus_operation.h
index f5755c22..55f23e05 100644
--- a/src/common/dbus_operation.h
+++ b/src/common/dbus_operation.h
@@ -10,6 +10,7 @@
#include
#include
+#include "platform_result.h"
namespace common {
@@ -42,7 +43,7 @@ class DBusOperationArguments {
friend class DBusOperation;
- void AppendVariant(DBusMessageIter* bus_msg_iter);
+ common::PlatformResult AppendVariant(DBusMessageIter* bus_msg_iter);
};
class DBusOperationListener {
@@ -62,10 +63,13 @@ class DBusOperation {
int InvokeSyncGetInt(const std::string& method,
DBusOperationArguments* args);
+ //TODO remove throwing methods when they would be not needed any more.
+ common::PlatformResult InvokeSyncGetInt(const std::string& method,
+ DBusOperationArguments* args, int* result);
- void RegisterSignalListener(const std::string& signal_name,
+ common::PlatformResult RegisterSignalListener(const std::string& signal_name,
DBusOperationListener* listener);
- void UnregisterSignalListener(const std::string& signal_name,
+ common::PlatformResult UnregisterSignalListener(const std::string& signal_name,
DBusOperationListener* listener);
private:
@@ -80,8 +84,8 @@ class DBusOperation {
DBusConnection* connection_;
std::string rule_;
- void AddDBusSignalFilter();
- void RemoveDBusSignalFilter();
+ common::PlatformResult AddDBusSignalFilter();
+ common::PlatformResult RemoveDBusSignalFilter();
DBusHandlerResult DBusSignalFilter(DBusConnection* conn,
DBusMessage* message);
--
2.34.1