settings: use WpSpaJson instead of raw string in WpSettingsChangedCallback

Avoids users to construct a WpSpaJson every time the callback is triggered.
This commit is contained in:
Julian Bouzas 2022-09-01 08:22:56 -04:00
parent a512ddaaf3
commit d28d7d4278
5 changed files with 76 additions and 79 deletions

View file

@ -655,8 +655,13 @@ on_metadata_changed (WpMetadata *m, guint32 subject,
const gchar *setting, const gchar *type, const gchar *new_value, gpointer d)
{
WpSettings *self = WP_SETTINGS(d);
const gchar *old_value = wp_properties_get (self->settings, setting);
const gchar *old_value = NULL;
/* Only handle JSON metadata values */
if (!g_str_equal (type, "Spa:String:JSON"))
return;
old_value = wp_properties_get (self->settings, setting);
if (!old_value) {
wp_info_object (self, "new setting defined \"%s\" = \"%s\"",
setting, new_value);
@ -671,15 +676,17 @@ on_metadata_changed (WpMetadata *m, guint32 subject,
Callback *cb = g_ptr_array_index (self->callbacks, i);
if (g_pattern_match_simple (cb->pattern, setting)) {
g_autoptr (WpSpaJson) json = NULL;
GValue values[3] = { G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT };
g_value_init (&values[0], G_TYPE_OBJECT);
g_value_init (&values[1], G_TYPE_STRING);
g_value_init (&values[2], G_TYPE_STRING);
g_value_init (&values[2], WP_TYPE_SPA_JSON);
g_value_set_object (&values[0], self);
g_value_set_string (&values[1], setting);
g_value_set_string (&values[2], new_value);
json = new_value ? wp_spa_json_new_from_string (new_value) : NULL;
g_value_set_boxed (&values[2], json);
g_closure_invoke (cb->closure, NULL, 3, values, NULL);

View file

@ -37,16 +37,16 @@ WpSettings * wp_settings_get_instance (WpCore * core,
const gchar *metadata_name);
/*!
* \brief callback conveying the changed setting and its string(raw) value
* \brief callback conveying the changed setting and its json value
*
* \ingroup wpsettings
* \param obj the wpsettings object
* \param setting the changed setting
* \param raw_value string value of the the changed setting
* \param value json value of the the changed setting
* \param user_data data passed in the \a wp_settings_subscribe
*/
typedef void (*WpSettingsChangedCallback) (WpSettings *obj,
const gchar *setting, const gchar *raw_value, gpointer user_data);
const gchar *setting, WpSpaJson *value, gpointer user_data);
WP_API
guintptr wp_settings_subscribe (WpSettings *self,

View file

@ -563,7 +563,7 @@ get_settings (WpDefaultNodes *self, const gchar *setting)
void
wp_settings_changed_callback (WpSettings *obj, const gchar *setting,
const gchar *raw_value, gpointer user_data)
WpSpaJson *value, gpointer user_data)
{
WpDefaultNodes *self = WP_DEFAULT_NODES (user_data);
g_return_if_fail (self);

View file

@ -7,17 +7,6 @@
*/
#include "../common/base-test-fixture.h"
/*
* tests the loading & parsing of JSON conf file(pls check the .conf that is
* loaded), metadata updates, wpsetttings object creation and its API.
*/
typedef enum {
BOOLEAN,
INTEGER,
STRING,
FLOAT
} SettingType;
typedef struct {
WpBaseTestFixture base;
@ -29,9 +18,8 @@ typedef struct {
WpSettings *s;
gchar *triggered_setting;
gchar *triggered_setting_value;
WpSpaJson *triggered_setting_value;
gboolean triggered_callback;
SettingType setting_type;
} TestSettingsFixture;
static void
@ -634,29 +622,31 @@ test_rules (TestSettingsFixture *self, gconstpointer data)
}
void wp_settings_changed_callback (WpSettings *obj, const gchar *setting,
const gchar *raw_value, gpointer user_data)
WpSpaJson *json, gpointer user_data)
{
TestSettingsFixture *self = user_data;
g_assert_cmpstr (setting, ==, self->triggered_setting);
self->triggered_callback = true;
g_autoptr (WpSpaJson) j = wp_settings_get (self->s, setting);
g_assert_nonnull (j);
g_assert_nonnull (json);
if (self->setting_type == BOOLEAN) {
gboolean value = FALSE;
g_assert_true (wp_spa_json_parse_boolean (j, &value));
g_assert_cmpint (value, ==, spa_atob (self->triggered_setting_value));
g_assert_cmpstr (raw_value, ==, self->triggered_setting_value);
} else if (self->setting_type == INTEGER) {
gint value = 0;
g_assert_true (wp_spa_json_parse_int (j, &value));
g_assert_cmpint (value, ==, atoi (self->triggered_setting_value));
g_assert_cmpstr (raw_value, ==, self->triggered_setting_value);
} else if (self->setting_type == STRING) {
g_autofree gchar *value = wp_spa_json_parse_string (j);
if (wp_spa_json_is_boolean (json)) {
gboolean value = FALSE, expected = FALSE;
g_assert_true (wp_spa_json_parse_boolean (json, &value));
g_assert_true (wp_spa_json_parse_boolean (self->triggered_setting_value,
&expected));
g_assert_cmpint (value, ==, expected);
} else if (wp_spa_json_is_int (json)) {
gint value = 0, expected = 0;
g_assert_true (wp_spa_json_parse_int (json, &value));
g_assert_true (wp_spa_json_parse_int (self->triggered_setting_value,
&expected));
g_assert_cmpint (value, ==, expected);
} else if (wp_spa_json_is_string (json)) {
g_autofree gchar *value = wp_spa_json_parse_string (json);
g_autofree gchar *expected = wp_spa_json_parse_string (json);
g_assert_nonnull (value);
g_assert_cmpstr (value, ==, self->triggered_setting_value);
g_assert_cmpstr (raw_value, ==, self->triggered_setting_value);
g_assert_nonnull (expected);
g_assert_cmpstr (value, ==, expected);
}
}
@ -672,56 +662,57 @@ test_callbacks (TestSettingsFixture *self, gconstpointer data)
wp_settings_changed_callback, (gpointer)self);
{
g_autoptr (WpSpaJson) json = wp_spa_json_new_boolean (TRUE);
self->triggered_setting = "test-setting1";
self->triggered_setting_value = "true";
self->triggered_callback = false;
self->setting_type = BOOLEAN;
self->triggered_setting_value = json;
self->triggered_callback = FALSE;
wp_metadata_set (self->metadata, 0, self->triggered_setting,
"Spa:String:JSON", self->triggered_setting_value);
g_assert_cmpint (self->triggered_callback, ==, true);
"Spa:String:JSON", wp_spa_json_get_data (json));
g_assert_cmpint (self->triggered_callback, ==, TRUE);
}
{
g_autoptr (WpSpaJson) json = wp_spa_json_new_boolean (TRUE);
self->triggered_setting = "test-setting1";
self->triggered_setting_value = "true";
self->setting_type = BOOLEAN;
self->triggered_callback = false;
self->triggered_setting_value = json;
self->triggered_callback = FALSE;
wp_metadata_set (self->metadata, 0, self->triggered_setting,
"Spa:String:JSON", self->triggered_setting_value);
g_assert_cmpint (self->triggered_callback, ==, false);
"Spa:String:JSON", wp_spa_json_get_data (json));
g_assert_cmpint (self->triggered_callback, ==, FALSE);
}
{
g_autoptr (WpSpaJson) json = wp_spa_json_new_int (99);
self->triggered_setting = "test-setting3-int";
self->setting_type = INTEGER;
self->triggered_setting_value = "99";
self->triggered_callback = true;
self->triggered_setting_value = json;
self->triggered_callback = TRUE;
wp_metadata_set (self->metadata, 0, self->triggered_setting,
"Spa:String:JSON", self->triggered_setting_value);
g_assert_cmpint (self->triggered_callback, ==, true);
"Spa:String:JSON", wp_spa_json_get_data (json));
g_assert_cmpint (self->triggered_callback, ==, TRUE);
}
{
g_autoptr (WpSpaJson) json = wp_spa_json_new_string ("lets not blabber");
self->triggered_setting = "test-setting4-string";
self->setting_type = STRING;
self->triggered_setting_value = "lets not blabber";
self->triggered_callback = true;
self->triggered_setting_value = json;
self->triggered_callback = TRUE;
wp_metadata_set (self->metadata, 0, self->triggered_setting,
"Spa:String:JSON", self->triggered_setting_value);
g_assert_cmpint (self->triggered_callback, ==, true);
"Spa:String:JSON", wp_spa_json_get_data (json));
g_assert_cmpint (self->triggered_callback, ==, TRUE);
}
{
g_autoptr (WpSpaJson) json = wp_spa_json_new_string ("lets blabber");
self->triggered_setting = "test-setting4-string";
self->setting_type = STRING;
self->triggered_setting_value = "lets blabber";
self->triggered_callback = false;
self->triggered_setting_value = json;
self->triggered_callback = FALSE;
g_assert_cmpint (wp_settings_unsubscribe (s, sub_id), ==,
true);
g_assert_cmpint (wp_settings_unsubscribe (s, (sub_id-1)), ==,
false);
wp_metadata_set (self->metadata, 0, self->triggered_setting,
"Spa:String:JSON", self->triggered_setting_value);
g_assert_cmpint (self->triggered_callback, ==, false);
"Spa:String:JSON", wp_spa_json_get_data (json));
g_assert_cmpint (self->triggered_callback, ==, FALSE);
}
}

