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 "location-log.h"
28 #include "location-types.h"
29 #include "map-service.h"
31 struct _LocationLandmark {
33 guint id; ///< Unique identifier of the landmark
34 guint priority; ///< Degree of importance of the landmark (Between HIGHEST_LANDMARK_PRIORITY and LOWEST_LANDMARK_PRIORITY)
35 gchar *name; ///< Name of landmark
36 LocationPosition *position; ///< Positon of the landmark, may be null if not known
37 LocationAddress *addr; ///< Textual address information of the landmark, may be null if not
38 LocationBoundary *bbox; ///< Coverage area of the landmark, may be null if not available
39 guint timestamp; ///< Time when the landmark data was last updated (updated by system and used to facilitate tracking)
41 gchar *author; ///< Provider of the landmark data, may be null
42 gchar *store; ///< Name of landmark store that the landmark belongs to
43 gchar *phone_number; ///< Nhone number of the landmark, may be null
44 GList *category; ///< Categories to which the landmark belongs to
45 GList *url; ///< Url to additional content (Optional)
46 gchar *desc; ///< Description of the landmark, may be null if not available
48 GHashTable *properties; ///< Extra info of the landmark
52 struct _LocationLandmarkUrl {
53 gchar *path; ///< Url of landmark url info
54 gchar *desc; ///< Description of landmark url info
58 location_landmark_get_id (const LocationLandmark *landmark)
60 g_return_val_if_fail(landmark, 0);
67 location_landmark_get_name (const LocationLandmark *landmark)
69 g_return_val_if_fail(landmark, NULL);
71 return landmark->name;
74 EXPORT_API LocationPosition *
75 location_landmark_get_position (const LocationLandmark *landmark)
77 g_return_val_if_fail(landmark, NULL);
79 return landmark->position;
82 EXPORT_API LocationAddress *
83 location_landmark_get_address (const LocationLandmark *landmark)
85 g_return_val_if_fail(landmark, NULL);
87 return landmark->addr;
91 location_landmark_get_description (const LocationLandmark *landmark)
93 g_return_val_if_fail(landmark, NULL);
95 return landmark->desc;
99 location_landmark_get_timestamp (const LocationLandmark *landmark)
101 g_return_val_if_fail(landmark, 0);
103 return landmark->timestamp;
107 location_landmark_get_priority (const LocationLandmark *landmark)
109 g_return_val_if_fail(landmark, 0);
111 return landmark->priority;
114 EXPORT_API LocationBoundary *
115 location_landmark_get_bounding_box (const LocationLandmark *landmark)
117 g_return_val_if_fail(landmark, NULL);
119 return landmark->bbox;
123 location_landmark_get_author (const LocationLandmark *landmark)
125 g_return_val_if_fail(landmark, NULL);
127 return landmark->author;
131 location_landmark_get_url (const LocationLandmark *landmark)
133 g_return_val_if_fail(landmark, NULL);
135 return landmark->url;
139 location_landmark_get_category (const LocationLandmark *landmark)
141 g_return_val_if_fail(landmark, NULL);
143 return landmark->category;
147 location_landmark_get_phone_number (const LocationLandmark *landmark)
149 g_return_val_if_fail(landmark, NULL);
151 return landmark->phone_number;
155 location_landmark_get_property_key (const LocationLandmark *landmark)
157 g_return_val_if_fail(landmark, NULL);
159 return g_hash_table_get_keys (landmark->properties);
162 EXPORT_API gconstpointer
163 location_landmark_get_property (const LocationLandmark *landmark, gconstpointer key)
165 g_return_val_if_fail(landmark, NULL);
166 g_return_val_if_fail(key, NULL);
167 if (!landmark->properties) return NULL;
169 return g_hash_table_lookup (landmark->properties, key);
173 location_landmark_set_id (LocationLandmark *landmark, guint id)
175 g_return_val_if_fail(landmark, FALSE);
183 location_landmark_set_name (LocationLandmark *landmark, const gchar *name)
185 g_return_val_if_fail(landmark, FALSE);
187 if (landmark->name) {
188 g_free(landmark->name);
189 landmark->name = NULL;
191 if (name) landmark->name = g_strdup (name);
197 location_landmark_set_position (LocationLandmark *landmark, const LocationPosition *position)
199 g_return_val_if_fail(landmark, FALSE);
201 if (landmark->position) {
202 location_position_free(landmark->position);
203 landmark->position = NULL;
206 if (position) landmark->position = location_position_copy (position);
213 location_landmark_set_address (LocationLandmark *landmark, const LocationAddress *addr)
215 g_return_val_if_fail(landmark, FALSE);
217 if (landmark->addr) {
218 location_address_free (landmark->addr);
219 landmark->addr = NULL;
222 if (addr) landmark->addr = location_address_copy (addr);
229 location_landmark_set_description (LocationLandmark *landmark, const gchar *desc)
231 g_return_val_if_fail(landmark, FALSE);
233 if (landmark->desc) {
234 g_free(landmark->desc);
235 landmark->desc = NULL;
238 if (desc) landmark->desc = g_strdup (desc);
244 location_landmark_set_timestamp (LocationLandmark *landmark, guint timestamp)
246 g_return_val_if_fail(landmark, FALSE);
248 landmark->timestamp = timestamp;
255 location_landmark_set_priority (LocationLandmark *landmark, guint priority)
257 g_return_val_if_fail(landmark, FALSE);
259 landmark->priority = priority;
265 location_landmark_set_bounding_box (LocationLandmark *landmark, const LocationBoundary *bbox)
267 g_return_val_if_fail(landmark, FALSE);
269 if (landmark->bbox) {
270 location_boundary_free(landmark->bbox);
271 landmark->bbox = NULL;
274 if (bbox) landmark->bbox = location_boundary_copy (bbox);
280 location_landmark_set_author (LocationLandmark *landmark, const gchar *author)
282 g_return_val_if_fail(landmark, FALSE);
284 if (landmark->author) {
285 g_free(landmark->author);
286 landmark->author = NULL;
288 if (author) landmark->author = g_strdup (author);
293 static void landmark_url_foreach_free (gpointer data)
295 g_return_if_fail(data);
297 LocationLandmarkUrl *url = (LocationLandmarkUrl *)data;
299 location_landmark_url_free (url);
302 static void landmark_foreach_url_copy (gpointer data, gpointer user_data)
304 g_return_if_fail(data);
305 g_return_if_fail(user_data);
307 LocationLandmarkUrl *url = (LocationLandmarkUrl *)data;
308 LocationLandmark *landmark = (LocationLandmark *) user_data;
310 if(!url || !landmark) return;
312 landmark->url = g_list_append(landmark->url, url);
316 location_landmark_set_url (LocationLandmark *landmark, GList *url)
318 g_return_val_if_fail(landmark, FALSE);
321 g_list_free_full(landmark->url, landmark_url_foreach_free);
322 landmark->url = NULL;
325 if (url) g_list_foreach (url, landmark_foreach_url_copy, landmark);
330 static void landmark_foreach_copy_category (gpointer data, gpointer user_data)
332 g_return_if_fail (data);
333 g_return_if_fail (user_data);
335 gchar *category_name = (gchar *)data;
336 LocationLandmark *landmark = (LocationLandmark *) user_data;
338 landmark->category = g_list_append (landmark->category, g_strdup(category_name));
341 static void landmark_free_category (gpointer data)
343 g_return_if_fail (data);
345 gchar * category_name = (gchar *)data;
347 g_free (category_name);
351 location_landmark_set_category (LocationLandmark *landmark, GList *category)
353 g_return_val_if_fail(landmark, FALSE);
355 if (landmark->category) {
356 g_list_free_full(landmark->category, landmark_free_category);
357 landmark->category = NULL;
360 if (category) g_list_foreach ((GList*) category, landmark_foreach_copy_category, landmark);
366 location_landmark_set_phone_number (LocationLandmark *landmark, const gchar *number)
368 g_return_val_if_fail(landmark, FALSE);
369 g_return_val_if_fail(number, FALSE);
371 if (landmark->phone_number) {
372 g_free(landmark->phone_number);
373 landmark->phone_number = NULL;
375 if (number) landmark->phone_number = g_strdup (number);
381 location_landmark_set_property(LocationLandmark *landmark, gconstpointer key, gconstpointer value)
383 g_return_val_if_fail(landmark, FALSE);
384 g_return_val_if_fail(key, FALSE);
385 if (!landmark->properties) return FALSE;
388 gchar *re_key = g_strdup (key);
389 gchar *re_val = g_strdup (value);
390 g_hash_table_insert(landmark->properties, re_key, re_val);
392 else g_hash_table_remove (landmark->properties, key);
398 location_landmark_url_get_url_path (const LocationLandmarkUrl *url)
400 g_return_val_if_fail (url, NULL);
406 location_landmark_url_get_description (const LocationLandmarkUrl *url)
408 g_return_val_if_fail (url, NULL);
414 location_landmark_url_set_url_path (LocationLandmarkUrl *url, const gchar *path)
416 g_return_val_if_fail (url, FALSE);
423 if (path) url->path = g_strdup (path);
429 location_landmark_url_set_description (LocationLandmarkUrl *url, const gchar *desc)
431 g_return_val_if_fail (url, FALSE);
438 if (desc) url->desc = g_strdup (desc);
443 EXPORT_API LocationLandmarkUrl *
444 location_landmark_url_new (void)
446 LocationLandmarkUrl *url = g_slice_new0 (LocationLandmarkUrl);
447 if(!url) return NULL;
454 location_landmark_url_free (LocationLandmarkUrl * url)
456 g_return_if_fail (url);
459 location_landmark_url_set_url_path(url, NULL);
460 location_landmark_url_set_description(url, NULL);
462 g_slice_free(LocationLandmarkUrl, url);
465 EXPORT_API LocationLandmarkUrl *
466 location_landmark_url_copy (const LocationLandmarkUrl *url)
468 g_return_val_if_fail(url, NULL);
470 LocationLandmarkUrl *new_url = location_landmark_url_new();
472 location_landmark_url_set_url_path(new_url, location_landmark_url_get_url_path(url));
473 location_landmark_url_set_description(new_url, location_landmark_url_get_description(url));
478 EXPORT_API LocationLandmark *
479 location_landmark_new (void)
481 LocationLandmark *landmark = g_slice_new0 (LocationLandmark);
482 if (!landmark) return NULL;
484 landmark->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
489 EXPORT_API LocationLandmark *
490 location_landmark_copy (const LocationLandmark *landmark)
492 g_return_val_if_fail (landmark, NULL);
494 LocationLandmark *new_landmark = location_landmark_new();
495 if (!new_landmark) return NULL;
497 location_landmark_set_id(new_landmark, location_landmark_get_id(landmark));
498 location_landmark_set_name (new_landmark, location_landmark_get_name (landmark));
499 location_landmark_set_position (new_landmark, location_landmark_get_position(landmark));
500 location_landmark_set_address (new_landmark, location_landmark_get_address (landmark));
501 location_landmark_set_description (new_landmark, location_landmark_get_description(landmark));
502 location_landmark_set_timestamp (new_landmark, location_landmark_get_timestamp(landmark));
503 location_landmark_set_priority (new_landmark, location_landmark_get_priority(landmark));
504 location_landmark_set_bounding_box (new_landmark, location_landmark_get_bounding_box(landmark));
505 location_landmark_set_author (new_landmark, location_landmark_get_author(landmark));
506 location_landmark_set_url(new_landmark, location_landmark_get_url(landmark));
512 location_landmark_free (LocationLandmark *landmark)
514 g_return_if_fail (landmark);
516 location_landmark_set_id(landmark, 0);
517 location_landmark_set_name (landmark, NULL);
518 location_landmark_set_position (landmark, NULL);
519 location_landmark_set_address (landmark, NULL);
520 location_landmark_set_description (landmark, NULL);
521 location_landmark_set_timestamp (landmark, 0);
522 location_landmark_set_priority (landmark, 0);
523 location_landmark_set_bounding_box (landmark, NULL);
524 location_landmark_set_author (landmark, NULL);
525 location_landmark_set_url(landmark, NULL);
527 g_slice_free (LocationLandmark, landmark);