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.
27 #include <decarta_types.h>
29 EXPORT_API DecartaPosition *
30 decarta_position_new (double latitude,
33 DecartaPosition *pos = g_new0 (DecartaPosition, 1);
34 pos->latitude = latitude;
35 pos->longitude = longitude;
39 EXPORT_API DecartaPosition *
40 decarta_position_copy (const DecartaPosition *pos)
42 g_return_val_if_fail (pos, NULL);
43 return decarta_position_new (pos->latitude, pos->longitude);
47 decarta_position_free (DecartaPosition *pos)
49 g_return_if_fail (pos);
54 _position_list_free_gfunc (gpointer data,
57 DecartaPosition* pos = (DecartaPosition*)data;
58 decarta_position_free (pos);
62 decarta_position_list_append (GList *pos_list, DecartaPosition *pos)
64 g_return_val_if_fail (pos, NULL);
65 return g_list_append (pos_list, (gpointer)pos);
69 decarta_position_list_free (GList *pos_list)
71 g_return_if_fail (pos_list);
72 g_list_foreach(pos_list, (GFunc)_position_list_free_gfunc, NULL);
73 g_list_free (pos_list);
77 decarta_position_list_next (const GList *pos_list,
78 const DecartaPosition ** pos)
80 g_return_val_if_fail (pos_list, NULL);
81 g_return_val_if_fail (pos, NULL);
82 *pos = (DecartaPosition*)pos_list->data;
83 return g_list_next (pos_list);
87 decarta_position_list_copy (const GList *pos_list)
89 g_return_val_if_fail (pos_list, NULL);
90 GList *dup_pos_list = NULL;
91 const DecartaPosition *pos = NULL;
92 pos_list = decarta_position_list_next(pos_list, &pos);
94 dup_pos_list = decarta_position_list_append (dup_pos_list, decarta_position_copy (pos));
96 pos_list = decarta_position_list_next(pos_list, &pos);
101 EXPORT_API DecartaFormedAddress *
102 decarta_formed_address_new (const char *street_number,
103 const char *street_name,
107 const char *district,
108 const char* postal_code,
109 const char* landmark_type,
110 const char* landmark_name)
112 DecartaFormedAddress *formed_addr = g_new0 (DecartaFormedAddress, 1 );
113 formed_addr->street_number = g_strdup (street_number);
114 formed_addr->street_name = g_strdup (street_name);
115 formed_addr->state = g_strdup (state);
116 formed_addr->county = g_strdup (county);
117 formed_addr->city = g_strdup (city);
118 formed_addr->district = g_strdup (district);
119 formed_addr->postal_code = g_strdup (postal_code);
120 formed_addr->landmark_type = g_strdup (landmark_type);
121 formed_addr->landmark_name = g_strdup (landmark_name);
126 decarta_formed_address_free (DecartaFormedAddress *formed_addr)
128 g_return_if_fail (formed_addr);
129 g_free(formed_addr->street_number);
130 g_free(formed_addr->street_name);
131 g_free(formed_addr->state);
132 g_free(formed_addr->county);
133 g_free(formed_addr->city );
134 g_free(formed_addr->district);
135 g_free(formed_addr->postal_code);
136 g_free(formed_addr->landmark_type);
137 g_free(formed_addr->landmark_name);
141 EXPORT_API DecartaFormedAddress *
142 decarta_formed_address_copy (const DecartaFormedAddress *formed_addr)
144 g_return_val_if_fail (formed_addr, NULL);
145 return decarta_formed_address_new (formed_addr->street_number, formed_addr->street_name, formed_addr->state, formed_addr->county, formed_addr->city, formed_addr->district, formed_addr->postal_code, formed_addr->landmark_type, formed_addr->landmark_name);
148 EXPORT_API DecartaAddress *
149 decarta_address_new (const char* country_code,
150 const char *language_code,
151 gboolean is_freerorm,
152 const char *freeform_address,
153 const DecartaFormedAddress *formed_addr)
155 DecartaAddress *addr = g_new0 (DecartaAddress, 1 );
156 addr->country_code = g_strdup (country_code);
157 addr->language_code = g_strdup (language_code);
158 addr->is_freerorm = is_freerorm;
159 if (addr->is_freerorm) addr->freeform_address = g_strdup (freeform_address);
160 else addr->formed_addr = decarta_formed_address_copy (formed_addr);
165 decarta_address_free (DecartaAddress *addr)
167 g_return_if_fail (addr);
168 g_free(addr->country_code);
169 g_free(addr->language_code);
170 if (addr->is_freerorm) g_free (addr->freeform_address);
171 else decarta_formed_address_free (addr->formed_addr);
175 EXPORT_API DecartaBoundary *
176 decarta_boundary_new_for_rect (DecartaPosition* left_top,
177 DecartaPosition* right_bottom)
179 g_return_val_if_fail(left_top, NULL);
180 g_return_val_if_fail(right_bottom, NULL);
182 gdouble lon_interval = right_bottom->longitude - left_top->longitude;
184 if(lon_interval < 180 && lon_interval > -180) {
185 if(right_bottom->longitude <= left_top->longitude || right_bottom->latitude >= left_top->latitude)
189 if(right_bottom->longitude >= left_top->longitude || right_bottom->latitude >= left_top->latitude)
193 DecartaBoundary* boundary = g_slice_new0 (DecartaBoundary);
194 boundary->type = DECARTA_BOUNDARY_RECT;
195 boundary->rect.left_top = decarta_position_copy(left_top);
196 boundary->rect.right_bottom = decarta_position_copy(right_bottom);
200 EXPORT_API DecartaBoundary *
201 decarta_boundary_new_for_circle (DecartaPosition* center,
204 g_return_val_if_fail(center, NULL);
205 g_return_val_if_fail(radius > 0, NULL);
206 DecartaBoundary* boundary = g_slice_new0 (DecartaBoundary);
207 boundary->type = DECARTA_BOUNDARY_CIRCLE;
208 boundary->circle.center = decarta_position_copy(center);
209 boundary->circle.radius = radius;
213 static void __decarta_append_polygon_position(gpointer data, gpointer user_data)
215 g_return_if_fail(data);
216 g_return_if_fail(user_data);
218 DecartaBoundary* boundary = (DecartaBoundary*)user_data;
219 DecartaPosition* position = (DecartaPosition *)data;
220 DecartaPosition* new_position = decarta_position_copy(position);
222 boundary->polygon.position_list = g_list_append(boundary->polygon.position_list, new_position);
226 EXPORT_API DecartaBoundary *
227 decarta_boundary_new_for_polygon(GList *position_list)
229 g_return_val_if_fail(position_list, NULL);
230 g_return_val_if_fail(g_list_length(position_list) > 2, NULL);
232 DecartaBoundary *boundary = g_slice_new0 (DecartaBoundary);
234 g_list_foreach(position_list, (GFunc)__decarta_append_polygon_position, boundary);
235 boundary->type = DECARTA_BOUNDARY_POLYGON;
236 boundary->polygon.position_list = g_list_first(boundary->polygon.position_list);
241 static void __decarta_free_polygon_position(gpointer data)
243 g_return_if_fail(data);
245 DecartaPosition* position = (DecartaPosition *)data;
246 decarta_position_free(position);
250 decarta_boundary_free (DecartaBoundary* boundary)
252 g_return_if_fail(boundary);
254 if (boundary->type == DECARTA_BOUNDARY_RECT) {
255 decarta_position_free(boundary->rect.left_top);
256 decarta_position_free(boundary->rect.right_bottom);
257 } else if (boundary->type == DECARTA_BOUNDARY_CIRCLE) {
258 decarta_position_free(boundary->circle.center);
259 } else if (boundary->type == DECARTA_BOUNDARY_POLYGON) {
260 g_list_free_full(boundary->polygon.position_list, (GDestroyNotify)__decarta_free_polygon_position);
262 g_slice_free(DecartaBoundary, boundary);
265 EXPORT_API DecartaBoundary*
266 decarta_boundary_copy (const DecartaBoundary* boundary)
268 g_return_val_if_fail(boundary, NULL);
269 if (boundary->type == DECARTA_BOUNDARY_RECT) {
270 return decarta_boundary_new_for_rect(boundary->rect.left_top, boundary->rect.right_bottom);
271 } else if (boundary->type == DECARTA_BOUNDARY_CIRCLE) {
272 return decarta_boundary_new_for_circle(boundary->circle.center, boundary->circle.radius);
273 } else if (boundary->type == DECARTA_BOUNDARY_POLYGON) {
274 return decarta_boundary_new_for_polygon(boundary->polygon.position_list);
280 decarta_boundary_if_inside (DecartaBoundary* boundary,
281 const DecartaPosition* position)
283 g_return_val_if_fail(boundary, FALSE);
284 g_return_val_if_fail(position, FALSE);
286 gboolean is_inside = FALSE;
288 switch(boundary->type) {
290 case DECARTA_BOUNDARY_RECT: {
291 gdouble y = position->latitude;
292 gdouble x = position->longitude;
294 gdouble lt_y = boundary->rect.left_top->latitude;
295 gdouble lt_x = boundary->rect.left_top->longitude;
296 gdouble rb_y = boundary->rect.right_bottom->latitude;
297 gdouble rb_x = boundary->rect.right_bottom->longitude;
299 if (lt_x - rb_x < 180 && lt_x - rb_x > -180) {
300 if ((rb_y < y && y < lt_y) && ( lt_x < x && x < rb_x)) {
305 if ((rb_y < y && y < lt_y) && ( lt_x < x || x < rb_x)) {
311 case DECARTA_BOUNDARY_CIRCLE: {
314 case DECARTA_BOUNDARY_POLYGON: {
326 EXPORT_API DecartaAddress *
327 decarta_addr_copy (const DecartaAddress *addr)
329 g_return_val_if_fail(addr, NULL);
330 return decarta_address_new (addr->country_code, addr->language_code, addr->is_freerorm, addr->freeform_address, addr->formed_addr);
333 EXPORT_API DecartaPOI *
334 decarta_poi_new (const char *name,
336 const char* phone_number,
337 const DecartaPOIInfoTable* info_list,
338 const DecartaPosition *pos,
339 const DecartaAddress *addr,
342 DecartaPOI *poi = g_new0 (DecartaPOI, 1 );
343 poi->name = g_strdup (name);
344 poi->id = g_strdup (id);
345 poi->phone_number = g_strdup (phone_number);
346 poi->info_list = decarta_poi_info_table_copy (info_list);
347 poi->pos = decarta_position_copy (pos);
348 poi->addr = decarta_addr_copy (addr);
349 poi->distance = distance;
354 decarta_poi_free (DecartaPOI *poi)
356 g_return_if_fail (poi);
359 g_free (poi->phone_number);
360 decarta_poi_info_table_free (poi->info_list);
361 decarta_address_free (poi->addr);
365 EXPORT_API DecartaPOI *
366 decarta_poi_copy (const DecartaPOI *poi)
368 g_return_val_if_fail(poi, NULL);
369 return decarta_poi_new (poi->name, poi->id, poi->phone_number, poi->info_list, poi->pos, poi->addr, poi->distance);
373 _poi_list_free_gfunc (gpointer data,
376 DecartaPOI* poi = (DecartaPOI*)data;
377 decarta_poi_free (poi);
381 decarta_poi_list_append (GList *poi_list, DecartaPOI *poi)
383 g_return_val_if_fail (poi, NULL);
384 return g_list_append (poi_list, (gpointer)poi);
387 EXPORT_API void decarta_poi_list_free (GList *poi_list)
389 g_return_if_fail (poi_list);
390 g_list_foreach(poi_list, (GFunc)_poi_list_free_gfunc, NULL);
391 g_list_free (poi_list);
395 decarta_poi_list_next (const GList *poi_list,
396 const DecartaPOI** poi)
398 g_return_val_if_fail (poi_list, NULL);
399 g_return_val_if_fail (poi, NULL);
400 *poi = (DecartaPOI*)poi_list->data;
401 return g_list_next (poi_list);
405 decarta_poi_list_copy (const GList *poi_list)
407 g_return_val_if_fail (poi_list, NULL);
408 GList *dup_poi_list = NULL;
409 const DecartaPOI *poi = NULL;
410 poi_list = decarta_poi_list_next(poi_list, &poi);
412 dup_poi_list = g_list_append (dup_poi_list, decarta_poi_copy (poi));
413 if (!poi_list) break;
414 poi_list = decarta_poi_list_next(poi_list, &poi);
419 EXPORT_API DecartaPOIInfoTable *
420 decarta_poi_info_table_new (void)
422 DecartaPOIInfoTable *info_list = g_new0 (DecartaPOIInfoTable, 1);
423 info_list->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
428 decarta_poi_info_table_free (DecartaPOIInfoTable* poi_info_list)
430 g_return_if_fail(poi_info_list);
431 g_return_if_fail(poi_info_list->table);
432 g_hash_table_destroy(poi_info_list->table);
433 g_free (poi_info_list);
437 decarta_poi_info_table_insert (DecartaPOIInfoTable* poi_info_list,
441 g_return_val_if_fail(poi_info_list, FALSE);
442 g_return_val_if_fail(poi_info_list->table, FALSE);
443 g_hash_table_insert (poi_info_list->table, g_strdup(name), g_strdup(value));
448 decarta_poi_info_table_iter_init (DecartaPOIInfoTable* poi_info_list)
450 g_return_val_if_fail(poi_info_list, FALSE);
451 g_return_val_if_fail(poi_info_list->table, FALSE);
452 g_hash_table_iter_init (&poi_info_list->iter, poi_info_list->table);
457 decarta_poi_info_list_table_next (DecartaPOIInfoTable* poi_info_list,
461 g_return_val_if_fail(poi_info_list, FALSE);
462 g_return_val_if_fail(poi_info_list->table, FALSE);
463 return g_hash_table_iter_next (&poi_info_list->iter, (gpointer*)name, (gpointer*)value);
467 copy_poi_info_table_func (gchar *key,
469 DecartaPOIInfoTable *dup)
471 g_return_if_fail (dup);
472 decarta_poi_info_table_insert(dup, key, value);
475 EXPORT_API DecartaPOIInfoTable *
476 decarta_poi_info_table_copy (const DecartaPOIInfoTable *poi_info_list)
478 g_return_val_if_fail(poi_info_list, NULL);
479 DecartaPOIInfoTable *dup = decarta_poi_info_table_new ();
480 g_hash_table_foreach (poi_info_list->table,
481 (GHFunc)copy_poi_info_table_func,
486 EXPORT_API DecartaPOIProperty *
487 decarta_poi_property_new (const char* poi_name,
491 const char* description,
494 DecartaPOIProperty *property = g_new0 (DecartaPOIProperty, 1 );
495 property->poi_name = g_strdup(poi_name);
496 property->keyword = g_strdup(keyword);
497 property->brand = g_strdup(brand);
498 property->type = g_strdup(type);
499 property->description = g_strdup(description);
500 property->URL = g_strdup(URL);
505 decarta_poi_property_free (DecartaPOIProperty *property)
507 g_return_if_fail (property);
508 g_free (property->poi_name);
509 g_free (property->keyword);
510 g_free (property->brand);
511 g_free (property->type);
512 g_free (property->description);
513 g_free (property->URL);
517 EXPORT_API DecartaPOIProperty *
518 decarta_poi_property_copy (const DecartaPOIProperty *property)
520 g_return_val_if_fail(property, NULL);
521 return decarta_poi_property_new (property->poi_name, property->keyword, property->brand, property->type, property->description, property->URL);
525 EXPORT_API DecartaPOIPreference *
526 decarta_poi_preference_new (guint max_result_cnt,
527 DecartaPOIPrefSortOrder sort_order,
530 DecartaPOIPreference *pref = g_new0 (DecartaPOIPreference, 1 );
531 pref->max_result_cnt = max_result_cnt;
532 pref->sort_order = sort_order;
533 pref->item = g_strdup(item);
538 decarta_poi_preference_free (DecartaPOIPreference *preference)
540 g_return_if_fail (preference);
541 g_free (preference->item);
545 EXPORT_API DecartaPOIPreference *
546 decarta_poi_preference_copy (const DecartaPOIPreference *preference)
548 g_return_val_if_fail(preference, NULL);
549 //When decarta_directory_request_new() was call without item, it reaturns fail.
550 //g_return_val_if_fail(preference->item, NULL);
551 return decarta_poi_preference_new(preference->max_result_cnt, preference->sort_order, preference->item);
554 EXPORT_API DecartaGeocode *
555 decarta_geocode_new (const DecartaPosition *pos,
556 const DecartaAddress *addr)
558 DecartaGeocode *geocode = g_new0 (DecartaGeocode, 1);
559 if (pos) geocode->pos = decarta_position_copy (pos);
560 if (addr) geocode->addr = decarta_addr_copy (addr);
564 EXPORT_API DecartaGeocode *
565 decarta_geocode_copy (const DecartaGeocode *geocode)
567 g_return_val_if_fail (geocode, NULL);
568 return decarta_geocode_new (geocode->pos, geocode->addr);
572 decarta_geocode_free (DecartaGeocode *geocode)
574 g_return_if_fail (geocode);
575 if (geocode->pos) decarta_position_free (geocode->pos);
576 if (geocode->addr) decarta_address_free (geocode->addr);
581 _geocode_list_free_gfunc (gpointer data,
584 DecartaGeocode* geocode = (DecartaGeocode*)data;
585 decarta_geocode_free (geocode);
589 decarta_geocode_list_append (GList *geocode_list, DecartaGeocode *geocode)
591 g_return_val_if_fail (geocode, NULL);
592 return g_list_append (geocode_list, (gpointer)geocode);
596 void decarta_geocode_list_free (GList *geocode_list)
598 g_return_if_fail (geocode_list);
599 g_list_foreach(geocode_list, (GFunc)_geocode_list_free_gfunc, NULL);
600 g_list_free (geocode_list);
604 decarta_geocode_list_next (const GList *geocode_list,
605 const DecartaGeocode **geocode)
607 g_return_val_if_fail (geocode_list, NULL);
608 g_return_val_if_fail (geocode, NULL);
609 *geocode = (DecartaGeocode*)geocode_list->data;
610 return g_list_next (geocode_list);
614 decarta_geocode_list_copy (const GList *geocode_list)
616 g_return_val_if_fail (geocode_list, NULL);
617 GList *dup_geocode_list = NULL;
618 const DecartaGeocode *geocode = NULL;
619 geocode_list = decarta_geocode_list_next(geocode_list, &geocode);
621 dup_geocode_list = g_list_append (dup_geocode_list, decarta_geocode_copy (geocode));
622 if (!geocode_list) break;
623 geocode_list = decarta_geocode_list_next(geocode_list, &geocode);
625 return dup_geocode_list;
628 EXPORT_API DecartaMap *
629 decarta_map_new (const DecartaPosition *center,
630 const DecartaPosition *box_corner1,
631 const DecartaPosition *box_corner2,
632 const char *tile_url,
635 DecartaMap *map = g_new0 (DecartaMap, 1);
636 if (center) map->center = decarta_position_copy (center);
637 if (box_corner1) map->box_corner1 = decarta_position_copy (box_corner1);
638 if (box_corner2) map->box_corner2 = decarta_position_copy (box_corner2);
639 if (tile_url) map->tile_url = g_strdup (tile_url);
640 map->radius = radius;
644 EXPORT_API DecartaMap *
645 decarta_map_copy (const DecartaMap *map)
647 g_return_val_if_fail (map, NULL);
648 return decarta_map_new (map->center, map->box_corner1, map->box_corner2, map->tile_url, map->radius);
652 decarta_map_free (DecartaMap *map)
654 g_return_if_fail (map);
655 if (map->center) decarta_position_free (map->center);
656 if (map->box_corner1) decarta_position_free (map->box_corner1);
657 if (map->box_corner2) decarta_position_free (map->box_corner2);
658 if (map->tile_url) g_free (map->tile_url);
663 _map_list_free_gfunc (gpointer data,
666 DecartaMap* map = (DecartaMap*)data;
667 decarta_map_free (map);
671 decarta_map_list_append (GList *map_list, DecartaMap *map)
673 g_return_val_if_fail (map, NULL);
674 return g_list_append (map_list, (gpointer)map);
678 decarta_map_list_free (GList *map_list)
680 g_return_if_fail (map_list);
681 g_list_foreach(map_list, (GFunc)_map_list_free_gfunc, NULL);
682 g_list_free (map_list);
686 decarta_map_list_next (const GList *map_list,
687 const DecartaMap** map)
689 g_return_val_if_fail (map_list, NULL);
690 g_return_val_if_fail (map, NULL);
691 *map = (DecartaMap*)map_list->data;
692 return g_list_next (map_list);
696 decarta_map_list_copy (const GList *map_list)
698 g_return_val_if_fail (map_list, NULL);
699 GList *dup_map_list = NULL;
700 const DecartaMap *map = NULL;
701 map_list = decarta_map_list_next(map_list, &map);
703 dup_map_list = g_list_append (dup_map_list, decarta_map_copy (map));
704 if (!map_list) break;
705 map_list = decarta_map_list_next(map_list, &map);
710 EXPORT_API DecartaRoute *
711 decarta_route_new (const GList *start_geo_list, const GList *end_geo_list,
712 unsigned int total_time,
713 double total_distance,
714 const DecartaPosition *box_corner1, const DecartaPosition *box_corner2,
715 const DecartaMap *overview,
716 const GList *line_pos_list,
717 const GList *instructions_list)
719 DecartaRoute *route = g_new0 (DecartaRoute, 1);
720 if (start_geo_list) route->start_geo_list = decarta_geocode_list_copy (start_geo_list);
721 if (end_geo_list) route->end_geo_list = decarta_geocode_list_copy (end_geo_list);
722 route->total_time = total_time;
723 route->total_distance = total_distance;
724 if (box_corner1) route->box_corner1 = decarta_position_copy (box_corner1);
725 if (box_corner2) route->box_corner2 = decarta_position_copy (box_corner2);
726 if (overview) route->overview = decarta_map_copy (overview);
727 if (line_pos_list) route->line_pos_list = decarta_position_list_copy (line_pos_list);
728 if (instructions_list) route->instructions_list = decarta_route_instructions_list_copy (instructions_list);
732 EXPORT_API DecartaRoute *
733 decarta_route_copy (const DecartaRoute *route)
735 g_return_val_if_fail (route, NULL);
736 return decarta_route_new (route->start_geo_list, route->end_geo_list,
737 route->total_time, route->total_distance,
738 route->box_corner1, route->box_corner2, route->overview,
739 route->line_pos_list, route->instructions_list);
743 decarta_route_free (DecartaRoute *route)
745 g_return_if_fail (route);
746 if (route->start_geo_list) decarta_geocode_list_free (route->start_geo_list);
747 if (route->end_geo_list) decarta_geocode_list_free (route->end_geo_list);
748 if (route->box_corner1) decarta_position_free (route->box_corner1);
749 if (route->box_corner2) decarta_position_free (route->box_corner2);
750 if (route->line_pos_list) decarta_position_list_free (route->line_pos_list);
751 if (route->overview) decarta_map_free (route->overview);
752 if (route->instructions_list) decarta_route_instructions_list_free (route->instructions_list);
757 EXPORT_API DecartaRouteInstructions*
758 decarta_route_instructions_new (const char *tour,
759 unsigned int duration,
761 const char *instruction,
762 const DecartaMap *map)
764 DecartaRouteInstructions *route_inst = g_new0 (DecartaRouteInstructions, 1);
765 if (tour) route_inst->tour = g_strdup (tour);
766 route_inst->duration = duration;
767 route_inst->distance = distance;
768 if (instruction) route_inst->instruction = g_strdup (instruction);
769 if (map) route_inst->map = decarta_map_copy (map);
773 EXPORT_API DecartaRouteInstructions *
774 decarta_route_instructions_copy (const DecartaRouteInstructions *route_inst)
776 g_return_val_if_fail (route_inst, NULL);
777 return decarta_route_instructions_new (route_inst->tour, route_inst->duration,
778 route_inst->distance, route_inst->instruction, route_inst->map);
782 decarta_route_instructions_free (DecartaRouteInstructions *route_inst)
784 g_return_if_fail (route_inst);
785 g_free (route_inst->tour);
786 g_free (route_inst->instruction);
787 decarta_map_free (route_inst->map);
792 _route_instructions_list_free_gfunc (gpointer data,
795 DecartaRouteInstructions* route_inst = (DecartaRouteInstructions*)data;
796 decarta_route_instructions_free (route_inst);
800 decarta_route_instructions_list_append (GList *route_inst_list, DecartaRouteInstructions *route_inst)
802 g_return_val_if_fail (route_inst, NULL);
803 return g_list_append (route_inst_list, (gpointer)route_inst);
807 decarta_route_instructions_list_free (GList *route_inst_list)
809 g_return_if_fail (route_inst_list);
810 g_list_foreach(route_inst_list, (GFunc)_route_instructions_list_free_gfunc, NULL);
811 g_list_free (route_inst_list);
815 decarta_route_instructions_list_next (const GList *route_inst_list,
816 const DecartaRouteInstructions** route_inst)
818 g_return_val_if_fail (route_inst_list, NULL);
819 g_return_val_if_fail (route_inst, NULL);
820 *route_inst = (DecartaRouteInstructions*)route_inst_list->data;
821 return g_list_next (route_inst_list);
825 decarta_route_instructions_list_copy (const GList *route_inst_list)
827 g_return_val_if_fail (route_inst_list, NULL);
828 GList *dup_route_inst_list = NULL;
829 const DecartaRouteInstructions *route_inst = NULL;
830 route_inst_list = decarta_route_instructions_list_next(route_inst_list, &route_inst);
832 dup_route_inst_list = g_list_append (dup_route_inst_list, decarta_route_instructions_copy (route_inst));
833 if (!route_inst_list) break;
834 route_inst_list = decarta_route_instructions_list_next(route_inst_list, &route_inst);
836 return dup_route_inst_list;
839 EXPORT_API DecartaDirectoryRequest *
840 decarta_directory_request_new (const DecartaPOIPreference *pref,
841 DecartaDirectorySearchType search_type,
842 DecartaDirectoryType type,
843 const DecartaPosition *pos,
844 const DecartaAddress *addr,
845 const DecartaBoundary *bound,
846 const DecartaPOIProperty *property,
850 DecartaDirectoryRequest* request = g_new0 (DecartaDirectoryRequest, 1);
851 request->search_type = search_type;
852 request->type = type;
853 if (type == DECARTA_DIRECTORY_TYPE_POS) request->pos = decarta_position_copy (pos);
854 else if (type == DECARTA_DIRECTORY_TYPE_ADDRESS) request->addr = decarta_addr_copy (addr);
855 else if (type == DECARTA_DIRECTORY_TYPE_BOUNDARY) request->boundary = decarta_boundary_copy (bound);
857 request->property = decarta_poi_property_copy (property);
858 request->distance = distance;
859 request->pref = decarta_poi_preference_copy(pref);
860 if (!request->pref->item) request->pref->item = g_strdup("Distance"); //Distance is default.
862 request->request_id = request_id;
867 decarta_directory_request_free (DecartaDirectoryRequest *request)
869 g_return_if_fail (request);
870 if (request->type == DECARTA_DIRECTORY_TYPE_POS) decarta_position_free (request->pos);
871 else if (request->type == DECARTA_DIRECTORY_TYPE_ADDRESS) decarta_address_free (request->addr);
872 else if (request->type == DECARTA_DIRECTORY_TYPE_BOUNDARY) decarta_boundary_free(request->boundary);
873 decarta_poi_property_free (request->property);
874 decarta_poi_preference_free(request->pref);
878 EXPORT_API DecartaDirectoryRequest *
879 decarta_directory_request_copy (const DecartaDirectoryRequest *request)
881 g_return_val_if_fail (request, NULL);
882 return decarta_directory_request_new (request->pref, request->search_type, request->type, request->pos, request->addr, request->boundary, request->property, request->distance, request->request_id);
885 EXPORT_API DecartaRouteRequest *
886 decarta_route_request_new (DecartaRoutePreference pref,
887 const DecartaGeocode *start, const DecartaGeocode *end,
888 const GList *via_geocode_list,
890 gboolean instructions_map_needed,
891 gboolean bbox_needed,
892 const DecartaPosition *bbox_pos1,
893 const DecartaPosition *bbox_pos2,
894 gboolean resolution_needed,
898 char *dist_unit, char *rules)
900 g_return_val_if_fail (start, NULL);
901 g_return_val_if_fail (end, NULL);
902 g_return_val_if_fail (dist_unit, NULL);
903 DecartaRouteRequest *route_req = g_new0 (DecartaRouteRequest, 1);
904 route_req->pref = pref;
905 route_req->start = decarta_geocode_copy (start);
906 route_req->end = decarta_geocode_copy (end);
907 if (route_req->via_geocode_list) route_req->via_geocode_list = decarta_geocode_list_copy (via_geocode_list);
908 route_req->pos_needed = pos_needed;
909 route_req->instructions_map_needed = instructions_map_needed;
910 route_req->request_id = request_id;
912 route_req->bbox_needed = bbox_needed;
913 route_req->bbox_pos1 = decarta_position_copy(bbox_pos1);
914 route_req->bbox_pos2 = decarta_position_copy(bbox_pos2);
915 route_req->resolution_needed = resolution_needed;
916 route_req->resolution = resolution;
917 route_req->VR_needed = VR_needed;
919 route_req->dist_unit = g_strdup(dist_unit);
920 route_req->rules = g_strdup(rules);
924 EXPORT_API DecartaRouteRequest *
925 decarta_route_request_copy (const DecartaRouteRequest *route_req)
927 g_return_val_if_fail (route_req, NULL);
928 return decarta_route_request_new (route_req->pref, route_req->start, route_req->end,
929 route_req->via_geocode_list, route_req->pos_needed, route_req->instructions_map_needed,
930 route_req->bbox_needed, route_req->bbox_pos1, route_req->bbox_pos2,
931 route_req->resolution_needed, route_req->resolution, route_req->VR_needed, route_req->request_id,
932 route_req->dist_unit, route_req->rules);
936 decarta_route_request_free (DecartaRouteRequest *route_req)
938 g_return_if_fail (route_req);
939 if (route_req->start) decarta_geocode_free (route_req->start);
940 if (route_req->end) decarta_geocode_free (route_req->end);
941 if (route_req->via_geocode_list) decarta_geocode_list_free (route_req->via_geocode_list);
942 if (route_req->bbox_pos1) decarta_position_free (route_req->bbox_pos1);
943 if (route_req->bbox_pos2) decarta_position_free (route_req->bbox_pos2);
944 g_free (route_req->dist_unit);
945 g_free (route_req->rules);