[empathy] Move the geoclue geocoding in EmpathyTpContactFactory



commit d13ba3658eded1649daff133cb04c76f6e3a906b
Author: Pierre-Luc Beaudoin <pierre-luc pierlux com>
Date:   Wed May 27 11:57:14 2009 -0400

    Move the geoclue geocoding in EmpathyTpContactFactory
    
    This code needs to be run when ever there is a new location available
    It makes more sens for it to be there. This makes the geolocation informtion
    ritcher as it can be displayed on a map.
---
 libempathy/Makefile.am                  |    4 +-
 libempathy/empathy-tp-contact-factory.c |  130 +++++++++++++++++++++++++++++++
 src/Makefile.am                         |    4 +-
 src/empathy-map-view.c                  |  115 ---------------------------
 4 files changed, 134 insertions(+), 119 deletions(-)

diff --git a/libempathy/Makefile.am b/libempathy/Makefile.am
index d7c9263..2406a0f 100644
--- a/libempathy/Makefile.am
+++ b/libempathy/Makefile.am
@@ -7,6 +7,7 @@ AM_CPPFLAGS =                                           \
 	-DDATADIR=\""$(datadir)"\"              	\
 	-DLOCALEDIR=\""$(datadir)/locale"\"		\
 	$(LIBEMPATHY_CFLAGS)				\
+	$(GEOCLUE_CFLAGS)				\
 	$(WARN_CFLAGS)					\
 	$(DISABLE_DEPRECATED)
 
@@ -59,7 +60,8 @@ nodist_libempathy_la_SOURCES =\
 
 libempathy_la_LIBADD =		\
 	$(top_builddir)/extensions/libemp-extensions.la \
-	$(LIBEMPATHY_LIBS)
+	$(LIBEMPATHY_LIBS) \
+	$(GEOCLUE_LIBS)
 
 libempathy_la_LDFLAGS =		\
        -version-info ${LIBEMPATHY_CURRENT}:${LIBEMPATHY_REVISION}:${LIBEMPATHY_AGE} \
diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c
index 0ddf91b..cd7824a 100644
--- a/libempathy/empathy-tp-contact-factory.c
+++ b/libempathy/empathy-tp-contact-factory.c
@@ -26,11 +26,15 @@
 #include <telepathy-glib/util.h>
 #include <telepathy-glib/gtypes.h>
 #include <telepathy-glib/dbus.h>
+#if HAVE_GEOCLUE
+#include <geoclue/geoclue-geocode.h>
+#endif
 
 #include <extensions/extensions.h>
 
 #include "empathy-tp-contact-factory.h"
 #include "empathy-utils.h"
+#include "empathy-location.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_TP | EMPATHY_DEBUG_CONTACT
 #include "empathy-debug.h"
@@ -391,6 +395,126 @@ tp_contact_factory_got_capabilities (EmpathyTpContactFactory *tp_factory,
 	g_ptr_array_free (capabilities, TRUE);
 }
 
