Line | Branch | Exec | Source |
---|---|---|---|
1 | // SPDX-License-Identifier: GPL-3.0-or-later | ||
2 | // Copyright (C) 2020 Omar Castro | ||
3 | |||
4 | |||
5 | #include "json_glib_extensions.h" | ||
6 | #include "page_data.h" | ||
7 | |||
8 | static const gchar* EMPTY_STRING = ""; | ||
9 | |||
10 | 4 | PageData * page_data_new(void){ | |
11 | 4 | PageData * pageData = g_malloc0( sizeof ( *pageData ) ); | |
12 | 4 | pageData->message = NULL; | |
13 | 4 | pageData->overlay = NULL; | |
14 | 4 | pageData->prompt = NULL; | |
15 | 4 | pageData->input = g_string_sized_new(256); | |
16 | 4 | pageData->lines = g_array_new (FALSE, TRUE, sizeof (LineData)); | |
17 | 4 | return pageData; | |
18 | } | ||
19 | |||
20 | 1 | void page_data_destroy(PageData * pageData){ | |
21 | 1 | page_data_clear_lines(pageData); | |
22 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(pageData->message != NULL) { g_string_free(pageData->message, TRUE); } |
23 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(pageData->overlay != NULL) { g_string_free(pageData->overlay, TRUE); } |
24 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(pageData->prompt != NULL) { g_string_free(pageData->prompt, TRUE); } |
25 | 1 | g_string_free(pageData->input, TRUE); | |
26 | 1 | g_array_free (pageData->lines, TRUE); | |
27 | 1 | g_free(pageData); | |
28 | 1 | } | |
29 | |||
30 | |||
31 | |||
32 | static gboolean is_page_data_string_member_empty(GString *string_member); | ||
33 | static const char * get_page_data_string_member_or_empty_string(GString *string_member); | ||
34 | static void set_page_data_string_member(GString **string_member, const char * new_string); | ||
35 | |||
36 | |||
37 | |||
38 | 8 | gboolean page_data_is_message_empty(PageData * pageData){ | |
39 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | return pageData == NULL ? TRUE : is_page_data_string_member_empty(pageData->message); |
40 | } | ||
41 | |||
42 | 4 | const char * page_data_get_message_or_empty_string(PageData * pageData){ | |
43 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | return pageData == NULL ? EMPTY_STRING : get_page_data_string_member_or_empty_string(pageData->message); |
44 | } | ||
45 | |||
46 | 2 | void page_data_set_message(PageData * pageData, const char * message){ | |
47 | 2 | set_page_data_string_member(&pageData->message, message); | |
48 | 2 | } | |
49 | |||
50 | ✗ | gboolean page_data_is_overlay_empty(PageData * pageData){ | |
51 | ✗ | return pageData == NULL ? TRUE : is_page_data_string_member_empty(pageData->overlay); | |
52 | } | ||
53 | |||
54 | 6 | const char * page_data_get_overlay_or_empty_string(PageData * pageData){ | |
55 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | return pageData == NULL ? EMPTY_STRING : get_page_data_string_member_or_empty_string(pageData->overlay); |
56 | } | ||
57 | |||
58 | ✗ | void page_data_set_overlay(PageData * pageData, const char * overlay){ | |
59 | ✗ | set_page_data_string_member(&pageData->overlay, overlay); | |
60 | ✗ | } | |
61 | |||
62 | |||
63 | |||
64 | |||
65 | 19 | size_t page_data_get_number_of_lines(PageData * pageData){ | |
66 | 19 | return pageData->lines->len; | |
67 | } | ||
68 | |||
69 | |||
70 | 57 | LineData * page_data_get_line_by_index_or_else(PageData * pageData, unsigned int index, LineData * elseValue){ | |
71 |
4/4✓ Branch 0 taken 56 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 55 times.
|
57 | if(pageData == NULL || index >= pageData->lines->len){ |
72 | 2 | return elseValue; | |
73 | } | ||
74 | 55 | LineData * result = &g_array_index (pageData->lines, LineData, index); | |
75 | 55 | return result; | |
76 | } | ||
77 | |||
78 | |||
79 | 11 | void page_data_add_line(PageData * pageData, const gchar * label, const gchar * icon, const gchar * data, gboolean urgent, gboolean highlight, gboolean markup, gboolean nonselectable){ | |
80 | 11 | LineData line = { | |
81 | 11 | .text = g_strdup(label), | |
82 | 11 | .icon = g_strdup(icon), | |
83 | 11 | .data = g_strdup(data), | |
84 | .urgent = urgent, | ||
85 | .highlight = highlight, | ||
86 | .markup = markup, | ||
87 | .nonselectable = nonselectable | ||
88 | }; | ||
89 | 11 | g_array_append_val(pageData->lines, line); | |
90 | 11 | } | |
91 | |||
92 | 10 | void page_data_add_line_json_node(PageData * pageData, JsonNode * element){ | |
93 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
10 | if(JSON_NODE_HOLDS_VALUE(element) && json_node_get_value_type(element) == G_TYPE_STRING){ |
94 | 10 | page_data_add_line(pageData, json_node_get_string(element), EMPTY_STRING, EMPTY_STRING, FALSE, FALSE, pageData->markup_default == MarkupStatus_ENABLED, FALSE); | |
95 | ✗ | } else if(JSON_NODE_HOLDS_OBJECT(element)){ | |
96 | ✗ | JsonObject * line_obj = json_node_get_object(element); | |
97 | ✗ | const gchar * text = json_object_get_string_member_or_else(line_obj, "text", EMPTY_STRING); | |
98 | ✗ | const gchar * icon = json_object_get_string_member_or_else(line_obj, "icon", EMPTY_STRING); | |
99 | ✗ | const gchar * data = json_object_get_string_member_or_else(line_obj, "data", EMPTY_STRING); | |
100 | ✗ | gboolean urgent = json_object_get_boolean_member_or_else(line_obj, "urgent", FALSE); | |
101 | ✗ | gboolean highlight = json_object_get_boolean_member_or_else(line_obj, "highlight", FALSE); | |
102 | ✗ | gboolean markup = json_object_get_boolean_member_or_else(line_obj, "markup", pageData->markup_default == MarkupStatus_ENABLED); | |
103 | ✗ | gboolean nonselectable = json_object_get_boolean_member_or_else(line_obj, "nonselectable", FALSE); | |
104 | ✗ | page_data_add_line(pageData, text, icon, data, urgent, highlight, markup, nonselectable); | |
105 | } | ||
106 | 10 | } | |
107 | |||
108 | 4 | void page_data_clear_lines(PageData * pageData){ | |
109 | 4 | GArray * lines = pageData->lines; | |
110 | 4 | int lines_length = lines->len; | |
111 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
|
5 | for (int i = 0; i < lines_length; i++){ |
112 | 1 | LineData line = g_array_index (lines, LineData, i); | |
113 | 1 | g_free(line.text); | |
114 | 1 | g_free(line.icon); | |
115 | 1 | g_free(line.data); | |
116 | } | ||
117 | 4 | g_array_set_size(pageData->lines, 0); | |
118 | 4 | } | |
119 | |||
120 | |||
121 | |||
122 | 8 | static gboolean is_page_data_string_member_empty(GString *string_member){ | |
123 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
|
8 | return string_member == NULL || string_member->len <= 0; |
124 | } | ||
125 | |||
126 | 10 | static const char * get_page_data_string_member_or_empty_string(GString *string_member){ | |
127 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 6 times.
|
10 | return string_member == NULL ? EMPTY_STRING : string_member->str; |
128 | } | ||
129 | |||
130 | 2 | static void set_page_data_string_member(GString **string_member, const char * new_string){ | |
131 | 2 | gboolean isDefined = *string_member != NULL; | |
132 | 2 | gboolean willDefine = new_string != NULL; | |
133 | |||
134 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2 | if( isDefined && willDefine ){ |
135 | ✗ | g_string_assign(*string_member, new_string); | |
136 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2 | } else if( isDefined && !willDefine ){ |
137 | ✗ | g_string_free(*string_member, TRUE); | |
138 | ✗ | *string_member = NULL; | |
139 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | } else if ( !isDefined && willDefine ){ |
140 | 2 | *string_member = g_string_new (new_string); | |
141 | } | ||
142 | //else do nothing, *string_member is already NULL | ||
143 | |||
144 | 2 | } | |
145 |