diff options
author | Pierre-Luc Beaudoin <pierre-luc@pierlux.com> | 2008-12-11 01:04:30 +0800 |
---|---|---|
committer | Pierre-Luc Beaudoin <pierre-luc.beaudoin@collabora.co.uk> | 2009-06-01 23:35:28 +0800 |
commit | 3db6c6d6152fbb5c3741e748ec0de66a40440784 (patch) | |
tree | 67254386a2397dba0aba715db5215434abe9a285 /libempathy-gtk | |
parent | 2c0aa5b450b8b3743c00e9bdcc34851358976e40 (diff) | |
download | gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.tar gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.tar.gz gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.tar.bz2 gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.tar.lz gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.tar.xz gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.tar.zst gsoc2013-empathy-3db6c6d6152fbb5c3741e748ec0de66a40440784.zip |
Publish location after connection and when location changes
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-location-manager.c | 94 |
1 files changed, 82 insertions, 12 deletions
diff --git a/libempathy-gtk/empathy-location-manager.c b/libempathy-gtk/empathy-location-manager.c index 91f3f0086..7ad275dba 100644 --- a/libempathy-gtk/empathy-location-manager.c +++ b/libempathy-gtk/empathy-location-manager.c @@ -31,11 +31,14 @@ #include <geoclue/geoclue-master.h> #endif +#include <extensions/extensions.h> + #include "empathy-location-manager.h" #include "empathy-conf.h" #include "libempathy/empathy-enum-types.h" #include "libempathy/empathy-location.h" +#include "libempathy/empathy-contact-factory.h" #include "libempathy/empathy-utils.h" #define DEBUG_FLAG EMPATHY_DEBUG_LOCATION @@ -44,7 +47,9 @@ #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLocationManager) typedef struct { gboolean is_setup; - EmpathyContact *contact; + MissionControl *mc; + GHashTable *location; + gpointer token; #if HAVE_GEOCLUE GeoclueResourceFlags resources; GeoclueMasterClient *gc_client; @@ -94,6 +99,60 @@ empathy_location_manager_class_init (EmpathyLocationManagerClass *class) g_type_class_add_private (object_class, sizeof (EmpathyLocationManagerPriv)); } +static void +publish_location (EmpathyLocationManager *location_manager, McAccount *account) +{ + EmpathyLocationManagerPriv *priv; + guint connection_status = -1; + gboolean can_publish; + EmpathyConf *conf = empathy_conf_get (); + EmpathyContactFactory *factory = empathy_contact_factory_new (); + priv = GET_PRIV (location_manager); + + if (!empathy_conf_get_bool (conf, EMPATHY_PREFS_LOCATION_PUBLISH, &can_publish)) + return; + + if (!can_publish) + return; + + connection_status = mission_control_get_connection_status (priv->mc, + account, NULL); + + if (connection_status != TP_CONNECTION_STATUS_CONNECTED) + return; + + DEBUG ("Publishing location to account %s", mc_account_get_display_name (account)); + + empathy_contact_factory_set_location (factory, account, priv->location); +} + +static void +publish_location_to_all_accounts (EmpathyLocationManager *location_manager) +{ + GList *accounts = NULL, *l; + + accounts = mc_accounts_list_by_enabled (TRUE); + for (l = accounts; l; l = l->next) + { + publish_location (location_manager, l->data); + } + + mc_accounts_list_free (accounts); +} + +static void +account_status_changed_cb (MissionControl *mc, + TpConnectionStatus status, + McPresence presence, + TpConnectionStatusReason reason, + const gchar *unique_name, + gpointer *location_manager) +{ + DEBUG ("Account %s changed status to %d", unique_name, status); + McAccount *account = mc_account_lookup (unique_name); + if (account && status == TP_CONNECTION_STATUS_CONNECTED) + publish_location (EMPATHY_LOCATION_MANAGER (location_manager), account); +} static void empathy_location_manager_init (EmpathyLocationManager *location_manager) @@ -104,7 +163,11 @@ empathy_location_manager_init (EmpathyLocationManager *location_manager) location_manager->priv = priv; priv->is_setup = FALSE; + priv->mc = empathy_mission_control_new (); + priv->location = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, + (GDestroyNotify) tp_g_value_slice_free); + // Setup settings status callbacks conf = empathy_conf_get (); empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_PUBLISH, publish_cb, location_manager); @@ -120,6 +183,9 @@ empathy_location_manager_init (EmpathyLocationManager *location_manager) resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_CELL, location_manager); resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS, location_manager); + // Setup account status callbacks + priv->token = empathy_connect_to_account_status_changed (priv->mc, + G_CALLBACK (account_status_changed_cb), location_manager, NULL); } @@ -198,16 +264,17 @@ position_changed_cb (GeocluePosition *position, GeoclueAccuracyLevel level; geoclue_accuracy_get_details (accuracy, &level, NULL, NULL); - g_print ("New position (accuracy level %d):\n", level); + DEBUG ("New position (accuracy level %d)", level); + if (level == GEOCLUE_ACCURACY_LEVEL_NONE) + return; 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); + DEBUG ("\t%f, %f", latitude, longitude); + publish_location_to_all_accounts (EMPATHY_LOCATION_MANAGER (user_data)); } else { - g_print ("\nlatitude and longitude not valid.\n"); + DEBUG ("- latitude and longitude not valid."); } } @@ -221,9 +288,9 @@ address_changed_cb (GeoclueAddress *address, { 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"); + DEBUG ("New address (accuracy level %d):\n", level); + // XXX todo + publish_location_to_all_accounts (EMPATHY_LOCATION_MANAGER (user_data)); } @@ -234,6 +301,9 @@ update_resources (EmpathyLocationManager *location_manager) priv = GET_PRIV (location_manager); + if (!priv->is_setup) + return; + DEBUG ("Updating resources"); if (!geoclue_master_client_set_requirements (priv->gc_client, @@ -294,14 +364,14 @@ publish_cb (EmpathyConf *conf, { EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data); EmpathyLocationManagerPriv *priv; - gboolean publish_location; + gboolean can_publish; DEBUG ("Publish Conf changed"); priv = GET_PRIV (manager); - if (!empathy_conf_get_bool (conf, key, &publish_location)) + if (!empathy_conf_get_bool (conf, key, &can_publish)) return; - if (publish_location && !priv->is_setup) + if (can_publish && !priv->is_setup) setup_geoclue (manager); } |