]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
htsmsg: added automatic conversion from string to msg/list
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 16 Aug 2013 12:47:41 +0000 (13:47 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 16 Aug 2013 12:47:41 +0000 (13:47 +0100)
This is done on request if the string can be JSON deserialized. This is
useful for the common API where the webui will be sending in serialized
strings and saves having the special case "args" field.

For things like HTSP, which deal directly in htsmsg, the fields should
already have been converted to the right formats etc...

src/htsmsg.c

index 055455bfb0304238e04810e5c84909071092e45e..2fb97a45b63389ca80c0e577d1f476fb717b49ff 100644 (file)
 #include <string.h>
 #include "htsmsg.h"
 #include "misc/dbl.h"
+#include "htsmsg_json.h"
 
 static void htsmsg_clear(htsmsg_t *msg);
+static htsmsg_t *
+htsmsg_field_get_msg ( htsmsg_field_t *f, int islist );
 
 /**
  *
@@ -606,10 +609,16 @@ htsmsg_get_map(htsmsg_t *msg, const char *name)
 {
   htsmsg_field_t *f;
 
-  if((f = htsmsg_field_find(msg, name)) == NULL || f->hmf_type != HMF_MAP)
+  if((f = htsmsg_field_find(msg, name)) == NULL)
     return NULL;
 
-  return &f->hmf_msg;
+  return htsmsg_field_get_map(f);
+}
+
+htsmsg_t *
+htsmsg_field_get_map(htsmsg_field_t *f)
+{
+  return htsmsg_field_get_msg(f, 0);
 }
 
 /**
@@ -661,10 +670,38 @@ htsmsg_get_list(htsmsg_t *msg, const char *name)
 {
   htsmsg_field_t *f;
 
-  if((f = htsmsg_field_find(msg, name)) == NULL || f->hmf_type != HMF_LIST)
+  if((f = htsmsg_field_find(msg, name)) == NULL)
     return NULL;
 
-  return &f->hmf_msg;
+  return htsmsg_field_get_list(f);
+}
+
+htsmsg_t *
+htsmsg_field_get_list ( htsmsg_field_t *f )
+{
+  return htsmsg_field_get_msg(f, 1);
+}
+
+static htsmsg_t *
+htsmsg_field_get_msg ( htsmsg_field_t *f, int islist )
+{
+  htsmsg_t *m;
+
+  /* Deserialize JSON (will keep either list or map) */
+  if (f->hmf_type == HMF_STR) {
+    if ((m = htsmsg_json_deserialize(f->hmf_str))) {
+      free((void*)f->hmf_str);
+      f->hmf_type          = m->hm_islist ? HMF_LIST : HMF_MAP;
+      f->hmf_msg.hm_islist = m->hm_islist;
+      TAILQ_MOVE(&f->hmf_msg.hm_fields, &m->hm_fields, hmf_link);
+      free(m);
+    }
+  }
+
+  if (f->hmf_type == (islist ? HMF_LIST : HMF_MAP))
+    return &f->hmf_msg;
+
+  return NULL;
 }
 
 /**