| 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 |