1 /* Copyright (c) 2010-2014 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "maps_error.h"
19 #include "maps_plugin_types.h"
20 #include "maps_address.h"
21 #include "maps_util.h"
22 #include "maps_condition.h"
25 * This represents address information such as building number,
28 typedef struct _maps_address_s
30 char *building_number; /**< Building number. */
31 char *street; /**< Full street name. */
32 char *district; /**< Municipal district name. */
33 char *city; /**< City name. */
34 char *state; /**< State or province region
36 char *country_code; /**< Country name. */
37 char *postal_code; /**< Postal delivery code. */
38 char *freetext; /**<freeform address input */
39 char *country; /**<country name */
40 char *county; /**<county name */
43 const gsize _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH = 32;
44 const gsize _MAPS_ADDRESS_STREET_MAX_LENGTH = 256;
45 const gsize _MAPS_ADDRESS_DISTRICT_MAX_LENGTH = 128;
46 const gsize _MAPS_ADDRESS_CITY_MAX_LENGTH = 256;
47 const gsize _MAPS_ADDRESS_STATE_MAX_LENGTH = 256;
48 const gsize _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH = 32;
49 const gsize _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH = 32;
50 const gsize _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH = 1024;
51 const gsize _MAPS_ADDRESS_COUNTRY_MAX_LENGTH = 128;
52 const gsize _MAPS_ADDRESS_COUNTY_MAX_LENGTH = 128;
54 /*----------------------------------------------------------------------------*/
56 EXPORT_API int maps_address_create(maps_address_h *address)
58 if (!maps_condition_check_maps_feature())
59 return MAPS_ERROR_NOT_SUPPORTED;
61 return MAPS_ERROR_INVALID_PARAMETER;
63 maps_address_s *a = g_new0(maps_address_s, 1);
66 MAPS_LOGE("OUT_OF_MEMORY(0x%08x)", MAPS_ERROR_OUT_OF_MEMORY);
67 return MAPS_ERROR_OUT_OF_MEMORY;
71 *address = (maps_address_h) a;
72 return MAPS_ERROR_NONE;
75 EXPORT_API int maps_address_destroy(maps_address_h address)
77 if (!maps_condition_check_maps_feature())
78 return MAPS_ERROR_NOT_SUPPORTED;
80 return MAPS_ERROR_INVALID_PARAMETER;
82 maps_address_s *a = (maps_address_s *) address;
84 if (a->building_number)
85 g_free(a->building_number);
95 g_free(a->country_code);
97 g_free(a->postal_code);
108 return MAPS_ERROR_NONE;
111 EXPORT_API int maps_address_clone(const maps_address_h origin,
112 maps_address_h *cloned)
114 if (!maps_condition_check_maps_feature())
115 return MAPS_ERROR_NOT_SUPPORTED;
116 if (!cloned || !origin)
117 return MAPS_ERROR_INVALID_PARAMETER;
119 int error = MAPS_ERROR_NONE;
121 error = maps_address_create(cloned);
122 if (!(*cloned) || (error != MAPS_ERROR_NONE))
125 maps_address_s *a = (maps_address_s *) origin;
127 if (a->building_number) {
128 error = maps_address_set_building_number(*cloned,
130 if (error != MAPS_ERROR_NONE)
135 error = maps_address_set_street(*cloned, a->street);
136 if (error != MAPS_ERROR_NONE)
141 error = maps_address_set_district(*cloned, a->district);
142 if (error != MAPS_ERROR_NONE)
147 error = maps_address_set_city(*cloned, a->city);
148 if (error != MAPS_ERROR_NONE)
153 error = maps_address_set_state(*cloned, a->state);
154 if (error != MAPS_ERROR_NONE)
158 if (a->country_code) {
159 error = maps_address_set_country_code(*cloned,
161 if (error != MAPS_ERROR_NONE)
165 if (a->postal_code) {
166 error = maps_address_set_postal_code(*cloned,
168 if (error != MAPS_ERROR_NONE)
173 error = maps_address_set_freetext(*cloned, a->freetext);
174 if (error != MAPS_ERROR_NONE)
179 error = maps_address_set_country(*cloned, a->country);
180 if (error != MAPS_ERROR_NONE)
185 error = maps_address_set_county(*cloned, a->county);
186 if (error != MAPS_ERROR_NONE)
190 return MAPS_ERROR_NONE;
194 maps_address_destroy(*cloned);
200 /*----------------------------------------------------------------------------*/
202 EXPORT_API int maps_address_get_building_number(const maps_address_h address,
203 char **building_number)
205 if (!maps_condition_check_maps_feature())
206 return MAPS_ERROR_NOT_SUPPORTED;
207 if (!address || !building_number)
208 return MAPS_ERROR_INVALID_PARAMETER;
209 return maps_get_string(((maps_address_s *) address)->building_number,
210 _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH, building_number);
213 EXPORT_API int maps_address_get_street(const maps_address_h address,
216 if (!maps_condition_check_maps_feature())
217 return MAPS_ERROR_NOT_SUPPORTED;
218 if (!address || !street)
219 return MAPS_ERROR_INVALID_PARAMETER;
220 return maps_get_string(((maps_address_s *) address)->street,
221 _MAPS_ADDRESS_STREET_MAX_LENGTH, street);
224 EXPORT_API int maps_address_get_district(const maps_address_h address,
227 if (!maps_condition_check_maps_feature())
228 return MAPS_ERROR_NOT_SUPPORTED;
229 if (!address || !district)
230 return MAPS_ERROR_INVALID_PARAMETER;
231 return maps_get_string(((maps_address_s *) address)->district,
232 _MAPS_ADDRESS_DISTRICT_MAX_LENGTH, district);
235 EXPORT_API int maps_address_get_city(const maps_address_h address, char **city)
237 if (!maps_condition_check_maps_feature())
238 return MAPS_ERROR_NOT_SUPPORTED;
239 if (!address || !city)
240 return MAPS_ERROR_INVALID_PARAMETER;
241 return maps_get_string(((maps_address_s *) address)->city,
242 _MAPS_ADDRESS_CITY_MAX_LENGTH, city);
245 EXPORT_API int maps_address_get_state(const maps_address_h address,
248 if (!maps_condition_check_maps_feature())
249 return MAPS_ERROR_NOT_SUPPORTED;
250 if (!address || !state)
251 return MAPS_ERROR_INVALID_PARAMETER;
252 return maps_get_string(((maps_address_s *) address)->state,
253 _MAPS_ADDRESS_STATE_MAX_LENGTH, state);
256 EXPORT_API int maps_address_get_country(const maps_address_h address,
259 if (!maps_condition_check_maps_feature())
260 return MAPS_ERROR_NOT_SUPPORTED;
261 if (!address || !country)
262 return MAPS_ERROR_INVALID_PARAMETER;
263 return maps_get_string(((maps_address_s *) address)->country,
264 _MAPS_ADDRESS_COUNTRY_MAX_LENGTH, country);
267 EXPORT_API int maps_address_get_country_code(const maps_address_h address,
270 if (!maps_condition_check_maps_feature())
271 return MAPS_ERROR_NOT_SUPPORTED;
272 if (!address || !country_code)
273 return MAPS_ERROR_INVALID_PARAMETER;
274 return maps_get_string(((maps_address_s *) address)->country_code,
275 _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH, country_code);
278 EXPORT_API int maps_address_get_county(const maps_address_h address,
281 if (!maps_condition_check_maps_feature())
282 return MAPS_ERROR_NOT_SUPPORTED;
283 if (!address || !county)
284 return MAPS_ERROR_INVALID_PARAMETER;
285 return maps_get_string(((maps_address_s *) address)->county,
286 _MAPS_ADDRESS_COUNTY_MAX_LENGTH, county);
289 EXPORT_API int maps_address_get_postal_code(const maps_address_h address,
292 if (!maps_condition_check_maps_feature())
293 return MAPS_ERROR_NOT_SUPPORTED;
294 if (!address || !postal_code)
295 return MAPS_ERROR_INVALID_PARAMETER;
296 return maps_get_string(((maps_address_s *) address)->postal_code,
297 _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH, postal_code);
300 EXPORT_API int maps_address_get_freetext(const maps_address_h address,
303 if (!maps_condition_check_maps_feature())
304 return MAPS_ERROR_NOT_SUPPORTED;
305 if (!address || !freetext)
306 return MAPS_ERROR_INVALID_PARAMETER;
307 return maps_get_string(((maps_address_s *) address)->freetext,
308 _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH, freetext);
311 /*----------------------------------------------------------------------------*/
313 EXPORT_API int maps_address_set_building_number(maps_address_h address,
314 const char *building_number)
316 if (!maps_condition_check_maps_feature())
317 return MAPS_ERROR_NOT_SUPPORTED;
318 if (!address || !building_number)
319 return MAPS_ERROR_INVALID_PARAMETER;
320 return maps_set_string(building_number,
321 _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH,
322 &((maps_address_s *) address)->building_number);
325 EXPORT_API int maps_address_set_street(maps_address_h address,
328 if (!maps_condition_check_maps_feature())
329 return MAPS_ERROR_NOT_SUPPORTED;
330 if (!address || !street)
331 return MAPS_ERROR_INVALID_PARAMETER;
332 return maps_set_string(street, _MAPS_ADDRESS_STREET_MAX_LENGTH,
333 &((maps_address_s *) address)->street);
336 EXPORT_API int maps_address_set_district(maps_address_h address,
337 const char *district)
339 if (!maps_condition_check_maps_feature())
340 return MAPS_ERROR_NOT_SUPPORTED;
341 if (!address || !district)
342 return MAPS_ERROR_INVALID_PARAMETER;
343 return maps_set_string(district, _MAPS_ADDRESS_DISTRICT_MAX_LENGTH,
344 &((maps_address_s *) address)->district);
347 EXPORT_API int maps_address_set_city(maps_address_h address, const char *city)
349 if (!maps_condition_check_maps_feature())
350 return MAPS_ERROR_NOT_SUPPORTED;
351 if (!address || !city)
352 return MAPS_ERROR_INVALID_PARAMETER;
353 return maps_set_string(city, _MAPS_ADDRESS_CITY_MAX_LENGTH,
354 &((maps_address_s *) address)->city);
357 EXPORT_API int maps_address_set_state(maps_address_h address, const char *state)
359 if (!maps_condition_check_maps_feature())
360 return MAPS_ERROR_NOT_SUPPORTED;
361 if (!address || !state)
362 return MAPS_ERROR_INVALID_PARAMETER;
363 return maps_set_string(state, _MAPS_ADDRESS_STATE_MAX_LENGTH,
364 &((maps_address_s *) address)->state);
367 EXPORT_API int maps_address_set_country(maps_address_h address,
370 if (!maps_condition_check_maps_feature())
371 return MAPS_ERROR_NOT_SUPPORTED;
372 if (!address || !country)
373 return MAPS_ERROR_INVALID_PARAMETER;
374 return maps_set_string(country, _MAPS_ADDRESS_COUNTRY_MAX_LENGTH,
375 &((maps_address_s *) address)->country);
378 EXPORT_API int maps_address_set_country_code(maps_address_h address,
379 const char *country_code)
381 if (!maps_condition_check_maps_feature())
382 return MAPS_ERROR_NOT_SUPPORTED;
383 if (!address || !country_code)
384 return MAPS_ERROR_INVALID_PARAMETER;
385 return maps_set_string(country_code,
386 _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH,
387 &((maps_address_s *) address)->country_code);
390 EXPORT_API int maps_address_set_county(maps_address_h address,
393 if (!maps_condition_check_maps_feature())
394 return MAPS_ERROR_NOT_SUPPORTED;
395 if (!address || !county)
396 return MAPS_ERROR_INVALID_PARAMETER;
397 return maps_set_string(county, _MAPS_ADDRESS_COUNTY_MAX_LENGTH,
398 &((maps_address_s *) address)->county);
401 EXPORT_API int maps_address_set_postal_code(maps_address_h address,
402 const char *postal_code)
404 if (!maps_condition_check_maps_feature())
405 return MAPS_ERROR_NOT_SUPPORTED;
406 if (!address || !postal_code)
407 return MAPS_ERROR_INVALID_PARAMETER;
408 return maps_set_string(postal_code,
409 _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH,
410 &((maps_address_s *) address)->postal_code);
413 EXPORT_API int maps_address_set_freetext(maps_address_h address,
414 const char *freetext)
416 if (!maps_condition_check_maps_feature())
417 return MAPS_ERROR_NOT_SUPPORTED;
418 if (!address || !freetext)
419 return MAPS_ERROR_INVALID_PARAMETER;
420 return maps_set_string(freetext, _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH,
421 &((maps_address_s *) address)->freetext);
428 EXPORT_API int maps_address_list_create(maps_address_list_h *address_list)
430 if (!maps_condition_check_maps_feature())
431 return MAPS_ERROR_NOT_SUPPORTED;
433 return MAPS_ERROR_INVALID_PARAMETER;
435 GList *list = g_list_alloc();
436 MAPS_CHECK_CONDITION(list, MAPS_ERROR_OUT_OF_MEMORY, "MAPS_ERROR_OUT_OF_MEMORY");
437 *address_list = (void *) list;
438 MAPS_LOGD("address_list: %p", list);
440 return MAPS_ERROR_NONE;
443 EXPORT_API int maps_address_list_append(maps_address_list_h address_list, maps_address_h address)
445 if (!maps_condition_check_maps_feature())
446 return MAPS_ERROR_NOT_SUPPORTED;
447 if (!address_list || !address)
448 return MAPS_ERROR_INVALID_PARAMETER;
450 GList *list = g_list_append((GList *)address_list, (gpointer) address);
451 MAPS_CHECK_CONDITION(list, MAPS_ERROR_OUT_OF_MEMORY, "MAPS_ERROR_OUT_OF_MEMORY");
454 return MAPS_ERROR_NONE;
457 EXPORT_API int maps_address_list_remove(maps_address_list_h address_list, maps_address_h address)
459 if (!maps_condition_check_maps_feature())
460 return MAPS_ERROR_NOT_SUPPORTED;
461 if (!address_list || !address)
462 return MAPS_ERROR_INVALID_PARAMETER;
464 GList *list = g_list_remove((GList *) address_list, (gpointer) address);
465 MAPS_CHECK_CONDITION(list, MAPS_ERROR_OUT_OF_MEMORY, "MAPS_ERROR_OUT_OF_MEMORY");
468 return MAPS_ERROR_NONE;
471 EXPORT_API int maps_address_list_get_length(maps_address_list_h address_list, int *length)
473 if (!maps_condition_check_maps_feature())
474 return MAPS_ERROR_NOT_SUPPORTED;
475 if (!address_list || !length)
476 return MAPS_ERROR_INVALID_PARAMETER;
478 *length = g_list_length((GList *)address_list) - 1;
480 return MAPS_ERROR_NONE;
483 EXPORT_API int maps_address_list_foreach(maps_address_list_h address_list, maps_address_cb callback, void *user_data)
485 if (!maps_condition_check_maps_feature())
486 return MAPS_ERROR_NOT_SUPPORTED;
487 if (!address_list || !callback)
488 return MAPS_ERROR_INVALID_PARAMETER;
493 GList *l = (GList *)address_list;
496 GList *next = l->next;
497 maps_address_s *address = (maps_address_s *)l->data;
500 int ret = callback(index++, address->country_code, address->country, addres->county, address->state,
501 address->city, address->district, addrss->street, address->building_number, address->freetext, user_data);
503 ret = callback(index++, address, user_data);
511 return MAPS_ERROR_NONE;
514 EXPORT_API int maps_address_list_destroy(maps_address_list_h address_list)
516 if (!maps_condition_check_maps_feature())
517 return MAPS_ERROR_NOT_SUPPORTED;
519 return MAPS_ERROR_INVALID_PARAMETER;
521 GList *list = (GList *) address_list;
522 MAPS_LOGD("address_list:%p, length = %d", list, g_list_length(list));
524 g_list_free_full(list, (GDestroyNotify) maps_address_destroy);
527 return MAPS_ERROR_NONE;
530 bool maps_address_is_valid(const maps_address_h address)
532 if (!maps_condition_check_maps_feature())
533 return MAPS_ERROR_NOT_SUPPORTED;
534 if (!address) return false;
537 maps_address_s *a = (maps_address_s *) address;
540 if (a->building_number && strlen(a->building_number) > _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH)
543 if (a->street && strlen(a->street) > _MAPS_ADDRESS_STREET_MAX_LENGTH)
546 if (a->district && strlen(a->district) > _MAPS_ADDRESS_DISTRICT_MAX_LENGTH)
549 if (a->city && strlen(a->city) > _MAPS_ADDRESS_CITY_MAX_LENGTH)
552 if (a->state && strlen(a->state) > _MAPS_ADDRESS_STATE_MAX_LENGTH)
555 if (a->country_code && strlen(a->country_code) > _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH)
558 if (a->postal_code && strlen(a->postal_code) > _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH)
561 if (a->freetext && strlen(a->freetext) > _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH)
564 if (a->country && strlen(a->country) > _MAPS_ADDRESS_COUNTRY_MAX_LENGTH)
567 if (a->county && strlen(a->county) > _MAPS_ADDRESS_COUNTY_MAX_LENGTH)