common: make pattern matching value-aware 75/202375/4
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Wed, 27 Mar 2019 15:39:22 +0000 (16:39 +0100)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Mon, 1 Apr 2019 10:49:41 +0000 (12:49 +0200)
Change-Id: I94008ccf06c548e8b4390c5990c944ec835c3ea6
Signed-off-by: Maciej Slodczyk <m.slodczyk2@partner.samsung.com>
src/util/common.c

index ca2f87e331a0a442f619b1a843abe6acfbe964e3..753cfe999a1f1866c2fef13821f7065980c65607 100644 (file)
@@ -466,6 +466,7 @@ enum epc_object_type epc_type_from_json(enum json_type type)
        case json_type_null:
                return TYPE_UNKNOWN;
        }
+       return TYPE_UNKNOWN;
 }
 
 bool epc_object_match_pattern(struct epc_object *obj, struct json_object *root)
@@ -474,14 +475,38 @@ bool epc_object_match_pattern(struct epc_object *obj, struct json_object *root)
        int ret;
 
        json_object_object_foreach(root, key, value) {
-               epc_object_get_object(obj, key, &node);
-               if (node->type != epc_type_from_json(json_object_get_type(value)))
+               node = find_child(obj, key);
+
+               if (!node)
+                       return 0;
+
+               if (node->type != (int)epc_type_from_json(json_object_get_type(value)))
                        return 0;
 
-               if (node->type == TYPE_OBJECT) {
+               switch (node->type) {
+               case TYPE_STRING:
+                       if (strcmp(node->val.s, json_object_get_string(value)))
+                               return 0;
+                       break;
+               case TYPE_DOUBLE:
+                       if (node->val.d != json_object_get_double(value))
+                               return 0;
+                       break;
+               case TYPE_INT:
+                       if (node->val.i != json_object_get_int(value))
+                               return 0;
+                       break;
+               case TYPE_BOOL:
+                       if (node->val.b != json_object_get_boolean(value))
+                               return 0;
+                       break;
+               case TYPE_OBJECT:
                        ret = epc_object_match_pattern(node, value);
                        if (!ret)
                                return 0;
+                       break;
+               default:
+                       return 0;
                }
        }