Merge lp:~noskcaj/empathy/geoclue-2.0 into lp:~ubuntu-desktop/empathy/ubuntu
- geoclue-2.0
- Merge into ubuntu
Proposed by
Jackson Doak
Status: | Needs review |
---|---|
Proposed branch: | lp:~noskcaj/empathy/geoclue-2.0 |
Merge into: | lp:~ubuntu-desktop/empathy/ubuntu |
Diff against target: |
1473 lines (+10/-1425) 4 files modified
debian/changelog (+8/-0) debian/control (+2/-2) debian/patches/Revert-geoclue-2.0.patch (+0/-1422) debian/patches/series (+0/-1) |
To merge this branch: | bzr merge lp:~noskcaj/empathy/geoclue-2.0 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Sebastien Bacher | Needs Information | ||
Review via email: mp+241187@code.launchpad.net |
Commit message
Description of the change
Use geoclue-2.0 now that it's in main
To post a comment you must log in.
Revision history for this message
Tim Lunn (darkxst) wrote : | # |
geoclue-2.0 uses mozilla location service, so the user would still get a location, just not from ubuntu-geoip.
Unmerged revisions
- 370. By Jackson Doak
-
* Use geoclue-2.0. LP: #1389336
- Drop Revert-geoclue- 2.0.patch
- Replace old geoclue deps with geoclue-2.0
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'debian/changelog' |
2 | --- debian/changelog 2014-10-28 17:30:15 +0000 |
3 | +++ debian/changelog 2014-11-08 20:15:08 +0000 |
4 | @@ -1,3 +1,11 @@ |
5 | +empathy (3.12.6-0ubuntu2) vivid; urgency=medium |
6 | + |
7 | + * Use geoclue-2.0. LP: #1389336 |
8 | + - Drop Revert-geoclue-2.0.patch |
9 | + - Replace old geoclue deps with geoclue-2.0 |
10 | + |
11 | + -- Jackson Doak <noskcaj@ubuntu.com> Sat, 08 Nov 2014 16:24:34 +1100 |
12 | + |
13 | empathy (3.12.6-0ubuntu1) vivid; urgency=medium |
14 | |
15 | [ Jackson Doak ] |
16 | |
17 | === modified file 'debian/control' |
18 | --- debian/control 2014-09-30 11:10:19 +0000 |
19 | +++ debian/control 2014-11-08 20:15:08 +0000 |
20 | @@ -29,7 +29,7 @@ |
21 | libgstreamer-plugins-base1.0-dev, |
22 | libnm-glib-dev (>= 0.7) [linux-any], |
23 | libnm-util-dev (>= 0.7) [linux-any], |
24 | - libgeoclue-dev (>= 0.12), |
25 | + geoclue-2.0, |
26 | libgnome-keyring-dev (>= 2.26.0), |
27 | libgcr-3-dev (>= 2.91.4), |
28 | libfolks-dev (>= 0.9.5), |
29 | @@ -65,7 +65,7 @@ |
30 | telepathy-mission-control-5 (>= 1:5.12.0), |
31 | gsettings-desktop-schemas, |
32 | gnome-icon-theme (>= 2.30.0), |
33 | - geoclue, |
34 | + geoclue-2.0, |
35 | telepathy-logger (>= 0.2.13), |
36 | dbus-x11, |
37 | gstreamer1.0-pulseaudio |
38 | |
39 | === removed file 'debian/patches/Revert-geoclue-2.0.patch' |
40 | --- debian/patches/Revert-geoclue-2.0.patch 2014-09-24 08:08:59 +0000 |
41 | +++ debian/patches/Revert-geoclue-2.0.patch 1970-01-01 00:00:00 +0000 |
42 | @@ -1,1422 +0,0 @@ |
43 | -Description: Revert 4 upstream git commits so we can use old geoclue |
44 | - Reverted commits used for new geoclue: |
45 | - https://git.gnome.org/browse/empathy/commit/?id=dcb5ddc560b51cc5eb59a2ef27d91cf279271f36 |
46 | - https://git.gnome.org/browse/empathy/commit/?id=24238851a5f3617c52bd60d1f99ac5eef0c079a1 |
47 | - https://git.gnome.org/browse/empathy/commit/?id=32529f49e3935b5f4fd747fcfe2d62322f86ec52 |
48 | - https://git.gnome.org/browse/empathy/commit/?id=f6f6c6421e0e286db920d3e01fa64cc3ebe4f4df |
49 | -Author: Jackson Doak <noskcaj@ubuntu.com> |
50 | -Origin: upstream |
51 | -Forwarded: not-needed |
52 | -Last-Update: 2014-09-24 |
53 | - |
54 | ---- empathy-3.12.6.orig/configure.ac |
55 | -+++ empathy-3.12.6/configure.ac |
56 | -@@ -73,7 +73,7 @@ GOA_REQUIRED=3.5.1 |
57 | - |
58 | - # Optional deps |
59 | - ENCHANT_REQUIRED=1.2.0 |
60 | --GEOCLUE_REQUIRED=1.99.3 |
61 | -+GEOCLUE_REQUIRED=0.12 |
62 | - GEOCODE_GLIB_REQUIRED=0.99.1 |
63 | - ISO_CODES_REQUIRED=0.35 |
64 | - NAUTILUS_SENDTO_REQUIRED=2.90.0 |
65 | -@@ -416,18 +416,11 @@ AC_ARG_ENABLE(location, |
66 | - if test "x$enable_location" != "xno"; then |
67 | - PKG_CHECK_MODULES(GEOCLUE, |
68 | - [ |
69 | -- geoclue-2.0 >= $GEOCLUE_REQUIRED |
70 | -+ geoclue >= $GEOCLUE_REQUIRED |
71 | - ], have_geoclue="yes", have_geoclue="no") |
72 | - |
73 | - if test "x$have_geoclue" = "xyes"; then |
74 | -- GEOCLUE_XML_FILE=`pkg-config --variable=dbus_interface geoclue-2.0` |
75 | -- if test "x$GEOCLUE_XML_FILE" = "x"; then |
76 | -- echo "Can't find dbus_interface variable in geoclue-2.0.pc" |
77 | -- have_geoclue="no" |
78 | -- else |
79 | -- AC_DEFINE(HAVE_GEOCLUE, 1, [Define if you have geoclue-2]) |
80 | -- AC_SUBST(GEOCLUE_XML_FILE) |
81 | -- fi |
82 | -+ AC_DEFINE(HAVE_GEOCLUE, 1, [Define if you have geoclue]) |
83 | - fi |
84 | - else |
85 | - have_geoclue="no" |
86 | ---- empathy-3.12.6.orig/data/empathy.convert |
87 | -+++ empathy-3.12.6/data/empathy.convert |
88 | -@@ -54,5 +54,8 @@ close-main-window = /apps/empathy/hints/ |
89 | - |
90 | - [org.gnome.Empathy.location] |
91 | - publish = /apps/empathy/location/publish |
92 | -+resource-network = /apps/empathy/location/resource_network |
93 | -+resource-cell = /apps/empathy/location/resource_cell |
94 | -+resource-gps = /apps/empathy/location/resource_gps |
95 | - reduce-accuracy = /apps/empathy/location/reduce_accuracy |
96 | - |
97 | ---- empathy-3.12.6.orig/data/org.gnome.Empathy.gschema.xml |
98 | -+++ empathy-3.12.6/data/org.gnome.Empathy.gschema.xml |
99 | -@@ -256,6 +256,21 @@ present them to the user immediately.</d |
100 | - <summary>Empathy can publish the user's location</summary> |
101 | - <description>Whether Empathy can publish the user's location to their contacts.</description> |
102 | - </key> |
103 | -+ <key name="resource-network" type="b"> |
104 | -+ <default>true</default> |
105 | -+ <summary>Empathy can use the network to guess the location</summary> |
106 | -+ <description>Whether Empathy can use the network to guess the location.</description> |
107 | -+ </key> |
108 | -+ <key name="resource-cell" type="b"> |
109 | -+ <default>true</default> |
110 | -+ <summary>Empathy can use the cellular network to guess the location</summary> |
111 | -+ <description>Whether Empathy can use the cellular network to guess the location.</description> |
112 | -+ </key> |
113 | -+ <key name="resource-gps" type="b"> |
114 | -+ <default>false</default> |
115 | -+ <summary>Empathy can use the GPS to guess the location</summary> |
116 | -+ <description>Whether Empathy can use the GPS to guess the location.</description> |
117 | -+ </key> |
118 | - <key name="reduce-accuracy" type="b"> |
119 | - <default>true</default> |
120 | - <summary>Empathy should reduce the location's accuracy</summary> |
121 | ---- empathy-3.12.6.orig/libempathy-gtk/Makefile.am |
122 | -+++ empathy-3.12.6/libempathy-gtk/Makefile.am |
123 | -@@ -249,26 +249,11 @@ EXTRA_DIST = \ |
124 | - $(ui_DATA) |
125 | - |
126 | - if HAVE_GEOCLUE |
127 | --geoclue-interface.c: geoclue-interface.h |
128 | --geoclue-interface.h: Makefile.am |
129 | -- gdbus-codegen \ |
130 | -- --interface-prefix org.freedesktop.GeoClue2. \ |
131 | -- --c-namespace GClue \ |
132 | -- --generate-c-code geoclue-interface \ |
133 | -- $(GEOCLUE_XML_FILE) |
134 | -- |
135 | --BUILT_SOURCES += \ |
136 | -- geoclue-interface.h \ |
137 | -- geoclue-interface.c |
138 | -- |
139 | - libempathy_gtk_handwritten_source += \ |
140 | -- empathy-location-manager.c \ |
141 | -- empathy-geoclue-helper.c |
142 | -+ empathy-location-manager.c |
143 | - |
144 | - libempathy_gtk_headers += \ |
145 | -- empathy-location-manager.h \ |
146 | -- empathy-geoclue-helper.h |
147 | -- |
148 | -+ empathy-location-manager.h |
149 | - else |
150 | - EXTRA_DIST += \ |
151 | - empathy-location-manager.c \ |
152 | ---- empathy-3.12.6.orig/libempathy-gtk/empathy-geoclue-helper.c |
153 | -+++ /dev/null |
154 | -@@ -1,523 +0,0 @@ |
155 | --/* |
156 | -- * empathy-geoclue-helper.c |
157 | -- * |
158 | -- * Copyright (C) 2013 Collabora Ltd. <http://www.collabora.co.uk/> |
159 | -- * |
160 | -- * This library is free software; you can redistribute it and/or |
161 | -- * modify it under the terms of the GNU Lesser General Public |
162 | -- * License as published by the Free Software Foundation; either |
163 | -- * version 2.1 of the License, or (at your option) any later version. |
164 | -- * |
165 | -- * This library is distributed in the hope that it will be useful, |
166 | -- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
167 | -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
168 | -- * Lesser General Public License for more details. |
169 | -- * |
170 | -- * You should have received a copy of the GNU Lesser General Public |
171 | -- * License along with this library; if not, write to the Free Software |
172 | -- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
173 | -- */ |
174 | -- |
175 | --#include "config.h" |
176 | -- |
177 | --#include <gio/gio.h> |
178 | -- |
179 | --#include "empathy-geoclue-helper.h" |
180 | -- |
181 | --#define DEBUG_FLAG EMPATHY_DEBUG_LOCATION |
182 | --#include "empathy-debug.h" |
183 | -- |
184 | --#define GEOCLUE_BUS_NAME "org.freedesktop.GeoClue2" |
185 | -- |
186 | --/** |
187 | -- * SECTION: empathy-geoclue-helper |
188 | -- * @title: EmpathyGeoclueHelper |
189 | -- * @short_description: TODO |
190 | -- * |
191 | -- * TODO |
192 | -- */ |
193 | -- |
194 | --/** |
195 | -- * EmpathyGeoclueHelper: |
196 | -- * |
197 | -- * Data structure representing a #EmpathyGeoclueHelper. |
198 | -- * |
199 | -- * Since: UNRELEASED |
200 | -- */ |
201 | -- |
202 | --/** |
203 | -- * EmpathyGeoclueHelperClass: |
204 | -- * |
205 | -- * The class of a #EmpathyGeoclueHelper. |
206 | -- * |
207 | -- * Since: UNRELEASED |
208 | -- */ |
209 | -- |
210 | --static void async_initable_iface_init (GAsyncInitableIface *iface); |
211 | -- |
212 | --G_DEFINE_TYPE_WITH_CODE (EmpathyGeoclueHelper, empathy_geoclue_helper, |
213 | -- G_TYPE_OBJECT, |
214 | -- G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init)); |
215 | -- |
216 | --enum |
217 | --{ |
218 | -- PROP_DISTANCE_THRESHOLD = 1, |
219 | -- PROP_LOCATION, |
220 | -- N_PROPS |
221 | --}; |
222 | -- |
223 | --enum |
224 | --{ |
225 | -- SIG_LOCATION_CHANGED, |
226 | -- LAST_SIGNAL |
227 | --}; |
228 | -- |
229 | --static guint signals[LAST_SIGNAL]; |
230 | -- |
231 | --struct _EmpathyGeoclueHelperPriv |
232 | --{ |
233 | -- guint distance_threshold; |
234 | -- GClueLocation *location; |
235 | -- |
236 | -- gboolean started; |
237 | -- GClueClient *client; |
238 | --}; |
239 | -- |
240 | --static void |
241 | --empathy_geoclue_helper_get_property (GObject *object, |
242 | -- guint property_id, |
243 | -- GValue *value, |
244 | -- GParamSpec *pspec) |
245 | --{ |
246 | -- EmpathyGeoclueHelper *self = EMPATHY_GEOCLUE_HELPER (object); |
247 | -- |
248 | -- switch (property_id) |
249 | -- { |
250 | -- case PROP_DISTANCE_THRESHOLD: |
251 | -- g_value_set_uint (value, self->priv->distance_threshold); |
252 | -- break; |
253 | -- case PROP_LOCATION: |
254 | -- g_value_set_object (value, self->priv->location); |
255 | -- break; |
256 | -- default: |
257 | -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); |
258 | -- break; |
259 | -- } |
260 | --} |
261 | -- |
262 | --static void |
263 | --empathy_geoclue_helper_set_property (GObject *object, |
264 | -- guint property_id, |
265 | -- const GValue *value, |
266 | -- GParamSpec *pspec) |
267 | --{ |
268 | -- EmpathyGeoclueHelper *self = EMPATHY_GEOCLUE_HELPER (object); |
269 | -- |
270 | -- switch (property_id) |
271 | -- { |
272 | -- case PROP_DISTANCE_THRESHOLD: |
273 | -- self->priv->distance_threshold = g_value_get_uint (value); |
274 | -- break; |
275 | -- default: |
276 | -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); |
277 | -- break; |
278 | -- } |
279 | --} |
280 | -- |
281 | --static void |
282 | --empathy_geoclue_helper_constructed (GObject *object) |
283 | --{ |
284 | -- //EmpathyGeoclueHelper *self = EMPATHY_GEOCLUE_HELPER (object); |
285 | -- void (*chain_up) (GObject *) = |
286 | -- ((GObjectClass *) empathy_geoclue_helper_parent_class)->constructed; |
287 | -- |
288 | -- chain_up (object); |
289 | --} |
290 | -- |
291 | --static void |
292 | --empathy_geoclue_helper_dispose (GObject *object) |
293 | --{ |
294 | -- EmpathyGeoclueHelper *self = EMPATHY_GEOCLUE_HELPER (object); |
295 | -- void (*chain_up) (GObject *) = |
296 | -- ((GObjectClass *) empathy_geoclue_helper_parent_class)->dispose; |
297 | -- |
298 | -- if (self->priv->started) |
299 | -- { |
300 | -- gclue_client_call_stop (self->priv->client, NULL, NULL, NULL); |
301 | -- |
302 | -- self->priv->started = FALSE; |
303 | -- } |
304 | -- |
305 | -- g_clear_object (&self->priv->location); |
306 | -- g_clear_object (&self->priv->client); |
307 | -- |
308 | -- chain_up (object); |
309 | --} |
310 | -- |
311 | --static void |
312 | --empathy_geoclue_helper_finalize (GObject *object) |
313 | --{ |
314 | -- //EmpathyGeoclueHelper *self = EMPATHY_GEOCLUE_HELPER (object); |
315 | -- void (*chain_up) (GObject *) = |
316 | -- ((GObjectClass *) empathy_geoclue_helper_parent_class)->finalize; |
317 | -- |
318 | -- chain_up (object); |
319 | --} |
320 | -- |
321 | --static void |
322 | --empathy_geoclue_helper_class_init ( |
323 | -- EmpathyGeoclueHelperClass *klass) |
324 | --{ |
325 | -- GObjectClass *oclass = G_OBJECT_CLASS (klass); |
326 | -- GParamSpec *spec; |
327 | -- |
328 | -- oclass->get_property = empathy_geoclue_helper_get_property; |
329 | -- oclass->set_property = empathy_geoclue_helper_set_property; |
330 | -- oclass->constructed = empathy_geoclue_helper_constructed; |
331 | -- oclass->dispose = empathy_geoclue_helper_dispose; |
332 | -- oclass->finalize = empathy_geoclue_helper_finalize; |
333 | -- |
334 | -- /** |
335 | -- * EmpathyGeoclueHelper:distance-threshold: |
336 | -- * |
337 | -- * TODO |
338 | -- * |
339 | -- * Since: UNRELEASED |
340 | -- */ |
341 | -- spec = g_param_spec_uint ("distance-threshold", "distance-threshold", |
342 | -- "DistanceThreshold", |
343 | -- 0, G_MAXUINT32, 0, |
344 | -- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); |
345 | -- g_object_class_install_property (oclass, PROP_DISTANCE_THRESHOLD, spec); |
346 | -- |
347 | -- /** |
348 | -- * EmpathyGeoclueHelper:location: |
349 | -- * |
350 | -- * TODO |
351 | -- * |
352 | -- * Since: UNRELEASED |
353 | -- */ |
354 | -- spec = g_param_spec_object ("location", "location", "GClueLocation", |
355 | -- GCLUE_TYPE_LOCATION, |
356 | -- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); |
357 | -- g_object_class_install_property (oclass, PROP_LOCATION, spec); |
358 | -- |
359 | -- /** |
360 | -- * EmpathyGeoclueHelper::location-changed: |
361 | -- * @self: a #EmpathyGeoclueHelper |
362 | -- * |
363 | -- * TODO |
364 | -- * |
365 | -- * Since: UNRELEASED |
366 | -- */ |
367 | -- signals[SIG_LOCATION_CHANGED] = g_signal_new ("location-changed", |
368 | -- G_OBJECT_CLASS_TYPE (klass), |
369 | -- G_SIGNAL_RUN_LAST, |
370 | -- 0, NULL, NULL, NULL, |
371 | -- G_TYPE_NONE, |
372 | -- 1, GCLUE_TYPE_LOCATION); |
373 | -- |
374 | -- g_type_class_add_private (klass, sizeof (EmpathyGeoclueHelperPriv)); |
375 | --} |
376 | -- |
377 | --static void |
378 | --empathy_geoclue_helper_init (EmpathyGeoclueHelper *self) |
379 | --{ |
380 | -- self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, |
381 | -- EMPATHY_TYPE_GEOCLUE_HELPER, EmpathyGeoclueHelperPriv); |
382 | --} |
383 | -- |
384 | --static void |
385 | --location_cb (GObject *source, |
386 | -- GAsyncResult *result, |
387 | -- gpointer user_data) |
388 | --{ |
389 | -- EmpathyGeoclueHelper *self = user_data; |
390 | -- GError *error = NULL; |
391 | -- |
392 | -- g_clear_object (&self->priv->location); |
393 | -- |
394 | -- self->priv->location = gclue_location_proxy_new_finish (result, &error); |
395 | -- if (self->priv->location == NULL) |
396 | -- { |
397 | -- DEBUG ("Failed to create Location proxy: %s", error->message); |
398 | -- g_error_free (error); |
399 | -- } |
400 | -- |
401 | -- g_signal_emit (self, signals[SIG_LOCATION_CHANGED], 0, self->priv->location); |
402 | -- |
403 | -- g_object_notify (G_OBJECT (self), "location"); |
404 | --} |
405 | -- |
406 | --static void |
407 | --location_updated_cb (GClueClient *client, |
408 | -- const gchar *old, |
409 | -- const gchar *new, |
410 | -- EmpathyGeoclueHelper *self) |
411 | --{ |
412 | -- gclue_location_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, |
413 | -- GEOCLUE_BUS_NAME, new, |
414 | -- NULL, location_cb, self); |
415 | --} |
416 | -- |
417 | --static void |
418 | --client_start_cb (GObject *source, |
419 | -- GAsyncResult *result, |
420 | -- gpointer user_data) |
421 | --{ |
422 | -- GTask *task = user_data; |
423 | -- EmpathyGeoclueHelper *self = g_task_get_source_object (task); |
424 | -- GClueClient *client = GCLUE_CLIENT (source); |
425 | -- GError *error = NULL; |
426 | -- |
427 | -- if (!gclue_client_call_start_finish (client, result, &error)) |
428 | -- { |
429 | -- DEBUG ("Failed to start Geoclue client: %s", error->message); |
430 | -- g_error_free (error); |
431 | -- return; |
432 | -- } |
433 | -- |
434 | -- self->priv->started = TRUE; |
435 | -- |
436 | -- g_task_return_boolean (task, TRUE); |
437 | -- g_object_unref (task); |
438 | --} |
439 | -- |
440 | --static void |
441 | --client_cb (GObject *source, |
442 | -- GAsyncResult *result, |
443 | -- gpointer user_data) |
444 | --{ |
445 | -- GTask *task = user_data; |
446 | -- EmpathyGeoclueHelper *self = g_task_get_source_object (task); |
447 | -- GError *error = NULL; |
448 | -- |
449 | -- self->priv->client = gclue_client_proxy_new_finish (result, &error); |
450 | -- if (!gclue_client_proxy_new_for_bus_finish (result, &error)) |
451 | -- { |
452 | -- DEBUG ("Failed to create Geoclue client: %s", error->message); |
453 | -- g_task_return_error (task, error); |
454 | -- goto out; |
455 | -- } |
456 | -- |
457 | -- g_signal_connect_object (self->priv->client, "location-updated", |
458 | -- G_CALLBACK (location_updated_cb), self, 0); |
459 | -- |
460 | -- g_object_set (self->priv->client, |
461 | -- "distance-threshold", self->priv->distance_threshold, |
462 | -- NULL); |
463 | -- |
464 | -- g_task_return_boolean (task, TRUE); |
465 | -- |
466 | --out: |
467 | -- g_object_unref (task); |
468 | --} |
469 | -- |
470 | --static void |
471 | --get_client_cb (GObject *source, |
472 | -- GAsyncResult *result, |
473 | -- gpointer user_data) |
474 | --{ |
475 | -- GTask *task = user_data; |
476 | -- GError *error = NULL; |
477 | -- gchar *path; |
478 | -- |
479 | -- if (!gclue_manager_call_get_client_finish (GCLUE_MANAGER (source), &path, |
480 | -- result, &error)) |
481 | -- { |
482 | -- DEBUG ("GetClient failed: %s", error->message); |
483 | -- g_task_return_error (task, error); |
484 | -- g_object_unref (task); |
485 | -- return; |
486 | -- } |
487 | -- |
488 | -- gclue_client_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, |
489 | -- GEOCLUE_BUS_NAME, path, NULL, client_cb, task); |
490 | -- |
491 | -- g_free (path); |
492 | --} |
493 | -- |
494 | --static void |
495 | --manager_cb (GObject *source, |
496 | -- GAsyncResult *result, |
497 | -- gpointer user_data) |
498 | --{ |
499 | -- GTask *task = user_data; |
500 | -- GError *error = NULL; |
501 | -- GClueManager *mgr; |
502 | -- |
503 | -- mgr = gclue_manager_proxy_new_for_bus_finish (result, &error); |
504 | -- if (mgr == NULL) |
505 | -- { |
506 | -- DEBUG ("Failed to create Geoclue manager: %s", error->message); |
507 | -- g_task_return_error (task, error); |
508 | -- g_object_unref (task); |
509 | -- return; |
510 | -- } |
511 | -- |
512 | -- gclue_manager_call_get_client (mgr, NULL, get_client_cb, task); |
513 | -- g_object_unref (mgr); |
514 | --} |
515 | -- |
516 | --void |
517 | --empathy_geoclue_helper_start_async (EmpathyGeoclueHelper *self, |
518 | -- GAsyncReadyCallback callback, |
519 | -- gpointer user_data) |
520 | --{ |
521 | -- GTask *task; |
522 | -- |
523 | -- task = g_task_new (self, NULL, callback, user_data); |
524 | -- |
525 | -- if (self->priv->started) |
526 | -- { |
527 | -- g_task_return_boolean (task, TRUE); |
528 | -- g_object_unref (task); |
529 | -- return; |
530 | -- } |
531 | -- |
532 | -- gclue_client_call_start (self->priv->client, NULL, client_start_cb, task); |
533 | --} |
534 | -- |
535 | --gboolean |
536 | --empathy_geoclue_helper_start_finish (EmpathyGeoclueHelper *self, |
537 | -- GAsyncResult *result, |
538 | -- GError **error) |
539 | --{ |
540 | -- g_return_val_if_fail (g_task_is_valid (result, self), FALSE); |
541 | -- |
542 | -- return g_task_propagate_boolean (G_TASK (result), error); |
543 | --} |
544 | -- |
545 | --GClueLocation * |
546 | --empathy_geoclue_helper_get_location (EmpathyGeoclueHelper *self) |
547 | --{ |
548 | -- return self->priv->location; |
549 | --} |
550 | -- |
551 | --static void |
552 | --empathy_geoclue_helper_init_async (GAsyncInitable *initable, |
553 | -- gint io_priority, |
554 | -- GCancellable *cancellable, |
555 | -- GAsyncReadyCallback callback, |
556 | -- gpointer user_data) |
557 | --{ |
558 | -- GTask *task; |
559 | -- |
560 | -- task = g_task_new (initable, cancellable, callback, user_data); |
561 | -- |
562 | -- gclue_manager_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, |
563 | -- GEOCLUE_BUS_NAME, "/org/freedesktop/GeoClue2/Manager", |
564 | -- NULL, manager_cb, task); |
565 | --} |
566 | -- |
567 | --static gboolean |
568 | --empathy_geoclue_helper_init_finish (GAsyncInitable *initable, |
569 | -- GAsyncResult *result, |
570 | -- GError **error) |
571 | --{ |
572 | -- g_return_val_if_fail (g_task_is_valid (result, initable), FALSE); |
573 | -- |
574 | -- return g_task_propagate_boolean (G_TASK (result), error); |
575 | --} |
576 | -- |
577 | --static void |
578 | --async_initable_iface_init (GAsyncInitableIface *iface) |
579 | --{ |
580 | -- iface->init_async = empathy_geoclue_helper_init_async; |
581 | -- iface->init_finish = empathy_geoclue_helper_init_finish; |
582 | --} |
583 | -- |
584 | --void |
585 | --empathy_geoclue_helper_new_async (guint distance_threshold, |
586 | -- GAsyncReadyCallback callback, |
587 | -- gpointer user_data) |
588 | --{ |
589 | -- g_async_initable_new_async (EMPATHY_TYPE_GEOCLUE_HELPER, |
590 | -- G_PRIORITY_DEFAULT, NULL, callback, user_data, |
591 | -- "distance-threshold", distance_threshold, |
592 | -- NULL); |
593 | --} |
594 | -- |
595 | --EmpathyGeoclueHelper * |
596 | --empathy_geoclue_helper_new_finish (GAsyncResult *result, |
597 | -- GError **error) |
598 | --{ |
599 | -- GObject *object, *source_object; |
600 | -- |
601 | -- source_object = g_async_result_get_source_object (result); |
602 | -- |
603 | -- object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), |
604 | -- result, error); |
605 | -- g_object_unref (source_object); |
606 | -- |
607 | -- if (object != NULL) |
608 | -- return EMPATHY_GEOCLUE_HELPER (object); |
609 | -- else |
610 | -- return NULL; |
611 | --} |
612 | -- |
613 | --static void |
614 | --new_started_cb (GObject *source, |
615 | -- GAsyncResult *result, |
616 | -- gpointer user_data) |
617 | --{ |
618 | -- EmpathyGeoclueHelper *self = EMPATHY_GEOCLUE_HELPER (source); |
619 | -- GTask *new_started_task = user_data; |
620 | -- GError *error = NULL; |
621 | -- |
622 | -- if (!empathy_geoclue_helper_start_finish (self, result, &error)) |
623 | -- { |
624 | -- g_task_return_error (new_started_task, error); |
625 | -- g_object_unref (self); |
626 | -- goto out; |
627 | -- } |
628 | -- |
629 | -- /* pass ownership of self to g_task_return_error */ |
630 | -- g_task_return_pointer (new_started_task, self, g_object_unref); |
631 | -- |
632 | --out: |
633 | -- g_object_unref (new_started_task); |
634 | --} |
635 | -- |
636 | --static void |
637 | --new_started_init_cb (GObject *source, |
638 | -- GAsyncResult *result, |
639 | -- gpointer user_data) |
640 | --{ |
641 | -- GTask *new_started_task = user_data; |
642 | -- EmpathyGeoclueHelper *self; |
643 | -- GError *error = NULL; |
644 | -- |
645 | -- self = empathy_geoclue_helper_new_finish (result, &error); |
646 | -- if (self == NULL) |
647 | -- { |
648 | -- g_task_return_error (new_started_task, error); |
649 | -- g_object_unref (new_started_task); |
650 | -- return; |
651 | -- } |
652 | -- |
653 | -- /* Pass owernship of 'self' to new_started_cb */ |
654 | -- empathy_geoclue_helper_start_async (self, new_started_cb, new_started_task); |
655 | --} |
656 | -- |
657 | --void |
658 | --empathy_geoclue_helper_new_started_async (guint distance_threshold, |
659 | -- GAsyncReadyCallback callback, |
660 | -- gpointer user_data) |
661 | --{ |
662 | -- GTask *new_started_task; |
663 | -- |
664 | -- new_started_task = g_task_new (NULL, NULL, callback, user_data); |
665 | -- |
666 | -- empathy_geoclue_helper_new_async (distance_threshold, new_started_init_cb, |
667 | -- new_started_task); |
668 | --} |
669 | -- |
670 | --EmpathyGeoclueHelper * |
671 | --empathy_geoclue_helper_new_started_finish (GAsyncResult *result, |
672 | -- GError **error) |
673 | --{ |
674 | -- g_return_val_if_fail (g_task_is_valid (result, NULL), NULL); |
675 | -- |
676 | -- return g_task_propagate_pointer (G_TASK (result), error); |
677 | --} |
678 | ---- empathy-3.12.6.orig/libempathy-gtk/empathy-geoclue-helper.h |
679 | -+++ /dev/null |
680 | -@@ -1,99 +0,0 @@ |
681 | --/* |
682 | -- * empathy-geoclue-helper.h |
683 | -- * |
684 | -- * Copyright (C) 2013 Collabora Ltd. <http://www.collabora.co.uk/> |
685 | -- * |
686 | -- * This library is free software; you can redistribute it and/or |
687 | -- * modify it under the terms of the GNU Lesser General Public |
688 | -- * License as published by the Free Software Foundation; either |
689 | -- * version 2.1 of the License, or (at your option) any later version. |
690 | -- * |
691 | -- * This library is distributed in the hope that it will be useful, |
692 | -- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
693 | -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
694 | -- * Lesser General Public License for more details. |
695 | -- * |
696 | -- * You should have received a copy of the GNU Lesser General Public |
697 | -- * License along with this library; if not, write to the Free Software |
698 | -- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
699 | -- */ |
700 | -- |
701 | --#ifndef __EMPATHY_GEOCLUE_HELPER_H__ |
702 | --#define __EMPATHY_GEOCLUE_HELPER_H__ |
703 | -- |
704 | --#include <glib-object.h> |
705 | -- |
706 | --G_BEGIN_DECLS |
707 | -- |
708 | --#include "geoclue-interface.h" |
709 | -- |
710 | --typedef struct _EmpathyGeoclueHelper EmpathyGeoclueHelper; |
711 | --typedef struct _EmpathyGeoclueHelperClass EmpathyGeoclueHelperClass; |
712 | --typedef struct _EmpathyGeoclueHelperPriv EmpathyGeoclueHelperPriv; |
713 | -- |
714 | --struct _EmpathyGeoclueHelperClass |
715 | --{ |
716 | -- /*<private>*/ |
717 | -- GObjectClass parent_class; |
718 | --}; |
719 | -- |
720 | --struct _EmpathyGeoclueHelper |
721 | --{ |
722 | -- /*<private>*/ |
723 | -- GObject parent; |
724 | -- EmpathyGeoclueHelperPriv *priv; |
725 | --}; |
726 | -- |
727 | --GType empathy_geoclue_helper_get_type (void); |
728 | -- |
729 | --/* TYPE MACROS */ |
730 | --#define EMPATHY_TYPE_GEOCLUE_HELPER \ |
731 | -- (empathy_geoclue_helper_get_type ()) |
732 | --#define EMPATHY_GEOCLUE_HELPER(obj) \ |
733 | -- (G_TYPE_CHECK_INSTANCE_CAST((obj), \ |
734 | -- EMPATHY_TYPE_GEOCLUE_HELPER, \ |
735 | -- EmpathyGeoclueHelper)) |
736 | --#define EMPATHY_GEOCLUE_HELPER_CLASS(klass) \ |
737 | -- (G_TYPE_CHECK_CLASS_CAST((klass), \ |
738 | -- EMPATHY_TYPE_GEOCLUE_HELPER, \ |
739 | -- EmpathyGeoclueHelperClass)) |
740 | --#define EMPATHY_IS_GEOCLUE_HELPER(obj) \ |
741 | -- (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ |
742 | -- EMPATHY_TYPE_GEOCLUE_HELPER)) |
743 | --#define EMPATHY_IS_GEOCLUE_HELPER_CLASS(klass) \ |
744 | -- (G_TYPE_CHECK_CLASS_TYPE((klass), \ |
745 | -- EMPATHY_TYPE_GEOCLUE_HELPER)) |
746 | --#define EMPATHY_GEOCLUE_HELPER_GET_CLASS(obj) \ |
747 | -- (G_TYPE_INSTANCE_GET_CLASS ((obj), \ |
748 | -- EMPATHY_TYPE_GEOCLUE_HELPER, \ |
749 | -- EmpathyGeoclueHelperClass)) |
750 | -- |
751 | --void empathy_geoclue_helper_new_async (guint distance_threshold, |
752 | -- GAsyncReadyCallback callback, |
753 | -- gpointer user_data); |
754 | -- |
755 | --EmpathyGeoclueHelper * empathy_geoclue_helper_new_finish (GAsyncResult *result, |
756 | -- GError **error); |
757 | -- |
758 | --void empathy_geoclue_helper_new_started_async (guint distance_threshold, |
759 | -- GAsyncReadyCallback callback, |
760 | -- gpointer user_data); |
761 | -- |
762 | --EmpathyGeoclueHelper * empathy_geoclue_helper_new_started_finish ( |
763 | -- GAsyncResult *result, |
764 | -- GError **error); |
765 | -- |
766 | --void empathy_geoclue_helper_start_async (EmpathyGeoclueHelper *self, |
767 | -- GAsyncReadyCallback callback, |
768 | -- gpointer user_data); |
769 | -- |
770 | --gboolean empathy_geoclue_helper_start_finish (EmpathyGeoclueHelper *self, |
771 | -- GAsyncResult *result, |
772 | -- GError **error); |
773 | -- |
774 | --GClueLocation * empathy_geoclue_helper_get_location ( |
775 | -- EmpathyGeoclueHelper *self); |
776 | -- |
777 | --G_END_DECLS |
778 | -- |
779 | --#endif /* #ifndef __EMPATHY_GEOCLUE_HELPER_H__*/ |
780 | ---- empathy-3.12.6.orig/libempathy-gtk/empathy-location-manager.c |
781 | -+++ empathy-3.12.6/libempathy-gtk/empathy-location-manager.c |
782 | -@@ -24,11 +24,11 @@ |
783 | - |
784 | - #include <telepathy-glib/telepathy-glib-dbus.h> |
785 | - |
786 | -+#include <geoclue/geoclue-master.h> |
787 | - #include <tp-account-widgets/tpaw-time.h> |
788 | - |
789 | - #include "empathy-gsettings.h" |
790 | - #include "empathy-location.h" |
791 | --#include "empathy-geoclue-helper.h" |
792 | - |
793 | - #define DEBUG_FLAG EMPATHY_DEBUG_LOCATION |
794 | - #include "empathy-debug.h" |
795 | -@@ -37,16 +37,8 @@ |
796 | - #define TIMEOUT 10 |
797 | - static EmpathyLocationManager *location_manager = NULL; |
798 | - |
799 | --typedef enum |
800 | --{ |
801 | -- GEOCLUE_NONE = 0, |
802 | -- GEOCLUE_STARTING, |
803 | -- GEOCLUE_STARTED, |
804 | -- GEOCLUE_FAILED, |
805 | --} GeoclueStatus; |
806 | -- |
807 | - struct _EmpathyLocationManagerPrivate { |
808 | -- GeoclueStatus geoclue_status; |
809 | -+ gboolean geoclue_is_setup; |
810 | - /* Contains the location to be sent to accounts. Geoclue is used |
811 | - * to populate it. This HashTable uses Telepathy's style (string, |
812 | - * GValue). Keys are defined in empathy-location.h |
813 | -@@ -55,9 +47,13 @@ struct _EmpathyLocationManagerPrivate { |
814 | - |
815 | - GSettings *gsettings_loc; |
816 | - |
817 | -+ GeoclueResourceFlags resources; |
818 | -+ GeoclueMasterClient *gc_client; |
819 | -+ GeocluePosition *gc_position; |
820 | -+ GeoclueAddress *gc_address; |
821 | -+ |
822 | - gboolean reduce_accuracy; |
823 | - TpAccountManager *account_manager; |
824 | -- EmpathyGeoclueHelper *geoclue; |
825 | - |
826 | - /* The idle id for publish_on_idle func */ |
827 | - guint timeout_id; |
828 | -@@ -97,6 +93,9 @@ location_manager_dispose (GObject *objec |
829 | - |
830 | - tp_clear_object (&self->priv->account_manager); |
831 | - tp_clear_object (&self->priv->gsettings_loc); |
832 | -+ tp_clear_object (&self->priv->gc_client); |
833 | -+ tp_clear_object (&self->priv->gc_position); |
834 | -+ tp_clear_object (&self->priv->gc_address); |
835 | - tp_clear_pointer (&self->priv->location, g_hash_table_unref); |
836 | - |
837 | - if (dispose != NULL) |
838 | -@@ -243,105 +242,333 @@ new_connection_cb (TpAccount *account, |
839 | - } |
840 | - |
841 | - static void |
842 | --update_location (EmpathyLocationManager *self, |
843 | -- GClueLocation *proxy) |
844 | -+update_timestamp (EmpathyLocationManager *self) |
845 | - { |
846 | -- gdouble latitude, longitude, accuracy; |
847 | -- const gchar *desc; |
848 | - gint64 timestamp; |
849 | - |
850 | -- latitude = gclue_location_get_latitude (proxy); |
851 | -- longitude = gclue_location_get_longitude (proxy); |
852 | -- accuracy = gclue_location_get_accuracy (proxy); |
853 | -- desc = gclue_location_get_description (proxy); |
854 | -- |
855 | -- DEBUG ("Location updated: (%f %f) accuracy: %f (%s)", |
856 | -- latitude, longitude, accuracy, desc); |
857 | -- |
858 | -- if (self->priv->reduce_accuracy) |
859 | -- { |
860 | -- /* Truncate at 1 decimal place */ |
861 | -- latitude = ((int) (latitude * 10)) / 10.0; |
862 | -- longitude = ((int) (longitude * 10)) / 10.0; |
863 | -+ timestamp = tpaw_time_get_current (); |
864 | -+ tp_asv_set_int64 (self->priv->location, EMPATHY_LOCATION_TIMESTAMP, |
865 | -+ timestamp); |
866 | -+ |
867 | -+ DEBUG ("\t - Timestamp: %" G_GINT64_FORMAT, timestamp); |
868 | -+} |
869 | -+ |
870 | -+static void |
871 | -+address_changed_cb (GeoclueAddress *address, |
872 | -+ int timestamp, |
873 | -+ GHashTable *details, |
874 | -+ GeoclueAccuracy *accuracy, |
875 | -+ gpointer user_data) |
876 | -+{ |
877 | -+ EmpathyLocationManager *self = user_data; |
878 | -+ GeoclueAccuracyLevel level; |
879 | -+ GHashTableIter iter; |
880 | -+ gpointer key, value; |
881 | -+ |
882 | -+ geoclue_accuracy_get_details (accuracy, &level, NULL, NULL); |
883 | -+ DEBUG ("New address (accuracy level %d):", level); |
884 | -+ /* FIXME: Publish accuracy level also considering the position's */ |
885 | -+ |
886 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_STREET); |
887 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_AREA); |
888 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_REGION); |
889 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_COUNTRY); |
890 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_COUNTRY_CODE); |
891 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_POSTAL_CODE); |
892 | -+ |
893 | -+ if (g_hash_table_size (details) == 0) |
894 | -+ { |
895 | -+ DEBUG ("\t - (Empty)"); |
896 | -+ return; |
897 | -+ } |
898 | -+ |
899 | -+ g_hash_table_iter_init (&iter, details); |
900 | -+ while (g_hash_table_iter_next (&iter, &key, &value)) |
901 | -+ { |
902 | -+ /* Discard street information if reduced accuracy is on */ |
903 | -+ if (self->priv->reduce_accuracy && |
904 | -+ !tp_strdiff (key, EMPATHY_LOCATION_STREET)) |
905 | -+ continue; |
906 | -+ |
907 | -+ tp_asv_set_string (self->priv->location, key, value); |
908 | -+ |
909 | -+ DEBUG ("\t - %s: %s", (gchar *) key, (gchar *) value); |
910 | -+ } |
911 | -+ |
912 | -+ update_timestamp (self); |
913 | -+ if (self->priv->timeout_id == 0) |
914 | -+ self->priv->timeout_id = g_timeout_add_seconds (TIMEOUT, publish_on_idle, |
915 | -+ self); |
916 | -+} |
917 | -+ |
918 | -+static void |
919 | -+initial_address_cb (GeoclueAddress *address, |
920 | -+ int timestamp, |
921 | -+ GHashTable *details, |
922 | -+ GeoclueAccuracy *accuracy, |
923 | -+ GError *error, |
924 | -+ gpointer self) |
925 | -+{ |
926 | -+ if (error) |
927 | -+ { |
928 | -+ DEBUG ("Error: %s", error->message); |
929 | -+ g_error_free (error); |
930 | - } |
931 | - else |
932 | - { |
933 | -- /* Include the description only if we are not asked to reduce the |
934 | -- * accuracy as it can contains a pretty specific description of the |
935 | -- * location. */ |
936 | -- tp_asv_set_string (self->priv->location, EMPATHY_LOCATION_DESCRIPTION, |
937 | -- desc); |
938 | -+ address_changed_cb (address, timestamp, details, accuracy, self); |
939 | - } |
940 | -+} |
941 | - |
942 | -- tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_LAT, latitude); |
943 | -- tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_LON, longitude); |
944 | -- tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_ACCURACY, accuracy); |
945 | -+static void |
946 | -+position_changed_cb (GeocluePosition *position, |
947 | -+ GeocluePositionFields fields, |
948 | -+ int timestamp, |
949 | -+ double latitude, |
950 | -+ double longitude, |
951 | -+ double altitude, |
952 | -+ GeoclueAccuracy *accuracy, |
953 | -+ gpointer user_data) |
954 | -+{ |
955 | -+ EmpathyLocationManager *self = user_data; |
956 | -+ GeoclueAccuracyLevel level; |
957 | -+ gdouble mean, horizontal, vertical; |
958 | - |
959 | -- timestamp = tpaw_time_get_current (); |
960 | -- tp_asv_set_int64 (self->priv->location, EMPATHY_LOCATION_TIMESTAMP, |
961 | -- timestamp); |
962 | -+ geoclue_accuracy_get_details (accuracy, &level, &horizontal, &vertical); |
963 | -+ DEBUG ("New position (accuracy level %d)", level); |
964 | -+ if (level == GEOCLUE_ACCURACY_LEVEL_NONE) |
965 | -+ return; |
966 | -+ |
967 | -+ if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) |
968 | -+ { |
969 | -+ |
970 | -+ if (self->priv->reduce_accuracy) |
971 | -+ /* Truncate at 1 decimal place */ |
972 | -+ longitude = ((int) (longitude * 10)) / 10.0; |
973 | - |
974 | -+ tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_LON, longitude); |
975 | -+ |
976 | -+ DEBUG ("\t - Longitude: %f", longitude); |
977 | -+ } |
978 | -+ else |
979 | -+ { |
980 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_LON); |
981 | -+ } |
982 | -+ |
983 | -+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) |
984 | -+ { |
985 | -+ if (self->priv->reduce_accuracy) |
986 | -+ /* Truncate at 1 decimal place */ |
987 | -+ latitude = ((int) (latitude * 10)) / 10.0; |
988 | -+ |
989 | -+ tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_LAT, latitude); |
990 | -+ |
991 | -+ DEBUG ("\t - Latitude: %f", latitude); |
992 | -+ } |
993 | -+ else |
994 | -+ { |
995 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_LAT); |
996 | -+ } |
997 | -+ |
998 | -+ if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE) |
999 | -+ { |
1000 | -+ tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_ALT, altitude); |
1001 | -+ |
1002 | -+ DEBUG ("\t - Altitude: %f", altitude); |
1003 | -+ } |
1004 | -+ else |
1005 | -+ { |
1006 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_ALT); |
1007 | -+ } |
1008 | -+ |
1009 | -+ if (level == GEOCLUE_ACCURACY_LEVEL_DETAILED) |
1010 | -+ { |
1011 | -+ mean = (horizontal + vertical) / 2.0; |
1012 | -+ tp_asv_set_double (self->priv->location, EMPATHY_LOCATION_ACCURACY, mean); |
1013 | -+ |
1014 | -+ DEBUG ("\t - Accuracy: %f", mean); |
1015 | -+ } |
1016 | -+ else |
1017 | -+ { |
1018 | -+ g_hash_table_remove (self->priv->location, EMPATHY_LOCATION_ACCURACY); |
1019 | -+ } |
1020 | -+ |
1021 | -+ update_timestamp (self); |
1022 | - if (self->priv->timeout_id == 0) |
1023 | - self->priv->timeout_id = g_timeout_add_seconds (TIMEOUT, publish_on_idle, |
1024 | - self); |
1025 | - } |
1026 | - |
1027 | - static void |
1028 | --location_changed_cb (EmpathyGeoclueHelper *geoclue, |
1029 | -- GClueLocation *location, |
1030 | -- EmpathyLocationManager *self) |
1031 | -+initial_position_cb (GeocluePosition *position, |
1032 | -+ GeocluePositionFields fields, |
1033 | -+ int timestamp, |
1034 | -+ double latitude, |
1035 | -+ double longitude, |
1036 | -+ double altitude, |
1037 | -+ GeoclueAccuracy *accuracy, |
1038 | -+ GError *error, |
1039 | -+ gpointer self) |
1040 | - { |
1041 | -- update_location (self, location); |
1042 | -+ if (error) |
1043 | -+ { |
1044 | -+ DEBUG ("Error: %s", error->message); |
1045 | -+ g_error_free (error); |
1046 | -+ } |
1047 | -+ else |
1048 | -+ { |
1049 | -+ position_changed_cb (position, fields, timestamp, latitude, longitude, |
1050 | -+ altitude, accuracy, self); |
1051 | -+ } |
1052 | - } |
1053 | - |
1054 | - static void |
1055 | --geoclue_new_cb (GObject *source, |
1056 | -- GAsyncResult *result, |
1057 | -- gpointer user_data) |
1058 | -+set_requirements (EmpathyLocationManager *self, |
1059 | -+ GeoclueSetRequirementsCallback callback) |
1060 | - { |
1061 | -- EmpathyLocationManager *self = EMPATHY_LOCATION_MANAGER (user_data); |
1062 | -- GError *error = NULL; |
1063 | -- GClueLocation *location; |
1064 | -+ geoclue_master_client_set_requirements_async (self->priv->gc_client, |
1065 | -+ GEOCLUE_ACCURACY_LEVEL_COUNTRY, 0, FALSE, self->priv->resources, |
1066 | -+ callback, self); |
1067 | -+} |
1068 | -+ |
1069 | -+static void |
1070 | -+update_resources_set_requirements_cb (GeoclueMasterClient *client, |
1071 | -+ GError *error, |
1072 | -+ gpointer userdata) |
1073 | -+{ |
1074 | -+ EmpathyLocationManager *self = userdata; |
1075 | - |
1076 | -- self->priv->geoclue = empathy_geoclue_helper_new_started_finish (result, |
1077 | -- &error); |
1078 | -+ if (error != NULL) |
1079 | -+ { |
1080 | -+ DEBUG ("set_requirements failed: %s", error->message); |
1081 | -+ g_error_free (error); |
1082 | -+ return; |
1083 | -+ } |
1084 | - |
1085 | -- if (self->priv->geoclue == NULL) |
1086 | -+ geoclue_address_get_address_async (self->priv->gc_address, |
1087 | -+ initial_address_cb, self); |
1088 | -+ geoclue_position_get_position_async (self->priv->gc_position, |
1089 | -+ initial_position_cb, self); |
1090 | -+} |
1091 | -+ |
1092 | -+static void |
1093 | -+update_resources (EmpathyLocationManager *self) |
1094 | -+{ |
1095 | -+ DEBUG ("Updating resources %d", self->priv->resources); |
1096 | -+ |
1097 | -+ if (!self->priv->geoclue_is_setup) |
1098 | -+ return; |
1099 | -+ |
1100 | -+ /* As per Geoclue bug #15126, using NONE results in no address |
1101 | -+ * being found as geoclue-manual report an empty address with |
1102 | -+ * accuracy = NONE */ |
1103 | -+ set_requirements (self, update_resources_set_requirements_cb); |
1104 | -+} |
1105 | -+ |
1106 | -+static void |
1107 | -+create_address_cb (GeoclueMasterClient *client, |
1108 | -+ GeoclueAddress *address, |
1109 | -+ GError *error, |
1110 | -+ gpointer userdata) |
1111 | -+{ |
1112 | -+ EmpathyLocationManager *self = userdata; |
1113 | -+ |
1114 | -+ if (error != NULL) |
1115 | - { |
1116 | -- DEBUG ("Failed to create Geoclue client: %s", error->message); |
1117 | -+ DEBUG ("Failed to create GeoclueAddress: %s", error->message); |
1118 | - g_error_free (error); |
1119 | -- self->priv->geoclue_status = GEOCLUE_FAILED; |
1120 | - return; |
1121 | - } |
1122 | - |
1123 | -- self->priv->geoclue_status = GEOCLUE_STARTED; |
1124 | -+ self->priv->gc_address = address; |
1125 | - |
1126 | -- g_signal_connect_object (self->priv->geoclue, "location-changed", |
1127 | -- G_CALLBACK (location_changed_cb), self, 0); |
1128 | -+ g_signal_connect (G_OBJECT (self->priv->gc_address), "address-changed", |
1129 | -+ G_CALLBACK (address_changed_cb), self); |
1130 | - |
1131 | -- location = empathy_geoclue_helper_get_location (self->priv->geoclue); |
1132 | -- if (location != NULL) |
1133 | -- update_location (self, location); |
1134 | -+ self->priv->geoclue_is_setup = TRUE; |
1135 | - } |
1136 | - |
1137 | - static void |
1138 | --setup_geoclue (EmpathyLocationManager *self) |
1139 | -+create_position_cb (GeoclueMasterClient *client, |
1140 | -+ GeocluePosition *position, |
1141 | -+ GError *error, |
1142 | -+ gpointer userdata) |
1143 | -+{ |
1144 | -+ EmpathyLocationManager *self = userdata; |
1145 | -+ |
1146 | -+ if (error != NULL) |
1147 | -+ { |
1148 | -+ DEBUG ("Failed to create GeocluePosition: %s", error->message); |
1149 | -+ g_error_free (error); |
1150 | -+ return; |
1151 | -+ } |
1152 | -+ |
1153 | -+ self->priv->gc_position = position; |
1154 | -+ |
1155 | -+ g_signal_connect (G_OBJECT (self->priv->gc_position), "position-changed", |
1156 | -+ G_CALLBACK (position_changed_cb), self); |
1157 | -+ |
1158 | -+ /* Get updated when the address changes */ |
1159 | -+ geoclue_master_client_create_address_async (self->priv->gc_client, |
1160 | -+ create_address_cb, self); |
1161 | -+} |
1162 | -+ |
1163 | -+static void |
1164 | -+create_client_set_requirements_cb (GeoclueMasterClient *client, |
1165 | -+ GError *error, |
1166 | -+ gpointer userdata) |
1167 | -+{ |
1168 | -+ EmpathyLocationManager *self = userdata; |
1169 | -+ |
1170 | -+ if (error != NULL) |
1171 | -+ { |
1172 | -+ DEBUG ("set_requirements failed: %s", error->message); |
1173 | -+ g_error_free (error); |
1174 | -+ return; |
1175 | -+ } |
1176 | -+ |
1177 | -+ /* Get updated when the position is changes */ |
1178 | -+ geoclue_master_client_create_position_async (self->priv->gc_client, |
1179 | -+ create_position_cb, self); |
1180 | -+} |
1181 | -+ |
1182 | -+static void |
1183 | -+create_client_cb (GeoclueMaster *master, |
1184 | -+ GeoclueMasterClient *client, |
1185 | -+ char *object_path, |
1186 | -+ GError *error, |
1187 | -+ gpointer userdata) |
1188 | - { |
1189 | -- switch (self->priv->geoclue_status) |
1190 | -+ EmpathyLocationManager *self = userdata; |
1191 | -+ |
1192 | -+ if (error != NULL) |
1193 | - { |
1194 | -- case GEOCLUE_NONE: |
1195 | -- g_assert (self->priv->geoclue == NULL); |
1196 | -- self->priv->geoclue_status = GEOCLUE_STARTING; |
1197 | -- empathy_geoclue_helper_new_started_async (0, geoclue_new_cb, self); |
1198 | -- break; |
1199 | -- case GEOCLUE_STARTED: |
1200 | -- case GEOCLUE_STARTING: |
1201 | -- case GEOCLUE_FAILED: |
1202 | -+ DEBUG ("Failed to create GeoclueMasterClient: %s", error->message); |
1203 | -+ g_error_free (error); |
1204 | - return; |
1205 | - } |
1206 | -+ |
1207 | -+ /* @client seems be (transfer full) looking at the geoclue code; yeah for |
1208 | -+ * undocumented API... */ |
1209 | -+ self->priv->gc_client = client; |
1210 | -+ |
1211 | -+ set_requirements (self, create_client_set_requirements_cb); |
1212 | - } |
1213 | - |
1214 | - static void |
1215 | -+setup_geoclue (EmpathyLocationManager *self) |
1216 | -+{ |
1217 | -+ GeoclueMaster *master; |
1218 | -+ |
1219 | -+ DEBUG ("Setting up Geoclue"); |
1220 | -+ master = geoclue_master_get_default (); |
1221 | -+ |
1222 | -+ geoclue_master_create_client_async (master, create_client_cb, self); |
1223 | -+ |
1224 | -+ g_object_unref (master); |
1225 | -+ } |
1226 | -+ |
1227 | -+static void |
1228 | - publish_cb (GSettings *gsettings_loc, |
1229 | - const gchar *key, |
1230 | - gpointer user_data) |
1231 | -@@ -352,7 +579,16 @@ publish_cb (GSettings *gsettings_loc, |
1232 | - |
1233 | - if (g_settings_get_boolean (gsettings_loc, key)) |
1234 | - { |
1235 | -- setup_geoclue (self); |
1236 | -+ if (!self->priv->geoclue_is_setup) |
1237 | -+ setup_geoclue (self); |
1238 | -+ /* if still not setup than the init failed */ |
1239 | -+ if (!self->priv->geoclue_is_setup) |
1240 | -+ return; |
1241 | -+ |
1242 | -+ geoclue_address_get_address_async (self->priv->gc_address, |
1243 | -+ initial_address_cb, self); |
1244 | -+ geoclue_position_get_position_async (self->priv->gc_position, |
1245 | -+ initial_position_cb, self); |
1246 | - } |
1247 | - else |
1248 | - { |
1249 | -@@ -361,10 +597,54 @@ publish_cb (GSettings *gsettings_loc, |
1250 | - */ |
1251 | - g_hash_table_remove_all (self->priv->location); |
1252 | - publish_to_all_connections (self, TRUE); |
1253 | -- |
1254 | -- g_clear_object (&self->priv->geoclue); |
1255 | -- self->priv->geoclue_status = GEOCLUE_NONE; |
1256 | - } |
1257 | -+ |
1258 | -+} |
1259 | -+ |
1260 | -+static void |
1261 | -+resource_cb (GSettings *gsettings_loc, |
1262 | -+ const gchar *key, |
1263 | -+ gpointer user_data) |
1264 | -+{ |
1265 | -+ EmpathyLocationManager *self = EMPATHY_LOCATION_MANAGER (user_data); |
1266 | -+ GeoclueResourceFlags resource = 0; |
1267 | -+ |
1268 | -+ DEBUG ("%s changed", key); |
1269 | -+ |
1270 | -+ if (!tp_strdiff (key, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK)) |
1271 | -+ resource = GEOCLUE_RESOURCE_NETWORK; |
1272 | -+ if (!tp_strdiff (key, EMPATHY_PREFS_LOCATION_RESOURCE_CELL)) |
1273 | -+ resource = GEOCLUE_RESOURCE_CELL; |
1274 | -+ if (!tp_strdiff (key, EMPATHY_PREFS_LOCATION_RESOURCE_GPS)) |
1275 | -+ resource = GEOCLUE_RESOURCE_GPS; |
1276 | -+ |
1277 | -+ if (g_settings_get_boolean (gsettings_loc, key)) |
1278 | -+ self->priv->resources |= resource; |
1279 | -+ else |
1280 | -+ self->priv->resources &= ~resource; |
1281 | -+ |
1282 | -+ if (self->priv->geoclue_is_setup) |
1283 | -+ update_resources (self); |
1284 | -+} |
1285 | -+ |
1286 | -+static void |
1287 | -+accuracy_cb (GSettings *gsettings_loc, |
1288 | -+ const gchar *key, |
1289 | -+ gpointer user_data) |
1290 | -+{ |
1291 | -+ EmpathyLocationManager *self = EMPATHY_LOCATION_MANAGER (user_data); |
1292 | -+ |
1293 | -+ DEBUG ("%s changed", key); |
1294 | -+ |
1295 | -+ self->priv->reduce_accuracy = g_settings_get_boolean (gsettings_loc, key); |
1296 | -+ |
1297 | -+ if (!self->priv->geoclue_is_setup) |
1298 | -+ return; |
1299 | -+ |
1300 | -+ geoclue_address_get_address_async (self->priv->gc_address, |
1301 | -+ initial_address_cb, self); |
1302 | -+ geoclue_position_get_position_async (self->priv->gc_position, |
1303 | -+ initial_position_cb, self); |
1304 | - } |
1305 | - |
1306 | - static void |
1307 | -@@ -402,6 +682,7 @@ empathy_location_manager_init (EmpathyLo |
1308 | - EMPATHY_TYPE_LOCATION_MANAGER, EmpathyLocationManagerPrivate); |
1309 | - |
1310 | - self->priv = priv; |
1311 | -+ priv->geoclue_is_setup = FALSE; |
1312 | - priv->location = tp_asv_new (NULL, NULL); |
1313 | - priv->gsettings_loc = g_settings_new (EMPATHY_PREFS_LOCATION_SCHEMA); |
1314 | - |
1315 | -@@ -415,7 +696,25 @@ empathy_location_manager_init (EmpathyLo |
1316 | - g_signal_connect (priv->gsettings_loc, |
1317 | - "changed::" EMPATHY_PREFS_LOCATION_PUBLISH, |
1318 | - G_CALLBACK (publish_cb), self); |
1319 | -+ g_signal_connect (priv->gsettings_loc, |
1320 | -+ "changed::" EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK, |
1321 | -+ G_CALLBACK (resource_cb), self); |
1322 | -+ g_signal_connect (priv->gsettings_loc, |
1323 | -+ "changed::" EMPATHY_PREFS_LOCATION_RESOURCE_CELL, |
1324 | -+ G_CALLBACK (resource_cb), self); |
1325 | -+ g_signal_connect (priv->gsettings_loc, |
1326 | -+ "changed::" EMPATHY_PREFS_LOCATION_RESOURCE_GPS, |
1327 | -+ G_CALLBACK (resource_cb), self); |
1328 | -+ g_signal_connect (priv->gsettings_loc, |
1329 | -+ "changed::" EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY, |
1330 | -+ G_CALLBACK (accuracy_cb), self); |
1331 | - |
1332 | -+ resource_cb (priv->gsettings_loc, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK, |
1333 | -+ self); |
1334 | -+ resource_cb (priv->gsettings_loc, EMPATHY_PREFS_LOCATION_RESOURCE_CELL, self); |
1335 | -+ resource_cb (priv->gsettings_loc, EMPATHY_PREFS_LOCATION_RESOURCE_GPS, self); |
1336 | -+ accuracy_cb (priv->gsettings_loc, EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY, |
1337 | -+ self); |
1338 | - publish_cb (priv->gsettings_loc, EMPATHY_PREFS_LOCATION_PUBLISH, self); |
1339 | - } |
1340 | - |
1341 | ---- empathy-3.12.6.orig/libempathy/empathy-gsettings.h |
1342 | -+++ empathy-3.12.6/libempathy/empathy-gsettings.h |
1343 | -@@ -83,6 +83,9 @@ G_BEGIN_DECLS |
1344 | - |
1345 | - #define EMPATHY_PREFS_LOCATION_SCHEMA EMPATHY_PREFS_SCHEMA ".location" |
1346 | - #define EMPATHY_PREFS_LOCATION_PUBLISH "publish" |
1347 | -+#define EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK "resource-network" |
1348 | -+#define EMPATHY_PREFS_LOCATION_RESOURCE_CELL "resource-cell" |
1349 | -+#define EMPATHY_PREFS_LOCATION_RESOURCE_GPS "resource-gps" |
1350 | - #define EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY "reduce-accuracy" |
1351 | - |
1352 | - #define EMPATHY_PREFS_LOGGER_SCHEMA "org.freedesktop.Telepathy.Logger" |
1353 | ---- empathy-3.12.6.orig/src/empathy-preferences.c |
1354 | -+++ empathy-3.12.6/src/empathy-preferences.c |
1355 | -@@ -191,6 +191,12 @@ preferences_setup_widgets (EmpathyPrefer |
1356 | - |
1357 | - BIND_ACTIVE (loc, LOCATION_PUBLISH, |
1358 | - "checkbutton_location_publish"); |
1359 | -+ BIND_ACTIVE (loc, LOCATION_RESOURCE_NETWORK, |
1360 | -+ "checkbutton_location_resource_network"); |
1361 | -+ BIND_ACTIVE (loc, LOCATION_RESOURCE_CELL, |
1362 | -+ "checkbutton_location_resource_cell"); |
1363 | -+ BIND_ACTIVE (loc, LOCATION_RESOURCE_GPS, |
1364 | -+ "checkbutton_location_resource_gps"); |
1365 | - BIND_ACTIVE (loc, LOCATION_REDUCE_ACCURACY, |
1366 | - "checkbutton_location_reduce_accuracy"); |
1367 | - |
1368 | ---- empathy-3.12.6.orig/src/empathy-preferences.ui |
1369 | -+++ empathy-3.12.6/src/empathy-preferences.ui |
1370 | -@@ -833,6 +833,94 @@ |
1371 | - <property name="position">1</property> |
1372 | - </packing> |
1373 | - </child> |
1374 | -+ <child> |
1375 | -+ <object class="GtkFrame" id="frame5"> |
1376 | -+ <property name="visible">True</property> |
1377 | -+ <property name="can_focus">False</property> |
1378 | -+ <property name="label_xalign">0</property> |
1379 | -+ <property name="shadow_type">none</property> |
1380 | -+ <child> |
1381 | -+ <object class="GtkAlignment" id="alignment4"> |
1382 | -+ <property name="visible">True</property> |
1383 | -+ <property name="can_focus">False</property> |
1384 | -+ <property name="top_padding">6</property> |
1385 | -+ <property name="left_padding">12</property> |
1386 | -+ <child> |
1387 | -+ <object class="GtkBox" id="vbox5"> |
1388 | -+ <property name="visible">True</property> |
1389 | -+ <property name="can_focus">False</property> |
1390 | -+ <property name="orientation">vertical</property> |
1391 | -+ <child> |
1392 | -+ <object class="GtkCheckButton" id="checkbutton_location_resource_gps"> |
1393 | -+ <property name="label" translatable="yes">_GPS</property> |
1394 | -+ <property name="visible">True</property> |
1395 | -+ <property name="can_focus">True</property> |
1396 | -+ <property name="receives_default">False</property> |
1397 | -+ <property name="use_action_appearance">False</property> |
1398 | -+ <property name="use_underline">True</property> |
1399 | -+ <property name="draw_indicator">True</property> |
1400 | -+ </object> |
1401 | -+ <packing> |
1402 | -+ <property name="expand">False</property> |
1403 | -+ <property name="fill">False</property> |
1404 | -+ <property name="position">0</property> |
1405 | -+ </packing> |
1406 | -+ </child> |
1407 | -+ <child> |
1408 | -+ <object class="GtkCheckButton" id="checkbutton_location_resource_cell"> |
1409 | -+ <property name="label" translatable="yes">_Cellphone</property> |
1410 | -+ <property name="visible">True</property> |
1411 | -+ <property name="can_focus">True</property> |
1412 | -+ <property name="receives_default">False</property> |
1413 | -+ <property name="use_action_appearance">False</property> |
1414 | -+ <property name="use_underline">True</property> |
1415 | -+ <property name="active">True</property> |
1416 | -+ <property name="draw_indicator">True</property> |
1417 | -+ </object> |
1418 | -+ <packing> |
1419 | -+ <property name="expand">False</property> |
1420 | -+ <property name="fill">False</property> |
1421 | -+ <property name="position">1</property> |
1422 | -+ </packing> |
1423 | -+ </child> |
1424 | -+ <child> |
1425 | -+ <object class="GtkCheckButton" id="checkbutton_location_resource_network"> |
1426 | -+ <property name="label" translatable="yes">_Network (IP, Wi-Fi)</property> |
1427 | -+ <property name="visible">True</property> |
1428 | -+ <property name="can_focus">True</property> |
1429 | -+ <property name="receives_default">False</property> |
1430 | -+ <property name="use_action_appearance">False</property> |
1431 | -+ <property name="use_underline">True</property> |
1432 | -+ <property name="active">True</property> |
1433 | -+ <property name="draw_indicator">True</property> |
1434 | -+ </object> |
1435 | -+ <packing> |
1436 | -+ <property name="expand">False</property> |
1437 | -+ <property name="fill">False</property> |
1438 | -+ <property name="position">2</property> |
1439 | -+ </packing> |
1440 | -+ </child> |
1441 | -+ </object> |
1442 | -+ </child> |
1443 | -+ </object> |
1444 | -+ </child> |
1445 | -+ <child type="label"> |
1446 | -+ <object class="GtkLabel" id="label5"> |
1447 | -+ <property name="visible">True</property> |
1448 | -+ <property name="can_focus">False</property> |
1449 | -+ <property name="label" translatable="yes">Location sources:</property> |
1450 | -+ <attributes> |
1451 | -+ <attribute name="weight" value="bold"/> |
1452 | -+ </attributes> |
1453 | -+ </object> |
1454 | -+ </child> |
1455 | -+ </object> |
1456 | -+ <packing> |
1457 | -+ <property name="expand">False</property> |
1458 | -+ <property name="fill">True</property> |
1459 | -+ <property name="position">2</property> |
1460 | -+ </packing> |
1461 | -+ </child> |
1462 | - </object> |
1463 | - <packing> |
1464 | - <property name="position">4</property> |
1465 | |
1466 | === modified file 'debian/patches/series' |
1467 | --- debian/patches/series 2014-09-24 08:32:39 +0000 |
1468 | +++ debian/patches/series 2014-11-08 20:15:08 +0000 |
1469 | @@ -8,4 +8,3 @@ |
1470 | 42_shell_running.patch |
1471 | 43_quicklists.patch |
1472 | ubuntu_launch_uoa_panel.patch |
1473 | -Revert-geoclue-2.0.patch |
Thanks, but what about the fact that geoclue doesn't support plugin and can't use ubuntu-geoip? What difference would that mean in the user experience?