aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2011-01-26 12:56:32 -0600
committerTed Gould <ted@gould.cx>2011-01-26 12:56:32 -0600
commit0bd9ddc0eee8e317f368fcb996e2931f42ed8f0b (patch)
tree3c4b29a50d2b5ebd0df49fb30c18df2a014511a6
parent85761bcb811b75dc0470369581f452e17ebd95f1 (diff)
downloadayatana-indicator-application-0bd9ddc0eee8e317f368fcb996e2931f42ed8f0b.tar.gz
ayatana-indicator-application-0bd9ddc0eee8e317f368fcb996e2931f42ed8f0b.tar.bz2
ayatana-indicator-application-0bd9ddc0eee8e317f368fcb996e2931f42ed8f0b.zip
Protecting against empty application lists, fixing the builder to be on the stack and using it correctly.
-rw-r--r--src/application-service-appstore.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c
index 481d886..dd94561 100644
--- a/src/application-service-appstore.c
+++ b/src/application-service-appstore.c
@@ -1156,24 +1156,43 @@ static GVariant *
get_applications (ApplicationServiceAppstore * appstore)
{
ApplicationServiceAppstorePrivate * priv = appstore->priv;
+ GVariant * out = NULL;
- GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
- GList * listpntr;
- gint position = 0;
+ if (g_list_length(priv->applications) > 0) {
+ GVariantBuilder builder;
+ GList * listpntr;
+ gint position = 0;
- for (listpntr = priv->applications; listpntr != NULL; listpntr = g_list_next(listpntr)) {
- Application * app = (Application *)listpntr->data;
- if (app->visible_state == VISIBLE_STATE_HIDDEN) {
- continue;
+ g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
+
+ for (listpntr = priv->applications; listpntr != NULL; listpntr = g_list_next(listpntr)) {
+ Application * app = (Application *)listpntr->data;
+ if (app->visible_state == VISIBLE_STATE_HIDDEN) {
+ continue;
+ }
+
+ g_variant_builder_add (&builder, "(sisosss)", app->icon,
+ position++, app->dbus_name, app->menu,
+ app->icon_theme_path, app->label,
+ app->guide);
}
- g_variant_builder_add (builder, "(sisosss)", app->icon,
- position++, app->dbus_name, app->menu,
- app->icon_theme_path, app->label,
- app->guide);
+ out = g_variant_builder_end(&builder);
+ } else {
+ GError * error = NULL;
+ out = g_variant_parse(g_variant_type_new("a(sisosss)"), "[]", NULL, NULL, &error);
+ if (error != NULL) {
+ g_warning("Unable to parse '[]' as a 'a(sisosss)': %s", error->message);
+ out = NULL;
+ g_error_free(error);
+ }
}
- return g_variant_new("(a(sisosss))", builder);
+ if (out != NULL) {
+ return g_variant_new_tuple(&out, 1);
+ } else {
+ return NULL;
+ }
}
/* Removes and approver from our list of approvers and