source: ogServer-Git/src/json.c @ 5b1efd0

Last change on this file since 5b1efd0 was 27fbc65, checked in by OpenGnSys Support Team <soporte-og@…>, 4 years ago

#941 Add og_json_parse_string_copy(...) function

This function provides an easy way to copy the content of a json string
into a regular C string.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*
2 * Copyright (C) 2020 Soleta Networks <info@soleta.eu>
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Affero General Public License as published by the
6 * Free Software Foundation, version 3.
7 */
8
9#include "json.h"
10#include <stdint.h>
11
12int og_json_parse_string(json_t *element, const char **str)
13{
14        if (json_typeof(element) != JSON_STRING)
15                return -1;
16
17        *str = json_string_value(element);
18        return 0;
19}
20
21int og_json_parse_string_copy(json_t *element, char *str, size_t size)
22{
23        const char *reference_str;
24        int err = 0;
25
26        err = og_json_parse_string(element, &reference_str);
27        if (err != 0)
28                return err;
29
30        err = snprintf(str, size, "%s", reference_str);
31        if (err >= size)
32                return -1;
33        return 0;
34}
35
36int og_json_parse_uint64(json_t *element, uint64_t *integer)
37{
38        if (json_typeof(element) != JSON_INTEGER)
39                return -1;
40
41        *integer = json_integer_value(element);
42        return 0;
43}
44
45int og_json_parse_uint(json_t *element, uint32_t *integer)
46{
47        if (json_typeof(element) != JSON_INTEGER)
48                return -1;
49
50        *integer = json_integer_value(element);
51        return 0;
52}
53
54int og_json_parse_bool(json_t *element, bool *value)
55{
56        if (json_typeof(element) == JSON_TRUE)
57                *value = true;
58        else if (json_typeof(element) == JSON_FALSE)
59                *value = false;
60        else
61                return -1;
62
63        return 0;
64}
65
66int og_json_parse_scope(json_t *element, struct og_scope *scope,
67                        const uint64_t required_flags)
68{
69        uint64_t flags = 0UL;
70        const char *key;
71        json_t *value;
72        int err = 0;
73
74        json_object_foreach(element, key, value) {
75                if (!strcmp(key, "id")) {
76                        err = og_json_parse_uint(value, &scope->id);
77                        flags |= OG_PARAM_SCOPE_ID;
78                } else if (!strcmp(key, "type")) {
79                        err = og_json_parse_string(value, &scope->type);
80                        flags |= OG_PARAM_SCOPE_TYPE;
81                } else {
82                        err = -1;
83                }
84
85                if (err < 0)
86                        return err;
87        }
88
89        if (flags != required_flags)
90                return -1;
91
92        return err;
93}
94
95int og_json_parse_partition(json_t *element, struct og_partition *part,
96                            uint64_t required_flags)
97{
98        uint64_t flags = 0UL;
99        const char *key;
100        json_t *value;
101        int err = 0;
102
103        json_object_foreach(element, key, value) {
104                if (!strcmp(key, "partition")) {
105                        err = og_json_parse_string(value, &part->number);
106                        flags |= OG_PARAM_PART_NUMBER;
107                } else if (!strcmp(key, "code")) {
108                        err = og_json_parse_string(value, &part->code);
109                        flags |= OG_PARAM_PART_CODE;
110                } else if (!strcmp(key, "filesystem")) {
111                        err = og_json_parse_string(value, &part->filesystem);
112                        flags |= OG_PARAM_PART_FILESYSTEM;
113                } else if (!strcmp(key, "size")) {
114                        err = og_json_parse_string(value, &part->size);
115                        flags |= OG_PARAM_PART_SIZE;
116                } else if (!strcmp(key, "format")) {
117                        err = og_json_parse_string(value, &part->format);
118                        flags |= OG_PARAM_PART_FORMAT;
119                } else if (!strcmp(key, "disk")) {
120                        err = og_json_parse_string(value, &part->disk);
121                        flags |= OG_PARAM_PART_DISK;
122                } else if (!strcmp(key, "os")) {
123                        err = og_json_parse_string(value, &part->os);
124                        flags |= OG_PARAM_PART_OS;
125                } else if (!strcmp(key, "used_size")) {
126                        err = og_json_parse_string(value, &part->used_size);
127                        flags |= OG_PARAM_PART_USED_SIZE;
128                }
129
130                if (err < 0)
131                        return err;
132        }
133
134        if (flags != required_flags)
135                return -1;
136
137        return err;
138}
Note: See TracBrowser for help on using the repository browser.