+#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 userdata)
+{
+	GValue *new_value;
+	GHashTable *location;
+
+	location = empathy_contact_get_location (EMPATHY_CONTACT (userdata));
+
+	if (error != NULL) {
+		DEBUG ("Error geocoding location : %s", error->message);
+		g_object_unref (geocode);
+		g_object_unref (userdata);
+		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 (userdata, "location");
+	g_object_unref (geocode);
+	g_object_unref (userdata);
+}
+#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);
+	if (str != NULL)
+		g_hash_table_insert (address, g_strdup ("country"), str);
+
+	str = get_dup_string (location, EMPATHY_LOCATION_POSTAL_CODE);
+	if (str != NULL)
+		g_hash_table_insert (address, g_strdup ("postalcode"), str);
+
+	str = get_dup_string (location, EMPATHY_LOCATION_LOCALITY);
+	if (str != NULL)
+		g_hash_table_insert (address, g_strdup ("locality"), str);
+
+	str = get_dup_string (location, EMPATHY_LOCATION_STREET);
+	if (str != NULL)
+		g_hash_table_insert (address, g_strdup ("street"), str);
+
+	g_object_ref (contact);
+	geoclue_geocode_address_to_position_async (geocode, address,
+		geocode_cb, contact);
+
+	g_hash_table_unref (address);
+	return;
+#endif
+}
+
 static void
 tp_contact_factory_update_location (EmpathyTpContactFactory *tp_factory,
 				    guint handle,
@@ -398,6 +522,7 @@ tp_contact_factory_update_location (EmpathyTpContactFactory *tp_factory,
 {
 	EmpathyContact *contact;
 	GHashTable     *new_location;
+	GValue         *value;
 
 	contact = tp_contact_factory_find_by_handle (tp_factory, handle);
 
@@ -410,6 +535,11 @@ 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);
+
+	value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+	if (value == NULL) {
+		tp_contact_factory_geocode (contact);
+	}
 }
 
 static void
diff --git a/src/Makefile.am b/src/Makefile.am
index ef6311f..8973d53 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -4,7 +4,6 @@ AM_CPPFLAGS =						\
 	-I$(top_srcdir)                          	\
 	$(EMPATHY_CFLAGS)				\
 	$(LIBNOTIFY_CFLAGS)				\
-	$(GEOCLUE_CFLAGS)				\
 	$(LIBCHAMPLAIN_CFLAGS)				\
 	$(DISABLE_DEPRECATED)
 	$(WARN_CFLAGS)
@@ -15,8 +14,7 @@ LDADD =								\
 	$(top_builddir)/extensions/libemp-extensions.la		\
 	$(LIBNOTIFY_LIBS)					\
 	$(EMPATHY_LIBS)						\
-	$(LIBCHAMPLAIN_LIBS)					\
-	$(GEOCLUE_LIBS)
+	$(LIBCHAMPLAIN_LIBS)
 
 bin_PROGRAMS =			\
 	empathy			\
diff --git a/src/empathy-map-view.c b/src/empathy-map-view.c
index 692bdc0..c55e5c7 100644
--- a/src/empathy-map-view.c
+++ b/src/empathy-map-view.c
@@ -27,9 +27,6 @@
 #include <champlain/champlain.h>
 #include <champlain-gtk/champlain-gtk.h>
 #include <clutter-gtk/gtk-clutter-embed.h>
-#if HAVE_GEOCLUE
-#include <geoclue/geoclue-geocode.h>
-#endif
 #include <telepathy-glib/util.h>
 
 #include <libempathy/empathy-contact.h>
@@ -71,8 +68,6 @@ static void map_view_zoom_out_cb (GtkWidget *widget,
 static void map_view_contact_location_notify (GObject *gobject,
     GParamSpec *arg1,
     gpointer user_data);
-static gchar * get_dup_string (GHashTable *location,
-    gchar *key);
 
 GtkWidget *
 empathy_map_view_show (void)
@@ -170,74 +165,6 @@ map_view_destroy_cb (GtkWidget *widget,
   g_slice_free (EmpathyMapView, window);
 }
 
-#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
-map_view_geocode_cb (GeoclueGeocode *geocode,
-    GeocluePositionFields fields,
-    double latitude,
-    double longitude,
-    double altitude,
-    GeoclueAccuracy *accuracy,
-    GError *error,
-    gpointer userdata)
-{
-  GValue *new_value;
-  GHashTable *location;
-
-  location = empathy_contact_get_location (EMPATHY_CONTACT (userdata));
-
-  if (error != NULL)
-    {
-      DEBUG ("Error geocoding location : %s", error->message);
-      return;
-    }
-
-  if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)
-    {
-      new_value = tp_g_value_slice_new_double (longitude);
-      g_hash_table_replace (location, EMPATHY_LOCATION_LON, new_value);
-      DEBUG ("\t - Longitude: %f", longitude);
-    }
-  if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE)
-    {
-      new_value = tp_g_value_slice_new_double (latitude);
-      g_hash_table_replace (location, EMPATHY_LOCATION_LAT, new_value);
-      DEBUG ("\t - Latitude: %f", latitude);
-    }
-  if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE)
-    {
-      new_value = tp_g_value_slice_new_double (altitude);
-      g_hash_table_replace (location, 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 (userdata, "location");
-  g_object_unref (geocode);
-}
-#endif
-
-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;
-}
-
 static void
 map_view_marker_update_position (ChamplainMarker *marker,
     EmpathyContact *contact)
@@ -248,48 +175,6 @@ map_view_marker_update_position (ChamplainMarker *marker,
 
   location = empathy_contact_get_location (contact);
 
-#if HAVE_GEOCLUE
-  gchar *str;
-  GHashTable *address;
-
-  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LON);
-  if (value == NULL)
-      {
-        static GeoclueGeocode *geocode;
-        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);
-        if (str != NULL)
-          g_hash_table_insert (address, g_strdup ("country"), str);
-
-        str = get_dup_string (location, EMPATHY_LOCATION_POSTAL_CODE);
-        if (str != NULL)
-          g_hash_table_insert (address, g_strdup ("postalcode"), str);
-
-        str = get_dup_string (location, EMPATHY_LOCATION_LOCALITY);
-        if (str != NULL)
-          g_hash_table_insert (address, g_strdup ("locality"), str);
-
-        str = get_dup_string (location, EMPATHY_LOCATION_STREET);
-        if (str != NULL)
-          g_hash_table_insert (address, g_strdup ("street"), str);
-
-        geoclue_geocode_address_to_position_async (geocode, address,
-            map_view_geocode_cb, contact);
-
-        g_hash_table_unref (address);
-        return;
-      }
-#endif
-
   if (location == NULL ||
       g_hash_table_size (location) == 0)
   {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]