+/*
+ * location-module
+ *
+ * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
+ * Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <glib.h>
+
+#include <location.h>
+#include <location-map-service.h>
+#include "location-osm-geocode.h"
+#include "location-osm-route.h"
+#include "location-osm-poi.h"
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "log.h"
+
+static void
+_unref_geoclue(OsmHandle* handle)
+{
+ if (handle->geocoder) {
+ g_object_unref (handle->geocoder);
+ handle->geocoder = NULL;
+ }
+ if (handle->rev_geocoder) {
+ g_object_unref (handle->rev_geocoder);
+ handle->rev_geocoder = NULL;
+ }
+ if (handle->poi) {
+ g_object_unref (handle->poi);
+ handle->poi = NULL;
+ }
+}
+
+static gboolean
+_ref_geoclue(OsmHandle* handle)
+{
+ gchar *service, *path;
+ service = g_strdup_printf ("org.freedesktop.Geoclue.Providers.Nominatim");
+ path = g_strdup_printf ("/org/freedesktop/Geoclue/Providers/Nominatim");
+
+ if (!handle->geocoder) handle->geocoder = geoclue_geocode_new (service, path);
+ if (!handle->rev_geocoder) handle->rev_geocoder = geoclue_reverse_geocode_new (service, path);
+ if (!handle->poi) handle->poi = geoclue_poi_new (service, path);
+
+ if(!handle->geocoder || !handle->rev_geocoder || !handle->poi){
+ MOD_LOGW ("Error while creating Geoclue object.");
+ _unref_geoclue(handle);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static int
+get_geocode (gpointer handle,
+ const LocationAddress *addr,
+ const LocationMapPref *svc_pref,
+ GList **pos_list,
+ GList **acc_list)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(pos_list, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(acc_list, LOCATION_ERROR_PARAMETER);
+
+ return osm_get_geocode(osm, addr, pos_list, acc_list);
+}
+
+
+static int
+get_geocode_async (gpointer handle,
+ const LocationAddress *addr,
+ const LocationMapPref *svc_pref,
+ LocationPositionCB callback,
+ gpointer userdata)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(callback, LOCATION_ERROR_PARAMETER);
+
+ return osm_get_geocode_async(osm, addr, callback, userdata);
+}
+
+static int
+get_geocode_freetext(gpointer handle,
+ const gchar *addr,
+ const LocationMapPref *svc_pref,
+ GList **pos_list,
+ GList **acc_list)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(pos_list, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(acc_list, LOCATION_ERROR_PARAMETER);
+
+ return osm_get_geocode_freetext(osm, addr, pos_list, acc_list);
+}
+
+
+static int
+get_geocode_freetext_async (gpointer handle,
+ const gchar* addr,
+ const LocationMapPref *svc_pref,
+ LocationPositionCB callback,
+ gpointer userdata)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(callback, LOCATION_ERROR_PARAMETER);
+
+ return osm_get_geocode_freetext_async(osm, addr, callback, userdata);
+}
+
+static int
+get_reverse_geocode(gpointer handle,
+ const LocationPosition *pos,
+ const LocationMapPref *svc_pref,
+ LocationAddress **addr,
+ LocationAccuracy **acc)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(pos, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(acc, LOCATION_ERROR_PARAMETER);
+
+ return osm_get_reverse_geocode(osm, pos, addr, acc);
+}
+
+static int
+get_reverse_geocode_async (gpointer handle,
+ const LocationPosition *pos,
+ const LocationMapPref *svc_pref,
+ LocationAddressCB callback,
+ gpointer userdata)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(pos, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(callback, LOCATION_ERROR_PARAMETER);
+
+ return osm_get_reverse_geocode_async(osm, pos, callback, userdata);
+}
+
+static int
+search_poi (gpointer handle,
+ const LocationPOIFilter *filter,
+ const LocationPosition *position,
+ const LocationMapPref *svc_pref,
+ const LocationPOIPreference *pref,
+ LocationPOICB cb, const gpointer user_data, guint * req_id)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(filter, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(position, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(pref, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(cb, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(req_id, LOCATION_ERROR_PARAMETER);
+
+
+ return osm_search_poi_by_position(osm, filter, position, svc_pref, pref, cb, user_data, req_id);
+}
+
+static int
+search_poi_by_area (gpointer handle,
+ const LocationPOIFilter *filter,
+ const LocationBoundary *boundary,
+ const LocationMapPref *svc_pref,
+ const LocationPOIPreference *pref,
+ LocationPOICB cb, const gpointer user_data, guint * req_id)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail(filter, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(boundary, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(pref, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(cb, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(req_id, LOCATION_ERROR_PARAMETER);
+ g_return_val_if_fail(boundary->type == LOCATION_BOUNDARY_RECT, LOCATION_ERROR_NOT_SUPPORTED);
+
+ return osm_search_poi_by_area(osm, filter, boundary, svc_pref, pref, cb, user_data, req_id);;
+}
+
+static int
+search_poi_by_address (gpointer handle,
+ const LocationPOIFilter *filter,
+ const LocationAddress *address,
+ const LocationMapPref *svc_pref,
+ const LocationPOIPreference *pref,
+ LocationPOICB cb, const gpointer user_data, guint * req_id)
+{
+ return LOCATION_ERROR_NOT_SUPPORTED;
+}
+
+static int
+search_poi_by_freeform (gpointer handle,
+ const LocationPOIFilter * filter,
+ const gchar *freeform,
+ const LocationMapPref *svc_pref,
+ const LocationPOIPreference *pref,
+ LocationPOICB cb, const gpointer user_data, guint *req_id)
+{
+ return LOCATION_ERROR_NOT_SUPPORTED;
+}
+
+static int
+cancel_poi_request (gpointer handle, guint req_id)
+{
+ return LOCATION_ERROR_NOT_SUPPORTED;
+}
+
+static int
+request_route (gpointer handle,
+ const LocationPosition *origin,
+ const LocationPosition *destination,
+ GList *waypoint,
+ const LocationMapPref *svc_pref,
+ const LocationRoutePreference *pref,
+ LocationRouteCB cb, const gpointer user_data, guint * req_id)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+
+ return osm_request_route(origin, destination, waypoint, svc_pref, pref, cb, user_data, req_id);
+}
+
+static int
+cancel_route_request (gpointer handle, guint req_id)
+{
+ OsmHandle *osm = (OsmHandle *) handle;
+ g_return_val_if_fail (osm, LOCATION_ERROR_NOT_AVAILABLE);
+
+ return osm_cancel_route_request (req_id);
+}
+
+static gboolean
+is_supported_provider_capability (gpointer handle,
+ LocationMapServiceType type)
+{
+ return FALSE;
+}
+
+static int
+get_provider_capability_key (gpointer handle,
+ LocationMapServiceType type, GList **key)
+{
+ g_return_val_if_fail (key, LOCATION_ERROR_PARAMETER);
+ *key = NULL;
+ return LOCATION_ERROR_NOT_SUPPORTED;
+}
+
+static int
+get_service_name (gpointer handle,
+ gchar **service_name)
+{
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
+ g_return_val_if_fail (service_name, LOCATION_ERROR_PARAMETER);
+ *service_name = g_strdup (osm->service_name);
+ return LOCATION_ERROR_NONE;
+}
+
+LOCATION_MODULE_API gpointer
+init (LocModServiceOps* ops)
+{
+ MOD_LOGD("init");
+ g_return_val_if_fail(ops, NULL);
+ OsmHandle *handle = g_new0 (OsmHandle, 1);
+ if (!_ref_geoclue(handle)) {
+ g_free (handle);
+ return NULL;
+ }
+ handle->service_name = g_strdup ("osm");
+ ops->get_service_name = get_service_name;
+ ops->get_geocode = get_geocode;
+ ops->get_geocode_freetext = get_geocode_freetext;
+ ops->get_reverse_geocode = get_reverse_geocode;
+ ops->get_geocode_async = get_geocode_async;
+ ops->get_geocode_freetext_async = get_geocode_freetext_async;
+ ops->get_reverse_geocode_async = get_reverse_geocode_async;
+ ops->search_poi = search_poi;
+ ops->search_poi_by_area = search_poi_by_area;
+ ops->search_poi_by_address = search_poi_by_address;
+ ops->search_poi_by_freeform = search_poi_by_freeform;
+ ops->cancel_poi_request = cancel_poi_request;
+ ops->request_route = request_route;
+ ops->cancel_route_request = cancel_route_request;
+ ops->is_supported_provider_capability = is_supported_provider_capability;
+ ops->get_provider_capability_key = get_provider_capability_key;
+
+ return (gpointer)handle;
+}
+
+LOCATION_MODULE_API void
+shutdown (gpointer handle)
+{
+ MOD_LOGD("shutdown");
+ g_return_if_fail(handle);
+ OsmHandle *osm = (OsmHandle *)handle;
+ g_free (osm->service_name);
+ _unref_geoclue(osm);
+ g_free (osm);
+}