4 * Copyright (c) 2010-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
7 * Genie Kim <daejins.kim@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
25 #include <location-map-service.h>
26 #include "location-osm-geocode.h"
27 #include "location-osm-route.h"
28 #include "location-osm-poi.h"
36 _unref_geoclue(OsmHandle* handle)
38 if (handle->geocoder) {
39 g_object_unref (handle->geocoder);
40 handle->geocoder = NULL;
42 if (handle->rev_geocoder) {
43 g_object_unref (handle->rev_geocoder);
44 handle->rev_geocoder = NULL;
47 g_object_unref (handle->poi);
53 _ref_geoclue(OsmHandle* handle)
55 gchar *service, *path;
56 service = g_strdup_printf ("org.freedesktop.Geoclue.Providers.Nominatim");
57 path = g_strdup_printf ("/org/freedesktop/Geoclue/Providers/Nominatim");
59 if (!handle->geocoder) handle->geocoder = geoclue_geocode_new (service, path);
60 if (!handle->rev_geocoder) handle->rev_geocoder = geoclue_reverse_geocode_new (service, path);
61 if (!handle->poi) handle->poi = geoclue_poi_new (service, path);
63 if(!handle->geocoder || !handle->rev_geocoder || !handle->poi){
64 MOD_LOGW ("Error while creating Geoclue object.");
65 _unref_geoclue(handle);
72 get_geocode (gpointer handle,
73 const LocationAddress *addr,
74 const LocationMapPref *svc_pref,
78 OsmHandle *osm = (OsmHandle *)handle;
79 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
80 g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
81 g_return_val_if_fail(pos_list, LOCATION_ERROR_PARAMETER);
82 g_return_val_if_fail(acc_list, LOCATION_ERROR_PARAMETER);
84 return osm_get_geocode(osm, addr, pos_list, acc_list);
89 get_geocode_async (gpointer handle,
90 const LocationAddress *addr,
91 const LocationMapPref *svc_pref,
92 LocationPositionCB callback,
95 OsmHandle *osm = (OsmHandle *)handle;
96 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
97 g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
98 g_return_val_if_fail(callback, LOCATION_ERROR_PARAMETER);
100 return osm_get_geocode_async(osm, addr, callback, userdata);
104 get_geocode_freetext(gpointer handle,
106 const LocationMapPref *svc_pref,
110 OsmHandle *osm = (OsmHandle *)handle;
111 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
112 g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
113 g_return_val_if_fail(pos_list, LOCATION_ERROR_PARAMETER);
114 g_return_val_if_fail(acc_list, LOCATION_ERROR_PARAMETER);
116 return osm_get_geocode_freetext(osm, addr, pos_list, acc_list);
121 get_geocode_freetext_async (gpointer handle,
123 const LocationMapPref *svc_pref,
124 LocationPositionCB callback,
127 OsmHandle *osm = (OsmHandle *)handle;
128 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
129 g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
130 g_return_val_if_fail(callback, LOCATION_ERROR_PARAMETER);
132 return osm_get_geocode_freetext_async(osm, addr, callback, userdata);
136 get_reverse_geocode(gpointer handle,
137 const LocationPosition *pos,
138 const LocationMapPref *svc_pref,
139 LocationAddress **addr,
140 LocationAccuracy **acc)
142 OsmHandle *osm = (OsmHandle *)handle;
143 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
144 g_return_val_if_fail(pos, LOCATION_ERROR_PARAMETER);
145 g_return_val_if_fail(addr, LOCATION_ERROR_PARAMETER);
146 g_return_val_if_fail(acc, LOCATION_ERROR_PARAMETER);
148 return osm_get_reverse_geocode(osm, pos, addr, acc);
152 get_reverse_geocode_async (gpointer handle,
153 const LocationPosition *pos,
154 const LocationMapPref *svc_pref,
155 LocationAddressCB callback,
158 OsmHandle *osm = (OsmHandle *)handle;
159 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
160 g_return_val_if_fail(pos, LOCATION_ERROR_PARAMETER);
161 g_return_val_if_fail(callback, LOCATION_ERROR_PARAMETER);
163 return osm_get_reverse_geocode_async(osm, pos, callback, userdata);
167 search_poi (gpointer handle,
168 const LocationPOIFilter *filter,
169 const LocationPosition *position,
170 const LocationMapPref *svc_pref,
171 const LocationPOIPreference *pref,
172 LocationPOICB cb, const gpointer user_data, guint * req_id)
174 OsmHandle *osm = (OsmHandle *)handle;
175 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
176 g_return_val_if_fail(filter, LOCATION_ERROR_PARAMETER);
177 g_return_val_if_fail(position, LOCATION_ERROR_PARAMETER);
178 g_return_val_if_fail(pref, LOCATION_ERROR_PARAMETER);
179 g_return_val_if_fail(cb, LOCATION_ERROR_PARAMETER);
180 g_return_val_if_fail(req_id, LOCATION_ERROR_PARAMETER);
183 return osm_search_poi_by_position(osm, filter, position, svc_pref, pref, cb, user_data, req_id);
187 search_poi_by_area (gpointer handle,
188 const LocationPOIFilter *filter,
189 const LocationBoundary *boundary,
190 const LocationMapPref *svc_pref,
191 const LocationPOIPreference *pref,
192 LocationPOICB cb, const gpointer user_data, guint * req_id)
194 OsmHandle *osm = (OsmHandle *)handle;
195 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
196 g_return_val_if_fail(filter, LOCATION_ERROR_PARAMETER);
197 g_return_val_if_fail(boundary, LOCATION_ERROR_PARAMETER);
198 g_return_val_if_fail(pref, LOCATION_ERROR_PARAMETER);
199 g_return_val_if_fail(cb, LOCATION_ERROR_PARAMETER);
200 g_return_val_if_fail(req_id, LOCATION_ERROR_PARAMETER);
201 g_return_val_if_fail(boundary->type == LOCATION_BOUNDARY_RECT, LOCATION_ERROR_NOT_SUPPORTED);
203 return osm_search_poi_by_area(osm, filter, boundary, svc_pref, pref, cb, user_data, req_id);;
207 search_poi_by_address (gpointer handle,
208 const LocationPOIFilter *filter,
209 const LocationAddress *address,
210 const LocationMapPref *svc_pref,
211 const LocationPOIPreference *pref,
212 LocationPOICB cb, const gpointer user_data, guint * req_id)
214 return LOCATION_ERROR_NOT_SUPPORTED;
218 search_poi_by_freeform (gpointer handle,
219 const LocationPOIFilter * filter,
220 const gchar *freeform,
221 const LocationMapPref *svc_pref,
222 const LocationPOIPreference *pref,
223 LocationPOICB cb, const gpointer user_data, guint *req_id)
225 return LOCATION_ERROR_NOT_SUPPORTED;
229 cancel_poi_request (gpointer handle, guint req_id)
231 return LOCATION_ERROR_NOT_SUPPORTED;
235 request_route (gpointer handle,
236 const LocationPosition *origin,
237 const LocationPosition *destination,
239 const LocationMapPref *svc_pref,
240 const LocationRoutePreference *pref,
241 LocationRouteCB cb, const gpointer user_data, guint * req_id)
243 OsmHandle *osm = (OsmHandle *)handle;
244 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
246 return osm_request_route(origin, destination, waypoint, svc_pref, pref, cb, user_data, req_id);
250 cancel_route_request (gpointer handle, guint req_id)
252 OsmHandle *osm = (OsmHandle *) handle;
253 g_return_val_if_fail (osm, LOCATION_ERROR_NOT_AVAILABLE);
255 return osm_cancel_route_request (req_id);
259 is_supported_provider_capability (gpointer handle,
260 LocationMapServiceType type)
266 get_provider_capability_key (gpointer handle,
267 LocationMapServiceType type, GList **key)
269 g_return_val_if_fail (key, LOCATION_ERROR_PARAMETER);
271 return LOCATION_ERROR_NOT_SUPPORTED;
275 get_service_name (gpointer handle,
276 gchar **service_name)
278 OsmHandle *osm = (OsmHandle *)handle;
279 g_return_val_if_fail(osm, LOCATION_ERROR_NOT_AVAILABLE);
280 g_return_val_if_fail (service_name, LOCATION_ERROR_PARAMETER);
281 *service_name = g_strdup (osm->service_name);
282 return LOCATION_ERROR_NONE;
285 LOCATION_MODULE_API gpointer
286 init (LocModServiceOps* ops)
289 g_return_val_if_fail(ops, NULL);
290 OsmHandle *handle = g_new0 (OsmHandle, 1);
291 if (!_ref_geoclue(handle)) {
295 handle->service_name = g_strdup ("osm");
296 ops->get_service_name = get_service_name;
297 ops->get_geocode = get_geocode;
298 ops->get_geocode_freetext = get_geocode_freetext;
299 ops->get_reverse_geocode = get_reverse_geocode;
300 ops->get_geocode_async = get_geocode_async;
301 ops->get_geocode_freetext_async = get_geocode_freetext_async;
302 ops->get_reverse_geocode_async = get_reverse_geocode_async;
303 ops->search_poi = search_poi;
304 ops->search_poi_by_area = search_poi_by_area;
305 ops->search_poi_by_address = search_poi_by_address;
306 ops->search_poi_by_freeform = search_poi_by_freeform;
307 ops->cancel_poi_request = cancel_poi_request;
308 ops->request_route = request_route;
309 ops->cancel_route_request = cancel_route_request;
310 ops->is_supported_provider_capability = is_supported_provider_capability;
311 ops->get_provider_capability_key = get_provider_capability_key;
313 return (gpointer)handle;
316 LOCATION_MODULE_API void
317 shutdown (gpointer handle)
319 MOD_LOGD("shutdown");
320 g_return_if_fail(handle);
321 OsmHandle *osm = (OsmHandle *)handle;
322 g_free (osm->service_name);