summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorKibum Kim <kb0929.kim@samsung.com>2012-01-07 00:46:29 +0900
committerKibum Kim <kb0929.kim@samsung.com>2012-01-07 00:46:29 +0900
commit0c44dc6cd8d3ede16172f22fa2b7c6af4459e55d (patch)
tree327fd58b5a721a2ecf835f2eccffde08cdbc4070 /debian
parent9f11ee482a4a28d6e85613ac5c765c588fdf20aa (diff)
downloadgeoclue-0c44dc6cd8d3ede16172f22fa2b7c6af4459e55d.tar.gz
geoclue-0c44dc6cd8d3ede16172f22fa2b7c6af4459e55d.tar.bz2
geoclue-0c44dc6cd8d3ede16172f22fa2b7c6af4459e55d.zip
Git init
Diffstat (limited to 'debian')
-rw-r--r--debian/changelog333
-rw-r--r--debian/compat1
-rwxr-xr-xdebian/control63
-rw-r--r--debian/dirs2
-rw-r--r--debian/docs2
-rw-r--r--debian/geoclue-gpsd.install.in3
-rw-r--r--debian/geoclue-nominatim.install.in3
-rw-r--r--debian/geoclue.install.in2
-rw-r--r--debian/libgeoclue-dev.install.in4
-rw-r--r--debian/libgeoclue.install.in1
-rwxr-xr-xdebian/patches/geoclue_0.12.0-20slp2.patch395
-rwxr-xr-xdebian/patches/series2
-rwxr-xr-xdebian/patches/tizen.patch12717
-rwxr-xr-xdebian/rules138
14 files changed, 13666 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..4aba281
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,333 @@
+geoclue (0.12.0-20slp2) unstable; urgency=low
+
+ * use quilt for patch(tizen.patch)
+ * add last knonw position(geoclue_0.12.0-20slp2.patch)
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-20slp2
+
+ -- Genie Kim <daejins.kim@samsung.com> Fri, 06 Jan 2012 14:50:30 +0900
+
+geoclue (0.12.0-19slp2+5) unstable; urgency=low
+
+ * add geoclue-gpsd install file
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-19slp2+5
+
+ -- Genie Kim <daejins.kim@samsung.com> Mon, 19 Dec 2011 13:56:07 +0900
+
+geoclue (0.12.0-19slp2+4) unstable; urgency=low
+
+ * activate geoclue-gpsd
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-19slp2+4
+
+ -- Genie Kim <daejins.kim@samsung.com> Wed, 07 Dec 2011 16:47:11 +0900
+
+geoclue (0.12.0-19slp2+3) unstable; urgency=low
+
+ * remove not using packages
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-19slp2+3
+
+ -- Genie Kim <daejins.kim@samsung.com> Tue, 06 Dec 2011 22:36:09 +0900
+
+geoclue (0.12.0-19slp2+2) unstable; urgency=low
+
+ * Remove geoclue-gpsd package for add new feature and geoclue-gpsd is moved under geoclue-providers
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-19slp2+2
+
+ -- Genie Kim <daejins.kim@samsung.com> Sat, 26 Nov 2011 12:15:52 +0900
+
+geoclue (0.12.0-19slp2+1) unstable; urgency=low
+
+ * Fix bug in dbus signal for satellite information
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-19slp2+1
+
+ -- Yunhan Kim <yhan.kim@samsung.com> Fri, 21 Oct 2011 09:03:40 +0900
+
+geoclue (0.12.0-18slp2+5) unstable; urgency=low
+
+ * remove GTK dependency
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-18slp2+5
+
+ -- Genie Kim <daejins.kim@samsung.com> Thu, 15 Sep 2011 13:55:47 +0900
+
+geoclue (0.12.0-18slp2+4) unstable; urgency=low
+
+ * upgrade of dbus-glib : remove Depends
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-18slp2+4
+
+ -- Genie Kim <daejins.kim@samsung.com> Tue, 02 Aug 2011 11:30:11 +0900
+
+geoclue (0.12.0-18slp2+3) unstable; urgency=low
+
+ * Add and change boilerplate
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-18slp2+3
+
+ -- Genie Kim <daejins.kim@samsung.com> Tue, 19 Jul 2011 17:22:02 +0900
+
+geoclue (0.12.0-18slp2+2) unstable; urgency=low
+
+ * Install geoclue-nominatim package
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-18slp2+2
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Mon, 13 Jun 2011 11:20:07 +0900
+
+geoclue (0.12.0-18slp2+1) unstable; urgency=low
+
+ * Release again for glib upgrade
+ * Git : pkgs/g/geoclue
+ * Tag : geoclue_0.12.0-18slp2+1
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Wed, 30 Mar 2011 15:13:47 +0900
+
+geoclue (0.12.0-17slp2+17) unstable; urgency=low
+
+ * Fix geoclue-gpsd & Add debug package
+ * Tag : geoclue_0.12.0-17slp2+17
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Wed, 24 Nov 2010 22:38:02 +0900
+
+geoclue (0.12.0-17slp2+16) unstable; urgency=low
+
+ * Remove test-gui & remove auto genarated files
+ * Tag : geoclue_0.12.0-17slp2+16
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 12 Nov 2010 13:31:03 +0900
+
+geoclue (0.12.0-17slp2+15) unstable; urgency=low
+
+ * Release geoclue_0.12.0-17slp2+15
+ * Tag : geoclue_0.12.0-17slp2+15
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Wed, 10 Nov 2010 17:00:18 +0900
+
+geoclue (0.12.0-16slp2+13) unstable; urgency=low
+
+ * Add xps provider
+ * Tag : geoclue_0.12.0-16slp2+13
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Mon, 08 Nov 2010 13:18:51 +0900
+
+geoclue (0.12.0-15slp2+12) unstable; urgency=low
+
+ * Remove skyhooks & gpsd packages
+ * Tag : geoclue_0.12.0-15slp2+12
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 29 Oct 2010 16:21:45 +0900
+
+geoclue (0.12.0-14slp2+11) unstable; urgency=low
+
+ * Fix for Limo contrib.
+ * Tag : geoclue_0.12.0-14slp2+11
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 29 Oct 2010 16:21:41 +0900
+
+geoclue (0.12.0-13slp2+10) unstable; urgency=low
+
+ * Fix BS for multi process
+ * Tag : geoclue_0.12.0-13slp2+10
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Tue, 12 Oct 2010 21:09:36 +0900
+
+geoclue (0.12.0-12slp2+9) unstable; urgency=low
+
+ * Apply tweak guide
+ * Tag : geoclue_0.12.0-12slp2+9
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 17 Sep 2010 19:17:45 +0900
+
+geoclue (0.12.0-11slp2+8) unstable; urgency=low
+
+ * Bug fix for impolite clients
+ * Tag : geoclue_0.12.0-11slp2+8
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Thu, 09 Sep 2010 11:52:42 +0900
+
+geoclue (0.12.0-10slp2+7) unstable; urgency=low
+
+ * We can use sync API if lbs-engine is already initialized
+ * Tag : geoclue_0.12.0-10slp2+7
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Mon, 06 Sep 2010 10:53:59 +0900
+
+geoclue (0.12.0-9slp2+6) unstable; urgency=low
+
+ * Modify lbs-sync API & Fix signaling & Add lbs-example & Remove lbs-stub
+ * Tag : geoclue_0.12.0-9slp2+6
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Sat, 04 Sep 2010 17:55:05 +0900
+
+geoclue (0.12.0-8slp2+5) unstable; urgency=low
+
+ * change lbs-stub --> lbs-client (lbs-engine)
+ * Tag : geoclue_0.12.0-8slp2+5
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Wed, 01 Sep 2010 11:41:56 +0900
+
+geoclue (0.12.0-7slp2+4) unstable; urgency=low
+
+ * Add G_END_DECLS ( Bug fix )
+ * Tag : geoclue_0.12.0-7slp2+4
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Mon, 30 Aug 2010 18:14:30 +0900
+
+geoclue (0.12.0-6slp2+3) unstable; urgency=low
+
+ * Modifying version
+ * Tag : geoclue_0.12.0-6slp2+3
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Sat, 28 Aug 2010 21:59:03 +0900
+
+geoclue (0.12.0-1slp2+3) unstable; urgency=low
+
+ * Add nmea&sattelite interface
+ * Tag : geoclue_0.12.0-1slp2+3
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Sat, 28 Aug 2010 21:38:51 +0900
+
+geoclue (0.12.0-5slp2+2) unstable; urgency=low
+
+ * Temporary patch for browser (lbs-engine --> lbs stub)
+ * Tag : geoclue_0.12.0-5slp2+2
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 27 Aug 2010 14:00:04 +0900
+
+geoclue (0.12.0-5slp2+1) unstable; urgency=low
+
+ * Change libgeoclue0.install.in --> libgeoclue.install.in
+ * Tag : geoclue_0.12.0-5slp2+1
+
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Sat, 21 Aug 2010 01:00:44 +0900
+
+geoclue (0.12.0-4slp2+1) unstable; urgency=low
+
+ * Version up
+ * Tag : geoclue_0.12.0-4slp2+1
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Sat, 21 Aug 2010 00:41:18 +0900
+
+geoclue (0.12.0-3slp2+1) unstable; urgency=low
+
+ * Change git tag again
+ * Tag : geoclue_0.12.0-3slp2+1
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 20 Aug 2010 17:10:00 +0900
+
+geoclue (0.12.0-2slp2+1) unstable; urgency=low
+
+ * Change git tag
+ * Tag : geoclue_0.12.0-2slp2+1
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 20 Aug 2010 16:55:13 +0900
+
+geoclue (0.12.0-1slp2+1) unstable; urgency=low
+
+ * Fix geoclue-lbs for receiving callback from lbs-client
+ * Change debian/control for using lbs-client
+ * Tag : geoclue_0.12.0-1slp2+1
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com> Fri, 20 Aug 2010 14:22:17 +0900
+
+geoclue (0.11.1-13slp2+3) unstable; urgency=low
+
+ * Disable to check gtkdocize
+ * Tag : geoclue_0.11.1-13slp2+3
+
+ -- Gyuyoung Kim <gyuyoung.kim@samsung.com> Sat, 05 Jun 2010 16:43:43 +0900
+
+geoclue (0.11.1-13slp2+2) unstable; urgency=low
+
+ * Change DBUS_BUS_SESSION with DBUS_BUS_SYSTEM
+ * Tag : geoclue_0.11.1-13slp2+2
+
+ -- Gyuyoung Kim <gyuyoung.kim@samsung.com> Mon, 24 May 2010 13:36:37 +0900
+
+geoclue (0.11.1-13slp2+1) unstable; urgency=low
+
+ * Followd SLP package naming rule
+
+ -- Joone Hur <joone.hur@samsung.com> Thu, 01 Apr 2010 09:36:53 +0900
+
+geoclue (0.11.1-12) unstable; urgency=low
+
+ * Added missing gtk dependency for library
+
+ -- Lukasz Slachciak <l.slachciak@samsung.com> Wed, 31 Mar 2010 10:50:30 +0200
+
+geoclue (0.11.1-11) unstable; urgency=low
+
+ * Uploaders section added
+
+ -- Lukasz Slachciak <l.slachciak@samsung.com> Thu, 25 Mar 2010 16:31:33 +0100
+
+geoclue (0.11.1-10) unstable; urgency=low
+
+ * Toolchain upgrade
+
+ -- Lukasz Slachciak <l.slachciak@samsung.com> Thu, 25 Mar 2010 10:55:21 +0100
+
+geoclue (0.11.1-9) unstable; urgency=low
+
+ * add missing skyhook files to the package
+ * hostip provider allows for FORCE_IP env var
+ * let's have SUWON location by default
+ * use the data returned by LBS CLIENT in the signal - this could work with GPS now
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Tue, 16 Mar 2010 17:16:20 +0100
+
+geoclue (0.11.1-8) unstable; urgency=low
+
+ * Merged with changes from vanilla geoclue; this adds skyhook provider
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Fri, 12 Mar 2010 16:12:51 +0100
+
+geoclue (0.11.1-7) unstable; urgency=low
+
+ * Add LBS stub library (working) for testing LBS provider
+ * Make geoclue LBS provider emit position-changed signal
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Mon, 08 Mar 2010 17:07:01 +0100
+
+geoclue (0.11.1-6) unstable; urgency=low
+
+ * Update lbs service config
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Mon, 22 Feb 2010 16:25:06 +0100
+
+geoclue (0.11.1-5) unstable; urgency=low
+
+ * added LBS Position Provider
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Mon, 22 Feb 2010 15:02:20 +0100
+
+geoclue (0.11.1-4) unstable; urgency=low
+
+ * add gtk deps for devel package, required by geoclue-test-gui
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Thu, 21 Jan 2010 15:05:55 +0100
+
+geoclue (0.11.1-3) unstable; urgency=low
+
+ * more deps on gconf
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Tue, 19 Jan 2010 12:56:49 +0100
+
+geoclue (0.11.1-2) unstable; urgency=low
+
+ * added dependency on gconf
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Tue, 19 Jan 2010 11:48:25 +0100
+
+geoclue (0.11.1-1) unstable; urgency=low
+
+ * Initial release.
+
+ -- Jaroslaw Staniek <j.staniek@samsung.com> Thu, 14 Jan 2010 15:45:33 +0100
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100755
index 0000000..996a62a
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,63 @@
+Source: geoclue
+Section: utils
+Priority: extra
+Maintainer: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>, Genie kim <daejins.kim@samsung.com>
+Uploaders: Genie Kim <daejins.kim@samsung.com>
+Build-Depends: debhelper (>= 5), autotools-dev, libglib2.0-dev, libdbus-glib-1-dev, libxml2-dev, libgconf-dbus-dev, libgps-dev, libslp-setting-dev
+Standards-Version: 3.7.2
+Homepage: http://www.freedesktop.org/wiki/Software/GeoClue
+
+Package: geoclue
+Section: utils
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Geographic information framework
+ GeoClue provides applications access to various geographical information
+ sources using a D-Bus API or a C library.
+ .
+ This package contains the master server for GeoClue.
+
+Package: libgeoclue
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Suggests: geoclue
+Description: C API for GeoClue
+ libgeoclue is a convenience wrapper for the GeoClue service, and
+ the recommended way to use GeoClue in the C language.
+
+Package: libgeoclue-dbg
+Section: debug
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libgeoclue(=${Source-Version}), geoclue(=${Source-Version}), geoclue-gpsd(=${Source-Version})
+Suggests: geoclue
+Description: Debug package for libgeoclue, geoclue, geoclue-gpsd
+
+Package: libgeoclue-dev
+Section: libdevel
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libgeoclue (= ${binary:Version}), libdbus-glib-1-dev, libxml2-dev
+Description: C API for GeoClue (development files)
+ libgeoclue is a convenience wrapper for the GeoClue service, and
+ the recommended way to use GeoClue in the C language.
+
+Package: geoclue-gpsd
+Section: utils
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, geoclue (= ${binary:Version}), gpsd, libgps19
+Description: Position server for GeoClue (GPS)
+ GeoClue provides applications access to various geographical information
+ sources using a D-Bus API or a C library.
+ .
+ This package provides a positioning backend for GeoClue. The
+ location information comes from a GPS receiver through gpsd
+
+Package: geoclue-nominatim
+Section: utils
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, geoclue (= ${binary:Version})
+Description: Geocode server for GeoClue (OpenStreetMap)
+ GeoClue provides applications access to various geographical information
+ sources using a D-Bus API or a C library.
+ .
+ This package provides a tool to search osm data by name and address and to generate synthetic addresses of osm points (reverse geocoding)
diff --git a/debian/dirs b/debian/dirs
new file mode 100644
index 0000000..ca882bb
--- /dev/null
+++ b/debian/dirs
@@ -0,0 +1,2 @@
+usr/bin
+usr/sbin
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..50bd824
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,2 @@
+NEWS
+README
diff --git a/debian/geoclue-gpsd.install.in b/debian/geoclue-gpsd.install.in
new file mode 100644
index 0000000..a29e443
--- /dev/null
+++ b/debian/geoclue-gpsd.install.in
@@ -0,0 +1,3 @@
+debian/tmp@PREFIX@/libexec/geoclue-gpsd
+debian/tmp@PREFIX@/share/dbus-1/services/org.freedesktop.Geoclue.Providers.Gpsd.service
+debian/tmp@PREFIX@/share/geoclue-providers/geoclue-gpsd.provider
diff --git a/debian/geoclue-nominatim.install.in b/debian/geoclue-nominatim.install.in
new file mode 100644
index 0000000..48dcb0f
--- /dev/null
+++ b/debian/geoclue-nominatim.install.in
@@ -0,0 +1,3 @@
+debian/tmp@PREFIX@/share/dbus-1/services/org.freedesktop.Geoclue.Providers.Nominatim.service
+debian/tmp@PREFIX@/share/geoclue-providers/geoclue-nominatim.provider
+debian/tmp@PREFIX@/libexec/geoclue-nominatim
diff --git a/debian/geoclue.install.in b/debian/geoclue.install.in
new file mode 100644
index 0000000..af92625
--- /dev/null
+++ b/debian/geoclue.install.in
@@ -0,0 +1,2 @@
+debian/tmp@PREFIX@/libexec/geoclue-master
+debian/tmp@PREFIX@/share/dbus-1/services/org.freedesktop.Geoclue.Master.service
diff --git a/debian/libgeoclue-dev.install.in b/debian/libgeoclue-dev.install.in
new file mode 100644
index 0000000..d75c58e
--- /dev/null
+++ b/debian/libgeoclue-dev.install.in
@@ -0,0 +1,4 @@
+debian/tmp@PREFIX@/include/*
+debian/tmp@PREFIX@/lib/pkgconfig/*
+debian/tmp@PREFIX@/lib/libgeoclue.*a
+debian/tmp@PREFIX@/lib/libgeoclue.so
diff --git a/debian/libgeoclue.install.in b/debian/libgeoclue.install.in
new file mode 100644
index 0000000..36b1ec1
--- /dev/null
+++ b/debian/libgeoclue.install.in
@@ -0,0 +1 @@
+debian/tmp@PREFIX@/lib/libgeoclue.so.*
diff --git a/debian/patches/geoclue_0.12.0-20slp2.patch b/debian/patches/geoclue_0.12.0-20slp2.patch
new file mode 100755
index 0000000..3652c6a
--- /dev/null
+++ b/debian/patches/geoclue_0.12.0-20slp2.patch
@@ -0,0 +1,395 @@
+Index: geoclue/configure.ac
+===================================================================
+--- geoclue.orig/configure.ac 2012-01-02 19:25:40.228226482 +0900
++++ geoclue/configure.ac 2012-01-02 19:25:51.896226282 +0900
+@@ -151,7 +151,7 @@
+ enable_gpsd=auto)
+
+ if test "x$enable_gpsd" != "xno"; then
+- PKG_CHECK_MODULES(GPSD, [libgps >= 2.91], have_gpsd="yes", have_gpsd="no")
++ PKG_CHECK_MODULES(GPSD, [vconf libgps >= 2.91], have_gpsd="yes", have_gpsd="no")
+ if test "x$have_gpsd" = "xyes"; then
+ PROVIDER_SUBDIRS="$PROVIDER_SUBDIRS gpsd"
+ else
+Index: geoclue/providers/gpsd/Makefile.am
+===================================================================
+--- geoclue.orig/providers/gpsd/Makefile.am 2012-01-02 19:25:30.000226658 +0900
++++ geoclue/providers/gpsd/Makefile.am 2012-01-02 19:26:12.200225935 +0900
+@@ -4,7 +4,7 @@
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+ $(GEOCLUE_CFLAGS) \
+- $(GPSD_CFLAGS)
++ $(GPSD_CFLAGS)
+
+ geoclue_gpsd_LDFLAGS = \
+ -Wl,--warn-unresolved-symbols
+@@ -16,7 +16,9 @@
+ $(top_builddir)/geoclue/libgeoclue.la
+
+ geoclue_gpsd_SOURCES = \
+- geoclue-gpsd.c
++ geoclue-gpsd.c \
++ setting.c \
++ setting.h
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-gpsd.provider
+Index: geoclue/providers/gpsd/geoclue-gpsd.c
+===================================================================
+--- geoclue.orig/providers/gpsd/geoclue-gpsd.c 2012-01-02 19:25:29.980226658 +0900
++++ geoclue/providers/gpsd/geoclue-gpsd.c 2012-01-02 19:26:03.376226086 +0900
+@@ -31,15 +31,23 @@
+
+ #include <config.h>
+
++#include <glib.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
+ #include <math.h>
+ #include <gps.h>
+-#include <string.h>
+
+ #include <geoclue/geoclue-error.h>
+ #include <geoclue/gc-provider.h>
+ #include <geoclue/gc-iface-position.h>
+ #include <geoclue/gc-iface-velocity.h>
+
++#include "setting.h"
++
++#define LAST_POS_PRECESION 10000
++#define POSITION_LENGTH 16
++
+ typedef struct gps_data_t gps_data;
+ typedef struct gps_fix_t gps_fix;
+
+@@ -52,6 +60,12 @@
+ NMEA_RMC
+ } NmeaTag;
+
++typedef struct {
++ int timestamp;
++ double latitude;
++ double longitude;
++ double accuracy;
++} GeoclueGpsdsLastPosition;
+
+ typedef struct {
+ GcProvider parent;
+@@ -67,9 +81,9 @@
+ GeocluePositionFields last_pos_fields;
+ GeoclueAccuracy *last_accuracy;
+ GeoclueVelocityFields last_velo_fields;
++ GeoclueGpsdsLastPosition last_position;
+
+ GMainLoop *loop;
+-
+ } GeoclueGpsd;
+
+ typedef struct {
+@@ -96,8 +110,6 @@
+ * pointers in callbacks */
+ GeoclueGpsd *gpsd;
+
+-
+-
+ /* Geoclue interface */
+ static gboolean
+ get_status (GcIfaceGeoclue *gc,
+@@ -227,6 +239,135 @@
+ }
+
+ static void
++geoclue_gpsd_position_i2a(char *position, int lat, int lon)
++{
++ g_debug("geoclue_xps_position_i2a Lat : %d, Long : %d", lat, lon);
++ char latitude[POSITION_LENGTH/2 + 1] = { 0, };
++ char longitude[POSITION_LENGTH/2 + 1] = { 0, };
++
++ if (lat < 0) {
++ snprintf(latitude, POSITION_LENGTH/2 + 1, "S%07d", abs(lat));
++ } else {
++ snprintf(latitude, POSITION_LENGTH/2 + 1, "N%07d", lat);
++ }
++
++ if (lon < 0) {
++ snprintf(longitude, POSITION_LENGTH/2 + 1, "W%07d", abs(lon));
++ } else {
++ snprintf(longitude, POSITION_LENGTH/2 + 1, "E%07d", lon);
++ }
++
++ strncpy(position, latitude, POSITION_LENGTH/2);
++ strncat(position, longitude, POSITION_LENGTH/2);
++ g_debug("i_to_a position : %s", position);
++}
++
++static void
++geoclue_gpsd_position_a2i(char *position, int *lat, int *lon)
++{
++ g_debug("geoclue_xps_position_a2i position : %s", position);
++ char *d_lat, *d_lon;
++
++ char latitude[POSITION_LENGTH/2];
++ char longitude[POSITION_LENGTH/2];
++ memcpy(latitude, position + 1, POSITION_LENGTH/2 - 1);
++ memcpy(longitude, position + POSITION_LENGTH/2 + 1, POSITION_LENGTH/2 - 1);
++ latitude[POSITION_LENGTH/2 - 1] = '\0';
++ longitude[POSITION_LENGTH/2 - 1] = '\0';
++ d_lat = position;
++ d_lon = position + POSITION_LENGTH/2;
++
++ *lat = atoi(latitude);
++ *lon = atoi(longitude);
++
++ if (*d_lat == 'S') {
++ *lat = *lat * -1;
++ }
++ if (*d_lon == 'W') {
++ *lon = *lon * -1;
++ }
++ g_debug("a_to_i Lat : %d, Long : %d", *lat, *lon);
++}
++
++double
++deg2rad(double deg)
++{
++ return (deg * M_PI / 180);
++}
++
++static int
++geoclue_gpsd_distance_to_last_position(GeoclueGpsd * gpsd, const gps_fix * last_fix)
++{
++ double delta_lat, delta_long;
++ double dist;
++
++ delta_lat = last_fix->latitude - gpsd->last_position.latitude;
++ delta_long = last_fix->longitude - gpsd->last_position.longitude;
++
++ g_debug("GPS pos Latitude = %f Longitude = %f", last_fix->latitude, last_fix->longitude);
++
++ dist = sin(deg2rad(delta_lat) / 2) * sin(deg2rad(delta_lat) / 2)
++ + cos(deg2rad(last_fix->latitude)) * cos(deg2rad(gpsd->last_position.latitude))
++ * sin(deg2rad(delta_long) / 2) * sin(deg2rad(delta_long) / 2);
++ dist = 2 * atan2(sqrt(dist), sqrt(1 - dist));
++ dist = 6371 * dist; // unit: 'km'
++
++ if (dist > 0.3) {
++ return 0;
++ } else {
++ return -1;
++ }
++}
++
++static void
++geoclue_gpsd_get_last_position(GeoclueGpsd * gpsd)
++{
++ int lat, lon, acc;
++ char position[POSITION_LENGTH + 1] = { 0, };
++
++ snprintf(position, POSITION_LENGTH + 1, "%s", setting_get_string(LAST_POSITION));
++ geoclue_gpsd_position_a2i(position, &lat, &lon);
++ acc = setting_get_int(LAST_ACCURACY);
++
++ gpsd->last_position.timestamp = setting_get_int(LAST_TIMESTAMP);
++ gpsd->last_position.latitude = lat * (1.0 / LAST_POS_PRECESION);
++ gpsd->last_position.longitude = lon * (1.0 / LAST_POS_PRECESION);
++ gpsd->last_position.accuracy = acc * (1.0 / LAST_POS_PRECESION);
++ g_debug("get Last Latitude = %f Longitude = %f Accuracy = %f",
++ gpsd->last_position.latitude, gpsd->last_position.longitude,
++ gpsd->last_position.accuracy);
++}
++
++static void
++geoclue_gpsd_set_last_position(GeoclueGpsd * gpsd)
++{
++ int lat, lon, acc;
++ char position[POSITION_LENGTH + 1] = { 0, };
++
++ lat = gpsd->last_position.latitude * LAST_POS_PRECESION;
++ lon = gpsd->last_position.longitude * LAST_POS_PRECESION;
++ acc = gpsd->last_position.accuracy * LAST_POS_PRECESION;
++ g_debug("set GPSD Last Latitude = %d Longitude = %d Accuracy = %d", lat, lon, acc);
++ geoclue_gpsd_position_i2a(position, lat, lon);
++
++ setting_set_int(LAST_TIMESTAMP, gpsd->last_position.timestamp);
++ setting_set_string(LAST_POSITION, position);
++ setting_set_int(LAST_ACCURACY, acc);
++}
++
++static void
++geoclue_gpsd_update_last_position(GeoclueGpsd * gpsd, const const gps_fix * last_fix,
++ int accuracy)
++{
++ g_debug("geoclue_xps_update_last_position");
++ gpsd->last_position.timestamp = last_fix->time + 0.5;
++ gpsd->last_position.latitude = last_fix->latitude;
++ gpsd->last_position.longitude = last_fix->longitude;
++ gpsd->last_position.accuracy = accuracy;
++ geoclue_gpsd_set_last_position(gpsd);
++}
++
++static void
+ geoclue_gpsd_update_position (GeoclueGpsd *gpsd)
+ {
+ if(gpsd->last_status != GEOCLUE_STATUS_AVAILABLE)
+@@ -235,7 +376,6 @@
+ gps_fix *fix = &gpsd->gpsdata->fix;
+ gps_fix *last_fix = gpsd->last_fix;
+
+-
+ if (isnan(fix->time)==0){
+ last_fix->time = fix->time;
+ }
+@@ -275,6 +415,13 @@
+ gpsd->last_pos_fields |= (isnan (fix->altitude)) ?
+ 0 : GEOCLUE_POSITION_FIELDS_ALTITUDE;
+
++ if (geoclue_gpsd_distance_to_last_position(gpsd, last_fix) == 0) {
++ geoclue_gpsd_update_last_position(gpsd, last_fix,
++ (int)floor(sqrt(pow(last_fix->epx, 2) + pow(last_fix->epy, 2))));
++ } else {
++ g_debug("Last position is not updated");
++ }
++
+ g_debug("Update position: %lf, %lf, %lf, fields:0x%x, Accuracy level: %d, vert:%lf hori:%lf",
+ last_fix->latitude, last_fix->longitude, last_fix->altitude, gpsd->last_pos_fields,
+ GEOCLUE_ACCURACY_LEVEL_DETAILED, sqrt(pow(last_fix->epx, 2)+pow(last_fix->epy, 2)), fix->epv);
+@@ -421,6 +568,8 @@
+ if (!geoclue_gpsd_start_gpsd (self)) {
+ geoclue_gpsd_set_status (self, GEOCLUE_STATUS_ERROR);
+ }
++
++ geoclue_gpsd_get_last_position(self);
+ }
+
+ static gboolean
+Index: geoclue/providers/gpsd/setting.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/providers/gpsd/setting.c 2012-01-02 19:26:49.384225297 +0900
+@@ -0,0 +1,76 @@
++/*
++ * Geoclue Providers
++ *
++ * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd All Rights Reserved
++ *
++ * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
++ * Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
++ *
++ * PROPRIETARY/CONFIDENTIAL
++ *
++ * This software is the confidential and proprietary information of
++ * SAMSUNG ELECTRONICS ("Confidential Information").
++ *
++ * You agree and acknowledge that this software is owned by Samsung and you
++ * shall not disclose such Confidential Information and shall use it only
++ * in accordance with the terms of the license agreement you entered into with
++ * SAMSUNG ELECTRONICS.
++ *
++ * SAMSUNG make no representations or warranties about the suitability
++ * of the software, either express or implied, including but not limited to
++ * the implied warranties of merchantability, fitness for a particular purpose,
++ * or non-infringement.
++ *
++ * SAMSUNG shall not be liable for any damages suffered by licensee arising
++ * out of or related to this software.
++ */
++
++#include <glib.h>
++#include <vconf.h>
++#include "setting.h"
++
++int setting_get_int(const char* path)
++{
++ if(!path)
++ return -1;
++
++ int val = -1;
++ if (vconf_get_int(path, &val)) {
++ g_warning("vconf_get_int: failed [%s]", path);
++ val = -1;
++ } else {
++ g_debug("vconf_get_int: [%s]:[%d]", path, val);
++ }
++ return val;
++}
++
++int setting_set_int(const char* path, int val)
++{
++ if (!path) {
++ return -1;
++ }
++
++ int ret = vconf_set_int(path, val);
++ if (ret == 0) {
++ g_debug("vconf_set_int: [%s]:[%d]", path, val);
++ } else {
++ g_warning("vconf_set_int failed, [%s]\n", path);
++ }
++ return ret;
++}
++
++char* setting_get_string(const char* path)
++{
++ return vconf_get_str(path);
++}
++
++int setting_set_string(const char* path, const char* val)
++{
++ int ret = vconf_set_str(path, val);
++ if (ret == 0) {
++ g_debug("vconf_set_str: [%s]:[%s]", path, val);
++ } else {
++ g_warning("vconf_set_str failed, [%s]\n", path);
++ }
++ return ret;
++}
+Index: geoclue/providers/gpsd/setting.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/providers/gpsd/setting.h 2012-01-02 19:26:54.064225217 +0900
+@@ -0,0 +1,43 @@
++/*
++ * Geoclue Providers
++ *
++ * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd All Rights Reserved
++ *
++ * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
++ * Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
++ *
++ * PROPRIETARY/CONFIDENTIAL
++ *
++ * This software is the confidential and proprietary information of
++ * SAMSUNG ELECTRONICS ("Confidential Information").
++ *
++ * You agree and acknowledge that this software is owned by Samsung and you
++ * shall not disclose such Confidential Information and shall use it only
++ * in accordance with the terms of the license agreement you entered into with
++ * SAMSUNG ELECTRONICS.
++ *
++ * SAMSUNG make no representations or warranties about the suitability
++ * of the software, either express or implied, including but not limited to
++ * the implied warranties of merchantability, fitness for a particular purpose,
++ * or non-infringement.
++ *
++ * SAMSUNG shall not be liable for any damages suffered by licensee arising
++ * out of or related to this software.
++ */
++
++#ifndef __SETTING_H__
++#define __SETTING_H__
++
++// Sync VCONFKEY_GPS_STATE
++#define VCONF_LOCATION_PATH "db/location"
++
++#define LOCATION_POSITION_PATH VCONF_LOCATION_PATH"/position"
++#define LAST_TIMESTAMP LOCATION_POSITION_PATH"/Timestamp"
++#define LAST_POSITION LOCATION_POSITION_PATH"/LastPosition"
++#define LAST_ACCURACY LOCATION_POSITION_PATH"/LastAccuracy"
++
++int setting_get_int(const char* path);
++int setting_set_int(const char* path, int val);
++char* setting_get_string(const char* path);
++int setting_set_string(const char* path, const char* val);
++#endif
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100755
index 0000000..43feb46
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,2 @@
+tizen.patch
+geoclue_0.12.0-20slp2.patch
diff --git a/debian/patches/tizen.patch b/debian/patches/tizen.patch
new file mode 100755
index 0000000..a5fa5d8
--- /dev/null
+++ b/debian/patches/tizen.patch
@@ -0,0 +1,12717 @@
+Index: geoclue/example/Makefile.am
+===================================================================
+--- geoclue.orig/example/Makefile.am 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/example/Makefile.am 2011-12-29 16:40:38.930428900 +0900
+@@ -8,14 +8,14 @@
+ revgeocode-example \
+ common-example
+
+-common_example_SOURCES = common-example.c
+ position_example_SOURCES = position-example.c
+ position_async_example_SOURCES = position-async-example.c
++master_example_SOURCES = master-example.c
++master_pos_example_SOURCES = master-pos-example.c
+ address_example_SOURCES = address-example.c
+ geocode_example_SOURCES = geocode-example.c
+ revgeocode_example_SOURCES = revgeocode-example.c
+-master_example_SOURCES = master-example.c
+-master_pos_example_SOURCES = master-pos-example.c
++common_example_SOURCES = common-example.c
+
+ AM_CFLAGS = $(GEOCLUE_CFLAGS)
+ LDADD = \
+Index: geoclue/example/master-pos-example.c
+===================================================================
+--- geoclue.orig/example/master-pos-example.c 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/example/master-pos-example.c 2011-12-29 16:40:38.930428900 +0900
+@@ -25,7 +25,7 @@
+ */
+
+
+-/* This example shows typical GPS-like usage. Following params are
++/* This example shows typical GPS-like usage. Following params are
+ * given to geoclue_master_client_set_requirements():
+ * min_accuracy = GEOCLUE_ACCURACY_LEVEL_DETAILED
+ * We require the highest level of accuracy
+@@ -36,13 +36,13 @@
+ * We need position-changed signals
+ * allowed_resources = GEOCLUE_RESOURCE_ALL
+ * Any available resource can be used
+- *
++ *
+ * Geoclue master will try to select a suitable provider based on these
+- * requirements -- currently only Gypsy and Gpsd providers fulfill
+- * the above requiremens. Gpsd-provider should work out-of-the-box as
+- * long as gpsd is running in the default port. Gypsy provider requires
++ * requirements -- currently only Gypsy and Gpsd providers fulfill
++ * the above requiremens. Gpsd-provider should work out-of-the-box as
++ * long as gpsd is running in the default port. Gypsy provider requires
+ * that you set device name in the options: see README for details.
+- *
++ *
+ */
+
+ #include <string.h>
+@@ -54,7 +54,7 @@
+ provider_changed_cb (GeoclueMasterClient *client,
+ char *iface,
+ char *name,
+- char *description,
++ char *description,
+ gpointer userdata)
+ {
+ if (strlen (name) == 0) {
+@@ -65,35 +65,6 @@
+ }
+
+ static void
+-position_callback (GeocluePosition *pos,
+- GeocluePositionFields fields,
+- int timestamp,
+- double latitude,
+- double longitude,
+- double altitude,
+- GeoclueAccuracy *accuracy,
+- GError *error,
+- gpointer userdata)
+-{
+- if (error) {
+- g_printerr ("Error getting initial position: %s\n", error->message);
+- g_error_free (error);
+- } else {
+- if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+- fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+- GeoclueAccuracyLevel level;
+-
+- geoclue_accuracy_get_details (accuracy, &level, NULL, NULL);
+- g_print ("Initial position (accuracy %d):\n", level);
+- g_print ("\t%f, %f\n", latitude, longitude);
+- } else {
+- g_print ("Initial position not available.\n");
+- }
+- }
+-}
+-
+-
+-static void
+ position_changed_cb (GeocluePosition *position,
+ GeocluePositionFields fields,
+ int timestamp,
+@@ -106,11 +77,11 @@
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+ fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+ GeoclueAccuracyLevel level;
+-
++
+ geoclue_accuracy_get_details (accuracy, &level, NULL, NULL);
+ g_print ("got position (accuracy level %d):\n", level);
+ g_print ("\t%f, %f\n", latitude, longitude);
+-
++
+ } else {
+ g_print ("position emitted, but latitude and longitude are not valid.\n");
+ }
+@@ -125,20 +96,20 @@
+ GeoclueMaster *master;
+ GeoclueMasterClient *client;
+ GeocluePosition *position;
+-
++
+ g_type_init ();
+-
++
+ master = geoclue_master_get_default ();
+ client = geoclue_master_create_client (master, NULL, NULL);
+ g_object_unref (master);
+-
++
+ g_signal_connect (G_OBJECT (client), "position-provider-changed",
+ G_CALLBACK (provider_changed_cb), NULL);
+-
++
+ /* We want provider that has detailed accuracy and emits signals.
+ * The provider is allowed to use any resources available. */
+- if (!geoclue_master_client_set_requirements (client,
+- GEOCLUE_ACCURACY_LEVEL_LOCALITY,
++ if (!geoclue_master_client_set_requirements (client,
++ GEOCLUE_ACCURACY_LEVEL_DETAILED,
+ 0, TRUE,
+ GEOCLUE_RESOURCE_ALL,
+ NULL)){
+@@ -146,7 +117,7 @@
+ g_object_unref (client);
+ return 1;
+ }
+-
++
+ position = geoclue_master_client_create_position (client, &error);
+ if (!position) {
+ g_warning ("Creating GeocluePosition failed: %s", error->message);
+@@ -154,20 +125,16 @@
+ g_object_unref (client);
+ return 1;
+ }
+-
++
+ g_signal_connect (G_OBJECT (position), "position-changed",
+ G_CALLBACK (position_changed_cb), NULL);
+
+- geoclue_position_get_position_async (position,
+- (GeocluePositionCallback) position_callback,
+- NULL);
+-
+ mainloop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (mainloop);
+-
++
+ g_main_loop_unref (mainloop);
+ g_object_unref (client);
+ g_object_unref (position);
+-
++
+ return 0;
+ }
+Index: geoclue/example/position-example.c
+===================================================================
+--- geoclue.orig/example/position-example.c 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/example/position-example.c 2011-12-29 16:40:38.930428900 +0900
+@@ -37,27 +37,20 @@
+ {
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+ fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+-
++
+ GeoclueAccuracyLevel level;
+ double horiz_acc;
+-
++
+ geoclue_accuracy_get_details (accuracy, &level, &horiz_acc, NULL);
+ g_print ("Current position:\n");
+ g_print ("\t%f, %f\n", latitude, longitude);
+ g_print ("\tAccuracy level %d (%.0f meters)\n", level, horiz_acc);
+-
++
+ } else {
+ g_print ("Latitude and longitude not available.\n");
+ }
+ }
+
+-static void
+-unset_and_free_gvalue (gpointer val)
+-{
+- g_value_unset (val);
+- g_free (val);
+-}
+-
+ static GHashTable *
+ parse_options (int argc,
+ char **argv)
+@@ -65,14 +58,9 @@
+ GHashTable *options;
+ int i;
+
+- options = g_hash_table_new_full (g_str_hash, g_str_equal,
+- NULL, unset_and_free_gvalue);
+-
++ options = g_hash_table_new (g_str_hash, g_str_equal);
+ for (i = 2; i < argc; i += 2) {
+- GValue *val = g_new0(GValue, 1);
+- g_value_init (val, G_TYPE_STRING);
+- g_value_set_string(val, argv[i + 1]);
+- g_hash_table_insert (options, argv[i], val);
++ g_hash_table_insert (options, argv[i], argv[i + 1]);
+ }
+
+ return options;
+@@ -88,20 +76,20 @@
+ GeoclueAccuracy *accuracy = NULL;
+ GMainLoop *mainloop;
+ GError *error = NULL;
+-
++
+ g_type_init();
+-
++
+ if (argc < 2 || argc % 2 != 0) {
+- g_printerr ("Usage:\n position-example <provider_name> [option value]\n");
++ g_printerr ("Usage:\n position-example <provider_name> [option,value]\n");
+ return 1;
+ }
+
+ g_print ("Using provider '%s'\n", argv[1]);
+ service = g_strdup_printf ("org.freedesktop.Geoclue.Providers.%s", argv[1]);
+ path = g_strdup_printf ("/org/freedesktop/Geoclue/Providers/%s", argv[1]);
+-
++
+ mainloop = g_main_loop_new (NULL, FALSE);
+-
++
+ /* Create new GeocluePosition */
+ pos = geoclue_position_new (service, path);
+ if (pos == NULL) {
+@@ -111,25 +99,25 @@
+
+ g_free (service);
+ g_free (path);
+-
++
+ if (argc > 2) {
+ GHashTable *options;
+
+ options = parse_options (argc, argv);
+ if (!geoclue_provider_set_options (GEOCLUE_PROVIDER (pos), options, &error)) {
+- g_printerr ("Error setting options: %s\n",
++ g_printerr ("Error setting options: %s\n",
+ error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+ g_hash_table_destroy (options);
+ }
+-
+- /* Query current position. We're not interested in altitude
++
++ /* Query current position. We're not interested in altitude
+ this time, so leave it NULL. Same can be done with all other
+ arguments that aren't interesting to the client */
+- fields = geoclue_position_get_position (pos, &timestamp,
+- &lat, &lon, NULL,
++ fields = geoclue_position_get_position (pos, &timestamp,
++ &lat, &lon, NULL,
+ &accuracy, &error);
+ if (error) {
+ g_printerr ("Error getting position: %s\n", error->message);
+@@ -137,19 +125,19 @@
+ g_object_unref (pos);
+ return 1;
+ }
+-
++
+ /* Print out coordinates if they are valid */
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+ fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+-
++
+ GeoclueAccuracyLevel level;
+ double horiz_acc;
+-
++
+ geoclue_accuracy_get_details (accuracy, &level, &horiz_acc, NULL);
+ g_print ("Current position:\n");
+ g_print ("\t%f, %f\n", lat, lon);
+ g_print ("\tAccuracy level %d (%.0f meters)\n", level, horiz_acc);
+-
++
+ } else {
+ g_print ("Latitude and longitude not available.\n");
+ }
+@@ -161,5 +149,5 @@
+
+ g_main_loop_run (mainloop);
+ return 0;
+-
++
+ }
+Index: geoclue/packaging/geoclue.spec
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/packaging/geoclue.spec 2011-12-29 16:40:38.930428900 +0900
+@@ -0,0 +1,116 @@
++Name: geoclue
++Summary: Geoinformation service
++Version: 0.12.0
++Release: 1
++Group: TO_BE/FILLED_IN
++License: TO BE FILLED IN
++Source0: geoclue-%{version}.tar.gz
++BuildRequires: which
++BuildRequires: pkgconfig(glib-2.0)
++BuildRequires: pkgconfig(dbus-glib-1)
++BuildRequires: pkgconfig(libxml-2.0)
++BuildRequires: pkgconfig(gconf-2.0)
++BuildRequires: pkgconfig(libgps)
++BuildRequires: pkgconfig(libxslt)
++
++
++%description
++Geographic information framework GeoClue provides applications access to various geographical information
++ sources using a D-Bus API or a C library.
++ .
++ This package contains the master server for GeoClue.
++
++
++
++%package -n libgeoclue
++Summary: C API for GeoClue
++Group: TO_BE/FILLED
++Requires: %{name} = %{version}-%{release}
++Requires(post): /sbin/ldconfig
++Requires(postun): /sbin/ldconfig
++
++%description -n libgeoclue
++libgeoclue is a convenience wrapper for the GeoClue service, and
++the recommended way to use GeoClue in the C language.
++
++
++%package -n libgeoclue-devel
++Summary: C API for GeoClue (development files)
++Group: TO_BE/FILLED
++Requires: libgeoclue = %{version}-%{release}
++
++%description -n libgeoclue-devel
++libgeoclue is a convenience wrapper for the GeoClue service, and
++the recommended way to use GeoClue in the C language.
++
++
++%package -n geoclue-gpsd
++Summary: Position server for GeoClue (GPS)
++Group: TO_BE/FILLED
++Requires: %{name} = %{version}-%{release}
++
++%description -n geoclue-gpsd
++GeoClue provides applications access to various geographical information
++sources using a D-Bus API or a C library.
++.
++This package provides a positioning backend for GeoClue. The
++location information comes from a GPS receiver through gpsd
++
++%package -n geoclue-nominatim
++Summary: Geocode server for GeoClue (OpenStreetMap)
++Group: TO_BE/FILLED
++Requires: %{name} = %{version}-%{release}
++
++%description -n geoclue-nominatim
++GeoClue provides applications access to various geographical information
++sources using a D-Bus API or a C library.
++.
++This package provides a tool to search osm data by name and address and to generate synthetic addresses of osm points (reverse geocoding)
++
++
++%prep
++%setup -q -n %{name}-%{version}
++
++
++%build
++export CFLAGS+=" -Wall -g -fPIC"
++export LDFLAGS+=" -Wl,-z,defs -Wl,--rpath=/usr/lib -Wl,--as-needed -Wl,--hash-style=both"
++
++./autogen.sh
++./configure --disable-static --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-system-bus=yes --disable-gypsy --disable-lbs --disable-xps
++
++#make %{?jobs:-j%jobs}
++make
++
++%install
++rm -rf %{buildroot}
++%make_install
++rm -rf %{buildroot}/usr/bin/geoclue-test-gui
++
++
++%post -n libgeoclue -p /sbin/ldconfig
++
++%postun -n libgeoclue -p /sbin/ldconfig
++
++%files
++/usr/libexec/geoclue-master
++/usr/share/dbus-1/services/org.freedesktop.Geoclue.Master.service
++
++%files -n libgeoclue
++/usr/lib/libgeoclue.so.*
++
++%files -n libgeoclue-devel
++/usr/include/*
++/usr/lib/pkgconfig/*
++#/usr/lib/libgeoclue.*a
++/usr/lib/libgeoclue.so
++
++%files -n geoclue-gpsd
++/usr/libexec/geoclue-gpsd
++/usr/share/dbus-1/services/org.freedesktop.Geoclue.Providers.Gpsd.service
++/usr/share/geoclue-providers/geoclue-gpsd.provider
++
++%files -n geoclue-nominatim
++/usr/share/dbus-1/services/org.freedesktop.Geoclue.Providers.Nominatim.service
++/usr/share/geoclue-providers/geoclue-nominatim.provider
++/usr/libexec/geoclue-nominatim
+Index: geoclue/geoclue/Makefile.am
+===================================================================
+--- geoclue.orig/geoclue/Makefile.am 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/geoclue/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -13,10 +13,14 @@
+ gc-iface-master-client-bindings.h \
+ gc-iface-position-bindings.h \
+ gc-iface-position-glue.h \
++ gc-iface-nmea-bindings.h \
++ gc-iface-nmea-glue.h \
+ gc-iface-reverse-geocode-bindings.h \
+ gc-iface-reverse-geocode-glue.h \
+ gc-iface-velocity-bindings.h \
+- gc-iface-velocity-glue.h
++ gc-iface-velocity-glue.h \
++ gc-iface-satellite-bindings.h \
++ gc-iface-satellite-glue.h
+
+ BUILT_SOURCES = \
+ $(nodist_libgeoclue_la_SOURCES) \
+@@ -33,17 +37,21 @@
+ geoclue-master.c \
+ geoclue-master-client.c \
+ geoclue-position.c \
++ geoclue-nmea.c \
+ geoclue-reverse-geocode.c \
+ geoclue-types.c \
+ geoclue-velocity.c \
++ geoclue-satellite.c \
+ gc-provider.c \
+ gc-web-service.c \
+ gc-iface-address.c \
+ gc-iface-geoclue.c \
+ gc-iface-geocode.c \
+ gc-iface-position.c \
++ gc-iface-nmea.c \
+ gc-iface-reverse-geocode.c \
+ gc-iface-velocity.c \
++ gc-iface-satellite.c \
+ geoclue-enum-types.c
+
+ libgeoclue_la_LIBADD = \
+@@ -53,14 +61,16 @@
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+ $(GEOCLUE_CFLAGS)
+-
++
+ geoclue_headers = \
+ gc-iface-address.h \
+ gc-iface-geoclue.h \
+ gc-iface-geocode.h \
+ gc-iface-position.h \
++ gc-iface-nmea.h \
+ gc-iface-reverse-geocode.h \
+ gc-iface-velocity.h \
++ gc-iface-satellite.h \
+ gc-provider.h \
+ gc-web-service.h \
+ geoclue-accuracy.h \
+@@ -72,9 +82,12 @@
+ geoclue-master.h \
+ geoclue-master-client.h \
+ geoclue-position.h \
++ geoclue-nmea.h \
+ geoclue-reverse-geocode.h \
+ geoclue-types.h \
+ geoclue-velocity.h \
++ geoclue-satellite.h \
++ geoclue-satellite-info.h \
+ geoclue-enum-types.h
+
+ libgeoclue_includedir = $(includedir)/geoclue
+@@ -89,8 +102,10 @@
+ stamp-gc-iface-geoclue-glue.h \
+ stamp-gc-iface-geocode-glue.h \
+ stamp-gc-iface-position-glue.h \
++ stamp-gc-iface-nmea-glue.h \
+ stamp-gc-iface-reverse-geocode-glue.h \
+- stamp-gc-iface-velocity-glue.h
++ stamp-gc-iface-velocity-glue.h \
++ stamp-gc-iface-satellite-glue.h
+
+ DISTCLEANFILES = \
+ $(nodist_libgeoclue_la_SOURCES) \
+@@ -98,45 +113,58 @@
+ geoclue-enum-types.c
+
+ geoclue-marshal.h: geoclue-marshal.list $(GLIB_GENMARSHAL)
+- $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=geoclue_marshal > $@
++ $(GLIB_GENMARSHAL) $< --header --prefix=geoclue_marshal > $@
+ geoclue-marshal.c: geoclue-marshal.list geoclue-marshal.h $(GLIB_GENMARSHAL)
+- $(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=geoclue_marshal $(srcdir)/geoclue-marshal.list --header --body > $@
++ echo "#include \"geoclue-marshal.h\"" > $@ \
++ && $(GLIB_GENMARSHAL) --prefix=geoclue_marshal $(srcdir)/geoclue-marshal.list --body >> $@
+
+ %-glue.h: stamp-%-glue.h
+ @true
+
+ stamp-gc-iface-address-glue.h: ../interfaces/gc-iface-address.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_address --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_address --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+
+ stamp-gc-iface-geoclue-glue.h: ../interfaces/gc-iface-geoclue.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_geoclue --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_geoclue --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+
+ stamp-gc-iface-geocode-glue.h: ../interfaces/gc-iface-geocode.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_geocode --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_geocode --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+
+ stamp-gc-iface-position-glue.h: ../interfaces/gc-iface-position.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_position --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_position --mode=glib-server $< > xgen-$(@F) \
++ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
++ && rm -f xgen-$(@F) \
++ && echo timestamp > $(@F)
++
++stamp-gc-iface-nmea-glue.h: ../interfaces/gc-iface-nmea.xml
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_nmea --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+
+ stamp-gc-iface-reverse-geocode-glue.h: ../interfaces/gc-iface-reverse-geocode.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_reverse_geocode --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_reverse_geocode --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+
+ stamp-gc-iface-velocity-glue.h: ../interfaces/gc-iface-velocity.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_velocity --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_velocity --mode=glib-server $< > xgen-$(@F) \
++ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
++ && rm -f xgen-$(@F) \
++ && echo timestamp > $(@F)
++
++stamp-gc-iface-satellite-glue.h: ../interfaces/gc-iface-satellite.xml
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_satellite --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+@@ -144,7 +172,7 @@
+ %-bindings.h: stamp-%-bindings.h
+ @true
+ stamp-%-bindings.h: ../interfaces/%.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --mode=glib-client --prefix=geoclue $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --mode=glib-client --prefix=geoclue $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+Index: geoclue/geoclue/gc-iface-nmea.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/gc-iface-nmea.c 2011-12-29 16:40:38.922428900 +0900
+@@ -0,0 +1,103 @@
++/*
++ * Geoclue
++ * gc-iface-nmea.c - GInterface for org.freedesktop.Geoclue.Nmea
++ *
++ * Author: Tae-Hwan Kim <the81.kim@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++#include <glib.h>
++
++#include <dbus/dbus-glib.h>
++#include <geoclue/gc-iface-nmea.h>
++#include <geoclue/geoclue-marshal.h>
++
++enum {
++ NMEA_CHANGED,
++ LAST_SIGNAL
++};
++
++static guint signals[LAST_SIGNAL] = {0};
++
++static gboolean
++gc_iface_nmea_get_nmea (GcIfaceNmea *nmea,
++ int *timestamp,
++ char **nmea_data,
++ GError **error);
++
++#include "gc-iface-nmea-glue.h"
++
++static void
++gc_iface_nmea_base_init (gpointer klass)
++{
++ static gboolean initialized = FALSE;
++
++ if (initialized) {
++ return;
++ }
++ initialized = TRUE;
++
++ signals[NMEA_CHANGED] = g_signal_new ("nmea-changed",
++ G_OBJECT_CLASS_TYPE (klass),
++ G_SIGNAL_RUN_LAST, 0,
++ NULL, NULL,
++ geoclue_marshal_VOID__INT_STRING,
++ G_TYPE_NONE, 2,
++ G_TYPE_INT,
++ G_TYPE_STRING);
++
++ dbus_g_object_type_install_info (gc_iface_nmea_get_type (),
++ &dbus_glib_gc_iface_nmea_object_info);
++}
++
++GType
++gc_iface_nmea_get_type (void)
++{
++ static GType type = 0;
++
++ if (!type) {
++ const GTypeInfo info = {
++ sizeof (GcIfaceNmeaClass),
++ gc_iface_nmea_base_init,
++ NULL,
++ };
++
++ type = g_type_register_static (G_TYPE_INTERFACE,
++ "GcIfaceNmea", &info, 0);
++ }
++
++ return type;
++}
++
++static gboolean
++gc_iface_nmea_get_nmea (GcIfaceNmea *gc,
++ int *timestamp,
++ char **nmea_data,
++ GError **error)
++{
++ return GC_IFACE_NMEA_GET_CLASS (gc)->get_nmea (gc, timestamp, nmea_data, error);
++}
++
++void
++gc_iface_nmea_emit_nmea_changed (GcIfaceNmea *gc,
++ int timestamp,
++ char *nmea_data)
++{
++ g_signal_emit (gc, signals[NMEA_CHANGED], 0, timestamp, nmea_data);
++}
+Index: geoclue/geoclue/gc-iface-nmea.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/gc-iface-nmea.h 2011-12-29 16:40:38.922428900 +0900
+@@ -0,0 +1,65 @@
++/*
++ * Geoclue
++ * gc-iface-nmea.h - GInterface for org.freedesktop.Geoclue.Nmea
++ *
++ * Author: Tae-Hwan Kim <the81.kim@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifndef _GC_IFACE_NMEA_H
++#define _GC_IFACE_NMEA_H
++
++#include <geoclue/geoclue-types.h>
++
++G_BEGIN_DECLS
++
++#define GC_TYPE_IFACE_NMEA (gc_iface_nmea_get_type ())
++#define GC_IFACE_NMEA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GC_TYPE_IFACE_NMEA, GcIfaceNmea))
++#define GC_IFACE_NMEA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GC_TYPE_IFACE_NMEA, GcIfaceNmeaClass))
++#define GC_IS_IFACE_NMEA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GC_TYPE_IFACE_NMEA))
++#define GC_IS_IFACE_NMEA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GC_TYPE_IFACE_NMEA))
++#define GC_IFACE_NMEA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GC_TYPE_IFACE_NMEA, GcIfaceNmeaClass))
++
++typedef struct _GcIfaceNmea GcIfaceNmea; /* Dummy typedef */
++
++typedef struct _GcIfaceNmeaClass {
++ GTypeInterface base_iface;
++
++ /* signals */
++ void (* nmea_changed) (GcIfaceNmea *gc,
++ int timestamp,
++ char *nmea_data);
++
++ /* vtable */
++ gboolean (* get_nmea) (GcIfaceNmea *gc,
++ int *timestamp,
++ char **nmea_data,
++ GError **error);
++} GcIfaceNmeaClass;
++
++GType gc_iface_nmea_get_type (void);
++
++void gc_iface_nmea_emit_nmea_changed (GcIfaceNmea *gc,
++ int timestamp,
++ char *nmea_data);
++
++G_END_DECLS
++
++#endif
+Index: geoclue/geoclue/gc-iface-satellite.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/gc-iface-satellite.c 2011-12-29 16:40:38.922428900 +0900
+@@ -0,0 +1,123 @@
++/*
++ * Geoclue
++ * gc-iface-satellite.c - GInterface for org.freedesktop.Geoclue.Satellite
++ *
++ * Author: Sagnho Park <sangho.g.park@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#include <glib.h>
++
++#include <dbus/dbus-glib.h>
++#include <geoclue/gc-iface-satellite.h>
++#include <geoclue/geoclue-marshal.h>
++
++enum {
++ SATELLITE_CHANGED,
++ LAST_SIGNAL
++};
++
++static guint signals[LAST_SIGNAL] = {0};
++
++static gboolean
++gc_iface_satellite_get_satellite (GcIfaceSatellite *satellite,
++ int *timestamp,
++ int *satellite_used,
++ int *satellite_visible,
++ GArray **used_prn,
++ GPtrArray **sat_info,
++ GError **error);
++
++#include "gc-iface-satellite-glue.h"
++
++static void
++gc_iface_satellite_base_init (gpointer klass)
++{
++ static gboolean initialized = FALSE;
++
++ if (initialized) {
++ return;
++ }
++ initialized = TRUE;
++
++ signals[SATELLITE_CHANGED] = g_signal_new ("satellite-changed",
++ G_OBJECT_CLASS_TYPE (klass),
++ G_SIGNAL_RUN_LAST, 0,
++ NULL, NULL,
++ geoclue_marshal_VOID__INT_INT_INT_POINTER_POINTER,
++ G_TYPE_NONE, 5,
++ G_TYPE_INT,
++ G_TYPE_INT,
++ G_TYPE_INT,
++ DBUS_TYPE_G_INT_ARRAY,
++ GEOCLUE_SATELLITE_INFO_ARRAY);
++ dbus_g_object_type_install_info (gc_iface_satellite_get_type (),
++ &dbus_glib_gc_iface_satellite_object_info);
++}
++
++GType
++gc_iface_satellite_get_type (void)
++{
++ static GType type = 0;
++
++ if (!type) {
++ const GTypeInfo info = {
++ sizeof (GcIfaceSatelliteClass),
++ gc_iface_satellite_base_init,
++ NULL,
++ };
++
++ type = g_type_register_static (G_TYPE_INTERFACE,
++ "GcIfaceSatellite", &info, 0);
++ }
++
++ return type;
++}
++
++static gboolean
++gc_iface_satellite_get_satellite (GcIfaceSatellite *gc,
++ int *timestamp,
++ int *satellite_used,
++ int *satellite_visible,
++ GArray **used_prn,
++ GPtrArray **sat_info,
++ GError **error)
++{
++ return GC_IFACE_SATELLITE_GET_CLASS (gc)->get_satellite (gc,
++ timestamp,
++ satellite_used,
++ satellite_visible,
++ used_prn,
++ sat_info,
++ error);
++}
++
++void
++gc_iface_satellite_emit_satellite_changed (GcIfaceSatellite *gc,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info)
++{
++ g_signal_emit (gc, signals[SATELLITE_CHANGED], 0,
++ timestamp, satellite_used, satellite_visible,
++ used_prn, sat_info);
++}
+Index: geoclue/geoclue/gc-iface-satellite.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/gc-iface-satellite.h 2011-12-29 16:40:38.926428900 +0900
+@@ -0,0 +1,76 @@
++/*
++ * Geoclue
++ * gc-iface-satellite.c - GInterface for org.freedesktop.Geoclue.Satellite
++ *
++ * Author: Sagnho Park <sangho.g.park@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifndef _GC_IFACE_SATELLITE_H
++#define _GC_IFACE_SATELLITE_H
++
++#include <geoclue/geoclue-types.h>
++#include <geoclue/geoclue-satellite-info.h>
++
++G_BEGIN_DECLS
++
++#define GC_TYPE_IFACE_SATELLITE (gc_iface_satellite_get_type ())
++#define GC_IFACE_SATELLITE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GC_TYPE_IFACE_SATELLITE, GcIfaceSatellite))
++#define GC_IFACE_SATELLITE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GC_TYPE_IFACE_SATELLITE, GcIfaceSatelliteClass))
++#define GC_IS_IFACE_SATELLITE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GC_TYPE_IFACE_SATELLITE))
++#define GC_IS_IFACE_SATELLITE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GC_TYPE_IFACE_SATELLITE))
++#define GC_IFACE_SATELLITE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GC_TYPE_IFACE_SATELLITE, GcIfaceSatelliteClass))
++
++typedef struct _GcIfaceSatellite GcIfaceSatellite; /* Dummy typedef */
++typedef struct _GcIfaceSatelliteClass GcIfaceSatelliteClass;
++
++struct _GcIfaceSatelliteClass {
++ GTypeInterface base_iface;
++
++ /* signals */
++ void (* satellite_changed) (GcIfaceSatellite *gc,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info);
++
++ /* vtable */
++ gboolean (* get_satellite) (GcIfaceSatellite *gc,
++ int *timestamp,
++ int *satellite_used,
++ int *satellite_visible,
++ GArray **used_prn,
++ GPtrArray **sat_info,
++ GError **error);
++};
++
++GType gc_iface_satellite_get_type (void);
++
++void gc_iface_satellite_emit_satellite_changed (GcIfaceSatellite *gc,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info);
++
++G_END_DECLS
++
++#endif
+Index: geoclue/geoclue/gc-provider.c
+===================================================================
+--- geoclue.orig/geoclue/gc-provider.c 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/geoclue/gc-provider.c 2011-12-29 16:40:38.922428900 +0900
+@@ -26,15 +26,15 @@
+ /**
+ * SECTION:gc-provider
+ * @short_description: Abstract class to derive Geoclue providers from.
+- *
+- * #GcProvider is an abstract class that all Geoclue providers should
++ *
++ * #GcProvider is an abstract class that all Geoclue providers should
+ * derive from. It takes care of setting up the provider D-Bus service,
+- * and also implements #GcIfaceGeoclue interface (derived classes still
++ * and also implements #GcIfaceGeoclue interface (derived classes still
+ * need to implement the functionality).
+- *
+- * Derived classes should define the #GcIfaceGeoclue methods in their
++ *
++ * Derived classes should define the #GcIfaceGeoclue methods in their
+ * class_init() and call gc_provider_set_details() in init()
+- *
++ *
+ */
+ #include <config.h>
+
+@@ -52,7 +52,7 @@
+ typedef struct {
+ char *name;
+ char *description;
+-
++
+ GHashTable *connections;
+ } GcProviderPrivate;
+
+@@ -79,9 +79,9 @@
+ dispose (GObject *object)
+ {
+ GcProviderPrivate *priv = GET_PRIVATE (object);
+-
++
+ g_hash_table_destroy (priv->connections);
+-
++
+ ((GObjectClass *) gc_provider_parent_class)->dispose (object);
+ }
+
+@@ -92,9 +92,9 @@
+
+ o_class->finalize = finalize;
+ o_class->dispose = dispose;
+-
++
+ klass->shutdown = NULL;
+-
++
+ g_type_class_add_private (klass, sizeof (GcProviderPrivate));
+ }
+
+@@ -103,14 +103,14 @@
+ {
+ GError *error = NULL;
+ GcProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ provider->connection = dbus_g_bus_get (GEOCLUE_DBUS_BUS, &error);
+ if (provider->connection == NULL) {
+ g_warning ("%s was unable to create a connection to D-Bus: %s",
+ G_OBJECT_TYPE_NAME (provider), error->message);
+ g_error_free (error);
+ }
+-
++
+ priv->connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ }
+
+@@ -122,7 +122,7 @@
+ }
+
+
+-static gboolean
++static gboolean
+ get_provider_info (GcIfaceGeoclue *geoclue,
+ gchar **name,
+ gchar **description,
+@@ -130,14 +130,14 @@
+ {
+ GcProvider *provider = GC_PROVIDER (geoclue);
+ GcProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ if (name) {
+ *name = g_strdup (priv->name);
+ }
+ if (description) {
+ *description = g_strdup (priv->description);
+ }
+-
++
+ return TRUE;
+ }
+
+@@ -169,33 +169,59 @@
+ klass = GC_PROVIDER_GET_CLASS (geoclue);
+ if (klass->set_options) {
+ return klass->set_options (geoclue, options, error);
+- }
++ }
+
+ /* It is not an error to not have a SetOptions implementation */
+ return TRUE;
+ }
+
+-static gboolean
++static gboolean
+ gc_provider_remove_client (GcProvider *provider, const char *client)
+ {
+ int *pcount;
+ GcProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ pcount = g_hash_table_lookup (priv->connections, client);
+ if (!pcount) {
++ g_debug("Client[%s] is already removed", client);
+ return FALSE;
+ }
+-
+ (*pcount)--;
++ g_debug("Client[%s] has reference count[%d]", client, *pcount);
+ if (*pcount == 0) {
++ g_debug("Reference count is zero, Now remove client[%s] in hash table", client);
+ g_hash_table_remove (priv->connections, client);
+ }
+ if (g_hash_table_size (priv->connections) == 0) {
++ g_debug("Hash table size is zero, Now we shutdown provider[%s]", priv->name);
+ gc_provider_shutdown (provider);
+ }
+ return TRUE;
+ }
+
++static gboolean
++gc_provider_remove_client_by_force(GcProvider *provider, const char *client)
++{
++ int *pcount;
++ GcProviderPrivate *priv = GET_PRIVATE (provider);
++
++ pcount = g_hash_table_lookup (priv->connections, client);
++ if(!pcount){
++ g_debug("Client(%s) is already removed", client);
++ return FALSE;
++ }
++
++ (*pcount)--;
++ g_debug("Client(%s) has reference count[%d]. Anway, we will remove it by force!", client, *pcount);
++ g_hash_table_remove (priv->connections, client);
++ if (g_hash_table_size (priv->connections) == 0) {
++ g_debug("Hash table size is zero, Now we shutdown provider[%s]", priv->name);
++ gc_provider_shutdown (provider);
++ }
++ return TRUE;
++}
++
++
+ static void
+ add_reference (GcIfaceGeoclue *geoclue,
+ DBusGMethodInvocation *context)
+@@ -203,7 +229,7 @@
+ GcProviderPrivate *priv = GET_PRIVATE (geoclue);
+ char *sender;
+ int *pcount;
+-
++
+ /* Update the hash of open connections */
+ sender = dbus_g_method_get_sender (context);
+ pcount = g_hash_table_lookup (priv->connections, sender);
+@@ -212,24 +238,24 @@
+ g_hash_table_insert (priv->connections, sender, pcount);
+ }
+ (*pcount)++;
+-
++
+ dbus_g_method_return (context);
+ }
+
+-static void
++static void
+ remove_reference (GcIfaceGeoclue *geoclue,
+ DBusGMethodInvocation *context)
+ {
+ GcProvider *provider = GC_PROVIDER (geoclue);
+ char *sender;
+-
++
+ sender = dbus_g_method_get_sender (context);
+ if (!gc_provider_remove_client (provider, sender)) {
+ g_warning ("Unreffed by client that has not been referenced");
+ }
+
+ g_free (sender);
+-
++
+ dbus_g_method_return (context);
+ }
+
+@@ -240,8 +266,9 @@
+ const char *new_owner,
+ GcProvider *provider)
+ {
++ g_debug("name_owner_changed, name:%s, prev_owner:%s, new_owner:%s", name, prev_owner, new_owner);
+ if (strcmp (new_owner, "") == 0 && strcmp (name, prev_owner) == 0) {
+- if (gc_provider_remove_client (provider, prev_owner)) {
++ if (gc_provider_remove_client_by_force (provider, prev_owner)) {
+ g_warning ("Impolite client %s disconnected without unreferencing\n", prev_owner);
+ }
+ }
+@@ -267,8 +294,8 @@
+ * @description: The description of the provider
+ *
+ * Requests ownership of the @service name, and if that succeeds registers
+- * @provider at @path. @name should be the name of the provider (e.g.
+- * "Hostip"), @description should be a short description of the provider
++ * @provider at @path. @name should be the name of the provider (e.g.
++ * "Hostip"), @description should be a short description of the provider
+ * (e.g. "Web service based Position & Address provider (http://hostip.info)").
+ */
+ void
+@@ -295,23 +322,23 @@
+
+ if (!org_freedesktop_DBus_request_name (driver, service, 0,
+ &request_ret, &error)) {
+- g_warning ("%s was unable to register service %s: %s",
+- G_OBJECT_TYPE_NAME (provider), service,
++ g_warning ("%s was unable to register service %s: %s",
++ G_OBJECT_TYPE_NAME (provider), service,
+ error->message);
+ g_error_free (error);
+ return;
+ }
+-
++
+ dbus_g_proxy_add_signal (driver, "NameOwnerChanged",
+- G_TYPE_STRING, G_TYPE_STRING,
++ G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal (driver, "NameOwnerChanged",
+ G_CALLBACK (name_owner_changed),
+ provider, NULL);
+-
+- dbus_g_connection_register_g_object (provider->connection,
++
++ dbus_g_connection_register_g_object (provider->connection,
+ path, G_OBJECT (provider));
+-
++
+ priv->name = g_strdup (name);
+ priv->description = g_strdup (description);
+ }
+Index: geoclue/geoclue/gc-web-service.c
+===================================================================
+--- geoclue.orig/geoclue/gc-web-service.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/geoclue/gc-web-service.c 2011-12-29 16:40:38.926428900 +0900
+@@ -3,7 +3,7 @@
+ * gc-web-service.c - A web service helper object for geoclue providers
+ *
+ * Author: Jussi Kukkonen <jku@o-hand.com>
+- *
++ *
+ * Copyright 2007 Jussi Kukkonen (from old geoclue_web_service.c)
+ * Copyright 2007, 2008 by Garmin Ltd. or its subsidiaries
+ *
+@@ -28,50 +28,50 @@
+ * SECTION:gc-web-service
+ * @short_description: Web service helper object for Geoclue providers.
+ *
+- * #GcWebService is a web service abstraction for Geoclue provider
+- * implementations. It handles basic http stuff and xml parsing
+- * (although the raw data is available through
++ * #GcWebService is a web service abstraction for Geoclue provider
++ * implementations. It handles basic http stuff and xml parsing
++ * (although the raw data is available through
+ * gc_web_service_get_response() as well).
+- *
+- * At the moment xml parsing functions only exist for double and
++ *
++ * At the moment xml parsing functions only exist for double and
+ * char-array data types. Adding new functions is trivial, though.
+ * <informalexample>
+ * <programlisting>
+ * . . .
+- *
++ *
+ * #GcWebService *web_service;
+ * web_service = g_object_new (GC_TYPE_WEB_SERVICE, NULL);
+ * gc_web_service_set_base_url (web_service, "http://example.org");
+- *
+- * / * Add namespaces if needed * /
++ *
++ * / * Add namespaces if needed * /
+ * gc_web_service_add_namespace (web_service,
+ * "ns_name", "http://example.org/ns");
+- *
++ *
+ * . . .
+- *
++ *
+ * / * Fetch document "http://api.example.org?key1=val1&key2=val2" * /
+- * if (!gc_web_service_query (web_service,
++ * if (!gc_web_service_query (web_service,
+ * "key1", "val1"
+ * "key2", val2"
+ * (char *)0)) {
+ * / * error * /
+ * return;
+ * }
+- *
++ *
+ * / * Use XPath expressions to parse the xml in fetched document * /
+ * gchar *str;
+ * if (gc_web_service_get_string (web_service,
+ * &str, "//path/to/element")) {
+ * g_debug("got string: %s", str);
+ * }
+- *
++ *
+ * gdouble number;
+ * if (gc_web_service_get_double (web_service,
+ * &number, "//path/to/another/element")) {
+ * g_debug("got double: %f", number);
+ * }
+- *
+- * . . .
++ *
++ * . . .
+ *
+ * g_object_unref (G_OBJECT (web_service));
+ * </programlisting>
+@@ -101,8 +101,8 @@
+ {
+ GcWebService *self = (GcWebService *)user_data;
+ XmlNamespace *ns = (XmlNamespace *)data;
+-
+- xmlXPathRegisterNs (self->xpath_ctx,
++
++ xmlXPathRegisterNs (self->xpath_ctx,
+ (xmlChar*)ns->name, (xmlChar*)ns->uri);
+ }
+
+@@ -111,7 +111,7 @@
+ gc_web_service_free_ns (gpointer data, gpointer user_data)
+ {
+ XmlNamespace *ns = (XmlNamespace *)data;
+-
++
+ g_free (ns->name);
+ g_free (ns->uri);
+ g_free (ns);
+@@ -132,7 +132,7 @@
+ g_free (self->response);
+ self->response = NULL;
+ self->response_length = 0;
+-
++
+ if (self->xpath_ctx) {
+ if (self->xpath_ctx->doc) {
+ xmlFreeDoc (self->xpath_ctx->doc);
+@@ -142,19 +142,19 @@
+ }
+ }
+
+-/* Parse data (self->response), build xpath context and register
++/* Parse data (self->response), build xpath context and register
+ * namespaces. Nothing will be done if xpath context exists already. */
+ static gboolean
+ gc_web_service_build_xpath_context (GcWebService *self)
+ {
+ xmlDocPtr doc;
+ xmlChar *tmp;
+-
++
+ /* don't rebuild if there's no need */
+ if (self->xpath_ctx) {
+ return TRUE;
+ }
+-
++
+ /* make sure response is NULL-terminated */
+ tmp = xmlStrndup(self->response, self->response_length);
+ doc = xmlParseDoc (tmp);
+@@ -164,7 +164,7 @@
+ return FALSE;
+ }
+ xmlFree (tmp);
+-
++
+ self->xpath_ctx = xmlXPathNewContext(doc);
+ if (!self->xpath_ctx) {
+ /* TODO: error handling */
+@@ -182,39 +182,39 @@
+ gint len;
+ xmlChar buf[1024];
+ xmlBuffer *output;
+-
++
+ g_assert (url);
+-
++
+ gc_web_service_reset (self);
+-
++
+ xmlNanoHTTPInit();
+ ctxt = xmlNanoHTTPMethod (url, "GET", NULL, NULL, NULL, 0);
+ if (!ctxt) {
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
+- "xmlNanoHTTPMethod did not get a response from %s\n", url);
++ *error = g_error_new (GEOCLUE_ERROR,
++ GEOCLUE_ERROR_NOT_AVAILABLE,
++ g_strdup_printf ("xmlNanoHTTPMethod did not get a response from %s\n", url));
+ return FALSE;
+ }
+-
++
+ output = xmlBufferCreate ();
+ while ((len = xmlNanoHTTPRead (ctxt, buf, sizeof(buf))) > 0) {
+ if (xmlBufferAdd (output, buf, len) != 0) {
+ xmlNanoHTTPClose(ctxt);
+ xmlBufferFree (output);
+-
+- g_set_error_literal (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_FAILED,
+- "libxml error (xmlBufferAdd failed)");
+-
++
++ *error = g_error_new (GEOCLUE_ERROR,
++ GEOCLUE_ERROR_FAILED,
++ g_strdup_printf ("libxml error (xmlBufferAdd failed)"));
++
+ return FALSE;
+ }
+ }
+ xmlNanoHTTPClose(ctxt);
+-
++
+ self->response_length = xmlBufferLength (output);
+ self->response = g_memdup (xmlBufferContent (output), self->response_length);
+ xmlBufferFree (output);
+-
++
+ return TRUE;
+ }
+
+@@ -222,17 +222,17 @@
+ gc_web_service_get_xpath_object (GcWebService *self, gchar* xpath)
+ {
+ xmlXPathObject *obj = NULL;
+-
++
+ g_return_val_if_fail (xpath, FALSE);
+-
++
+ /* parse the doc if not parsed yet and register namespaces */
+ if (!gc_web_service_build_xpath_context (self)) {
+ return FALSE;
+ }
+ g_assert (self->xpath_ctx);
+-
++
+ obj = xmlXPathEvalExpression ((xmlChar*)xpath, self->xpath_ctx);
+- if (obj &&
++ if (obj &&
+ (!obj->nodesetval || xmlXPathNodeSetIsEmpty (obj->nodesetval))) {
+ xmlXPathFreeObject (obj);
+ obj = NULL;
+@@ -255,14 +255,14 @@
+ gc_web_service_finalize (GObject *obj)
+ {
+ GcWebService *self = (GcWebService *) obj;
+-
++
+ gc_web_service_reset (self);
+-
++
+ g_free (self->base_url);
+-
++
+ g_list_foreach (self->namespaces, (GFunc)gc_web_service_free_ns, NULL);
+ g_list_free (self->namespaces);
+-
++
+ ((GObjectClass *) gc_web_service_parent_class)->finalize (obj);
+ }
+
+@@ -277,29 +277,29 @@
+ * gc_web_service_set_base_url:
+ * @self: The #GcWebService object
+ * @url: base url
+- *
+- * Sets base url for the web service. Must be called before calls to
++ *
++ * Sets base url for the web service. Must be called before calls to
+ * gc_web_service_get_* -methods.
+ */
+ void
+ gc_web_service_set_base_url (GcWebService *self, gchar *url)
+ {
+ g_assert (url);
+-
++
+ gc_web_service_reset (self);
+-
++
+ g_free (self->base_url);
+ self->base_url = g_strdup (url);
+ }
+-
++
+ /**
+ * gc_web_service_add_namespace:
+ * @self: The #GcWebService object
+ * @namespace: Namespace name
+- * @uri: Namespace uri
+- *
+- * Adds an xml namespace that will be used in all following calls to
+- * gc_web_service_get_*-functions.
++ * @uri: Namespace uri
++ *
++ * Adds an xml namespace that will be used in all following calls to
++ * gc_web_service_get_*-functions.
+ *
+ * Return value: %TRUE on success.
+ */
+@@ -307,9 +307,9 @@
+ gc_web_service_add_namespace (GcWebService *self, gchar *namespace, gchar *uri)
+ {
+ XmlNamespace *ns;
+-
++
+ g_return_val_if_fail (self->base_url, FALSE);
+-
++
+ ns = g_new0 (XmlNamespace,1);
+ ns->name = g_strdup (namespace);
+ ns->uri = g_strdup (uri);
+@@ -321,10 +321,10 @@
+ * gc_web_service_query:
+ * @self: A #GcWebService object
+ * @Varargs: NULL-terminated list of key-value gchar* pairs
+- *
+- * Fetches data from the web. The url is constructed using the
+- * optional arguments as GET parameters (see example in the
+- * Description-section). Data should be read using
++ *
++ * Fetches data from the web. The url is constructed using the
++ * optional arguments as GET parameters (see example in the
++ * Description-section). Data should be read using
+ * gc_web_service_get_* -functions.
+ *
+ * Return value: %TRUE on success.
+@@ -335,19 +335,19 @@
+ va_list list;
+ gchar *key, *value, *esc_value, *tmp, *url;
+ gboolean first_pair = TRUE;
+-
++
+ g_return_val_if_fail (self->base_url, FALSE);
+-
++
+ url = g_strdup (self->base_url);
+-
++
+ /* read the arguments one key-value pair at a time,
+ add the pairs to url as "?key1=value1&key2=value2&..." */
+ va_start (list, error);
+ key = va_arg (list, char*);
+ while (key) {
+ value = va_arg (list, char*);
+- esc_value = (gchar *)xmlURIEscapeStr ((xmlChar *)value, (xmlChar *)":");
+-
++ esc_value = (gchar *)xmlURIEscapeStr ((xmlChar *)value, NULL);
++
+ if (first_pair) {
+ tmp = g_strdup_printf ("%s?%s=%s", url, key, esc_value);
+ first_pair = FALSE;
+@@ -360,13 +360,13 @@
+ key = va_arg (list, char*);
+ }
+ va_end (list);
+-
++
+ if (!gc_web_service_fetch (self, url, error)) {
+ g_free (url);
+ return FALSE;
+ }
+ g_free (url);
+-
++
+ return TRUE;
+ }
+
+@@ -374,10 +374,10 @@
+ * gc_web_service_get_double:
+ * @self: A #GcWebService object
+ * @value: Pointer to returned value
+- * @xpath: XPath expression to find the value
+- *
+- * Extracts a @value from the data that was fetched in the last call
+- * to gc_web_service_query() using XPath expression @xpath. Returned
++ * @xpath: XPath expression to find the value
++ *
++ * Extracts a @value from the data that was fetched in the last call
++ * to gc_web_service_query() using XPath expression @xpath. Returned
+ * value is the first match.
+ *
+ * Return value: %TRUE if a value was found.
+@@ -386,7 +386,7 @@
+ gc_web_service_get_double (GcWebService *self, gdouble *value, gchar *xpath)
+ {
+ xmlXPathObject *obj;
+-
++
+ obj = gc_web_service_get_xpath_object (self, xpath);
+ if (!obj) {
+ return FALSE;
+@@ -400,10 +400,10 @@
+ * gc_web_service_get_string:
+ * @self: The #GcWebService object
+ * @value: pointer to newly allocated string
+- * @xpath: XPath expression used to find the value
+- *
+- * Extracts a @value from the data that was fetched in the last call
+- * to gc_web_service_query() using XPath expression @xpath (returned
++ * @xpath: XPath expression used to find the value
++ *
++ * Extracts a @value from the data that was fetched in the last call
++ * to gc_web_service_query() using XPath expression @xpath (returned
+ * value is the first match).
+ *
+ * Return value: %TRUE if a value was found.
+@@ -412,7 +412,7 @@
+ gc_web_service_get_string (GcWebService *self, gchar **value, gchar* xpath)
+ {
+ xmlXPathObject *obj;
+-
++
+ obj = gc_web_service_get_xpath_object (self, xpath);
+ if (!obj) {
+ return FALSE;
+@@ -427,8 +427,8 @@
+ * @self: The #GcWebService object
+ * @response: returned guchar array
+ * @response_length: length of the returned array
+- *
+- * Returns the raw data fetched with the last call to
++ *
++ * Returns the raw data fetched with the last call to
+ * gc_web_service_query(). Data may be unterminated.
+ *
+ * Return value: %TRUE on success.
+Index: geoclue/geoclue/geoclue-marshal.list
+===================================================================
+--- geoclue.orig/geoclue/geoclue-marshal.list 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/geoclue/geoclue-marshal.list 2011-12-29 16:40:38.926428900 +0900
+@@ -5,3 +5,5 @@
+ VOID:INT,POINTER,BOXED
+ VOID:INT,BOXED,BOXED
+ VOID:STRING,STRING,STRING,STRING
++VOID:INT,STRING
++VOID:INT,INT,INT,POINTER,POINTER
+Index: geoclue/geoclue/geoclue-master-client.c
+===================================================================
+--- geoclue.orig/geoclue/geoclue-master-client.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/geoclue/geoclue-master-client.c 2011-12-29 16:40:38.922428900 +0900
+@@ -26,13 +26,13 @@
+ * SECTION:geoclue-master-client
+ * @short_description: Geoclue MasterClient API
+ *
+- * #GeoclueMasterClient is part of the Geoclue public C client API. It uses
++ * #GeoclueMasterClient is part of the Geoclue public C client API. It uses
+ * D-Bus to communicate with the actual Master service.
+- *
+- * #GeoclueMasterClient is used to control the client specific behaviour
++ *
++ * #GeoclueMasterClient is used to control the client specific behaviour
+ * of Geoclue Master. Chapter "Master provider: simple example in C" contains a
+ * more complete example, but here are the main parts:
+- *
++ *
+ * <informalexample>
+ * <programlisting>
+ * GeoclueMaster *master;
+@@ -40,10 +40,10 @@
+ * GeoclueAddress *address;
+ *
+ * ...
+- *
++ *
+ * master = geoclue_master_get_default ();
+ * client = geoclue_master_create_client (master, NULL, NULL);
+- *
++ *
+ * if (!geoclue_master_client_set_requirements (client,
+ * GEOCLUE_ACCURACY_LEVEL_NONE,
+ * 0, FALSE,
+@@ -51,13 +51,13 @@
+ * &error)) {
+ * / * handle error * /
+ * }
+- *
++ *
+ * address = geoclue_master_client_create_address (client, error);
+ * if (!address) {
+ * / * handle error * /
+ * }
+- *
+- * / * Now we can use address just like we'd use a normal address provider,
++ *
++ * / * Now we can use address just like we'd use a normal address provider,
+ * but GeoclueMasterClient makes sure that underneath the provider
+ * that best matches our requirements is used * /
+ * </programlisting>
+@@ -152,9 +152,9 @@
+ static void
+ address_provider_changed (DBusGProxy *proxy,
+ char *name,
+- char *description,
+- char *service,
+- char *path,
++ char *description,
++ char *service,
++ char *path,
+ GeoclueMasterClient *client)
+ {
+ g_signal_emit (client, signals[ADDRESS_PROVIDER_CHANGED], 0,
+@@ -164,12 +164,12 @@
+ static void
+ position_provider_changed (DBusGProxy *proxy,
+ char *name,
+- char *description,
+- char *service,
+- char *path,
++ char *description,
++ char *service,
++ char *path,
+ GeoclueMasterClient *client)
+ {
+- g_signal_emit (client, signals[POSITION_PROVIDER_CHANGED], 0,
++ g_signal_emit (client, signals[POSITION_PROVIDER_CHANGED], 0,
+ name, description, service, path);
+ }
+
+@@ -228,7 +228,7 @@
+ dbus_g_proxy_connect_signal (priv->proxy, "AddressProviderChanged",
+ G_CALLBACK (address_provider_changed),
+ object, NULL);
+-
++
+ dbus_g_proxy_add_signal (priv->proxy, "PositionProviderChanged",
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_INVALID);
+@@ -251,7 +251,7 @@
+
+ g_type_class_add_private (klass, sizeof (GeoclueMasterClientPrivate));
+
+- g_object_class_install_property
++ g_object_class_install_property
+ (o_class, PROP_PATH,
+ g_param_spec_string ("object-path",
+ "Object path",
+@@ -262,7 +262,7 @@
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB |
+ G_PARAM_STATIC_NAME));
+-
++
+ /**
+ * GeoclueMasterClient::address-provider-changed:
+ * @client: the #GeoclueMasterClient object emitting the signal
+@@ -270,20 +270,20 @@
+ * @description: a short description of the new provider or %NULL if there is no provider
+ * @service: D-Bus service name of the new provider or %NULL if there is no provider
+ * @path: D-Bus object path name of the new provider or %NULL if there is no provider
+- *
++ *
+ * The address-provider-changed signal is emitted each time the used address provider
+ * changes.
+ **/
+- signals[ADDRESS_PROVIDER_CHANGED] =
++ signals[ADDRESS_PROVIDER_CHANGED] =
+ g_signal_new ("address-provider-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GeoclueMasterClientClass, address_provider_changed),
++ G_STRUCT_OFFSET (GeoclueMasterClientClass, address_provider_changed),
+ NULL, NULL,
+ geoclue_marshal_VOID__STRING_STRING_STRING_STRING,
+ G_TYPE_NONE, 4,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+-
++
+ /**
+ * GeoclueMasterClient::position-provider-changed:
+ * @client: the #GeoclueMasterClient object emitting the signal
+@@ -291,15 +291,15 @@
+ * @description: a short description of the new provider or %NULL if there is no provider
+ * @service: D-Bus service name of the new provider or %NULL if there is no provider
+ * @path: D-Bus object path name of the new provider or %NULL if there is no provider
+- *
++ *
+ * The position-provider-changed signal is emitted each time the used position provider
+ * changes.
+ **/
+- signals[POSITION_PROVIDER_CHANGED] =
++ signals[POSITION_PROVIDER_CHANGED] =
+ g_signal_new ("position-provider-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GeoclueMasterClientClass, position_provider_changed),
++ G_STRUCT_OFFSET (GeoclueMasterClientClass, position_provider_changed),
+ NULL, NULL,
+ geoclue_marshal_VOID__STRING_STRING_STRING_STRING,
+ G_TYPE_NONE, 4,
+@@ -333,7 +333,7 @@
+ * geoclue_master_client_set_requirements:
+ * @client: A #GeoclueMasterClient
+ * @min_accuracy: The required minimum accuracy as a #GeoclueAccuracyLevel.
+- * @min_time: The minimum time between update signals in seconds
++ * @min_time: The minimum time between update signals (currently not implemented)
+ * @require_updates: Whether the updates (signals) are required. Only applies to interfaces with signals
+ * @allowed_resources: The resources that are allowed to be used as a #GeoclueResourceFlags
+ * @error: A pointer to returned #GError or %NULL.
+@@ -353,7 +353,7 @@
+ GeoclueMasterClientPrivate *priv;
+
+ priv = GET_PRIVATE (client);
+- if (!org_freedesktop_Geoclue_MasterClient_set_requirements
++ if (!org_freedesktop_Geoclue_MasterClient_set_requirements
+ (priv->proxy, min_accuracy, min_time, require_updates, allowed_resources, error)) {
+ return FALSE;
+ }
+@@ -362,7 +362,7 @@
+ }
+
+ static void
+-set_requirements_callback (DBusGProxy *proxy,
++set_requirements_callback (DBusGProxy *proxy,
+ GError *error,
+ GeoclueMasterClientAsyncData *data)
+ {
+@@ -377,7 +377,7 @@
+ * @client: A #GeoclueMasterClient object
+ * @error: Error as #Gerror (may be %NULL)
+ * @userdata: User data pointer set in geoclue_master_client_set_requirements_async()
+- *
++ *
+ * Callback function for geoclue_master_client_set_requirements_async().
+ */
+
+@@ -389,11 +389,11 @@
+ * @require_updates: Whether the updates (signals) are required. Only applies to interfaces with signals
+ * @allowed_resources: The resources that are allowed to be used as a #GeoclueResourceFlags
+ * @callback: #GeoclueSetRequirementsCallback function to call when requirements have been set
+- * @userdata: User data pointer
+- *
++ * @userdata: User data pointer
++ *
+ * Asynchronous version of geoclue_master_client_set_requirements().
+ */
+-void
++void
+ geoclue_master_client_set_requirements_async (GeoclueMasterClient *client,
+ GeoclueAccuracyLevel min_accuracy,
+ int min_time,
+@@ -404,12 +404,12 @@
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (client);
+ GeoclueMasterClientAsyncData *data;
+-
++
+ data = g_new (GeoclueMasterClientAsyncData, 1);
+ data->client = client;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_MasterClient_set_requirements_async
+ (priv->proxy,
+ min_accuracy,
+@@ -425,38 +425,38 @@
+ * @client: A #GeoclueMasterClient
+ * @error: A pointer to returned #GError or %NULL.
+ *
+- * Starts the GeoclueMasterClient address provider and returns
++ * Starts the GeoclueMasterClient address provider and returns
+ * a #GeoclueAddress that uses the same D-Bus object as the #GeoclueMasterClient.
+ *
+ * Return value: New #GeoclueAddress or %NULL on error
+ */
+ GeoclueAddress *
+-geoclue_master_client_create_address (GeoclueMasterClient *client,
++geoclue_master_client_create_address (GeoclueMasterClient *client,
+ GError **error)
+ {
+ GeoclueMasterClientPrivate *priv;
+-
++
+ priv = GET_PRIVATE (client);
+-
++
+ if (!org_freedesktop_Geoclue_MasterClient_address_start (priv->proxy, error)) {
+ return NULL;
+ }
+-
++
+ return geoclue_address_new (GEOCLUE_MASTER_DBUS_SERVICE, priv->object_path);
+ }
+
+ static void
+-address_start_async_callback (DBusGProxy *proxy,
++address_start_async_callback (DBusGProxy *proxy,
+ GError *error,
+ GeoclueMasterClientAsyncData *data)
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (data->client);
+ GeoclueAddress *address = NULL;
+-
++
+ if (!error) {
+ address = geoclue_address_new (GEOCLUE_MASTER_DBUS_SERVICE, priv->object_path);
+ }
+-
++
+ (*(CreateAddressCallback)data->callback) (data->client,
+ address,
+ error,
+@@ -470,7 +470,7 @@
+ * @address: returned #GeoclueAddress
+ * @error: Error as #Gerror (may be %NULL)
+ * @userdata: User data pointer set in geoclue_master_client_create_address_async()
+- *
++ *
+ * Callback function for geoclue_master_client_create_address_async().
+ */
+
+@@ -479,23 +479,23 @@
+ * @client: A #GeoclueMasterClient object
+ * @callback: A #CreateAddressCallback function that should be called when return values are available
+ * @userdata: pointer for user specified data
+- *
++ *
+ * Function returns (essentially) immediately and calls @callback when it has started the address provider
+ * and a #GeoclueAddress is available.
+ */
+-void
++void
+ geoclue_master_client_create_address_async (GeoclueMasterClient *client,
+ CreateAddressCallback callback,
+ gpointer userdata)
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (client);
+ GeoclueMasterClientAsyncData *data;
+-
++
+ data = g_new (GeoclueMasterClientAsyncData, 1);
+ data->client = client;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_MasterClient_address_start_async
+ (priv->proxy,
+ (org_freedesktop_Geoclue_MasterClient_address_start_reply)address_start_async_callback,
+@@ -508,7 +508,7 @@
+ * @client: A #GeoclueMasterClient
+ * @error: A pointer to returned #GError or %NULL.
+ *
+- * Starts the GeoclueMasterClient position provider and returns
++ * Starts the GeoclueMasterClient position provider and returns
+ * a #GeocluePosition that uses the same D-Bus object as the #GeoclueMasterClient.
+ *
+ * Return value: New #GeocluePosition or %NULL on error
+@@ -518,9 +518,9 @@
+ GError **error)
+ {
+ GeoclueMasterClientPrivate *priv;
+-
++
+ priv = GET_PRIVATE (client);
+-
++
+ if (!org_freedesktop_Geoclue_MasterClient_position_start (priv->proxy, error)) {
+ return NULL;
+ }
+@@ -529,17 +529,17 @@
+
+
+ static void
+-position_start_async_callback (DBusGProxy *proxy,
++position_start_async_callback (DBusGProxy *proxy,
+ GError *error,
+ GeoclueMasterClientAsyncData *data)
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (data->client);
+ GeocluePosition *position = NULL;
+-
++
+ if (!error) {
+ position = geoclue_position_new (GEOCLUE_MASTER_DBUS_SERVICE, priv->object_path);
+ }
+-
++
+ (*(CreatePositionCallback)data->callback) (data->client,
+ position,
+ error,
+@@ -553,7 +553,7 @@
+ * @position: returned #GeocluePosition
+ * @error: Error as #Gerror (may be %NULL)
+ * @userdata: User data pointer set in geoclue_master_client_create_position_async()
+- *
++ *
+ * Callback function for geoclue_master_client_create_position_async().
+ */
+
+@@ -562,23 +562,23 @@
+ * @client: A #GeoclueMasterClient object
+ * @callback: A #CreatePositionCallback function that should be called when return values are available
+ * @userdata: pointer for user specified data
+- *
++ *
+ * Function returns (essentially) immediately and calls @callback when it has started the position provider
+ * and a #GeocluePosition is available.
+ */
+-void
++void
+ geoclue_master_client_create_position_async (GeoclueMasterClient *client,
+ CreatePositionCallback callback,
+ gpointer userdata)
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (client);
+ GeoclueMasterClientAsyncData *data;
+-
++
+ data = g_new (GeoclueMasterClientAsyncData, 1);
+ data->client = client;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_MasterClient_position_start_async
+ (priv->proxy,
+ (org_freedesktop_Geoclue_MasterClient_position_start_reply)position_start_async_callback,
+@@ -594,9 +594,9 @@
+ * @service: Pointer to returned D-Bus service name or %NULL
+ * @path: Pointer to returned D-Bus object path or %NULL
+ * @error: Pointer to returned #GError or %NULL
+- *
++ *
+ * Gets name and other information for the currently used address provider.
+- *
++ *
+ * Return value: %TRUE on success
+ */
+ gboolean geoclue_master_client_get_address_provider (GeoclueMasterClient *client,
+@@ -607,26 +607,26 @@
+ GError **error)
+ {
+ GeoclueMasterClientPrivate *priv;
+-
++
+ priv = GET_PRIVATE (client);
+- if (!org_freedesktop_Geoclue_MasterClient_get_address_provider
++ if (!org_freedesktop_Geoclue_MasterClient_get_address_provider
+ (priv->proxy, name, description, service, path, error)) {
+ return FALSE;
+ }
+-
++
+ return TRUE;
+ }
+
+ static void
+-get_provider_callback (DBusGProxy *proxy,
+- char * name,
+- char * description,
+- char * service,
+- char * path,
+- GError *error,
++get_provider_callback (DBusGProxy *proxy,
++ char * name,
++ char * description,
++ char * service,
++ char * path,
++ GError *error,
+ GeoclueMasterClientAsyncData *data)
+ {
+-
++
+ (*(GeoclueGetProviderCallback)data->callback) (data->client,
+ name,
+ description,
+@@ -642,22 +642,22 @@
+ * @client: A #GeoclueMasterClient
+ * @callback: A #GeoclueGetProviderCallback function that will be called when return values are available
+ * @userdata: pointer for user specified data
+- *
++ *
+ * Gets name and other information for the currently used address provider asynchronously.
+ */
+-void
++void
+ geoclue_master_client_get_address_provider_async (GeoclueMasterClient *client,
+ GeoclueGetProviderCallback callback,
+ gpointer userdata)
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (client);
+ GeoclueMasterClientAsyncData *data;
+-
++
+ data = g_new (GeoclueMasterClientAsyncData, 1);
+ data->client = client;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_MasterClient_get_address_provider_async
+ (priv->proxy,
+ (org_freedesktop_Geoclue_MasterClient_get_address_provider_reply)get_provider_callback,
+@@ -673,9 +673,9 @@
+ * @service: Pointer to returned D-Bus service name or %NULL
+ * @path: Pointer to returned D-Bus object path or %NULL
+ * @error: Pointer to returned #GError or %NULL
+- *
++ *
+ * Gets name and other information for the currently used position provider.
+- *
++ *
+ * Return value: %TRUE on success
+ */
+ gboolean geoclue_master_client_get_position_provider (GeoclueMasterClient *client,
+@@ -686,13 +686,13 @@
+ GError **error)
+ {
+ GeoclueMasterClientPrivate *priv;
+-
++
+ priv = GET_PRIVATE (client);
+- if (!org_freedesktop_Geoclue_MasterClient_get_position_provider
++ if (!org_freedesktop_Geoclue_MasterClient_get_position_provider
+ (priv->proxy, name, description, service, path, error)) {
+ return FALSE;
+ }
+-
++
+ return TRUE;
+ }
+
+@@ -701,22 +701,22 @@
+ * @client: A #GeoclueMasterClient
+ * @callback: A #GeoclueGetProviderCallback function that will be called when return values are available
+ * @userdata: pointer for user specified data
+- *
++ *
+ * Gets name and other information for the currently used position provider asynchronously.
+ */
+-void
++void
+ geoclue_master_client_get_position_provider_async (GeoclueMasterClient *client,
+ GeoclueGetProviderCallback callback,
+ gpointer userdata)
+ {
+ GeoclueMasterClientPrivate *priv = GET_PRIVATE (client);
+ GeoclueMasterClientAsyncData *data;
+-
++
+ data = g_new (GeoclueMasterClientAsyncData, 1);
+ data->client = client;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_MasterClient_get_position_provider_async
+ (priv->proxy,
+ (org_freedesktop_Geoclue_MasterClient_get_position_provider_reply)get_provider_callback,
+Index: geoclue/geoclue/geoclue-nmea.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/geoclue-nmea.c 2011-12-29 16:40:38.926428900 +0900
+@@ -0,0 +1,211 @@
++/*
++ * Geoclue
++ * geoclue-nmea.c - Client API for accessing GcIfaceNmea
++ *
++ * Author: Tae-Hwan Kim <the81.kim@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++/**
++ * SECTION:geoclue-nmea
++ * @short_description: Geoclue nmea client API
++ *
++ * #GeoclueNmea contains nmea-related methods and signals.
++ * It is part of the Geoclue public C client API which uses D-Bus
++ * to communicate with the actual provider.
++ *
++ * After a #GeoclueNmea is created with geoclue_nmea_new() or
++ * using geoclye_master_client_create_nmea(), the
++ * geoclue_nmea_get_nmea() and geoclue_nmea_get_nmea_async()
++ * method and the nmea-changed signal can be used to obtain the current nmea.
++ */
++
++#include <geoclue/geoclue-nmea.h>
++#include <geoclue/geoclue-marshal.h>
++
++#include "gc-iface-nmea-bindings.h"
++
++//#include <glib.h>
++#include <string.h>
++
++typedef struct _GeoclueNmeaPrivate {
++ int dummy;
++} GeoclueNmeaPrivate;
++
++enum {
++ NMEA_CHANGED,
++ LAST_SIGNAL
++};
++
++static guint32 signals[LAST_SIGNAL] = {0, };
++
++#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GEOCLUE_TYPE_NMEA, GeoclueNmeaPrivate))
++
++G_DEFINE_TYPE (GeoclueNmea, geoclue_nmea, GEOCLUE_TYPE_PROVIDER);
++
++static void
++finalize (GObject *object)
++{
++ G_OBJECT_CLASS (geoclue_nmea_parent_class)->finalize (object);
++}
++
++static void
++dispose (GObject *object)
++{
++ G_OBJECT_CLASS (geoclue_nmea_parent_class)->dispose (object);
++}
++
++static void
++nmea_changed (DBusGProxy *proxy,
++ int timestamp,
++ char *nmea_data,
++ GeoclueNmea *nmea)
++{
++ g_signal_emit (nmea, signals[NMEA_CHANGED], 0,
++ timestamp, nmea_data);
++}
++
++static GObject *
++constructor (GType type,
++ guint n_props,
++ GObjectConstructParam *props)
++{
++ GObject *object;
++ GeoclueProvider *provider;
++
++ object = G_OBJECT_CLASS (geoclue_nmea_parent_class)->constructor (type, n_props, props);
++ provider = GEOCLUE_PROVIDER (object);
++
++ dbus_g_proxy_add_signal (provider->proxy, "NmeaChanged",
++ G_TYPE_INT,
++ G_TYPE_STRING,
++ G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal (provider->proxy, "NmeaChanged",
++ G_CALLBACK (nmea_changed),
++ object, NULL);
++
++ return object;
++}
++
++static void
++geoclue_nmea_class_init (GeoclueNmeaClass *klass)
++{
++ GObjectClass *o_class = (GObjectClass *) klass;
++
++ o_class->finalize = finalize;
++ o_class->dispose = dispose;
++ o_class->constructor = constructor;
++
++ g_type_class_add_private (klass, sizeof (GeoclueNmeaPrivate));
++
++ signals[NMEA_CHANGED] = g_signal_new ("nmea-changed",
++ G_TYPE_FROM_CLASS (klass),
++ G_SIGNAL_RUN_FIRST |
++ G_SIGNAL_NO_RECURSE,
++ G_STRUCT_OFFSET (GeoclueNmeaClass, nmea_changed),
++ NULL, NULL,
++ geoclue_marshal_VOID__INT_STRING,
++ G_TYPE_NONE, 2,
++ G_TYPE_INT,
++ G_TYPE_STRING);
++}
++
++static void
++geoclue_nmea_init (GeoclueNmea *nmea)
++{
++}
++
++/**
++ * geoclue_nmea_new:
++ * @service: D-Bus service name
++ * @path: D-Bus path name
++ *
++ * Creates a #GeoclueNmea with given D-Bus service name and path.
++ *
++ * Return value: Pointer to a new #GeoclueNmea
++ */
++GeoclueNmea *
++geoclue_nmea_new (const char *service,
++ const char *path)
++{
++ return g_object_new (GEOCLUE_TYPE_NMEA,
++ "service", service,
++ "path", path,
++ "interface", GEOCLUE_NMEA_INTERFACE_NAME,
++ NULL);
++}
++
++gboolean
++geoclue_nmea_get_nmea (GeoclueNmea *nmea,
++ int *timestamp,
++ char **nmea_data,
++ GError **error)
++{
++ GeoclueProvider *provider = GEOCLUE_PROVIDER (nmea);
++
++ if (!org_freedesktop_Geoclue_Nmea_get_nmea (provider->proxy,
++ timestamp,
++ nmea_data,
++ error)) {
++ return FALSE;
++ }
++ return TRUE;
++}
++
++
++typedef struct _GeoclueNmeaAsyncData {
++ GeoclueNmea *nmea;
++ GCallback callback;
++ gpointer userdata;
++} GeoclueNmeaAsyncData;
++
++static void
++get_nmea_async_callback (DBusGProxy *proxy,
++ int timestamp,
++ char *nmea_data,
++ GError *error,
++ GeoclueNmeaAsyncData *data)
++{
++ (*(GeoclueNmeaCallback)data->callback) (data->nmea,
++ timestamp,
++ nmea_data,
++ error,
++ data->userdata);
++ g_free (data);
++}
++
++void
++geoclue_nmea_get_nmea_async (GeoclueNmea *nmea,
++ GeoclueNmeaCallback callback,
++ gpointer userdata)
++{
++ GeoclueProvider *provider = GEOCLUE_PROVIDER (nmea);
++ GeoclueNmeaAsyncData *data;
++
++ data = g_new (GeoclueNmeaAsyncData, 1);
++ data->nmea = nmea;
++ data->callback = G_CALLBACK (callback);
++ data->userdata = userdata;
++
++ org_freedesktop_Geoclue_Nmea_get_nmea_async (
++ provider->proxy,
++ (org_freedesktop_Geoclue_Nmea_get_nmea_reply)get_nmea_async_callback,
++ data);
++}
+Index: geoclue/geoclue/geoclue-nmea.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/geoclue-nmea.h 2011-12-29 16:40:38.922428900 +0900
+@@ -0,0 +1,78 @@
++/*
++ * Geoclue
++ * geoclue-nmea.h -
++ *
++ * Author: Tae-Hwan Kim <the81.kim@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++
++#ifndef _GEOCLUE_NMEA_H
++#define _GEOCLUE_NMEA_H
++
++#include <geoclue/geoclue-provider.h>
++#include <geoclue/geoclue-types.h>
++//#include <geoclue/geoclue-accuracy.h>
++
++G_BEGIN_DECLS
++
++#define GEOCLUE_TYPE_NMEA (geoclue_nmea_get_type ())
++#define GEOCLUE_NMEA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEOCLUE_TYPE_NMEA, GeoclueNmea))
++#define GEOCLUE_IS_NMEA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEOCLUE_TYPE_NMEA))
++
++#define GEOCLUE_NMEA_INTERFACE_NAME "org.freedesktop.Geoclue.Nmea"
++
++#define GEOCLUE_MAX_NMEA_DATA_SIZE (1500)
++
++typedef struct _GeoclueNmea {
++ GeoclueProvider provider;
++} GeoclueNmea;
++
++typedef struct _GeoclueNmeaClass {
++ GeoclueProviderClass provider_class;
++
++ void (* nmea_changed) (GeoclueNmea *nmea,
++ int timestamp,
++ char nmea_data[GEOCLUE_MAX_NMEA_DATA_SIZE]);
++} GeoclueNmeaClass;
++
++GType geoclue_nmea_get_type (void);
++
++GeoclueNmea *geoclue_nmea_new (const char *service,
++ const char *path);
++
++gboolean geoclue_nmea_get_nmea (GeoclueNmea *nmea,
++ int *timestamp,
++ char **nmea_data,
++ GError **error);
++
++typedef void (*GeoclueNmeaCallback) (GeoclueNmea *nmea,
++ int timestamp,
++ char *nmea_data,
++ GError *error,
++ gpointer userdata);
++
++void geoclue_nmea_get_nmea_async (GeoclueNmea *nmea,
++ GeoclueNmeaCallback callback,
++ gpointer userdata);
++
++G_END_DECLS
++
++#endif
+Index: geoclue/geoclue/geoclue-provider.c
+===================================================================
+--- geoclue.orig/geoclue/geoclue-provider.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/geoclue/geoclue-provider.c 2011-12-29 16:40:38.922428900 +0900
+@@ -40,8 +40,8 @@
+ * GeocluePosition *pos;
+ * char *name;
+ * GError *error;
+- *
+- * pos = geoclue_position_new ("org.freedesktop.Geoclue.Providers.Example",
++ *
++ * pos = geoclue_position_new ("org.freedesktop.Geoclue.Providers.Example",
+ * "/org/freedesktop/Geoclue/Providers/Example");
+ *
+ * if (geoclue_provider_get_provider_info (GEOCLUE_PROVIDER (pos),
+@@ -50,12 +50,11 @@
+ * }
+ * </programlisting>
+ * </informalexample>
+- *
++ *
+ * #GeoclueProvider can be used to obtain generic
+ * information about the provider and to set provider
+ * options.
+ */
+-#include <config.h>
+
+ #include <geoclue/geoclue-provider.h>
+ #include "gc-iface-geoclue-bindings.h"
+@@ -68,7 +67,7 @@
+
+ typedef struct _GeoclueProviderPrivate {
+ DBusGProxy *geoclue_proxy;
+-
++
+ char *service;
+ char *path;
+ char *interface;
+@@ -105,7 +104,7 @@
+ add_reference_callback (DBusGProxy *proxy, GError *error, gpointer userdata)
+ {
+ if (error) {
+- g_printerr ("Could not reference provider: %s", error->message);
++ g_printerr ("Could not reference provider: %s\n", error->message);
+ g_error_free (error);
+ }
+ }
+@@ -114,7 +113,7 @@
+ remove_reference_callback (DBusGProxy *proxy, GError *error, gpointer userdata)
+ {
+ if (error) {
+- g_printerr ("Could not unreference provider: %s", error->message);
++ g_printerr ("Could not unreference provider: %s\n", error->message);
+ g_error_free (error);
+ }
+ }
+@@ -123,11 +122,11 @@
+ finalize (GObject *object)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (object);
+-
++
+ g_free (priv->service);
+ g_free (priv->path);
+ g_free (priv->interface);
+-
++
+ G_OBJECT_CLASS (geoclue_provider_parent_class)->finalize (object);
+ }
+
+@@ -136,7 +135,7 @@
+ {
+ GeoclueProvider *provider = GEOCLUE_PROVIDER (object);
+ GeoclueProviderPrivate *priv = GET_PRIVATE (object);
+-
++
+ org_freedesktop_Geoclue_remove_reference_async (priv->geoclue_proxy,
+ remove_reference_callback,
+ NULL);
+@@ -144,12 +143,12 @@
+ g_object_unref (priv->geoclue_proxy);
+ priv->geoclue_proxy = NULL;
+ }
+-
++
+ if (provider->proxy) {
+ g_object_unref (provider->proxy);
+ provider->proxy = NULL;
+ }
+-
++
+ G_OBJECT_CLASS (geoclue_provider_parent_class)->dispose (object);
+ }
+
+@@ -163,31 +162,34 @@
+ GeoclueProviderPrivate *priv;
+ DBusGConnection *connection;
+ GError *error = NULL;
+-
++
+ object = G_OBJECT_CLASS (geoclue_provider_parent_class)->constructor
+ (type, n_props, props);
+ provider = GEOCLUE_PROVIDER (object);
+ priv = GET_PRIVATE (provider);
+-
+- connection = dbus_g_bus_get (GEOCLUE_DBUS_BUS, &error);
++
++ // There is a crash due to DBUS_BUS_SESSION
++ //connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
++ connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++
+ if (connection == NULL) {
+ g_printerr ("Failed to open connection to bus: %s\n",
+ error->message);
+ g_error_free (error);
+ provider->proxy = NULL;
+ priv->geoclue_proxy = NULL;
+-
++
+ return object;
+ }
+-
++
+ /* proxy for the requested interface */
+- provider->proxy = dbus_g_proxy_new_for_name (connection,
+- priv->service, priv->path,
++ provider->proxy = dbus_g_proxy_new_for_name (connection,
++ priv->service, priv->path,
+ priv->interface);
+-
++
+ /* proxy for org.freedesktop.Geoclue */
+- priv->geoclue_proxy = dbus_g_proxy_new_for_name (connection,
+- priv->service, priv->path,
++ priv->geoclue_proxy = dbus_g_proxy_new_for_name (connection,
++ priv->service, priv->path,
+ GEOCLUE_INTERFACE_NAME);
+ org_freedesktop_Geoclue_add_reference_async (priv->geoclue_proxy,
+ add_reference_callback,
+@@ -197,10 +199,10 @@
+ dbus_g_proxy_connect_signal (priv->geoclue_proxy, "StatusChanged",
+ G_CALLBACK (status_changed),
+ object, NULL);
+-
++
+ return object;
+ }
+-
++
+ static void
+ set_property (GObject *object,
+ guint prop_id,
+@@ -208,20 +210,20 @@
+ GParamSpec *pspec)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (object);
+-
++
+ switch (prop_id) {
+ case PROP_SERVICE:
+ priv->service = g_value_dup_string (value);
+ break;
+-
++
+ case PROP_PATH:
+ priv->path = g_value_dup_string (value);
+ break;
+-
++
+ case PROP_INTERFACE:
+ priv->interface = g_value_dup_string (value);
+ break;
+-
++
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+@@ -244,15 +246,15 @@
+ geoclue_provider_class_init (GeoclueProviderClass *klass)
+ {
+ GObjectClass *o_class = (GObjectClass *) klass;
+-
++
+ o_class->finalize = finalize;
+ o_class->dispose = dispose;
+ o_class->constructor = constructor;
+ o_class->set_property = set_property;
+ o_class->get_property = get_property;
+-
++
+ g_type_class_add_private (klass, sizeof (GeoclueProviderPrivate));
+-
++
+ g_object_class_install_property
+ (o_class, PROP_SERVICE,
+ g_param_spec_string ("service", "Service",
+@@ -280,7 +282,7 @@
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB |
+ G_PARAM_STATIC_NAME));
+-
++
+ /**
+ * GeoclueProvider::status-changed:
+ * @provider: the provider object emitting the signal
+@@ -293,7 +295,7 @@
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST |
+ G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GeoclueProviderClass, status_changed),
++ G_STRUCT_OFFSET (GeoclueProviderClass, status_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE, 1, G_TYPE_INT);
+@@ -304,7 +306,7 @@
+ geoclue_provider_init (GeoclueProvider *provider)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ provider->proxy = NULL;
+ priv->geoclue_proxy = NULL;
+ }
+@@ -314,9 +316,9 @@
+ * @provider: A #GeoclueProvider object
+ * @status: Pointer for returned status as #GeoclueStatus
+ * @error: Pointer for returned #GError or %NULL
+- *
++ *
+ * Obtains the current status of the provider.
+- *
++ *
+ * Return value: %TRUE on success
+ */
+ gboolean
+@@ -326,12 +328,12 @@
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+ int i;
+-
++
+ if (status == NULL) {
+ return TRUE;
+ }
+-
+- if (!org_freedesktop_Geoclue_get_status (priv->geoclue_proxy,
++
++ if (!org_freedesktop_Geoclue_get_status (priv->geoclue_proxy,
+ &i, error)) {
+ return FALSE;
+ }
+@@ -340,9 +342,9 @@
+ }
+
+ static void
+-get_status_async_callback (DBusGProxy *proxy,
+- GeoclueStatus status,
+- GError *error,
++get_status_async_callback (DBusGProxy *proxy,
++ GeoclueStatus status,
++ GError *error,
+ GeoclueProviderAsyncData *data)
+ {
+ (*(GeoclueProviderStatusCallback)data->callback) (data->provider,
+@@ -350,7 +352,7 @@
+ error,
+ data->userdata);
+ g_free (data);
+-
++
+ }
+
+ /**
+@@ -359,7 +361,7 @@
+ * @status: A #GeoclueStatus
+ * @error: Error as #GError or %NULL
+ * @userdata: User data pointer set in geoclue_provider_get_status_async()
+- *
++ *
+ * Callback function for geoclue_provider_get_status_async().
+ */
+
+@@ -368,24 +370,24 @@
+ * @provider: A #GeoclueProvider object
+ * @callback: A #GeoclueProviderStatusCallback function that will be called when return values are available
+ * @userdata: pointer for user specified data
+- *
+- * Asynchronous version of geoclue_provider_get_status(). Function returns
+- * (essentially) immediately and calls @callback when status is available or
++ *
++ * Asynchronous version of geoclue_provider_get_status(). Function returns
++ * (essentially) immediately and calls @callback when status is available or
+ * when there is an error.
+ */
+-void
++void
+ geoclue_provider_get_status_async (GeoclueProvider *provider,
+ GeoclueProviderStatusCallback callback,
+ gpointer userdata)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+ GeoclueProviderAsyncData *data;
+-
++
+ data = g_new (GeoclueProviderAsyncData, 1);
+ data->provider = provider;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_get_status_async
+ (priv->geoclue_proxy,
+ (org_freedesktop_Geoclue_get_status_reply)get_status_async_callback,
+@@ -409,18 +411,18 @@
+ GError **error)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ if (options == NULL) {
+ return TRUE;
+ }
+-
+- return org_freedesktop_Geoclue_set_options (priv->geoclue_proxy,
++
++ return org_freedesktop_Geoclue_set_options (priv->geoclue_proxy,
+ options, error);
+ }
+
+ static void
+-set_options_async_callback (DBusGProxy *proxy,
+- GError *error,
++set_options_async_callback (DBusGProxy *proxy,
++ GError *error,
+ GeoclueProviderAsyncData *data)
+ {
+ (*(GeoclueProviderOptionsCallback)data->callback) (data->provider,
+@@ -434,7 +436,7 @@
+ * @provider: A #GeoclueProvider object
+ * @error: Error as #GError or %NULL
+ * @userdata: User data pointer set in geoclue_provider_set_options_async()
+- *
++ *
+ * Callback function for geoclue_provider_set_options_async().
+ */
+
+@@ -444,12 +446,12 @@
+ * @options: A #GHashTable of options
+ * @callback: A #GeoclueProviderOptionsCallback function that will be called when options are set
+ * @userdata: pointer for user specified data
+- *
+- * Asynchronous version of geoclue_provider_set_options(). Function returns
+- * (essentially) immediately and calls @callback when options have been set or
++ *
++ * Asynchronous version of geoclue_provider_set_options(). Function returns
++ * (essentially) immediately and calls @callback when options have been set or
+ * when there is an error.
+ */
+-void
++void
+ geoclue_provider_set_options_async (GeoclueProvider *provider,
+ GHashTable *options,
+ GeoclueProviderOptionsCallback callback,
+@@ -457,12 +459,12 @@
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+ GeoclueProviderAsyncData *data;
+-
++
+ data = g_new (GeoclueProviderAsyncData, 1);
+ data->provider = provider;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_set_options_async
+ (priv->geoclue_proxy,
+ options,
+@@ -476,9 +478,9 @@
+ * @name: Pointer for returned provider name or %NULL
+ * @description: Pointer for returned provider description or %NULL
+ * @error: Pointer for returned #GError or %NULL
+- *
++ *
+ * Obtains name and a short description of the provider.
+- *
++ *
+ * Return value: %TRUE on success
+ */
+ gboolean
+@@ -488,17 +490,17 @@
+ GError **error)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ return org_freedesktop_Geoclue_get_provider_info (priv->geoclue_proxy,
+ name, description,
+ error);
+ }
+
+ static void
+-get_provider_info_async_callback (DBusGProxy *proxy,
++get_provider_info_async_callback (DBusGProxy *proxy,
+ char *name,
+ char *description,
+- GError *error,
++ GError *error,
+ GeoclueProviderAsyncData *data)
+ {
+ (*(GeoclueProviderInfoCallback)data->callback) (data->provider,
+@@ -516,7 +518,7 @@
+ * @description: one-line description of the provider
+ * @error: Error as #GError or %NULL
+ * @userdata: User data pointer set in geoclue_provider_get_provider_info_async()
+- *
++ *
+ * Callback function for geoclue_provider_get_provider_info_async().
+ */
+
+@@ -525,24 +527,24 @@
+ * @provider: A #GeoclueProvider object
+ * @callback: A #GeoclueProviderInfoCallback function that will be called when info is available
+ * @userdata: pointer for user specified data
+- *
+- * Asynchronous version of geoclue_provider_get_provider_info(). Function returns
+- * (essentially) immediately and calls @callback when info is available or
++ *
++ * Asynchronous version of geoclue_provider_get_provider_info(). Function returns
++ * (essentially) immediately and calls @callback when info is available or
+ * when there is an error.
+ */
+-void
++void
+ geoclue_provider_get_provider_info_async (GeoclueProvider *provider,
+ GeoclueProviderInfoCallback callback,
+ gpointer userdata)
+ {
+ GeoclueProviderPrivate *priv = GET_PRIVATE (provider);
+ GeoclueProviderAsyncData *data;
+-
++
+ data = g_new (GeoclueProviderAsyncData, 1);
+ data->provider = provider;
+ data->callback = G_CALLBACK (callback);
+ data->userdata = userdata;
+-
++
+ org_freedesktop_Geoclue_get_provider_info_async
+ (priv->geoclue_proxy,
+ (org_freedesktop_Geoclue_get_provider_info_reply)get_provider_info_async_callback,
+Index: geoclue/geoclue/geoclue-satellite-info.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/geoclue-satellite-info.h 2011-12-29 16:40:38.926428900 +0900
+@@ -0,0 +1,40 @@
++/*
++ * Geoclue
++ * gc-iface-satellite.c - GInterface for org.freedesktop.Geoclue.Satellite
++ *
++ * Author: Sagnho Park <sangho.g.park@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifndef _GEOCLUE_SATELLITE_INFO_H
++#define _GEOCLUE_SATELLITE_INFO_H
++
++#include <geoclue/geoclue-provider.h>
++#include <geoclue/geoclue-types.h>
++
++G_BEGIN_DECLS
++
++#define GEOCLUE_SATELLITE_INFO (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
++#define GEOCLUE_SATELLITE_INFO_ARRAY (dbus_g_type_get_collection ("GPtrArray", GEOCLUE_SATELLITE_INFO))
++
++G_END_DECLS
++
++#endif
++
+Index: geoclue/geoclue/geoclue-satellite.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/geoclue-satellite.c 2011-12-29 16:40:38.922428900 +0900
+@@ -0,0 +1,199 @@
++/*
++ * Geoclue
++ * geoclue-satellite.c - Client API for accessing GcIfaceSatellite
++ *
++ * Author: Sagnho Park <sangho.g.park@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#include <geoclue/geoclue-satellite.h>
++#include <geoclue/geoclue-marshal.h>
++
++#include "gc-iface-satellite-bindings.h"
++
++typedef struct _GeoclueSatellitePrivate {
++ int dummy;
++} GeoclueSatellitePrivate;
++
++enum {
++ SATELLITE_CHANGED,
++ LAST_SIGNAL
++};
++
++static guint32 signals[LAST_SIGNAL] = {0, };
++
++#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GEOCLUE_TYPE_SATELLITE, GeoclueSatellitePrivate))
++
++G_DEFINE_TYPE (GeoclueSatellite, geoclue_satellite, GEOCLUE_TYPE_PROVIDER);
++
++static void
++finalize (GObject *object)
++{
++ G_OBJECT_CLASS (geoclue_satellite_parent_class)->finalize (object);
++}
++
++static void
++dispose (GObject *object)
++{
++ G_OBJECT_CLASS (geoclue_satellite_parent_class)->dispose (object);
++}
++
++static void
++satellite_changed (DBusGProxy *proxy,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info,
++ GeoclueSatellite *satellite)
++{
++ g_signal_emit (satellite, signals[SATELLITE_CHANGED], 0, timestamp, satellite_used, satellite_visible,
++ used_prn,sat_info);
++}
++
++static GObject *
++constructor (GType type,
++ guint n_props,
++ GObjectConstructParam *props)
++{
++ GObject *object;
++ GeoclueProvider *provider;
++
++ object = G_OBJECT_CLASS (geoclue_satellite_parent_class)->constructor (type, n_props, props);
++ provider = GEOCLUE_PROVIDER (object);
++
++ dbus_g_proxy_add_signal (provider->proxy, "SatelliteChanged",
++ G_TYPE_INT,
++ G_TYPE_INT,
++ G_TYPE_INT,
++ DBUS_TYPE_G_INT_ARRAY,
++ GEOCLUE_SATELLITE_INFO_ARRAY,
++ G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal (provider->proxy, "SatelliteChanged",
++ G_CALLBACK (satellite_changed),
++ object, NULL);
++
++ return object;
++}
++
++static void
++geoclue_satellite_class_init (GeoclueSatelliteClass *klass)
++{
++ GObjectClass *o_class = (GObjectClass *) klass;
++
++ o_class->finalize = finalize;
++ o_class->dispose = dispose;
++ o_class->constructor = constructor;
++
++ g_type_class_add_private (klass, sizeof (GeoclueSatellitePrivate));
++
++ signals[SATELLITE_CHANGED] = g_signal_new ("satellite-changed",
++ G_TYPE_FROM_CLASS (klass),
++ G_SIGNAL_RUN_FIRST |
++ G_SIGNAL_NO_RECURSE,
++ G_STRUCT_OFFSET (GeoclueSatelliteClass, satellite_changed),
++ NULL, NULL,
++ geoclue_marshal_VOID__INT_INT_INT_POINTER_POINTER,
++ G_TYPE_NONE, 5,
++ G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
++ G_TYPE_POINTER, G_TYPE_POINTER);
++}
++
++static void
++geoclue_satellite_init (GeoclueSatellite *satellite)
++{
++}
++
++GeoclueSatellite *
++geoclue_satellite_new (const char *service,
++ const char *path)
++{
++ return g_object_new (GEOCLUE_TYPE_SATELLITE,
++ "service", service,
++ "path", path,
++ "interface", GEOCLUE_SATELLITE_INTERFACE_NAME,
++ NULL);
++}
++
++gboolean
++geoclue_satellite_get_satellite (GeoclueSatellite *satellite,
++ int *timestamp,
++ int *satellite_used,
++ int *satellite_visible,
++ GArray **used_prn,
++ GPtrArray **sat_info,
++ GError **error)
++{
++ GeoclueProvider *provider = GEOCLUE_PROVIDER (satellite);
++ if (!org_freedesktop_Geoclue_Satellite_get_satellite (provider->proxy,
++ timestamp, satellite_used, satellite_visible,
++ used_prn, sat_info, error)) {
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++
++typedef struct _GeoclueSatelliteAsyncData {
++ GeoclueSatellite *satellite;
++ GCallback callback;
++ gpointer userdata;
++} GeoclueSatelliteAsyncData;
++
++static void
++get_satellite_async_callback (DBusGProxy *proxy,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info,
++ GError *error,
++ GeoclueSatelliteAsyncData *data)
++{
++ (*(GeoclueSatelliteCallback)data->callback) (data->satellite,
++ timestamp,
++ satellite_used,
++ satellite_visible,
++ used_prn,
++ sat_info,
++ error,
++ data->userdata);
++
++ g_free (data);
++}
++
++void
++geoclue_satellite_get_satellite_async (GeoclueSatellite *satellite,
++ GeoclueSatelliteCallback callback,
++ gpointer userdata)
++{
++ GeoclueProvider *provider = GEOCLUE_PROVIDER (satellite);
++ GeoclueSatelliteAsyncData *data;
++
++ data = g_new (GeoclueSatelliteAsyncData, 1);
++ data->satellite = satellite;
++ data->callback = G_CALLBACK (callback);
++ data->userdata = userdata;
++
++ org_freedesktop_Geoclue_Satellite_get_satellite_async (provider->proxy,
++ (org_freedesktop_Geoclue_Satellite_get_satellite_reply)get_satellite_async_callback,
++ data);
++}
+Index: geoclue/geoclue/geoclue-satellite.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/geoclue/geoclue-satellite.h 2011-12-29 16:40:38.922428900 +0900
+@@ -0,0 +1,84 @@
++/*
++ * Geoclue
++ * geoclue-satellite.h -
++ *
++ * Author: Sagnho Park <sangho.g.park@samsung.com>, Youngae Kang <youngae.kang@samsung.com>,
++ * Yunhan Kim <yhan.kim@samsung.com>, Genie Kim <daejins.kim@samsung.com>
++ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifndef _GEOCLUE_SATELLITE_H
++#define _GEOCLUE_SATELLITE_H
++
++#include <geoclue/geoclue-provider.h>
++#include <geoclue/geoclue-types.h>
++#include <geoclue/geoclue-satellite-info.h>
++
++G_BEGIN_DECLS
++
++#define GEOCLUE_TYPE_SATELLITE (geoclue_satellite_get_type ())
++#define GEOCLUE_SATELLITE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEOCLUE_TYPE_SATELLITE, GeoclueSatellite))
++#define GEOCLUE_IS_SATELLITE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEOCLUE_TYPE_SATELLITE))
++
++#define GEOCLUE_SATELLITE_INTERFACE_NAME "org.freedesktop.Geoclue.Satellite"
++
++typedef struct _GeoclueSatellite {
++ GeoclueProvider provider;
++} GeoclueSatellite;
++
++typedef struct _GeoclueSatelliteClass {
++ GeoclueProviderClass provider_class;
++
++ void (* satellite_changed) (GeoclueSatellite *satellite,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info);
++} GeoclueSatelliteClass;
++
++GType geoclue_satellite_get_type (void);
++
++GeoclueSatellite *geoclue_satellite_new (const char *service,
++ const char *path);
++
++gboolean geoclue_satellite_get_satellite (GeoclueSatellite *satellite,
++ int *timestamp,
++ int *satellite_used,
++ int *satellite_visible,
++ GArray **used_prn,
++ GPtrArray **sat_info,
++ GError **error);
++
++typedef void (*GeoclueSatelliteCallback) (GeoclueSatellite *satellite,
++ int timestamp,
++ int satellite_used,
++ int satellite_visible,
++ GArray *used_prn,
++ GPtrArray *sat_info,
++ GError *error,
++ gpointer userdata);
++
++void geoclue_satellite_get_satellite_async (GeoclueSatellite *satellite,
++ GeoclueSatelliteCallback callback,
++ gpointer userdata);
++
++G_END_DECLS
++
++#endif
+Index: geoclue/geoclue/geoclue-types.c
+===================================================================
+--- geoclue.orig/geoclue/geoclue-types.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/geoclue/geoclue-types.c 2011-12-29 16:40:38.926428900 +0900
+@@ -1,6 +1,6 @@
+ /*
+ * Geoclue
+- * geoclue-types.c -
++ * geoclue-types.c -
+ *
+ * Author: Iain Holmes <iain@openedhand.com>
+ * Copyright 2007 by Garmin Ltd. or its subsidiaries
+@@ -25,16 +25,12 @@
+ #include <geoclue/geoclue-marshal.h>
+ #include <geoclue/geoclue-types.h>
+ #include <geoclue/geoclue-accuracy.h>
++#include <geoclue/geoclue-satellite.h>
+ #include <geoclue/geoclue-error.h>
+
+-static gboolean initted = FALSE;
+-
+ void
+ geoclue_types_init (void)
+ {
+- if (initted != FALSE)
+- return;
+-
+ dbus_g_object_register_marshaller (geoclue_marshal_VOID__INT_INT_DOUBLE_DOUBLE_DOUBLE,
+ G_TYPE_NONE,
+ G_TYPE_INT,
+@@ -43,7 +39,8 @@
+ G_TYPE_DOUBLE,
+ G_TYPE_DOUBLE,
+ G_TYPE_INVALID);
+- dbus_g_object_register_marshaller (geoclue_marshal_VOID__INT_INT_DOUBLE_DOUBLE_DOUBLE_BOXED,
++
++ dbus_g_object_register_marshaller (geoclue_marshal_VOID__INT_INT_DOUBLE_DOUBLE_DOUBLE_BOXED,
+ G_TYPE_NONE,
+ G_TYPE_INT,
+ G_TYPE_INT,
+@@ -52,14 +49,14 @@
+ G_TYPE_DOUBLE,
+ G_TYPE_BOXED,
+ G_TYPE_INVALID);
+-
++
+ dbus_g_object_register_marshaller (geoclue_marshal_VOID__INT_BOXED_BOXED,
+ G_TYPE_NONE,
+ G_TYPE_INT,
+ G_TYPE_BOXED,
+ G_TYPE_BOXED,
+ G_TYPE_INVALID);
+-
++
+ dbus_g_object_register_marshaller (geoclue_marshal_VOID__STRING_STRING_STRING_STRING,
+ G_TYPE_NONE,
+ G_TYPE_STRING,
+@@ -68,9 +65,24 @@
+ G_TYPE_STRING,
+ G_TYPE_INVALID);
+
++ dbus_g_object_register_marshaller (geoclue_marshal_VOID__INT_STRING,
++ G_TYPE_NONE,
++ G_TYPE_INT,
++ G_TYPE_STRING,
++ G_TYPE_INVALID);
++
++ dbus_g_object_register_marshaller (geoclue_marshal_VOID__INT_INT_INT_POINTER_POINTER,
++ G_TYPE_NONE,
++ G_TYPE_INT,
++ G_TYPE_INT,
++ G_TYPE_INT,
++ DBUS_TYPE_G_INT_ARRAY,
++ GEOCLUE_SATELLITE_INFO_ARRAY,
++ G_TYPE_INVALID);
++
+ dbus_g_error_domain_register (GEOCLUE_ERROR,
+ GEOCLUE_ERROR_DBUS_INTERFACE,
+ GEOCLUE_TYPE_ERROR);
+
+- initted = TRUE;
++
+ }
+Index: geoclue/geoclue/geoclue-types.h
+===================================================================
+--- geoclue.orig/geoclue/geoclue-types.h 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/geoclue/geoclue-types.h 2011-12-29 16:40:38.926428900 +0900
+@@ -29,13 +29,13 @@
+
+ /**
+ * SECTION:geoclue-types
+- * @short_description: Type definitions and defines useful for Geoclue clients
++ * @short_description: Type definitions and defines useful for Geoclue clients
+ **/
+
+
+ /**
+ * GeoclueStatus
+- *
++ *
+ * defines the provider status
+ **/
+ typedef enum {
+@@ -48,12 +48,8 @@
+ /**
+ * GeoclueAccuracyLevel:
+ *
+- * Enum values used to define the approximate accuracy of
+- * Position or Address information. These are ordered in
+- * from lowest accuracy possible to highest accuracy possible.
+- * geoclue_accuracy_get_details() can be used to get get the
+- * current accuracy. It is up to the provider to set the
+- * accuracy based on analysis of its queries.
++ * Enum values used to define the approximate accuracy of
++ * Position or Address information.
+ **/
+ typedef enum {
+ GEOCLUE_ACCURACY_LEVEL_NONE = 0,
+@@ -68,15 +64,15 @@
+ /**
+ * GeocluePositionFields:
+ *
+- * #GeocluePositionFields is a bitfield that defines the validity of
++ * #GeocluePositionFields is a bitfield that defines the validity of
+ * Position values.
+- *
++ *
+ * Example:
+ * <informalexample>
+ * <programlisting>
+ * GeocluePositionFields fields;
+ * fields = geoclue_position_get_position (. . .);
+- *
++ *
+ * if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+ * fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+ * g_print("latitude and longitude are valid");
+@@ -94,7 +90,7 @@
+ /**
+ * GeoclueVelocityFields:
+ *
+- * GeoclueVelocityFields is a bitfield that defines the validity of
++ * GeoclueVelocityFields is a bitfield that defines the validity of
+ * Velocity values.
+ **/
+ typedef enum {
+@@ -106,55 +102,55 @@
+
+ /**
+ * GEOCLUE_ADDRESS_KEY_COUNTRYCODE:
+- *
+- * A key for address hashtables. The hash value should be a ISO 3166 two
+- * letter country code.
+- *
+- * The used hash keys match the elements of XEP-0080 (XMPP protocol
+- * extension for user location), see
++ *
++ * A key for address hashtables. The hash value should be a ISO 3166 two
++ * letter country code.
++ *
++ * The used hash keys match the elements of XEP-0080 (XMPP protocol
++ * extension for user location), see
+ * <ulink url="http://www.xmpp.org/extensions/xep-0080.html">
+ * http://www.xmpp.org/extensions/xep-0080.html</ulink>
+ */
+ #define GEOCLUE_ADDRESS_KEY_COUNTRYCODE "countrycode"
+ /**
+ * GEOCLUE_ADDRESS_KEY_COUNTRY:
+- *
+- * A key for address hashtables. The hash value should be a name of a country.
++ *
++ * A key for address hashtables. The hash value should be a name of a country.
+ */
+ #define GEOCLUE_ADDRESS_KEY_COUNTRY "country"
+ /**
+ * GEOCLUE_ADDRESS_KEY_REGION:
+- *
+- * A key for address hashtables. The hash value should be a name of an
++ *
++ * A key for address hashtables. The hash value should be a name of an
+ * administrative region of a nation, e.g. province or
+- * US state.
++ * US state.
+ */
+-#define GEOCLUE_ADDRESS_KEY_REGION "region"
++#define GEOCLUE_ADDRESS_KEY_REGION "region"
+ /**
+ * GEOCLUE_ADDRESS_KEY_LOCALITY:
+- *
+- * A key for address hashtables. The hash value should be a name of a town
+- * or city.
++ *
++ * A key for address hashtables. The hash value should be a name of a town
++ * or city.
+ */
+ #define GEOCLUE_ADDRESS_KEY_LOCALITY "locality"
+ /**
+ * GEOCLUE_ADDRESS_KEY_AREA:
+- *
+- * A key for address hashtables. The hash value should be a name of an
+- * area, such as neighborhood or campus.
++ *
++ * A key for address hashtables. The hash value should be a name of an
++ * area, such as neighborhood or campus.
+ */
+ #define GEOCLUE_ADDRESS_KEY_AREA "area"
+ /**
+ * GEOCLUE_ADDRESS_KEY_POSTALCODE:
+- *
+- * A key for address hashtables. The hash value should be a code used for
++ *
++ * A key for address hashtables. The hash value should be a code used for
+ * postal delivery.
+ */
+ #define GEOCLUE_ADDRESS_KEY_POSTALCODE "postalcode"
+ /**
+ * GEOCLUE_ADDRESS_KEY_STREET:
+- *
+- * A key for address hashtables. The hash value should be a partial or full street
++ *
++ * A key for address hashtables. The hash value should be a partial or full street
+ * address.
+ */
+ #define GEOCLUE_ADDRESS_KEY_STREET "street"
+@@ -162,15 +158,15 @@
+ /**
+ * GeoclueResourceFlags:
+ *
+- * bitfield that represents a set of physical resources.
+- *
++ * bitfield that represents a set of physical resources.
++ *
+ **/
+ typedef enum _GeoclueResourceFlags {
+ GEOCLUE_RESOURCE_NONE = 0,
+ GEOCLUE_RESOURCE_NETWORK = 1 << 0,
+ GEOCLUE_RESOURCE_CELL = 1 << 1,
+ GEOCLUE_RESOURCE_GPS = 1 << 2,
+-
++
+ GEOCLUE_RESOURCE_ALL = (1 << 10) - 1
+ } GeoclueResourceFlags;
+
+@@ -178,8 +174,8 @@
+ /**
+ * GeoclueNetworkStatus:
+ *
+- * Enumeration for current network status.
+- *
++ * Enumeration for current network status.
++ *
+ **/
+ typedef enum {
+ GEOCLUE_CONNECTIVITY_UNKNOWN,
+Index: geoclue/interfaces/Makefile.am
+===================================================================
+--- geoclue.orig/interfaces/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/interfaces/Makefile.am 2011-12-29 16:40:38.930428900 +0900
+@@ -1,15 +1,17 @@
+ %.xml: %-full.xml
+- $(AM_V_GEN) $(XSLT) -o $@ $(top_srcdir)/docs/tools/spec-strip-docs.xsl $<
++ $(XSLT) -o $@ $(top_srcdir)/docs/tools/spec-strip-docs.xsl $<
+
+ noinst_DATA = \
+ gc-iface-geoclue.xml \
+ gc-iface-position.xml \
++ gc-iface-nmea.xml \
+ gc-iface-address.xml \
+ gc-iface-geocode.xml \
+ gc-iface-master.xml \
+ gc-iface-master-client.xml \
+ gc-iface-reverse-geocode.xml \
+- gc-iface-velocity.xml
++ gc-iface-velocity.xml \
++ gc-iface-satellite.xml
+
+ BUILT_SOURCES = $(noinst_DATA)
+ CLEANFILES = $(BUILT_SOURCES)
+@@ -17,9 +19,11 @@
+ EXTRA_DIST = \
+ gc-iface-geoclue-full.xml \
+ gc-iface-position-full.xml \
++ gc-iface-nmea-full.xml \
+ gc-iface-address-full.xml \
+ gc-iface-geocode-full.xml \
+ gc-iface-master-full.xml \
+ gc-iface-master-client-full.xml \
+ gc-iface-reverse-geocode-full.xml \
+- gc-iface-velocity-full.xml
++ gc-iface-velocity-full.xml \
++ gc-iface-satellite-full.xml
+Index: geoclue/interfaces/gc-iface-geoclue-full.xml
+===================================================================
+--- geoclue.orig/interfaces/gc-iface-geoclue-full.xml 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/interfaces/gc-iface-geoclue-full.xml 2011-12-29 16:40:38.930428900 +0900
+@@ -1,14 +1,14 @@
+ <?xml version="1.0" encoding="UTF-8" ?>
+
+ <node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+-
++
+ <interface name="org.freedesktop.Geoclue">
+ <doc:doc>
+- <doc:para>Geoclue interface contains methods
++ <doc:para>Geoclue interface contains methods
+ and signals common to all providers (and all providers
+ must implement at least this interface).</doc:para>
+ </doc:doc>
+-
++
+ <method name="GetProviderInfo">
+ <arg type="s" name="Name" direction="out">
+ <doc:doc>
+@@ -21,7 +21,7 @@
+ </doc:doc>
+ </arg>
+ </method>
+-
++
+ <method name="GetStatus">
+ <arg type="i" name="status" direction="out" >
+ <doc:doc>
+@@ -39,20 +39,20 @@
+ </signal>
+
+ <method name="SetOptions">
+- <arg type="a{sv}" name="options" direction="in" />
++ <arg type="a{ss}" name="options" direction="in" />
+ </method>
+-
++
+ <method name="AddReference">
+ <doc:doc>
+- <doc:description>Increase the reference count on the provider.
+- Provider may shutdown if reference count reaches zero, so
++ <doc:description>Increase the reference count on the provider.
++ Provider may shutdown if reference count reaches zero, so
+ using AddReference()/RemoveReference is important for clients needing server
+ persistence -- basically any client that uses SetOptions() or connects to
+ signals.</doc:description>
+ </doc:doc>
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ </method>
+-
++
+ <method name="RemoveReference">
+ <doc:doc>
+ <doc:description>Decrease the reference count on the provider</doc:description>
+Index: geoclue/interfaces/gc-iface-nmea-full.xml
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/interfaces/gc-iface-nmea-full.xml 2011-12-29 16:40:38.930428900 +0900
+@@ -0,0 +1,21 @@
++<?xml version="1.0" encoding="UTF-8" ?>
++
++<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
++
++ <interface name="org.freedesktop.Geoclue.Nmea">
++ <doc:doc>
++ <doc:para>Nmea interface contains a method
++ and a signal for querying current coordinates.</doc:para>
++ </doc:doc>
++
++ <method name="GetNmea">
++ <arg type="i" name="timestamp" direction="out" />
++ <arg type="s" name="nmea_data" direction="out" />
++ </method>
++
++ <signal name="NmeaChanged">
++ <arg type="i" name="timestamp" />
++ <arg type="s" name="nmea_data" />
++ </signal>
++ </interface>
++</node>
+Index: geoclue/interfaces/gc-iface-satellite-full.xml
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/interfaces/gc-iface-satellite-full.xml 2011-12-29 16:40:38.930428900 +0900
+@@ -0,0 +1,21 @@
++<?xml version="1.0" encoding="UTF-8" ?>
++
++<node name="/">
++ <interface name="org.freedesktop.Geoclue.Satellite">
++ <method name="GetSatellite">
++ <arg type="i" name="timestamp" direction="out" />
++ <arg type="i" name="satellite_used" direction="out" />
++ <arg type="i" name="satellite_visible" direction="out" />
++ <arg type="ai" name="used_prn" direction="out" />
++ <arg type="a(iiii)" name="sat_info" direction="out" />
++ </method>
++
++ <signal name="SatelliteChanged">
++ <arg type="i" name="timestamp" />
++ <arg type="i" name="satellite_used" />
++ <arg type="i" name="satellite_visible" />
++ <arg type="ai" name="used_prn" />
++ <arg type="a(iiii)" name="sat_info" />
++ </signal>
++ </interface>
++</node>
+Index: geoclue/providers/example/Makefile.am
+===================================================================
+--- geoclue.orig/providers/example/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/example/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -20,7 +20,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/example/geoclue-example.c
+===================================================================
+--- geoclue.orig/providers/example/geoclue-example.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/example/geoclue-example.c 2011-12-29 16:40:38.926428900 +0900
+@@ -62,10 +62,7 @@
+ gpointer value,
+ gpointer data)
+ {
+- if (G_VALUE_TYPE (value) == G_TYPE_STRING)
+- g_print (" %s - %s\n", key, g_value_get_string (value));
+- else
+- g_print (" %s - %d\n", key, g_value_get_int (value));
++ g_print (" %s - %s\n", key, value);
+ }
+
+ static gboolean
+@@ -82,7 +79,7 @@
+ shutdown (GcProvider *provider)
+ {
+ GeoclueExample *example = GEOCLUE_EXAMPLE (provider);
+-
++
+ g_main_loop_quit (example->loop);
+ }
+
+@@ -138,9 +135,9 @@
+
+ accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE,
+ 0.0, 0.0);
+-
+- gc_iface_position_emit_position_changed
+- (GC_IFACE_POSITION (example),
++
++ gc_iface_position_emit_position_changed
++ (GC_IFACE_POSITION (example),
+ GEOCLUE_POSITION_FIELDS_NONE,
+ time (NULL), 0.0, 0.0, 0.0, accuracy);
+
+Index: geoclue/providers/geonames/Makefile.am
+===================================================================
+--- geoclue.orig/providers/geonames/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/geonames/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -15,7 +15,7 @@
+
+ geoclue_geonames_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/geoclue/libgeoclue.la
++ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-geonames.provider
+@@ -25,7 +25,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/gpsd/Makefile.am
+===================================================================
+--- geoclue.orig/providers/gpsd/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/gpsd/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -6,9 +6,13 @@
+ $(GEOCLUE_CFLAGS) \
+ $(GPSD_CFLAGS)
+
++geoclue_gpsd_LDFLAGS = \
++ -Wl,--warn-unresolved-symbols
++
+ geoclue_gpsd_LDADD = \
+ $(GEOCLUE_LIBS) \
+ $(GPSD_LIBS) \
++ -lm \
+ $(top_builddir)/geoclue/libgeoclue.la
+
+ geoclue_gpsd_SOURCES = \
+@@ -22,7 +26,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/gpsd/geoclue-gpsd.c
+===================================================================
+--- geoclue.orig/providers/gpsd/geoclue-gpsd.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/gpsd/geoclue-gpsd.c 2011-12-29 16:40:38.926428900 +0900
+@@ -23,10 +23,10 @@
+ */
+
+ /* TODO:
+- *
+- * call to gps_set_callback blocks for a long time if
++ *
++ * call to gps_set_callback blocks for a long time if
+ * BT device is not present.
+- *
++ *
+ **/
+
+ #include <config.h>
+@@ -55,19 +55,19 @@
+
+ typedef struct {
+ GcProvider parent;
+-
++
+ char *host;
+ char *port;
+-
++
+ gps_data *gpsdata;
+-
++
+ gps_fix *last_fix;
+-
++
+ GeoclueStatus last_status;
+ GeocluePositionFields last_pos_fields;
+ GeoclueAccuracy *last_accuracy;
+ GeoclueVelocityFields last_velo_fields;
+-
++
+ GMainLoop *loop;
+
+ } GeoclueGpsd;
+@@ -105,7 +105,7 @@
+ GError **error)
+ {
+ GeoclueGpsd *gpsd = GEOCLUE_GPSD (gc);
+-
++
+ *status = gpsd->last_status;
+ return TRUE;
+ }
+@@ -114,7 +114,7 @@
+ shutdown (GcProvider *provider)
+ {
+ GeoclueGpsd *gpsd = GEOCLUE_GPSD (provider);
+-
++
+ g_main_loop_quit (gpsd->loop);
+ }
+
+@@ -123,12 +123,13 @@
+ {
+ if (status != self->last_status) {
+ self->last_status = status;
+-
++
+ /* make position and velocity invalid if no fix */
+ if (status != GEOCLUE_STATUS_AVAILABLE) {
+ self->last_pos_fields = GEOCLUE_POSITION_FIELDS_NONE;
+ self->last_velo_fields = GEOCLUE_VELOCITY_FIELDS_NONE;
+ }
++ g_debug("status changed [%d]", status);
+ gc_iface_geoclue_emit_status_changed (GC_IFACE_GEOCLUE (self),
+ status);
+ }
+@@ -140,31 +141,28 @@
+ GError **error)
+ {
+ GeoclueGpsd *gpsd = GEOCLUE_GPSD (gc);
+- GValue *port_value, *host_value;
+- const char *port, *host;
++ char *port, *host;
+ gboolean changed = FALSE;
+
+- host_value = g_hash_table_lookup (options,
+- "org.freedesktop.Geoclue.GPSHost");
+- host = host_value ? g_value_get_string (host_value) : NULL;
+- port_value = g_hash_table_lookup (options,
+- "org.freedesktop.Geoclue.GPSPort");
+- port = port_value ? g_value_get_string (port_value) : NULL;
++ host = g_hash_table_lookup (options,
++ "org.freedesktop.Geoclue.GPSHost");
++ port = g_hash_table_lookup (options,
++ "org.freedesktop.Geoclue.GPSPort");
+
+ if (port == NULL) {
+ port = DEFAULT_GPSD_PORT;
+ }
+-
++
+ /* new values? */
+ if (g_strcmp0 (host, gpsd->host) != 0 ||
+ g_strcmp0 (port, gpsd->port) != 0) {
+ changed = TRUE;
+ }
+-
++
+ if (!changed) {
+ return TRUE;
+ }
+-
++
+ /* update private values with new ones, restart gpsd */
+ g_free (gpsd->port);
+ gpsd->port = NULL;
+@@ -192,16 +190,16 @@
+ finalize (GObject *object)
+ {
+ GeoclueGpsd *gpsd = GEOCLUE_GPSD (object);
+-
++
+ geoclue_gpsd_stop_gpsd (gpsd);
+ g_free (gpsd->last_fix);
+ geoclue_accuracy_free (gpsd->last_accuracy);
+-
++
+ g_free (gpsd->port);
+ if (gpsd->host) {
+ g_free (gpsd->host);
+ }
+-
++
+ ((GObjectClass *) geoclue_gpsd_parent_class)->finalize (object);
+ }
+
+@@ -210,9 +208,9 @@
+ {
+ GObjectClass *o_class = (GObjectClass *) klass;
+ GcProviderClass *p_class = (GcProviderClass *) klass;
+-
++
+ o_class->finalize = finalize;
+-
++
+ p_class->get_status = get_status;
+ p_class->set_options = set_options;
+ p_class->shutdown = shutdown;
+@@ -229,160 +227,139 @@
+ }
+
+ static void
+-geoclue_gpsd_update_position (GeoclueGpsd *gpsd, NmeaTag nmea_tag)
++geoclue_gpsd_update_position (GeoclueGpsd *gpsd)
+ {
++ if(gpsd->last_status != GEOCLUE_STATUS_AVAILABLE)
++ return;
++
+ gps_fix *fix = &gpsd->gpsdata->fix;
+ gps_fix *last_fix = gpsd->last_fix;
+-
+- last_fix->time = fix->time;
+-
+- /* If a flag is not set, bail out.*/
+- if (!((gpsd->gpsdata->set & LATLON_SET) || (gpsd->gpsdata->set & ALTITUDE_SET))) {
+- return;
+- }
+- gpsd->gpsdata->set &= ~(LATLON_SET | ALTITUDE_SET);
+-
++
++
++ if (isnan(fix->time)==0){
++ last_fix->time = fix->time;
++ }
+ if (equal_or_nan (fix->latitude, last_fix->latitude) &&
+ equal_or_nan (fix->longitude, last_fix->longitude) &&
+ equal_or_nan (fix->altitude, last_fix->altitude)) {
+- /* position has not changed */
+ return;
+ }
+-
+ /* save values */
+- last_fix->latitude = fix->latitude;
+- last_fix->longitude = fix->longitude;
+- last_fix->altitude = fix->altitude;
+-
+- /* Could use fix.eph for accuracy, but eph is
+- * often NaN... what then?
+- * Could also use fix mode (2d/3d) to decide vertical accuracy,
+- * but gpsd updates that so erratically that I couldn't
+- * be arsed so far */
++ if (fix->mode >= MODE_2D && isnan(fix->latitude)==0) {
++ last_fix->latitude = fix->latitude;
++ }
++ if (fix->mode >= MODE_2D && isnan(fix->longitude)==0) {
++ last_fix->longitude = fix->longitude;
++ }
++ if (fix->mode == MODE_3D && isnan(fix->altitude)==0){
++ last_fix->altitude = fix->altitude;
++ }
++
++ if (isnan(fix->epx)==0){
++ last_fix->epx = fix->epx;
++ }
++ if (isnan(fix->epy)==0){
++ last_fix->epy = fix->epy;
++ }
++ if (isnan(fix->epv)==0){
++ last_fix->epv = fix->epv;
++ }
+ geoclue_accuracy_set_details (gpsd->last_accuracy,
+ GEOCLUE_ACCURACY_LEVEL_DETAILED,
+- 24, 60);
+-
++ sqrt(pow(last_fix->epx, 2)+pow(last_fix->epy, 2)), fix->epv);
+ gpsd->last_pos_fields = GEOCLUE_POSITION_FIELDS_NONE;
+- gpsd->last_pos_fields |= (isnan (fix->latitude)) ?
++ gpsd->last_pos_fields |= (isnan (fix->latitude)) ?
+ 0 : GEOCLUE_POSITION_FIELDS_LATITUDE;
+- gpsd->last_pos_fields |= (isnan (fix->longitude)) ?
++ gpsd->last_pos_fields |= (isnan (fix->longitude)) ?
+ 0 : GEOCLUE_POSITION_FIELDS_LONGITUDE;
+- gpsd->last_pos_fields |= (isnan (fix->altitude)) ?
++ gpsd->last_pos_fields |= (isnan (fix->altitude)) ?
+ 0 : GEOCLUE_POSITION_FIELDS_ALTITUDE;
+-
+- gc_iface_position_emit_position_changed
++
++ g_debug("Update position: %lf, %lf, %lf, fields:0x%x, Accuracy level: %d, vert:%lf hori:%lf",
++ last_fix->latitude, last_fix->longitude, last_fix->altitude, gpsd->last_pos_fields,
++ GEOCLUE_ACCURACY_LEVEL_DETAILED, sqrt(pow(last_fix->epx, 2)+pow(last_fix->epy, 2)), fix->epv);
++ gc_iface_position_emit_position_changed
+ (GC_IFACE_POSITION (gpsd), gpsd->last_pos_fields,
+- (int)(last_fix->time+0.5),
+- last_fix->latitude, last_fix->longitude, last_fix->altitude,
++ (int)(last_fix->time+0.5),
++ last_fix->latitude, last_fix->longitude, last_fix->altitude,
+ gpsd->last_accuracy);
+-
++
+ }
+
+ static void
+-geoclue_gpsd_update_velocity (GeoclueGpsd *gpsd, NmeaTag nmea_tag)
++geoclue_gpsd_update_velocity (GeoclueGpsd *gpsd)
+ {
++ if(gpsd->last_status != GEOCLUE_STATUS_AVAILABLE)
++ return;
++
+ gps_fix *fix = &gpsd->gpsdata->fix;
+ gps_fix *last_fix = gpsd->last_fix;
+- gboolean changed = FALSE;
+-
+- /* at least with my devices, gpsd updates
+- * - climb on GGA, GSA and GSV messages (speed and track are set to NaN).
+- * - speed and track on RMC message (climb is set to NaN).
+- *
+- * couldn't think of an smart way to handle this, I don't think there is one
+- */
+-
+- if (((gpsd->gpsdata->set & TRACK_SET) || (gpsd->gpsdata->set & SPEED_SET)) &&
+- nmea_tag == NMEA_RMC) {
+-
+- gpsd->gpsdata->set &= ~(TRACK_SET | SPEED_SET);
+-
+- last_fix->time = fix->time;
+-
+- if (!equal_or_nan (fix->track, last_fix->track) ||
+- !equal_or_nan (fix->speed, last_fix->speed)){
+-
+- /* velocity has changed */
+- changed = TRUE;
+- last_fix->track = fix->track;
+- last_fix->speed = fix->speed;
+- }
+- } else if ((gpsd->gpsdata->set & CLIMB_SET) &&
+- (nmea_tag == NMEA_GGA ||
+- nmea_tag == NMEA_GSA ||
+- nmea_tag == NMEA_GSV)) {
+-
+- gpsd->gpsdata->set &= ~(CLIMB_SET);
+-
++
++ if (isnan(fix->time)==0){
+ last_fix->time = fix->time;
+-
+- if (!equal_or_nan (fix->climb, last_fix->climb)){
+-
+- /* velocity has changed */
+- changed = TRUE;
+- last_fix->climb = fix->climb;
+- }
++ }
++ if (equal_or_nan (fix->track, last_fix->track) &&
++ equal_or_nan (fix->speed, last_fix->speed) &&
++ equal_or_nan (fix->climb, last_fix->climb)) {
++ return;
++ }
++ if (fix->mode >= MODE_2D && isnan(fix->track)==0){
++ last_fix->track = fix->track;
+ }
+-
+- if (changed) {
+- gpsd->last_velo_fields = GEOCLUE_VELOCITY_FIELDS_NONE;
+- gpsd->last_velo_fields |= (isnan (last_fix->track)) ?
+- 0 : GEOCLUE_VELOCITY_FIELDS_DIRECTION;
+- gpsd->last_velo_fields |= (isnan (last_fix->speed)) ?
+- 0 : GEOCLUE_VELOCITY_FIELDS_SPEED;
+- gpsd->last_velo_fields |= (isnan (last_fix->climb)) ?
+- 0 : GEOCLUE_VELOCITY_FIELDS_CLIMB;
+-
+- gc_iface_velocity_emit_velocity_changed
+- (GC_IFACE_VELOCITY (gpsd), gpsd->last_velo_fields,
+- (int)(last_fix->time+0.5),
+- last_fix->speed, last_fix->track, last_fix->climb);
++ if (fix->mode >= MODE_2D && isnan(fix->speed)==0){
++ last_fix->speed = fix->speed;
+ }
++ if (fix->mode >= MODE_3D && isnan(fix->climb)==0){
++ last_fix->climb = fix->climb;
++ }
++
++ g_debug("Update velocity: %lf, %lf, %lf", last_fix->track, last_fix->speed, last_fix->climb);
++ gpsd->last_velo_fields = GEOCLUE_VELOCITY_FIELDS_NONE;
++ gpsd->last_velo_fields |= (isnan (last_fix->track)) ?
++ 0 : GEOCLUE_VELOCITY_FIELDS_DIRECTION;
++ gpsd->last_velo_fields |= (isnan (last_fix->speed)) ?
++ 0 : GEOCLUE_VELOCITY_FIELDS_SPEED;
++ gpsd->last_velo_fields |= (isnan (last_fix->climb)) ?
++ 0 : GEOCLUE_VELOCITY_FIELDS_CLIMB;
++
++ gc_iface_velocity_emit_velocity_changed
++ (GC_IFACE_VELOCITY (gpsd), gpsd->last_velo_fields,
++ (int)(last_fix->time+0.5),
++ last_fix->speed, last_fix->track, last_fix->climb);
+ }
+
+ static void
+-geoclue_gpsd_update_status (GeoclueGpsd *gpsd, NmeaTag nmea_tag)
++geoclue_gpsd_update_status (GeoclueGpsd *gpsd)
+ {
+ GeoclueStatus status;
+-
++
+ /* gpsdata->online is supposedly always up-to-date */
+ if (gpsd->gpsdata->online <= 0) {
+ status = GEOCLUE_STATUS_UNAVAILABLE;
+ } else if (gpsd->gpsdata->set & STATUS_SET) {
+ gpsd->gpsdata->set &= ~(STATUS_SET);
+-
+ if (gpsd->gpsdata->status > 0) {
+ status = GEOCLUE_STATUS_AVAILABLE;
+ } else {
+ status = GEOCLUE_STATUS_ACQUIRING;
+ }
+ } else {
++ status = GEOCLUE_STATUS_AVAILABLE;
+ return;
+ }
+-
++
+ geoclue_gpsd_set_status (gpsd, status);
+ }
+
+-static void
+-gpsd_raw_hook (struct gps_data_t *gpsdata, char *message, size_t len)
++static void
++gpsd_raw_hook (gps_data *gpsdata, char *message, size_t len)
+ {
+- char *tag_str = gpsd->gpsdata->tag;
+- NmeaTag nmea_tag = NMEA_NONE;
+-
+- if (tag_str[0] == 'G' && tag_str[1] == 'S' && tag_str[2] == 'A') {
+- nmea_tag = NMEA_GSA;
+- } else if (tag_str[0] == 'G' && tag_str[1] == 'G' && tag_str[2] == 'A') {
+- nmea_tag = NMEA_GGA;
+- } else if (tag_str[0] == 'G' && tag_str[1] == 'S' && tag_str[2] == 'V') {
+- nmea_tag = NMEA_GSV;
+- } else if (tag_str[0] == 'R' && tag_str[1] == 'M' && tag_str[2] == 'C') {
+- nmea_tag = NMEA_RMC;
+- }
+-
+- geoclue_gpsd_update_status (gpsd, nmea_tag);
+- geoclue_gpsd_update_position (gpsd, nmea_tag);
+- geoclue_gpsd_update_velocity (gpsd, nmea_tag);
++ if(gpsdata == NULL)
++ return;
++
++ geoclue_gpsd_update_status (gpsd);
++ geoclue_gpsd_update_position (gpsd);
++ geoclue_gpsd_update_velocity (gpsd);
+ }
+
+ static void
+@@ -399,7 +376,7 @@
+ {
+ self->gpsdata = gps_open (self->host, self->port);
+ if (self->gpsdata) {
+- gps_stream(self->gpsdata, WATCH_ENABLE | WATCH_NMEA | POLL_NONBLOCK, NULL);
++ gps_stream(self->gpsdata, WATCH_ENABLE | WATCH_NEWSTYLE, NULL);
+ gps_set_raw_hook (self->gpsdata, gpsd_raw_hook);
+ return TRUE;
+ } else {
+@@ -427,18 +404,19 @@
+ {
+ self->gpsdata = NULL;
+ self->last_fix = g_new0 (gps_fix, 1);
+-
++
+ self->last_pos_fields = GEOCLUE_POSITION_FIELDS_NONE;
+ self->last_velo_fields = GEOCLUE_VELOCITY_FIELDS_NONE;
+ self->last_accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0, 0);
+-
++
+ gc_provider_set_details (GC_PROVIDER (self),
+ "org.freedesktop.Geoclue.Providers.Gpsd",
+ "/org/freedesktop/Geoclue/Providers/Gpsd",
+ "Gpsd", "Gpsd provider");
+-
++
+ self->port = g_strdup (DEFAULT_GPSD_PORT);
+- self->host = NULL;
++ self->host = g_strdup ("localhost");
++
+ geoclue_gpsd_set_status (self, GEOCLUE_STATUS_ACQUIRING);
+ if (!geoclue_gpsd_start_gpsd (self)) {
+ geoclue_gpsd_set_status (self, GEOCLUE_STATUS_ERROR);
+@@ -456,14 +434,14 @@
+ GError **error)
+ {
+ GeoclueGpsd *gpsd = GEOCLUE_GPSD (gc);
+-
++
+ *timestamp = (int)(gpsd->last_fix->time+0.5);
+ *latitude = gpsd->last_fix->latitude;
+ *longitude = gpsd->last_fix->longitude;
+ *altitude = gpsd->last_fix->altitude;
+ *fields = gpsd->last_pos_fields;
+ *accuracy = geoclue_accuracy_copy (gpsd->last_accuracy);
+-
++
+ return TRUE;
+ }
+
+@@ -483,13 +461,13 @@
+ GError **error)
+ {
+ GeoclueGpsd *gpsd = GEOCLUE_GPSD (gc);
+-
++
+ *timestamp = (int)(gpsd->last_fix->time+0.5);
+ *speed = gpsd->last_fix->speed;
+ *direction = gpsd->last_fix->track;
+ *climb = gpsd->last_fix->climb;
+ *fields = gpsd->last_velo_fields;
+-
++
+ return TRUE;
+ }
+
+@@ -504,16 +482,16 @@
+ char **argv)
+ {
+ g_type_init ();
+-
++
+ gpsd = g_object_new (GEOCLUE_TYPE_GPSD, NULL);
+-
++
+ gpsd->loop = g_main_loop_new (NULL, TRUE);
+ g_timeout_add(500, gpsd_poll, (gpointer)gpsd);
+
+ g_main_loop_run (gpsd->loop);
+-
++
+ g_main_loop_unref (gpsd->loop);
+ g_object_unref (gpsd);
+-
++
+ return 0;
+ }
+Index: geoclue/providers/gsmloc/Makefile.am
+===================================================================
+--- geoclue.orig/providers/gsmloc/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/gsmloc/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -7,9 +7,7 @@
+ ofono-manager-bindings.h \
+ ofono-modem-bindings.h \
+ ofono-network-registration-bindings.h \
+- ofono-network-operator-bindings.h \
+- mm-marshal.c \
+- mm-marshal.h
++ ofono-network-operator-bindings.h
+
+ BUILT_SOURCES = \
+ $(nodist_geoclue_gsmloc_SOURCES)
+@@ -18,9 +16,7 @@
+ mcc.h \
+ geoclue-gsmloc.c \
+ geoclue-gsmloc-ofono.c \
+- geoclue-gsmloc-ofono.h \
+- geoclue-gsmloc-mm.c \
+- geoclue-gsmloc-mm.h
++ geoclue-gsmloc-ofono.h
+
+
+ geoclue_gsmloc_CFLAGS = \
+@@ -30,7 +26,7 @@
+
+ geoclue_gsmloc_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/geoclue/libgeoclue.la
++ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-gsmloc.provider
+@@ -40,7 +36,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ ofono-marshal.list \
+@@ -48,7 +44,6 @@
+ ofono-modem.xml \
+ ofono-network-operator.xml \
+ ofono-network-registration.xml \
+- mm-marshal.list \
+ $(service_in_files) \
+ $(providers_DATA)
+
+@@ -61,7 +56,7 @@
+ %-bindings.h: stamp-%-bindings.h
+ @true
+ stamp-%-bindings.h: %.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --mode=glib-client $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --mode=glib-client $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+@@ -69,9 +64,5 @@
+ ofono-marshal.h: ofono-marshal.list $(GLIB_GENMARSHAL)
+ $(GLIB_GENMARSHAL) $< --header --prefix=ofono_marshal > $@
+ ofono-marshal.c: ofono-marshal.list ofono-marshal.h $(GLIB_GENMARSHAL)
+- $(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=ofono_marshal $(srcdir)/ofono-marshal.list --header --body >> $@
+-
+-mm-marshal.h: mm-marshal.list $(GLIB_GENMARSHAL)
+- $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=mm_marshal > $@
+-mm-marshal.c: mm-marshal.list mm-marshal.h $(GLIB_GENMARSHAL)
+- $(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=mm_marshal $(srcdir)/mm-marshal.list --header --body >> $@
++ echo "#include \"ofono-marshal.h\"" > $@ \
++ && $(GLIB_GENMARSHAL) --prefix=ofono_marshal $(srcdir)/ofono-marshal.list --body >> $@
+Index: geoclue/providers/gsmloc/geoclue-gsmloc-mm.c
+===================================================================
+--- geoclue.orig/providers/gsmloc/geoclue-gsmloc-mm.c 2011-12-29 16:41:40.362430014 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,779 +0,0 @@
+-/*
+- * Geoclue
+- * geoclue-gsmloc-mm.c - An Address/Position provider for ModemManager
+- *
+- * Author: Dan Williams <dcbw@redhat.com>
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License along
+- * with this program; if not, write to the Free Software Foundation, Inc.,
+- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- *
+- */
+-
+-#include <config.h>
+-
+-#include <unistd.h>
+-#include <string.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-
+-#include <glib-object.h>
+-#include <dbus/dbus.h>
+-#include <dbus/dbus-glib-bindings.h>
+-
+-#include "geoclue-gsmloc-mm.h"
+-
+-#include "mm-marshal.h"
+-
+-#define MM_DBUS_SERVICE "org.freedesktop.ModemManager"
+-#define MM_DBUS_PATH "/org/freedesktop/ModemManager"
+-#define MM_DBUS_INTERFACE "org.freedesktop.ModemManager"
+-#define MM_DBUS_LOC_INTERFACE "org.freedesktop.ModemManager.Modem.Location"
+-#define DBUS_PROPS_INTERFACE "org.freedesktop.DBus.Properties"
+-#define MM_DBUS_MODEM_INTERFACE "org.freedesktop.ModemManager.Modem"
+-
+-G_DEFINE_TYPE (GeoclueGsmlocMm, geoclue_gsmloc_mm, G_TYPE_OBJECT)
+-
+-#define GEOCLUE_GSMLOC_MM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GEOCLUE_TYPE_GSMLOC_MM, GeoclueGsmlocMmPrivate))
+-
+-typedef struct {
+- char *path;
+-
+- DBusGProxy *loc_proxy;
+- DBusGProxy *props_proxy;
+- DBusGProxy *modem_proxy;
+-
+- gboolean got_enabled;
+- gboolean enabled;
+- gboolean enabling;
+-
+- gboolean got_loc_enabled;
+- gboolean loc_enabled;
+- gboolean loc_enabling;
+- gboolean got_initial_loc;
+-
+- /* Whether the modem signals its location or whether we
+- * have to poll for it.
+- */
+- gboolean signals;
+- guint loc_idle;
+-
+- gboolean has_location;
+-
+- gpointer owner;
+-} Modem;
+-
+-typedef struct {
+- DBusGConnection *bus;
+- DBusGProxy *dbus_proxy;
+-
+- /* Listens for device add/remove events */
+- DBusGProxy *mm_proxy;
+- DBusGProxy *props_proxy;
+-
+- /* List of Modem objects */
+- GSList *modems;
+-} GeoclueGsmlocMmPrivate;
+-
+-enum {
+- PROP_0,
+- PROP_AVAILABLE,
+-};
+-
+-enum {
+- NETWORK_DATA_CHANGED,
+- LAST_SIGNAL
+-};
+-static guint signals[LAST_SIGNAL] = {0};
+-
+-#define LOC_CAP_GSM_LACCI 0x02
+-
+-gboolean mm_debug = FALSE;
+-
+-#define debugmsg(fmt, args...) \
+- { if (mm_debug) { g_debug (fmt, ##args); } }
+-
+-
+-static gboolean
+-is_available (GeoclueGsmlocMm *self)
+-{
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+- GSList *iter;
+-
+- for (iter = priv->modems; iter; iter = g_slist_next (iter)) {
+- Modem *modem = iter->data;
+-
+- if (modem->enabled && modem->loc_enabled && modem->has_location)
+- return TRUE;
+- }
+-
+- return FALSE;
+-}
+-
+-static Modem *
+-find_modem (GeoclueGsmlocMm *self, const char *path)
+-{
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+- GSList *iter;
+-
+- g_return_val_if_fail (path != NULL, NULL);
+-
+- for (iter = priv->modems; iter; iter = g_slist_next (iter)) {
+- Modem *modem = iter->data;
+-
+- if (strcmp (path, modem->path) == 0)
+- return modem;
+- }
+-
+- return NULL;
+-}
+-
+-static void
+-recheck_available (GeoclueGsmlocMm *self)
+-{
+- g_object_notify (G_OBJECT (self), "available");
+-}
+-
+-static void
+-location_update (GeoclueGsmlocMm *self, const char *loc)
+-{
+- char **components = NULL;
+- char *dec_lac = NULL, *dec_cid = NULL;
+- unsigned long int num;
+-
+- components = g_strsplit (loc, ",", 0);
+- if (!components || g_strv_length (components) < 4) {
+- g_warning ("%s: invalid GSM LAC/CI location: '%s'", __func__, loc);
+- goto out;
+- }
+-
+- /* convert lac to decimal */
+- errno = 0;
+- num = strtoul (components[2], NULL, 16);
+- if (errno != 0) {
+- g_warning ("%s: cannot convert LAC '%s' to decimal!",
+- __func__, components[2]);
+- goto out;
+- }
+- dec_lac = g_strdup_printf ("%u", num);
+-
+- /* convert cell id to decimal */
+- errno = 0;
+- num = strtoul (components[3], NULL, 16);
+- if (errno != 0) {
+- g_warning ("%s: cannot convert Cell ID '%s' to decimal!",
+- __func__, components[3]);
+- goto out;
+- }
+- dec_cid = g_strdup_printf ("%u", num);
+-
+- debugmsg ("%s: emitting location: %s/%s/%s/%s",
+- __func__, components[0], components[1], dec_lac, dec_cid);
+- g_signal_emit (G_OBJECT (self), signals[NETWORK_DATA_CHANGED], 0,
+- components[0], /* MCC */
+- components[1], /* MNC */
+- dec_lac, /* LAC */
+- dec_cid); /* CID */
+-
+-out:
+- if (components)
+- g_strfreev (components);
+- g_free (dec_lac);
+- g_free (dec_cid);
+-}
+-
+-static void
+-modem_location_update (Modem *modem, GHashTable *locations)
+-{
+- GValue *lacci;
+-
+- /* GSMLOC only handles GSM LAC/CI location info */
+- lacci = g_hash_table_lookup (locations, GUINT_TO_POINTER (LOC_CAP_GSM_LACCI));
+- if (!lacci)
+- return;
+- if (!G_VALUE_HOLDS_STRING (lacci)) {
+- g_warning ("%s: GSM LAC/CI location member not a string!", __func__);
+- return;
+- }
+-
+- debugmsg ("%s: GSM LAC/CI: %s", __func__, g_value_get_string (lacci));
+- location_update (modem->owner, g_value_get_string (lacci));
+-}
+-
+-#define DBUS_TYPE_LOCATIONS (dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, G_TYPE_VALUE))
+-#define DBUS_TYPE_G_MAP_OF_VARIANT (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
+-
+-static void
+-loc_poll_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+-{
+- GError *error = NULL;
+- GHashTable *locations = NULL;
+-
+- if (!dbus_g_proxy_end_call (proxy, call, &error,
+- DBUS_TYPE_LOCATIONS, &locations,
+- G_TYPE_INVALID)) {
+- g_warning ("%s: failed to get location: (%d) %s",
+- __func__,
+- error ? error->code : -1,
+- error && error->message ? error->message : "(unknown)");
+- g_clear_error (&error);
+- return;
+- }
+-
+- modem_location_update ((Modem *) user_data, locations);
+- g_hash_table_destroy (locations);
+-}
+-
+-static gboolean
+-modem_loc_poll (gpointer user_data)
+-{
+- Modem *modem = user_data;
+-
+- dbus_g_proxy_begin_call (modem->loc_proxy, "GetLocation",
+- loc_poll_cb, modem, NULL,
+- G_TYPE_INVALID);
+-
+- return TRUE;
+-}
+-
+-static void
+-modem_loc_enable_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+-{
+- Modem *modem = user_data;
+- GError *error = NULL;
+-
+- modem->loc_enabling = FALSE;
+- if (!dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID)) {
+- g_warning ("%s: failed to enable modem location services: (%d) %s",
+- __func__,
+- error ? error->code : -1,
+- error && error->message ? error->message : "(unknown)");
+- g_clear_error (&error);
+- return;
+- }
+-}
+-
+-static void
+-modem_try_loc_enable (Modem *modem)
+-{
+- /* Don't enable location services if we don't have all the modem's
+- * status yet or if location services are already enabled.
+- */
+-
+- if (!modem->got_loc_enabled ||
+- !modem->enabled ||
+- !modem->has_location ||
+- !modem->got_loc_enabled ||
+- modem->loc_enabled ||
+- modem->loc_enabling)
+- return;
+-
+- modem->loc_enabling = TRUE;
+- debugmsg ("%s: (%s) enabling location services...", __func__, modem->path);
+- dbus_g_proxy_begin_call (modem->loc_proxy, "Enable",
+- modem_loc_enable_cb, modem, NULL,
+- G_TYPE_BOOLEAN, TRUE, /* enable */
+- G_TYPE_BOOLEAN, TRUE, /* signal location changes */
+- G_TYPE_INVALID);
+-}
+-
+-static void
+-modem_enable_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+-{
+- Modem *modem = user_data;
+- GError *error = NULL;
+-
+- modem->enabling = FALSE;
+- if (!dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID)) {
+- g_warning ("%s: failed to enable modem: (%d) %s",
+- __func__,
+- error ? error->code : -1,
+- error && error->message ? error->message : "(unknown)");
+- g_clear_error (&error);
+- return;
+- }
+-
+- /* enable location services */
+- modem_try_loc_enable (modem);
+-}
+-
+-static void
+-modem_properties_changed (DBusGProxy *proxy,
+- const char *interface,
+- GHashTable *props,
+- gpointer user_data)
+-{
+- Modem *modem = user_data;
+- GValue *value;
+- gboolean old_avail = modem->enabled && modem->loc_enabled && modem->has_location;
+- gboolean new_avail;
+-
+- if (strcmp (interface, MM_DBUS_MODEM_INTERFACE) == 0) {
+- value = g_hash_table_lookup (props, "Enabled");
+- if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
+- modem->enabled = g_value_get_boolean (value);
+- modem->got_enabled = TRUE;
+- debugmsg ("%s: (%s) modem %s", __func__, modem->path,
+- modem->enabled ? "enabled" : "disabled");
+- }
+- } else if (strcmp (interface, MM_DBUS_LOC_INTERFACE) == 0) {
+- value = g_hash_table_lookup (props, "Enabled");
+- if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
+- modem->loc_enabled = g_value_get_boolean (value);
+- modem->got_loc_enabled = TRUE;
+- debugmsg ("%s: (%s) modem location services %s",
+- __func__, modem->path,
+- modem->loc_enabled ? "enabled" : "disabled");
+- }
+-
+- value = g_hash_table_lookup (props, "SignalsLocation");
+- if (value && G_VALUE_HOLDS_BOOLEAN (value)) {
+- modem->signals = g_value_get_boolean (value);
+- debugmsg ("%s: (%s) modem %s signal location updates",
+- __func__, modem->path,
+- modem->signals ? "will" : "does not");
+- }
+-
+- value = g_hash_table_lookup (props, "Capabilities");
+- if (value && G_VALUE_HOLDS_UINT (value)) {
+- debugmsg ("%s: (%s) modem location capabilities: 0x%X",
+- __func__, modem->path,
+- g_value_get_uint (value));
+-
+- if (g_value_get_uint (value) & LOC_CAP_GSM_LACCI)
+- modem->has_location = TRUE;
+- }
+-
+- value = g_hash_table_lookup (props, "Location");
+- if (value && G_VALUE_HOLDS_BOXED (value))
+- modem_location_update (modem, (GHashTable *) g_value_get_boxed (value));
+- }
+-
+- new_avail = modem->enabled && modem->loc_enabled && modem->has_location;
+-
+- /* If the modem doesn't signal its location, start polling for the
+- * location now.
+- */
+- if (new_avail && !modem->signals && !modem->loc_idle) {
+- modem->loc_idle = g_timeout_add_seconds (20, modem_loc_poll, modem);
+- /* Kick off a quick location request */
+- modem_loc_poll (modem);
+- }
+-
+- /* If the modem is no longer enabled, or it now signals its location
+- * then we no longer need to poll.
+- */
+- if ((!new_avail || modem->signals) && modem->loc_idle)
+- g_source_remove (modem->loc_idle);
+-
+- /* Tell the manager to recheck availability of location info */
+- if (old_avail != new_avail)
+- recheck_available (modem->owner);
+-
+- /* If we've successfully retrieved modem properties and the modem
+- * isn't enabled, do that now.
+- */
+- if (modem->got_enabled && !modem->enabled && !modem->enabling) {
+- debugmsg ("%s: (%s) enabling...", __func__, modem->path);
+- modem->enabling = TRUE;
+- dbus_g_proxy_begin_call (modem->modem_proxy, "Enable",
+- modem_enable_cb, modem, NULL,
+- G_TYPE_BOOLEAN, TRUE, G_TYPE_INVALID);
+- }
+-
+- /* If the modem was already enabled but location services weren't,
+- * enable them now.
+- */
+- modem_try_loc_enable (modem);
+-
+- /* After location is enabled, try to get the location ASAP */
+- if (modem->has_location && modem->loc_enabled && !modem->got_initial_loc) {
+- modem->got_initial_loc = TRUE;
+- modem_loc_poll (modem);
+- }
+-}
+-
+-static void
+-modem_props_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+-{
+- GError *error = NULL;
+- GHashTable *props = NULL;
+- Modem *modem = user_data;
+-
+- if (!dbus_g_proxy_end_call (proxy, call, &error,
+- DBUS_TYPE_G_MAP_OF_VARIANT, &props,
+- G_TYPE_INVALID)) {
+- g_warning ("%s: failed to get modem interface properties: (%d) %s",
+- __func__,
+- error ? error->code : -1,
+- error && error->message ? error->message : "(unknown)");
+- g_clear_error (&error);
+- return;
+- }
+-
+- modem_properties_changed (modem->loc_proxy, MM_DBUS_MODEM_INTERFACE, props, modem);
+- g_hash_table_destroy (props);
+-}
+-
+-static void
+-loc_props_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+-{
+- GError *error = NULL;
+- GHashTable *props = NULL;
+- Modem *modem = user_data;
+-
+- if (!dbus_g_proxy_end_call (proxy, call, &error,
+- DBUS_TYPE_G_MAP_OF_VARIANT, &props,
+- G_TYPE_INVALID)) {
+- g_warning ("%s: failed to get location interface properties: (%d) %s",
+- __func__,
+- error ? error->code : -1,
+- error && error->message ? error->message : "(unknown)");
+- g_clear_error (&error);
+- return;
+- }
+-
+- modem_properties_changed (modem->loc_proxy, MM_DBUS_LOC_INTERFACE, props, modem);
+- g_hash_table_destroy (props);
+-
+- /* Now that we know the device supports location services, get basic
+- * modem properties and start grabbing location info.
+- */
+- dbus_g_proxy_begin_call (modem->props_proxy, "GetAll",
+- modem_props_cb, modem, NULL,
+- G_TYPE_STRING, MM_DBUS_MODEM_INTERFACE, G_TYPE_INVALID);
+-}
+-
+-static Modem *
+-modem_new (DBusGConnection *bus, const char *path, gpointer owner)
+-{
+- Modem *modem;
+-
+- modem = g_slice_new0 (Modem);
+- modem->owner = owner;
+- modem->path = g_strdup (path);
+-
+- modem->loc_proxy = dbus_g_proxy_new_for_name (bus,
+- MM_DBUS_SERVICE,
+- path,
+- MM_DBUS_LOC_INTERFACE);
+-
+- modem->modem_proxy = dbus_g_proxy_new_for_name (bus,
+- MM_DBUS_SERVICE,
+- path,
+- MM_DBUS_MODEM_INTERFACE);
+-
+- /* Listen for property changes */
+- modem->props_proxy = dbus_g_proxy_new_for_name (bus,
+- MM_DBUS_SERVICE,
+- path,
+- "org.freedesktop.DBus.Properties");
+- dbus_g_object_register_marshaller (mm_marshal_VOID__STRING_BOXED,
+- G_TYPE_NONE,
+- G_TYPE_STRING, DBUS_TYPE_G_MAP_OF_VARIANT,
+- G_TYPE_INVALID);
+- dbus_g_proxy_add_signal (modem->props_proxy, "MmPropertiesChanged",
+- G_TYPE_STRING, DBUS_TYPE_G_MAP_OF_VARIANT,
+- G_TYPE_INVALID);
+- dbus_g_proxy_connect_signal (modem->props_proxy, "MmPropertiesChanged",
+- G_CALLBACK (modem_properties_changed),
+- modem,
+- NULL);
+-
+- debugmsg ("%s: (%s) modem created", __func__, path);
+-
+- /* Check if the Location interface is actually supported before doing
+- * anything with the modem, because if it's not, we don't care about
+- * the modem at all.
+- */
+- dbus_g_proxy_begin_call (modem->props_proxy, "GetAll",
+- loc_props_cb, modem, NULL,
+- G_TYPE_STRING, MM_DBUS_LOC_INTERFACE, G_TYPE_INVALID);
+-
+- return modem;
+-}
+-
+-static void
+-modem_free (Modem *modem)
+-{
+-
+- debugmsg ("%s: (%s) modem removed", __func__, modem->path);
+-
+- g_free (modem->path);
+- g_object_unref (modem->loc_proxy);
+- g_object_unref (modem->modem_proxy);
+- g_object_unref (modem->props_proxy);
+-
+- if (modem->loc_idle)
+- g_source_remove (modem->loc_idle);
+-
+- memset (modem, 0, sizeof (Modem));
+- g_slice_free (Modem, modem);
+-}
+-
+-static void
+-modem_added (DBusGProxy *proxy, const char *path, gpointer user_data)
+-{
+- GeoclueGsmlocMm *self = GEOCLUE_GSMLOC_MM (user_data);
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+- Modem *modem;
+-
+- if (!find_modem (self, path)) {
+- modem = modem_new (priv->bus, path, self);
+- priv->modems = g_slist_prepend (priv->modems, modem);
+- }
+-}
+-
+-static void
+-enumerate_modems_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
+-{
+- GPtrArray *modems;
+- GError *error = NULL;
+- int i;
+-
+- if (!dbus_g_proxy_end_call (proxy, call, &error,
+- dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &modems,
+- G_TYPE_INVALID)) {
+- g_warning ("%s: failed to enumerate modems: (%d) %s",
+- __func__,
+- error ? error->code : -1,
+- error && error->message ? error->message : "(unknown)");
+- g_clear_error (&error);
+- return;
+- }
+-
+- for (i = 0; i < modems->len; i++) {
+- char *path = g_ptr_array_index (modems, i);
+-
+- modem_added (NULL, path, GEOCLUE_GSMLOC_MM (user_data));
+- g_free (path);
+- }
+- g_ptr_array_free (modems, TRUE);
+-}
+-
+-static void
+-enumerate_modems (GeoclueGsmlocMm *self)
+-{
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+-
+- dbus_g_proxy_begin_call (priv->mm_proxy, "EnumerateDevices",
+- enumerate_modems_cb, self, NULL,
+- G_TYPE_INVALID);
+-}
+-
+-static void
+-modem_removed (DBusGProxy *proxy, const char *path, gpointer user_data)
+-{
+- GeoclueGsmlocMm *self = GEOCLUE_GSMLOC_MM (user_data);
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+- Modem *modem;
+-
+- modem = find_modem (self, path);
+- if (modem) {
+- gboolean old_available = is_available (self);
+-
+- priv->modems = g_slist_remove (priv->modems, modem);
+- modem_free (modem);
+- if (is_available (self) != old_available)
+- g_object_notify (G_OBJECT (self), "available");
+- }
+-}
+-
+-static void
+-kill_modems (GeoclueGsmlocMm *self)
+-{
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+- gboolean old_available = is_available (self);
+- GSList *iter;
+-
+- /* Kill all modems */
+- for (iter = priv->modems; iter; iter = g_slist_next (iter))
+- modem_free ((Modem *) iter->data);
+- g_slist_free (priv->modems);
+- priv->modems = NULL;
+-
+- /* No more modems; clearly location is no longer available */
+- if (old_available)
+- g_object_notify (G_OBJECT (self), "available");
+-}
+-
+-static void
+-name_owner_changed (DBusGProxy *proxy,
+- const char *name,
+- const char *old_owner,
+- const char *new_owner,
+- gpointer user_data)
+-{
+- gboolean old_owner_good;
+- gboolean new_owner_good;
+-
+- if (strcmp (MM_DBUS_SERVICE, name) != 0)
+- return;
+-
+- old_owner_good = (old_owner && strlen (old_owner));
+- new_owner_good = (new_owner && strlen (new_owner));
+-
+- if (!old_owner_good && new_owner_good) {
+- debugmsg ("ModemManager appeared");
+- enumerate_modems (GEOCLUE_GSMLOC_MM (user_data));
+- } else if (old_owner_good && !new_owner_good) {
+- debugmsg ("ModemManager disappeared");
+- kill_modems (GEOCLUE_GSMLOC_MM (user_data));
+- }
+-}
+-
+-GeoclueGsmlocMm *
+-geoclue_gsmloc_mm_new (void)
+-{
+- return (GeoclueGsmlocMm *) g_object_new (GEOCLUE_TYPE_GSMLOC_MM, NULL);
+-}
+-
+-static gboolean
+-mm_alive (DBusGProxy *proxy)
+-{
+- char *owner = NULL;
+- gboolean owned = FALSE;
+- GError *error = NULL;
+-
+- if (dbus_g_proxy_call_with_timeout (proxy,
+- "GetNameOwner", 2000, &error,
+- G_TYPE_STRING, MM_DBUS_SERVICE,
+- G_TYPE_INVALID,
+- G_TYPE_STRING, &owner,
+- G_TYPE_INVALID)) {
+- owned = !!owner;
+- g_free (owner);
+- }
+- return owned;
+-}
+-
+-static void
+-geoclue_gsmloc_mm_init (GeoclueGsmlocMm *self)
+-{
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (self);
+-
+- if (getenv ("GEOCLUE_GSMLOC_MM_DEBUG"))
+- mm_debug = TRUE;
+-
+- priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
+- if (!priv->bus) {
+- g_warning ("Failed to acquire a connection to the D-Bus system bus.");
+- return;
+- }
+-
+- priv->dbus_proxy = dbus_g_proxy_new_for_name (priv->bus,
+- DBUS_SERVICE_DBUS,
+- DBUS_PATH_DBUS,
+- DBUS_INTERFACE_DBUS);
+- /* Handle ModemManager restarts */
+- dbus_g_proxy_add_signal (priv->dbus_proxy, "NameOwnerChanged",
+- G_TYPE_STRING, G_TYPE_STRING,
+- G_TYPE_STRING, G_TYPE_INVALID);
+- dbus_g_proxy_connect_signal (priv->dbus_proxy, "NameOwnerChanged",
+- G_CALLBACK (name_owner_changed),
+- self, NULL);
+-
+- priv->mm_proxy = dbus_g_proxy_new_for_name (priv->bus,
+- MM_DBUS_SERVICE,
+- MM_DBUS_PATH,
+- MM_DBUS_INTERFACE);
+- g_assert (priv->mm_proxy);
+-
+- dbus_g_proxy_add_signal (priv->mm_proxy, "DeviceAdded",
+- DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
+- dbus_g_proxy_connect_signal (priv->mm_proxy, "DeviceAdded",
+- G_CALLBACK (modem_added), self, NULL);
+- dbus_g_proxy_add_signal (priv->mm_proxy, "DeviceRemoved",
+- DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
+- dbus_g_proxy_connect_signal (priv->mm_proxy, "DeviceRemoved",
+- G_CALLBACK (modem_removed), self, NULL);
+-
+- if (mm_alive (priv->dbus_proxy)) {
+- debugmsg ("ModemManager is alive");
+- enumerate_modems (self);
+- }
+-}
+-
+-static void
+-dispose (GObject *object)
+-{
+- GeoclueGsmlocMmPrivate *priv = GEOCLUE_GSMLOC_MM_GET_PRIVATE (object);
+-
+- kill_modems (GEOCLUE_GSMLOC_MM (object));
+-
+- /* Stop listening to ModemManager */
+- if (priv->mm_proxy) {
+- g_object_unref (priv->mm_proxy);
+- priv->mm_proxy = NULL;
+- }
+-
+- if (priv->props_proxy) {
+- g_object_unref (priv->props_proxy);
+- priv->props_proxy = NULL;
+- }
+-
+- if (priv->dbus_proxy) {
+- g_object_unref (priv->dbus_proxy);
+- priv->dbus_proxy = NULL;
+- }
+-
+- G_OBJECT_CLASS (geoclue_gsmloc_mm_parent_class)->dispose (object);
+-}
+-
+-static void
+-get_property (GObject *object, guint prop_id,
+- GValue *value, GParamSpec *pspec)
+-{
+- switch (prop_id) {
+- case PROP_AVAILABLE:
+- g_value_set_boolean (value, is_available (GEOCLUE_GSMLOC_MM (object)));
+- break;
+- default:
+- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+- break;
+- }
+-}
+-
+-static void
+-geoclue_gsmloc_mm_class_init (GeoclueGsmlocMmClass *klass)
+-{
+- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+-
+- g_type_class_add_private (klass, sizeof (GeoclueGsmlocMmPrivate));
+-
+- /* virtual methods */
+- object_class->get_property = get_property;
+- object_class->dispose = dispose;
+-
+- /* properties */
+- g_object_class_install_property
+- (object_class, PROP_AVAILABLE,
+- g_param_spec_boolean ("available",
+- "Available",
+- "Whether any mobile broadband device is "
+- "providing location information at this "
+- "time.",
+- FALSE,
+- G_PARAM_READABLE));
+-
+- /* signals */
+- signals[NETWORK_DATA_CHANGED] =
+- g_signal_new ("network-data-changed",
+- G_OBJECT_CLASS_TYPE (klass),
+- G_SIGNAL_RUN_LAST, 0,
+- NULL, NULL,
+- mm_marshal_VOID__STRING_STRING_STRING_STRING,
+- G_TYPE_NONE, 4,
+- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+-}
+-
+Index: geoclue/providers/gsmloc/geoclue-gsmloc-mm.h
+===================================================================
+--- geoclue.orig/providers/gsmloc/geoclue-gsmloc-mm.h 2011-12-29 16:41:40.362430014 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,56 +0,0 @@
+-/*
+- * Geoclue
+- * geoclue-gsmloc-mm.h - An Address/Position provider for ModemManager
+- *
+- * Author: Dan Williams <dcbw@redhat.com>
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License along
+- * with this program; if not, write to the Free Software Foundation, Inc.,
+- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+- *
+- */
+-
+-#ifndef _GEOCLUE_GSMLOC_MM
+-#define _GEOCLUE_GSMLOC_MM
+-
+-#include <glib-object.h>
+-
+-G_BEGIN_DECLS
+-
+-#define GEOCLUE_TYPE_GSMLOC_MM (geoclue_gsmloc_mm_get_type ())
+-
+-#define GEOCLUE_GSMLOC_MM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEOCLUE_TYPE_GSMLOC_MM, GeoclueGsmlocMm))
+-#define GEOCLUE_GSMLOC_MM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEOCLUE_TYPE_GSMLOC_MM, GeoclueGsmlocMmClass))
+-#define GEOCLUE_IS_GSMLOC_MM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEOCLUE_TYPE_GSMLOC_MM))
+-#define GEOCLUE_IS_GSMLOC_MM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEOCLUE_TYPE_GSMLOC_MM))
+-
+-typedef struct _GeoclueGsmlocMm {
+- GObject parent;
+-} GeoclueGsmlocMm;
+-
+-typedef struct _GeoclueGsmlocMmClass {
+- GObjectClass parent_class;
+-
+- void (*network_data_changed) (GeoclueGsmlocMm *mm,
+- char *mcc, char *mnc,
+- char *lac, char *cid);
+-} GeoclueGsmlocMmClass;
+-
+-GType geoclue_gsmloc_mm_get_type (void);
+-
+-GeoclueGsmlocMm *geoclue_gsmloc_mm_new (void);
+-
+-G_END_DECLS
+-
+-#endif /* _GEOCLUE_GSMLOC_MM */
+-
+Index: geoclue/providers/gsmloc/geoclue-gsmloc.c
+===================================================================
+--- geoclue.orig/providers/gsmloc/geoclue-gsmloc.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/gsmloc/geoclue-gsmloc.c 2011-12-29 16:40:38.926428900 +0900
+@@ -1,11 +1,10 @@
+ /*
+ * Geoclue
+ * geoclue-gsmloc.c - A GSM cell based Position provider
+- *
++ *
+ * Author: Jussi Kukkonen <jku@linux.intel.com>
+ * Copyright 2008 by Garmin Ltd. or its subsidiaries
+ * 2010 Intel Corporation
+- * 2010 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+@@ -24,18 +23,18 @@
+ *
+ */
+
+- /**
+- * Gsmloc provider is a position and address provider that uses GSM cell
++ /**
++ * Gsmloc provider is a position and address provider that uses GSM cell
+ * location and the webservice http://www.opencellid.org/ (a similar service
+ * used to live at gsmloc.org, hence the name). The web service does not
+- * provide any address data: that is done with a
++ * provide any address data: that is done with a
+ * "mobile country code -> ISO country code" lookup table: as a result address
+ * will only ever have country code and country fields.
+- *
+- * Gsmloc requires the oFono or ModemManager telephony stacks to work -- more
+- * IMSI data sources could be added fairly easily.
++ *
++ * Gsmloc requires the telephony stack oFono to work -- more IMSI data
++ * sources could be added fairly easily.
+ **/
+-
++
+ #include <config.h>
+
+ #include <time.h>
+@@ -55,9 +54,6 @@
+ /* ofono implementation */
+ #include "geoclue-gsmloc-ofono.h"
+
+-/* ModemManager implementation */
+-#include "geoclue-gsmloc-mm.h"
+-
+ /* country code list */
+ #include "mcc.h"
+
+@@ -80,7 +76,6 @@
+ GcWebService *web_service;
+
+ GeoclueGsmlocOfono *ofono;
+- GeoclueGsmlocMm *mm;
+
+ /* current data */
+ char *mcc;
+@@ -119,17 +114,15 @@
+ {
+ GeoclueGsmloc *gsmloc = GEOCLUE_GSMLOC (iface);
+ gboolean ofono_available;
+- gboolean mm_available;
+
+ g_object_get (gsmloc->ofono, "available", &ofono_available, NULL);
+- g_object_get (gsmloc->mm, "available", &mm_available, NULL);
+
+- if (!ofono_available && !mm_available) {
++ if (!ofono_available) {
+ *status = GEOCLUE_STATUS_ERROR;
+ } else if (!gsmloc->mcc || !gsmloc->mnc ||
+ !gsmloc->lac || !gsmloc->cid) {
+ *status = GEOCLUE_STATUS_UNAVAILABLE;
+- } else {
++ } else {
+ *status = GEOCLUE_STATUS_AVAILABLE;
+ }
+ return TRUE;
+@@ -159,11 +152,11 @@
+ "cellid", gsmloc->cid,
+ (char *)0)) {
+
+- if (gc_web_service_get_double (gsmloc->web_service,
++ if (gc_web_service_get_double (gsmloc->web_service,
+ &lat, OPENCELLID_LAT)) {
+ fields |= GEOCLUE_POSITION_FIELDS_LATITUDE;
+ }
+- if (gc_web_service_get_double (gsmloc->web_service,
++ if (gc_web_service_get_double (gsmloc->web_service,
+ &lon, OPENCELLID_LON)) {
+ fields |= GEOCLUE_POSITION_FIELDS_LONGITUDE;
+ }
+@@ -171,10 +164,10 @@
+ if (fields != GEOCLUE_POSITION_FIELDS_NONE) {
+ char *retval_cid;
+ /* if cellid is not present, location is for the local area code.
+- * the accuracy might be an overstatement -- I have no idea how
++ * the accuracy might be an overstatement -- I have no idea how
+ * big LACs typically are */
+ level = GEOCLUE_ACCURACY_LEVEL_LOCALITY;
+- if (gc_web_service_get_string (gsmloc->web_service,
++ if (gc_web_service_get_string (gsmloc->web_service,
+ &retval_cid, OPENCELLID_CID)) {
+ if (retval_cid && strlen (retval_cid) != 0) {
+ level = GEOCLUE_ACCURACY_LEVEL_POSTALCODE;
+@@ -250,13 +243,13 @@
+ time (NULL),
+ gsmloc->address,
+ acc);
+-
++
+ }
+ geoclue_accuracy_free (acc);
+ }
+ static void
+ geoclue_gsmloc_set_cell (GeoclueGsmloc *gsmloc,
+- const char *mcc, const char *mnc,
++ const char *mcc, const char *mnc,
+ const char *lac, const char *cid)
+ {
+ g_free (gsmloc->mcc);
+@@ -275,7 +268,7 @@
+
+ static void
+ network_data_changed_cb (gpointer connection_manager,
+- const char *mcc, const char *mnc,
++ const char *mcc, const char *mnc,
+ const char *lac, const char *cid,
+ GeoclueGsmloc *gsmloc)
+ {
+@@ -291,7 +284,7 @@
+
+ /* Position interface implementation */
+
+-static gboolean
++static gboolean
+ geoclue_gsmloc_get_position (GcIfacePosition *iface,
+ GeocluePositionFields *fields,
+ int *timestamp,
+@@ -371,14 +364,6 @@
+ gsmloc->ofono = NULL;
+ }
+
+- if (gsmloc->mm) {
+- g_signal_handlers_disconnect_by_func (gsmloc->mm,
+- network_data_changed_cb,
+- gsmloc);
+- g_object_unref (gsmloc->mm);
+- gsmloc->mm = NULL;
+- }
+-
+ if (gsmloc->address) {
+ g_hash_table_destroy (gsmloc->address);
+ gsmloc->address = NULL;
+@@ -407,7 +392,7 @@
+ {
+ gsmloc->address = geoclue_address_details_new ();
+
+- gc_provider_set_details (GC_PROVIDER (gsmloc),
++ gc_provider_set_details (GC_PROVIDER (gsmloc),
+ GEOCLUE_DBUS_SERVICE_GSMLOC,
+ GEOCLUE_DBUS_PATH_GSMLOC,
+ "Gsmloc", "GSM cell based position provider");
+@@ -423,11 +408,6 @@
+ gsmloc->ofono = geoclue_gsmloc_ofono_new ();
+ g_signal_connect (gsmloc->ofono, "network-data-changed",
+ G_CALLBACK (network_data_changed_cb), gsmloc);
+-
+- /* init mm */
+- gsmloc->mm = geoclue_gsmloc_mm_new ();
+- g_signal_connect (gsmloc->mm, "network-data-changed",
+- G_CALLBACK (network_data_changed_cb), gsmloc);
+ }
+
+ static void
+@@ -442,7 +422,7 @@
+ iface->get_address = geoclue_gsmloc_get_address;
+ }
+
+-int
++int
+ main()
+ {
+ g_type_init();
+Index: geoclue/providers/gsmloc/mm-marshal.list
+===================================================================
+--- geoclue.orig/providers/gsmloc/mm-marshal.list 2011-12-29 16:41:40.362430014 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,2 +0,0 @@
+-VOID:STRING,STRING,STRING,STRING
+-VOID:STRING,BOXED
+Index: geoclue/providers/gypsy/Makefile.am
+===================================================================
+--- geoclue.orig/providers/gypsy/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/gypsy/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -22,7 +22,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/gypsy/geoclue-gypsy.c
+===================================================================
+--- geoclue.orig/providers/gypsy/geoclue-gypsy.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/gypsy/geoclue-gypsy.c 2011-12-29 16:40:38.926428900 +0900
+@@ -38,7 +38,6 @@
+ GcProvider parent;
+
+ char *device_name;
+- guint baud_rate;
+
+ GypsyControl *control;
+ GypsyDevice *device;
+@@ -123,14 +122,14 @@
+ gypsy_position_to_geoclue (GypsyPositionFields fields)
+ {
+ GeocluePositionFields gc_fields = GEOCLUE_POSITION_FIELDS_NONE;
+-
++
+ gc_fields |= (fields & GYPSY_POSITION_FIELDS_LATITUDE) ? GEOCLUE_POSITION_FIELDS_LATITUDE : 0;
+ gc_fields |= (fields & GYPSY_POSITION_FIELDS_LONGITUDE) ? GEOCLUE_POSITION_FIELDS_LONGITUDE : 0;
+ gc_fields |= (fields & GYPSY_POSITION_FIELDS_ALTITUDE) ? GEOCLUE_POSITION_FIELDS_ALTITUDE : 0;
+-
++
+ return gc_fields;
+ }
+-
++
+ static GeoclueVelocityFields
+ gypsy_course_to_geoclue (GypsyCourseFields fields)
+ {
+@@ -188,9 +187,9 @@
+
+ g_print ("Emitting signal\n");
+ fields = gypsy_position_to_geoclue (gypsy->position_fields);
+- gc_iface_position_emit_position_changed
++ gc_iface_position_emit_position_changed
+ (GC_IFACE_POSITION (gypsy), fields,
+- timestamp, gypsy->latitude, gypsy->longitude,
++ timestamp, gypsy->latitude, gypsy->longitude,
+ gypsy->altitude, gypsy->accuracy);
+ }
+ }
+@@ -238,12 +237,12 @@
+ GeoclueVelocityFields fields;
+
+ fields = gypsy_course_to_geoclue (gypsy->course_fields);
+- gc_iface_velocity_emit_velocity_changed
++ gc_iface_velocity_emit_velocity_changed
+ (GC_IFACE_VELOCITY (gypsy), fields,
+ timestamp, gypsy->speed, gypsy->direction, gypsy->climb);
+ }
+ }
+-
++
+ static void
+ accuracy_changed (GypsyAccuracy *accuracy,
+ GypsyAccuracyFields fields,
+@@ -257,7 +256,7 @@
+ double horiz, vert;
+
+ geoclue_accuracy_get_details (gypsy->accuracy, &level, &horiz, &vert);
+- if (fields & (GYPSY_ACCURACY_FIELDS_HORIZONTAL |
++ if (fields & (GYPSY_ACCURACY_FIELDS_HORIZONTAL |
+ GYPSY_ACCURACY_FIELDS_VERTICAL)){
+ if (level != GEOCLUE_ACCURACY_LEVEL_DETAILED ||
+ horiz != hdop || vert != vdop) {
+@@ -281,11 +280,11 @@
+
+ if (changed) {
+ GeocluePositionFields fields;
+-
++
+ fields = gypsy_position_to_geoclue (gypsy->position_fields);
+- gc_iface_position_emit_position_changed
++ gc_iface_position_emit_position_changed
+ (GC_IFACE_POSITION (gypsy), fields,
+- gypsy->timestamp, gypsy->latitude, gypsy->longitude,
++ gypsy->timestamp, gypsy->latitude, gypsy->longitude,
+ gypsy->altitude, gypsy->accuracy);
+ }
+ }
+@@ -295,7 +294,7 @@
+ gboolean connected,
+ GeoclueGypsy *gypsy)
+ {
+- if (connected == FALSE &&
++ if (connected == FALSE &&
+ gypsy->status != GEOCLUE_STATUS_UNAVAILABLE) {
+ gypsy->status = GEOCLUE_STATUS_UNAVAILABLE;
+ gc_iface_geoclue_emit_status_changed (GC_IFACE_GEOCLUE (gypsy),
+@@ -379,26 +378,14 @@
+ GError **error)
+ {
+ GeoclueGypsy *gypsy = GEOCLUE_GYPSY (gc);
+- GValue *device_value, *baud_rate_value;
+ const char *device_name;
+ char *path;
+- int baud_rate;
+
+- device_value = g_hash_table_lookup (options,
+- "org.freedesktop.Geoclue.GPSDevice");
+- device_name = device_value ? g_value_get_string (device_value) : NULL;
+- baud_rate_value = g_hash_table_lookup (options,
+- "org.freedesktop.Geoclue.GPSBaudRate");
+- baud_rate = baud_rate_value ? g_value_get_int (baud_rate_value) : 0;
++ device_name = g_hash_table_lookup (options,
++ "org.freedesktop.Geoclue.GPSDevice");
+
+- if (g_strcmp0 (gypsy->device_name, device_name) == 0 &&
+- gypsy->baud_rate == baud_rate)
+- return TRUE;
+-
+- /* Disconnect from the old device, if any */
+- if (gypsy->device != NULL) {
+- g_object_unref (gypsy->device);
+- gypsy->device = NULL;
++ if (g_strcmp0 (gypsy->device_name, device_name) == 0) {
++ return TRUE;
+ }
+
+ g_free (gypsy->device_name);
+@@ -409,8 +396,7 @@
+ }
+
+ gypsy->device_name = g_strdup (device_name);
+- gypsy->baud_rate = baud_rate;
+- g_print ("Gypsy provider using '%s' at %d bps\n", gypsy->device_name, gypsy->baud_rate);
++ g_print ("Gypsy provider using '%s'\n", gypsy->device_name);
+ path = gypsy_control_create (gypsy->control, gypsy->device_name,
+ error);
+ if (*error != NULL) {
+@@ -427,7 +413,7 @@
+ G_CALLBACK (connection_changed), gypsy);
+ g_signal_connect (gypsy->device, "fix-status-changed",
+ G_CALLBACK (fix_status_changed), gypsy);
+-
++
+ gypsy->position = gypsy_position_new (path);
+ g_signal_connect (gypsy->position, "position-changed",
+ G_CALLBACK (position_changed), gypsy);
+@@ -437,26 +423,8 @@
+ gypsy->acc = gypsy_accuracy_new (path);
+ g_signal_connect (gypsy->acc, "accuracy-changed",
+ G_CALLBACK (accuracy_changed), gypsy);
+-
++
+ g_debug ("starting device");
+- if (gypsy->baud_rate != 0) {
+- GHashTable *goptions;
+- GValue speed_val = { 0, };
+- GError *err = NULL;
+-
+- g_value_init (&speed_val, G_TYPE_UINT);
+- g_value_set_uint (&speed_val, gypsy->baud_rate);
+- goptions = g_hash_table_new (g_str_hash,
+- g_str_equal);
+- g_hash_table_insert (goptions, "BaudRate", &speed_val);
+- if (!gypsy_device_set_start_options (gypsy->device,
+- goptions,
+- &err)) {
+- g_warning ("Error: %s", err->message);
+- g_error_free (err);
+- }
+- g_hash_table_destroy (goptions);
+- }
+ gypsy_device_start (gypsy->device, error);
+ if (*error != NULL) {
+ g_print ("Error - %s?\n", (*error)->message);
+@@ -466,7 +434,7 @@
+ }
+ get_initial_status (gypsy);
+ g_free (path);
+-
++
+ return TRUE;
+ }
+
+@@ -474,7 +442,7 @@
+ shutdown (GcProvider *provider)
+ {
+ GeoclueGypsy *gypsy = GEOCLUE_GYPSY (provider);
+-
++
+ g_main_loop_quit (gypsy->loop);
+ }
+
+@@ -556,7 +524,7 @@
+ GeoclueGypsy *gypsy = GEOCLUE_GYPSY (gc);
+ GeoclueAccuracyLevel level;
+ double horizontal, vertical;
+-
++
+ *timestamp = gypsy->timestamp;
+
+ *fields = GEOCLUE_POSITION_FIELDS_NONE;
+@@ -576,7 +544,7 @@
+ geoclue_accuracy_get_details (gypsy->accuracy, &level,
+ &horizontal, &vertical);
+ *accuracy = geoclue_accuracy_new (level, horizontal, vertical);
+-
++
+ return TRUE;
+ }
+
+Index: geoclue/providers/hostip/Makefile.am
+===================================================================
+--- geoclue.orig/providers/hostip/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/hostip/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -15,7 +15,7 @@
+
+ geoclue_hostip_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/geoclue/libgeoclue.la
++ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-hostip.provider
+@@ -25,7 +25,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/localnet/Makefile.am
+===================================================================
+--- geoclue.orig/providers/localnet/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/localnet/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -10,17 +10,15 @@
+ $(nodist_geoclue_localnet_SOURCES)
+
+ geoclue_localnet_SOURCES = \
+- geoclue-localnet.c
++ geoclue-localnet.c
+
+ geoclue_localnet_CFLAGS = \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+- -I$(top_srcdir)/src \
+ $(GEOCLUE_CFLAGS)
+
+ geoclue_localnet_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/src/libconnectivity.la \
+ $(top_builddir)/geoclue/libgeoclue.la
+
+
+@@ -32,7 +30,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ CLEANFILES = \
+ stamp-geoclue-localnet-glue.h
+@@ -50,7 +48,7 @@
+ @true
+
+ stamp-geoclue-localnet-glue.h: geoclue-localnet.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=geoclue_localnet --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=geoclue_localnet --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+Index: geoclue/providers/localnet/geoclue-localnet.c
+===================================================================
+--- geoclue.orig/providers/localnet/geoclue-localnet.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/localnet/geoclue-localnet.c 2011-12-29 16:40:38.926428900 +0900
+@@ -1,27 +1,27 @@
+ /**
+- *
++ *
+ * Expects to find a keyfile in user config dir
+- * (~/.config/geoclue-localnet-gateways).
+- *
++ * (~/.config/geoclue-localnet-gateways).
++ *
+ * The keyfile should contain entries like this:
+- *
++ *
+ * [00:1D:7E:55:8D:80]
+ * country=Finland
+ * street=Solnantie 24
+ * locality=Helsinki
+ *
+- * Only address interface is supported so far.
+- *
+- * Any application that can obtain a reliable address can submit it
++ * Only address interface is supported so far.
++ *
++ * Any application that can obtain a reliable address can submit it
+ * to localnet provider through the D-Bus API -- it will then be provided
+ * whenever connected to the same router:
+ * org.freedesktop.Geoclue.Localnet.SetAddress
+ * org.freedesktop.Geoclue.Localnet.SetAddressFields
+ *
+- * SetAddress allows setting the current address as a GeoclueAddress,
+- * while SetAddressFields is a convenience version with separate
++ * SetAddress allows setting the current address as a GeoclueAddress,
++ * while SetAddressFields is a convenience version with separate
+ * address fields. Shell example using SetAddressFields:
+- *
++ *
+ dbus-send --print-reply --type=method_call \
+ --dest=org.freedesktop.Geoclue.Providers.Localnet \
+ /org/freedesktop/Geoclue/Providers/Localnet \
+@@ -33,9 +33,9 @@
+ string: \
+ string: \
+ string:"Solnantie 24"
+-
+- * This would make the provider save the specified address with current
+- * router mac address. It will provide the address to clients whenever
++
++ * This would make the provider save the specified address with current
++ * router mac address. It will provide the address to clients whenever
+ * the computer is connected to the same router again.
+ *
+ * This library is free software; you can redistribute it and/or
+@@ -53,7 +53,7 @@
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+- */
++ */
+
+ #include <config.h>
+
+@@ -69,8 +69,6 @@
+ #include <geoclue/geoclue-error.h>
+ #include <geoclue/gc-iface-address.h>
+
+-#include "connectivity.h"
+-
+ #define KEYFILE_NAME "geoclue-localnet-gateways"
+
+ typedef struct {
+@@ -82,9 +80,8 @@
+
+ typedef struct {
+ GcProvider parent;
+-
++
+ GMainLoop *loop;
+- GeoclueConnectivity *conn;
+
+ char *keyfile_name;
+ GSList *gateways;
+@@ -121,7 +118,7 @@
+ shutdown (GcProvider *provider)
+ {
+ GeoclueLocalnet *localnet;
+-
++
+ localnet = GEOCLUE_LOCALNET (provider);
+ g_main_loop_quit (localnet->loop);
+ }
+@@ -130,17 +127,17 @@
+ free_gateway_list (GSList *gateways)
+ {
+ GSList *l;
+-
++
+ l = gateways;
+ while (l) {
+ Gateway *gw;
+-
++
+ gw = l->data;
+ g_free (gw->mac);
+ g_hash_table_destroy (gw->address);
+ geoclue_accuracy_free (gw->accuracy);
+ g_free (gw);
+-
++
+ l = l->next;
+ }
+ g_slist_free (gateways);
+@@ -150,16 +147,12 @@
+ finalize (GObject *object)
+ {
+ GeoclueLocalnet *localnet;
+-
++
+ localnet = GEOCLUE_LOCALNET (object);
+
+- if (localnet->conn != NULL) {
+- g_object_unref (localnet->conn);
+- localnet->conn = NULL;
+- }
+ g_free (localnet->keyfile_name);
+ free_gateway_list (localnet->gateways);
+-
++
+ G_OBJECT_CLASS (geoclue_localnet_parent_class)->finalize (object);
+ }
+
+@@ -168,25 +161,113 @@
+ {
+ GcProviderClass *p_class = (GcProviderClass *) klass;
+ GObjectClass *o_class = (GObjectClass *) klass;
+-
++
+ o_class->finalize = finalize;
+-
++
+ p_class->get_status = get_status;
+ p_class->shutdown = shutdown;
+-
++
+ dbus_g_object_type_install_info (geoclue_localnet_get_type (),
+ &dbus_glib_geoclue_localnet_object_info);
+
+ }
+
++/* Parse /proc/net/route to get default gateway address and then parse
++ * /proc/net/arp to find matching mac address.
++ *
++ * There are some problems with this. First, it's IPv4 only.
++ * Second, there must be a way to do this with ioctl, but that seemed really
++ * complicated... even /usr/sbin/arp parses /proc/net/arp
++ *
++ * returns:
++ * 1 : on success
++ * 0 : no success, no errors
++ * <0 : error
++ */
++int
++get_mac_address (char **mac)
++{
++ char *content;
++ char **lines, **entry;
++ GError *error = NULL;
++ char *route_gateway = NULL;
++
++ g_assert (*mac == NULL);
++
++ if (!g_file_get_contents ("/proc/net/route", &content, NULL, &error)) {
++ g_warning ("Failed to read /proc/net/route: %s", error->message);
++ g_error_free (error);
++ return -1;
++ }
++
++ lines = g_strsplit (content, "\n", 0);
++ g_free (content);
++ entry = lines + 1;
++
++ while (*entry && strlen (*entry) > 0) {
++ char dest[9];
++ char gateway[9];
++ if (sscanf (*entry,
++ "%*s %8[0-9A-Fa-f] %8[0-9A-Fa-f] %*s",
++ dest, gateway) != 2) {
++ g_warning ("Failed to parse /proc/net/route entry '%s'", *entry);
++ } else if (strcmp (dest, "00000000") == 0) {
++ route_gateway = g_strdup (gateway);
++ break;
++ }
++ entry++;
++ }
++ g_strfreev (lines);
++
++ if (!route_gateway) {
++ g_warning ("Failed to find default route in /proc/net/route");
++ return -1;
++ }
++
++ if (!g_file_get_contents ("/proc/net/arp", &content, NULL, &error)) {
++ g_warning ("Failed to read /proc/net/arp: %s", error->message);
++ g_error_free (error);
++ return -1;
++ }
++
++ lines = g_strsplit (content, "\n", 0);
++ g_free (content);
++ entry = lines+1;
++ while (*entry && strlen (*entry) > 0) {
++ char hwa[100];
++ char *arp_gateway;
++ int ip[4];
++
++ if (sscanf(*entry,
++ "%d.%d.%d.%d 0x%*x 0x%*x %100s %*s %*s\n",
++ &ip[0], &ip[1], &ip[2], &ip[3], hwa) != 5) {
++ g_warning ("Failed to parse /proc/net/arp entry '%s'", *entry);
++ } else {
++ arp_gateway = g_strdup_printf ("%02X%02X%02X%02X", ip[3], ip[2], ip[1], ip[0]);
++ if (strcmp (arp_gateway, route_gateway) == 0) {
++ g_free (arp_gateway);
++ *mac = g_strdup (hwa);
++ break;
++ }
++ g_free (arp_gateway);
++
++ }
++ entry++;
++ }
++ g_free (route_gateway);
++ g_strfreev (lines);
++
++ return *mac ? 1 : 0;
++}
++
+ static void
+-geoclue_localnet_load_gateways_from_keyfile (GeoclueLocalnet *localnet,
++geoclue_localnet_load_gateways_from_keyfile (GeoclueLocalnet *localnet,
+ GKeyFile *keyfile)
+ {
+ char **groups;
+ char **g;
+ GError *error = NULL;
+-
++
+ groups = g_key_file_get_groups (keyfile, NULL);
+ g = groups;
+ while (*g) {
+@@ -194,36 +275,36 @@
+ char **keys;
+ char **k;
+ Gateway *gateway = g_new0 (Gateway, 1);
+-
++
+ gateway->mac = g_ascii_strdown (*g, -1);
+ gateway->address = geoclue_address_details_new ();
+-
++
+ /* read all keys in the group as address fields */
+ keys = g_key_file_get_keys (keyfile, *g,
+ NULL, &error);
+ if (error) {
+- g_warning ("Could not load keys for group [%s] from %s: %s",
++ g_warning ("Could not load keys for group [%s] from %s: %s",
+ *g, localnet->keyfile_name, error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+-
++
+ k = keys;
+ while (*k) {
+ char *value;
+-
++
+ value = g_key_file_get_string (keyfile, *g, *k, NULL);
+- g_hash_table_insert (gateway->address,
++ g_hash_table_insert (gateway->address,
+ *k, value);
+ k++;
+ }
+ g_free (keys);
+-
++
+ level = geoclue_address_details_get_accuracy_level (gateway->address);
+ gateway->accuracy = geoclue_accuracy_new (level, 0, 0);
+-
++
+ localnet->gateways = g_slist_prepend (localnet->gateways, gateway);
+-
++
+ g++;
+ }
+ g_strfreev (groups);
+@@ -233,19 +314,19 @@
+ geoclue_localnet_find_gateway (GeoclueLocalnet *localnet, char *mac)
+ {
+ GSList *l;
+-
++
+ l = localnet->gateways;
+ /* eww, should be using a hashtable or something here */
+ while (l) {
+ Gateway *gw = l->data;
+-
+- if (g_ascii_strcasecmp (gw->mac, mac) == 0) {
++
++ if (strcmp (gw->mac, mac) == 0) {
+ return gw;
+ }
+-
++
+ l = l->next;
+ }
+-
++
+ return NULL;
+ }
+
+@@ -255,31 +336,31 @@
+ const char *dir;
+ GKeyFile *keyfile;
+ GError *error = NULL;
+-
++
+ gc_provider_set_details (GC_PROVIDER (localnet),
+ "org.freedesktop.Geoclue.Providers.Localnet",
+ "/org/freedesktop/Geoclue/Providers/Localnet",
+ "Localnet", "provides Address based on current gateway mac address and a local address file (which can be updated through D-Bus)");
+-
+-
++
++
+ localnet->gateways = NULL;
+-
++
+ /* load known addresses from keyfile */
+ dir = g_get_user_config_dir ();
+ g_mkdir_with_parents (dir, 0755);
+ localnet->keyfile_name = g_build_filename (dir, KEYFILE_NAME, NULL);
+-
++
+ keyfile = g_key_file_new ();
+- if (!g_key_file_load_from_file (keyfile, localnet->keyfile_name,
++ if (!g_key_file_load_from_file (keyfile, localnet->keyfile_name,
+ G_KEY_FILE_NONE, &error)) {
+- g_warning ("Could not load keyfile %s: %s",
++ g_warning ("Could not load keyfile %s: %s",
+ localnet->keyfile_name, error->message);
+ g_error_free (error);
+ }
+ geoclue_localnet_load_gateways_from_keyfile (localnet, keyfile);
+ g_key_file_free (keyfile);
+
+- localnet->conn = geoclue_connectivity_new ();
++
+ }
+
+ typedef struct {
+@@ -288,7 +369,7 @@
+ } localnet_keyfile_group;
+
+ static void
+-add_address_detail_to_keyfile (char *key, char *value,
++add_address_detail_to_keyfile (char *key, char *value,
+ localnet_keyfile_group *group)
+ {
+ g_key_file_set_string (group->keyfile, group->group_name,
+@@ -300,18 +381,20 @@
+ GHashTable *details,
+ GError **error)
+ {
+- char *str, *mac;
++ char *str, *mac = NULL;
+ GKeyFile *keyfile;
+ GError *int_err = NULL;
+ localnet_keyfile_group *keyfile_group;
+ Gateway *gw;
+-
++
+ if (!details) {
+ /* TODO set error */
+ return FALSE;
+ }
+
+- mac = geoclue_connectivity_get_router_mac (localnet->conn);
++ if (get_mac_address (&mac) < 0)
++ return FALSE;
++
+ if (!mac) {
+ g_warning ("Couldn't get current gateway mac address");
+ /* TODO set error */
+@@ -319,23 +402,23 @@
+ }
+ /* reload keyfile just in case it's changed */
+ keyfile = g_key_file_new ();
+- if (!g_key_file_load_from_file (keyfile, localnet->keyfile_name,
++ if (!g_key_file_load_from_file (keyfile, localnet->keyfile_name,
+ G_KEY_FILE_NONE, &int_err)) {
+- g_warning ("Could not load keyfile %s: %s",
++ g_warning ("Could not load keyfile %s: %s",
+ localnet->keyfile_name, int_err->message);
+ g_error_free (int_err);
+ int_err = NULL;
+ }
+-
++
+ /* remove old group (if exists) and add new to GKeyFile */
+ g_key_file_remove_group (keyfile, mac, NULL);
+-
++
+ keyfile_group = g_new0 (localnet_keyfile_group, 1);
+ keyfile_group->keyfile = keyfile;
+ keyfile_group->group_name = mac;
+ g_hash_table_foreach (details, (GHFunc) add_address_detail_to_keyfile, keyfile_group);
+ g_free (keyfile_group);
+-
++
+ /* save keyfile*/
+ str = g_key_file_to_data (keyfile, NULL, &int_err);
+ if (int_err) {
+@@ -346,7 +429,7 @@
+ /* TODO set error */
+ return FALSE;
+ }
+-
++
+ g_file_set_contents (localnet->keyfile_name, str, -1, &int_err);
+ g_free (str);
+ if (int_err) {
+@@ -357,16 +440,16 @@
+ /* TODO set error */
+ return FALSE;
+ }
+-
++
+ /* re-parse keyfile */
+ free_gateway_list (localnet->gateways);
+ localnet->gateways = NULL;
+ geoclue_localnet_load_gateways_from_keyfile (localnet, keyfile);
+ g_key_file_free (keyfile);
+-
++
+ gw = geoclue_localnet_find_gateway (localnet, mac);
+ g_free (mac);
+-
++
+ if (gw) {
+ gc_iface_address_emit_address_changed (GC_IFACE_ADDRESS (localnet),
+ time (NULL), gw->address, gw->accuracy);
+@@ -389,11 +472,11 @@
+ {
+ GHashTable *address;
+ gboolean ret;
+-
++
+ address = geoclue_address_details_new ();
+ if (country_code && (strlen (country_code) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE),
++ g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE),
+ g_strdup (country_code));
+ if (!country) {
+ geoclue_address_details_set_country_from_code (address);
+@@ -401,35 +484,35 @@
+ }
+ if (country && (strlen (country) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY),
++ g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY),
+ g_strdup (country));
+ }
+ if (region && (strlen (region) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_REGION),
++ g_strdup (GEOCLUE_ADDRESS_KEY_REGION),
+ g_strdup (region));
+ }
+ if (locality && (strlen (locality) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY),
++ g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY),
+ g_strdup (locality));
+ }
+ if (area && (strlen (area) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_AREA),
++ g_strdup (GEOCLUE_ADDRESS_KEY_AREA),
+ g_strdup (area));
+ }
+ if (postalcode && (strlen (postalcode) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE),
++ g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE),
+ g_strdup (postalcode));
+ }
+ if (street && (strlen (street) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_STREET),
++ g_strdup (GEOCLUE_ADDRESS_KEY_STREET),
+ g_strdup (street));
+ }
+-
++
+ ret = geoclue_localnet_set_address (localnet,
+ address,
+ error);
+@@ -445,27 +528,35 @@
+ GError **error)
+ {
+ GeoclueLocalnet *localnet;
+- char *mac;
++ int i, ret_val;
++ char *mac = NULL;
+ Gateway *gw;
+-
++
+ localnet = GEOCLUE_LOCALNET (gc);
+
+- /* we may be trying to read /proc/net/arp right after network connection.
++ /* we may be trying to read /proc/net/arp right after network connection.
+ * It's sometimes not up yet, try a couple of times */
+- mac = geoclue_connectivity_get_router_mac (localnet->conn);
++ for (i = 0; i < 5; i++) {
++ ret_val = get_mac_address (&mac);
++ if (ret_val < 0)
++ return FALSE;
++ else if (ret_val == 1)
++ break;
++ usleep (200);
++ }
+
+ if (!mac) {
+ g_warning ("Couldn't get current gateway mac address");
+ if (error) {
+- g_set_error (error, GEOCLUE_ERROR,
++ g_set_error (error, GEOCLUE_ERROR,
+ GEOCLUE_ERROR_NOT_AVAILABLE, "Could not get current gateway mac address");
+ }
+ return FALSE;
+ }
+-
++
+ gw = geoclue_localnet_find_gateway (localnet, mac);
+ g_free (mac);
+-
++
+ if (timestamp) {
+ *timestamp = time(NULL);
+ }
+@@ -497,16 +588,16 @@
+ char **argv)
+ {
+ GeoclueLocalnet *localnet;
+-
++
+ g_type_init ();
+-
++
+ localnet = g_object_new (GEOCLUE_TYPE_LOCALNET, NULL);
+ localnet->loop = g_main_loop_new (NULL, TRUE);
+-
++
+ g_main_loop_run (localnet->loop);
+-
++
+ g_main_loop_unref (localnet->loop);
+ g_object_unref (localnet);
+-
++
+ return 0;
+ }
+Index: geoclue/providers/manual/Makefile.am
+===================================================================
+--- geoclue.orig/providers/manual/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/manual/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -10,7 +10,7 @@
+ $(nodist_geoclue_manual_SOURCES)
+
+ geoclue_manual_SOURCES = \
+- geoclue-manual.c
++ geoclue-manual.c
+
+ geoclue_manual_CFLAGS = \
+ -I$(top_srcdir) \
+@@ -30,7 +30,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ CLEANFILES = \
+ stamp-geoclue-manual-glue.h
+@@ -48,7 +48,7 @@
+ @true
+
+ stamp-geoclue-manual-glue.h: geoclue-manual.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=geoclue_manual --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=geoclue_manual --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+Index: geoclue/providers/manual/geoclue-manual.c
+===================================================================
+--- geoclue.orig/providers/manual/geoclue-manual.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/manual/geoclue-manual.c 2011-12-29 16:40:38.926428900 +0900
+@@ -23,17 +23,17 @@
+ */
+
+ /** Geoclue manual provider
+- *
+- * This is an address provider which gets its address data from user
+- * input. No UI is included, any application may query the address from
++ *
++ * This is an address provider which gets its address data from user
++ * input. No UI is included, any application may query the address from
+ * the user and submit it to manual provider through the D-Bus API:
+ * org.freedesktop.Geoclue.Manual.SetAddress
+ * org.freedesktop.Geoclue.Manual.SetAddressFields
+- *
+- * SetAddress allows setting the current address as a GeoclueAddress,
+- * while SetAddressFields is a convenience version with separate
++ *
++ * SetAddress allows setting the current address as a GeoclueAddress,
++ * while SetAddressFields is a convenience version with separate
+ * address fields. Shell example using SetAddressFields:
+- *
++ *
+ * dbus-send --print-reply --type=method_call \
+ * --dest=org.freedesktop.Geoclue.Providers.Manual \
+ * /org/freedesktop/Geoclue/Providers/Manual \
+@@ -46,10 +46,10 @@
+ * string: \
+ * string: \
+ * string:"Solnantie 24"
+- *
+- * This would make the provider emit a AddressChanged signal with
+- * accuracy level GEOCLUE_ACCURACY_STREET. Unless new SetAddress* calls
+- * are made, provider will emit another signal in two hours (7200 sec),
++ *
++ * This would make the provider emit a AddressChanged signal with
++ * accuracy level GEOCLUE_ACCURACY_STREET. Unless new SetAddress* calls
++ * are made, provider will emit another signal in two hours (7200 sec),
+ * with empty address and GEOCLUE_ACCURACY_NONE.
+ **/
+
+@@ -63,11 +63,11 @@
+
+ typedef struct {
+ GcProvider parent;
+-
++
+ GMainLoop *loop;
+-
++
+ guint event_id;
+-
++
+ int timestamp;
+ GHashTable *address;
+ GeoclueAccuracy *accuracy;
+@@ -130,15 +130,7 @@
+ GeoclueStatus *status,
+ GError **error)
+ {
+- GeoclueAccuracyLevel level;
+-
+- geoclue_accuracy_get_details (GEOCLUE_MANUAL (gc)->accuracy,
+- &level, NULL, NULL);
+- if (level == GEOCLUE_ACCURACY_LEVEL_NONE) {
+- *status = GEOCLUE_STATUS_UNAVAILABLE;
+- } else {
+- *status = GEOCLUE_STATUS_AVAILABLE;
+- }
++ *status = GEOCLUE_STATUS_AVAILABLE;
+ return TRUE;
+ }
+
+@@ -146,19 +138,19 @@
+ shutdown (GcProvider *provider)
+ {
+ GeoclueManual *manual;
+-
++
+ manual = GEOCLUE_MANUAL (provider);
+ g_main_loop_quit (manual->loop);
+ }
+
+-gboolean
++gboolean
+ validity_ended (GeoclueManual *manual)
+ {
+ manual->event_id = 0;
+ g_hash_table_remove_all (manual->address);
+ geoclue_accuracy_set_details (manual->accuracy,
+ GEOCLUE_ACCURACY_LEVEL_NONE, 0, 0);
+-
++
+ gc_iface_address_emit_address_changed (GC_IFACE_ADDRESS (manual),
+ manual->timestamp,
+ manual->address,
+@@ -175,24 +167,24 @@
+ if (manual->event_id > 0) {
+ g_source_remove (manual->event_id);
+ }
+-
++
+ manual->timestamp = time (NULL);
+-
++
+ g_hash_table_destroy (manual->address);
+ manual->address = address;
+-
++
+ geoclue_accuracy_set_details (manual->accuracy,
+ get_accuracy_for_address (address),
+ 0, 0);
+-
++
+ gc_iface_address_emit_address_changed (GC_IFACE_ADDRESS (manual),
+ manual->timestamp,
+ manual->address,
+ manual->accuracy);
+-
++
+ if (valid_for > 0) {
+- manual->event_id = g_timeout_add (valid_for * 1000,
+- (GSourceFunc)validity_ended,
++ manual->event_id = g_timeout_add (valid_for * 1000,
++ (GSourceFunc)validity_ended,
+ manual);
+ }
+ }
+@@ -222,44 +214,44 @@
+ GError **error)
+ {
+ GHashTable *address;
+-
++
+ address = geoclue_address_details_new ();
+ if (country_code && (strlen (country_code) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE),
++ g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE),
+ g_strdup (country_code));
+ }
+ if (country && (strlen (country) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY),
++ g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY),
+ g_strdup (country));
+ }
+ if (region && (strlen (region) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_REGION),
++ g_strdup (GEOCLUE_ADDRESS_KEY_REGION),
+ g_strdup (region));
+ }
+ if (locality && (strlen (locality) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY),
++ g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY),
+ g_strdup (locality));
+ }
+ if (area && (strlen (area) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_AREA),
++ g_strdup (GEOCLUE_ADDRESS_KEY_AREA),
+ g_strdup (area));
+ }
+ if (postalcode && (strlen (postalcode) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE),
++ g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE),
+ g_strdup (postalcode));
+ }
+ if (street && (strlen (street) > 0)) {
+ g_hash_table_insert (address,
+- g_strdup (GEOCLUE_ADDRESS_KEY_STREET),
++ g_strdup (GEOCLUE_ADDRESS_KEY_STREET),
+ g_strdup (street));
+ }
+-
++
+ geoclue_manual_set_address_common (manual,
+ valid_for,
+ address);
+@@ -271,12 +263,12 @@
+ finalize (GObject *object)
+ {
+ GeoclueManual *manual;
+-
++
+ manual = GEOCLUE_MANUAL (object);
+-
++
+ g_hash_table_destroy (manual->address);
+ geoclue_accuracy_free (manual->accuracy);
+-
++
+ ((GObjectClass *) geoclue_manual_parent_class)->finalize (object);
+ }
+
+@@ -285,12 +277,12 @@
+ {
+ GObjectClass *o_class = (GObjectClass *) klass;
+ GcProviderClass *p_class = (GcProviderClass *) klass;
+-
++
+ o_class->finalize = finalize;
+-
++
+ p_class->get_status = get_status;
+ p_class->shutdown = shutdown;
+-
++
+ dbus_g_object_type_install_info (geoclue_manual_get_type (),
+ &dbus_glib_geoclue_manual_object_info);
+ }
+@@ -302,9 +294,9 @@
+ "org.freedesktop.Geoclue.Providers.Manual",
+ "/org/freedesktop/Geoclue/Providers/Manual",
+ "Manual", "Manual provider");
+-
++
+ manual->address = geoclue_address_details_new ();
+- manual->accuracy =
++ manual->accuracy =
+ geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0, 0);
+ }
+
+@@ -316,15 +308,7 @@
+ GError **error)
+ {
+ GeoclueManual *manual = GEOCLUE_MANUAL (gc);
+- GeoclueAccuracyLevel level;
+-
+- geoclue_accuracy_get_details (manual->accuracy, &level, NULL, NULL);
+- if (level == GEOCLUE_ACCURACY_LEVEL_NONE) {
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
+- "No manual address set");
+- return FALSE;
+- }
++
+
+ if (timestamp) {
+ *timestamp = manual->timestamp;
+@@ -335,7 +319,7 @@
+ if (accuracy) {
+ *accuracy = geoclue_accuracy_copy (manual->accuracy);
+ }
+-
++
+ return TRUE;
+ }
+
+@@ -350,16 +334,16 @@
+ char **argv)
+ {
+ GeoclueManual *manual;
+-
++
+ g_type_init ();
+-
++
+ manual = g_object_new (GEOCLUE_TYPE_MANUAL, NULL);
+ manual->loop = g_main_loop_new (NULL, TRUE);
+-
++
+ g_main_loop_run (manual->loop);
+-
++
+ g_main_loop_unref (manual->loop);
+ g_object_unref (manual);
+-
++
+ return 0;
+ }
+Index: geoclue/providers/nominatim/Makefile.am
+===================================================================
+--- geoclue.orig/providers/nominatim/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/nominatim/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -15,7 +15,7 @@
+
+ geoclue_nominatim_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/geoclue/libgeoclue.la
++ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-nominatim.provider
+@@ -25,7 +25,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/plazes/Makefile.am
+===================================================================
+--- geoclue.orig/providers/plazes/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/plazes/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -7,13 +7,11 @@
+ geoclue_plazes_CFLAGS = \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+- -I$(top_srcdir)/src \
+ $(GEOCLUE_CFLAGS)
+
+ geoclue_plazes_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/src/libconnectivity.la \
+- $(top_builddir)/geoclue/libgeoclue.la
++ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-plazes.provider
+@@ -23,7 +21,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/plazes/geoclue-plazes.c
+===================================================================
+--- geoclue.orig/providers/plazes/geoclue-plazes.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/plazes/geoclue-plazes.c 2011-12-29 16:40:38.926428900 +0900
+@@ -1,7 +1,7 @@
+ /*
+ * Geoclue
+ * geoclue-plazes.c - A plazes.com-based Address/Position provider
+- *
++ *
+ * Author: Jussi Kukkonen <jku@o-hand.com>
+ * Copyright 2008 by Garmin Ltd. or its subsidiaries
+ *
+@@ -38,8 +38,6 @@
+ #include <geoclue/gc-iface-position.h>
+ #include <geoclue/gc-iface-address.h>
+
+-#include "connectivity.h"
+-
+ #define GEOCLUE_DBUS_SERVICE_PLAZES "org.freedesktop.Geoclue.Providers.Plazes"
+ #define GEOCLUE_DBUS_PATH_PLAZES "/org/freedesktop/Geoclue/Providers/Plazes"
+ #define PLAZES_URL "http://plazes.com/suggestions.xml"
+@@ -53,7 +51,6 @@
+ typedef struct _GeocluePlazes {
+ GcProvider parent;
+ GMainLoop *loop;
+- GeoclueConnectivity *conn;
+ GcWebService *web_service;
+ GeoclueStatus last_status;
+ } GeocluePlazes;
+@@ -102,19 +99,98 @@
+ }
+ }
+
+-static char *
+-mac_strdown (char *mac)
++/* Parse /proc/net/route to get default gateway address and then parse
++ * /proc/net/arp to find matching mac address.
++ *
++ * There are some problems with this. First, it's IPv4 only.
++ * Second, there must be a way to do this with ioctl, but that seemed really
++ * complicated... even /usr/sbin/arp parses /proc/net/arp
++ *
++ * returns:
++ * 1 : on success
++ * 0 : no success, no errors
++ * <0 : error
++ */
++int
++get_mac_address (char **mac)
+ {
+- guint i;
+- for (i = 0; mac[i] != '\0' ; i++) {
+- if (g_ascii_isalpha (mac[i]))
+- mac[i] = g_ascii_tolower (mac[i]);
++ char *content;
++ char **lines, **entry;
++ GError *error = NULL;
++ char *route_gateway = NULL;
++
++ g_assert (*mac == NULL);
++
++ if (!g_file_get_contents ("/proc/net/route", &content, NULL, &error)) {
++ g_warning ("Failed to read /proc/net/route: %s", error->message);
++ g_error_free (error);
++ return -1;
++ }
++
++ lines = g_strsplit (content, "\n", 0);
++ g_free (content);
++ entry = lines + 1;
++
++ while (*entry && strlen (*entry) > 0) {
++ char dest[9];
++ char gateway[9];
++ if (sscanf (*entry,
++ "%*s %8[0-9A-Fa-f] %8[0-9A-Fa-f] %*s",
++ dest, gateway) != 2) {
++ g_warning ("Failed to parse /proc/net/route entry '%s'", *entry);
++ } else if (strcmp (dest, "00000000") == 0) {
++ route_gateway = g_strdup (gateway);
++ break;
++ }
++ entry++;
+ }
+- return mac;
++ g_strfreev (lines);
++
++ if (!route_gateway) {
++ g_warning ("Failed to find default route in /proc/net/route");
++ return -1;
++ }
++
++ if (!g_file_get_contents ("/proc/net/arp", &content, NULL, &error)) {
++ g_warning ("Failed to read /proc/net/arp: %s", error->message);
++ g_error_free (error);
++ return -1;
++ }
++
++ lines = g_strsplit (content, "\n", 0);
++ g_free (content);
++ entry = lines+1;
++ while (*entry && strlen (*entry) > 0) {
++ char hwa[100];
++ char *arp_gateway;
++ int ip[4];
++
++ if (sscanf(*entry,
++ "%d.%d.%d.%d 0x%*x 0x%*x %100s %*s %*s\n",
++ &ip[0], &ip[1], &ip[2], &ip[3], hwa) != 5) {
++ g_warning ("Failed to parse /proc/net/arp entry '%s'", *entry);
++ } else {
++ arp_gateway = g_strdup_printf ("%02X%02X%02X%02X", ip[3], ip[2], ip[1], ip[0]);
++ if (strcmp (arp_gateway, route_gateway) == 0) {
++ g_free (arp_gateway);
++ *mac = g_strdup (hwa);
++ break;
++ }
++ g_free (arp_gateway);
++
++ }
++ entry++;
++ }
++ g_free (route_gateway);
++ g_strfreev (lines);
++
++ return *mac ? 1 : 0;
+ }
++
++
+ /* Position interface implementation */
+
+-static gboolean
++static gboolean
+ geoclue_plazes_get_position (GcIfacePosition *iface,
+ GeocluePositionFields *fields,
+ int *timestamp,
+@@ -125,34 +201,41 @@
+ GError **error)
+ {
+ GeocluePlazes *plazes;
+- char *mac, *mac_lc;
+-
++ int i, ret_val;
++ char *mac = NULL;
++
+ plazes = (GEOCLUE_PLAZES (iface));
+-
++
+ *fields = GEOCLUE_POSITION_FIELDS_NONE;
+ if (timestamp) {
+ *timestamp = time (NULL);
+ }
+
+- mac = geoclue_connectivity_get_router_mac (plazes->conn);
++ /* we may be trying to read /proc/net/arp right after network connection.
++ * It's sometimes not up yet, try a couple of times */
++ for (i = 0; i < 5; i++) {
++ ret_val = get_mac_address (&mac);
++ if (ret_val < 0)
++ return FALSE;
++ else if (ret_val == 1)
++ break;
++ usleep (200);
++ }
++
+ if (mac == NULL) {
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
++ g_set_error (error, GEOCLUE_ERROR,
++ GEOCLUE_ERROR_NOT_AVAILABLE,
+ "Router mac address query failed");
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ERROR);
+ return FALSE;
+ }
+
+- mac = mac_strdown (mac);
+-
+- geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ACQUIRING);
++ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ACQUIRING);
+
+- mac_lc = g_ascii_strdown (mac, -1);
+- g_free (mac);
+ if (!gc_web_service_query (plazes->web_service, error,
+ PLAZES_KEY_MAC, mac,
+ (char *)0)) {
+- g_free (mac_lc);
++ g_free (mac);
+ // did not get a reply; we can try again later
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_AVAILABLE);
+ g_set_error (error, GEOCLUE_ERROR,
+@@ -161,36 +244,34 @@
+ return FALSE;
+ }
+
+- g_free (mac);
+-
+- if (latitude && gc_web_service_get_double (plazes->web_service,
++ if (latitude && gc_web_service_get_double (plazes->web_service,
+ latitude, PLAZES_LAT_XPATH)) {
+ *fields |= GEOCLUE_POSITION_FIELDS_LATITUDE;
+ }
+- if (longitude && gc_web_service_get_double (plazes->web_service,
++ if (longitude && gc_web_service_get_double (plazes->web_service,
+ longitude, PLAZES_LON_XPATH)) {
+ *fields |= GEOCLUE_POSITION_FIELDS_LONGITUDE;
+ }
+-
++
+ if (accuracy) {
+- /* Educated guess. Plazes are typically hand pointed on
+- * a map, or geocoded from address, so should be fairly
++ /* Educated guess. Plazes are typically hand pointed on
++ * a map, or geocoded from address, so should be fairly
+ * accurate */
+ *accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_STREET, 0, 0);
+ }
+-
++
+ if (!(*fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+ *fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)) {
+
+ // we got a reply, but could not exploit it. It would probably be the
+ // same next time.
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ERROR);
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
++ g_set_error (error, GEOCLUE_ERROR,
++ GEOCLUE_ERROR_NOT_AVAILABLE,
+ "Could not understand reply from server");
+ return FALSE;
+ }
+-
++
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_AVAILABLE);
+
+ return TRUE;
+@@ -198,55 +279,62 @@
+
+ /* Address interface implementation */
+
+-static gboolean
++static gboolean
+ geoclue_plazes_get_address (GcIfaceAddress *iface,
+ int *timestamp,
+ GHashTable **address,
+ GeoclueAccuracy **accuracy,
+ GError **error)
+ {
+-
++
+ GeocluePlazes *plazes = GEOCLUE_PLAZES (iface);
+- char *mac, *mac_lc;
++ int i, ret_val;
++ char *mac = NULL;
+
+ GeoclueAccuracyLevel level = GEOCLUE_ACCURACY_LEVEL_NONE;
+-
++
+ if (timestamp) {
+ *timestamp = time (NULL);
+ }
+
+- mac = geoclue_connectivity_get_router_mac (plazes->conn);
++ /* we may be trying to read /proc/net/arp right after network connection.
++ * It's sometimes not up yet, try a couple of times */
++ for (i = 0; i < 5; i++) {
++ ret_val = get_mac_address (&mac);
++ if (ret_val < 0)
++ return FALSE;
++ else if (ret_val == 1)
++ break;
++ usleep (200);
++ }
+
+ if (mac == NULL) {
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
++ g_set_error (error, GEOCLUE_ERROR,
++ GEOCLUE_ERROR_NOT_AVAILABLE,
+ "Router mac address query failed");
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ERROR);
+ return FALSE;
+ }
+-
++
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ACQUIRING);
+
+- mac_lc = g_ascii_strdown (mac, -1);
+- g_free (mac);
+ if (!gc_web_service_query (plazes->web_service, error,
+- PLAZES_KEY_MAC, mac_lc,
++ PLAZES_KEY_MAC, mac,
+ (char *)0)) {
+- g_free (mac_lc);
++ g_free (mac);
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_AVAILABLE);
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
++ g_set_error (error, GEOCLUE_ERROR,
++ GEOCLUE_ERROR_NOT_AVAILABLE,
+ "Did not get reply from server");
+ return FALSE;
+ }
+- g_free (mac_lc);
+
+ if (address) {
+ char *str;
+-
++
+ *address = geoclue_address_details_new ();
+-
+- if (gc_web_service_get_string (plazes->web_service,
++
++ if (gc_web_service_get_string (plazes->web_service,
+ &str, "//plaze/country")) {
+ geoclue_address_details_insert (*address,
+ GEOCLUE_ADDRESS_KEY_COUNTRY,
+@@ -254,7 +342,7 @@
+ g_free (str);
+ level = GEOCLUE_ACCURACY_LEVEL_COUNTRY;
+ }
+- if (gc_web_service_get_string (plazes->web_service,
++ if (gc_web_service_get_string (plazes->web_service,
+ &str, "//plaze/country_code")) {
+ geoclue_address_details_insert (*address,
+ GEOCLUE_ADDRESS_KEY_COUNTRYCODE,
+@@ -262,7 +350,7 @@
+ g_free (str);
+ level = GEOCLUE_ACCURACY_LEVEL_COUNTRY;
+ }
+- if (gc_web_service_get_string (plazes->web_service,
++ if (gc_web_service_get_string (plazes->web_service,
+ &str, "//plaze/city")) {
+ geoclue_address_details_insert (*address,
+ GEOCLUE_ADDRESS_KEY_LOCALITY,
+@@ -270,7 +358,7 @@
+ g_free (str);
+ level = GEOCLUE_ACCURACY_LEVEL_LOCALITY;
+ }
+- if (gc_web_service_get_string (plazes->web_service,
++ if (gc_web_service_get_string (plazes->web_service,
+ &str, "//plaze/zip_code")) {
+ geoclue_address_details_insert (*address,
+ GEOCLUE_ADDRESS_KEY_POSTALCODE,
+@@ -278,7 +366,7 @@
+ g_free (str);
+ level = GEOCLUE_ACCURACY_LEVEL_POSTALCODE;
+ }
+- if (gc_web_service_get_string (plazes->web_service,
++ if (gc_web_service_get_string (plazes->web_service,
+ &str, "//plaze/address")) {
+ geoclue_address_details_insert (*address,
+ GEOCLUE_ADDRESS_KEY_STREET,
+@@ -292,8 +380,8 @@
+ // we got a reply, but could not exploit it. It would probably be the
+ // same next time.
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_ERROR);
+- g_set_error (error, GEOCLUE_ERROR,
+- GEOCLUE_ERROR_NOT_AVAILABLE,
++ g_set_error (error, GEOCLUE_ERROR,
++ GEOCLUE_ERROR_NOT_AVAILABLE,
+ "Could not understand reply from server");
+ return FALSE;
+ }
+@@ -301,7 +389,7 @@
+ if (accuracy) {
+ *accuracy = geoclue_accuracy_new (level, 0, 0);
+ }
+-
++
+ return TRUE;
+ }
+
+@@ -310,12 +398,8 @@
+ {
+ GeocluePlazes *plazes = GEOCLUE_PLAZES (obj);
+
+- if (plazes->conn != NULL) {
+- g_object_unref (plazes->conn);
+- plazes->conn = NULL;
+- }
+ g_object_unref (plazes->web_service);
+-
++
+ ((GObjectClass *) geoclue_plazes_parent_class)->finalize (obj);
+ }
+
+@@ -327,22 +411,21 @@
+ {
+ GcProviderClass *p_class = (GcProviderClass *)klass;
+ GObjectClass *o_class = (GObjectClass *)klass;
+-
++
+ p_class->shutdown = shutdown;
+ p_class->get_status = geoclue_plazes_get_status;
+-
++
+ o_class->finalize = geoclue_plazes_finalize;
+ }
+
+ static void
+ geoclue_plazes_init (GeocluePlazes *plazes)
+ {
+- gc_provider_set_details (GC_PROVIDER (plazes),
++ gc_provider_set_details (GC_PROVIDER (plazes),
+ GEOCLUE_DBUS_SERVICE_PLAZES,
+ GEOCLUE_DBUS_PATH_PLAZES,
+ "Plazes", "Plazes.com based provider, uses gateway mac address to locate");
+
+- plazes->conn = geoclue_connectivity_new ();
+ plazes->web_service = g_object_new (GC_TYPE_WEB_SERVICE, NULL);
+ gc_web_service_set_base_url (plazes->web_service, PLAZES_URL);
+ geoclue_plazes_set_status (plazes, GEOCLUE_STATUS_AVAILABLE);
+@@ -360,18 +443,18 @@
+ iface->get_address = geoclue_plazes_get_address;
+ }
+
+-int
++int
+ main()
+ {
+ g_type_init();
+-
++
+ GeocluePlazes *o = g_object_new (GEOCLUE_TYPE_PLAZES, NULL);
+ o->loop = g_main_loop_new (NULL, TRUE);
+-
++
+ g_main_loop_run (o->loop);
+-
++
+ g_main_loop_unref (o->loop);
+ g_object_unref (o);
+-
++
+ return 0;
+ }
+Index: geoclue/providers/skyhook/Makefile.am
+===================================================================
+--- geoclue.orig/providers/skyhook/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/skyhook/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -7,14 +7,12 @@
+ geoclue_skyhook_CFLAGS = \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+- -I$(top_srcdir)/src \
+ $(GEOCLUE_CFLAGS) \
+ $(SKYHOOK_CFLAGS)
+
+ geoclue_skyhook_LDADD = \
+ $(GEOCLUE_LIBS) \
+ $(SKYHOOK_LIBS) \
+- $(top_builddir)/src/libconnectivity.la \
+ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+@@ -25,7 +23,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/providers/skyhook/geoclue-skyhook.c
+===================================================================
+--- geoclue.orig/providers/skyhook/geoclue-skyhook.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/skyhook/geoclue-skyhook.c 2011-12-29 16:40:38.926428900 +0900
+@@ -1,7 +1,7 @@
+ /*
+ * Geoclue
+ * geoclue-skyhook.c - A skyhook.com-based Address/Position provider
+- *
++ *
+ * Author: Bastien Nocera <hadess@hadess.net>
+ * Copyright 2009 Bastien Nocera
+ */
+@@ -22,8 +22,6 @@
+ #include <geoclue/geoclue-error.h>
+ #include <geoclue/gc-iface-position.h>
+
+-#include "connectivity.h"
+-
+ #define GEOCLUE_DBUS_SERVICE_SKYHOOK "org.freedesktop.Geoclue.Providers.Skyhook"
+ #define GEOCLUE_DBUS_PATH_SKYHOOK "/org/freedesktop/Geoclue/Providers/Skyhook"
+ #define SKYHOOK_URL "https://api.skyhookwireless.com/wps2/location"
+@@ -34,15 +32,12 @@
+ #define GEOCLUE_TYPE_SKYHOOK (geoclue_skyhook_get_type ())
+ #define GEOCLUE_SKYHOOK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEOCLUE_TYPE_SKYHOOK, GeoclueSkyhook))
+
+-#define QUERY_START "<?xml version=\'1.0\'?><LocationRQ xmlns=\'http://skyhookwireless.com/wps/2005\' version=\'2.6\' street-address-lookup=\'full\'><authentication version=\'2.0\'><simple><username>beta</username><realm>js.loki.com</realm></simple></authentication>"
+-#define QUERY_AP "<access-point><mac>%s</mac><signal-strength>%d</signal-strength></access-point>"
+-#define QUERY_END "</LocationRQ>"
++#define QUERY "<?xml version=\'1.0\'?><LocationRQ xmlns=\'http://skyhookwireless.com/wps/2005\' version=\'2.6\' street-address-lookup=\'full\'><authentication version=\'2.0\'><simple><username>beta</username><realm>js.loki.com</realm></simple></authentication><access-point><mac>%s</mac><signal-strength>-50</signal-strength></access-point></LocationRQ>"
+
+ typedef struct _GeoclueSkyhook {
+ GcProvider parent;
+ GMainLoop *loop;
+ SoupSession *session;
+- GeoclueConnectivity *conn;
+ } GeoclueSkyhook;
+
+ typedef struct _GeoclueSkyhookClass {
+@@ -77,38 +72,66 @@
+ g_main_loop_quit (skyhook->loop);
+ }
+
+-static void
+-add_ap (gpointer key,
+- gpointer value,
+- gpointer data)
+-{
+- char *mac;
+- char **split;
++#define MAC_LEN 18
+
+- /* Remove the ":" */
+- split = g_strsplit (key, ":", -1);
+- mac = g_strjoinv ("", split);
+- g_strfreev (split);
++static char *
++get_mac_address (void)
++ {
++ /* this is an ugly hack, but it seems there is no easy
++ * ioctl-based way to get the mac address of the router. This
++ * implementation expects the system to have netstat, grep and awk
++ * */
++
++ FILE *in;
++ char mac[MAC_LEN];
++ int i;
++
++ /*for some reason netstat or /proc/net/arp isn't always ready
++ * when a connection is already up... Try a couple of times */
++ for (i=0; i<10; i++) {
++ if (!(in = popen ("ROUTER_IP=`netstat -rn | grep '^0.0.0.0 ' | awk '{ print $2 }'` && grep \"^$ROUTER_IP \" /proc/net/arp | awk '{print $4}'", "r"))) {
++ g_warning ("popen failed");
++ return NULL;
++ }
+
+- g_string_append_printf (data, QUERY_AP, mac, GPOINTER_TO_INT (value));
+- g_free (mac);
++ if (!(fgets (mac, MAC_LEN, in))) {
++ if (errno != ENOENT && errno != EAGAIN) {
++ g_debug ("error %d", errno);
++ return NULL;
++ }
++ /* try again */
++ pclose (in);
++ g_debug ("trying again...");
++ g_usleep (200);
++ continue;
++ }
++ pclose (in);
++ return g_strdup (mac);
++ }
++ return NULL;
+ }
+
+ static char *
+-create_post_query (GeoclueConnectivity *conn)
++create_post_query (void)
+ {
+- GHashTable *ht;
+- GString *str;
++ char *mac, *query;
++ char **split;
+
+- ht = geoclue_connectivity_get_aps (conn);
+- if (ht == NULL)
++ mac = get_mac_address ();
++ if (mac == NULL)
++ return NULL;
++ /* Remove the ":" */
++ split = g_strsplit (mac, ":", -1);
++ g_free (mac);
++ if (split == NULL)
+ return NULL;
+- str = g_string_new (QUERY_START);
+- g_hash_table_foreach (ht, add_ap, str);
+- g_string_append (str, QUERY_END);
+- g_hash_table_destroy (ht);
++ mac = g_strjoinv ("", split);
++ g_strfreev (split);
++
++ query = g_strdup_printf (QUERY, mac);
++ g_free (mac);
+
+- return g_string_free (str, FALSE);
++ return query;
+ }
+
+ static gboolean
+@@ -157,7 +180,7 @@
+
+ /* Position interface implementation */
+
+-static gboolean
++static gboolean
+ geoclue_skyhook_get_position (GcIfacePosition *iface,
+ GeocluePositionFields *fields,
+ int *timestamp,
+@@ -170,16 +193,16 @@
+ GeoclueSkyhook *skyhook;
+ char *query;
+ SoupMessage *msg;
+-
++
+ skyhook = (GEOCLUE_SKYHOOK (iface));
+-
++
+ *fields = GEOCLUE_POSITION_FIELDS_NONE;
+ if (timestamp)
+ *timestamp = time (NULL);
+-
+- query = create_post_query (skyhook->conn);
++
++ query = create_post_query ();
+ if (query == NULL) {
+- g_set_error (error, GEOCLUE_ERROR,
++ g_set_error (error, GEOCLUE_ERROR,
+ GEOCLUE_ERROR_NOT_AVAILABLE,
+ "Router mac address query failed");
+ /* TODO: set status == error ? */
+@@ -228,8 +251,8 @@
+ *accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE,
+ 0, 0);
+ } else {
+- /* Educated guess. Skyhook are typically hand pointed on
+- * a map, or geocoded from address, so should be fairly
++ /* Educated guess. Skyhook are typically hand pointed on
++ * a map, or geocoded from address, so should be fairly
+ * accurate */
+ *accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_STREET,
+ 0, 0);
+@@ -244,12 +267,8 @@
+ {
+ GeoclueSkyhook *skyhook = GEOCLUE_SKYHOOK (obj);
+
+- if (skyhook->conn != NULL) {
+- g_object_unref (skyhook->conn);
+- skyhook->conn = NULL;
+- }
+ g_object_unref (skyhook->session);
+-
++
+ ((GObjectClass *) geoclue_skyhook_parent_class)->finalize (obj);
+ }
+
+@@ -261,22 +280,21 @@
+ {
+ GcProviderClass *p_class = (GcProviderClass *)klass;
+ GObjectClass *o_class = (GObjectClass *)klass;
+-
++
+ p_class->shutdown = _shutdown;
+ p_class->get_status = geoclue_skyhook_get_status;
+-
++
+ o_class->finalize = geoclue_skyhook_finalize;
+ }
+
+ static void
+ geoclue_skyhook_init (GeoclueSkyhook *skyhook)
+ {
+- gc_provider_set_details (GC_PROVIDER (skyhook),
++ gc_provider_set_details (GC_PROVIDER (skyhook),
+ GEOCLUE_DBUS_SERVICE_SKYHOOK,
+ GEOCLUE_DBUS_PATH_SKYHOOK,
+ "Skyhook", "Skyhook.com based provider, uses gateway mac address to locate");
+ skyhook->session = soup_session_sync_new ();
+- skyhook->conn = geoclue_connectivity_new ();
+ }
+
+ static void
+@@ -285,7 +303,7 @@
+ iface->get_position = geoclue_skyhook_get_position;
+ }
+
+-int
++int
+ main()
+ {
+ g_type_init();
+@@ -295,9 +313,9 @@
+ o->loop = g_main_loop_new (NULL, TRUE);
+
+ g_main_loop_run (o->loop);
+-
++
+ g_main_loop_unref (o->loop);
+ g_object_unref (o);
+-
++
+ return 0;
+ }
+Index: geoclue/providers/skyhook/geoclue-skyhook.provider
+===================================================================
+--- geoclue.orig/providers/skyhook/geoclue-skyhook.provider 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/skyhook/geoclue-skyhook.provider 2011-12-29 16:40:38.926428900 +0900
+@@ -1,5 +1,5 @@
+ [Geoclue Provider]
+-Name=Skyhook
++Name=Plazes
+ Service=org.freedesktop.Geoclue.Providers.Skyhook
+ Path=/org/freedesktop/Geoclue/Providers/Skyhook
+ Accuracy=Street
+Index: geoclue/providers/yahoo/Makefile.am
+===================================================================
+--- geoclue.orig/providers/yahoo/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/providers/yahoo/Makefile.am 2011-12-29 16:40:38.926428900 +0900
+@@ -11,7 +11,7 @@
+
+ geoclue_yahoo_LDADD = \
+ $(GEOCLUE_LIBS) \
+- $(top_builddir)/geoclue/libgeoclue.la
++ $(top_builddir)/geoclue/libgeoclue.la
+
+ providersdir = $(datadir)/geoclue-providers
+ providers_DATA = geoclue-yahoo.provider
+@@ -21,7 +21,7 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+ $(service_in_files) \
+Index: geoclue/src/Makefile.am
+===================================================================
+--- geoclue.orig/src/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/Makefile.am 2011-12-29 16:40:38.930428900 +0900
+@@ -1,8 +1,6 @@
+ libexec_PROGRAMS = geoclue-master
+-noinst_LTLIBRARIES = libconnectivity.la
+-noinst_PROGRAMS = test-connectivity
+
+-AM_CFLAGS = \
++geoclue_master_CFLAGS = \
+ -I$(top_srcdir) \
+ -I$(srcdir) \
+ -I$(top_builddir) \
+@@ -11,39 +9,30 @@
+ $(MASTER_CFLAGS) \
+ $(CONNECTIVITY_CFLAGS)
+
+-geoclue_master_LDADD = \
++geoclue_master_LDADD = \
+ $(top_builddir)/geoclue/libgeoclue.la \
+- libconnectivity.la \
+- $(GEOCLUE_LIBS) \
+- $(MASTER_LIBS)
++ $(GEOCLUE_LIBS) \
++ $(MASTER_LIBS) \
++ $(CONNECTIVITY_LIBS)
+
+ NOINST_H_FILES = \
+ main.h \
+ master.h \
+- master-provider.h \
+- client.h
+-
+-libconnectivity_la_SOURCES = \
+- connectivity.h \
++ master-provider.h \
++ client.h \
++ connectivity.h \
+ connectivity-networkmanager.h \
+- connectivity-conic.h \
+- connectivity-connman.h \
+- connectivity.c \
+- connectivity-networkmanager.c \
+- connectivity-conic.c \
+- connectivity-connman.c
+-
+-libconnectivity_la_LIBADD = $(CONNECTIVITY_LIBS)
+-
+-test_connectivity_SOURCES = test-connectivity.c
+-test_connectivity_LDADD = libconnectivity.la $(GEOCLUE_LIBS)
++ connectivity-conic.h
+
+ geoclue_master_SOURCES = \
+ $(NOINST_H_FILES) \
+ client.c \
+ main.c \
+ master.c \
+- master-provider.c
++ master-provider.c \
++ connectivity.c \
++ connectivity-networkmanager.c \
++ connectivity-conic.c
+
+ BUILT_SOURCES = \
+ gc-iface-master-glue.h \
+@@ -52,13 +41,13 @@
+ %-glue.h: stamp-%-glue.h
+ @true
+ stamp-gc-iface-master-glue.h: ../interfaces/gc-iface-master.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_master --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_master --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+
+ stamp-gc-iface-master-client-glue.h: ../interfaces/gc-iface-master-client.xml
+- $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=gc_iface_master_client --mode=glib-server $< > xgen-$(@F) \
++ $(DBUS_BINDING_TOOL) --prefix=gc_iface_master_client --mode=glib-server $< > xgen-$(@F) \
+ && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
+ && rm -f xgen-$(@F) \
+ && echo timestamp > $(@F)
+@@ -68,18 +57,10 @@
+ service_DATA = $(service_in_files:.service.in=.service)
+
+ $(service_DATA): $(service_in_files) Makefile
+- $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+-
+-convertdir = $(datadir)/GConf/gsettings
+-convert_DATA = geoclue
+-
+-gsettings_SCHEMAS = org.freedesktop.Geoclue.gschema.xml
+-@GSETTINGS_RULES@
++ @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+ EXTRA_DIST = \
+- $(service_in_files) \
+- $(gsettings_SCHEMAS) \
+- $(convert_DATA)
++ $(service_in_files)
+
+ CLEANFILES = \
+ $(BUILT_SOURCES) \
+Index: geoclue/src/client.c
+===================================================================
+--- geoclue.orig/src/client.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/client.c 2011-12-29 16:40:38.926428900 +0900
+@@ -25,10 +25,10 @@
+ */
+
+ /** TODO
+- *
+- * might want to write a testing-provider with a gui for
++ *
++ * might want to write a testing-provider with a gui for
+ * choosing what to emit...
+- *
++ *
+ **/
+
+
+@@ -72,13 +72,11 @@
+ GcMasterProvider *position_provider;
+ GList *position_providers;
+ gboolean position_provider_choice_in_progress;
+- time_t last_position_changed;
+
+ gboolean address_started;
+ GcMasterProvider *address_provider;
+ GList *address_providers;
+ gboolean address_provider_choice_in_progress;
+- time_t last_address_changed;
+
+ } GcMasterClientPrivate;
+
+@@ -86,11 +84,11 @@
+
+
+
+-static gboolean gc_iface_master_client_set_requirements (GcMasterClient *client,
+- GeoclueAccuracyLevel min_accuracy,
+- int min_time,
+- gboolean require_updates,
+- GeoclueResourceFlags allowed_resources,
++static gboolean gc_iface_master_client_set_requirements (GcMasterClient *client,
++ GeoclueAccuracyLevel min_accuracy,
++ int min_time,
++ gboolean require_updates,
++ GeoclueResourceFlags allowed_resources,
+ GError **error);
+ static gboolean gc_iface_master_client_position_start (GcMasterClient *client, GError **error);
+ static gboolean gc_iface_master_client_address_start (GcMasterClient *client, GError **error);
+@@ -128,9 +126,9 @@
+ GeoclueStatus status);
+ static void gc_master_client_emit_position_changed (GcMasterClient *client);
+ static void gc_master_client_emit_address_changed (GcMasterClient *client);
+-static gboolean gc_master_client_choose_position_provider (GcMasterClient *client,
++static gboolean gc_master_client_choose_position_provider (GcMasterClient *client,
+ GList *providers);
+-static gboolean gc_master_client_choose_address_provider (GcMasterClient *client,
++static gboolean gc_master_client_choose_address_provider (GcMasterClient *client,
+ GList *providers);
+
+
+@@ -140,29 +138,29 @@
+ GcMasterClient *client)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ g_debug ("client: provider %s status changed: %d", gc_master_provider_get_name (provider), status);
+-
++
+ /* change providers if needed (and if we're not choosing provider already) */
+-
++
+ if (!priv->position_provider_choice_in_progress &&
+ status_change_requires_provider_change (priv->position_providers,
+ priv->position_provider,
+ provider, status) &&
+- gc_master_client_choose_position_provider (client,
++ gc_master_client_choose_position_provider (client,
+ priv->position_providers)) {
+-
++
+ /* we have a new position provider, force-emit position_changed */
+ gc_master_client_emit_position_changed (client);
+ }
+-
++
+ if (!priv->address_provider_choice_in_progress &&
+ status_change_requires_provider_change (priv->address_providers,
+ priv->address_provider,
+ provider, status) &&
+- gc_master_client_choose_address_provider (client,
++ gc_master_client_choose_address_provider (client,
+ priv->address_providers)) {
+-
++
+ /* we have a new address provider, force-emit address_changed */
+ gc_master_client_emit_address_changed (client);
+ }
+@@ -176,40 +174,40 @@
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GcInterfaceAccuracy *accuracy_data;
+-
++
+ accuracy_data = g_new0 (GcInterfaceAccuracy, 1);
+- g_debug ("client: %s accuracy changed (%d)",
++ g_debug ("client: %s accuracy changed (%d)",
+ gc_master_provider_get_name (provider), level);
+-
++
+ accuracy_data->interface = interface;
+ accuracy_data->accuracy_level = priv->min_accuracy;
+ switch (interface) {
+ case GC_IFACE_POSITION:
+- priv->position_providers =
+- g_list_sort_with_data (priv->position_providers,
++ priv->position_providers =
++ g_list_sort_with_data (priv->position_providers,
+ (GCompareDataFunc)gc_master_provider_compare,
+ accuracy_data);
+ if (priv->position_provider_choice_in_progress) {
+ g_debug (" ...but provider choice in progress");
+- } else if (gc_master_client_choose_position_provider (client,
++ } else if (gc_master_client_choose_position_provider (client,
+ priv->position_providers)) {
+ gc_master_client_emit_position_changed (client);
+ }
+ break;
+-
++
+ case GC_IFACE_ADDRESS:
+- priv->address_providers =
+- g_list_sort_with_data (priv->address_providers,
++ priv->address_providers =
++ g_list_sort_with_data (priv->address_providers,
+ (GCompareDataFunc)gc_master_provider_compare,
+ accuracy_data);
+ if (priv->address_provider_choice_in_progress) {
+ g_debug (" ...but provider choice in progress");
+- } else if (gc_master_client_choose_address_provider (client,
++ } else if (gc_master_client_choose_address_provider (client,
+ priv->address_providers)) {
+ gc_master_client_emit_address_changed (client);
+ }
+ break;
+-
++
+ default:
+ g_assert_not_reached ();
+ }
+@@ -226,17 +224,6 @@
+ GeoclueAccuracy *accuracy,
+ GcMasterClient *client)
+ {
+- GcMasterClientPrivate *priv = GET_PRIVATE (client);
+- time_t now;
+-
+- now = time (NULL);
+- if (priv->min_time > (now - priv->last_position_changed)) {
+- /* NOTE: currently no-one makes sure there is an emit
+- * after min_time */
+- return;
+- }
+- priv->last_position_changed = now;
+-
+ gc_iface_position_emit_position_changed
+ (GC_IFACE_POSITION (client),
+ fields,
+@@ -252,17 +239,6 @@
+ GeoclueAccuracy *accuracy,
+ GcMasterClient *client)
+ {
+- GcMasterClientPrivate *priv = GET_PRIVATE (client);
+- time_t now;
+-
+- now = time (NULL);
+- if (priv->min_time > (now - priv->last_address_changed)) {
+- /* NOTE: currently no-one makes sure there is an emit
+- * after min_time */
+- return;
+- }
+- priv->last_address_changed = now;
+-
+ gc_iface_address_emit_address_changed
+ (GC_IFACE_ADDRESS (client),
+ timestamp,
+@@ -279,18 +255,18 @@
+ {
+ if (!provider_list) {
+ return FALSE;
+-
++
+ } else if (current_provider == NULL) {
+ return (status == GEOCLUE_STATUS_AVAILABLE);
+-
++
+ } else if (current_provider == changed_provider) {
+ return (status != GEOCLUE_STATUS_AVAILABLE);
+-
++
+ }else if (status != GEOCLUE_STATUS_AVAILABLE) {
+ return FALSE;
+-
++
+ }
+-
++
+ while (provider_list) {
+ GcMasterProvider *p = provider_list->data;
+ if (p == current_provider) {
+@@ -311,7 +287,7 @@
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GList *l;
+-
++
+ /* connect to common signals if the provider is not already connected */
+ l = providers;
+ while (l) {
+@@ -337,11 +313,11 @@
+ {
+ while (provider_list) {
+ GcMasterProvider *provider = provider_list->data;
+-
++
+ gc_master_provider_unsubscribe (provider, client, iface);
+ provider_list = provider_list->next;
+ }
+-
++
+ }
+
+ /* get_best_provider will return the best provider with status == GEOCLUE_STATUS_AVAILABLE.
+@@ -353,15 +329,15 @@
+ {
+ GList *l = *provider_list;
+ /* TODO: should maybe choose a acquiring provider if better ones are are not available */
+-
++
+ g_debug ("client: choosing best provider");
+-
++
+ while (l) {
+ GcMasterProvider *provider = l->data;
+-
++
+ g_debug (" ...trying provider %s", gc_master_provider_get_name (provider));
+ if (gc_master_provider_subscribe (provider, client, iface)) {
+- /* provider was started, so accuracy may have changed
++ /* provider was started, so accuracy may have changed
+ (which re-sorts provider lists), restart provider selection */
+ /* TODO re-think this: restarting provider selection leads to potentially
+ never-ending looping */
+@@ -372,7 +348,7 @@
+ continue;
+ }
+ /* provider did not need to be started */
+-
++
+ /* TODO: currently returning even providers that are worse than priv->min_accuracy,
+ * if nothing else is available */
+ if (gc_master_provider_get_status (provider) == GEOCLUE_STATUS_AVAILABLE) {
+@@ -382,7 +358,7 @@
+ }
+ l = l->next;
+ }
+-
++
+ /* no provider found */
+ gc_master_client_unsubscribe_providers (client, *provider_list, iface);
+ return NULL;
+@@ -397,8 +373,8 @@
+ double latitude, longitude, altitude;
+ GeoclueAccuracy *accuracy = NULL;
+ GError *error = NULL;
+-
+-
++
++
+ if (priv->position_provider == NULL) {
+ accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0.0, 0.0);
+ gc_iface_position_emit_position_changed
+@@ -410,7 +386,7 @@
+ geoclue_accuracy_free (accuracy);
+ return;
+ }
+-
++
+ fields = gc_master_provider_get_position
+ (priv->position_provider,
+ &timestamp,
+@@ -419,7 +395,7 @@
+ &error);
+ if (error) {
+ /*TODO what now?*/
+- g_warning ("client: failed to get position from %s: %s",
++ g_warning ("client: failed to get position from %s: %s",
+ gc_master_provider_get_name (priv->position_provider),
+ error->message);
+ g_error_free (error);
+@@ -433,7 +409,7 @@
+ accuracy);
+ }
+
+-static void
++static void
+ gc_master_client_emit_address_changed (GcMasterClient *client)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+@@ -441,7 +417,7 @@
+ GHashTable *details = NULL;
+ GeoclueAccuracy *accuracy = NULL;
+ GError *error = NULL;
+-
++
+ if (priv->address_provider == NULL) {
+ accuracy = geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0.0, 0.0);
+ details = g_hash_table_new (g_str_hash, g_str_equal);
+@@ -461,7 +437,7 @@
+ &accuracy,
+ &error)) {
+ /*TODO what now?*/
+- g_warning ("client: failed to get address from %s: %s",
++ g_warning ("client: failed to get address from %s: %s",
+ gc_master_provider_get_name (priv->address_provider),
+ error->message);
+ g_error_free (error);
+@@ -476,40 +452,40 @@
+
+ /* return true if a _new_ provider was chosen */
+ static gboolean
+-gc_master_client_choose_position_provider (GcMasterClient *client,
++gc_master_client_choose_position_provider (GcMasterClient *client,
+ GList *providers)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GcMasterProvider *new_p;
+-
++
+ /* choose and start provider */
+ priv->position_provider_choice_in_progress = TRUE;
+- new_p = gc_master_client_get_best_provider (client,
+- &priv->position_providers,
++ new_p = gc_master_client_get_best_provider (client,
++ &priv->position_providers,
+ GC_IFACE_POSITION);
+ priv->position_provider_choice_in_progress = FALSE;
+-
++
+ if (priv->position_provider && new_p == priv->position_provider) {
+ return FALSE;
+ }
+-
++
+ if (priv->signals[POSITION_CHANGED] > 0) {
+- g_signal_handler_disconnect (priv->position_provider,
++ g_signal_handler_disconnect (priv->position_provider,
+ priv->signals[POSITION_CHANGED]);
+ priv->signals[POSITION_CHANGED] = 0;
+ }
+-
++
+ priv->position_provider = new_p;
+-
++
+ if (priv->position_provider == NULL) {
+ g_debug ("client: position provider changed (to NULL)");
+- g_signal_emit (client, signals[POSITION_PROVIDER_CHANGED], 0,
++ g_signal_emit (client, signals[POSITION_PROVIDER_CHANGED], 0,
+ NULL, NULL, NULL, NULL);
+ return TRUE;
+ }
+-
++
+ g_debug ("client: position provider changed (to %s)", gc_master_provider_get_name (priv->position_provider));
+- g_signal_emit (client, signals[POSITION_PROVIDER_CHANGED], 0,
++ g_signal_emit (client, signals[POSITION_PROVIDER_CHANGED], 0,
+ gc_master_provider_get_name (priv->position_provider),
+ gc_master_provider_get_description (priv->position_provider),
+ gc_master_provider_get_service (priv->position_provider),
+@@ -524,47 +500,47 @@
+
+ /* return true if a _new_ provider was chosen */
+ static gboolean
+-gc_master_client_choose_address_provider (GcMasterClient *client,
++gc_master_client_choose_address_provider (GcMasterClient *client,
+ GList *providers)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GcMasterProvider *new_p;
+-
+-
++
++
+ /* choose and start provider */
+ priv->address_provider_choice_in_progress = TRUE;
+- new_p = gc_master_client_get_best_provider (client,
+- &priv->address_providers,
++ new_p = gc_master_client_get_best_provider (client,
++ &priv->address_providers,
+ GC_IFACE_ADDRESS);
+ priv->address_provider_choice_in_progress = FALSE;
+-
++
+ if (priv->address_provider != NULL && new_p == priv->address_provider) {
+ /* keep using the same provider */
+ return FALSE;
+ }
+-
++
+ if (priv->address_provider && priv->signals[ADDRESS_CHANGED] > 0) {
+- g_signal_handler_disconnect (priv->address_provider,
++ g_signal_handler_disconnect (priv->address_provider,
+ priv->signals[ADDRESS_CHANGED]);
+ priv->signals[ADDRESS_CHANGED] = 0;
+ }
+-
++
+ priv->address_provider = new_p;
+-
++
+ if (priv->address_provider == NULL) {
+ g_debug ("client: address provider changed (to NULL)");
+- g_signal_emit (client, signals[ADDRESS_PROVIDER_CHANGED], 0,
++ g_signal_emit (client, signals[ADDRESS_PROVIDER_CHANGED], 0,
+ NULL, NULL, NULL, NULL);
+ return TRUE;
+ }
+-
++
+ g_debug ("client: address provider changed (to %s)", gc_master_provider_get_name (priv->address_provider));
+- g_signal_emit (client, signals[ADDRESS_PROVIDER_CHANGED], 0,
++ g_signal_emit (client, signals[ADDRESS_PROVIDER_CHANGED], 0,
+ gc_master_provider_get_name (priv->address_provider),
+ gc_master_provider_get_description (priv->address_provider),
+ gc_master_provider_get_service (priv->address_provider),
+ gc_master_provider_get_path (priv->address_provider));
+- priv->signals[ADDRESS_CHANGED] =
++ priv->signals[ADDRESS_CHANGED] =
+ g_signal_connect (G_OBJECT (priv->address_provider),
+ "address-changed",
+ G_CALLBACK (address_changed),
+@@ -573,42 +549,42 @@
+ }
+
+ static void
+-gc_master_provider_set_position_providers (GcMasterClient *client,
++gc_master_provider_set_position_providers (GcMasterClient *client,
+ GList *providers)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GcInterfaceAccuracy *accuracy_data;
+-
++
+ accuracy_data = g_new0(GcInterfaceAccuracy, 1);
+ accuracy_data->interface = GC_IFACE_POSITION;
+ accuracy_data->accuracy_level = priv->min_accuracy;
+-
++
+ gc_master_client_connect_common_signals (client, providers);
+- priv->position_providers =
++ priv->position_providers =
+ g_list_sort_with_data (providers,
+ (GCompareDataFunc)gc_master_provider_compare,
+ accuracy_data);
+-
++
+ g_free (accuracy_data);
+ }
+
+ static void
+-gc_master_provider_set_address_providers (GcMasterClient *client,
++gc_master_provider_set_address_providers (GcMasterClient *client,
+ GList *providers)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GcInterfaceAccuracy *accuracy_data;
+-
++
+ accuracy_data = g_new0(GcInterfaceAccuracy, 1);
+ accuracy_data->interface = GC_IFACE_ADDRESS;
+ accuracy_data->accuracy_level = priv->min_accuracy;
+-
++
+ gc_master_client_connect_common_signals (client, providers);
+- priv->address_providers =
++ priv->address_providers =
+ g_list_sort_with_data (providers,
+ (GCompareDataFunc)gc_master_provider_compare,
+ accuracy_data);
+-
++
+ g_free (accuracy_data);
+ }
+
+@@ -617,21 +593,21 @@
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+ GList *providers;
+-
++
+ if (!priv->position_started) {
+ return;
+ }
+-
++
+ /* TODO: free priv->position_providers */
+-
++
+ providers = gc_master_get_providers (GC_IFACE_POSITION,
+ priv->min_accuracy,
+ priv->require_updates,
+ priv->allowed_resources,
+ NULL);
+- g_debug ("client: %d position providers matching requirements found, now choosing current provider",
++ g_debug ("client: %d position providers matching requirements found, now choosing current provider",
+ g_list_length (providers));
+-
++
+ gc_master_provider_set_position_providers (client, providers);
+ gc_master_client_choose_position_provider (client, priv->position_providers);
+ }
+@@ -640,21 +616,21 @@
+ {
+ GList *providers;
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ if (!priv->address_started) {
+ return;
+ }
+-
++
+ /* TODO: free priv->address_providers */
+-
++
+ providers = gc_master_get_providers (GC_IFACE_ADDRESS,
+ priv->min_accuracy,
+ priv->require_updates,
+ priv->allowed_resources,
+ NULL);
+- g_debug ("client: %d address providers matching requirements found, now choosing current provider",
++ g_debug ("client: %d address providers matching requirements found, now choosing current provider",
+ g_list_length (providers));
+-
++
+ gc_master_provider_set_address_providers (client, providers);
+ gc_master_client_choose_address_provider (client, priv->address_providers);
+ }
+@@ -668,25 +644,25 @@
+ GError **error)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ priv->min_accuracy = min_accuracy;
+ priv->min_time = min_time;
+ priv->require_updates = require_updates;
+ priv->allowed_resources = allowed_resources;
+-
++
+ gc_master_client_init_position_providers (client);
+ gc_master_client_init_address_providers (client);
+-
++
+ return TRUE;
+ }
+
+
+-static gboolean
+-gc_iface_master_client_position_start (GcMasterClient *client,
++static gboolean
++gc_iface_master_client_position_start (GcMasterClient *client,
+ GError **error)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ if (priv->position_providers) {
+ if (error) {
+ *error = g_error_new (GEOCLUE_ERROR,
+@@ -695,20 +671,20 @@
+ }
+ return FALSE;
+ }
+-
++
+ priv->position_started = TRUE;
+-
+- gc_master_client_init_position_providers (client);
+-
++
++ gc_master_client_init_position_providers (client);
++
+ return TRUE;
+ }
+
+-static gboolean
++static gboolean
+ gc_iface_master_client_address_start (GcMasterClient *client,
+ GError **error)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ if (priv->address_providers) {
+ if (error) {
+ *error = g_error_new (GEOCLUE_ERROR,
+@@ -717,7 +693,7 @@
+ }
+ return FALSE;
+ }
+-
++
+ priv->address_started = TRUE;
+ gc_master_client_init_address_providers (client);
+ return TRUE;
+@@ -759,9 +735,9 @@
+ }
+ }
+ }
+-
+
+-static gboolean
++
++static gboolean
+ gc_iface_master_client_get_address_provider (GcMasterClient *client,
+ char **name,
+ char **description,
+@@ -770,13 +746,13 @@
+ GError **error)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ get_master_provider_details (priv->address_provider,
+ name, description, service, path);
+ return TRUE;
+ }
+
+-static gboolean
++static gboolean
+ gc_iface_master_client_get_position_provider (GcMasterClient *client,
+ char **name,
+ char **description,
+@@ -785,7 +761,7 @@
+ GError **error)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ get_master_provider_details (priv->position_provider,
+ name, description, service, path);
+ return TRUE;
+@@ -796,7 +772,7 @@
+ {
+ GcMasterClient *client = GC_MASTER_CLIENT (object);
+ GcMasterClientPrivate *priv = GET_PRIVATE (object);
+-
++
+ /* do not free contents of the lists, Master takes care of them */
+ if (priv->position_providers) {
+ gc_master_client_unsubscribe_providers (client, priv->position_providers, GC_IFACE_ALL);
+@@ -808,7 +784,7 @@
+ g_list_free (priv->address_providers);
+ priv->address_providers = NULL;
+ }
+-
++
+ ((GObjectClass *) gc_master_client_parent_class)->finalize (object);
+ }
+
+@@ -816,12 +792,12 @@
+ gc_master_client_class_init (GcMasterClientClass *klass)
+ {
+ GObjectClass *o_class = (GObjectClass *) klass;
+-
++
+ o_class->finalize = finalize;
+-
++
+ g_type_class_add_private (klass, sizeof (GcMasterClientPrivate));
+-
+- signals[ADDRESS_PROVIDER_CHANGED] =
++
++ signals[ADDRESS_PROVIDER_CHANGED] =
+ g_signal_new ("address-provider-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST, 0,
+@@ -829,7 +805,7 @@
+ geoclue_marshal_VOID__STRING_STRING_STRING_STRING,
+ G_TYPE_NONE, 4,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+- signals[POSITION_PROVIDER_CHANGED] =
++ signals[POSITION_PROVIDER_CHANGED] =
+ g_signal_new ("position-provider-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST, 0,
+@@ -837,10 +813,10 @@
+ geoclue_marshal_VOID__STRING_STRING_STRING_STRING,
+ G_TYPE_NONE, 4,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+-
++
+ dbus_g_object_type_install_info (gc_master_client_get_type (),
+ &dbus_glib_gc_iface_master_client_object_info);
+-
++
+
+ }
+
+@@ -848,14 +824,14 @@
+ gc_master_client_init (GcMasterClient *client)
+ {
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ priv->position_provider_choice_in_progress = FALSE;
+ priv->address_provider_choice_in_progress = FALSE;
+-
++
+ priv->position_started = FALSE;
+ priv->position_provider = NULL;
+ priv->position_providers = NULL;
+-
++
+ priv->address_started = FALSE;
+ priv->address_provider = NULL;
+ priv->address_providers = NULL;
+@@ -873,7 +849,7 @@
+ {
+ GcMasterClient *client = GC_MASTER_CLIENT (iface);
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ if (priv->position_provider == NULL) {
+ if (error) {
+ *error = g_error_new (GEOCLUE_ERROR,
+@@ -882,7 +858,7 @@
+ }
+ return FALSE;
+ }
+-
++
+ *fields = gc_master_provider_get_position
+ (priv->position_provider,
+ timestamp,
+@@ -892,7 +868,7 @@
+ return (!*error);
+ }
+
+-static gboolean
++static gboolean
+ get_address (GcIfaceAddress *iface,
+ int *timestamp,
+ GHashTable **address,
+@@ -901,7 +877,7 @@
+ {
+ GcMasterClient *client = GC_MASTER_CLIENT (iface);
+ GcMasterClientPrivate *priv = GET_PRIVATE (client);
+-
++
+ if (priv->address_provider == NULL) {
+ if (error) {
+ *error = g_error_new (GEOCLUE_ERROR,
+@@ -910,7 +886,7 @@
+ }
+ return FALSE;
+ }
+-
++
+ return gc_master_provider_get_address
+ (priv->address_provider,
+ timestamp,
+@@ -935,12 +911,12 @@
+ GError **error)
+ {
+ /* not meaningful, options come from master */
+-
++
+ /* It is not an error to not have a SetOptions implementation */
+ return TRUE;
+ }
+
+-static gboolean
++static gboolean
+ get_provider_info (GcIfaceGeoclue *geoclue,
+ gchar **name,
+ gchar **description,
+Index: geoclue/src/connectivity-networkmanager.c
+===================================================================
+--- geoclue.orig/src/connectivity-networkmanager.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/connectivity-networkmanager.c 2011-12-29 16:40:38.930428900 +0900
+@@ -27,19 +27,11 @@
+
+
+ #include <dbus/dbus-glib.h>
+-#include <string.h>
+-
+-#include <netinet/in.h>
+-#include <arpa/inet.h>
+-
+ #include <NetworkManager.h> /*for DBus strings */
+
++#ifdef HAVE_NETWORK_MANAGER
+ #include <nm-client.h>
+ #include <nm-device-wifi.h>
+-#include <nm-setting-ip4-config.h>
+-
+-#if !defined(NM_CHECK_VERSION)
+-#define NM_CHECK_VERSION(x,y,z) 0
+ #endif
+
+ #include "connectivity-networkmanager.h"
+@@ -65,158 +57,7 @@
+ {
+ GeoclueNetworkManager *self = GEOCLUE_NETWORKMANAGER (iface);
+
+- return g_strdup (self->cache_ap_mac);
+-}
+-
+-static int
+-strength_to_dbm (int strength)
+-{
+- /* Hackish linear strength to dBm conversion.
+- * 0% is -90 dBm
+- * 100% is -20 dBm */
+- return (strength * 0.7) - 90;
+-}
+-
+-static GHashTable *
+-get_aps (GeoclueConnectivity *iface)
+-{
+- GeoclueNetworkManager *self = GEOCLUE_NETWORKMANAGER (iface);
+- const GPtrArray *devices;
+- GHashTable *ht;
+- guint i;
+-
+- devices = nm_client_get_devices (self->client);
+- if (devices == NULL)
+- return NULL;
+-
+- ht = g_hash_table_new_full (g_str_hash, g_str_equal,
+- (GDestroyNotify) g_free, NULL);
+-
+- for (i = 0; i < devices->len; i++) {
+- NMDevice *device = g_ptr_array_index (devices, i);
+- if (NM_IS_DEVICE_WIFI (device)) {
+- const GPtrArray *aps;
+- guint j;
+-
+- aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device));
+- if (aps == NULL || aps->len == 0)
+- continue;
+- for (j = 0; j < aps->len; j++) {
+- NMAccessPoint *ap = NM_ACCESS_POINT (g_ptr_array_index (aps, j));
+- char *ap_mac;
+- int strength;
+-
+- ap_mac = g_strdup (nm_access_point_get_hw_address (ap));
+- strength = nm_access_point_get_strength (ap);
+- g_hash_table_insert (ht, ap_mac, GINT_TO_POINTER (strength_to_dbm (strength)));
+- }
+- }
+- }
+- if (g_hash_table_size (ht) == 0) {
+- g_hash_table_destroy (ht);
+- return NULL;
+- }
+-
+- return ht;
+-}
+-
+-static char *
+-mac_strup (char *mac)
+-{
+- guint i;
+- for (i = 0; mac[i] != '\0' ; i++) {
+- if (g_ascii_isalpha (mac[i]))
+- mac[i] = g_ascii_toupper (mac[i]);
+- }
+- return mac;
+-}
+-
+-static char *
+-get_mac_for_gateway (const char *gateway)
+-{
+- char *cmd, *out, *mac, **split;
+-
+- cmd = g_strdup_printf ("ip neigh show %s", gateway);
+-
+- if (g_spawn_command_line_sync (cmd, &out, NULL, NULL, NULL) == FALSE) {
+- g_free (out);
+- g_free (cmd);
+- return NULL;
+- }
+- g_free (cmd);
+-
+- /* 192.168.1.1 dev eth0 lladdr 00:00:00:00:00:00 STALE */
+- split = g_strsplit (out, " ", -1);
+- g_free (out);
+-
+- if (split == NULL)
+- return NULL;
+- if (g_strv_length (split) != 6) {
+- g_strfreev (split);
+- return NULL;
+- }
+- mac = g_strdup (split[4]);
+- g_strfreev (split);
+-
+- return mac_strup (mac);
+-}
+-
+-static gchar *
+-ip4_address_as_string (guint32 ip)
+-{
+- struct in_addr tmp_addr;
+- char buf[INET_ADDRSTRLEN+1];
+-
+- memset (&buf, '\0', sizeof (buf));
+- tmp_addr.s_addr = ip;
+-
+- if (inet_ntop (AF_INET, &tmp_addr, buf, INET_ADDRSTRLEN))
+- return g_strdup (buf);
+-
+- return NULL;
+-}
+-
+-static char *
+-get_router_mac (GeoclueConnectivity *iface)
+-{
+- GeoclueNetworkManager *self = GEOCLUE_NETWORKMANAGER (iface);
+- const GPtrArray *devices;
+- char *gateway, *mac;
+- guint i;
+-
+- devices = nm_client_get_devices (self->client);
+- if (devices == NULL)
+- return NULL;
+-
+- gateway = NULL;
+-
+- for (i = 0; i < devices->len; i++) {
+- NMDevice *device = g_ptr_array_index (devices, i);
+- NMIP4Config *cfg4;
+- GSList *iter;
+-
+- if (nm_device_get_state (device) != NM_DEVICE_STATE_ACTIVATED)
+- continue;
+-
+- cfg4 = nm_device_get_ip4_config (device);
+- if (cfg4 == NULL)
+- continue;
+-
+- for (iter = (GSList *) nm_ip4_config_get_addresses (cfg4); iter; iter = g_slist_next (iter)) {
+- NMIP4Address *addr = (NMIP4Address *) iter->data;
+-
+- gateway = ip4_address_as_string (nm_ip4_address_get_gateway (addr));
+- if (gateway != NULL)
+- break;
+- }
+- }
+- if (gateway == NULL)
+- return NULL;
+-
+- mac = get_mac_for_gateway (gateway);
+- g_free (gateway);
+-
+- return mac;
++ return self->cache_ap_mac;
+ }
+
+ static void
+@@ -248,12 +89,16 @@
+ guint i;
+
+ devices = nm_client_get_devices (self->client);
++ if (devices == NULL) {
++ g_free (self->cache_ap_mac);
++ self->cache_ap_mac = NULL;
++ }
+
+ g_free (self->cache_ap_mac);
+ self->cache_ap_mac = NULL;
+ self->ap_strength = 0;
+
+- for (i = 0; devices != NULL && i < devices->len; i++) {
++ for (i = 0; i < devices->len; i++) {
+ NMDevice *device = g_ptr_array_index (devices, i);
+ if (NM_IS_DEVICE_WIFI (device)) {
+ get_best_ap (self, device);
+@@ -262,10 +107,19 @@
+ }
+
+ static void
++finalize (GObject *object)
++{
++ /* free everything */
++
++ ((GObjectClass *) geoclue_networkmanager_parent_class)->finalize (object);
++}
++
++static void
+ dispose (GObject *object)
+ {
+ GeoclueNetworkManager *self = GEOCLUE_NETWORKMANAGER (object);
+-
++
++ dbus_g_connection_unref (self->connection);
+ g_free (self->cache_ap_mac);
+ self->cache_ap_mac = NULL;
+ g_object_unref (self->client);
+@@ -277,11 +131,12 @@
+ geoclue_networkmanager_class_init (GeoclueNetworkManagerClass *klass)
+ {
+ GObjectClass *o_class = (GObjectClass *) klass;
+-
++
++ o_class->finalize = finalize;
+ o_class->dispose = dispose;
+ }
+
+-static GeoclueNetworkStatus
++static GeoclueNetworkStatus
+ nmstate_to_geocluenetworkstatus (NMState status)
+ {
+ switch (status) {
+@@ -289,19 +144,10 @@
+ return GEOCLUE_CONNECTIVITY_UNKNOWN;
+ case NM_STATE_ASLEEP:
+ case NM_STATE_DISCONNECTED:
+-#if NM_CHECK_VERSION(0,8,992)
+- case NM_STATE_DISCONNECTING:
+-#endif
+ return GEOCLUE_CONNECTIVITY_OFFLINE;
+ case NM_STATE_CONNECTING:
+ return GEOCLUE_CONNECTIVITY_ACQUIRING;
+-#if NM_CHECK_VERSION(0,8,992)
+- case NM_STATE_CONNECTED_LOCAL:
+- case NM_STATE_CONNECTED_SITE:
+- case NM_STATE_CONNECTED_GLOBAL:
+-#else
+ case NM_STATE_CONNECTED:
+-#endif
+ return GEOCLUE_CONNECTIVITY_ONLINE;
+ default:
+ g_warning ("Unknown NMStatus: %d", status);
+@@ -310,60 +156,72 @@
+ }
+
+ static void
+-update_status (GeoclueNetworkManager *self, gboolean do_signal)
++geoclue_networkmanager_state_changed (DBusGProxy *proxy,
++ NMState status,
++ gpointer userdata)
+ {
+- GeoclueNetworkStatus old_status;
+- NMState state;
++ GeoclueNetworkManager *self = GEOCLUE_NETWORKMANAGER (userdata);
++ GeoclueNetworkStatus gc_status;
+
+- old_status = self->status;
++ gc_status = nmstate_to_geocluenetworkstatus (status);
+
+- if (nm_client_get_manager_running (self->client)) {
+- state = nm_client_get_state (self->client);
+- self->status = nmstate_to_geocluenetworkstatus (state);
++ if (gc_status != self->status) {
+ cache_ap_mac (self);
+- } else {
+- self->status = GEOCLUE_CONNECTIVITY_OFFLINE;
+- }
+-
+- if ((self->status != old_status) && do_signal) {
++ self->status = gc_status;
+ geoclue_connectivity_emit_status_changed (GEOCLUE_CONNECTIVITY (self),
+ self->status);
+ }
+ }
+
+-static void
+-nm_update_status_cb (GObject *obj, GParamSpec *spec, gpointer userdata)
+-{
+- update_status (GEOCLUE_NETWORKMANAGER (userdata), TRUE);
+-}
++
++#define NM_DBUS_SIGNAL_STATE_CHANGE "StateChange"
+
+ static void
+ geoclue_networkmanager_init (GeoclueNetworkManager *self)
+ {
++ GError *error = NULL;
++ DBusGProxy *proxy;
++ NMState state;
++
+ self->status = GEOCLUE_CONNECTIVITY_UNKNOWN;
+- self->client = nm_client_new ();
+- if (self->client == NULL) {
+- g_warning ("%s was unable to create a connection to NetworkManager",
+- G_OBJECT_TYPE_NAME (self));
++
++ self->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
++ if (self->connection == NULL) {
++ g_warning ("%s was unable to create a connection to D-Bus: %s",
++ G_OBJECT_TYPE_NAME (self), error->message);
++ g_error_free (error);
+ return;
+ }
+
+- g_signal_connect (G_OBJECT (self->client), "notify::running",
+- G_CALLBACK (nm_update_status_cb), self);
+- g_signal_connect (G_OBJECT (self->client), "notify::state",
+- G_CALLBACK (nm_update_status_cb), self);
++ proxy = dbus_g_proxy_new_for_name (self->connection,
++ NM_DBUS_SERVICE,
++ NM_DBUS_PATH,
++ NM_DBUS_INTERFACE);
++ dbus_g_proxy_add_signal (proxy, NM_DBUS_SIGNAL_STATE_CHANGE,
++ G_TYPE_UINT, G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal (proxy, NM_DBUS_SIGNAL_STATE_CHANGE,
++ G_CALLBACK (geoclue_networkmanager_state_changed),
++ self, NULL);
++
++ if (dbus_g_proxy_call (proxy, "state", &error,
++ G_TYPE_INVALID,
++ G_TYPE_UINT, &state, G_TYPE_INVALID)){
++ self->status = nmstate_to_geocluenetworkstatus (state);
++ } else {
++ g_warning ("Could not get connectivity state from NetworkManager: %s", error->message);
++ g_error_free (error);
++ }
+
+- /* get initial status */
+- update_status (self, FALSE);
++ self->client = nm_client_new ();
++ cache_ap_mac (self);
+ }
+
++
+ static void
+ geoclue_networkmanager_connectivity_init (GeoclueConnectivityInterface *iface)
+ {
+ iface->get_status = get_status;
+ iface->get_ap_mac = get_ap_mac;
+- iface->get_router_mac = get_router_mac;
+- iface->get_aps = get_aps;
+ }
+
+ #endif /* HAVE_NETWORK_MANAGER */
+Index: geoclue/src/connectivity-networkmanager.h
+===================================================================
+--- geoclue.orig/src/connectivity-networkmanager.h 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/connectivity-networkmanager.h 2011-12-29 16:40:38.930428900 +0900
+@@ -37,9 +37,10 @@
+
+ typedef struct {
+ GObject parent;
+-
++
+ /* private */
+ GeoclueNetworkStatus status;
++ DBusGConnection *connection;
+ NMClient *client;
+ char *cache_ap_mac;
+ int ap_strength;
+Index: geoclue/src/connectivity.c
+===================================================================
+--- geoclue.orig/src/connectivity.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/connectivity.c 2011-12-29 16:40:38.926428900 +0900
+@@ -21,28 +21,9 @@
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+-#include <config.h>
+-
+ #include <glib.h>
+-#include <string.h>
+-#include <stdio.h>
+-
+ #include "connectivity.h"
+
+-#ifdef HAVE_NETWORK_MANAGER
+-#include "connectivity-networkmanager.h"
+-#else
+-#ifdef HAVE_CONIC
+-#include "connectivity-conic.h"
+-#else
+-#ifdef HAVE_CONNMAN
+-#include "connectivity-connman.h"
+-#endif
+-#endif
+-#endif
+-
+-#define DEFAULT_DBM -50
+-
+ enum {
+ STATUS_CHANGED,
+ LAST_SIGNAL
+@@ -54,16 +35,16 @@
+ geoclue_connectivity_base_init (gpointer klass)
+ {
+ static gboolean initialized = FALSE;
+-
++
+ if (initialized) {
+ return;
+ }
+-
++
+ initialized = TRUE;
+ signals[STATUS_CHANGED] = g_signal_new ("status-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST,
+- G_STRUCT_OFFSET (GeoclueConnectivityInterface,
++ G_STRUCT_OFFSET (GeoclueConnectivityInterface,
+ status_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+@@ -74,39 +55,20 @@
+ geoclue_connectivity_get_type (void)
+ {
+ static GType type = 0;
+-
++
+ if (!type) {
+ const GTypeInfo info = {
+ sizeof (GeoclueConnectivityInterface),
+ geoclue_connectivity_base_init,
+ NULL,
+ };
+-
++
+ type = g_type_register_static (G_TYPE_INTERFACE,
+- "GeoclueConnectivity",
++ "GeoclueConnectivity",
+ &info, 0);
+ }
+-
+- return type;
+-}
+-
+-GeoclueConnectivity *
+-geoclue_connectivity_new (void)
+-{
+- GeoclueConnectivity *connectivity = NULL;
+
+-#ifdef HAVE_NETWORK_MANAGER
+- connectivity = GEOCLUE_CONNECTIVITY (g_object_new (GEOCLUE_TYPE_NETWORKMANAGER, NULL));
+-#else
+-#ifdef HAVE_CONIC
+- connectivity = GEOCLUE_CONNECTIVITY (g_object_new (GEOCLUE_TYPE_CONIC, NULL));
+-#else
+-#ifdef HAVE_CONNMAN
+- connectivity = GEOCLUE_CONNECTIVITY (g_object_new (GEOCLUE_TYPE_CONNMAN, NULL));
+-#endif
+-#endif
+-#endif
+- return connectivity;
++ return type;
+ }
+
+ GeoclueNetworkStatus
+@@ -115,156 +77,11 @@
+ return GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_status (self);
+ }
+
+-/* Parse /proc/net/route to get default gateway address and then parse
+- * /proc/net/arp to find matching mac address.
+- *
+- * There are some problems with this. First, it's IPv4 only.
+- * Second, there must be a way to do this with ioctl, but that seemed really
+- * complicated... even /usr/sbin/arp parses /proc/net/arp
+- *
+- * returns:
+- * 1 : on success
+- * 0 : no success, no errors
+- * <0 : error
+- */
+-static int
+-get_router_mac_fallback (char **mac)
+-{
+- char *content;
+- char **lines, **entry;
+- GError *error = NULL;
+- char *route_gateway = NULL;
+-
+- g_assert (*mac == NULL);
+-
+- if (!g_file_get_contents ("/proc/net/route", &content, NULL, &error)) {
+- g_warning ("Failed to read /proc/net/route: %s", error->message);
+- g_error_free (error);
+- return -1;
+- }
+-
+- lines = g_strsplit (content, "\n", 0);
+- g_free (content);
+- entry = lines + 1;
+-
+- while (*entry && strlen (*entry) > 0) {
+- char dest[9];
+- char gateway[9];
+- if (sscanf (*entry,
+- "%*s %8[0-9A-Fa-f] %8[0-9A-Fa-f] %*s",
+- dest, gateway) != 2) {
+- g_warning ("Failed to parse /proc/net/route entry '%s'", *entry);
+- } else if (strcmp (dest, "00000000") == 0) {
+- route_gateway = g_strdup (gateway);
+- break;
+- }
+- entry++;
+- }
+- g_strfreev (lines);
+-
+- if (!route_gateway) {
+- g_warning ("Failed to find default route in /proc/net/route");
+- return -1;
+- }
+-
+- if (!g_file_get_contents ("/proc/net/arp", &content, NULL, &error)) {
+- g_warning ("Failed to read /proc/net/arp: %s", error->message);
+- g_error_free (error);
+- return -1;
+- }
+-
+- lines = g_strsplit (content, "\n", 0);
+- g_free (content);
+- entry = lines+1;
+- while (*entry && strlen (*entry) > 0) {
+- char hwa[100];
+- char *arp_gateway;
+- int ip[4];
+-
+- if (sscanf(*entry,
+- "%d.%d.%d.%d 0x%*x 0x%*x %100s %*s %*s\n",
+- &ip[0], &ip[1], &ip[2], &ip[3], hwa) != 5) {
+- g_warning ("Failed to parse /proc/net/arp entry '%s'", *entry);
+- } else {
+- arp_gateway = g_strdup_printf ("%02X%02X%02X%02X", ip[3], ip[2], ip[1], ip[0]);
+- if (strcmp (arp_gateway, route_gateway) == 0) {
+- g_free (arp_gateway);
+- *mac = g_strdup (hwa);
+- break;
+- }
+- g_free (arp_gateway);
+-
+- }
+- entry++;
+- }
+- g_free (route_gateway);
+- g_strfreev (lines);
+-
+- return *mac ? 1 : 0;
+-}
+-
+-static char *
+-mac_strup (char *mac)
+-{
+- guint i;
+- for (i = 0; mac[i] != '\0' ; i++) {
+- if (g_ascii_isalpha (mac[i]))
+- mac[i] = g_ascii_toupper (mac[i]);
+- }
+- return mac;
+-}
+-
+-char *
+-geoclue_connectivity_get_router_mac (GeoclueConnectivity *self)
+-{
+- if (self == NULL ||
+- GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_router_mac == NULL) {
+- char *mac = NULL;
+- guint i;
+- int ret_val;
+-
+- for (i = 0; i < 5; i++) {
+- ret_val = get_router_mac_fallback (&mac);
+- if (ret_val < 0)
+- return NULL;
+- else if (ret_val == 1)
+- break;
+- g_usleep (G_USEC_PER_SEC / 10);
+- }
+- return mac_strup (mac);
+- }
+-
+- return GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_router_mac (self);
+-}
+-
+ char *
+ geoclue_connectivity_get_ap_mac (GeoclueConnectivity *self)
+ {
+- if (self != NULL &&
+- GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_ap_mac != NULL)
++ if (GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_ap_mac != NULL)
+ return GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_ap_mac (self);
+-
+- /* Hack when not using NetworkManager */
+- return geoclue_connectivity_get_router_mac (self);
+-}
+-
+-GHashTable *
+-geoclue_connectivity_get_aps (GeoclueConnectivity *self)
+-{
+- char *ap;
+- GHashTable *ht;
+-
+- if (self != NULL &&
+- GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_aps != NULL)
+- return GEOCLUE_CONNECTIVITY_GET_INTERFACE (self)->get_aps (self);
+-
+- /* Fallback if the backend does not support get_aps */
+- ap = geoclue_connectivity_get_ap_mac (self);
+- if (ap == NULL)
+- return NULL;
+- ht = g_hash_table_new_full (g_str_hash, g_str_equal,
+- (GDestroyNotify) g_free, NULL);
+- g_hash_table_insert (ht, ap, GINT_TO_POINTER (DEFAULT_DBM));
+ return NULL;
+ }
+
+Index: geoclue/src/connectivity.h
+===================================================================
+--- geoclue.orig/src/connectivity.h 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/connectivity.h 2011-12-29 16:40:38.926428900 +0900
+@@ -1,6 +1,6 @@
+ /*
+ * Geoclue
+- * geoclue-connectivity.h
++ * geoclue-connectivity.h
+ *
+ * Author: Jussi Kukkonen <jku@o-hand.com>
+ * Copyright 2007 by Garmin Ltd. or its subsidiaries
+@@ -41,28 +41,22 @@
+
+ struct _GeoclueConnectivityInterface {
+ GTypeInterface parent;
+-
++
+ /* signals */
+ void (* status_changed) (GeoclueConnectivity *self,
+ GeoclueNetworkStatus status);
+-
++
+ /* vtable */
+ int (*get_status) (GeoclueConnectivity *self);
+- GHashTable * (*get_aps) (GeoclueConnectivity *self);
+ char * (*get_ap_mac) (GeoclueConnectivity *self);
+- char * (*get_router_mac) (GeoclueConnectivity *self);
+ };
+
+ GType geoclue_connectivity_get_type (void);
+
+-GeoclueConnectivity *geoclue_connectivity_new (void);
+
+ GeoclueNetworkStatus geoclue_connectivity_get_status (GeoclueConnectivity *self);
+
+ char *geoclue_connectivity_get_ap_mac (GeoclueConnectivity *self);
+-char *geoclue_connectivity_get_router_mac (GeoclueConnectivity *self);
+-
+-GHashTable *geoclue_connectivity_get_aps (GeoclueConnectivity *self);
+
+ void
+ geoclue_connectivity_emit_status_changed (GeoclueConnectivity *self,
+Index: geoclue/src/main.c
+===================================================================
+--- geoclue.orig/src/main.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/main.c 2011-12-29 16:40:38.930428900 +0900
+@@ -27,7 +27,8 @@
+ #endif
+
+ #include <glib.h>
+-#include <gio/gio.h>
++
++#include <gconf/gconf-client.h>
+
+ #include <dbus/dbus-protocol.h>
+ #include <dbus/dbus-glib.h>
+@@ -37,141 +38,84 @@
+
+ static GMainLoop *mainloop;
+ static GHashTable *options;
+-static GSettings *settings;
+ static GcMaster *master;
+
+
+-#define GEOCLUE_SCHEMA_NAME "org.freedesktop.Geoclue"
++#define GEOCLUE_GCONF_TOP "/apps/geoclue/master"
+ #define GEOCLUE_MASTER_NAME "org.freedesktop.Geoclue.Master"
+
+-static GValue *
+-gvariant_value_to_value (GVariant *value)
+-{
+- GValue *gvalue;
+- const GVariantType *type;
+-
+- g_return_val_if_fail (value != NULL, NULL);
+- type = g_variant_get_type (value);
+-
+- if (g_variant_type_is_subtype_of (type, G_VARIANT_TYPE_STRING)) {
+- const char *str;
+-
+- gvalue = g_new0 (GValue, 1);
+- str = g_variant_get_string (value, NULL);
+-
+- /* Don't add empty strings in the hashtable */
+- if (str != NULL && str[0] == '\0')
+- str = NULL;
+-
+- g_value_init (gvalue, G_TYPE_STRING);
+- g_value_set_string (gvalue, str);
+- } else if (g_variant_type_is_subtype_of (type, G_VARIANT_TYPE_UINT32)) {
+- int i;
+-
+- gvalue = g_new0 (GValue, 1);
+- i = g_variant_get_uint32 (value);
+- g_value_init (gvalue, G_TYPE_INT);
+- g_value_set_int (gvalue, i);
+- } else {
+- gvalue = NULL;
+- g_warning ("Value is of unknown type");
+- }
+-
+- return gvalue;
+-}
+-
+ static void
+-debug_print_key (gboolean init,
+- const char *key,
+- GValue *gvalue)
+-{
+- const char *message;
+- char *string;
+-
+- if (init)
+- message = "GSettings key '%s' initialised to '%s'";
+- else
+- message = "GSettings key '%s' changed to '%s'";
+-
+- if (G_VALUE_TYPE (gvalue) == G_TYPE_STRING) {
+- string = g_value_dup_string (gvalue);
+- } else if (G_VALUE_TYPE (gvalue) == G_TYPE_INT) {
+- string = g_strdup_printf ("%d", g_value_get_int (gvalue));
+- } else {
++gconf_key_changed (GConfClient *client,
++ guint cnxn_id,
++ GConfEntry *entry,
++ gpointer user_data)
++{
++ const char *key, *value;
++ GConfValue *v;
++
++ key = gconf_entry_get_key (entry);
++ v = gconf_entry_get_value (entry);
++ if (v->type != GCONF_VALUE_STRING)
+ return;
+- }
++ value = gconf_value_get_string (v);
+
+- g_message (message, key, string);
+- g_free (string);
+-}
++ g_message ("gconf key changed %s", key);
+
+-static void
+-gsettings_key_changed (GSettings *settings,
+- char *key,
+- gpointer user_data)
+-{
+- GVariant *v;
+- GValue *gvalue;
+-
+- v = g_settings_get_value (settings, key);
+- gvalue = gvariant_value_to_value (v);
+- if (gvalue == NULL) {
+- g_variant_unref (v);
+- return;
+- }
++ /* Don't add empty strings in the hashtable */
++ if (value != NULL && value[0] == '\0')
++ value = NULL;
+
+- debug_print_key (FALSE, key, gvalue);
+-
+- g_hash_table_insert (options, g_strdup (key), gvalue);
++ g_hash_table_insert (options, g_path_get_basename (key),
++ g_strdup (value));
+
+ g_signal_emit_by_name (G_OBJECT (master), "options-changed", options);
+ }
+
+-static void
+-free_gvalue (GValue *value)
+-{
+- if (value == NULL)
+- return;
+- g_value_unset (value);
+- g_free (value);
+-}
+-
+ static GHashTable *
+ load_options (void)
+ {
+ GHashTable *ht = NULL;
+- guint i;
+- const char const * keys[] = {
+- "gps-baudrate",
+- "gps-device"
+- };
++ GConfClient *client = gconf_client_get_default ();
++ GSList *entries, *e;
++ GError *error = NULL;
++
++ gconf_client_add_dir (client, GEOCLUE_GCONF_TOP,
++ GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
++
++ entries = gconf_client_all_entries (client, GEOCLUE_GCONF_TOP, &error);
++ if (error != NULL) {
++ g_warning ("Error loading master options: %s", error->message);
++ g_error_free (error);
++ return NULL;
++ }
+
+ /* Setup keys monitoring */
+- g_signal_connect (G_OBJECT (settings), "changed",
+- G_CALLBACK (gsettings_key_changed), NULL);
+-
+- ht = g_hash_table_new_full (g_str_hash, g_str_equal,
+- g_free, (GDestroyNotify) free_gvalue);
++ gconf_client_notify_add (client, GEOCLUE_GCONF_TOP,
++ (GConfClientNotifyFunc) gconf_key_changed,
++ NULL, NULL, NULL);
+
++ ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ g_print ("Master options:\n");
+- for (i = 0; i < G_N_ELEMENTS (keys); i++) {
+- GVariant *v;
+- GValue *gvalue;
+- const char *key = keys[i];
+-
+- v = g_settings_get_value (settings, key);
+- gvalue = gvariant_value_to_value (v);
+-
+- if (gvalue == NULL) {
+- g_variant_unref (v);
+- continue;
+- }
+-
+- debug_print_key (TRUE, key, gvalue);
+-
+- g_hash_table_insert (ht, g_strdup (key), gvalue);
+- g_variant_unref (v);
++ for (e = entries; e; e = e->next) {
++ GConfEntry *entry = e->data;
++ const char *key, *value;
++ GConfValue *v;
++
++ key = gconf_entry_get_key (entry);
++ v = gconf_entry_get_value (entry);
++ if (v->type != GCONF_VALUE_STRING)
++ continue;
++ value = gconf_value_get_string (v);
++
++ if (value != NULL && value[0] == '\0')
++ value = NULL;
++
++ g_print (" %s = %s\n", key, value);
++ g_hash_table_insert (ht, g_path_get_basename (key),
++ g_strdup (value));
++ gconf_entry_free (entry);
+ }
++ g_slist_free (entries);
+
+ return ht;
+ }
+@@ -218,12 +162,11 @@
+ }
+
+ /* Load options */
+- settings = g_settings_new (GEOCLUE_SCHEMA_NAME);
+ options = load_options ();
+
+ master = g_object_new (GC_TYPE_MASTER, NULL);
+- dbus_g_connection_register_g_object (conn,
+- "/org/freedesktop/Geoclue/Master",
++ dbus_g_connection_register_g_object (conn,
++ "/org/freedesktop/Geoclue/Master",
+ G_OBJECT (master));
+
+ g_main_loop_run (mainloop);
+Index: geoclue/src/master-provider.c
+===================================================================
+--- geoclue.orig/src/master-provider.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/master-provider.c 2011-12-29 16:40:38.926428900 +0900
+@@ -3,7 +3,7 @@
+ * master-provider.c - Provider object for master and master client
+ *
+ * Author: Jussi Kukkonen <jku@o-hand.com>
+- *
++ *
+ * Copyright 2007-2008 by Garmin Ltd. or its subsidiaries
+ * 2008 OpenedHand Ltd
+ *
+@@ -25,22 +25,22 @@
+ */
+
+ /**
+- * Provider object for GcMaster. Takes care of cacheing
++ * Provider object for GcMaster. Takes care of cacheing
+ * queried data.
+- *
++ *
+ * Should probably start/stop the actual providers as needed
+ * in the future
+- *
+- * Cache could also be used to save "stale" data for situations when
+- * current data is not available (MasterClient api would have to
++ *
++ * Cache could also be used to save "stale" data for situations when
++ * current data is not available (MasterClient api would have to
+ * have a "allowOldData" setting)
+- *
+- * TODO:
++ *
++ * TODO:
+ * figure out what to do if get_* returns GEOCLUE_ERROR_NOT_AVAILABLE.
+ * Should try again, but when?
+- *
++ *
+ * implement velocity
+- *
++ *
+ * implement other (non-updating) ifaces
+ **/
+
+@@ -78,30 +78,30 @@
+ typedef struct _GcMasterProviderPrivate {
+ char *name;
+ char *description;
+-
++
+ char *service;
+ char *path;
+ GcInterfaceFlags interfaces;
+-
++
+ GList *position_clients; /* list of clients currently using this provider */
+ GList *address_clients;
+-
++
+ GeoclueAccuracyLevel expected_accuracy;
+-
++
+ GeoclueResourceFlags required_resources;
+ GeoclueProvideFlags provides;
+-
++
+ GeoclueStatus master_status; /* net_status and status affect this */
+ GeoclueNetworkStatus net_status;
+-
++
+ GeoclueStatus status; /* cached status from actual provider */
+-
++
+ GeocluePosition *position;
+ GcPositionCache position_cache;
+-
++
+ GeoclueAddress *address;
+ GcAddressCache address_cache;
+-
++
+ } GcMasterProviderPrivate;
+
+ enum {
+@@ -109,6 +109,7 @@
+ ACCURACY_CHANGED,
+ POSITION_CHANGED,
+ ADDRESS_CHANGED,
++ NMEA_CHANGED,
+ LAST_SIGNAL
+ };
+ static guint32 signals[LAST_SIGNAL] = {0, };
+@@ -146,7 +147,7 @@
+ gc_master_provider_get_provider (GcMasterProvider *master_provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (master_provider);
+-
++
+ if (priv->address) {
+ return GEOCLUE_PROVIDER (priv->address);
+ }
+@@ -162,7 +163,7 @@
+ return (gc_master_provider_get_provider (master_provider) != NULL);
+ }
+
+-static void
++static void
+ gc_master_provider_handle_new_position_accuracy (GcMasterProvider *provider,
+ GeoclueAccuracy *accuracy)
+ {
+@@ -170,7 +171,7 @@
+ GeoclueAccuracyLevel old_level;
+ GeoclueAccuracyLevel new_level = GEOCLUE_ACCURACY_LEVEL_NONE;
+ double new_hor_acc, new_vert_acc;
+-
++
+ geoclue_accuracy_get_details (priv->position_cache.accuracy,
+ &old_level, NULL, NULL);
+ if (accuracy) {
+@@ -179,14 +180,14 @@
+ }
+ geoclue_accuracy_set_details (priv->position_cache.accuracy,
+ new_level, new_hor_acc, new_vert_acc);
+-
++
+ if (old_level != new_level) {
+ g_signal_emit (provider, signals[ACCURACY_CHANGED], 0,
+ GC_IFACE_POSITION, new_level);
+ }
+ }
+
+-static void
++static void
+ gc_master_provider_handle_new_address_accuracy (GcMasterProvider *provider,
+ GeoclueAccuracy *accuracy)
+ {
+@@ -194,7 +195,7 @@
+ GeoclueAccuracyLevel old_level;
+ GeoclueAccuracyLevel new_level = GEOCLUE_ACCURACY_LEVEL_NONE;
+ double new_hor_acc, new_vert_acc;
+-
++
+ geoclue_accuracy_get_details (priv->address_cache.accuracy,
+ &old_level, NULL, NULL);
+ if (accuracy) {
+@@ -203,7 +204,7 @@
+ }
+ geoclue_accuracy_set_details (priv->address_cache.accuracy,
+ new_level, new_hor_acc, new_vert_acc);
+-
++
+ if (old_level != new_level) {
+ g_signal_emit (provider, signals[ACCURACY_CHANGED], 0,
+ GC_IFACE_ADDRESS, new_level);
+@@ -221,23 +222,23 @@
+ GError *error)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ priv->position_cache.timestamp = timestamp;
+ priv->position_cache.fields = fields;
+ priv->position_cache.latitude = latitude;
+ priv->position_cache.longitude = longitude;
+ priv->position_cache.altitude = altitude;
+-
++
+ copy_error (&priv->position_cache.error, error);
+-
+- /* emit accuracy-changed if needed, so masterclient can re-choose providers
++
++ /* emit accuracy-changed if needed, so masterclient can re-choose providers
+ * before we emit position-changed */
+ gc_master_provider_handle_new_position_accuracy (provider, accuracy);
+-
++
+ if (!error) {
+- g_signal_emit (provider, signals[POSITION_CHANGED], 0,
+- fields, timestamp,
+- latitude, longitude, altitude,
++ g_signal_emit (provider, signals[POSITION_CHANGED], 0,
++ fields, timestamp,
++ latitude, longitude, altitude,
+ priv->position_cache.accuracy);
+ }
+ }
+@@ -250,9 +251,9 @@
+ GError *error)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ priv->address_cache.timestamp = timestamp;
+-
++
+ g_hash_table_destroy (priv->address_cache.details);
+ if (details) {
+ priv->address_cache.details = geoclue_address_details_copy (details);
+@@ -260,15 +261,15 @@
+ priv->address_cache.details = geoclue_address_details_new ();
+ }
+ copy_error (&priv->address_cache.error, error);
+-
+- /* emit accuracy-changed if needed, so masterclient can re-choose providers
++
++ /* emit accuracy-changed if needed, so masterclient can re-choose providers
+ * before we emit position-changed */
+ gc_master_provider_handle_new_address_accuracy (provider, accuracy);
+-
++
+ if (!error) {
+- g_signal_emit (provider, signals[ADDRESS_CHANGED], 0,
+- priv->address_cache.timestamp,
+- priv->address_cache.details,
++ g_signal_emit (provider, signals[ADDRESS_CHANGED], 0,
++ priv->address_cache.timestamp,
++ priv->address_cache.details,
+ priv->address_cache.accuracy);
+ }
+ }
+@@ -280,7 +281,7 @@
+ {
+ GeoclueResourceFlags resources = GEOCLUE_RESOURCE_NONE;
+ int i;
+-
++
+ for (i = 0; flags[i]; i++) {
+ if (strcmp (flags[i], "RequiresNetwork") == 0) {
+ resources |= GEOCLUE_RESOURCE_NETWORK;
+@@ -290,7 +291,7 @@
+ resources |= GEOCLUE_RESOURCE_GPS;
+ }
+ }
+-
++
+ return resources;
+ }
+
+@@ -299,7 +300,7 @@
+ {
+ GeoclueProvideFlags provides = GEOCLUE_PROVIDE_NONE;
+ int i;
+-
++
+ for (i = 0; flags[i]; i++) {
+ if (strcmp (flags[i], "ProvidesUpdates") == 0) {
+ provides |= GEOCLUE_PROVIDE_UPDATES;
+@@ -307,7 +308,7 @@
+ provides |= GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION;
+ }
+ }
+-
++
+ return provides;
+ }
+
+@@ -316,7 +317,7 @@
+ {
+ GcInterfaceFlags ifaces = GC_IFACE_GEOCLUE;
+ int i;
+-
++
+ for (i = 0; strs[i]; i++) {
+ if (strcmp (strs[i], GEOCLUE_POSITION_INTERFACE_NAME) == 0) {
+ ifaces |= GC_IFACE_POSITION;
+@@ -347,7 +348,7 @@
+ level = GEOCLUE_ACCURACY_LEVEL_DETAILED;
+ } else {
+ g_warning ("'%s' is not a recognised accuracy level value", str);
+- }
++ }
+ return level;
+ }
+
+@@ -355,14 +356,14 @@
+ gc_master_provider_handle_error (GcMasterProvider *provider, GError *error)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ g_assert (error);
+-
++
+ priv = GET_PRIVATE (provider);
+ g_debug ("%s handling error %d", priv->name, error->code);
+-
++
+ /* web service providers that are unavailable */
+- if (priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION &&
++ if (priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION &&
+ error->code == GEOCLUE_ERROR_NOT_AVAILABLE) {
+ priv->master_status = GEOCLUE_STATUS_UNAVAILABLE;
+ /* TODO set timer to re-check availability */
+@@ -375,9 +376,9 @@
+ gc_master_provider_handle_status_change (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ GeoclueStatus new_master_status;
+-
++
+ /* calculate new master status */
+ if (priv->required_resources & GEOCLUE_RESOURCE_NETWORK ||
+ priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION) {
+@@ -400,47 +401,47 @@
+ default:
+ g_assert_not_reached ();
+ }
+-
++
+ } else {
+ new_master_status = priv->status;
+ }
+-
++
+ if (new_master_status != priv->master_status) {
+ priv->master_status = new_master_status;
+-
++
+ g_signal_emit (provider, signals[STATUS_CHANGED], 0, new_master_status);
+ }
+ }
+
+
+-static void
++static void
+ gc_master_provider_update_cache (GcMasterProvider *master_provider)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ priv = GET_PRIVATE (master_provider);
+-
++
+ if ((!(priv->provides & GEOCLUE_PROVIDE_UPDATES)) ||
+ (!gc_master_provider_get_provider (master_provider))) {
+ /* non-cacheable provider or provider not running */
+ return;
+ }
+-
++
+ g_debug ("%s: Updating cache ", priv->name);
+ priv->master_status = GEOCLUE_STATUS_ACQUIRING;
+ g_signal_emit (master_provider, signals[STATUS_CHANGED], 0, priv->master_status);
+-
++
+ if (priv->position) {
+ int timestamp;
+ double lat, lon, alt;
+ GeocluePositionFields fields;
+ GeoclueAccuracy *accuracy = NULL;
+ GError *error = NULL;
+-
++
+ fields = geoclue_position_get_position (priv->position,
+ &timestamp,
+ &lat, &lon, &alt,
+- &accuracy,
++ &accuracy,
+ &error);
+ if (error){
+ g_warning ("Error updating position cache: %s", error->message);
+@@ -451,13 +452,13 @@
+ lat, lon, alt,
+ accuracy, error);
+ }
+-
++
+ if (priv->address) {
+ int timestamp;
+ GHashTable *details = NULL;
+ GeoclueAccuracy *accuracy = NULL;
+ GError *error = NULL;
+-
++
+ if (!geoclue_address_get_address (priv->address,
+ &timestamp,
+ &details,
+@@ -472,7 +473,7 @@
+ accuracy,
+ error);
+ }
+-
++
+ gc_master_provider_handle_status_change (master_provider);
+ }
+
+@@ -484,7 +485,7 @@
+ GcMasterProvider *master_provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (master_provider);
+-
++
+ priv->status = status;
+ gc_master_provider_handle_status_change (master_provider);
+ }
+@@ -499,7 +500,7 @@
+ GeoclueAccuracy *accuracy,
+ GcMasterProvider *provider)
+ {
+- /* is there a situation when we'd need to check against cache
++ /* is there a situation when we'd need to check against cache
+ * if data has really changed? probably not */
+ gc_master_provider_set_position (provider,
+ fields, timestamp,
+@@ -514,7 +515,7 @@
+ GeoclueAccuracy *accuracy,
+ GcMasterProvider *provider)
+ {
+- /* is there a situation when we'd need to check against cache
++ /* is there a situation when we'd need to check against cache
+ * if data has really changed? probably not */
+ gc_master_provider_set_address (provider,
+ timestamp,
+@@ -528,7 +529,7 @@
+ finalize (GObject *object)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (object);
+-
++
+ geoclue_accuracy_free (priv->position_cache.accuracy);
+ geoclue_accuracy_free (priv->address_cache.accuracy);
+ if (priv->position_cache.error) {
+@@ -537,15 +538,15 @@
+ if (priv->address_cache.error) {
+ g_error_free (priv->address_cache.error);
+ }
+-
++
+ g_free (priv->name);
+ g_free (priv->description);
+ g_free (priv->service);
+ g_free (priv->path);
+-
++
+ g_free (priv->position_clients);
+ g_free (priv->address_clients);
+-
++
+ G_OBJECT_CLASS (gc_master_provider_parent_class)->finalize (object);
+ }
+
+@@ -553,12 +554,12 @@
+ dispose (GObject *object)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (object);
+-
++
+ if (priv->position) {
+ g_object_unref (priv->position);
+ priv->position = NULL;
+ }
+-
++
+ if (priv->address) {
+ g_object_unref (priv->address);
+ priv->address = NULL;
+@@ -567,7 +568,7 @@
+ g_hash_table_destroy (priv->address_cache.details);
+ priv->address_cache.details = NULL;
+ }
+-
++
+ G_OBJECT_CLASS (gc_master_provider_parent_class)->dispose (object);
+ }
+
+@@ -575,17 +576,17 @@
+ gc_master_provider_class_init (GcMasterProviderClass *klass)
+ {
+ GObjectClass *o_class = (GObjectClass *) klass;
+-
++
+ o_class->finalize = finalize;
+ o_class->dispose = dispose;
+-
++
+ g_type_class_add_private (klass, sizeof (GcMasterProviderPrivate));
+-
++
+ signals[STATUS_CHANGED] = g_signal_new ("status-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST |
+ G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GcMasterProviderClass, status_changed),
++ G_STRUCT_OFFSET (GcMasterProviderClass, status_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE, 1,
+@@ -594,7 +595,7 @@
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST |
+ G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GcMasterProviderClass, accuracy_changed),
++ G_STRUCT_OFFSET (GcMasterProviderClass, accuracy_changed),
+ NULL, NULL,
+ geoclue_marshal_VOID__INT_INT,
+ G_TYPE_NONE, 2,
+@@ -603,7 +604,7 @@
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST |
+ G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GcMasterProviderClass, position_changed),
++ G_STRUCT_OFFSET (GcMasterProviderClass, position_changed),
+ NULL, NULL,
+ geoclue_marshal_VOID__INT_INT_DOUBLE_DOUBLE_DOUBLE_BOXED,
+ G_TYPE_NONE, 6,
+@@ -614,11 +615,11 @@
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST |
+ G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GcMasterProviderClass, address_changed),
++ G_STRUCT_OFFSET (GcMasterProviderClass, address_changed),
+ NULL, NULL,
+ geoclue_marshal_VOID__INT_BOXED_BOXED,
+ G_TYPE_NONE, 3,
+- G_TYPE_INT,
++ G_TYPE_INT,
+ G_TYPE_POINTER,
+ G_TYPE_POINTER);
+ }
+@@ -627,19 +628,19 @@
+ gc_master_provider_init (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ priv->position_clients = NULL;
+ priv->address_clients = NULL;
+-
++
+ priv->master_status = GEOCLUE_STATUS_UNAVAILABLE;
+-
++
+ priv->position = NULL;
+- priv->position_cache.accuracy =
++ priv->position_cache.accuracy =
+ geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0 ,0);
+ priv->position_cache.error = NULL;
+-
++
+ priv->address = NULL;
+- priv->address_cache.accuracy =
++ priv->address_cache.accuracy =
+ geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0 ,0);
+ priv->address_cache.details = geoclue_address_details_new ();
+ priv->address_cache.error = NULL;
+@@ -654,15 +655,15 @@
+ int time;
+ double lat, lon, alt;
+ GError *error = NULL;
+-
++
+ priv = GET_PRIVATE (provider);
+-
+-
++
++
+ g_print (" Position Information:\n");
+ g_print (" ---------------------\n");
+-
++
+ fields = gc_master_provider_get_position (provider,
+- &time,
++ &time,
+ &lat, &lon, &alt,
+ NULL, &error);
+ if (error) {
+@@ -677,7 +678,7 @@
+ fields & GEOCLUE_POSITION_FIELDS_LONGITUDE ? "" : "(not set)");
+ g_print (" Altitude: %.2f %s\n", alt,
+ fields & GEOCLUE_POSITION_FIELDS_ALTITUDE ? "" : "(not set)");
+-
++
+ }
+
+ static void
+@@ -692,11 +693,11 @@
+ int time;
+ GHashTable *details;
+ GError *error = NULL;
+-
++
+ g_print (" Address Information:\n");
+ g_print (" --------------------\n");
+ if (!gc_master_provider_get_address (provider,
+- &time,
++ &time,
+ &details,
+ NULL, &error)) {
+ g_print (" Error: %s", error->message);
+@@ -705,14 +706,14 @@
+ }
+ g_print (" Timestamp: %d\n", time);
+ g_hash_table_foreach (details, (GHFunc)dump_address_key_and_value, NULL);
+-
++
+ }
+
+ static void
+ gc_master_provider_dump_required_resources (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ priv = GET_PRIVATE (provider);
+ g_print (" Requires\n");
+ if (priv->required_resources & GEOCLUE_RESOURCE_GPS) {
+@@ -728,7 +729,7 @@
+ gc_master_provider_dump_provides (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ priv = GET_PRIVATE (provider);
+ g_print (" Provides\n");
+ if (priv->provides & GEOCLUE_PROVIDE_UPDATES) {
+@@ -743,20 +744,20 @@
+ gc_master_provider_dump_provider_details (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ priv = GET_PRIVATE (provider);
+ g_print ("\n Name - %s\n", priv->name);
+ g_print (" Description - %s\n", priv->description);
+ g_print (" Service - %s\n", priv->service);
+ g_print (" Path - %s\n", priv->path);
+ g_print (" Accuracy level - %d\n", priv->expected_accuracy);
+- g_print (" Provider is currently %srunning, status %d\n",
++ g_print (" Provider is currently %srunning, status %d\n",
+ gc_master_provider_get_provider (master_provider) ? "" : "not ",
+ priv->master_status);
+ gc_master_provider_dump_required_resources (provider);
+ gc_master_provider_dump_provides (provider);
+-
+-
++
++
+ if (priv->interfaces & GC_IFACE_POSITION) {
+ g_print (" Interface - Position\n");
+ gc_master_provider_dump_position (provider);
+@@ -774,9 +775,9 @@
+ GcMasterProviderPrivate *priv = GET_PRIVATE (master_provider);
+ GeoclueProvider *geoclue;
+ GError *error = NULL;
+-
++
+ geoclue = gc_master_provider_get_provider (master_provider);
+-
++
+ if (!geoclue_provider_set_options (geoclue,
+ geoclue_get_main_options (),
+ &error)) {
+@@ -784,20 +785,20 @@
+ g_error_free (error);
+ return FALSE;
+ }
+-
++
+ /* priv->name has been read from .provider-file earlier...
+ * could ask the provider anyway, just to be consistent */
+- if (!geoclue_provider_get_provider_info (geoclue, NULL,
++ if (!geoclue_provider_get_provider_info (geoclue, NULL,
+ &priv->description, &error)) {
+ g_warning ("Error getting provider info: %s\n", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+-
++
+ g_signal_connect (G_OBJECT (geoclue), "status-changed",
+ G_CALLBACK (provider_status_changed), master_provider);
+-
+-
++
++
+ if (!geoclue_provider_get_status (geoclue, &priv->status, &error)) {
+ g_warning ("Error getting provider status: %s\n", error->message);
+ g_error_free (error);
+@@ -810,35 +811,35 @@
+ gc_master_provider_initialize_interfaces (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ priv = GET_PRIVATE (provider);
+-
++
+ if (priv->interfaces <= GC_IFACE_GEOCLUE) {
+ g_warning ("No interfaces defined for %s", priv->name);
+ return FALSE;
+ }
+-
++
+ if (priv->interfaces & GC_IFACE_POSITION) {
+ g_assert (priv->position == NULL);
+-
+- priv->position = geoclue_position_new (priv->service,
++
++ priv->position = geoclue_position_new (priv->service,
+ priv->path);
+ g_signal_connect (G_OBJECT (priv->position), "position-changed",
+ G_CALLBACK (position_changed), provider);
+ }
+ if (priv->interfaces & GC_IFACE_ADDRESS) {
+ g_assert (priv->address == NULL);
+-
+- priv->address = geoclue_address_new (priv->service,
++
++ priv->address = geoclue_address_new (priv->service,
+ priv->path);
+ g_signal_connect (G_OBJECT (priv->address), "address-changed",
+ G_CALLBACK (address_changed), provider);
+ }
+-
++
+ if (!gc_master_provider_initialize_geoclue (provider)) {
+ return FALSE;
+ }
+-
++
+ return TRUE;
+ }
+
+@@ -846,10 +847,14 @@
+ static gboolean
+ gc_master_provider_initialize (GcMasterProvider *provider)
+ {
++ GcMasterProviderPrivate *priv;
++
++ priv = GET_PRIVATE (provider);
++
+ if (!gc_master_provider_initialize_interfaces (provider)) {
+ return FALSE;
+ }
+-
++
+ gc_master_provider_update_cache (provider);
+ #if DEBUG_INFO
+ gc_master_provider_dump_provider_details (provider);
+@@ -861,7 +866,7 @@
+ gc_master_provider_deinitialize (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ if (priv->position) {
+ g_object_unref (priv->position);
+ priv->position = NULL;
+@@ -874,14 +879,14 @@
+ }
+
+ static void
+-network_status_changed (gpointer *connectivity,
+- GeoclueNetworkStatus status,
++network_status_changed (gpointer *connectivity,
++ GeoclueNetworkStatus status,
+ GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv;
+-
++
+ priv = GET_PRIVATE (provider);
+-
++
+ priv->net_status = status;
+ /* update connection-cacheable providers */
+ if (status == GEOCLUE_CONNECTIVITY_ONLINE &&
+@@ -909,7 +914,7 @@
+
+ /* public methods (for GcMaster and GcMasterClient) */
+
+-/* Loads provider details from 'filename' */
++/* Loads provider details from 'filename' */
+ GcMasterProvider *
+ gc_master_provider_new (const char *filename,
+ GeoclueConnectivity *connectivity)
+@@ -919,11 +924,11 @@
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ gboolean ret;
+- char *accuracy_str;
++ char *accuracy_str;
+ char **flags, **interfaces;
+-
++
+ keyfile = g_key_file_new ();
+- ret = g_key_file_load_from_file (keyfile, filename,
++ ret = g_key_file_load_from_file (keyfile, filename,
+ G_KEY_FILE_NONE, &error);
+ if (ret == FALSE) {
+ g_warning ("Error loading %s: %s", filename, error->message);
+@@ -931,31 +936,31 @@
+ g_key_file_free (keyfile);
+ return NULL;
+ }
+-
++
+ provider = g_object_new (GC_TYPE_MASTER_PROVIDER, NULL);
+ priv = GET_PRIVATE (provider);
+-
++
+ priv->name = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Name", NULL);
+ priv->service = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Service", NULL);
+ priv->path = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Path", NULL);
+-
++
+ accuracy_str = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Accuracy", NULL);
+ priv->expected_accuracy = parse_accuracy_string (accuracy_str);
+ if (accuracy_str){
+ g_free (accuracy_str);
+ }
+-
++
+ /* set cached accuracies to a default value */
+ geoclue_accuracy_set_details (priv->position_cache.accuracy,
+ priv->expected_accuracy, 0.0, 0.0);
+ geoclue_accuracy_set_details (priv->address_cache.accuracy,
+ priv->expected_accuracy, 0.0, 0.0);
+
+-
++
+ flags = g_key_file_get_string_list (keyfile, "Geoclue Provider",
+ "Requires", NULL, NULL);
+ if (flags != NULL) {
+@@ -964,7 +969,7 @@
+ } else {
+ priv->required_resources = GEOCLUE_RESOURCE_NONE;
+ }
+-
++
+ flags = g_key_file_get_string_list (keyfile, "Geoclue Provider",
+ "Provides", NULL, NULL);
+ if (flags != NULL) {
+@@ -974,30 +979,30 @@
+ priv->provides = GEOCLUE_PROVIDE_NONE;
+ }
+
+- if (!connectivity &&
++ if (!connectivity &&
+ (priv->required_resources & GEOCLUE_RESOURCE_NETWORK)) {
+ priv->provides &= ~GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION;
+ priv->net_status = GEOCLUE_CONNECTIVITY_ONLINE;
+ priv->status = GEOCLUE_STATUS_AVAILABLE;
+ gc_master_provider_handle_status_change (provider);
+ }
+-
+- if (connectivity &&
++
++ if (connectivity &&
+ (priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION)) {
+-
+- /* we have network status events: mark network provider
++
++ /* we have network status events: mark network provider
+ * with update flag, set the callback and set use_cache */
+ priv->provides |= GEOCLUE_PROVIDE_UPDATES;
+-
+- g_signal_connect (connectivity,
++
++ g_signal_connect (connectivity,
+ "status-changed",
+- G_CALLBACK (network_status_changed),
++ G_CALLBACK (network_status_changed),
+ provider);
+ priv->net_status = geoclue_connectivity_get_status (connectivity);
+ }
+-
++
+ priv->interfaces = GC_IFACE_GEOCLUE;
+- interfaces = g_key_file_get_string_list (keyfile,
++ interfaces = g_key_file_get_string_list (keyfile,
+ "Geoclue Provider",
+ "Interfaces",
+ NULL, NULL);
+@@ -1005,7 +1010,7 @@
+ priv->interfaces = parse_interface_strings (interfaces);
+ g_strfreev (interfaces);
+ }
+-
++
+ if (priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION &&
+ priv->net_status == GEOCLUE_CONNECTIVITY_ONLINE) {
+ /* do this as idle so we can return without waiting for http queries */
+@@ -1014,26 +1019,26 @@
+ return provider;
+ }
+
+-/* client calls this when it wants to use the provider.
+- Returns true if provider was actually started, and
+- client should assume accuracy has changed.
++/* client calls this when it wants to use the provider.
++ Returns true if provider was actually started, and
++ client should assume accuracy has changed.
+ Returns false if provider was not started (it was either already
+ running or starting the provider failed). */
+-gboolean
+-gc_master_provider_subscribe (GcMasterProvider *provider,
++gboolean
++gc_master_provider_subscribe (GcMasterProvider *provider,
+ gpointer client,
+ GcInterfaceFlags interface)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+ gboolean started = FALSE;
+-
++
+ /* decide wether to run initialize or not */
+ if (!gc_master_provider_is_running (provider)) {
+ if (!(priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION)) {
+ started = gc_master_provider_initialize (provider);
+ }
+ }
+-
++
+ /* add subscription */
+ if (interface & GC_IFACE_POSITION) {
+ if (!g_list_find (priv->position_clients, client)) {
+@@ -1045,7 +1050,7 @@
+ priv->address_clients = g_list_prepend (priv->address_clients, client);
+ }
+ }
+-
++
+ return started;
+ }
+
+@@ -1056,20 +1061,20 @@
+ GcInterfaceFlags interface)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ if (interface & GC_IFACE_POSITION) {
+ priv->position_clients = g_list_remove (priv->position_clients, client);
+ }
+ if (interface & GC_IFACE_ADDRESS) {
+ priv->address_clients = g_list_remove (priv->address_clients, client);
+ }
+-
++
+ if (!priv->position_clients &&
+ !priv->address_clients) {
+ /* no one is using this provider, shutdown... */
+ /* not clearing cached accuracies on purpose */
+ g_debug ("%s without clients", priv->name);
+-
++
+ /* gc_master_provider_deinitialize (provider); */
+ }
+ }
+@@ -1085,10 +1090,10 @@
+ GError **error)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
+- g_assert (priv->position ||
++
++ g_assert (priv->position ||
+ priv->provides & GEOCLUE_PROVIDE_CACHEABLE_ON_CONNECTION);
+-
++
+ if (priv->provides & GEOCLUE_PROVIDE_UPDATES) {
+ if (timestamp != NULL) {
+ *timestamp = priv->position_cache.timestamp;
+@@ -1113,15 +1118,15 @@
+ } else {
+ return geoclue_position_get_position (priv->position,
+ timestamp,
+- latitude,
+- longitude,
++ latitude,
++ longitude,
+ altitude,
+- accuracy,
++ accuracy,
+ error);
+ }
+ }
+
+-gboolean
++gboolean
+ gc_master_provider_get_address (GcMasterProvider *provider,
+ int *timestamp,
+ GHashTable **details,
+@@ -1130,7 +1135,7 @@
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+ if (priv->provides & GEOCLUE_PROVIDE_UPDATES) {
+-
++
+ if (timestamp != NULL) {
+ *timestamp = priv->address_cache.timestamp;
+ }
+@@ -1149,8 +1154,8 @@
+ g_assert (priv->address);
+ return geoclue_address_get_address (priv->address,
+ timestamp,
+- details,
+- accuracy,
++ details,
++ accuracy,
+ error);
+ }
+ }
+@@ -1165,19 +1170,19 @@
+ GcMasterProviderPrivate *priv;
+ GcInterfaceFlags supported_ifaces;
+ GeoclueProvideFlags required_flags = GEOCLUE_PROVIDE_NONE;
+-
++
+ priv = GET_PRIVATE (provider);
+-
++
+ if (need_update) {
+ required_flags |= GEOCLUE_PROVIDE_UPDATES;
+ }
+-
++
+ supported_ifaces = priv->interfaces;
+-
++
+ /* provider must provide all that is required and
+ * cannot require a resource that is not allowed */
+ /* TODO: really, we need to change some of those terms... */
+-
++
+ return (((supported_ifaces & iface_type) == iface_type) &&
+ ((priv->provides & required_flags) == required_flags) &&
+ (priv->expected_accuracy >= min_accuracy) &&
+@@ -1189,9 +1194,9 @@
+ {
+ GeoclueProvider *geoclue;
+ GError *error = NULL;
+-
++
+ geoclue = gc_master_provider_get_provider (provider);
+-
++
+ if (!geoclue_provider_set_options (geoclue,
+ geoclue_get_main_options (),
+ &error)) {
+@@ -1200,20 +1205,20 @@
+ }
+ }
+
+-GeoclueStatus
++GeoclueStatus
+ gc_master_provider_get_status (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ return priv->master_status;
+ }
+
+-GeoclueAccuracyLevel
++GeoclueAccuracyLevel
+ gc_master_provider_get_accuracy (GcMasterProvider *provider, GcInterfaceFlags iface)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+ GeoclueAccuracyLevel acc_level;
+-
++
+ switch (iface) {
+ case GC_IFACE_POSITION:
+ geoclue_accuracy_get_details (priv->position_cache.accuracy,
+@@ -1230,49 +1235,49 @@
+ }
+
+ /*returns a reference, but is not meant for editing...*/
+-char *
++char *
+ gc_master_provider_get_name (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ return priv->name;
+ }
+-char *
++char *
+ gc_master_provider_get_description (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ return priv->description;
+ }
+-char *
++char *
+ gc_master_provider_get_service (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ return priv->service;
+ }
+-char *
++char *
+ gc_master_provider_get_path (GcMasterProvider *provider)
+ {
+ GcMasterProviderPrivate *priv = GET_PRIVATE (provider);
+-
++
+ return priv->path;
+ }
+
+ /* GCompareDataFunc for sorting providers by accuracy and required resources */
+ int
+-gc_master_provider_compare (GcMasterProvider *a,
++gc_master_provider_compare (GcMasterProvider *a,
+ GcMasterProvider *b,
+ GcInterfaceAccuracy *iface_min_accuracy)
+ {
+ int diff;
+ GeoclueAccuracy *acc_a, *acc_b;
+ GeoclueAccuracyLevel level_a, level_b, min_level;
+-
+-
++
++
+ GcMasterProviderPrivate *priv_a = GET_PRIVATE (a);
+ GcMasterProviderPrivate *priv_b = GET_PRIVATE (b);
+-
++
+ /* get the current accuracylevels */
+ switch (iface_min_accuracy->interface) {
+ case GC_IFACE_POSITION:
+@@ -1287,12 +1292,12 @@
+ g_warning("iface: %d", iface_min_accuracy->interface);
+ g_assert_not_reached ();
+ }
+-
++
+
+ geoclue_accuracy_get_details (acc_a, &level_a, NULL, NULL);
+ geoclue_accuracy_get_details (acc_b, &level_b, NULL, NULL);
+ min_level = iface_min_accuracy->accuracy_level;
+-
++
+ /* sort by resource requirements and accuracy, but only if both
+ * providers meet the minimum accuracy requirement */
+ if ((level_b >= min_level) &&
+@@ -1303,7 +1308,7 @@
+ }
+ return level_b - level_a;
+ }
+-
++
+ /* one or both do not meet req's, sort by accuracy */
+ return level_b - level_a;
+ }
+Index: geoclue/src/master.c
+===================================================================
+--- geoclue.orig/src/master.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/src/master.c 2011-12-29 16:40:38.926428900 +0900
+@@ -37,10 +37,6 @@
+ #else
+ #ifdef HAVE_CONIC
+ #include "connectivity-conic.h"
+-#else
+-#ifdef HAVE_CONNMAN
+-#include "connectivity-connman.h"
+-#endif
+ #endif
+ #endif
+
+@@ -75,7 +71,7 @@
+ client = g_object_new (GC_TYPE_MASTER_CLIENT, NULL);
+ dbus_g_connection_register_g_object (master->connection, path,
+ G_OBJECT (client));
+-
++
+ if (object_path) {
+ *object_path = path;
+ }
+@@ -92,7 +88,7 @@
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST |
+ G_SIGNAL_NO_RECURSE,
+- G_STRUCT_OFFSET (GcMasterClass, options_changed),
++ G_STRUCT_OFFSET (GcMasterClass, options_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+@@ -105,15 +101,15 @@
+ const char *filename)
+ {
+ GcMasterProvider *provider;
+-
+- provider = gc_master_provider_new (filename,
++
++ provider = gc_master_provider_new (filename,
+ master->connectivity);
+-
++
+ if (!provider) {
+ g_warning ("Loading from %s failed", filename);
+ return;
+ }
+-
++
+ providers = g_list_prepend (providers, provider);
+ }
+
+@@ -152,11 +148,11 @@
+ continue;
+ }
+
+- fullname = g_build_filename (GEOCLUE_PROVIDERS_DIR,
++ fullname = g_build_filename (GEOCLUE_PROVIDERS_DIR,
+ filename, NULL);
+ gc_master_add_new_provider (master, fullname);
+ g_free (fullname);
+-
++
+ filename = g_dir_read_name (dir);
+ }
+
+@@ -167,16 +163,23 @@
+ gc_master_init (GcMaster *master)
+ {
+ GError *error = NULL;
+-
+-
++
++
+ master->connection = dbus_g_bus_get (GEOCLUE_DBUS_BUS, &error);
+ if (master->connection == NULL) {
+- g_warning ("Could not get %s: %s", GEOCLUE_DBUS_BUS,
++ g_warning ("Could not get %s: %s", GEOCLUE_DBUS_BUS,
+ error->message);
+ g_error_free (error);
+ }
+-
+- master->connectivity = geoclue_connectivity_new ();
++
++ master->connectivity = NULL;
++#ifdef HAVE_NETWORK_MANAGER
++ master->connectivity = GEOCLUE_CONNECTIVITY (g_object_new (GEOCLUE_TYPE_NETWORKMANAGER, NULL));
++#else
++#ifdef HAVE_CONIC
++ master->connectivity = GEOCLUE_CONNECTIVITY (g_object_new (GEOCLUE_TYPE_CONIC, NULL));
++#endif
++#endif
+
+ gc_master_load_providers (master);
+ }
+@@ -190,22 +193,22 @@
+ GError **error)
+ {
+ GList *l, *p = NULL;
+-
++
+ if (providers == NULL) {
+ return NULL;
+ }
+-
++
+ for (l = providers; l; l = l->next) {
+ GcMasterProvider *provider = l->data;
+-
++
+ if (gc_master_provider_is_good (provider,
+- iface_type,
+- min_accuracy,
+- can_update,
++ iface_type,
++ min_accuracy,
++ can_update,
+ allowed)) {
+ p = g_list_prepend (p, provider);
+ }
+ }
+-
++
+ return p;
+ }
+Index: geoclue/test/Makefile.am
+===================================================================
+--- geoclue.orig/test/Makefile.am 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/test/Makefile.am 2011-12-29 16:40:38.930428900 +0900
+@@ -1,6 +1,6 @@
+ if HAVE_GTK
+
+-noinst_PROGRAMS = geoclue-test-gui
++bin_PROGRAMS = geoclue-test-gui
+
+ geoclue_test_gui_LDADD = \
+ $(GTK_LIBS) \
+Index: geoclue/test/geoclue-test-gui.c
+===================================================================
+--- geoclue.orig/test/geoclue-test-gui.c 2011-12-29 16:41:40.362430014 +0900
++++ geoclue/test/geoclue-test-gui.c 2011-12-29 16:40:38.930428900 +0900
+@@ -3,7 +3,7 @@
+ * client-test-gui.c - Geoclue Test GUI
+ *
+ * Authors: Jussi Kukkonen <jku@linux.intel.com>
+- *
++ *
+ * Copyright 2008 OpenedHand Ltd
+ * 2008 Intel Corporation
+ *
+@@ -66,19 +66,19 @@
+
+ typedef struct {
+ GObject parent;
+-
++
+ GtkWidget *window;
+ GtkTextBuffer *buffer;
+-
++
+ GeoclueMasterClient *client;
+ char *master_client_path;
+ GeoclueAccuracyLevel master_accuracy;
+ GeoclueResourceFlags master_resources;
+-
++
+ GtkListStore *position_store;
+ GList *position_providers; /* PositionProviders, first one is master */
+-
+- GtkListStore *address_store;
++
++ GtkListStore *address_store;
+ GList *address_providers; /* AddressProviders, first one is master */
+ } GeoclueTestGui;
+
+@@ -92,7 +92,7 @@
+ static void
+ geoclue_test_gui_dispose (GObject *object)
+ {
+-
++
+ G_OBJECT_CLASS (geoclue_test_gui_parent_class)->dispose (object);
+ }
+
+@@ -101,7 +101,7 @@
+ geoclue_test_gui_class_init (GeoclueTestGuiClass *klass)
+ {
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+-
++
+ object_class->dispose = geoclue_test_gui_dispose;
+ }
+
+@@ -114,16 +114,16 @@
+ time_t rawtime;
+ struct tm *timeinfo;
+ char time_buffer [20];
+-
++
+ time (&rawtime);
+ timeinfo = localtime (&rawtime);
+-
++
+ strftime (time_buffer, 19, "%X", timeinfo);
+ line = g_strdup_printf ("%s: %s\n", time_buffer, message);
+-
++
+ gtk_text_buffer_get_end_iter (gui->buffer, &iter);
+ gtk_text_buffer_insert (gui->buffer, &iter, line, -1);
+-
++
+ g_free (line);
+ }
+
+@@ -132,10 +132,10 @@
+ {
+ GeoclueProvider *p = NULL;
+ gboolean valid;
+-
++
+ g_assert (model);
+ g_assert (provider);
+-
++
+ valid = gtk_tree_model_get_iter_first (model, iter);
+ while (valid) {
+ gtk_tree_model_get (model, iter,
+@@ -144,10 +144,10 @@
+ if (p == provider) {
+ return TRUE;
+ }
+-
++
+ valid = gtk_tree_model_iter_next (model, iter);
+ }
+-
++
+ return FALSE;
+ }
+
+@@ -155,9 +155,9 @@
+ update_address (GeoclueTestGui *gui, GeoclueAddress *address, GHashTable *details)
+ {
+ GtkTreeIter iter;
+-
++
+ g_assert (details);
+-
++
+ if (get_matching_tree_iter (GTK_TREE_MODEL (gui->address_store),
+ GEOCLUE_PROVIDER (address),
+ &iter)) {
+@@ -175,11 +175,11 @@
+
+
+ static void
+-update_position (GeoclueTestGui *gui, GeocluePosition *position,
++update_position (GeoclueTestGui *gui, GeocluePosition *position,
+ double lat, double lon, double alt)
+ {
+ GtkTreeIter iter;
+-
++
+ if (get_matching_tree_iter (GTK_TREE_MODEL (gui->position_store),
+ GEOCLUE_PROVIDER (position),
+ &iter)) {
+@@ -216,53 +216,24 @@
+ update_position (gui, position, latitude, longitude, altitude);
+ }
+
+-typedef struct {
+- GeoclueTestGui *gui;
+- char *name;
+-} cb_data;
+-
+-static void
+-position_callback (GeocluePosition *position,
+- GeocluePositionFields fields,
+- int timestamp,
+- double lat, double lon, double alt,
+- GeoclueAccuracy *accuracy,
+- GError *error,
+- cb_data *data)
+-{
+- if (error) {
+- g_warning ("Error getting position from %s: %s\n", data->name, error->message);
+- g_error_free (error);
+- lat = lon = alt = 0.0/0.0;
+- }
+-
+- update_position (data->gui, position, lat, lon, alt);
+-
+- g_free (data->name);
+- g_free (data);
+-}
+-
+ static void
+ address_callback (GeoclueAddress *address,
+ int timestamp,
+ GHashTable *details,
+ GeoclueAccuracy *accuracy,
+ GError *error,
+- cb_data *data)
++ gpointer userdata)
+ {
+ if (error) {
+- g_warning ("Error getting address for %s: %s\n", data->name, error->message);
++ g_warning ("Error getting address: %s\n", error->message);
+ g_error_free (error);
+ details = geoclue_address_details_new ();
+ }
+
+- update_address (data->gui, address, details);
+-
+- g_free (data->name);
+- g_free (data);
++ update_address (GEOCLUE_TEST_GUI (userdata), address, details);
+ }
+
+-static void
++static void
+ info_callback (GeoclueProvider *provider,
+ char *name,
+ char *description,
+@@ -271,14 +242,13 @@
+ {
+ GtkTreeIter iter;
+ GeoclueTestGui *gui = GEOCLUE_TEST_GUI (userdata);
+- cb_data *data;
+-
++
+ if (error) {
+ g_warning ("Error getting provider info: %s\n", error->message);
+ g_error_free (error);
+ return;
+ }
+-
++
+ if (get_matching_tree_iter (GTK_TREE_MODEL (gui->address_store),
+ provider,
+ &iter)) {
+@@ -288,15 +258,8 @@
+ COL_ADDRESS_PROVIDER_NAME, name,
+ -1);
+ }
+-
+- data = g_new0 (cb_data, 1);
+- data->gui = gui;
+- data->name = g_strdup (name);
+- geoclue_address_get_address_async (GEOCLUE_ADDRESS (provider),
+- (GeoclueAddressCallback)address_callback,
+- data);
+ }
+-
++
+ if (get_matching_tree_iter (GTK_TREE_MODEL (gui->position_store),
+ provider,
+ &iter)) {
+@@ -306,24 +269,17 @@
+ COL_POSITION_PROVIDER_NAME, name,
+ -1);
+ }
+-
+- data = g_new0 (cb_data, 1);
+- data->gui = gui;
+- data->name = g_strdup (name);
+- geoclue_position_get_position_async (GEOCLUE_POSITION (provider),
+- (GeocluePositionCallback)position_callback,
+- data);
+ }
+ }
+
+-static void
++static void
+ add_to_address_store (GeoclueTestGui *gui, GeoclueAddress *address, gboolean is_master)
+ {
+ GtkTreeIter iter;
+-
++
+ g_assert (gui->address_store);
+ g_assert (address);
+-
++
+ if (is_master) {
+ /* master is already on the first line */
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (gui->address_store), &iter);
+@@ -334,14 +290,15 @@
+ COL_ADDRESS_PROVIDER, address,
+ COL_ADDRESS_IS_MASTER, is_master,
+ -1);
+-
++
+ g_signal_connect (G_OBJECT (address), "address-changed",
+ G_CALLBACK (address_changed), gui);
+-
+- /* callback will call get_address */
+- geoclue_provider_get_provider_info_async (GEOCLUE_PROVIDER (address),
++
++ geoclue_provider_get_provider_info_async (GEOCLUE_PROVIDER (address),
+ info_callback,
+ gui);
++ geoclue_address_get_address_async (address, address_callback, gui);
++
+ }
+
+ static gboolean
+@@ -352,26 +309,26 @@
+ GKeyFile *keyfile;
+ gboolean ret;
+ GError *error;
+-
++
+ filename = g_dir_read_name (dir);
+ if (!filename) {
+ return FALSE;
+ }
+-
+- fullname = g_build_filename (GEOCLUE_PROVIDERS_DIR,
++
++ fullname = g_build_filename (GEOCLUE_PROVIDERS_DIR,
+ filename, NULL);
+ keyfile = g_key_file_new ();
+- ret = g_key_file_load_from_file (keyfile, fullname,
++ ret = g_key_file_load_from_file (keyfile, fullname,
+ G_KEY_FILE_NONE, &error);
+ g_free (fullname);
+-
++
+ if (!ret) {
+ g_warning ("Error loading %s: %s", filename, error->message);
+ g_error_free (error);
+ } else {
+ *name = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Name", NULL);
+-
++
+ *service = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Service", NULL);
+ *path = g_key_file_get_value (keyfile, "Geoclue Provider",
+@@ -379,19 +336,36 @@
+ *ifaces = g_key_file_get_value (keyfile, "Geoclue Provider",
+ "Interfaces", NULL);
+ }
+-
++
+ g_key_file_free (keyfile);
+ return TRUE;
+ }
+
+-static void
++static void
++position_callback (GeocluePosition *position,
++ GeocluePositionFields fields,
++ int timestamp,
++ double lat, double lon, double alt,
++ GeoclueAccuracy *accuracy,
++ GError *error,
++ gpointer userdata)
++{
++ if (error) {
++ g_warning ("Error getting position: %s\n", error->message);
++ g_error_free (error);
++ lat = lon = alt = 0.0/0.0;
++ }
++ update_position (GEOCLUE_TEST_GUI (userdata), position, lat, lon, alt);
++}
++
++static void
+ add_to_position_store (GeoclueTestGui *gui, GeocluePosition *position, gboolean is_master)
+ {
+ GtkTreeIter iter;
+-
++
+ g_assert (gui->position_store);
+ g_assert (position);
+-
++
+ if (is_master) {
+ /* master is already on the first line */
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (gui->position_store), &iter);
+@@ -402,14 +376,14 @@
+ COL_POSITION_PROVIDER, position,
+ COL_POSITION_IS_MASTER, is_master,
+ -1);
+-
++
+ g_signal_connect (G_OBJECT (position), "position-changed",
+ G_CALLBACK (position_changed), gui);
+-
+- /* callback will call get_position */
+- geoclue_provider_get_provider_info_async (GEOCLUE_PROVIDER (position),
++
++ geoclue_provider_get_provider_info_async (GEOCLUE_PROVIDER (position),
+ info_callback,
+ gui);
++ geoclue_position_get_position_async (position, position_callback, gui);
+ }
+
+
+@@ -418,69 +392,69 @@
+ {
+ GtkTreeView *view;
+ GtkCellRenderer *renderer;
+-
++
+ view = GTK_TREE_VIEW (gtk_tree_view_new ());
+-
++
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- "Provider",
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ "Provider",
+ renderer,
+ "text",
+ COL_ADDRESS_PROVIDER_NAME,
+ NULL);
+-
++
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_COUNTRY,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_COUNTRY,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_COUNTRY,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_COUNTRYCODE,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_COUNTRYCODE,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_COUNTRYCODE,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_REGION,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_REGION,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_REGION,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_LOCALITY,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_LOCALITY,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_LOCALITY,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_AREA,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_AREA,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_AREA,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_POSTALCODE,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_POSTALCODE,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_POSTALCODE,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- GEOCLUE_ADDRESS_KEY_STREET,
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ GEOCLUE_ADDRESS_KEY_STREET,
+ renderer,
+- "text",
++ "text",
+ COL_ADDRESS_STREET,
+ NULL);
+-
+- gui->address_store = gtk_list_store_new (NUM_ADDRESS_COLS,
+- G_TYPE_POINTER,
++
++ gui->address_store = gtk_list_store_new (NUM_ADDRESS_COLS,
++ G_TYPE_POINTER,
+ G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ G_TYPE_STRING,
+@@ -490,9 +464,9 @@
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+-
++
+ gtk_tree_view_set_model (view, GTK_TREE_MODEL(gui->address_store));
+-
++
+ return GTK_WIDGET (view);
+ }
+
+@@ -502,63 +476,63 @@
+ {
+ GtkTreeView *view;
+ GtkCellRenderer *renderer;
+-
++
+ view = GTK_TREE_VIEW (gtk_tree_view_new ());
+-
++
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- "Provider",
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ "Provider",
+ renderer,
+ "text",
+ COL_POSITION_PROVIDER_NAME,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- "latitude",
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ "latitude",
+ renderer,
+- "text",
++ "text",
+ COL_POSITION_LAT,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- "longitude",
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ "longitude",
+ renderer,
+- "text",
++ "text",
+ COL_POSITION_LON,
+ NULL);
+ renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (view, -1,
+- "altitude",
++ gtk_tree_view_insert_column_with_attributes (view, -1,
++ "altitude",
+ renderer,
+- "text",
++ "text",
+ COL_POSITION_ALT,
+ NULL);
+-
+- gui->position_store = gtk_list_store_new (NUM_POSITION_COLS,
+- G_TYPE_POINTER,
++
++ gui->position_store = gtk_list_store_new (NUM_POSITION_COLS,
++ G_TYPE_POINTER,
+ G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ G_TYPE_DOUBLE,
+ G_TYPE_DOUBLE,
+ G_TYPE_DOUBLE);
+-
++
+ gtk_tree_view_set_model (view, GTK_TREE_MODEL(gui->position_store));
+-
++
+ return GTK_WIDGET (view);
+ }
+
+ static void
+ master_position_provider_changed (GeoclueMasterClient *client,
+ char *name,
+- char *description,
++ char *description,
+ char *service,
+ char *path,
+ GeoclueTestGui *gui)
+ {
+ GtkTreeIter iter;
+ char *msg;
+-
+- if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (gui->position_store),
++
++ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (gui->position_store),
+ &iter)) {
+ gtk_list_store_set (gui->position_store, &iter,
+ COL_POSITION_PROVIDER_NAME, g_strdup_printf ("Master (%s)", name),
+@@ -572,15 +546,15 @@
+ static void
+ master_address_provider_changed (GeoclueMasterClient *client,
+ char *name,
+- char *description,
++ char *description,
+ char *service,
+ char *path,
+ GeoclueTestGui *gui)
+ {
+ GtkTreeIter iter;
+ char *msg;
+-
+- if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (gui->address_store),
++
++ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (gui->address_store),
+ &iter)) {
+ gtk_list_store_set (gui->address_store, &iter,
+ COL_ADDRESS_PROVIDER_NAME, g_strdup_printf ("Master (%s)", name),
+@@ -605,7 +579,7 @@
+ static void
+ update_master_requirements (GeoclueTestGui *gui)
+ {
+- geoclue_master_client_set_requirements_async (gui->client,
++ geoclue_master_client_set_requirements_async (gui->client,
+ gui->master_accuracy,
+ 0,
+ FALSE,
+@@ -614,14 +588,14 @@
+ NULL);
+ }
+
+-static void
++static void
+ create_address_callback (GeoclueMasterClient *client,
+ GeoclueAddress *address,
+ GError *error,
+ gpointer userdata)
+ {
+ GeoclueTestGui *gui = GEOCLUE_TEST_GUI (userdata);
+-
++
+ if (error) {
+ g_printerr ("Master Client: Failed to create address: %s", error->message);
+ g_error_free (error);
+@@ -630,14 +604,14 @@
+ add_to_address_store (gui, address, TRUE);
+ }
+
+-static void
++static void
+ create_position_callback (GeoclueMasterClient *client,
+ GeocluePosition *position,
+ GError *error,
+ gpointer userdata)
+ {
+ GeoclueTestGui *gui = GEOCLUE_TEST_GUI (userdata);
+-
++
+ if (error) {
+ g_printerr ("Master Client: Failed to create position: %s", error->message);
+ g_error_free (error);
+@@ -658,40 +632,40 @@
+ char *name, *path, *service, *ifaces;
+ GtkTreeIter iter;
+ GeoclueTestGui *gui = GEOCLUE_TEST_GUI (userdata);
+-
++
+ if (error) {
+ g_printerr ("Failed to create master client: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+-
++
+ gui->client = client;
+-
++
+ g_signal_connect (G_OBJECT (gui->client), "position-provider-changed",
+ G_CALLBACK (master_position_provider_changed), gui);
+ g_signal_connect (G_OBJECT (gui->client), "address-provider-changed",
+ G_CALLBACK (master_address_provider_changed), gui);
+ update_master_requirements (gui);
+-
++
+ /* add master providers to the lists */
+ gtk_list_store_append (gui->position_store, &iter);
+- geoclue_master_client_create_position_async (gui->client,
++ geoclue_master_client_create_position_async (gui->client,
+ create_position_callback,
+ gui);
+ gtk_list_store_append (gui->address_store, &iter);
+- geoclue_master_client_create_address_async (gui->client,
++ geoclue_master_client_create_address_async (gui->client,
+ create_address_callback,
+ gui);
+-
++
+ /* add individual providers based on files in GEOCLUE_PROVIDERS_DIR */
+ dir = g_dir_open (GEOCLUE_PROVIDERS_DIR, 0, &error);
+ if (!dir) {
+- g_warning ("Error opening %s: %s\n",
++ g_warning ("Error opening %s: %s\n",
+ GEOCLUE_PROVIDERS_DIR, error->message);
+ g_error_free (error);
+ return;
+ }
+-
++
+ name = service = path = ifaces = NULL;
+ while (get_next_provider (dir, &name, &service, &path, &ifaces)) {
+ if (ifaces && strstr (ifaces, "org.freedesktop.Geoclue.Position")) {
+@@ -705,7 +679,7 @@
+ g_free (service);
+ g_free (ifaces);
+ }
+-
++
+ g_dir_close (dir);
+ g_object_unref (master);
+ }
+@@ -714,9 +688,9 @@
+ geoclue_test_gui_load_providers (GeoclueTestGui *gui)
+ {
+ GeoclueMaster *master;
+-
++
+ master = geoclue_master_get_default ();
+- geoclue_master_create_client_async (master,
++ geoclue_master_create_client_async (master,
+ create_client_callback,
+ gui);
+ }
+@@ -725,13 +699,13 @@
+ accuracy_combo_changed (GtkComboBox *combo, GeoclueTestGui *gui)
+ {
+ GtkTreeIter iter;
+-
++
+ if (gtk_combo_box_get_active_iter (combo, &iter)) {
+ GtkTreeModel *model;
+-
++
+ model = gtk_combo_box_get_model (combo);
+- gtk_tree_model_get (model, &iter, 0, &gui->master_accuracy, -1);
+-
++ gtk_tree_model_get (model, &iter, 0, &gui->master_accuracy, -1);
++
+ update_master_requirements (gui);
+ }
+ }
+@@ -776,49 +750,49 @@
+ GtkWidget *combo;
+ GtkTreeIter iter;
+ GtkCellRenderer *renderer;
+-
++
+ store = gtk_list_store_new (2, G_TYPE_UINT, G_TYPE_STRING);
+-
++
+ gtk_list_store_append (store, &iter);
+- gtk_list_store_set (store, &iter,
+- 0, GEOCLUE_ACCURACY_LEVEL_COUNTRY,
++ gtk_list_store_set (store, &iter,
++ 0, GEOCLUE_ACCURACY_LEVEL_COUNTRY,
+ 1, "Country",
+ -1);
+ gtk_list_store_append (store, &iter);
+- gtk_list_store_set (store, &iter,
+- 0, GEOCLUE_ACCURACY_LEVEL_REGION,
++ gtk_list_store_set (store, &iter,
++ 0, GEOCLUE_ACCURACY_LEVEL_REGION,
+ 1, "Region",
+ -1);
+ gtk_list_store_append (store, &iter);
+- gtk_list_store_set (store, &iter,
+- 0, GEOCLUE_ACCURACY_LEVEL_LOCALITY,
++ gtk_list_store_set (store, &iter,
++ 0, GEOCLUE_ACCURACY_LEVEL_LOCALITY,
+ 1, "Locality",
+ -1);
+ gtk_list_store_append (store, &iter);
+- gtk_list_store_set (store, &iter,
+- 0, GEOCLUE_ACCURACY_LEVEL_POSTALCODE,
++ gtk_list_store_set (store, &iter,
++ 0, GEOCLUE_ACCURACY_LEVEL_POSTALCODE,
+ 1, "Postalcode",
+ -1);
+ gtk_list_store_append (store, &iter);
+- gtk_list_store_set (store, &iter,
+- 0, GEOCLUE_ACCURACY_LEVEL_STREET,
++ gtk_list_store_set (store, &iter,
++ 0, GEOCLUE_ACCURACY_LEVEL_STREET,
+ 1, "Street",
+ -1);
+ gtk_list_store_append (store, &iter);
+- gtk_list_store_set (store, &iter,
+- 0, GEOCLUE_ACCURACY_LEVEL_DETAILED,
++ gtk_list_store_set (store, &iter,
++ 0, GEOCLUE_ACCURACY_LEVEL_DETAILED,
+ 1, "Detailed",
+ -1);
+-
++
+ combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer,
+ "text", 1, NULL);
+-
++
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+ gui->master_accuracy = GEOCLUE_ACCURACY_LEVEL_COUNTRY;
+-
++
+ return combo;
+ }
+
+@@ -836,88 +810,88 @@
+ GtkWidget *combo, *check;
+ GtkWidget *scrolled_win;
+ GtkWidget *view;
+-
++
+ gui->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (G_OBJECT (gui->window), "destroy",
+ G_CALLBACK (gtk_main_quit), NULL);
+-
++
+ view = gtk_text_view_new ();
+ gtk_widget_set_size_request (GTK_WIDGET (view), 500, 200);
+ g_object_set (G_OBJECT (view), "editable", FALSE, NULL);
+ gui->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
+-
+-
++
++
+ box = gtk_vbox_new (FALSE, 8);
+ gtk_container_add (GTK_CONTAINER (gui->window), box);
+-
++
+ frame = gtk_frame_new ("Master settings");
+ gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 4);
+-
+-
++
++
+ hbox = gtk_hbox_new (FALSE, 24);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+-
++
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 8);
+ label = gtk_label_new ("Required accuracy level:");
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+-
+- combo = get_accuracy_combo (gui);
++
++ combo = get_accuracy_combo (gui);
+ g_signal_connect (combo, "changed",
+ G_CALLBACK (accuracy_combo_changed), gui);
+ gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
+-
++
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+ label = gtk_label_new ("Allow resources:");
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+-
++
+ check = gtk_check_button_new_with_label ("Network");
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
+ gui->master_resources |= GEOCLUE_RESOURCE_NETWORK;
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (network_check_toggled), gui);
+ gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
+-
++
+ check = gtk_check_button_new_with_label ("GPS");
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (gps_check_toggled), gui);
+ gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
+-
++
+ check = gtk_check_button_new_with_label ("Cell");
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (cell_check_toggled), gui);
+ gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
+-
++
+ notebook = gtk_notebook_new ();
+ gtk_box_pack_start (GTK_BOX (box), notebook, FALSE, FALSE, 0);
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), TRUE);
+ gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), TRUE);
+-
++
+ address_view = get_address_tree_view (gui);
+ label = gtk_label_new ("Address");
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), address_view, label);
+-
++
+ position_view = get_position_tree_view (gui);
+ label = gtk_label_new ("Position");
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), position_view, label);
+-
+-
++
++
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
+ label = gtk_label_new ("Master log");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+-
++
+ scrolled_win = gtk_scrolled_window_new (NULL, NULL);
+- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
++ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
+ GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+ gtk_container_add (GTK_CONTAINER (box), scrolled_win);
+ gtk_container_add (GTK_CONTAINER (scrolled_win), view);
+-
++
+ geoclue_test_gui_load_providers (gui);
+-
++
+ geoclue_test_gui_master_log_message (gui, "Started Geoclue test UI");
+-
++
+ gtk_widget_show_all (gui->window);
+ }
+
+@@ -925,13 +899,13 @@
+ int main (int argc, char **argv)
+ {
+ GeoclueTestGui *gui;
+-
++
+ gtk_init (&argc, &argv);
+-
++
+ gui = g_object_new (GEOCLUE_TYPE_TEST_GUI, NULL);
+ gtk_main ();
+-
++
+ g_object_unref (gui);
+-
++
+ return 0;
+ }
+Index: geoclue/AUTHORS
+===================================================================
+--- geoclue.orig/AUTHORS 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/AUTHORS 2011-12-29 16:40:58.662429311 +0900
+@@ -1,3 +1,8 @@
+ Keith Preston <keithpre@gmail.com>
+ Jussi Kukkonen <jku@o-hand.com>
+ Iain Holmes <Iain@openedhand.com>
++Sangho Park <sangho.g.park@samsung.com>
++Tae-Hwan Kim <the81.kim@samsung.com>
++Youngae Kang <youngae.kang@samsung.com>
++Yunhan Kim <yhan.kim@samsung.com>
++Genie Kim <daejins.kim@samsung.com>
+Index: geoclue/Makefile.am
+===================================================================
+--- geoclue.orig/Makefile.am 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/Makefile.am 2011-12-29 16:44:31.974432915 +0900
+@@ -1,4 +1,4 @@
+-SUBDIRS = interfaces geoclue src providers example test docs
++SUBDIRS = interfaces geoclue providers src
+
+ pkgconfigdir = $(libdir)/pkgconfig
+ pkgconfig_DATA = geoclue.pc
+Index: geoclue/autogen.sh
+===================================================================
+--- geoclue.orig/autogen.sh 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/autogen.sh 2011-12-29 16:40:58.662429311 +0900
+@@ -5,7 +5,6 @@
+ ACLOCAL=aclocal
+ AUTOCONF=autoconf
+ AUTOHEADER=autoheader
+-GTKDOCIZE=gtkdocize
+
+ # Check for binaries
+
+@@ -29,17 +28,8 @@
+ exit 1
+ }
+
+-[ "x$(which ${GTKDOCIZE})x" = "xx" ] && {
+- echo "${GTKDOCIZE} not found. Please install it."
+- exit 1
+-}
+-
+-gtkdocize || exit 1
+-
+ "${ACLOCAL}" \
+-&& "${LIBTOOLIZE}" \
++&& "${LIBTOOLIZE}" --force \
+ && "${AUTOHEADER}" \
+-&& "${AUTOMAKE}" --add-missing \
+-&& "${AUTOCONF}"
+-
+-$(dirname "${0}")/configure "$@"
++&& "${AUTOCONF}" \
++&& "${AUTOMAKE}" --add-missing
+Index: geoclue/configure.ac
+===================================================================
+--- geoclue.orig/configure.ac 2011-12-29 16:41:40.358430015 +0900
++++ geoclue/configure.ac 2011-12-29 16:40:58.662429311 +0900
+@@ -6,9 +6,6 @@
+ AM_INIT_AUTOMAKE([1.9 foreign])
+ GEOCLUE_VERSION=0.12.0
+
+-# Enable silent build when available (Automake 1.11)
+-m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
+-
+ AC_PROG_CC
+ AC_ISC_POSIX
+
+@@ -17,9 +14,8 @@
+ AC_PROG_MAKE_SET
+ AC_PROG_GCC_TRADITIONAL
+ AM_PROG_LIBTOOL
+-GLIB_GSETTINGS
+
+-GTK_DOC_CHECK(1.0)
++#GTK_DOC_CHECK(1.0)
+ AC_CHECK_PROGS(XSLT, xsltproc)
+
+ AC_ARG_ENABLE(system-bus,
+@@ -38,15 +34,14 @@
+ PKG_CHECK_MODULES(GEOCLUE, [
+ glib-2.0
+ gobject-2.0
+- dbus-glib-1 >= 0.86
++ dbus-glib-1 >= 0.60
+ libxml-2.0
+ ])
+ AC_SUBST(GEOCLUE_LIBS)
+ AC_SUBST(GEOCLUE_CFLAGS)
+
+ PKG_CHECK_MODULES(MASTER, [
+- gio-2.0 >= 2.25.7
+- glib-2.0
++ gconf-2.0
+ ])
+ AC_SUBST(MASTER_LIBS)
+ AC_SUBST(MASTER_CFLAGS)
+@@ -66,7 +61,7 @@
+ AC_ARG_ENABLE(gtk,
+ AS_HELP_STRING([--enable-gtk=@<:@no/yes/auto@:>@],
+ [build with gtk support]), ,
+- enable_gtk=auto)
++ enable_gtk=no)
+
+ if test "x$enable_gtk" != "xno"; then
+ PKG_CHECK_MODULES(GTK,
+@@ -82,7 +77,7 @@
+ fi
+
+ if test "x$enable_gtk" = "xyes" -a "x$have_gtk" != "xyes"; then
+- AC_MSG_ERROR([Couldn't find gtk dependencies.])
++ AC_MSG_ERROR(["Couldn't find gtk dependencies."])
+ fi
+
+ AM_CONDITIONAL(HAVE_GTK, test "x$have_gtk" = "xyes")
+@@ -117,19 +112,7 @@
+ fi
+
+ if test "x$enable_conic" = "xyes" -a "x$have_conic" != "xyes"; then
+- AC_MSG_ERROR([Couldn't find conic dependencies.])
+-fi
+-
+-AC_ARG_ENABLE(connman,
+- AS_HELP_STRING([--enable-connman=@<:@no/yes/auto@:>@],
+- [build with connman support]), ,
+- enable_connman=auto)
+-
+-if test "x$enable_connman" != "xno"; then
+- CONNECTIVITY="ConnMan"
+- AC_DEFINE(HAVE_CONNMAN, 1, [define if libconmann is installed])
+-else
+- have_connman=no
++ AC_MSG_ERROR(["Couldn't find conic dependencies."])
+ fi
+
+ AC_ARG_ENABLE(networkmanager,
+@@ -140,7 +123,7 @@
+ if test "x$enable_networkmanager" != "xno"; then
+ PKG_CHECK_MODULES(NETWORK_MANAGER,
+ [
+- NetworkManager libnm-glib libnm-util
++ NetworkManager libnm_glib
+ ], have_networkmanager="yes", have_networkmanager="no")
+
+ if test "x$have_networkmanager" = "xyes"; then
+@@ -154,44 +137,13 @@
+ fi
+
+ if test "x$enable_networkmanager" = "xyes" -a "x$have_networkmanager" != "xyes"; then
+- AC_MSG_ERROR([Couldn't find Network Manager dependencies.])
++ AC_MSG_ERROR(["Couldn't find Network Manager dependencies."])
+ fi
+
+ AC_SUBST(CONNECTIVITY_LIBS)
+ AC_SUBST(CONNECTIVITY_CFLAGS)
+
+-PROVIDER_SUBDIRS="example hostip geonames nominatim manual plazes localnet yahoo gsmloc"
+-
+-# -----------------------------------------------------------
+-# gypsy / gpsd / skyhook
+-# -----------------------------------------------------------
+-
+-GYPSY_REQUIRED=0.7.1
+-AC_ARG_ENABLE(gypsy,
+- AS_HELP_STRING([--enable-gypsy=@<:@no/yes/auto@:>@],
+- [build with gypsy support]), ,
+- enable_gypsy=auto)
+-
+-if test "x$enable_gypsy" != "xno"; then
+- PKG_CHECK_MODULES(GYPSY,
+- [
+- gypsy >= $GYPSY_REQUIRED
+- ], have_gypsy="yes", have_gypsy="no")
+-
+- if test "x$have_gypsy" = "xyes"; then
+- PROVIDER_SUBDIRS="$PROVIDER_SUBDIRS gypsy"
+- else
+- NO_BUILD_PROVIDERS="$NO_BUILD_PROVIDERS gypsy"
+- fi
+- else
+- have_gypsy=no
+-fi
+-
+-if test "x$enable_gypsy" = "xyes" -a "x$have_gypsy" != "xyes"; then
+- AC_MSG_ERROR([Couldn't find gypsy dependencies.])
+-fi
+-AC_SUBST(GYPSY_LIBS)
+-AC_SUBST(GYPSY_CFLAGS)
++PROVIDER_SUBDIRS="nominatim"
+
+ AC_ARG_ENABLE(gpsd,
+ AS_HELP_STRING([--enable-gpsd=@<:@no/yes/auto@:>@],
+@@ -210,65 +162,27 @@
+ fi
+
+ if test "x$enable_gpsd" = "xyes" -a "x$have_gpsd" != "xyes"; then
+- AC_MSG_ERROR([Couldn't find gpsd dependencies - libgps >= 2.90.])
++ AC_MSG_ERROR(["Couldn't find gpsd dependencies - libgps >= 2.90."])
+ fi
+ AC_SUBST(GPSD_LIBS)
+ AC_SUBST(GPSD_CFLAGS)
+
+-AC_ARG_ENABLE(skyhook,
+- AS_HELP_STRING([--enable-skyhook=@<:@no/yes/auto@:>@],
+- [build with skyhook support]), ,
+- enable_skyhook=auto)
+-
+-if test "x$enable_skyhook" != "xno"; then
+- PKG_CHECK_MODULES(SKYHOOK, [
+- libsoup-gnome-2.4
+- ], have_skyhook=yes, have_skyhook=no)
+-
+- if test "x$have_skyhook" = "xyes"; then
+- PROVIDER_SUBDIRS="$PROVIDER_SUBDIRS skyhook"
+- GPSD_LIBS="-lgps"
+- else
+- NO_BUILD_PROVIDERS="$NO_BUILD_PROVIDERS skyhook"
+- fi
+- else
+- have_skyhook=no
+-fi
+-
+-if test "x$enable_skyhook" = "xyes" -a "x$have_skyhook" != "xyes"; then
+- AC_MSG_ERROR([Couldn't find gpsd dependencies.])
+-fi
+-AC_SUBST(SKYHOOK_LIBS)
+-AC_SUBST(SKYHOOK_CFLAGS)
+-
+ AC_SUBST(PROVIDER_SUBDIRS)
+ AC_SUBST(NO_BUILD_PROVIDERS)
+
+ AC_CONFIG_FILES([
+ geoclue.pc
+ Makefile
+-docs/Makefile
+-docs/reference/Makefile
+-docs/tools/Makefile
+ interfaces/Makefile
+ geoclue/Makefile
+-example/Makefile
+-test/Makefile
+ providers/Makefile
+-providers/example/Makefile
+-providers/gypsy/Makefile
+ providers/gpsd/Makefile
+-providers/hostip/Makefile
+-providers/geonames/Makefile
+-providers/manual/Makefile
+ providers/nominatim/Makefile
+-providers/plazes/Makefile
+-providers/localnet/Makefile
+-providers/yahoo/Makefile
+-providers/gsmloc/Makefile
+-providers/skyhook/Makefile
+ src/Makefile
+ ])
++#docs/Makefile
++#docs/reference/Makefile
++#docs/tools/Makefile
+
+ AC_OUTPUT
+
+Index: geoclue/gtk-doc.make
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ geoclue/gtk-doc.make 2011-12-29 16:40:58.666429311 +0900
+@@ -0,0 +1,224 @@
++# -*- mode: makefile -*-
++
++####################################
++# Everything below here is generic #
++####################################
++
++if GTK_DOC_USE_LIBTOOL
++GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
++GTKDOC_RUN = $(LIBTOOL) --mode=execute
++else
++GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
++GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
++GTKDOC_RUN =
++endif
++
++# We set GPATH here; this gives us semantics for GNU make
++# which are more like other make's VPATH, when it comes to
++# whether a source that is a target of one rule is then
++# searched for in VPATH/GPATH.
++#
++GPATH = $(srcdir)
++
++TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
++
++EXTRA_DIST = \
++ $(content_files) \
++ $(HTML_IMAGES) \
++ $(DOC_MAIN_SGML_FILE) \
++ $(DOC_MODULE)-sections.txt \
++ $(DOC_MODULE)-overrides.txt
++
++DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \
++ pdf-build.stamp \
++ $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \
++ $(srcdir)/pdf.stamp
++
++SCANOBJ_FILES = \
++ $(DOC_MODULE).args \
++ $(DOC_MODULE).hierarchy \
++ $(DOC_MODULE).interfaces \
++ $(DOC_MODULE).prerequisites \
++ $(DOC_MODULE).signals
++
++REPORT_FILES = \
++ $(DOC_MODULE)-undocumented.txt \
++ $(DOC_MODULE)-undeclared.txt \
++ $(DOC_MODULE)-unused.txt
++
++CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
++
++if ENABLE_GTK_DOC
++if GTK_DOC_BUILD_HTML
++HTML_BUILD_STAMP=html-build.stamp
++else
++HTML_BUILD_STAMP=
++endif
++if GTK_DOC_BUILD_PDF
++PDF_BUILD_STAMP=pdf-build.stamp
++else
++PDF_BUILD_STAMP=
++endif
++
++all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
++else
++all-local:
++endif
++
++docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
++
++$(REPORT_FILES): sgml-build.stamp
++
++#### scan ####
++
++scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
++ @echo 'gtk-doc: Scanning header files'
++ @-chmod -R u+w $(srcdir)
++ @cd $(srcdir) && \
++ gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES)
++ @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \
++ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \
++ else \
++ cd $(srcdir) ; \
++ for i in $(SCANOBJ_FILES) ; do \
++ test -f $$i || touch $$i ; \
++ done \
++ fi
++ @touch scan-build.stamp
++
++$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
++ @true
++
++#### templates ####
++
++tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
++ @echo 'gtk-doc: Rebuilding template files'
++ @-chmod -R u+w $(srcdir)
++ @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
++ @touch tmpl-build.stamp
++
++tmpl.stamp: tmpl-build.stamp
++ @true
++
++$(srcdir)/tmpl/*.sgml:
++ @true
++
++#### xml ####
++
++sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
++ @echo 'gtk-doc: Building XML'
++ @-chmod -R u+w $(srcdir)
++ @cd $(srcdir) && \
++ gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS)
++ @touch sgml-build.stamp
++
++sgml.stamp: sgml-build.stamp
++ @true
++
++#### html ####
++
++html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
++ @echo 'gtk-doc: Building HTML'
++ @-chmod -R u+w $(srcdir)
++ @rm -rf $(srcdir)/html
++ @mkdir $(srcdir)/html
++ @mkhtml_options=""; \
++ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
++ if test "$(?)" = "0"; then \
++ mkhtml_options=--path="$(srcdir)"; \
++ fi; \
++ cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
++ @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
++ @echo 'gtk-doc: Fixing cross-references'
++ @cd $(srcdir) && gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
++ @touch html-build.stamp
++
++#### pdf ####
++
++pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
++ @echo 'gtk-doc: Building PDF'
++ @-chmod -R u+w $(srcdir)
++ @rm -rf $(srcdir)/$(DOC_MODULE).pdf
++ @mkpdf_imgdirs=""; \
++ if test "x$(HTML_IMAGES)" != "x"; then \
++ for img in $(HTML_IMAGES); do \
++ part=`dirname $$img`; \
++ echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \
++ if test $$? != 0; then \
++ mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \
++ fi; \
++ done; \
++ fi; \
++ cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
++ @touch pdf-build.stamp
++
++##############
++
++clean-local:
++ rm -f *~ *.bak
++ rm -rf .libs
++
++distclean-local:
++ cd $(srcdir) && \
++ rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \
++ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
++
++maintainer-clean-local: clean
++ cd $(srcdir) && rm -rf xml html
++
++install-data-local:
++ @installfiles=`echo $(srcdir)/html/*`; \
++ if test "$$installfiles" = '$(srcdir)/html/*'; \
++ then echo '-- Nothing to install' ; \
++ else \
++ if test -n "$(DOC_MODULE_VERSION)"; then \
++ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
++ else \
++ installdir="$(DESTDIR)$(TARGET_DIR)"; \
++ fi; \
++ $(mkinstalldirs) $${installdir} ; \
++ for i in $$installfiles; do \
++ echo '-- Installing '$$i ; \
++ $(INSTALL_DATA) $$i $${installdir}; \
++ done; \
++ if test -n "$(DOC_MODULE_VERSION)"; then \
++ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
++ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
++ mv -f $${installdir}/$(DOC_MODULE).devhelp \
++ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \
++ fi; \
++ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
++ fi
++
++uninstall-local:
++ @if test -n "$(DOC_MODULE_VERSION)"; then \
++ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
++ else \
++ installdir="$(DESTDIR)$(TARGET_DIR)"; \
++ fi; \
++ rm -rf $${installdir}
++
++#
++# Require gtk-doc when making dist
++#
++if ENABLE_GTK_DOC
++dist-check-gtkdoc:
++else
++dist-check-gtkdoc:
++ @echo "*** gtk-doc must be installed and enabled in order to make dist"
++ @false
++endif
++
++dist-hook: dist-check-gtkdoc dist-hook-local
++ mkdir $(distdir)/tmpl
++ mkdir $(distdir)/html
++ -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
++ cp $(srcdir)/html/* $(distdir)/html
++ -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/
++ -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/
++ -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/
++ cd $(distdir) && rm -f $(DISTCLEANFILES)
++ $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
++
++.PHONY : dist-hook-local docs
+Index: geoclue/src/connectivity-connman.c
+===================================================================
+--- geoclue.orig/src/connectivity-connman.c 2011-12-29 16:40:38.930428900 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,739 +0,0 @@
+-/*
+- * Geoclue
+- * connectivity-connman.c
+- *
+- * Author: Javier Fernandez <jfernandez@igalia.com>
+- * Copyright (C) 2010 Igalia S.L
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU Library General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+- * Boston, MA 02111-1307, USA.
+- *
+- */
+-#include <config.h>
+-
+-#ifdef HAVE_CONNMAN
+-
+-#include <dbus/dbus-glib.h>
+-#include <dbus/dbus-glib-lowlevel.h>
+-#include "connectivity-connman.h"
+-
+-#define CONNMAN_SERVICE "org.moblin.connman"
+-#define CONNMAN_MANAGER_PATH "/"
+-#define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager"
+-#define CONNMAN_TECHNOLOGY_INTERFACE CONNMAN_SERVICE ".Technology"
+-#define CONNMAN_DEVICE_INTERFACE CONNMAN_SERVICE ".Device"
+-#define CONNMAN_NETWORK_INTERFACE CONNMAN_SERVICE ".Network"
+-#define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service"
+-
+-typedef void (*ConnmanFunc) (GeoclueConnman *self,
+- const gchar *path,
+- gpointer out);
+-
+-static void geoclue_connman_connectivity_init (GeoclueConnectivityInterface *iface);
+-
+-static int _strength_to_dbm (int strength);
+-static char *_get_mac_for_gateway (const char *gateway);
+-static char *_mac_strup (char *mac);
+-static gchar *_get_gateway (GeoclueConnman *self, const gchar *service);
+-static void _get_best_ap (GeoclueConnman *self, const gchar *network);
+-static void _get_aps_info (GeoclueConnman *self, const gchar *network, GHashTable **out);
+-static const GPtrArray *_get_technologies (GeoclueConnman *self, GHashTable **props);
+-static const GPtrArray *_get_services (GeoclueConnman *self, GHashTable **props);
+-static const GPtrArray *_get_devices (GeoclueConnman *self, GHashTable **props, const gchar *technology);
+-static const GPtrArray *_get_networks (GeoclueConnman *self, GHashTable **props, const gchar *device, const gchar *type_filter);
+-static void _explore_available_aps (GeoclueConnman *self, ConnmanFunc func, gpointer out);
+-
+-
+-G_DEFINE_TYPE_WITH_CODE (GeoclueConnman, geoclue_connman, G_TYPE_OBJECT,
+- G_IMPLEMENT_INTERFACE (GEOCLUE_TYPE_CONNECTIVITY,
+- geoclue_connman_connectivity_init))
+-
+-
+-/* GeoclueConnectivity iface methods */
+-static int
+-_get_status (GeoclueConnectivity *iface)
+-{
+- GeoclueConnman *connman = GEOCLUE_CONNMAN (iface);
+-
+- return connman->status;
+-}
+-
+-static char *
+-_get_ap_mac (GeoclueConnectivity *iface)
+-{
+- GeoclueConnman *connman = GEOCLUE_CONNMAN (iface);
+-
+- return g_strdup (connman->cache_ap_mac);
+-}
+-
+-static GHashTable *
+-_get_aps (GeoclueConnectivity *iface)
+-{
+- GeoclueConnman *self = GEOCLUE_CONNMAN (iface);
+- GHashTable *ht = NULL;
+-
+- /* Explore the active networks to collect the APs. */
+- _explore_available_aps (self, (ConnmanFunc) _get_aps_info, &ht);
+-
+- return ht;
+-}
+-
+-static char *
+-_get_router_mac (GeoclueConnectivity *iface)
+-{
+- GeoclueConnman *self = GEOCLUE_CONNMAN (iface);
+- GHashTable *props = NULL;
+- const GPtrArray *servs = NULL;
+- const gchar *serv = NULL;
+- gchar *gateway = NULL;
+- char *mac = NULL;
+- guint i;
+-
+- /* Get available services and iterate over them */
+- /* to get the MAC of the connected router. */
+- servs = _get_services (self, &props);
+- if (servs != NULL) {
+- for (i = 0; gateway == NULL && servs->len; i++) {
+- serv = g_ptr_array_index (servs, i);
+- gateway = _get_gateway (self, serv);
+- }
+- }
+-
+- /* Check the result. */
+- if (gateway != NULL) {
+- mac = _get_mac_for_gateway (gateway);
+- g_free (gateway);
+- }
+-
+- /* Free */
+- g_hash_table_destroy (props);
+-
+- return mac;
+-}
+-
+-/* internal private GObject methods */
+-static void
+-dispose (GObject *object)
+-{
+- GeoclueConnman *self = GEOCLUE_CONNMAN (object);
+-
+- g_object_unref (self->client);
+- self->client = NULL;
+-
+- dbus_g_connection_unref (self->conn);
+- self->conn = NULL;
+-
+- g_free (self->cache_ap_mac);
+- self->cache_ap_mac = NULL;
+-
+- ((GObjectClass *) geoclue_connman_parent_class)->dispose (object);
+-}
+-
+-static void
+-geoclue_connman_class_init (GeoclueConnmanClass *klass)
+-{
+- GObjectClass *o_class = (GObjectClass *) klass;
+-
+- o_class->dispose = dispose;
+-}
+-
+-static int
+-_strength_to_dbm (int strength)
+-{
+- /* Hackish linear strength to dBm conversion.
+- * 0% is -90 dBm
+- * 100% is -20 dBm */
+- return (strength * 0.7) - 90;
+-}
+-
+-static char *
+-_get_mac_for_gateway (const char *gateway)
+-{
+- char *cmd, *out, *mac, **split;
+-
+- cmd = g_strdup_printf ("ip neigh show %s", gateway);
+-
+- if (g_spawn_command_line_sync (cmd, &out, NULL, NULL, NULL) == FALSE) {
+- g_free (out);
+- g_free (cmd);
+- return NULL;
+- }
+- g_free (cmd);
+-
+- /* 192.168.1.1 dev eth0 lladdr 00:00:00:00:00:00 STALE */
+- split = g_strsplit (out, " ", -1);
+- g_free (out);
+-
+- if (split == NULL)
+- return NULL;
+- if (g_strv_length (split) != 6) {
+- g_strfreev (split);
+- return NULL;
+- }
+- mac = g_strdup (split[4]);
+- g_strfreev (split);
+-
+- return _mac_strup (mac);
+-}
+-
+-static char *
+-_mac_strup (char *mac)
+-{
+- guint i;
+-
+- g_assert (mac != NULL);
+-
+- for (i = 0; mac[i] != '\0' ; i++) {
+- if (g_ascii_isalpha (mac[i]))
+- mac[i] = g_ascii_toupper (mac[i]);
+- }
+- return mac;
+-}
+-
+-static GeoclueNetworkStatus
+-connmanstatus_to_geocluenetworkstatus (const gchar *status)
+-{
+- if (g_strcmp0 (status, "online")) {
+- return GEOCLUE_CONNECTIVITY_OFFLINE;
+- } else {
+- return GEOCLUE_CONNECTIVITY_ONLINE;
+- }
+-}
+-
+-static gchar *
+-_get_gateway (GeoclueConnman *self,
+- const gchar *service)
+-{
+- DBusGProxy *proxy = NULL;
+- GHashTable *props = NULL;
+- gchar *gateway = NULL;
+- const GHashTable *ht = NULL;
+- const GValue *value = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+-
+- /* Create proxy. */
+- proxy = dbus_g_proxy_new_for_name (self->conn,
+- CONNMAN_SERVICE,
+- service,
+- CONNMAN_SERVICE_INTERFACE);
+- if (proxy == NULL) {
+- g_warning ("%s was unable to create connection to Service iface.",
+- G_OBJECT_TYPE_NAME (self));
+- return NULL;
+- }
+-
+- /* Get Service properties to get the gateway address. */
+- if (dbus_g_proxy_call (proxy, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- &props,
+- G_TYPE_INVALID)) {
+-
+- /* Get the mac of the connected router. */
+- value = g_hash_table_lookup (props, "IPv4");
+- if (value != NULL) {
+- ht = g_value_get_boxed (value);
+- value = g_hash_table_lookup ((GHashTable *) ht, "Gateway");
+- if (value != NULL) {
+- gateway = g_value_dup_string (value);
+- }
+- }
+- } else {
+- msg = "Error getting Service properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- /* Free */
+- g_hash_table_destroy (props);
+- g_object_unref (proxy);
+-
+- return gateway;
+-}
+-
+-static void
+-_get_aps_info (GeoclueConnman *self,
+- const gchar *network,
+- GHashTable **out)
+-{
+- DBusGProxy *proxy = NULL;
+- GHashTable *props = NULL;
+- gchar *ap_mac = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+- int strength;
+-
+- g_assert (out != NULL);
+-
+- /* Create proxy. */
+- proxy = dbus_g_proxy_new_for_name (self->conn,
+- CONNMAN_SERVICE,
+- network,
+- CONNMAN_NETWORK_INTERFACE);
+- if (proxy == NULL) {
+- g_warning ("%s was unable to create connection to Network iface.",
+- G_OBJECT_TYPE_NAME (self));
+- return;
+- }
+-
+- /* Collect available APs into a HasTable. */
+- if (dbus_g_proxy_call (proxy, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- &props,
+- G_TYPE_INVALID)) {
+-
+- /* Store the AP information. */
+- ap_mac = g_value_dup_string (g_hash_table_lookup (props, "Address"));
+- strength = g_value_get_uchar (g_hash_table_lookup (props, "Strength"));
+- if (ap_mac != NULL) {
+- /* Create storage for the first case. */
+- if (*out == NULL) {
+- *out = g_hash_table_new_full (g_str_hash, g_str_equal,
+- (GDestroyNotify) g_free, NULL);
+- }
+- g_hash_table_insert (*out, ap_mac,
+- GINT_TO_POINTER (_strength_to_dbm (strength)));
+- }
+- } else {
+- msg = "Error getting Network properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- /* Free */
+- g_hash_table_destroy (props);
+- g_object_unref (proxy);
+-}
+-
+-static void
+-_get_best_ap (GeoclueConnman *self,
+- const gchar *network)
+-{
+- DBusGProxy *proxy = NULL;
+- GHashTable *props = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+- int strength;
+-
+- /* Create proxy. */
+- proxy = dbus_g_proxy_new_for_name (self->conn,
+- CONNMAN_SERVICE,
+- network,
+- CONNMAN_NETWORK_INTERFACE);
+-
+- if (proxy == NULL) {
+- g_warning ("%s was unable to create connection to Network iface.",
+- G_OBJECT_TYPE_NAME (self));
+- return;
+- }
+-
+- /* Evaluate Network properties and update best AP. */
+- if (dbus_g_proxy_call (proxy, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- &props,
+- G_TYPE_INVALID)) {
+-
+- strength = g_value_get_uchar (g_hash_table_lookup (props, "Strength"));
+- if (strength > self->ap_strength) {
+- g_free (self->cache_ap_mac);
+- self->cache_ap_mac = g_value_dup_string (g_hash_table_lookup (props, "Address"));
+- self->ap_strength = strength;
+- }
+- } else {
+- msg = "Error getting Network properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- /* Free */
+- g_hash_table_destroy (props);
+- g_object_unref (proxy);
+-}
+-
+-static const GPtrArray *
+-_get_networks (GeoclueConnman *self,
+- GHashTable **props,
+- const gchar *device,
+- const gchar *type_filter)
+-{
+- DBusGProxy *proxy = NULL;
+- const GPtrArray *nets = NULL;
+- const GValue *value = NULL;
+- const gchar *type = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+-
+- /* Create proxy. */
+- proxy = dbus_g_proxy_new_for_name (self->conn,
+- CONNMAN_SERVICE,
+- device,
+- CONNMAN_DEVICE_INTERFACE);
+-
+- if (proxy == NULL) {
+- g_warning ("%s was unable to create connection to Device iface.",
+- G_OBJECT_TYPE_NAME (self));
+- return NULL;
+- }
+-
+- /* Get available Networks for a specific Device. */
+- if (dbus_g_proxy_call (proxy, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- props,
+- G_TYPE_INVALID)) {
+-
+- /* Check only specific networks. */
+- if (type_filter != NULL) {
+- type = g_value_get_string (g_hash_table_lookup (*props, "Type"));
+- if (g_strcmp0 (type, type_filter)) {
+- goto frees;
+- }
+- }
+- value = g_hash_table_lookup (*props, "Networks");
+- nets = g_value_get_boxed (value);
+- } else {
+- msg = "Error getting Device properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- /* Free */
+- frees:
+- g_object_unref (proxy);
+-
+- return nets;
+-}
+-
+-static const GPtrArray *
+-_get_devices (GeoclueConnman *self,
+- GHashTable **props,
+- const gchar *technology)
+-{
+- DBusGProxy *proxy = NULL;
+- const GPtrArray *devs = NULL;
+- const GValue *value = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+-
+- /* Create proxy. */
+- proxy = dbus_g_proxy_new_for_name (self->conn,
+- CONNMAN_SERVICE,
+- technology,
+- CONNMAN_TECHNOLOGY_INTERFACE);
+-
+- if (proxy == NULL) {
+- g_warning ("%s was unable to create connection to Technology iface.",
+- G_OBJECT_TYPE_NAME (self));
+- return NULL;
+- }
+-
+- /* Get available Devices for a specific Technology. */
+- if (dbus_g_proxy_call (proxy, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- props,
+- G_TYPE_INVALID)) {
+-
+- value = g_hash_table_lookup (*props, "Devices");
+- devs = g_value_get_boxed (value);
+- } else {
+- msg = "Error getting Technologies properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- /* Free */
+- g_object_unref (proxy);
+-
+- return devs;
+-}
+-
+-static const GPtrArray *
+-_get_technologies (GeoclueConnman *self,
+- GHashTable **props)
+-{
+- const GPtrArray *techs = NULL;
+- const GValue *value = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+-
+- /* Get available technologies (Wifi, Eth, ...). */
+- if (dbus_g_proxy_call (self->client, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- props,
+- G_TYPE_INVALID)) {
+-
+- value = g_hash_table_lookup (*props, "Technologies");
+- techs = g_value_get_boxed (value);
+- } else {
+- msg = "Error getting Manager properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- return techs;
+-}
+-
+-static const GPtrArray *
+-_get_services (GeoclueConnman *self,
+- GHashTable **props)
+-{
+- const GPtrArray *servs = NULL;
+- const GValue *value = NULL;
+- const gchar *msg = NULL;
+- GError *error = NULL;
+-
+- /* Get available services. */
+- if (dbus_g_proxy_call (self->client, "GetProperties",
+- &error,
+- G_TYPE_INVALID,
+- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
+- props,
+- G_TYPE_INVALID)) {
+-
+- value = g_hash_table_lookup (*props, "Services");
+- servs = g_value_get_boxed (value);
+- } else {
+- msg = "Error getting Manager properties: %s";
+- if (error != NULL) {
+- g_warning (msg, error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, "Unknown error");
+- }
+- }
+-
+- return servs;
+-}
+-
+-static void
+-_explore_available_aps (GeoclueConnman *self,
+- ConnmanFunc func,
+- gpointer out)
+-{
+- GHashTable *mgr_props = NULL;
+- GHashTable *tech_props = NULL;
+- GHashTable *dev_props = NULL;
+- const GPtrArray *techs = NULL;
+- const GPtrArray *devs = NULL;
+- const GPtrArray *nets = NULL;
+- const gchar *tech = NULL;
+- const gchar *dev = NULL;
+- const gchar *net = NULL;
+- guint i, j, k;
+-
+- techs = _get_technologies (self, &mgr_props);
+- if (techs == NULL) {
+- goto frees;
+- }
+- for (i = 0; i < techs->len; i++) {
+- tech = g_ptr_array_index (techs, i);
+- devs = _get_devices (self, &tech_props, tech);
+- if (devs == NULL) {
+- continue;
+- }
+- for (j = 0; j < devs->len; j++) {
+- dev = g_ptr_array_index (devs, j);
+- nets = _get_networks (self, &dev_props, dev, "wifi");
+- if (nets == NULL) {
+- continue;
+- }
+- for (k = 0; k < nets->len; k++) {
+- net = g_ptr_array_index (nets, k);
+-
+- /* Perform specific actions. */
+- func (self, net, out);
+- }
+- }
+- }
+-
+- /* Free */
+- frees:
+- if (mgr_props != NULL) {
+- g_hash_table_destroy (mgr_props);
+- }
+- if (tech_props != NULL) {
+- g_hash_table_destroy (tech_props);
+- }
+- if (dev_props != NULL) {
+- g_hash_table_destroy (dev_props);
+- }
+-}
+-
+-static void
+-_cache_ap_mac (GeoclueConnman *self)
+-{
+- /* Cleanup the cache. */
+- g_free (self->cache_ap_mac);
+- self->cache_ap_mac = NULL;
+- self->ap_strength = 0;
+-
+- /* Explore the active networks to get the best AP. */
+- _explore_available_aps (self, (ConnmanFunc) _get_best_ap, NULL);
+-}
+-
+-
+-
+-static void
+-_geoclue_connman_state_changed (DBusGProxy *proxy,
+- const gchar *status,
+- gpointer userdata)
+-{
+- GeoclueConnman *self = GEOCLUE_CONNMAN (userdata);
+- GeoclueNetworkStatus gc_status;
+-
+- gc_status = connmanstatus_to_geocluenetworkstatus (status);
+-
+- if (gc_status != self->status) {
+- /* Update status. */
+- self->status = gc_status;
+-
+- /* Update AP cache. */
+- _cache_ap_mac (self);
+-
+- /* Notification. */
+- geoclue_connectivity_emit_status_changed (GEOCLUE_CONNECTIVITY (self),
+- self->status);
+- }
+-}
+-
+-
+-static void
+-_method_call_notify_cb (DBusGProxy *proxy,
+- DBusGProxyCall *call,
+- gpointer user_data)
+-{
+- GeoclueConnman *self = GEOCLUE_CONNMAN (user_data);
+- const gchar *msg = NULL;
+- GError *error = NULL;
+- gchar *state = NULL;
+-
+- /* Collect output data. */
+- if (dbus_g_proxy_end_call (proxy,
+- call,
+- &error,
+- G_TYPE_STRING,
+- &state,
+- G_TYPE_INVALID)) {
+-
+- /* Set current status. */
+- _geoclue_connman_state_changed (proxy,
+- (const gchar *) state,
+- self);
+- } else {
+- msg = "%s was unable to get the current network status: %s.";
+- if (error != NULL) {
+- g_warning (msg, G_OBJECT_TYPE_NAME (self),
+- error->message);
+- g_error_free (error);
+- } else {
+- g_warning (msg, G_OBJECT_TYPE_NAME (self),
+- "Unknown error");
+- }
+- }
+-
+- /* Free */
+- g_free (state);
+-}
+-
+-static void
+-geoclue_connman_init (GeoclueConnman *self)
+-{
+- GError *error = NULL;
+-
+- /* Get DBus connection to the System bus. */
+- self->conn = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+- if (self->conn == NULL) {
+- g_warning ("%s was unable to create a connection to D-Bus: %s",
+- G_OBJECT_TYPE_NAME (self), error->message);
+- g_error_free (error);
+- return;
+- }
+-
+- /* Create proxy. */
+- self->client = dbus_g_proxy_new_for_name (self->conn,
+- CONNMAN_SERVICE,
+- CONNMAN_MANAGER_PATH,
+- CONNMAN_MANAGER_INTERFACE);
+-
+- if (self->client == NULL) {
+- g_warning ("%s was unable to create connection to Connman Manager.",
+- G_OBJECT_TYPE_NAME (self));
+- return;
+- }
+-
+- /* Get current state (async). */
+- dbus_g_proxy_begin_call (self->client, "GetState",
+- _method_call_notify_cb,
+- self,
+- NULL,
+- G_TYPE_INVALID,
+- G_TYPE_STRING);
+-
+- /* Be aware of State changes. */
+- dbus_g_proxy_add_signal (self->client, "StateChanged",
+- G_TYPE_STRING, G_TYPE_INVALID);
+- dbus_g_proxy_connect_signal (self->client,
+- "StateChanged",
+- G_CALLBACK (_geoclue_connman_state_changed),
+- self,
+- NULL);
+-}
+-
+-
+-static void
+-geoclue_connman_connectivity_init (GeoclueConnectivityInterface *iface)
+-{
+- iface->get_status = _get_status;
+- iface->get_ap_mac = _get_ap_mac;
+- iface->get_router_mac = _get_router_mac;
+- iface->get_aps = _get_aps;
+-}
+-
+-#endif /* HAVE_CONNMAN*/
+Index: geoclue/src/connectivity-connman.h
+===================================================================
+--- geoclue.orig/src/connectivity-connman.h 2011-12-29 16:40:38.930428900 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,56 +0,0 @@
+-/*
+- * Geoclue
+- * connectivity-connman.h
+- *
+- * Author: Javier Fernandez <jfernandez@igalia.com>
+- * Copyright (C) 2010 Igalia S.L
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU Library General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+- * Boston, MA 02111-1307, USA.
+- *
+- */
+-
+-#ifndef _CONNECTIVITY_CONNMAN_H
+-#define _CONNECTIVITY_CONNMAN_H
+-
+-#include <glib-object.h>
+-#include <dbus/dbus-glib.h>
+-#include "connectivity.h"
+-
+-G_BEGIN_DECLS
+-
+-#define GEOCLUE_TYPE_CONNMAN (geoclue_connman_get_type ())
+-#define GEOCLUE_CONNMAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEOCLUE_TYPE_CONNMAN, GeoclueConnman))
+-
+-typedef struct {
+- GObject parent;
+-
+- /* private */
+- GeoclueNetworkStatus status;
+- DBusGConnection *conn;
+- DBusGProxy *client;
+- gchar *cache_ap_mac;
+- int ap_strength;
+-} GeoclueConnman;
+-
+-typedef struct {
+- GObjectClass parent_class;
+-} GeoclueConnmanClass;
+-
+-GType geoclue_connman_get_type (void);
+-
+-G_END_DECLS
+-
+-#endif
+Index: geoclue/src/geoclue
+===================================================================
+--- geoclue.orig/src/geoclue 2011-12-29 16:40:38.930428900 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,3 +0,0 @@
+-[org.freedesktop.Geoclue]
+-gps-baudrate = /apps/geoclue/master/org.freedesktop.Geoclue.GPSBaudRate
+-gps-device = /apps/geoclue/master/org.freedesktop.Geoclue.GPSDevice
+Index: geoclue/src/org.freedesktop.Geoclue.gschema.xml
+===================================================================
+--- geoclue.orig/src/org.freedesktop.Geoclue.gschema.xml 2011-12-29 16:40:38.930428900 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,15 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<schemalist>
+- <schema path="/apps/geoclue/" id="org.freedesktop.Geoclue">
+- <key type="u" name="gps-baudrate">
+- <default>0</default>
+- <summary>The baud rate for the attached GPS device</summary>
+- <description>The baud rate for the attached GPS device.</description>
+- </key>
+- <key type="s" name="gps-device">
+- <default>''</default>
+- <summary>The device node or Bluetooth address for the attached GPS device</summary>
+- <description>The device node or Bluetooth address for the attached GPS device.</description>
+- </key>
+- </schema>
+-</schemalist>
+Index: geoclue/src/test-connectivity.c
+===================================================================
+--- geoclue.orig/src/test-connectivity.c 2011-12-29 16:40:38.930428900 +0900
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,97 +0,0 @@
+-
+-#include <connectivity.h>
+-
+-static void
+-print_ap (gpointer key,
+- gpointer value,
+- gpointer data)
+-{
+- g_message ("\t%s : %d dBm",
+- key,
+- GPOINTER_TO_INT (value));
+-}
+-
+-static void
+-print_aps (GeoclueConnectivity *conn)
+-{
+- GHashTable *ht;
+-
+- ht = geoclue_connectivity_get_aps (conn);
+- if (ht == NULL) {
+- g_message ("No Access Points available");
+- return;
+- }
+- g_message ("APs:");
+- g_hash_table_foreach (ht, print_ap, NULL);
+-}
+-
+-static void
+-print_if_avail (GeoclueConnectivity *self,
+- GeoclueNetworkStatus status)
+-{
+- char *router, *ap;
+- if (status != GEOCLUE_CONNECTIVITY_ONLINE)
+- return;
+- print_aps (self);
+- ap = geoclue_connectivity_get_ap_mac (self);
+- g_message ("AP is '%s'", ap ? ap : "Unavailable");
+- g_free (ap);
+-
+- router = geoclue_connectivity_get_router_mac (self);
+- g_message ("Router is '%s'", router);
+- g_free (router);
+-}
+-
+-static void
+-status_changed_cb (GeoclueConnectivity *self,
+- GeoclueNetworkStatus status,
+- gpointer data)
+-{
+- const char *str;
+-
+- switch (status) {
+- case GEOCLUE_CONNECTIVITY_UNKNOWN:
+- str = "GEOCLUE_CONNECTIVITY_UNKNOWN";
+- break;
+- case GEOCLUE_CONNECTIVITY_OFFLINE:
+- str = "GEOCLUE_CONNECTIVITY_OFFLINE";
+- break;
+- case GEOCLUE_CONNECTIVITY_ACQUIRING:
+- str = "GEOCLUE_CONNECTIVITY_ACQUIRING";
+- break;
+- case GEOCLUE_CONNECTIVITY_ONLINE:
+- str = "GEOCLUE_CONNECTIVITY_ONLINE";
+- break;
+- default:
+- g_assert_not_reached ();
+- }
+-
+- g_message ("Connectivity status switch to '%s'", str);
+-
+- print_if_avail (self, status);
+-}
+-
+-int main (int argc, char **argv)
+-{
+- GMainLoop *mainloop;
+- GeoclueConnectivity *conn;
+- char *router;
+-
+- g_type_init ();
+- mainloop = g_main_loop_new (NULL, FALSE);
+- conn = geoclue_connectivity_new ();
+-
+- if (conn == NULL) {
+- router = geoclue_connectivity_get_router_mac (conn);
+- g_message ("Router MAC is detected as '%s'", router ? router : "empty");
+-
+- return 1;
+- }
+- print_if_avail (conn, geoclue_connectivity_get_status (conn));
+- g_signal_connect (conn, "status-changed",
+- G_CALLBACK (status_changed_cb), NULL);
+-
+- g_main_loop_run (mainloop);
+-
+- return 0;
+-}
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..5ed1f32
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,138 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+DESTDIR ?=$(CURDIR)/debian/tmp
+
+CFLAGS ?= -Wall -g -fPIC
+LDFLAGS ?=
+PREFIX ?= /usr
+DATADIR ?= /opt
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+ifneq (,$(findstring arm,$(DEB_BUILD_GNU_TYPE)))
+ DEB_BUILD_GNU_TYPE = arm
+else
+ DEB_BUILD_GNU_TYPE =
+endif
+
+LDFLAGS += -Wl,-z,defs -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed -Wl,--hash-style=both
+
+%:
+ dh $@ --with quilt
+
+configure-stamp:
+ dh_testdir
+ ./autogen.sh
+ # Add here commands to configure the package.
+ CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./configure --prefix=$(PREFIX) --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --enable-system-bus=yes --disable-gypsy --disable-lbs --disable-xps
+
+ touch $@
+
+build: build-stamp
+
+build-stamp: configure-stamp
+ dh_testdir
+
+ # Add here commands to compile the package.
+ $(MAKE)
+ #docbook-to-man debian/geoclue.sgml > geoclue.1
+
+ for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
+ cat $$f > $${f%.in}; \
+ sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \
+ sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \
+ done
+
+ touch $@
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+
+ # Add here commands to clean up after the build process.
+ -$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+ cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+ cp -f /usr/share/misc/config.guess config.guess
+endif
+
+ for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
+ rm -f $${f%.in}; \
+ done
+
+ find $(CURDIR) -name "Makefile.in" -exec rm -f {} \;
+
+ rm -rf configure config.h.in aclocal.m4
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/geoclue.
+ #$(MAKE) DESTDIR=$(CURDIR)/debian/geoclue install
+ $(MAKE) DESTDIR=$(DESTDIR) install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs ChangeLog
+ dh_installdocs
+ dh_installexamples
+ dh_install
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installemacsen
+# dh_installpam
+# dh_installmime
+# dh_python
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+ dh_installman
+ dh_link
+ dh_strip --dbg-package=libgeoclue-dbg
+ dh_compress
+ dh_fixperms
+# dh_perl
+ dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install