~skypce/indicator-session/indicator-session

« back to all changes in this revision

Viewing changes to debian/patches/02_mc5-fixes.patch

  • Committer: Bazaar Package Importer
  • Author(s): Ken VanDine
  • Date: 2009-12-10 10:42:21 UTC
  • mfrom: (1.1.9 upstream)
  • mto: This revision was merged to the branch mainline in revision 14.
  • Revision ID: james.westby@ubuntu.com-20091210104221-vf7zqsien3deqc1p
Tags: 0.1.7+r58-0ubuntu1
* New snapshot for libindicator 0.3.0
* debian/control
  - build depend on libtelepathy-glib-dev instead of libempathy-dev
  - build depend on libindicator-dev >= 0.3.0
* removed 03_tp_glib.patch and 99_autoreconf.patch, applied upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
=== modified file 'src/status-provider-mc5.c'
2
 
--- src/status-provider-mc5.c   2009-10-06 19:01:54 +0000
3
 
+++ src/status-provider-mc5.c   2009-10-08 20:23:50 +0000
4
 
@@ -31,6 +31,7 @@
5
 
 #include "status-provider-mc5-marshal.h"
6
 
 
7
 
 #include <dbus/dbus-glib.h>
8
 
+#include <dbus/dbus-glib-bindings.h>
9
 
 
10
 
 static gchar * sp_to_mc_map[STATUS_PROVIDER_STATUS_LAST] = {
11
 
        /* STATUS_PROVIDER_STATUS_ONLINE,  */  "available",
12
 
@@ -66,10 +67,12 @@
13
 
 struct _StatusProviderMC5Private {
14
 
        EmpathyAccountManager * manager;
15
 
        StatusProviderStatus status;
16
 
+       DBusGProxy * dbus_proxy;
17
 
 };
18
 
 
19
 
 #define STATUS_PROVIDER_MC5_GET_PRIVATE(o) \
20
 
 (G_TYPE_INSTANCE_GET_PRIVATE ((o), STATUS_PROVIDER_MC5_TYPE, StatusProviderMC5Private))
21
 
+#define MC5_WELL_KNOWN_NAME  "org.freedesktop.Telepathy.MissionControl5"
22
 
 
23
 
 /* Prototypes */
24
 
 /* GObject stuff */
25
 
@@ -81,6 +84,8 @@
26
 
 static void set_status (StatusProvider * sp, StatusProviderStatus status);
27
 
 static StatusProviderStatus get_status (StatusProvider * sp);
28
 
 static void presence_changed (EmpathyAccountManager * eam, guint type, const gchar * type_str, const gchar * message, StatusProviderMC5 * sp);
29
 
+static void dbus_namechange (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, StatusProviderMC5 * self);
30
 
+static void mc5_exists_cb (DBusGProxy * proxy, gboolean exists, GError * error, gpointer userdata);
31
 
 
32
 
 G_DEFINE_TYPE (StatusProviderMC5, status_provider_mc5, STATUS_PROVIDER_TYPE);
33
 
 
34
 
@@ -104,6 +109,23 @@
35
 
        return;
36
 
 }
37
 
 
38
 
+/* Build our empathy account manager instance if we don't
39
 
+   have one. */
40
 
+static void
41
 
+build_eam (StatusProviderMC5 * self)
42
 
+{
43
 
+       StatusProviderMC5Private * priv = STATUS_PROVIDER_MC5_GET_PRIVATE(self);
44
 
+
45
 
+       if (priv->manager != NULL) {
46
 
+               return;
47
 
+       }
48
 
+
49
 
+       priv->manager = EMPATHY_ACCOUNT_MANAGER(g_object_new(EMPATHY_TYPE_ACCOUNT_MANAGER, NULL));
50
 
+       g_signal_connect(G_OBJECT(priv->manager), "global-presence-changed", G_CALLBACK(presence_changed), self);
51
 
+
52
 
+       return;
53
 
+}
54
 
+
55
 
 /* Creating an instance of the status provider.  We set the variables
56
 
    and create an EmpathyAccountManager object.  It does all the hard
57
 
    work in this module of tracking MissionControl and enumerating the
58
 
@@ -116,7 +138,33 @@
59
 
        priv->status = STATUS_PROVIDER_STATUS_DISCONNECTED;
60
 
        priv->manager = NULL;
61
 
 
62
 
-       g_signal_connect(G_OBJECT(priv->manager), "global-presence-changed", G_CALLBACK(presence_changed), self);
63
 
+       DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
64
 
+       g_return_if_fail(bus != NULL); /* Can't do anymore DBus stuff without this,
65
 
+                                         all non-DBus stuff should be done */
66
 
+
67
 
+       GError * error = NULL;
68
 
+
69
 
+       /* Set up the dbus Proxy */
70
 
+       priv->dbus_proxy = dbus_g_proxy_new_for_name_owner (bus,
71
 
+                                                           DBUS_SERVICE_DBUS,
72
 
+                                                           DBUS_PATH_DBUS,
73
 
+                                                           DBUS_INTERFACE_DBUS,
74
 
+                                                           &error);
75
 
+       if (error != NULL) {
76
 
+               g_warning("Unable to connect to DBus events: %s", error->message);
77
 
+               g_error_free(error);
78
 
+               return;
79
 
+       }
80
 
+
81
 
+       /* Configure the name owner changing */
82
 