View file

@ -256,27 +256,26 @@ local setting_value
local callback
local finish_activation
function callback (obj, s, rawvalue)
local json = Json.Raw (rawvalue)
function callback (obj, s, json)
assert (json ~= nil)
if (json:is_boolean()) then
assert (s == setting)
callback = true
assert (json:parse() == setting_value)
assert (setting_value == Settings.get (s, "test-settings"):parse())
assert (json:parse() == setting_value:parse())
assert (setting_value:parse() == Settings.get (s, "test-settings"):parse())
elseif (json:is_int()) then
assert (s == setting)
callback = true
assert (json:parse() == setting_value)
assert (setting_value == Settings.get (s, "test-settings"):parse())
assert (json:parse() == setting_value:parse())
assert (setting_value:parse() == Settings.get (s, "test-settings"):parse())
elseif (json:is_string()) then
assert (s == setting)
callback = true
assert (json:parse() == setting_value)
assert (setting_value == Settings.get (s, "test-settings"):parse())
assert (json:parse() == setting_value:parse())
assert (setting_value:parse() == Settings.get (s, "test-settings"):parse())
end
if (finish_activation) then
@ -297,35 +296,35 @@ metadata_om:connect("objects-changed", function (om)
-- test #1
setting = "test-setting1"
setting_value = true
setting_value = Json.Boolean (true)
callback = false
metadata:set(0, setting, "Spa:String:JSON", tostring(setting_value))
metadata:set(0, setting, "Spa:String:JSON", setting_value:get_data())
assert (callback)
-- test #2
setting = "test-setting1"
setting_value = true
setting_value = Json.Boolean (true)
callback = false
metadata:set(0, setting, "Spa:String:JSON", tostring(setting_value))
metadata:set(0, setting, "Spa:String:JSON", setting_value:get_data())
assert (not callback)
-- test #3
setting = "test-setting3-int"
setting_value = 99
setting_value = Json.Int (99)
callback = false
metadata:set(0, setting, "Spa:String:JSON", setting_value)
metadata:set(0, setting, "Spa:String:JSON", setting_value:get_data())
assert (callback)
-- test #4
setting = "test-setting4-string"
setting_value = "lets not blabber"
setting_value = Json.String ("lets not blabber")
callback = false
finish_activation = true
metadata:set(0, setting, "Spa:String:JSON", "\"lets not blabber\"")
metadata:set(0, setting, "Spa:String:JSON", setting_value:get_data())
assert (callback)
end)