From d7f97dca51d5458714f66dfe4cd84beb67ee1732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 5 Dec 2022 18:44:14 +0100 Subject: [PATCH] feedback-profile: Allow to update profiles Allow to add feedbacks from a profile to another one --- src/fbd-feedback-profile.c | 30 +++++++++++++++++++++ src/fbd-feedback-profile.h | 2 ++ tests/test-fbd-feedback-profile.c | 44 +++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/src/fbd-feedback-profile.c b/src/fbd-feedback-profile.c index 3512256..28d6f29 100644 --- a/src/fbd-feedback-profile.c +++ b/src/fbd-feedback-profile.c @@ -341,3 +341,33 @@ fbd_feedback_profile_level_to_string (FbdFeedbackProfileLevel level) return "full"; } } + +/** + * fbd_profile_update: + * @self: The profile that should be updated + * @new: The profile theme we want to take new feedbacks from + * + * Updates a profile. Feedbacks are read from the `new` profile. If + * feedback already exists in `self` it is overwritten with the feedback + * from `new`. + * + * It is not allowed to update a profile with a profile of a different name. + */ +void +fbd_feedback_profile_update (FbdFeedbackProfile *self, FbdFeedbackProfile *new) +{ + GHashTableIter iter; + const char *event_name; + FbdFeedbackBase *fb; + + g_return_if_fail (FBD_IS_FEEDBACK_PROFILE (self)); + g_return_if_fail (FBD_IS_FEEDBACK_PROFILE (new)); + + g_return_if_fail (g_str_equal (fbd_feedback_profile_get_name (self), + fbd_feedback_profile_get_name (new))); + + g_hash_table_iter_init (&iter, new->feedbacks); + while (g_hash_table_iter_next (&iter, (gpointer)&event_name, (gpointer)&fb)) { + g_hash_table_insert (self->feedbacks, g_strdup (event_name), g_object_ref (fb)); + } +} diff --git a/src/fbd-feedback-profile.h b/src/fbd-feedback-profile.h index 9844172..b054368 100644 --- a/src/fbd-feedback-profile.h +++ b/src/fbd-feedback-profile.h @@ -24,6 +24,8 @@ typedef enum _FbdFeedbackProfileLevel { G_DECLARE_FINAL_TYPE (FbdFeedbackProfile, fbd_feedback_profile, FBD, FEEDBACK_PROFILE, GObject); FbdFeedbackProfile *fbd_feedback_profile_new (const gchar *name); +void fbd_feedback_profile_update (FbdFeedbackProfile *self, + FbdFeedbackProfile *new); const gchar *fbd_feedback_profile_get_name (FbdFeedbackProfile *self); void fbd_feedback_profile_add_feedback (FbdFeedbackProfile *self, FbdFeedbackBase *feedback); diff --git a/tests/test-fbd-feedback-profile.c b/tests/test-fbd-feedback-profile.c index bb7cc5c..96fd247 100644 --- a/tests/test-fbd-feedback-profile.c +++ b/tests/test-fbd-feedback-profile.c @@ -81,6 +81,49 @@ test_fbd_feedback_profile_parse (void) g_assert_true (FBD_IS_FEEDBACK_VIBRA(fb)); } + +static void +test_fbd_feedback_profile_update (void) +{ + FbdFeedbackBase *fb; + FbdFeedbackProfile *a = fbd_feedback_profile_new (PROFILE_NAME); + FbdFeedbackProfile *b = fbd_feedback_profile_new (PROFILE_NAME); + + g_autoptr (FbdFeedbackDummy) fb_a_1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, + "event-name", "a-1", + NULL); + g_autoptr (FbdFeedbackDummy) fb_a_2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, + "event-name", "a-2", + NULL); + /* New event */ + g_autoptr (FbdFeedbackDummy) fb_b_1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, + "event-name", "b-1", + NULL); + /* overwrite existing event */ + g_autoptr (FbdFeedbackDummy) fb_b_2 = g_object_new (FBD_TYPE_FEEDBACK_VIBRA, + "event-name", "a-2", + NULL); + + fbd_feedback_profile_add_feedback (a, FBD_FEEDBACK_BASE(fb_a_1)); + fbd_feedback_profile_add_feedback (a, FBD_FEEDBACK_BASE(fb_a_2)); + + fbd_feedback_profile_add_feedback (b, FBD_FEEDBACK_BASE(fb_b_1)); + fbd_feedback_profile_add_feedback (b, FBD_FEEDBACK_BASE(fb_b_2)); + + fbd_feedback_profile_update (a,b); + + fb = fbd_feedback_profile_get_feedback (a, "a-1"); + g_assert_true (FBD_IS_FEEDBACK_DUMMY(fb)); + fb = fbd_feedback_profile_get_feedback (a, "a-2"); + g_assert_true (FBD_IS_FEEDBACK_VIBRA(fb)); + fb = fbd_feedback_profile_get_feedback (a, "b-1"); + g_assert_true (FBD_IS_FEEDBACK_DUMMY(fb)); + + g_assert_finalize_object (b); + g_assert_finalize_object (a); +} + + gint main (gint argc, gchar *argv[]) { @@ -89,6 +132,7 @@ main (gint argc, gchar *argv[]) g_test_add_func("/feedbackd/fbd/feedback-profile/name", test_fbd_feedback_profile_name); g_test_add_func("/feedbackd/fbd/feedback-profile/feedbacks", test_fbd_feedback_profile_feedbacks); g_test_add_func("/feedbackd/fbd/feedback-profile/parse", test_fbd_feedback_profile_parse); + g_test_add_func("/feedbackd/fbd/feedback-profile/update", test_fbd_feedback_profile_update); return g_test_run(); }