[gnome-session] GsmAutostartApp: Don't return NULL from constructor, use GInitable
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-session] GsmAutostartApp: Don't return NULL from constructor, use GInitable
- Date: Wed, 24 Apr 2013 23:07:52 +0000 (UTC)
commit 6e14faf9138dbbffd1e63e177e53d88963c379e5
Author: Colin Walters <walters verbum org>
Date: Wed Apr 24 16:40:25 2013 -0400
GsmAutostartApp: Don't return NULL from constructor, use GInitable
Recent GObject changes break this; it was never a supported operation.
GInitable is the way to return errors to callers.
https://bugzilla.gnome.org/show_bug.cgi?id=698798
gnome-session/gsm-autostart-app.c | 73 ++++++++++++++++++-------------------
gnome-session/gsm-autostart-app.h | 3 +-
gnome-session/gsm-manager.c | 6 ++-
3 files changed, 42 insertions(+), 40 deletions(-)
---
diff --git a/gnome-session/gsm-autostart-app.c b/gnome-session/gsm-autostart-app.c
index 87c6aec..df8dd28 100644
--- a/gnome-session/gsm-autostart-app.c
+++ b/gnome-session/gsm-autostart-app.c
@@ -97,7 +97,10 @@ static guint signals[LAST_SIGNAL] = { 0 };
#define GSM_AUTOSTART_APP_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object),
GSM_TYPE_AUTOSTART_APP, GsmAutostartAppPrivate))
-G_DEFINE_TYPE (GsmAutostartApp, gsm_autostart_app, GSM_TYPE_APP)
+static void gsm_autostart_app_initable_iface_init (GInitableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GsmAutostartApp, gsm_autostart_app, GSM_TYPE_APP,
+ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, gsm_autostart_app_initable_iface_init))
static void
gsm_autostart_app_init (GsmAutostartApp *app)
@@ -591,8 +594,8 @@ setup_condition_monitor (GsmAutostartApp *app)
}
}
-static gboolean
-load_desktop_file (GsmAutostartApp *app)
+static void
+load_desktop_file (GsmAutostartApp *app)
{
char *dbus_name;
char *startup_id;
@@ -600,9 +603,7 @@ load_desktop_file (GsmAutostartApp *app)
int phase;
gboolean res;
- if (app->priv->app_info == NULL) {
- return FALSE;
- }
+ g_assert (app->priv->app_info != NULL);
phase_str = g_desktop_app_info_get_string (app->priv->app_info,
GSM_AUTOSTART_APP_PHASE_KEY);
@@ -671,8 +672,6 @@ load_desktop_file (GsmAutostartApp *app)
g_free (startup_id);
g_free (dbus_name);
-
- return TRUE;
}
static void
@@ -681,20 +680,16 @@ gsm_autostart_app_set_desktop_filename (GsmAutostartApp *app,
{
if (app->priv->app_info != NULL) {
g_clear_object (&app->priv->app_info);
- g_free (app->priv->desktop_id);
+ g_clear_pointer (&app->priv->desktop_filename, g_free);
+ g_clear_pointer (&app->priv->desktop_id, g_free);
}
if (desktop_filename == NULL) {
return;
}
+ app->priv->desktop_filename = g_strdup (desktop_filename);
app->priv->desktop_id = g_path_get_basename (desktop_filename);
-
- app->priv->app_info = g_desktop_app_info_new_from_filename (desktop_filename);
- if (app->priv->app_info == NULL) {
- g_warning ("Could not parse desktop file %s or it references a not found TryExec binary",
desktop_filename);
- return;
- }
}
static void
@@ -758,6 +753,7 @@ gsm_autostart_app_dispose (GObject *object)
g_clear_pointer (&priv->condition_string, g_free);
g_clear_object (&priv->condition_settings);
g_clear_object (&priv->app_info);
+ g_clear_pointer (&priv->desktop_filename, g_free);
g_clear_pointer (&priv->desktop_id, g_free);
if (priv->child_watch_id > 0) {
@@ -1365,23 +1361,30 @@ gsm_autostart_app_get_app_id (GsmApp *app)
}
}
-static GObject *
-gsm_autostart_app_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_properties)
+static gboolean
+gsm_autostart_app_initable_init (GInitable *initable,
+ GCancellable *cancellable,
+ GError **error)
{
- GsmAutostartApp *app;
-
- app = GSM_AUTOSTART_APP (G_OBJECT_CLASS (gsm_autostart_app_parent_class)->constructor (type,
-
n_construct_properties,
-
construct_properties));
+ GsmAutostartApp *app = GSM_AUTOSTART_APP (initable);
- if (! load_desktop_file (app)) {
- g_object_unref (app);
- app = NULL;
+ g_assert (app->priv->desktop_filename != NULL);
+ app->priv->app_info = g_desktop_app_info_new_from_filename (app->priv->desktop_filename);
+ if (app->priv->app_info == NULL) {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Could not parse desktop file %s or it references a not found TryExec binary",
app->priv->desktop_id);
+ return FALSE;
}
- return G_OBJECT (app);
+ load_desktop_file (app);
+
+ return TRUE;
+}
+
+static void
+gsm_autostart_app_initable_iface_init (GInitableIface *iface)
+{
+ iface->init = gsm_autostart_app_initable_init;
}
static void
@@ -1393,7 +1396,6 @@ gsm_autostart_app_class_init (GsmAutostartAppClass *klass)
object_class->set_property = gsm_autostart_app_set_property;
object_class->get_property = gsm_autostart_app_get_property;
object_class->dispose = gsm_autostart_app_dispose;
- object_class->constructor = gsm_autostart_app_constructor;
app_class->impl_is_disabled = is_disabled;
app_class->impl_is_conditionally_disabled = is_conditionally_disabled;
@@ -1428,13 +1430,10 @@ gsm_autostart_app_class_init (GsmAutostartAppClass *klass)
}
GsmApp *
-gsm_autostart_app_new (const char *desktop_file)
+gsm_autostart_app_new (const char *desktop_file,
+ GError **error)
{
- GsmAutostartApp *app;
-
- app = g_object_new (GSM_TYPE_AUTOSTART_APP,
- "desktop-filename", desktop_file,
- NULL);
-
- return GSM_APP (app);
+ return (GsmApp*) g_initable_new (GSM_TYPE_AUTOSTART_APP, NULL, error,
+ "desktop-filename", desktop_file,
+ NULL);
}
diff --git a/gnome-session/gsm-autostart-app.h b/gnome-session/gsm-autostart-app.h
index 2b6089f..8acaa0a 100644
--- a/gnome-session/gsm-autostart-app.h
+++ b/gnome-session/gsm-autostart-app.h
@@ -57,7 +57,8 @@ struct _GsmAutostartAppClass
GType gsm_autostart_app_get_type (void) G_GNUC_CONST;
-GsmApp *gsm_autostart_app_new (const char *desktop_file);
+GsmApp *gsm_autostart_app_new (const char *desktop_file,
+ GError **error);
void gsm_autostart_app_add_provides (GsmAutostartApp *aapp,
const char *provides);
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
index 146e694..19d3197 100644
--- a/gnome-session/gsm-manager.c
+++ b/gnome-session/gsm-manager.c
@@ -4003,6 +4003,7 @@ add_autostart_app_internal (GsmManager *manager,
{
GsmApp *app;
char **internal_provides;
+ GError *error = NULL;
g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
g_return_val_if_fail (path != NULL, FALSE);
@@ -4033,9 +4034,10 @@ add_autostart_app_internal (GsmManager *manager,
}
}
- app = gsm_autostart_app_new (path);
+ app = gsm_autostart_app_new (path, &error);
if (app == NULL) {
- g_warning ("could not read %s", path);
+ g_warning ("%s", error->message);
+ g_clear_error (&error);
return FALSE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]