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);
65 MAPS_LOGE("OUT_OF_MEMORY(0x%08x)", MAPS_ERROR_OUT_OF_MEMORY);
66 return MAPS_ERROR_OUT_OF_MEMORY;
69 *address = (maps_address_h) a;
70 return MAPS_ERROR_NONE;
73 EXPORT_API int maps_address_destroy(maps_address_h address)
75 if (!maps_condition_check_maps_feature())
76 return MAPS_ERROR_NOT_SUPPORTED;
78 return MAPS_ERROR_INVALID_PARAMETER;
80 maps_address_s *a = (maps_address_s *) address;
82 if (a->building_number)
83 g_free(a->building_number);
93 g_free(a->country_code);
95 g_free(a->postal_code);
106 return MAPS_ERROR_NONE;
109 EXPORT_API int maps_address_clone(const maps_address_h origin,
110 maps_address_h *cloned)
112 if (!maps_condition_check_maps_feature())
113 return MAPS_ERROR_NOT_SUPPORTED;
114 if (!cloned || !origin)
115 return MAPS_ERROR_INVALID_PARAMETER;
117 int error = MAPS_ERROR_NONE;
119 error = maps_address_create(cloned);
120 if (!(*cloned) || (error != MAPS_ERROR_NONE))
123 maps_address_s *a = (maps_address_s *) origin;
125 if (a->building_number) {
126 error = maps_address_set_building_number(*cloned,
128 if (error != MAPS_ERROR_NONE)
133 error = maps_address_set_street(*cloned, a->street);
134 if (error != MAPS_ERROR_NONE)
139 error = maps_address_set_district(*cloned, a->district);
140 if (error != MAPS_ERROR_NONE)
145 error = maps_address_set_city(*cloned, a->city);
146 if (error != MAPS_ERROR_NONE)
151 error = maps_address_set_state(*cloned, a->state);
152 if (error != MAPS_ERROR_NONE)
156 if (a->country_code) {
157 error = maps_address_set_country_code(*cloned,
159 if (error != MAPS_ERROR_NONE)
163 if (a->postal_code) {
164 error = maps_address_set_postal_code(*cloned,
166 if (error != MAPS_ERROR_NONE)
171 error = maps_address_set_freetext(*cloned, a->freetext);
172 if (error != MAPS_ERROR_NONE)
177 error = maps_address_set_country(*cloned, a->country);
178 if (error != MAPS_ERROR_NONE)
183 error = maps_address_set_county(*cloned, a->county);
184 if (error != MAPS_ERROR_NONE)
188 return MAPS_ERROR_NONE;
191 maps_address_destroy(*cloned);
196 /*----------------------------------------------------------------------------*/
198 EXPORT_API int maps_address_get_building_number(const maps_address_h address,
199 char **building_number)
201 if (!maps_condition_check_maps_feature())
202 return MAPS_ERROR_NOT_SUPPORTED;
203 if (!address || !building_number)
204 return MAPS_ERROR_INVALID_PARAMETER;
205 return maps_get_string(((maps_address_s *) address)->building_number,
206 _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH, building_number);
209 EXPORT_API int maps_address_get_street(const maps_address_h address,
212 if (!maps_condition_check_maps_feature())
213 return MAPS_ERROR_NOT_SUPPORTED;
214 if (!address || !street)
215 return MAPS_ERROR_INVALID_PARAMETER;
216 return maps_get_string(((maps_address_s *) address)->street,
217 _MAPS_ADDRESS_STREET_MAX_LENGTH, street);
220 EXPORT_API int maps_address_get_district(const maps_address_h address,
223 if (!maps_condition_check_maps_feature())
224 return MAPS_ERROR_NOT_SUPPORTED;
225 if (!address || !district)
226 return MAPS_ERROR_INVALID_PARAMETER;
227 return maps_get_string(((maps_address_s *) address)->district,
228 _MAPS_ADDRESS_DISTRICT_MAX_LENGTH, district);
231 EXPORT_API int maps_address_get_city(const maps_address_h address, char **city)
233 if (!maps_condition_check_maps_feature())
234 return MAPS_ERROR_NOT_SUPPORTED;
235 if (!address || !city)
236 return MAPS_ERROR_INVALID_PARAMETER;
237 return maps_get_string(((maps_address_s *) address)->city,
238 _MAPS_ADDRESS_CITY_MAX_LENGTH, city);
241 EXPORT_API int maps_address_get_state(const maps_address_h address,
244 if (!maps_condition_check_maps_feature())
245 return MAPS_ERROR_NOT_SUPPORTED;
246 if (!address || !state)
247 return MAPS_ERROR_INVALID_PARAMETER;
248 return maps_get_string(((maps_address_s *) address)->state,
249 _MAPS_ADDRESS_STATE_MAX_LENGTH, state);
252 EXPORT_API int maps_address_get_country(const maps_address_h address,
255 if (!maps_condition_check_maps_feature())
256 return MAPS_ERROR_NOT_SUPPORTED;
257 if (!address || !country)
258 return MAPS_ERROR_INVALID_PARAMETER;
259 return maps_get_string(((maps_address_s *) address)->country,
260 _MAPS_ADDRESS_COUNTRY_MAX_LENGTH, country);
263 EXPORT_API int maps_address_get_country_code(const maps_address_h address,
266 if (!maps_condition_check_maps_feature())
267 return MAPS_ERROR_NOT_SUPPORTED;
268 if (!address || !country_code)
269 return MAPS_ERROR_INVALID_PARAMETER;
270 return maps_get_string(((maps_address_s *) address)->country_code,
271 _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH, country_code);
274 EXPORT_API int maps_address_get_county(const maps_address_h address,
277 if (!maps_condition_check_maps_feature())
278 return MAPS_ERROR_NOT_SUPPORTED;
279 if (!address || !county)
280 return MAPS_ERROR_INVALID_PARAMETER;
281 return maps_get_string(((maps_address_s *) address)->county,
282 _MAPS_ADDRESS_COUNTY_MAX_LENGTH, county);
285 EXPORT_API int maps_address_get_postal_code(const maps_address_h address,
288 if (!maps_condition_check_maps_feature())
289 return MAPS_ERROR_NOT_SUPPORTED;
290 if (!address || !postal_code)
291 return MAPS_ERROR_INVALID_PARAMETER;
292 return maps_get_string(((maps_address_s *) address)->postal_code,
293 _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH, postal_code);
296 EXPORT_API int maps_address_get_freetext(const maps_address_h address,
299 if (!maps_condition_check_maps_feature())
300 return MAPS_ERROR_NOT_SUPPORTED;
301 if (!address || !freetext)
302 return MAPS_ERROR_INVALID_PARAMETER;
303 return maps_get_string(((maps_address_s *) address)->freetext,
304 _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH, freetext);
307 /*----------------------------------------------------------------------------*/
309 EXPORT_API int maps_address_set_building_number(maps_address_h address,
310 const char *building_number)
312 if (!maps_condition_check_maps_feature())
313 return MAPS_ERROR_NOT_SUPPORTED;
314 if (!address || !building_number)
315 return MAPS_ERROR_INVALID_PARAMETER;
316 return maps_set_string(building_number,
317 _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH,
318 &((maps_address_s *) address)->building_number);
321 EXPORT_API int maps_address_set_street(maps_address_h address,
324 if (!maps_condition_check_maps_feature())
325 return MAPS_ERROR_NOT_SUPPORTED;
326 if (!address || !street)
327 return MAPS_ERROR_INVALID_PARAMETER;
328 return maps_set_string(street, _MAPS_ADDRESS_STREET_MAX_LENGTH,
329 &((maps_address_s *) address)->street);
332 EXPORT_API int maps_address_set_district(maps_address_h address,
333 const char *district)
335 if (!maps_condition_check_maps_feature())
336 return MAPS_ERROR_NOT_SUPPORTED;
337 if (!address || !district)
338 return MAPS_ERROR_INVALID_PARAMETER;
339 return maps_set_string(district, _MAPS_ADDRESS_DISTRICT_MAX_LENGTH,
340 &((maps_address_s *) address)->district);
343 EXPORT_API int maps_address_set_city(maps_address_h address, const char *city)
345 if (!maps_condition_check_maps_feature())
346 return MAPS_ERROR_NOT_SUPPORTED;
347 if (!address || !city)
348 return MAPS_ERROR_INVALID_PARAMETER;
349 return maps_set_string(city, _MAPS_ADDRESS_CITY_MAX_LENGTH,
350 &((maps_address_s *) address)->city);
353 EXPORT_API int maps_address_set_state(maps_address_h address, const char *state)
355 if (!maps_condition_check_maps_feature())
356 return MAPS_ERROR_NOT_SUPPORTED;
357 if (!address || !state)
358 return MAPS_ERROR_INVALID_PARAMETER;
359 return maps_set_string(state, _MAPS_ADDRESS_STATE_MAX_LENGTH,
360 &((maps_address_s *) address)->state);
363 EXPORT_API int maps_address_set_country(maps_address_h address,
366 if (!maps_condition_check_maps_feature())
367 return MAPS_ERROR_NOT_SUPPORTED;
368 if (!address || !country)
369 return MAPS_ERROR_INVALID_PARAMETER;
370 return maps_set_string(country, _MAPS_ADDRESS_COUNTRY_MAX_LENGTH,
371 &((maps_address_s *) address)->country);
374 EXPORT_API int maps_address_set_country_code(maps_address_h address,
375 const char *country_code)
377 if (!maps_condition_check_maps_feature())
378 return MAPS_ERROR_NOT_SUPPORTED;
379 if (!address || !country_code)
380 return MAPS_ERROR_INVALID_PARAMETER;
381 return maps_set_string(country_code,
382 _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH,
383 &((maps_address_s *) address)->country_code);
386 EXPORT_API int maps_address_set_county(maps_address_h address,
389 if (!maps_condition_check_maps_feature())
390 return MAPS_ERROR_NOT_SUPPORTED;
391 if (!address || !county)
392 return MAPS_ERROR_INVALID_PARAMETER;
393 return maps_set_string(county, _MAPS_ADDRESS_COUNTY_MAX_LENGTH,
394 &((maps_address_s *) address)->county);
397 EXPORT_API int maps_address_set_postal_code(maps_address_h address,
398 const char *postal_code)
400 if (!maps_condition_check_maps_feature())
401 return MAPS_ERROR_NOT_SUPPORTED;
402 if (!address || !postal_code)
403 return MAPS_ERROR_INVALID_PARAMETER;
404 return maps_set_string(postal_code,
405 _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH,
406 &((maps_address_s *) address)->postal_code);
409 EXPORT_API int maps_address_set_freetext(maps_address_h address,
410 const char *freetext)
412 if (!maps_condition_check_maps_feature())
413 return MAPS_ERROR_NOT_SUPPORTED;
414 if (!address || !freetext)
415 return MAPS_ERROR_INVALID_PARAMETER;
416 return maps_set_string(freetext, _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH,
417 &((maps_address_s *) address)->freetext);
424 EXPORT_API int maps_address_list_create(maps_address_list_h *address_list)
426 if (!maps_condition_check_maps_feature())
427 return MAPS_ERROR_NOT_SUPPORTED;
429 return MAPS_ERROR_INVALID_PARAMETER;
431 GList *list = g_list_alloc();
432 MAPS_CHECK_CONDITION(list, MAPS_ERROR_OUT_OF_MEMORY, "MAPS_ERROR_OUT_OF_MEMORY");
433 *address_list = (void *) list;
434 MAPS_LOGD("address_list: %p", list);
436 return MAPS_ERROR_NONE;
439 EXPORT_API int maps_address_list_append(maps_address_list_h address_list, maps_address_h address)
441 if (!maps_condition_check_maps_feature())
442 return MAPS_ERROR_NOT_SUPPORTED;
443 if (!address_list || !address)
444 return MAPS_ERROR_INVALID_PARAMETER;
446 GList *list = g_list_append((GList *)address_list, (gpointer) address);
447 MAPS_CHECK_CONDITION(list, MAPS_ERROR_OUT_OF_MEMORY, "MAPS_ERROR_OUT_OF_MEMORY");
450 return MAPS_ERROR_NONE;
453 EXPORT_API int maps_address_list_remove(maps_address_list_h address_list, maps_address_h address)
455 if (!maps_condition_check_maps_feature())
456 return MAPS_ERROR_NOT_SUPPORTED;
457 if (!address_list || !address)
458 return MAPS_ERROR_INVALID_PARAMETER;
460 GList *list = g_list_remove((GList *) address_list, (gpointer) address);
461 MAPS_CHECK_CONDITION(list, MAPS_ERROR_OUT_OF_MEMORY, "MAPS_ERROR_OUT_OF_MEMORY");
464 return MAPS_ERROR_NONE;
467 EXPORT_API int maps_address_list_get_length(maps_address_list_h address_list, int *length)
469 if (!maps_condition_check_maps_feature())
470 return MAPS_ERROR_NOT_SUPPORTED;
471 if (!address_list || !length)
472 return MAPS_ERROR_INVALID_PARAMETER;
474 *length = g_list_length((GList *)address_list) - 1;
476 return MAPS_ERROR_NONE;
479 EXPORT_API int maps_address_list_foreach(maps_address_list_h address_list, maps_address_cb callback, void *user_data)
481 if (!maps_condition_check_maps_feature())
482 return MAPS_ERROR_NOT_SUPPORTED;
483 if (!address_list || !callback)
484 return MAPS_ERROR_INVALID_PARAMETER;
489 GList *l = (GList *)address_list;
492 GList *next = l->next;
493 maps_address_s *address = (maps_address_s *)l->data;
496 int ret = callback(index++, address->country_code, address->country, addres->county, address->state,
497 address->city, address->district, addrss->street, address->building_number, address->freetext, user_data);
499 ret = callback(index++, address, user_data);
507 return MAPS_ERROR_NONE;
510 EXPORT_API int maps_address_list_destroy(maps_address_list_h address_list)
512 if (!maps_condition_check_maps_feature())
513 return MAPS_ERROR_NOT_SUPPORTED;
515 return MAPS_ERROR_INVALID_PARAMETER;
517 GList *list = (GList *) address_list;
518 MAPS_LOGD("address_list:%p, length = %d", list, g_list_length(list));
520 g_list_free_full(list, (GDestroyNotify) maps_address_destroy);
523 return MAPS_ERROR_NONE;
526 bool maps_address_is_valid(const maps_address_h address)
528 if (!maps_condition_check_maps_feature())
529 return MAPS_ERROR_NOT_SUPPORTED;
530 if (!address) return false;
533 maps_address_s *a = (maps_address_s *) address;
536 if (a->building_number && strlen(a->building_number) > _MAPS_ADDRESS_BUILDING_NUMBER_MAX_LENGTH)
539 if (a->street && strlen(a->street) > _MAPS_ADDRESS_STREET_MAX_LENGTH)
542 if (a->district && strlen(a->district) > _MAPS_ADDRESS_DISTRICT_MAX_LENGTH)
545 if (a->city && strlen(a->city) > _MAPS_ADDRESS_CITY_MAX_LENGTH)
548 if (a->state && strlen(a->state) > _MAPS_ADDRESS_STATE_MAX_LENGTH)
551 if (a->country_code && strlen(a->country_code) > _MAPS_ADDRESS_COUNTRY_CODE_MAX_LENGTH)
554 if (a->postal_code && strlen(a->postal_code) > _MAPS_ADDRESS_POSTAL_CODE_MAX_LENGTH)
557 if (a->freetext && strlen(a->freetext) > _MAPS_ADDRESS_FREE_TEXT_MAX_LENGTH)
560 if (a->country && strlen(a->country) > _MAPS_ADDRESS_COUNTRY_MAX_LENGTH)
563 if (a->county && strlen(a->county) > _MAPS_ADDRESS_COUNTY_MAX_LENGTH)