[jsonrpc-glib] message: add GET_STRV helper



commit 42fbf4e63216e524baa2195086a4d7c020f8d89b
Author: Christian Hergert <chergert redhat com>
Date:   Fri Apr 20 00:28:29 2018 -0700

    message: add GET_STRV helper

 src/jsonrpc-message.c |  3 +++
 src/jsonrpc-message.h | 10 ++++++++++
 tests/test-message.c  | 10 ++++++++++
 3 files changed, 23 insertions(+)
---
diff --git a/src/jsonrpc-message.c b/src/jsonrpc-message.c
index fea7d2e..5ba4df5 100644
--- a/src/jsonrpc-message.c
+++ b/src/jsonrpc-message.c
@@ -47,6 +47,7 @@
 #define IS_PUT_DOUBLE(_any)  COMPARE_MAGIC(_any, PUT_DOUBLE)
 
 #define IS_GET_STRING(_any)  COMPARE_MAGIC(_any, GET_STRING)
+#define IS_GET_STRV(_any)    COMPARE_MAGIC(_any, GET_STRV)
 #define IS_GET_INT32(_any)   COMPARE_MAGIC(_any, GET_INT32)
 #define IS_GET_INT64(_any)   COMPARE_MAGIC(_any, GET_INT64)
 #define IS_GET_BOOLEAN(_any) COMPARE_MAGIC(_any, GET_BOOLEAN)
@@ -382,6 +383,8 @@ jsonrpc_message_parse_object (GVariantDict *dict,
             }
         }
     }
+  else if (IS_GET_STRV (valptr))
+    ret = g_variant_dict_lookup (dict, key, "^as", ((JsonrpcMessageGetStrv *)valptr)->valptr);
   else if (IS_GET_INT32 (valptr))
     ret = g_variant_dict_lookup (dict, key, "i", ((JsonrpcMessageGetInt32 *)valptr)->valptr);
   else if (IS_GET_INT64 (valptr))
diff --git a/src/jsonrpc-message.h b/src/jsonrpc-message.h
index e15c2db..2d10a98 100644
--- a/src/jsonrpc-message.h
+++ b/src/jsonrpc-message.h
@@ -53,6 +53,12 @@ typedef struct
   const char **valptr;
 } JsonrpcMessageGetString __attribute__((aligned (8)));
 
+typedef struct
+{
+  JsonrpcMessageMagic magic;
+  char ***valptr;
+} JsonrpcMessageGetStrv __attribute__((aligned (8)));
+
 typedef struct
 {
   JsonrpcMessageMagic magic;
@@ -125,6 +131,7 @@ typedef struct
 #define _JSONRPC_MESSAGE_PUT_STRING_MAGIC  _JSONRPC_MAGIC("PUTS")
 #define _JSONRPC_MESSAGE_GET_STRING_MAGIC  _JSONRPC_MAGIC("GETS")
 #define _JSONRPC_MESSAGE_PUT_STRV_MAGIC    _JSONRPC_MAGIC("PUTZ")
+#define _JSONRPC_MESSAGE_GET_STRV_MAGIC    _JSONRPC_MAGIC("GETZ")
 #define _JSONRPC_MESSAGE_PUT_INT32_MAGIC   _JSONRPC_MAGIC("PUTI")
 #define _JSONRPC_MESSAGE_GET_INT32_MAGIC   _JSONRPC_MAGIC("GETI")
 #define _JSONRPC_MESSAGE_PUT_INT64_MAGIC   _JSONRPC_MAGIC("PUTX")
@@ -140,6 +147,7 @@ typedef struct
 #define _JSONRPC_MESSAGE_PUT_STRING_MAGIC_C  _JSONRPC_MAGIC_C('P','U','T','S')
 #define _JSONRPC_MESSAGE_GET_STRING_MAGIC_C  _JSONRPC_MAGIC_C('G','E','T','S')
 #define _JSONRPC_MESSAGE_PUT_STRV_MAGIC_C    _JSONRPC_MAGIC_C('P','U','T','Z')
+#define _JSONRPC_MESSAGE_GET_STRV_MAGIC_C    _JSONRPC_MAGIC_C('G','E','T','Z')
 #define _JSONRPC_MESSAGE_PUT_INT32_MAGIC_C   _JSONRPC_MAGIC_C('P','U','T','I')
 #define _JSONRPC_MESSAGE_GET_INT32_MAGIC_C   _JSONRPC_MAGIC_C('G','E','T','I')
 #define _JSONRPC_MESSAGE_PUT_INT64_MAGIC_C   _JSONRPC_MAGIC_C('P','U','T','X')
@@ -168,6 +176,8 @@ typedef struct
 
 #define JSONRPC_MESSAGE_PUT_STRV(_val) \
   (&((JsonrpcMessagePutStrv) { .magic = {_JSONRPC_MESSAGE_PUT_STRV_MAGIC_C}, .val = _val }))
+#define JSONRPC_MESSAGE_GET_STRV(_valptr) \
+  (&((JsonrpcMessageGetStrv) { .magic = {_JSONRPC_MESSAGE_GET_STRV_MAGIC_C}, .valptr = _valptr }))
 
 #define JSONRPC_MESSAGE_PUT_INT32(_val) \
   (&((JsonrpcMessagePutInt32) { .magic = {_JSONRPC_MESSAGE_PUT_INT32_MAGIC_C}, .val = _val }))
diff --git a/tests/test-message.c b/tests/test-message.c
index b786321..02aecce 100644
--- a/tests/test-message.c
+++ b/tests/test-message.c
@@ -241,11 +241,21 @@ test_strv (void)
 {
   g_autoptr(GVariant) src = NULL;
   static const gchar *ar[] = { "a", "b", "c", NULL };
+  g_auto(GStrv) get_ar = NULL;
   g_autofree gchar *print = NULL;
+  gboolean r;
 
   src = JSONRPC_MESSAGE_NEW ("key", JSONRPC_MESSAGE_PUT_STRV (ar));
   print = g_variant_print (src, TRUE);
   g_assert_cmpstr (print, ==, "{'key': <['a', 'b', 'c']>}");
+
+  r = JSONRPC_MESSAGE_PARSE (src, "key", JSONRPC_MESSAGE_GET_STRV (&get_ar));
+  g_assert_true (r);
+  g_assert_nonnull (get_ar);
+  g_assert_cmpstr (get_ar[0], ==, "a");
+  g_assert_cmpstr (get_ar[1], ==, "b");
+  g_assert_cmpstr (get_ar[2], ==, "c");
+  g_assert_null (get_ar[3]);
 }
 
 gint


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]