summaryrefslogtreecommitdiff
path: root/ufo/ufo-json-routines.c
blob: 46afe22d355f3808389195a5d270d597dc13c119 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <ufo/ufo-json-routines.h>

/**
 * ufo_transform_string:
 * @pattern: A pattern to place the result string in it.
 * @s: A string, which should be placed in the @pattern.
 * @separator: A string containing separator symbols in the @s that should be removed
 *
 * Returns: A string there in @pattern was placed @s.
 */
gchar *
ufo_transform_string (const gchar *pattern,
                      const gchar *s,
                      const gchar *separator)
{
    gchar **sv;
    gchar *transformed;
    gchar *result;
    sv = g_strsplit_set (s, "-_ ", -1);
    transformed = g_strjoinv (separator, sv);
    result = g_strdup_printf (pattern, transformed);
    g_strfreev (sv);
    g_free (transformed);
    return result;
}

/**
 * ufo_object_from_json:
 * @object: A #JsonObject that should be processed.
 * @manager: A #UfoPluginManager.
 *
 * Returns: (transfer full): A pointer to the object created with passed Json @object.
 */
gpointer
ufo_object_from_json (JsonObject       *object,
                      UfoPluginManager *manager)
{
    const gchar *namespace = json_object_get_string_member (object, "namespace");
    const gchar *type = json_object_get_string_member (object, "type");
    const gchar *name = json_object_get_string_member (object, "name");

    if (!namespace || !type || !name) {
        g_warning ("The object cannot be loaded because it is not identified. Please specify \"namespace\", \"type\" and \"name\"");
        return NULL;
    }

    gchar *namespace_t = ufo_transform_string ("%s", namespace, "_");
    gchar *type_t = ufo_transform_string ("%s", type, "_");
    gchar *name_t = ufo_transform_string ("%s", name, "_");

    const gchar *module_name;
    module_name = g_strdup_printf ("libufo%s_%s_%s.so", namespace_t, name_t, type_t);
    const gchar *func_name;
    func_name = g_strdup_printf ("ufo_%s_%s_%s_new", namespace_t, name_t, type_t);
    g_free (namespace_t);
    g_free (type_t);
    g_free (name_t);

    GError *error = NULL;
    gpointer plugin = ufo_plugin_manager_get_plugin (manager,
                                                     func_name,
                                                     module_name,
                                                     &error);
    if (error != NULL) {
      g_warning ("%s", error->message);
      return NULL;
    }

    if (json_object_has_member (object, "properties")) {
        JsonObject *prop_object = json_object_get_object_member (object, "properties");

        GList *members = json_object_get_members (prop_object);
        GList *member = NULL;
        gchar *member_name = NULL;

        for (member = g_list_first (members);
             member != NULL;
             member = g_list_next (member))
        {
            member_name = member->data;
            JsonNode *node = json_object_get_member(prop_object, member_name);

            if (JSON_NODE_HOLDS_VALUE (node)) {
                GValue val = {0,};
                json_node_get_value (node, &val);
                g_object_set_property (G_OBJECT (plugin), member_name, &val);
                g_value_unset (&val);
            }
            else if (JSON_NODE_HOLDS_OBJECT (node)) {
                JsonObject *inner_object = json_node_get_object (node);
                g_object_set (G_OBJECT (plugin),
                              member_name,
                              ufo_object_from_json (inner_object, manager),
                              NULL);
            }
            else {
                g_warning ("`%s' is neither a primitive value nor an object!",
                           member_name);
            }
        }
    }

    return plugin;
}