aboutsummaryrefslogtreecommitdiff
path: root/src/messages-service.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/messages-service.c')
-rw-r--r--src/messages-service.c208
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;
}