chiark / gitweb /
bus: add new bus API call sd_bus_message_at_end()
authorLennart Poettering <lennart@poettering.net>
Tue, 5 Nov 2013 18:36:05 +0000 (19:36 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 5 Nov 2013 18:36:05 +0000 (19:36 +0100)
This may be used to determine whether we are at the end of a container
ot the entire message.

src/libsystemd-bus/bus-message.c
src/systemd/sd-bus.h

index dcdb3a71873a4c787007a91a03c6b9b8a1da649f..e68b43bbae8ef1a21ae6b6cbfdb025fb4a05ff05 100644 (file)
@@ -2366,6 +2366,15 @@ static int buffer_peek(const void *p, uint32_t sz, size_t *rindex, size_t align,
         return 1;
 }
 
+static bool message_end_of_signature(sd_bus_message *m) {
+        struct bus_container *c;
+
+        assert(m);
+
+        c = message_get_container(m);
+        return !c->signature || c->signature[c->index] == 0;
+}
+
 static bool message_end_of_array(sd_bus_message *m, size_t index) {
         struct bus_container *c;
 
@@ -2378,6 +2387,22 @@ static bool message_end_of_array(sd_bus_message *m, size_t index) {
         return index >= c->begin + BUS_MESSAGE_BSWAP32(m, *c->array_size);
 }
 
+int sd_bus_message_at_end(sd_bus_message *m, int complete) {
+        assert_return(m, -EINVAL);
+        assert_return(m->sealed, -EPERM);
+
+        if (complete && m->n_containers > 0)
+                return false;
+
+        if (message_end_of_signature(m))
+                return true;
+
+        if (message_end_of_array(m, m->rindex))
+                return true;
+
+        return false;
+}
+
 static struct bus_body_part* find_part(sd_bus_message *m, size_t index, size_t sz, void **p) {
         struct bus_body_part *part;
         size_t begin;
@@ -2524,14 +2549,13 @@ int sd_bus_message_read_basic(sd_bus_message *m, char type, void *p) {
         assert_return(m->sealed, -EPERM);
         assert_return(bus_type_is_basic(type), -EINVAL);
 
-        c = message_get_container(m);
-
-        if (!c->signature || c->signature[c->index] == 0)
+        if (message_end_of_signature(m))
                 return -ENXIO;
 
         if (message_end_of_array(m, m->rindex))
                 return 0;
 
+        c = message_get_container(m);
         if (c->signature[c->index] != type)
                 return -ENXIO;
 
@@ -2901,14 +2925,14 @@ int sd_bus_message_enter_container(sd_bus_message *m, char type, const char *con
                 return -ENOMEM;
         m->containers = w;
 
-        c = message_get_container(m);
-
-        if (!c->signature || c->signature[c->index] == 0)
+        if (message_end_of_signature(m))
                 return -ENXIO;
 
         if (message_end_of_array(m, m->rindex))
                 return 0;
 
+        c = message_get_container(m);
+
         signature = strdup(contents);
         if (!signature)
                 return -ENOMEM;
@@ -2999,14 +3023,14 @@ int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char **content
         assert_return(m, -EINVAL);
         assert_return(m->sealed, -EPERM);
 
-        c = message_get_container(m);
-
-        if (!c->signature || c->signature[c->index] == 0)
+        if (message_end_of_signature(m))
                 goto eof;
 
         if (message_end_of_array(m, m->rindex))
                 goto eof;
 
+        c = message_get_container(m);
+
         if (bus_type_is_basic(c->signature[c->index])) {
                 if (contents)
                         *contents = NULL;
@@ -3106,7 +3130,7 @@ int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char **content
 
 eof:
         if (type)
-                *type = c->enclosing;
+                *type = 0;
         if (contents)
                 *contents = NULL;
         return 0;
index c6f940904c9670e9be2ad2fd7207e3c5eeca5197..6b43a23d00962516f6d798f78c0596da71ef6449 100644 (file)
@@ -203,6 +203,7 @@ int sd_bus_message_enter_container(sd_bus_message *m, char type, const char *con
 int sd_bus_message_exit_container(sd_bus_message *m);
 int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char **contents);
 int sd_bus_message_verify_type(sd_bus_message *m, char type, const char *contents);
+int sd_bus_message_at_end(sd_bus_message *m, int complete);
 int sd_bus_message_rewind(sd_bus_message *m, int complete);
 
 /* Convenience calls */