aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/widgets/e-contact-map.c
diff options
context:
space:
mode:
authorCanek Peláez Valdés <caneko@gmail.com>2013-10-31 06:06:33 +0800
committerMatthew Barnes <mbarnes@redhat.com>2013-11-01 04:31:26 +0800
commit8eb21abc046be972a82afedb3a0ab844b00ec7e3 (patch)
treed2151a57b290fcba8290e211ad30e7956a037185 /addressbook/gui/widgets/e-contact-map.c
parent44ea3941cad4346e0f0896ba360f2e01248934dd (diff)
downloadgsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.tar
gsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.tar.gz
gsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.tar.bz2
gsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.tar.lz
gsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.tar.xz
gsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.tar.zst
gsoc2013-evolution-8eb21abc046be972a82afedb3a0ab844b00ec7e3.zip
Bug 689055 - Port contact map to geocode-glib 3.10
Diffstat (limited to 'addressbook/gui/widgets/e-contact-map.c')
-rw-r--r--addressbook/gui/widgets/e-contact-map.c89
1 files changed, 59 insertions, 30 deletions
diff --git a/addressbook/gui/widgets/e-contact-map.c b/addressbook/gui/widgets/e-contact-map.c
index 15b512fa47..eb114fb90a 100644
--- a/addressbook/gui/widgets/e-contact-map.c
+++ b/addressbook/gui/widgets/e-contact-map.c
@@ -29,7 +29,7 @@
#include <champlain-gtk/champlain-gtk.h>
#include <geoclue/geoclue-address.h>
#include <geoclue/geoclue-position.h>
-#include <geocode-glib.h>
+#include <geocode-glib/geocode-glib.h>
#include <clutter/clutter.h>
@@ -87,10 +87,12 @@ contact_map_address_resolved_cb (GObject *source,
GHashTable *resolved = NULL;
gpointer marker_ptr;
const gchar *name;
- gdouble latitude, longitude;
AsyncContext *async_context = user_data;
ChamplainMarkerLayer *marker_layer;
ChamplainMarker *marker;
+ GeocodePlace *place;
+ GeocodeLocation *location;
+ GList *search_results;
g_return_if_fail (async_context != NULL);
g_return_if_fail (E_IS_CONTACT_MAP (async_context->map));
@@ -107,13 +109,10 @@ contact_map_address_resolved_cb (GObject *source,
if (!CHAMPLAIN_IS_MARKER_LAYER (marker_layer))
goto exit;
- resolved = geocode_object_resolve_finish (
- GEOCODE_OBJECT (source), result, NULL);
-
- if (resolved == NULL ||
- !geocode_object_get_coords (resolved, &longitude, &latitude)) {
- const gchar *name;
+ search_results = geocode_forward_search_finish (
+ GEOCODE_FORWARD (source), result, NULL);
+ if (search_results == NULL) {
name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
g_signal_emit (
async_context->map,
@@ -121,13 +120,21 @@ contact_map_address_resolved_cb (GObject *source,
goto exit;
}
- /* Move the marker to resolved position */
+ place = GEOCODE_PLACE (search_results->data);
+ location = geocode_place_get_location (place);
+
+ /* Move the marker to resolved position. */
champlain_location_set_location (
- CHAMPLAIN_LOCATION (marker), latitude, longitude);
+ CHAMPLAIN_LOCATION (marker),
+ geocode_location_get_latitude (location),
+ geocode_location_get_longitude (location));
champlain_marker_layer_add_marker (marker_layer, marker);
champlain_marker_set_selected (marker, FALSE);
- /* Store the marker in the hash table. Use it's label as key */
+ /* Do not unref the list elements. */
+ g_list_free (search_results);
+
+ /* Store the marker in the hash table, using its label as key. */
name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
marker_ptr = g_hash_table_lookup (
async_context->map->priv->markers, name);
@@ -151,39 +158,61 @@ exit:
}
static void
+add_attr (GHashTable *hash_table,
+ const gchar *key,
+ const gchar *string)
+{
+ GValue *value;
+
+ value = g_new0 (GValue, 1);
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_static_string (value, string);
+
+ g_hash_table_insert (hash_table, g_strdup (key), value);
+}
+
+static GHashTable *
+address_to_xep (EContactAddress *address)
+{
+
+ GHashTable *hash_table;
+
+ hash_table = g_hash_table_new_full (
+ (GHashFunc) g_str_hash,
+ (GEqualFunc) g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_free);
+
+ add_attr (hash_table, "postalcode", address->code);
+ add_attr (hash_table, "country", address->country);
+ add_attr (hash_table, "region", address->region);
+ add_attr (hash_table, "locality", address->locality);
+ add_attr (hash_table, "street", address->street);
+
+ return hash_table;
+}
+
+static void
resolve_marker_position (EContactMap *map,
EContactMarker *marker,
EContactAddress *address)
{
- GeocodeObject *geocoder;
+ GeocodeForward *geocoder;
AsyncContext *async_context;
- const gchar *key;
+ GHashTable *hash_table;
g_return_if_fail (E_IS_CONTACT_MAP (map));
g_return_if_fail (address != NULL);
- geocoder = geocode_object_new ();
-
- key = GEOCODE_OBJECT_FIELD_POSTAL;
- geocode_object_add (geocoder, key, address->code);
-
- key = GEOCODE_OBJECT_FIELD_COUNTRY;
- geocode_object_add (geocoder, key, address->country);
-
- key = GEOCODE_OBJECT_FIELD_STATE;
- geocode_object_add (geocoder, key, address->region);
-
- key = GEOCODE_OBJECT_FIELD_CITY;
- geocode_object_add (geocoder, key, address->locality);
-
- key = GEOCODE_OBJECT_FIELD_STREET;
- geocode_object_add (geocoder, key, address->street);
+ hash_table = address_to_xep (address);
+ geocoder = geocode_forward_new_for_params (hash_table);
+ g_hash_table_destroy (hash_table);
async_context = g_slice_new0 (AsyncContext);
async_context->map = g_object_ref (map);
async_context->marker = marker;
- geocode_object_resolve_async (
+ geocode_forward_search_async (
geocoder, NULL,
contact_map_address_resolved_cb,
async_context);