diff options
Diffstat (limited to 'src/messages-service.c')
-rw-r--r-- | src/messages-service.c | 208 |
1 files changed, 25 insertions, 183 deletions
diff --git a/src/messages-service.c b/src/messages-service.c index 81b7f0b..b3731a8 100644 --- a/src/messages-service.c +++ b/src/messages-service.c @@ -25,27 +25,24 @@ 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 GMenu *menu; -static GMenu *messages_section; -static GMenu *sources_section; +static ImPhoneMenu *menu; static GSettings *settings; static gboolean draws_attention; static const gchar *global_status[6]; /* max 5: available, away, busy, invisible, offline */ @@ -113,145 +110,6 @@ status_action_activate (GSimpleAction *action, } static void -sources_listed (GObject *source_object, - GAsyncResult *result, - gpointer user_data) -{ - gchar *app_id = 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_free (app_id); - 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)) - { - GMenuItem *item; - GActionGroup *app_actions; - GSimpleAction *action; - gchar *action_name; - - app_actions = g_action_muxer_get_group (action_muxer, app_id); - 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)); - - action_name = g_strconcat (app_id, ".", id, NULL); - item = g_menu_item_new (label, action_name); - g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.messages.sourceitem"); - if (iconstr && *iconstr) - g_menu_item_set_attribute (item, "x-canonical-icon", "s", iconstr); - g_menu_append_item (sources_section, item); - - g_object_unref (action); - g_free (action_name); - g_object_unref (item); - } - - g_variant_unref (sources); - g_free (app_id); -} - -static void -messages_listed (GObject *source_object, - GAsyncResult *result, - gpointer user_data) -{ - gchar *app_id = 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_free (app_id); - 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)) - { - GMenuItem *item; - GActionGroup *app_actions; - GSimpleAction *action; - gchar *action_name; - - app_actions = g_action_muxer_get_group (action_muxer, app_id); - 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)); - - action_name = g_strconcat (app_id, ".", id, NULL); - item = g_menu_item_new (title, action_name); - g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.messages.messageitem"); - g_menu_item_set_attribute (item, "x-canonical-message-id", "s", id); - g_menu_item_set_attribute (item, "x-canonical-subtitle", "s", subtitle); - g_menu_item_set_attribute (item, "x-canonical-text", "s", body); - g_menu_item_set_attribute (item, "x-canonical-time", "x", time); - if (iconstr && *iconstr) - g_menu_item_set_attribute (item, "x-canonical-icon", "s", iconstr); - g_menu_append_item (messages_section, item); - - g_object_unref (action); - g_free (action_name); - g_object_unref (item); - } - - g_variant_unref (messages); - g_free (app_id); -} - -static void -app_proxy_created (GObject *source_object, - GAsyncResult *result, - gpointer user_data) -{ - gchar *desktop_id = 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; - } - - /* hash table takes ownership of desktop_id and app_proxy */ - g_hash_table_insert (applications, desktop_id, app_proxy); - - indicator_messages_application_call_list_sources (app_proxy, NULL, sources_listed, g_strdup (desktop_id)); - indicator_messages_application_call_list_messages (app_proxy, NULL, messages_listed, g_strdup (desktop_id)); -} - -static void register_application (IndicatorMessagesService *service, GDBusMethodInvocation *invocation, const gchar *desktop_id, @@ -260,31 +118,16 @@ register_application (IndicatorMessagesService *service, { GDBusConnection *bus; const gchar *sender; - GSimpleActionGroup *app_actions; - 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; - } + im_application_list_add (applications, desktop_id); 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_strdup (desktop_id)); - - 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); } static void @@ -293,13 +136,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); } @@ -353,7 +191,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); @@ -361,7 +200,7 @@ got_bus (GObject *object, } g_dbus_connection_export_menu_model (bus, INDICATOR_MESSAGES_DBUS_OBJECT "/phone", - G_MENU_MODEL (menu), &error); + im_phone_menu_get_model (menu), &error); if (error) { g_warning ("unable to export menu on dbus: %s", error->message); g_error_free (error); @@ -408,32 +247,35 @@ 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", G_CALLBACK (unregister_application), NULL); - menu = g_menu_new (); - sources_section = g_menu_new (); - messages_section = g_menu_new (); - g_menu_append_section (menu, NULL, G_MENU_MODEL (sources_section)); - g_menu_append_section (menu, NULL, G_MENU_MODEL (messages_section)); + menu = im_phone_menu_new (); toplevel_menu = g_menu_new (); - g_menu_append_submenu (toplevel_menu, NULL, G_MENU_MODEL (menu)); + g_menu_append_submenu (toplevel_menu, NULL, im_phone_menu_get_model (menu)); 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, "source-removed", + G_CALLBACK (im_phone_menu_remove_source), menu); + g_signal_connect_swapped (applications, "message-added", + G_CALLBACK (im_phone_menu_add_message), menu); + g_signal_connect_swapped (applications, "message-removed", + G_CALLBACK (im_phone_menu_remove_message), menu); + g_signal_connect_swapped (applications, "app-stopped", + G_CALLBACK (im_phone_menu_remove_application), 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; } |