aboutsummaryrefslogtreecommitdiff
path: root/src/messages-service.c
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2012-11-20 22:20:23 +0100
committerLars Uebernickel <lars.uebernickel@canonical.com>2012-11-20 22:20:23 +0100
commit2021da310c84d28efcf9bb359b7a8f7065743267 (patch)
treea3b1f70e0eaad9fc75218c7269a1267bcc6f1704 /src/messages-service.c
parent6f990698f610eb444845f36a70cad04bca2415f3 (diff)
downloadayatana-indicator-messages-2021da310c84d28efcf9bb359b7a8f7065743267.tar.gz
ayatana-indicator-messages-2021da310c84d28efcf9bb359b7a8f7065743267.tar.bz2
ayatana-indicator-messages-2021da310c84d28efcf9bb359b7a8f7065743267.zip
messages-service: move app handling into separate class
Add ImApplicationList, a class that manages the list of applictions that are currently registered with the messaging menu. It creates dbus proxies for running applications and sends signals when the app adds messages or sources.
Diffstat (limited to 'src/messages-service.c')
-rw-r--r--src/messages-service.c176
1 files changed, 16 insertions, 160 deletions
diff --git a/src/messages-service.c b/src/messages-service.c
index 9cd7298..a65e2d8 100644
--- a/src/messages-service.c
+++ b/src/messages-service.c
@@ -25,24 +25,22 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <locale.h>
#include <libindicator/indicator-service.h>
#include <gio/gio.h>
-#include <gio/gdesktopappinfo.h>
#include <glib/gi18n.h>
#include "dbus-data.h"
-#include "gactionmuxer.h"
#include "gsettingsstrv.h"
#include "gmenuutils.h"
#include "indicator-messages-service.h"
#include "indicator-messages-application.h"
#include "im-phone-menu.h"
+#include "im-application-list.h"
#define NUM_STATUSES 5
-static GHashTable *applications;
+static ImApplicationList *applications;
static IndicatorMessagesService *messages_service;
static GSimpleActionGroup *actions;
-static GActionMuxer *action_muxer;
static GMenu *toplevel_menu;
static ImPhoneMenu *menu;
static GSettings *settings;
@@ -112,124 +110,6 @@ status_action_activate (GSimpleAction *action,
}
static void
-sources_listed (GObject *source_object,
- GAsyncResult *result,
- gpointer user_data)
-{
- GDesktopAppInfo *app = user_data;
- GVariant *sources;
- GVariantIter iter;
- const gchar *id;
- const gchar *label;
- const gchar *iconstr;
- guint32 count;
- gint64 time;
- const gchar *string;
- gboolean draws_attention;
- GError *error = NULL;
-
- if (!indicator_messages_application_call_list_sources_finish (INDICATOR_MESSAGES_APPLICATION (source_object),
- &sources, result, &error))
- {
- g_warning ("could not fetch the list of sources: %s", error->message);
- g_error_free (error);
- g_object_unref (app);
- return;
- }
-
- g_variant_iter_init (&iter, sources);
- while (g_variant_iter_next (&iter, "(&s&s&sux&sb)", &id, &label, &iconstr, &count,
- &time, &string, &draws_attention))
- {
- GActionGroup *app_actions;
- GSimpleAction *action;
-
- app_actions = g_action_muxer_get_group (action_muxer, g_app_info_get_id (G_APP_INFO (app)));
- g_assert (app_actions);
- action = g_simple_action_new_stateful (id, NULL, g_variant_new_uint32 (count));
- g_simple_action_group_insert (G_SIMPLE_ACTION_GROUP (app_actions), G_ACTION (action));
-
- im_phone_menu_add_source (menu, app, id, label, iconstr, count, time, string);
-
- g_object_unref (action);
- }
-
- g_variant_unref (sources);
- g_object_unref (app);
-}
-
-static void
-messages_listed (GObject *source_object,
- GAsyncResult *result,
- gpointer user_data)
-{
- GDesktopAppInfo *app = user_data;
- GVariant *messages;
- GError *error = NULL;
- GVariantIter iter;
- const gchar *id;
- const gchar *iconstr;
- const gchar *title;
- const gchar *subtitle;
- const gchar *body;
- gint64 time;
- gboolean draws_attention;
-
- if (!indicator_messages_application_call_list_messages_finish (INDICATOR_MESSAGES_APPLICATION (source_object),
- &messages, result, &error))
- {
- g_warning ("could not fetch the list of messages: %s", error->message);
- g_error_free (error);
- g_object_unref (app);
- return;
- }
-
- g_variant_iter_init (&iter, messages);
- while (g_variant_iter_next (&iter, "(&s&s&s&s&sxb)", &id, &iconstr, &title, &subtitle, &body,
- &time, &draws_attention))
- {
- GActionGroup *app_actions;
- GSimpleAction *action;
-
- app_actions = g_action_muxer_get_group (action_muxer, g_app_info_get_id (G_APP_INFO (app)));
- g_assert (app_actions);
- action = g_simple_action_new (id, NULL);
- g_simple_action_group_insert (G_SIMPLE_ACTION_GROUP (app_actions), G_ACTION (action));
-
- im_phone_menu_add_message (menu, app, id, iconstr, title, subtitle, body, time);
-
- g_object_unref (action);
- }
-
- g_variant_unref (messages);
- g_object_unref (app);
-}
-
-static void
-app_proxy_created (GObject *source_object,
- GAsyncResult *result,
- gpointer user_data)
-{
- GDesktopAppInfo *app = user_data;
- IndicatorMessagesApplication *app_proxy;
- GError *error = NULL;
-
- app_proxy = indicator_messages_application_proxy_new_finish (result, &error);
- if (!app_proxy) {
- g_warning ("could not create application proxy: %s", error->message);
- g_error_free (error);
- return;
- }
-
- g_hash_table_insert (applications, (gpointer) g_app_info_get_id (G_APP_INFO (app)), app_proxy);
-
- indicator_messages_application_call_list_sources (app_proxy, NULL, sources_listed, g_object_ref (app));
- indicator_messages_application_call_list_messages (app_proxy, NULL, messages_listed, g_object_ref (app));
-
- g_object_unref (app);
-}
-
-static void
register_application (IndicatorMessagesService *service,
GDBusMethodInvocation *invocation,
const gchar *desktop_id,
@@ -238,42 +118,21 @@ register_application (IndicatorMessagesService *service,
{
GDBusConnection *bus;
const gchar *sender;
- GSimpleActionGroup *app_actions;
- GDesktopAppInfo *app;
-
- if (g_hash_table_lookup (applications, desktop_id)) {
- g_warning ("application with id '%s' already exists", desktop_id);
- g_dbus_method_invocation_return_dbus_error (invocation,
- "com.canonical.indicator.messages.ApplicationAlreadyRegistered",
- "another application is already registered with this id");
- return;
- }
- app = g_desktop_app_info_new (desktop_id);
- if (!app) {
- g_warning ("application with id '%s' already exists", desktop_id);
+ if (!im_application_list_add (applications, desktop_id)) {
g_dbus_method_invocation_return_dbus_error (invocation,
- "com.canonical.indicator.messages.UnknownApplication",
- "an application with the given id doesn't exist");
+ "com.canonical.indicator.messages.RegistrationFailed",
+ "registration failed");
return;
}
bus = g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (service));
sender = g_dbus_method_invocation_get_sender (invocation);
- indicator_messages_application_proxy_new (bus, G_DBUS_PROXY_FLAGS_NONE,
- sender, menu_path, NULL,
- app_proxy_created, g_object_ref (app));
-
- app_actions = g_simple_action_group_new ();
- g_action_muxer_insert (action_muxer, desktop_id, G_ACTION_GROUP (app_actions));
-
+ im_application_list_set_remote (applications, desktop_id, bus, sender, menu_path);
g_settings_strv_append_unique (settings, "applications", desktop_id);
indicator_messages_service_complete_register_application (service, invocation);
-
- g_object_unref (app_actions);
- g_object_unref (app);
}
static void
@@ -282,13 +141,8 @@ unregister_application (IndicatorMessagesService *service,
const gchar *desktop_id,
gpointer user_data)
{
- if (g_hash_table_remove (applications, desktop_id)) {
-
- /* TODO remove menu items that refer to this application */
- g_action_muxer_remove (action_muxer, desktop_id);
-
- g_settings_strv_remove (settings, "applications", desktop_id);
- }
+ im_application_list_remove (applications, desktop_id);
+ g_settings_strv_remove (settings, "applications", desktop_id);
indicator_messages_service_complete_unregister_application (service, invocation);
}
@@ -342,7 +196,8 @@ got_bus (GObject *object,
}
g_dbus_connection_export_action_group (bus, INDICATOR_MESSAGES_DBUS_OBJECT,
- G_ACTION_GROUP (action_muxer), &error);
+ im_application_list_get_action_group (applications),
+ &error);
if (error) {
g_warning ("unable to export action group on dbus: %s", error->message);
g_error_free (error);
@@ -397,9 +252,6 @@ main (int argc, char ** argv)
actions = create_action_group ();
- action_muxer = g_action_muxer_new ();
- g_action_muxer_insert (action_muxer, NULL, G_ACTION_GROUP (actions));
-
g_signal_connect (messages_service, "handle-register-application",
G_CALLBACK (register_application), NULL);
g_signal_connect (messages_service, "handle-unregister-application",
@@ -412,13 +264,17 @@ main (int argc, char ** argv)
settings = g_settings_new ("com.canonical.indicator.messages");
- applications = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+ applications = im_application_list_new ();
+ g_signal_connect_swapped (applications, "source-added",
+ G_CALLBACK (im_phone_menu_add_source), menu);
+ g_signal_connect_swapped (applications, "message-added",
+ G_CALLBACK (im_phone_menu_add_message), menu);
g_main_loop_run(mainloop);
/* Clean up */
g_object_unref (messages_service);
g_object_unref (settings);
- g_hash_table_unref (applications);
+ g_object_unref (applications);
return 0;
}