4 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
7 * Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.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.
26 #include <glib-object.h>
30 #include "location-log.h"
31 #include "location-map-pref.h"
33 #include "module-internal.h"
35 #include "map-internal.h"
36 #include "map-service.h"
37 #include "location-map-ielement.h"
39 #define MAP_SERVICE_PREFIX "map-service"
41 gchar *provider_list[] = {
53 static GParamSpec *pspec[PROP_MAX] = {NULL, };
55 static void map_service_ielement_interface_init (LocationMapIElementInterface *iface);
56 gchar *map_service_get_default_provider (GObject *obj);
58 G_DEFINE_TYPE_WITH_CODE (MapService, map_service, G_TYPE_OBJECT,
59 G_IMPLEMENT_INTERFACE (LOCATION_MAP_TYPE_IELEMENT, map_service_ielement_interface_init));
62 _get_lang (gchar country_code[3], gchar lang_code[3])
64 if (!country_code || !lang_code) return;
65 gchar* langset = vconf_get_str(VCONFKEY_LANGSET);
66 LOCATION_LOGD("getenv: %s", langset);
72 country_code[0] = 'U';
73 country_code[1] = 'S';
74 country_code[2] = '\0';
76 gchar* langset_upper = g_ascii_strup(langset, -1);
77 lang_code[0] = langset_upper[0];
78 lang_code[1] = langset_upper[1];
80 country_code[0] = langset_upper[3];
81 country_code[1] = langset_upper[4];
82 country_code[2] = '\0';
83 g_free(langset_upper);
85 LOCATION_LOGD("Language: %s, Country: %s", lang_code, country_code);
90 map_service_dispose (GObject *gobject)
92 LOCATION_LOGD("map_service_dispose");
94 G_OBJECT_CLASS (map_service_parent_class)->dispose (gobject);
98 map_service_finalize (GObject *gobject)
100 LOCATION_LOGD("map_service_finalize");
101 MapServicePrivate* priv = GET_PRIVATE(gobject);
102 module_free(priv->mod, "map-service");
104 G_OBJECT_CLASS (map_service_parent_class)->finalize (gobject);
108 map_service_get_property (GObject *object,
113 LOCATION_LOGD("Enter map_service_get_property");
114 MapServicePrivate *priv = GET_PRIVATE (object);
116 g_return_if_fail(priv->mod);
117 g_return_if_fail(priv->mod->handler);
118 switch (property_id){
120 char* service_name = NULL;
121 if(priv->mod->ops.get_service_name){
122 if( LOCATION_ERROR_NONE != priv->mod->ops.get_service_name(priv->mod->handler, &service_name) ){
126 LOCATION_LOGD("Get prop>> Service name: %s", service_name);
127 g_value_set_string(value, service_name);
128 g_free(service_name);
132 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
138 map_service_set_property (GObject *object,
143 LOCATION_LOGD("map_service_set_property");
144 MapServicePrivate *priv = GET_PRIVATE (object);
146 switch (property_id) {
147 case PROP_PROVIDER: {
148 char buf[256] = {0, };
149 gchar *service = g_value_dup_string(value);
151 if (priv->mod && priv->pref) {
152 char *cur_provider = location_map_pref_get_provider_name (priv->pref);
153 if (g_strcmp0 (cur_provider, MAP_SERVICE_PREFIX) == 0) {
154 snprintf(buf, 255, "%s", cur_provider);
157 snprintf(buf, 255, "%s-%s", MAP_SERVICE_PREFIX, cur_provider);
159 module_free(priv->mod, buf);
160 memset (buf, 256, 0x0);
164 if (service == NULL) {
165 snprintf (buf, 255, "%s", MAP_SERVICE_PREFIX);
166 service = map_service_get_default_provider(object);
168 snprintf (buf, 255, "%s-%s", MAP_SERVICE_PREFIX, service);
171 priv->mod = (LocationServiceMod *)module_new (buf);
172 if (priv->mod == NULL) {
173 priv->mod = (LocationServiceMod *) module_new (MAP_SERVICE_PREFIX);
174 service = map_service_get_default_provider(object);
178 location_map_pref_set_provider_name (priv->pref, service);
188 map_service_ielement_interface_init (LocationMapIElementInterface *iface)
190 iface->get_geocode = (TYPE_GET_GEOCODE)map_service_get_geocode;
191 iface->get_geocode_freeform = (TYPE_GET_GEOCODE_FREEFORM)map_service_get_geocode_freeform;
192 iface->get_reversegeocode = (TYPE_GET_REVERSEGEOCODE)map_service_get_reversegeocode;
193 iface->get_geocode_async = (TYPE_GET_GEOCODE_ASYNC)map_service_get_geocode_async;
194 iface->get_geocode_freeform_async = (TYPE_GET_GEOCODE_FREEFORM_ASYNC)map_service_get_geocode_freeform_async;
195 iface->get_reversegeocode_async = (TYPE_GET_REVERSEGEOCODE_ASYNC)map_service_get_reversegeocode_async;
196 iface->search_poi = (TYPE_SEARCH_POI) map_service_search_poi;
197 iface->search_poi_by_area = (TYPE_SEARCH_POI_BY_AREA) map_service_search_poi_by_area;
198 iface->search_poi_by_address = (TYPE_SEARCH_POI_BY_ADDR) map_service_search_poi_by_address;
199 iface->search_poi_by_freeform = (TYPE_SEARCH_POI_BY_FREEFORM) map_service_search_poi_by_freeform;
200 iface->cancel_poi_request = (TYPE_CANCEL_POI_REQUEST) map_service_cancel_poi_request;
201 iface->request_route = (TYPE_REQUEST_ROUTE) map_service_request_route;
202 iface->cancel_route_request = (TYPE_CANCEL_ROUTE_REQUEST) map_service_cancel_route_request;
203 iface->is_supported_provider_capability = (TYPE_IS_SUPPORTED_PROVIDER_CAPABILITY) map_service_is_supported_provider_capability;
204 iface->get_provider_capability_key = (TYPE_GET_PROVIDER_CAPABILITY_KEY) map_service_get_provider_capability_key;
209 map_service_init (MapService *self)
211 LOCATION_LOGD("map_service_init");
212 MapServicePrivate* priv = GET_PRIVATE(self);
214 priv->pref = location_map_pref_new ();
215 if(!priv->pref) LOCATION_LOGW("Service preference failed");
217 gchar country[3], lang[3];
218 _get_lang (country, lang);
219 location_map_pref_set_language (priv->pref, lang);
220 location_map_pref_set_distance_unit (priv->pref, "MI");
221 location_map_pref_set_provider_name (priv->pref, "decarta");
225 map_service_class_init (MapServiceClass *klass)
227 LOCATION_LOGD("map_service_class_init");
228 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
230 gobject_class->get_property = map_service_get_property;
231 gobject_class->set_property = map_service_set_property;
233 gobject_class->dispose = map_service_dispose;
234 gobject_class->finalize = map_service_finalize;
236 g_type_class_add_private (klass, sizeof (MapServicePrivate));
238 pspec[PROP_PROVIDER] = g_param_spec_string ("provider",
239 "map service provider name prop",
240 "map service provider name",
243 g_object_class_install_properties (gobject_class,
249 map_service_get_pref(GObject *obj)
251 LOCATION_LOGD("map_service_get_pref");
252 MapServicePrivate* priv = GET_PRIVATE(obj);
253 if (!priv) return NULL;
254 if (!priv->pref) return NULL;
256 LocationMapPref *pref = location_map_pref_copy(priv->pref);
262 map_service_set_pref (GObject *obj, LocationMapPref *pref)
264 LOCATION_LOGD("map_service_set_pref");
266 gchar *provider = NULL;
267 MapServicePrivate* priv = GET_PRIVATE(obj);
268 if (!priv) return FALSE;
269 if (!priv->pref) location_map_pref_free(priv->pref);
271 priv->pref = location_map_pref_copy (pref);
272 provider = location_map_pref_get_provider_name (pref);
274 g_object_set (obj, "provider", provider, NULL);
281 map_service_get_supported_providers (GObject *obj)
283 LOCATION_LOGD("map_service_get_supported_providers");
286 gchar buf[128] = {0, };
289 for (idx = 0; idx < sizeof(provider_list)/sizeof(gchar*); idx++) {
290 memset (buf, 128, 0x0);
291 snprintf(buf, 127, "%s-%s", MAP_SERVICE_PREFIX, provider_list[idx]);
292 if (module_is_supported(buf) == TRUE) {
293 list = g_list_append(list, g_strdup (provider_list[idx]));
301 map_service_get_default_provider (GObject *obj)
303 LOCATION_LOGD("map_service_get_default_provider");
306 gchar *path = mod_get_realpath (MAP_SERVICE_PREFIX);
307 if (!path) return NULL;
309 for (idx = 0; idx < sizeof(provider_list)/sizeof(gchar*); idx++) {
310 if (strstr (path, provider_list[idx]) != NULL) {
315 if (idx == sizeof(provider_list)/sizeof(gchar*)) {
320 return g_strdup (provider_list[idx]);
324 map_service_set_provider (GObject *obj, gchar *provider)
326 LOCATION_LOGD("map_service_get_default_provider");
327 gchar *set_provider = NULL;
329 g_object_set (obj, "provider", provider, NULL);
330 g_object_get (obj, "provider", &set_provider, NULL);
332 if (set_provider && strcmp (provider, set_provider) != 0) {
333 LOCATION_LOGE("Requested [%s], but current provider [%s]", provider, set_provider);
334 g_free (set_provider);
338 g_free (set_provider);