Make PurpleUi.start return a gboolean and GError
This allows the user interface to handle initialization errors in one place as
purple_core_init calls purple_ui_start.
Testing Done:
Compiled and ran pidgin3
Reviewed at https://reviews.imfreedom.org/r/2008/
--- a/finch/finchui.c Tue Nov 01 00:03:51 2022 -0500
+++ b/finch/finchui.c Tue Nov 01 00:27:44 2022 -0500
@@ -92,10 +92,8 @@
-finch_ui_start(G_GNUC_UNUSED PurpleUi *ui) {
+finch_ui_start(G_GNUC_UNUSED PurpleUi *ui, GError **error) { @@ -106,10 +104,16 @@
- if(!finch_history_init(&error)) {
- g_critical("failed to initialize the history api: %s",
- error != NULL ? error->message : "unknown");
+ if(!finch_history_init(error)) { + const char *error_message = "unknown"; + if(error != NULL && *error != NULL) { + error_message = (*error)->message; + g_critical("failed to initialize the history api: %s", error_message); purple_prefs_add_none("/purple/gnt");
@@ -158,6 +162,8 @@
gnt_register_action(_("Preferences"), finch_prefs_show_all);
gnt_register_action(_("Statuses"), finch_savedstatus_show_all);
--- a/libpurple/core.c Tue Nov 01 00:03:51 2022 -0500
+++ b/libpurple/core.c Tue Nov 01 00:27:44 2022 -0500
@@ -207,7 +207,9 @@
- purple_ui_start(core->ui);
+ if(!purple_ui_start(core->ui, error)) { /* Load the buddy list after UI init */
--- a/libpurple/purpleui.c Tue Nov 01 00:03:51 2022 -0500
+++ b/libpurple/purpleui.c Tue Nov 01 00:27:44 2022 -0500
@@ -386,16 +386,18 @@
-purple_ui_start(PurpleUi *ui) {
+purple_ui_start(PurpleUi *ui, GError **error) { PurpleUiClass *klass = NULL;
- g_return_if_fail(PURPLE_IS_UI(ui));
+ g_return_val_if_fail(PURPLE_IS_UI(ui), FALSE); klass = PURPLE_UI_GET_CLASS(ui);
if(klass != NULL && klass->start != NULL) {
+ return klass->start(ui, error); --- a/libpurple/purpleui.h Tue Nov 01 00:03:51 2022 -0500
+++ b/libpurple/purpleui.h Tue Nov 01 00:27:44 2022 -0500
@@ -63,7 +63,7 @@
void (*prefs_init)(PurpleUi *ui);
- void (*start)(PurpleUi *ui);
+ gboolean (*start)(PurpleUi *ui, GError **error); void (*stop)(PurpleUi *ui);
gpointer (*get_settings_backend)(PurpleUi *ui);
@@ -159,15 +159,21 @@
+ * @error: (optional) (nullable): A return address for a [type@GLib.GError]. * Tells @ui that libpurple is done initializing and that @ui should continue
+ * The user interface can return errors here which will be propagated by + * [func@Purple.core_init] which calls this function. * Note: This should only be called by libpurple.
+ * Returns: %TRUE if successful, otherwise %FALSE with @error optionally set. -void purple_ui_start(PurpleUi *ui);
+gboolean purple_ui_start(PurpleUi *ui, GError **error); --- a/libpurple/tests/test_ui.c Tue Nov 01 00:03:51 2022 -0500
+++ b/libpurple/tests/test_ui.c Tue Nov 01 00:27:44 2022 -0500
@@ -70,9 +70,11 @@
G_DEFINE_TYPE(TestPurpleUi, test_purple_ui, PURPLE_TYPE_UI)
-test_purple_ui_start(G_GNUC_UNUSED PurpleUi *ui) {
+test_purple_ui_start(G_GNUC_UNUSED PurpleUi *ui, G_GNUC_UNUSED GError **error) { purple_conversations_set_ui_ops(&test_conv_uiops);
--- a/pidgin/pidginui.c Tue Nov 01 00:03:51 2022 -0500
+++ b/pidgin/pidginui.c Tue Nov 01 00:27:44 2022 -0500
@@ -138,12 +138,11 @@
-pidgin_ui_start(G_GNUC_UNUSED PurpleUi *ui) {
+pidgin_ui_start(G_GNUC_UNUSED PurpleUi *ui, GError **error) { PurpleProtocolManager *protocol_manager = NULL;
GdkDisplay *display = NULL;
GtkIconTheme *theme = NULL;
@@ -168,10 +167,16 @@
purple_protocol_manager_foreach(protocol_manager,
pidgin_ui_protocol_foreach_theme_cb, NULL);
- if(!pidgin_history_init(&error)) {
- g_critical("failed to initialize the history api: %s",
- error != NULL ? error->message : "unknown");
+ if(!pidgin_history_init(error)) { + const char *error_message = "unknown"; + if(error != NULL && *error != NULL) { + error_message = (*error)->message; + g_critical("failed to initialize the history api: %s", error_message); /* Set the UI operation structures. */
@@ -194,6 +199,8 @@