aboutsummaryrefslogtreecommitdiff
path: root/libs/kdbinder/kdbus/connection.cpp
diff options
context:
space:
mode:
authorPierre Langlois <pierre.langlois@arm.com>2015-02-12 14:58:43 +0000
committerPierre Langlois <pierre.langlois@arm.com>2016-03-04 17:39:40 +0000
commit553cba749ec883222c210290c4e9389618915055 (patch)
tree50126d3df0a87db3e86bdd54f348c10678749cf0 /libs/kdbinder/kdbus/connection.cpp
parenta7395a1f865863f69f2f5e7b5ce9d095fdd51d46 (diff)
downloadkdbinder-553cba749ec883222c210290c4e9389618915055.tar.gz
libkdbinder: kdbus: return Reply objects
This commit changes all the Connection method to return a Reply object holding the error code and string. For methods that dequeue a message, we return a DataReply object with the message instead of using output arguments. The concerned API is: ~~~ const Reply queue_message(uint64_t dst_id, const uint8_t *data, uint64_t size, uint64_t cookie = 0) const; const DataReply dequeue_message() const; const DataReply dequeue_message_blocking(int timeout_ms = -1) const; const DataReply transact(uint64_t dst_id, uint64_t cookie, const uint8_t *data, uint64_t size, uint64_t timeout_ms) const; const Reply reply(uint64_t dst_id, uint64_t cookie, const uint8_t *data, uint64_t size) const; ~~~ Change-Id: I4019ae9f07a248305a8347c87506ef17b65af1d7
Diffstat (limited to 'libs/kdbinder/kdbus/connection.cpp')
-rw-r--r--libs/kdbinder/kdbus/connection.cpp137
1 files changed, 63 insertions, 74 deletions
diff --git a/libs/kdbinder/kdbus/connection.cpp b/libs/kdbinder/kdbus/connection.cpp
index 6b432b3..65ee566 100644
--- a/libs/kdbinder/kdbus/connection.cpp
+++ b/libs/kdbinder/kdbus/connection.cpp
@@ -85,7 +85,8 @@ std::unique_ptr<Connection> Connection::hello(
return std::unique_ptr<Connection>(new Connection(bus_file, reply.id, buf));
}
-int Connection::acquire_name(const std::string& name, uint64_t flags) const {
+const Reply Connection::acquire_name(const std::string& name,
+ uint64_t flags) const {
// struct kdbus_cmd_name requires a KDBUS_ITEM_NAME.
auto reply = send_command_name_acquire(bus_file_.get(),
flags,
@@ -98,10 +99,10 @@ int Connection::acquire_name(const std::string& name, uint64_t flags) const {
reply.error_string.c_str());
}
- return reply.error_code;;
+ return reply;
}
-int Connection::release_name(const std::string& name) const {
+const Reply Connection::release_name(const std::string& name) const {
// struct kdbus_cmd_name requires a KDBUS_ITEM_NAME.
auto reply = send_command_name_release(bus_file_.get(), ItemName(name));
@@ -112,7 +113,7 @@ int Connection::release_name(const std::string& name) const {
reply.error_string.c_str());
}
- return reply.error_code;;
+ return reply;
}
std::vector<NameInfo> Connection::name_list(uint64_t flags) const {
@@ -160,17 +161,17 @@ std::vector<NameInfo> Connection::name_list(uint64_t flags) const {
return list_vector;
}
-int Connection::queue_message(const Connection& dst,
- const uint8_t *data,
- uint64_t size,
- uint64_t cookie) const {
+const Reply Connection::queue_message(const Connection& dst,
+ const uint8_t *data,
+ uint64_t size,
+ uint64_t cookie) const {
return queue_message(dst.id, data, size, cookie);
}
-int Connection::queue_message(uint64_t dst_id,
- const uint8_t *data,
- uint64_t size,
- uint64_t cookie) const {
+const Reply Connection::queue_message(uint64_t dst_id,
+ const uint8_t *data,
+ uint64_t size,
+ uint64_t cookie) const {
// When sending a asynchronous message, we do not need to use cookies so we
// set it to 0. We are using cookies only for messages which expect a reply.
Message message(dst_id, id, cookie, 0, ItemPayloadVec(data, size));
@@ -183,48 +184,41 @@ int Connection::queue_message(uint64_t dst_id,
reply.error_string.c_str());
}
- return reply.error_code;
+ return reply;
}
-int Connection::dequeue_message(uint8_t **data,
- uint64_t *size,
- uint64_t *src,
- uint64_t *cookie) const {
+const DataReply Connection::dequeue_message() const {
auto reply = send_command_receive_message(bus_file_.get());
if (reply.error_code < 0) {
ALOGE("ID %d could not dequeue message: %s\n",
(int) id,
reply.error_string.c_str());
- return reply.error_code;
+ return DataReply(reply);
}
struct kdbus_msg *msg = reinterpret_cast<struct kdbus_msg *>(
reinterpret_cast<uint8_t *>(buf_.get()) + reply.offset);
struct kdbus_item *item = nullptr;
-
- if (src != nullptr)
- *src = msg->src_id;
- if (cookie != nullptr)
- *cookie = msg->cookie;
+ uint64_t size;
+ uint8_t *data;
// TODO: parse the rest of the items for extra information.
for_each_item(msg, [&data, this, &size](struct kdbus_item *item) {
- if (item->type == KDBUS_ITEM_PAYLOAD_OFF) {
- // This is potentially unsafe, as we are returning a pointer to the buffer
- // owned by the connection.
- *size = item->vec.size;
- *data = reinterpret_cast<uint8_t *>(buf_.get()) + item->vec.offset;
+ switch (item->type) {
+ case KDBUS_ITEM_PAYLOAD_OFF: {
+ // This is potentially unsafe, as we are returning a pointer to the buffer
+ // owned by the connection.
+ size = item->vec.size;
+ data = reinterpret_cast<uint8_t *>(buf_.get()) + item->vec.offset;
+ break;
+ }
}
});
- return reply.error_code;
+ return DataReply(reply, data, size, reply.offset, msg->src_id, msg->cookie);
}
-int Connection::dequeue_message_blocking(uint8_t **data,
- uint64_t *size,
- uint64_t *src,
- uint64_t *cookie,
- int timeout_ms) const {
+const DataReply Connection::dequeue_message_blocking(int timeout_ms) const {
struct pollfd pollfd = {
.fd = fileno(bus_file_.get()),
.events = POLLIN | POLLPRI | POLLHUP,
@@ -237,10 +231,10 @@ int Connection::dequeue_message_blocking(uint8_t **data,
ALOGW("ID %d timed out dequeuing a message: timeout of %d ms\n",
(int) id,
timeout_ms);
- return -ETIMEDOUT;
+ return DataReply(Reply(-ETIMEDOUT, std::string(strerror(-errno))));
} else if (ret > 0) {
if (pollfd.revents & POLLIN) {
- ret = dequeue_message(data, size, src, cookie);
+ return dequeue_message();
}
if (pollfd.revents & (POLLHUP | POLLERR)) {
@@ -248,39 +242,27 @@ int Connection::dequeue_message_blocking(uint8_t **data,
}
}
- rewind(bus_file_.get());
-
- return ret;
+ return DataReply(Reply(ret, std::string(strerror(-errno))));
}
-int Connection::transact(const Connection& dst,
- uint64_t cookie,
- const uint8_t *data_in,
- uint64_t size_in,
- uint8_t **data_out,
- uint64_t *size_out,
- uint64_t timeout_ms) const {
- return transact(dst.id,
- cookie,
- data_in,
- size_in,
- data_out,
- size_out,
- timeout_ms);
+const DataReply Connection::transact(const Connection& dst,
+ uint64_t cookie,
+ const uint8_t *data,
+ uint64_t size,
+ uint64_t timeout_ms) const {
+ return transact(dst.id, cookie, data, size, timeout_ms);
}
-int Connection::transact(uint64_t dst_id,
- uint64_t cookie,
- const uint8_t *data_in,
- uint64_t size_in,
- uint8_t **data_out,
- uint64_t *size_out,
- uint64_t timeout_ms) const {
+const DataReply Connection::transact(uint64_t dst_id,
+ uint64_t cookie,
+ const uint8_t *data,
+ uint64_t size,
+ uint64_t timeout_ms) const {
MessageSync message(dst_id,
id,
cookie,
timeout_ms,
- ItemPayloadVec(data_in, size_in));
+ ItemPayloadVec(data, size));
auto reply = send_command_transact_message(bus_file_.get(), message);
@@ -288,35 +270,42 @@ int Connection::transact(uint64_t dst_id,
ALOGE("ID %d could not issue transaction: %s\n",
(int) id,
reply.error_string.c_str());
- return reply.error_code;
+ return DataReply(reply);
}
struct kdbus_msg *msg = reinterpret_cast<struct kdbus_msg *>(
reinterpret_cast<uint8_t *>(buf_.get()) + reply.offset);
struct kdbus_item *item = nullptr;
+ uint8_t *data_out;
+ uint64_t size_out;
// TODO: parse the rest of the items for extra information.
for_each_item(msg, [&data_out, this, &size_out](struct kdbus_item *item) {
if (item->type == KDBUS_ITEM_PAYLOAD_OFF) {
- *size_out = item->vec.size;
- *data_out = reinterpret_cast<uint8_t *>(buf_.get()) + item->vec.offset;
+ size_out = item->vec.size;
+ data_out = reinterpret_cast<uint8_t *>(buf_.get()) + item->vec.offset;
}
});
- return reply.error_code;
+ return DataReply(reply,
+ data_out,
+ size_out,
+ reply.offset,
+ msg->src_id,
+ msg->cookie);
}
-int Connection::reply(const Connection& dst,
- uint64_t cookie,
- const uint8_t *data,
- uint64_t size) const {
+const Reply Connection::reply(const Connection& dst,
+ uint64_t cookie,
+ const uint8_t *data,
+ uint64_t size) const {
return reply(dst.id, cookie, data, size);
}
-int Connection::reply(uint64_t dst_id,
- uint64_t cookie,
- const uint8_t *data,
- uint64_t size) const {
+const Reply Connection::reply(uint64_t dst_id,
+ uint64_t cookie,
+ const uint8_t *data,
+ uint64_t size) const {
MessageReply message(dst_id, id, cookie, ItemPayloadVec(data, size));
auto reply = send_command_send_message(bus_file_.get(), message);
@@ -327,7 +316,7 @@ int Connection::reply(uint64_t dst_id,
reply.error_string.c_str());
}
- return reply.error_code;
+ return reply;
}
} // namespace kdbus