aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy')
-rw-r--r--libempathy/empathy-contact.c156
-rw-r--r--libempathy/empathy-tp-contact-factory.c154
2 files changed, 156 insertions, 154 deletions
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index df7d04eca..e5c406a6a 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -31,10 +31,15 @@
#include <telepathy-logger/contact.h>
#endif /* ENABLE_TPL */
+#if HAVE_GEOCLUE
+#include <geoclue/geoclue-geocode.h>
+#endif
+
#include "empathy-contact.h"
#include "empathy-utils.h"
#include "empathy-enum-types.h"
#include "empathy-marshal.h"
+#include "empathy-location.h"
#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
#include "empathy-debug.h"
@@ -65,6 +70,8 @@ static void contact_get_property (GObject *object, guint param_id,
static void contact_set_property (GObject *object, guint param_id,
const GValue *value, GParamSpec *pspec);
+static void update_geocode (EmpathyContact *contact);
+
G_DEFINE_TYPE (EmpathyContact, empathy_contact, G_TYPE_OBJECT);
enum
@@ -1136,6 +1143,7 @@ empathy_contact_set_location (EmpathyContact *contact,
g_hash_table_unref (priv->location);
priv->location = g_hash_table_ref (location);
+ update_geocode (contact);
g_object_notify (G_OBJECT (contact), "location");
}
@@ -1175,3 +1183,151 @@ empathy_contact_equal (gconstpointer contact1,
}
return FALSE;
}
+
+#if HAVE_GEOCLUE
+#define GEOCODE_SERVICE "org.freedesktop.Geoclue.Providers.Yahoo"
+#define GEOCODE_PATH "/org/freedesktop/Geoclue/Providers/Yahoo"
+
+/* This callback is called by geoclue when it found a position
+ * for the given address. A position is necessary for a contact
+ * to show up on the map
+ */
+static void
+geocode_cb (GeoclueGeocode *geocode,
+ GeocluePositionFields fields,
+ double latitude,
+ double longitude,
+ double altitude,
+ GeoclueAccuracy *accuracy,
+ GError *error,
+ gpointer contact)
+{
+ GValue *new_value;
+ GHashTable *location;
+
+ location = empathy_contact_get_location (EMPATHY_CONTACT (contact));
+
+ if (error != NULL) {
+ DEBUG ("Error geocoding location : %s", error->message);
+ g_object_unref (geocode);
+ g_object_unref (contact);
+ return;
+ }
+
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) {
+ new_value = tp_g_value_slice_new_double (latitude);
+ g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LAT),
+ new_value);
+ DEBUG ("\t - Latitude: %f", latitude);
+ }
+ if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+ new_value = tp_g_value_slice_new_double (longitude);
+ g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LON),
+ new_value);
+ DEBUG ("\t - Longitude: %f", longitude);
+ }
+ if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE) {
+ new_value = tp_g_value_slice_new_double (altitude);
+ g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_ALT),
+ new_value);
+ DEBUG ("\t - Altitude: %f", altitude);
+ }
+
+ /* Don't change the accuracy as we used an address to get this position */
+ g_object_notify (contact, "location");
+ g_object_unref (geocode);
+ g_object_unref (contact);
+}
+#endif
+
+#if HAVE_GEOCLUE
+static gchar *
+get_dup_string (GHashTable *location,
+ gchar *key)
+{
+ GValue *value;
+
+ value = g_hash_table_lookup (location, key);
+ if (value != NULL)
+ return g_value_dup_string (value);
+
+ return NULL;
+}
+#endif
+
+static void
+update_geocode (EmpathyContact *contact)
+{
+#if HAVE_GEOCLUE
+ static GeoclueGeocode *geocode;
+ gchar *str;
+ GHashTable *address;
+ GValue* value;
+ GHashTable *location;
+
+ location = empathy_contact_get_location (contact);
+ if (location == NULL)
+ return;
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+ if (value != NULL)
+ return;
+
+ if (geocode == NULL) {
+ geocode = geoclue_geocode_new (GEOCODE_SERVICE, GEOCODE_PATH);
+ g_object_add_weak_pointer (G_OBJECT (geocode), (gpointer *) &geocode);
+ }
+ else
+ g_object_ref (geocode);
+
+ address = geoclue_address_details_new ();
+
+ str = get_dup_string (location, EMPATHY_LOCATION_COUNTRY_CODE);
+ if (str != NULL) {
+ g_hash_table_insert (address,
+ g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE), str);
+ DEBUG ("\t - countrycode: %s", str);
+ }
+
+ str = get_dup_string (location, EMPATHY_LOCATION_COUNTRY);
+ if (str != NULL) {
+ g_hash_table_insert (address,
+ g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY), str);
+ DEBUG ("\t - country: %s", str);
+ }
+
+ str = get_dup_string (location, EMPATHY_LOCATION_POSTAL_CODE);
+ if (str != NULL) {
+ g_hash_table_insert (address,
+ g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE), str);
+ DEBUG ("\t - postalcode: %s", str);
+ }
+
+ str = get_dup_string (location, EMPATHY_LOCATION_REGION);
+ if (str != NULL) {
+ g_hash_table_insert (address,
+ g_strdup (GEOCLUE_ADDRESS_KEY_REGION), str);
+ DEBUG ("\t - region: %s", str);
+ }
+
+ str = get_dup_string (location, EMPATHY_LOCATION_LOCALITY);
+ if (str != NULL) {
+ g_hash_table_insert (address,
+ g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY), str);
+ DEBUG ("\t - locality: %s", str);
+ }
+
+ str = get_dup_string (location, EMPATHY_LOCATION_STREET);
+ if (str != NULL) {
+ g_hash_table_insert (address,
+ g_strdup (GEOCLUE_ADDRESS_KEY_STREET), str);
+ DEBUG ("\t - street: %s", str);
+ }
+
+ g_object_ref (contact);
+ geoclue_geocode_address_to_position_async (geocode, address,
+ geocode_cb, contact);
+
+ g_hash_table_unref (address);
+#endif
+}
diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c
index 9343c7ce3..7cc234f9f 100644
--- a/libempathy/empathy-tp-contact-factory.c
+++ b/libempathy/empathy-tp-contact-factory.c
@@ -28,10 +28,6 @@
#include <telepathy-glib/dbus.h>
#include <telepathy-glib/interfaces.h>
-#if HAVE_GEOCLUE
-#include <geoclue/geoclue-geocode.h>
-#endif
-
#include <extensions/extensions.h>
#include "empathy-tp-contact-factory.h"
@@ -373,154 +369,6 @@ tp_contact_factory_got_capabilities (TpConnection *connection,
}
}
-#if HAVE_GEOCLUE
-#define GEOCODE_SERVICE "org.freedesktop.Geoclue.Providers.Yahoo"
-#define GEOCODE_PATH "/org/freedesktop/Geoclue/Providers/Yahoo"
-
-/* This callback is called by geoclue when it found a position
- * for the given address. A position is necessary for a contact
- * to show up on the map
- */
-static void
-geocode_cb (GeoclueGeocode *geocode,
- GeocluePositionFields fields,
- double latitude,
- double longitude,
- double altitude,
- GeoclueAccuracy *accuracy,
- GError *error,
- gpointer contact)
-{
- GValue *new_value;
- GHashTable *location;
-
- location = empathy_contact_get_location (EMPATHY_CONTACT (contact));
-
- if (error != NULL) {
- DEBUG ("Error geocoding location : %s", error->message);
- g_object_unref (geocode);
- g_object_unref (contact);
- return;
- }
-
- if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) {
- new_value = tp_g_value_slice_new_double (latitude);
- g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LAT),
- new_value);
- DEBUG ("\t - Latitude: %f", latitude);
- }
- if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
- new_value = tp_g_value_slice_new_double (longitude);
- g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LON),
- new_value);
- DEBUG ("\t - Longitude: %f", longitude);
- }
- if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE) {
- new_value = tp_g_value_slice_new_double (altitude);
- g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_ALT),
- new_value);
- DEBUG ("\t - Altitude: %f", altitude);
- }
-
- /* Don't change the accuracy as we used an address to get this position */
- g_object_notify (contact, "location");
- g_object_unref (geocode);
- g_object_unref (contact);
-}
-#endif
-
-#if HAVE_GEOCLUE
-static gchar *
-get_dup_string (GHashTable *location,
- gchar *key)
-{
- GValue *value;
-
- value = g_hash_table_lookup (location, key);
- if (value != NULL)
- return g_value_dup_string (value);
-
- return NULL;
-}
-#endif
-
-static void
-tp_contact_factory_geocode (EmpathyContact *contact)
-{
-#if HAVE_GEOCLUE
- static GeoclueGeocode *geocode;
- gchar *str;
- GHashTable *address;
- GValue* value;
- GHashTable *location;
-
- location = empathy_contact_get_location (contact);
- if (location == NULL)
- return;
-
- value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
- if (value != NULL)
- return;
-
- if (geocode == NULL) {
- geocode = geoclue_geocode_new (GEOCODE_SERVICE, GEOCODE_PATH);
- g_object_add_weak_pointer (G_OBJECT (geocode), (gpointer *) &geocode);
- }
- else
- g_object_ref (geocode);
-
- address = geoclue_address_details_new ();
-
- str = get_dup_string (location, EMPATHY_LOCATION_COUNTRY_CODE);
- if (str != NULL) {
- g_hash_table_insert (address,
- g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE), str);
- DEBUG ("\t - countrycode: %s", str);
- }
-
- str = get_dup_string (location, EMPATHY_LOCATION_COUNTRY);
- if (str != NULL) {
- g_hash_table_insert (address,
- g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY), str);
- DEBUG ("\t - country: %s", str);
- }
-
- str = get_dup_string (location, EMPATHY_LOCATION_POSTAL_CODE);
- if (str != NULL) {
- g_hash_table_insert (address,
- g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE), str);
- DEBUG ("\t - postalcode: %s", str);
- }
-
- str = get_dup_string (location, EMPATHY_LOCATION_REGION);
- if (str != NULL) {
- g_hash_table_insert (address,
- g_strdup (GEOCLUE_ADDRESS_KEY_REGION), str);
- DEBUG ("\t - region: %s", str);
- }
-
- str = get_dup_string (location, EMPATHY_LOCATION_LOCALITY);
- if (str != NULL) {
- g_hash_table_insert (address,
- g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY), str);
- DEBUG ("\t - locality: %s", str);
- }
-
- str = get_dup_string (location, EMPATHY_LOCATION_STREET);
- if (str != NULL) {
- g_hash_table_insert (address,
- g_strdup (GEOCLUE_ADDRESS_KEY_STREET), str);
- DEBUG ("\t - street: %s", str);
- }
-
- g_object_ref (contact);
- geoclue_geocode_address_to_position_async (geocode, address,
- geocode_cb, contact);
-
- g_hash_table_unref (address);
-#endif
-}
-
static void
tp_contact_factory_update_location (EmpathyTpContactFactory *tp_factory,
guint handle,
@@ -540,8 +388,6 @@ tp_contact_factory_update_location (EmpathyTpContactFactory *tp_factory,
(GBoxedCopyFunc) tp_g_value_slice_dup);
empathy_contact_set_location (contact, new_location);
g_hash_table_unref (new_location);
-
- tp_contact_factory_geocode (contact);
}
static void