aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-location-manager.c
diff options
context:
space:
mode:
authorPierre-Luc Beaudoin <pierre-luc@pierlux.com>2008-11-29 12:01:20 +0800
committerPierre-Luc Beaudoin <pierre-luc.beaudoin@collabora.co.uk>2009-06-01 23:35:28 +0800
commit2c0aa5b450b8b3743c00e9bdcc34851358976e40 (patch)
treec77c2901f9d630940f04b52bd05c0458e8400182 /libempathy-gtk/empathy-location-manager.c
parentc6d064ad5952f233d583ccd420c502b581d57a8c (diff)
downloadgsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.tar
gsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.tar.gz
gsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.tar.bz2
gsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.tar.lz
gsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.tar.xz
gsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.tar.zst
gsoc2013-empathy-2c0aa5b450b8b3743c00e9bdcc34851358976e40.zip
Add EmpathyLocationManager
Diffstat (limited to 'libempathy-gtk/empathy-location-manager.c')
-rw-r--r--libempathy-gtk/empathy-location-manager.c339
1 files changed, 339 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-location-manager.c b/libempathy-gtk/empathy-location-manager.c
new file mode 100644
index 000000000..91f3f0086
--- /dev/null
+++ b/libempathy-gtk/empathy-location-manager.c
@@ -0,0 +1,339 @@
+/*
+ * Copyright (C) 2008 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc@pierlux.com>
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <glib/gi18n.h>
+
+#include <telepathy-glib/util.h>
+
+#if HAVE_GEOCLUE
+#include <geoclue/geoclue-master.h>
+#endif
+
+#include "empathy-location-manager.h"
+#include "empathy-conf.h"
+
+#include "libempathy/empathy-enum-types.h"
+#include "libempathy/empathy-location.h"
+#include "libempathy/empathy-utils.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_LOCATION
+#include "libempathy/empathy-debug.h"
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLocationManager)
+typedef struct {
+ gboolean is_setup;
+ EmpathyContact *contact;
+#if HAVE_GEOCLUE
+ GeoclueResourceFlags resources;
+ GeoclueMasterClient *gc_client;
+ GeocluePosition *gc_position;
+ GeoclueAddress *gc_address;
+#endif
+} EmpathyLocationManagerPriv;
+
+static void location_manager_finalize (GObject *object);
+static void location_manager_get_property (GObject *object, guint param_id,
+ GValue *value, GParamSpec *pspec);
+static void location_manager_set_property (GObject *object, guint param_id,
+ const GValue *value, GParamSpec *pspec);
+#if HAVE_GEOCLUE
+static void position_changed_cb (GeocluePosition *position,
+ GeocluePositionFields fields, int timestamp, double latitude,
+ double longitude, double altitude, GeoclueAccuracy *accuracy,
+ gpointer user_data);
+static void address_changed_cb (GeoclueAddress *address, int timestamp,
+ GHashTable *details, GeoclueAccuracy *accuracy, gpointer user_data);
+static void setup_geoclue (EmpathyLocationManager *location_manager);
+static void publish_cb (EmpathyConf *conf, const gchar *key,
+ gpointer user_data);
+static void update_resources (EmpathyLocationManager *location_manager);
+static void resource_cb (EmpathyConf *conf, const gchar *key,
+ gpointer user_data);
+#endif
+
+G_DEFINE_TYPE (EmpathyLocationManager, empathy_location_manager, G_TYPE_OBJECT);
+
+enum
+{
+ PROP_0,
+};
+
+static void
+empathy_location_manager_class_init (EmpathyLocationManagerClass *class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (class);
+
+ object_class->finalize = location_manager_finalize;
+ object_class->get_property = location_manager_get_property;
+ object_class->set_property = location_manager_set_property;
+
+ g_type_class_add_private (object_class, sizeof (EmpathyLocationManagerPriv));
+}
+
+
+static void
+empathy_location_manager_init (EmpathyLocationManager *location_manager)
+{
+ EmpathyConf *conf;
+ EmpathyLocationManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (location_manager,
+ EMPATHY_TYPE_LOCATION_MANAGER, EmpathyLocationManagerPriv);
+
+ location_manager->priv = priv;
+ priv->is_setup = FALSE;
+
+ conf = empathy_conf_get ();
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_PUBLISH, publish_cb,
+ location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK,
+ resource_cb, location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_CELL,
+ resource_cb, location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS,
+ resource_cb, location_manager);
+
+ publish_cb (conf, EMPATHY_PREFS_LOCATION_PUBLISH, location_manager);
+ resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK, location_manager);
+ resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_CELL, location_manager);
+ resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS, location_manager);
+
+}
+
+
+static void
+location_manager_finalize (GObject *object)
+{
+ EmpathyLocationManagerPriv *priv;
+
+ priv = GET_PRIV (object);
+
+ DEBUG ("finalize: %p", object);
+
+ G_OBJECT_CLASS (empathy_location_manager_parent_class)->finalize (object);
+}
+
+
+static void
+location_manager_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyLocationManagerPriv *priv;
+
+ priv = GET_PRIV (object);
+
+ switch (param_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+
+static void
+location_manager_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyLocationManagerPriv *priv;
+
+ priv = GET_PRIV (object);
+
+ switch (param_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+
+EmpathyLocationManager *
+empathy_location_manager_get_default (void)
+{
+ static EmpathyLocationManager *singleton = NULL;
+ if (singleton == NULL)
+ singleton = g_object_new (EMPATHY_TYPE_LOCATION_MANAGER, NULL);
+ return singleton;
+}
+
+
+#if HAVE_GEOCLUE
+static void
+position_changed_cb (GeocluePosition *position,
+ GeocluePositionFields fields,
+ int timestamp,
+ double latitude,
+ double longitude,
+ double altitude,
+ GeoclueAccuracy *accuracy,
+ gpointer user_data)
+{
+ GeoclueAccuracyLevel level;
+
+ geoclue_accuracy_get_details (accuracy, &level, NULL, NULL);
+ g_print ("New position (accuracy level %d):\n", level);
+
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
+ fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+ g_print ("\t%f, %f\n\n", latitude, longitude);
+ //empathy_location_set_latitude (location, latitude);
+ //empathy_location_set_longitude (location, longitude);
+
+ } else {
+ g_print ("\nlatitude and longitude not valid.\n");
+ }
+}
+
+
+static void
+address_changed_cb (GeoclueAddress *address,
+ int timestamp,
+ GHashTable *details,
+ GeoclueAccuracy *accuracy,
+ gpointer user_data)
+{
+ GeoclueAccuracyLevel level;
+ geoclue_accuracy_get_details (accuracy, &level, NULL, NULL);
+ g_print ("New address (accuracy level %d):\n", level);
+ //g_hash_table_foreach (details, (GHFunc)set_location_from_address, location);
+ g_print ("\n");
+}
+
+
+static void
+update_resources (EmpathyLocationManager *location_manager)
+{
+ EmpathyLocationManagerPriv *priv;
+
+ priv = GET_PRIV (location_manager);
+
+ DEBUG ("Updating resources");
+
+ if (!geoclue_master_client_set_requirements (priv->gc_client,
+ GEOCLUE_ACCURACY_LEVEL_COUNTRY, 0, TRUE, priv->resources,
+ NULL))
+ g_printerr ("set_requirements failed");
+}
+
+
+static void
+setup_geoclue (EmpathyLocationManager *location_manager)
+{
+ EmpathyLocationManagerPriv *priv;
+
+ priv = GET_PRIV (location_manager);
+
+ GeoclueMaster *master;
+ GError *error = NULL;
+
+ DEBUG ("Setting up Geoclue");
+ master = geoclue_master_get_default ();
+ priv->gc_client = geoclue_master_create_client (master, NULL, NULL);
+ g_object_unref (master);
+
+ update_resources (location_manager);
+
+ /* Get updated when the position is changes */
+ priv->gc_position = geoclue_master_client_create_position (
+ priv->gc_client, &error);
+ if (priv->gc_position == NULL)
+ {
+ g_printerr ("Failed to create GeocluePosition: %s", error->message);
+ return;
+ }
+
+ g_signal_connect (G_OBJECT (priv->gc_position), "position-changed",
+ G_CALLBACK (position_changed_cb), location_manager);
+
+ /* Get updated when the address changes */
+ priv->gc_address = geoclue_master_client_create_address (
+ priv->gc_client, &error);
+ if (priv->gc_address == NULL)
+ {
+ g_printerr ("Failed to create GeoclueAddress: %s", error->message);
+ return;
+ }
+
+ g_signal_connect (G_OBJECT (priv->gc_address), "address-changed",
+ G_CALLBACK (address_changed_cb), location_manager);
+
+ priv->is_setup = TRUE;
+}
+
+static void
+publish_cb (EmpathyConf *conf,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv;
+ gboolean publish_location;
+
+ DEBUG ("Publish Conf changed");
+ priv = GET_PRIV (manager);
+ if (!empathy_conf_get_bool (conf, key, &publish_location))
+ return;
+
+ if (publish_location && !priv->is_setup)
+ setup_geoclue (manager);
+}
+
+
+static void
+resource_cb (EmpathyConf *conf,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv;
+ GeoclueResourceFlags resource = 0;
+ gboolean resource_enabled;
+
+ priv = GET_PRIV (manager);
+ DEBUG ("A Resource Conf changed");
+
+ if (empathy_conf_get_bool (conf, key, &resource_enabled))
+ {
+ if (strcmp (key, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK))
+ resource = GEOCLUE_RESOURCE_NETWORK;
+ if (strcmp (key, EMPATHY_PREFS_LOCATION_RESOURCE_CELL))
+ resource = GEOCLUE_RESOURCE_CELL;
+ if (strcmp (key, EMPATHY_PREFS_LOCATION_RESOURCE_GPS))
+ resource = GEOCLUE_RESOURCE_GPS;
+ }
+ if (resource_enabled)
+ priv->resources |= resource;
+ else
+ priv->resources &= resource;
+
+ update_resources (manager);
+}
+
+#endif