+       dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged",
83
 
+                               G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
84
 
+                                                       G_TYPE_INVALID);
85
 
+       dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged",
86
 
+                               G_CALLBACK(dbus_namechange),
87
 
+                               self, NULL);
88
 
+
89
 
+       org_freedesktop_DBus_name_has_owner_async(priv->dbus_proxy, MC5_WELL_KNOWN_NAME, mc5_exists_cb, self);
90
 
 
91
 
        return;
92
 
 }
93
 
@@ -133,6 +181,11 @@
94
 
                priv->manager = NULL;
95
 
        }
96
 
 
97
 
+       if (priv->dbus_proxy != NULL) {
98
 
+               g_object_unref(priv->dbus_proxy);
99
 
+               priv->dbus_proxy = NULL;
100
 
+       }
101
 
+
102
 
        G_OBJECT_CLASS (status_provider_mc5_parent_class)->dispose (object);
103
 
        return;
104
 
 }
105
 
@@ -146,6 +199,49 @@
106
 
        return;
107
 
 }
108
 
 
109
 
+/* Watch for MC5 Coming on and off the bus. */
110
 
+static void
111
 
+dbus_namechange (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, StatusProviderMC5 * self)
112
 
+{
113
 
+       /* g_debug("DBUS NAMECHANGE: %s %s %s", name, prev, new); */
114
 
+
115
 
+       if (prev[0] == '\0' && g_strcmp0(name, MC5_WELL_KNOWN_NAME) == 0) {
116
 
+               g_debug("MC5 Coming online");
117
 
+               build_eam(self);
118
 
+       }
119
 
+       if (new[0] == '\0' && g_strcmp0(name, MC5_WELL_KNOWN_NAME) == 0) {
120
 
+               g_debug("MC5 going offline");
121
 
+               StatusProviderMC5Private * priv = STATUS_PROVIDER_MC5_GET_PRIVATE(self);
122
 
+               if (priv->manager != NULL) {
123
 
+                       g_object_unref(priv->manager);
124
 
+                       priv->manager = NULL;
125
 
+               }
126
 
+
127
 
+               priv->status = STATUS_PROVIDER_STATUS_DISCONNECTED;
128
 
+               g_signal_emit(G_OBJECT(self), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, priv->status, TRUE);
129
 
+       }
130
 
+
131
 
+       return;
132
 
+}
133
 
+
134
 
+/* Callback for the Dbus command to do HasOwner on
135
 
+   the MC5 service.  If it exists, we want to have an
136
 
+   account manager. */
137
 
+static void
138
 
+mc5_exists_cb (DBusGProxy * proxy, gboolean exists, GError * error, gpointer userdata)
139
 
+{
140
 
+       if (error) {
141
 
+               g_warning("Unable to check if MC5 is running: %s", error->message);
142
 
+               return;
143
 
+       }
144
 
+
145
 
+       if (exists) {
146
 
+               build_eam(STATUS_PROVIDER_MC5(userdata));
147
 
+       }
148
 
+
149
 
+       return;
150
 
+}
151
 
+
152
 
 /**
153
 
        status_provider_mc5_new:
154
 
 
155
 
@@ -168,9 +264,8 @@
156
 
 set_status (StatusProvider * sp, StatusProviderStatus status)
157
 
 {
158
 
        StatusProviderMC5Private * priv = STATUS_PROVIDER_MC5_GET_PRIVATE(sp);
159
 
-       if (priv->manager == NULL) {
160
 
-               priv->manager = EMPATHY_ACCOUNT_MANAGER(g_object_new(EMPATHY_TYPE_ACCOUNT_MANAGER, NULL));
161
 
-       }
162
 
+
163
 
+       build_eam(STATUS_PROVIDER_MC5(sp));
164
 
 
165
 
        empathy_account_manager_request_global_presence(priv->manager, sp_to_tp_map[status], sp_to_mc_map[status], "");
166
 
 
167
 
 
168
 
=== modified file 'src/status-provider-mc5.h'
169
 
--- src/status-provider-mc5.h   2009-09-16 22:08:31 +0000
170
 
+++ src/status-provider-mc5.h   2009-10-08 20:23:50 +0000
171
 
@@ -31,8 +31,8 @@
172
 
 G_BEGIN_DECLS
173
 
 
174
 
 #define STATUS_PROVIDER_MC5_TYPE            (status_provider_mc5_get_type ())
175
 
-#define STATUS_PROVIDER_MC5(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), STATUS_PROVIDER_MC5_TYPE, StatusProviderTelepathy))
176
 
-#define STATUS_PROVIDER_MC5_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), STATUS_PROVIDER_MC5_TYPE, StatusProviderTelepathyClass))
177
 
+#define STATUS_PROVIDER_MC5(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), STATUS_PROVIDER_MC5_TYPE, StatusProviderMC5))
178
 
+#define STATUS_PROVIDER_MC5_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), STATUS_PROVIDER_MC5_TYPE, StatusProviderMC5Class))
179
 
 #define IS_STATUS_PROVIDER_MC5(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STATUS_PROVIDER_MC5_TYPE))
180
 
 #define IS_STATUS_PROVIDER_MC5_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_PROVIDER_MC5_TYPE))
181
 
 #define STATUS_PROVIDER_MC5_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_PROVIDER_MC5_TYPE, StatusProviderMC5Class))
182