From b2e57232c0c834bb25e051530553b0490963abeb Mon Sep 17 00:00:00 2001 From: Kim Kibum Date: Sun, 29 Apr 2012 17:01:25 +0900 Subject: [PATCH] upload tizen1.0 source --- TC/_export_env.sh | 14 +- TC/_export_target_env.sh | 15 +- TC/build.sh | 17 +- TC/config | 2 + TC/tet_scen | 1 + TC/unit/Makefile | 3 +- TC/unit/tslist | 1 + TC/unit/utc_location_search_poi.c | 400 ++++++ TC/unit/utc_properties_last_position.c | 87 -- configure.ac | 7 +- debian/changelog | 80 +- debian/control | 2 +- debian/libslp-location-dev.install | 3 +- debian/libslp-location.install | 2 +- debian/libslp-location.postinst | 64 +- debian/rules | 4 + location/Makefile.am | 98 +- location/{ => include}/location-log.h | 3 - location/{ => include}/location-types.h | 110 +- location/location-geocode.c | 227 --- location/location-ielement.h | 122 -- location/location-poi-info.c | 193 --- location/location-poi-info.h | 187 --- location/location-poi.c | 234 ---- location/location-poi.h | 61 - location/location.c | 473 ------- location/location.h | 1442 -------------------- location/manager/Makefile.am | 41 + location/{ => manager}/location-accuracy.c | 4 +- location/{ => manager}/location-accuracy.h | 19 +- location/{ => manager}/location-boundary.c | 25 +- location/{ => manager}/location-boundary.h | 36 +- location/{ => manager}/location-common-util.c | 55 - location/{ => manager}/location-common-util.h | 9 +- location/{ => manager}/location-cps.c | 12 +- location/{ => manager}/location-cps.h | 3 - location/{ => manager}/location-gps.c | 105 +- location/{ => manager}/location-gps.h | 4 - location/{ => manager}/location-hybrid.c | 165 ++- location/{ => manager}/location-hybrid.h | 3 - location/{ => manager}/location-ielement.c | 197 ++- location/manager/location-ielement.h | 138 ++ location/{ => manager}/location-ips.c | 12 +- location/{ => manager}/location-ips.h | 3 - location/{ => manager}/location-marshal.list | 0 location/{ => manager}/location-position.c | 9 +- location/{ => manager}/location-position.h | 23 +- location/{ => manager}/location-satellite.c | 5 +- location/{ => manager}/location-satellite.h | 22 +- location/{ => manager}/location-setting.c | 4 +- location/{ => manager}/location-setting.h | 31 +- location/{ => manager}/location-signaling-util.c | 36 +- location/{ => manager}/location-signaling-util.h | 10 +- location/{ => manager}/location-sps.c | 54 +- location/{ => manager}/location-sps.h | 3 - location/{ => manager}/location-velocity.c | 4 +- location/{ => manager}/location-velocity.h | 22 +- location/{ => manager}/location-wps.c | 79 +- location/{ => manager}/location-wps.h | 3 - location/manager/location.c | 230 ++++ location/manager/location.h | 738 ++++++++++ location/map-service/Makefile.am | 27 + location/{ => map-service}/location-address.c | 4 +- location/{ => map-service}/location-address.h | 16 +- location/map-service/location-geocode.c | 27 + location/{ => map-service}/location-geocode.h | 30 +- location/map-service/location-landmark-ext.h | 117 ++ location/map-service/location-landmark.c | 528 +++++++ location/map-service/location-landmark.h | 147 ++ location/map-service/location-map-service-ext.h | 40 + location/map-service/location-map-service.c | 327 +++++ location/map-service/location-map-service.h | 1389 +++++++++++++++++++ location/map-service/location-poi.c | 289 ++++ location/map-service/location-poi.h | 282 ++++ location/map-service/location-pref.c | 222 +++ location/map-service/location-pref.h | 121 ++ location/map-service/location-route-ext.h | 362 +++++ location/map-service/location-route.c | 1372 +++++++++++++++++++ location/map-service/location-route.h | 873 ++++++++++++ location/map-service/map-internal.c | 235 ++++ location/map-service/map-internal.h | 82 ++ location/map-service/map-service.c | 209 +++ location/map-service/map-service.h | 73 + location/module/Makefile.am | 20 + location/{ => module}/location-module.h | 85 +- .../module-internal.c} | 118 +- .../module-internal.h} | 30 +- packaging/libslp-location.spec | 59 +- tests/Makefile.am | 5 +- tests/address-sample.c | 7 +- tests/cps-test.c | 2 +- tests/gps-test.c | 2 +- tests/hybrid-test.c | 2 +- tests/ips-test.c | 2 +- tests/location-api-test-util.c | 372 ++--- tests/location-api-test-util.h | 2 +- tests/location-api-test.c | 518 ++++++- tests/nmea-sample.c | 2 +- tests/position-sample-gps.c | 2 +- tests/property-sample.c | 2 +- tests/satellite-sample.c | 2 +- tests/sps-test.c | 2 +- tests/velocity-sample.c | 2 +- tests/wps-test.c | 2 +- tests/zone-sample.c | 2 +- 105 files changed, 10094 insertions(+), 3874 deletions(-) mode change 100644 => 100755 TC/_export_env.sh create mode 100644 TC/config create mode 100644 TC/unit/utc_location_search_poi.c delete mode 100644 TC/unit/utc_properties_last_position.c mode change 100644 => 100755 configure.ac mode change 100644 => 100755 location/Makefile.am rename location/{ => include}/location-log.h (98%) rename location/{ => include}/location-types.h (60%) delete mode 100644 location/location-geocode.c delete mode 100644 location/location-ielement.h delete mode 100644 location/location-poi-info.c delete mode 100644 location/location-poi-info.h delete mode 100644 location/location-poi.c delete mode 100644 location/location-poi.h delete mode 100644 location/location.c delete mode 100644 location/location.h create mode 100644 location/manager/Makefile.am rename location/{ => manager}/location-accuracy.c (97%) rename location/{ => manager}/location-accuracy.h (95%) rename location/{ => manager}/location-boundary.c (95%) rename location/{ => manager}/location-boundary.h (94%) rename location/{ => manager}/location-common-util.c (76%) rename location/{ => manager}/location-common-util.h (85%) rename location/{ => manager}/location-cps.c (95%) rename location/{ => manager}/location-cps.h (97%) rename location/{ => manager}/location-gps.c (81%) rename location/{ => manager}/location-gps.h (96%) rename location/{ => manager}/location-hybrid.c (79%) rename location/{ => manager}/location-hybrid.h (98%) rename location/{ => manager}/location-ielement.c (51%) create mode 100644 location/manager/location-ielement.h rename location/{ => manager}/location-ips.c (95%) rename location/{ => manager}/location-ips.h (97%) rename location/{ => manager}/location-marshal.list (100%) rename location/{ => manager}/location-position.c (96%) rename location/{ => manager}/location-position.h (96%) rename location/{ => manager}/location-satellite.c (97%) rename location/{ => manager}/location-satellite.h (95%) rename location/{ => manager}/location-setting.c (97%) rename location/{ => manager}/location-setting.h (58%) rename location/{ => manager}/location-signaling-util.c (84%) rename location/{ => manager}/location-signaling-util.h (87%) rename location/{ => manager}/location-sps.c (92%) rename location/{ => manager}/location-sps.h (98%) rename location/{ => manager}/location-velocity.c (97%) rename location/{ => manager}/location-velocity.h (93%) rename location/{ => manager}/location-wps.c (85%) rename location/{ => manager}/location-wps.h (98%) create mode 100644 location/manager/location.c create mode 100644 location/manager/location.h create mode 100644 location/map-service/Makefile.am rename location/{ => map-service}/location-address.c (97%) rename location/{ => map-service}/location-address.h (91%) create mode 100644 location/map-service/location-geocode.c rename location/{ => map-service}/location-geocode.h (51%) create mode 100644 location/map-service/location-landmark-ext.h create mode 100644 location/map-service/location-landmark.c create mode 100644 location/map-service/location-landmark.h create mode 100644 location/map-service/location-map-service-ext.h create mode 100644 location/map-service/location-map-service.c create mode 100644 location/map-service/location-map-service.h create mode 100644 location/map-service/location-poi.c create mode 100644 location/map-service/location-poi.h create mode 100644 location/map-service/location-pref.c create mode 100644 location/map-service/location-pref.h create mode 100644 location/map-service/location-route-ext.h create mode 100644 location/map-service/location-route.c create mode 100644 location/map-service/location-route.h create mode 100644 location/map-service/map-internal.c create mode 100644 location/map-service/map-internal.h create mode 100644 location/map-service/map-service.c create mode 100644 location/map-service/map-service.h create mode 100644 location/module/Makefile.am rename location/{ => module}/location-module.h (58%) rename location/{location-module-internal.c => module/module-internal.c} (77%) rename location/{location-module-internal.h => module/module-internal.h} (82%) diff --git a/TC/_export_env.sh b/TC/_export_env.sh old mode 100644 new mode 100755 index 7a7b2ae..72a11ec --- a/TC/_export_env.sh +++ b/TC/_export_env.sh @@ -1,14 +1,8 @@ -export ARCH=target +#!/bin/sh -export TET_INSTALL_PATH=~/opensrc/tet3.7 # tetware root path -export TET_TARGET_PATH=$TET_INSTALL_PATH # tetware target path +. ./config +export TET_INSTALL_PATH=$TET_INSTALL_HOST_PATH # tetware root path +export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target # tetware target path export PATH=$TET_TARGET_PATH/bin:$PATH export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH - export TET_ROOT=$TET_TARGET_PATH - -set $(pwd) -export TET_SUITE_ROOT=$1 - -set $(date +%s) -FILE_NAME_EXTENSION=$1 diff --git a/TC/_export_target_env.sh b/TC/_export_target_env.sh index 323bb38..5ddaa53 100644 --- a/TC/_export_target_env.sh +++ b/TC/_export_target_env.sh @@ -1,14 +1,7 @@ -export ARCH=target - -export TET_INSTALL_PATH=/opt/home/root/TETware # path to mount -export TET_TARGET_PATH=$TET_INSTALL_PATH +#!/bin/sh +. ./config +export TET_INSTALL_PATH=$TET_INSTALL_TARGET_PATH # path to path +export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target export PATH=$TET_TARGET_PATH/bin:$PATH export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH - export TET_ROOT=$TET_TARGET_PATH - -set $(pwd) -export TET_SUITE_ROOT=$1 - -set $(date +%s) -FILE_NAME_EXTENSION=$1 diff --git a/TC/build.sh b/TC/build.sh index b6c54b9..72aad6c 100755 --- a/TC/build.sh +++ b/TC/build.sh @@ -1,17 +1,16 @@ +#!/bin/sh + . ./_export_env.sh # setting environment variables -echo PATH=$PATH -echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH -echo TET_ROOT=$TET_ROOT -echo TET_SUITE_ROOT=$TET_SUITE_ROOT -echo ARCH=$ARCH +export TET_SUITE_ROOT=`pwd` +FILE_NAME_EXTENSION=`date +%s` -RESULT_DIR=results-$ARCH +RESULT_DIR=results HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal mkdir -p $RESULT_DIR -tcc -c -p ./ # executing tcc, with clean option (-c) -tcc -b -j $JOURNAL_RESULT -p ./ # executing tcc to build test cases (-b) -grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT # reporting the result +tcc -c -p ./ +tcc -b -j $JOURNAL_RESULT -p ./ +grw -c 7 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/config b/TC/config new file mode 100644 index 0000000..ba387c7 --- /dev/null +++ b/TC/config @@ -0,0 +1,2 @@ +TET_INSTALL_HOST_PATH=/home/june/SBS2/work/tetware/TETware +TET_INSTALL_TARGET_PATH=/mnt/nfs/SBS2/work/tetware/TETware diff --git a/TC/tet_scen b/TC/tet_scen index f036f23..bf662fc 100644 --- a/TC/tet_scen +++ b/TC/tet_scen @@ -18,6 +18,7 @@ all /unit/utc_location_get_last_velocity /unit/utc_location_get_satellite /unit/utc_location_get_last_satellite + /unit/utc_location_search_poi /unit/utc_location_init /unit/utc_location_new /unit/utc_location_start diff --git a/TC/unit/Makefile b/TC/unit/Makefile index 2a33f95..62fc0c8 100644 --- a/TC/unit/Makefile +++ b/TC/unit/Makefile @@ -31,6 +31,7 @@ TC24 = utc_location_get_address TC25 = utc_location_get_address_from_position TC26 = utc_location_get_position_from_address TC27 = utc_location_get_position_from_freeformed_address +TC28 = utc_location_search_poi # # add your Package Config Info Here @@ -61,7 +62,7 @@ CFLAGS += $(INCS) # # e.g., # -TCLIST = $(TC1) $(TC2) $(TC3) $(TC4) $(TC5) $(TC6) $(TC7) $(TC8) $(TC9) $(TC10) $(TC11) $(TC12) $(TC13) $(TC14) $(TC16) $(TC17) $(TC18) $(TC19) $(TC20) $(TC21) $(TC22) $(TC23) $(TC24) $(TC25) $(TC26) $(TC27) +TCLIST = $(TC1) $(TC2) $(TC3) $(TC4) $(TC5) $(TC6) $(TC7) $(TC8) $(TC9) $(TC10) $(TC11) $(TC12) $(TC13) $(TC14) $(TC16) $(TC17) $(TC18) $(TC19) $(TC20) $(TC21) $(TC22) $(TC23) $(TC24) $(TC25) $(TC26) $(TC27) $(TC28) all: $(TCLIST) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< diff --git a/TC/unit/tslist b/TC/unit/tslist index e4a997f..6cf5690 100644 --- a/TC/unit/tslist +++ b/TC/unit/tslist @@ -15,6 +15,7 @@ utc_location_get_velocity utc_location_get_last_velocity utc_location_get_satellite utc_location_get_last_satellite +utc_location_search_poi utc_location_init utc_location_new utc_location_start diff --git a/TC/unit/utc_location_search_poi.c b/TC/unit/utc_location_search_poi.c new file mode 100644 index 0000000..ce84a31 --- /dev/null +++ b/TC/unit/utc_location_search_poi.c @@ -0,0 +1,400 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +static void startup(), cleanup(); +void (*tet_startup) () = startup; +void (*tet_cleanup) () = cleanup; + +static void utc_location_search_poi_01(); +static void utc_location_search_poi_02(); +static void utc_location_search_poi_03(); +static void utc_location_search_poi_04(); +static void utc_location_search_poi_05(); +static void utc_location_search_poi_06(); +static void utc_location_search_poi_07(); +static void utc_location_search_poi_08(); +static void utc_location_search_poi_09(); +static void utc_location_search_poi_10(); + +struct tet_testlist tet_testlist[] = { + {utc_location_search_poi_01,1}, + {utc_location_search_poi_02,2}, + {utc_location_search_poi_03,3}, + {utc_location_search_poi_04,4}, + {utc_location_search_poi_05,5}, + {utc_location_search_poi_06,6}, + {utc_location_search_poi_07,7}, + {utc_location_search_poi_08,8}, + {utc_location_search_poi_09,9}, + {utc_location_search_poi_10,10}, + {NULL,0}, +}; + +static GMainLoop *loop = NULL; +LocationObject* loc; +int ret; +int isNetStarted = 0; + +static gboolean +exit_loop (gpointer data) +{ + g_main_loop_quit (loop); + return FALSE; +} + +static gboolean +exit_loop_fail (gpointer data) +{ + g_main_loop_quit (loop); + tet_result(TET_FAIL); + return FALSE; +} + +static void startup() +{ + location_init(); + loc = location_new(LOCATION_METHOD_GPS); + + loop = g_main_loop_new(NULL,FALSE); + g_main_loop_run (loop); + + tet_printf("\n TC startup"); +} + +static void cleanup() +{ + location_free(loc); + tet_printf("\n TC End"); +} + +static void __location_POI_cb(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + tet_printf("\n===== __location_POI_cb ======\n"); + if (error != LOCATION_ERROR_NONE) { + tet_result(TET_FAIL); + tet_printf("Failed :%d\n", error); + } + + if (landmark_list) tet_result(TET_PASS); + g_main_loop_quit (loop); +} + + +static void +utc_location_search_poi_01() +{ + guint req_id = 0; + int ret = 0; + tet_printf("Keyword-cafe, Max - 10 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("KEYWORD"); + gchar *value = g_strdup("cafe"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 10); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_DESC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, pref, __location_POI_cb, NULL, &req_id); + if(ret != LOCATION_ERROR_NONE) { + tet_result(TET_FAIL); + tet_printf("Fail to search POI. Error[%d]\n", ret); + } else { + g_timeout_add_seconds(60, exit_loop_fail, NULL); + tet_printf("Seach POI sucess, req_id %d\n", req_id); + } + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_02() +{ + guint req_id = 0; + int ret = 0; + tet_printf("Category-restaurant, Max - 10 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("CATEGORY"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 10); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_DESC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, pref, __location_POI_cb, NULL, &req_id); + if(ret != LOCATION_ERROR_NONE) { + tet_result(TET_FAIL); + tet_printf("Fail to search POI. Error[%d]\n", ret); + } else { + g_timeout_add_seconds(60, exit_loop_fail, NULL); + tet_printf("Seach POI sucess, req_id %d\n", req_id); + } + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_03() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-cafe, Max - 20 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("cafe"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 20); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, pref, __location_POI_cb, NULL, &req_id); + if(ret != LOCATION_ERROR_NONE) { + tet_result(TET_FAIL); + tet_printf("Fail to search POI. Error[%d]\n", ret); + } else { + g_timeout_add_seconds(60, exit_loop_fail, NULL); + tet_printf("Seach POI sucess, req_id %d\n", req_id); + } + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_04() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 50); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, pref, __location_POI_cb, NULL, &req_id); + if(ret != LOCATION_ERROR_NONE) { + tet_result(TET_FAIL); + tet_printf("Fail to search POI. Error[%d]\n", ret); + } else { + g_timeout_add_seconds(60, exit_loop_fail, NULL); + tet_printf("Seach POI sucess, req_id %d\n", req_id); + } + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_05() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 50); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(NULL, filter, position, pref, __location_POI_cb, NULL, &req_id); + if(ret == LOCATION_ERROR_PARAMETER) { + tet_result(TET_PASS); + } else { + tet_result(TET_FAIL); + } + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_06() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 50); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, NULL, position, pref, __location_POI_cb, NULL, &req_id); + if(ret == LOCATION_ERROR_PARAMETER) { + tet_result(TET_PASS); + } else { + tet_result(TET_FAIL); + } + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_07() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, NULL, __location_POI_cb, NULL, &req_id); + if(ret == LOCATION_ERROR_PARAMETER) { + tet_result(TET_PASS); + } else { + tet_result(TET_FAIL); + } + location_poi_filter_free(filter); + location_position_free(position); +} + +static void +utc_location_search_poi_08() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 50); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + ret = location_search_poi(loc, filter, NULL, pref, __location_POI_cb, NULL, &req_id); + if(ret == LOCATION_ERROR_PARAMETER) { + tet_result(TET_PASS); + } else { + tet_result(TET_FAIL); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); +} + +static void +utc_location_search_poi_09() +{ + guint req_id = 0; + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 50); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, pref, NULL, NULL, &req_id); + if(ret == LOCATION_ERROR_PARAMETER) { + tet_result(TET_PASS); + } else { + tet_result(TET_FAIL); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} + +static void +utc_location_search_poi_10() +{ + int ret = 0; + tet_printf("POIName-restaurant, Max - 50 and sort by Distance"); + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("POIName"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 50); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + LocationPosition *position = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(loc, filter, position, pref, __location_POI_cb, NULL, NULL); + if(ret == LOCATION_ERROR_PARAMETER) { + tet_result(TET_PASS); + } else { + tet_result(TET_FAIL); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); +} diff --git a/TC/unit/utc_properties_last_position.c b/TC/unit/utc_properties_last_position.c deleted file mode 100644 index 03c08cf..0000000 --- a/TC/unit/utc_properties_last_position.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include -#include -#include - -static void startup(), cleanup(); -void (*tet_startup) () = startup; -void (*tet_cleanup) () = cleanup; - -static void utc_get_lastpostion(); - -struct tet_testlist tet_testlist[] = { - {utc_get_lastpostion,1}, - {NULL,0}, -}; - - -static GMainLoop *loop = NULL; -int ret; -LocationObject* loc; - -static gboolean -exit_loop (gpointer data) -{ - g_main_loop_quit (loop); - tet_result(TET_FAIL); - return FALSE; -} - -static void startup() -{ - location_init(); - loc = location_new(LOCATION_METHOD_GPS); - location_start(loc); - loop = g_main_loop_new(NULL,FALSE); - tet_printf("\n TC startup"); -} - -static void cleanup() -{ - location_stop(loc); - location_free(loc); - tet_printf("\n TC End"); -} - -static void -cb_updated (GObject *self, - guint type, - gpointer data, - gpointer accuracy, - gpointer userdata) -{ - LocationPosition *pos = NULL; - g_object_get(loc, "last-position", &pos, NULL); - if (pos) { - location_position_free (pos); - tet_result(TET_PASS); - } else tet_result(TET_FAIL); - g_main_loop_quit (loop); -} - -static void -utc_get_lastpostion() -{ - g_signal_connect (loc, "service-updated", G_CALLBACK(cb_updated), loc); - g_timeout_add_seconds (60, exit_loop, NULL); - g_main_loop_run (loop); -} diff --git a/configure.ac b/configure.ac old mode 100644 new mode 100755 index f574b41..a646f28 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ AC_INIT(Location, 0.1, [sena06.kim@samsung.com]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADER([config.h]) -AC_CONFIG_SRCDIR([location/location.c]) +AC_CONFIG_SRCDIR([location]) AM_INIT_AUTOMAKE([1.10.2 foreign -Wall -Werror]) # Check programs for making executable @@ -50,7 +50,7 @@ AC_COMPILE_IFELSE( AC_MSG_RESULT($has_visibility) # Check dependencies -PKG_CHECK_MODULES(LOCATION, [glib-2.0 gobject-2.0 gmodule-2.0 vconf]) +PKG_CHECK_MODULES(LOCATION, [glib-2.0 gobject-2.0 dbus-glib-1 gmodule-2.0 vconf]) AC_SUBST(LOCATION_LIBS) AC_SUBST(LOCATION_CFLAGS) @@ -81,6 +81,9 @@ AC_CONFIG_FILES([ location.pc Makefile location/Makefile +location/manager/Makefile +location/map-service/Makefile +location/module/Makefile tests/Makefile ]) diff --git a/debian/changelog b/debian/changelog index f9d2e33..370e857 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,18 +1,92 @@ +libslp-location (0.3.34-13) unstable; urgency=low + + * The result was wrong when location_boundary_if_inside was called + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-13 + + -- Minjune Kim Mon, 02 Apr 2012 16:59:08 +0900 + +libslp-location (0.3.34-12) unstable; urgency=low + + * Fix the bug that get_last_position of WPS was failed on emulator. + * Move the fuctionality to location module + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-12 + + -- Minjune Kim Tue, 27 Mar 2012 11:09:07 +0900 + +libslp-location (0.3.34-11) unstable; urgency=low + + * Add location_route_step_set_transport_mode / location_route_step_get_transport_mode + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-11 + + -- Minjune Kim Mon, 26 Mar 2012 17:00:48 +0900 + +libslp-location (0.3.34-10) unstable; urgency=low + + * Check param's range in funcs. + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-10 + + -- Minjune Kim Thu, 22 Mar 2012 13:18:42 +0900 + +libslp-location (0.3.34-9) unstable; urgency=low + + * Fix the bug that location_get_map_service_pref returned fail + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-9 + + -- Minjune Kim Tue, 20 Mar 2012 22:15:17 +0900 + +libslp-location (0.3.34-8) unstable; urgency=low + + * modity TC script and copy satellite info with timestamp + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-8 + + -- Minjune Kim Mon, 19 Mar 2012 20:49:24 +0900 + +libslp-location (0.3.34-7) unstable; urgency=low + + * add libgconf-dbus-dev in control + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-7 + + -- Genie Kim Fri, 16 Mar 2012 11:33:54 +0900 + +libslp-location (0.3.34-6) unstable; urgency=low + + * Support Capability APIs + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-6 + + -- Minjune Kim Wed, 14 Mar 2012 20:35:31 +0900 + +libslp-location (0.3.34-5) unstable; urgency=low + + * Add dbus_g_thread_init & g_thread_init to location_init + * Git: pkgs/l/libslp-location + * Tag: libslp-location_0.3.34-5 + + -- Minjune Kim Fri, 09 Mar 2012 16:29:07 +0900 + libslp-location (0.3.34-4) unstable; urgency=low - * Rollback + * Change a wps_start to support an emulator. * Git: pkgs/l/libslp-location * Tag: libslp-location_0.3.34-4 - -- Minjune Kim Thu, 23 Feb 2012 14:30:58 +0900 + -- Minjune Kim Wed, 07 Mar 2012 10:59:54 +0900 libslp-location (0.3.34-3) unstable; urgency=low * Add POI func & Route prototype + * Implement get_last_xxx & Update satellite info * Git: pkgs/l/libslp-location * Tag: libslp-location_0.3.34-3 - -- root Thu, 23 Feb 2012 14:29:51 +0900 + -- Minjune Kim Thu, 23 Feb 2012 14:29:51 +0900 libslp-location (0.3.34-2) unstable; urgency=low diff --git a/debian/control b/debian/control index 89f9108..9527507 100755 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: libs Priority: extra Maintainer: Youngae Kang , Yunhan Kim , Genie kim , Minjune Kim Uploaders: Genie Kim -Build-Depends: debhelper (>= 5), libglib2.0-dev, dlog-dev, libvconf-dev, libvconf-keys-dev, libjson-glib-dev +Build-Depends: debhelper (>= 5), libglib2.0-dev, libdbus-glib-1-dev, dlog-dev, libvconf-dev, libvconf-keys-dev, libjson-glib-dev, libgconf-dbus-dev Standards-Version: 3.7.2 Homepage: N/A diff --git a/debian/libslp-location-dev.install b/debian/libslp-location-dev.install index a2f6b8c..f31bdab 100644 --- a/debian/libslp-location-dev.install +++ b/debian/libslp-location-dev.install @@ -1,4 +1,3 @@ usr/include/* usr/lib/pkgconfig/* -usr/lib/*.{la,a} -usr/lib/*.so +usr/lib/*.la diff --git a/debian/libslp-location.install b/debian/libslp-location.install index 093956b..d34bd90 100644 --- a/debian/libslp-location.install +++ b/debian/libslp-location.install @@ -1 +1 @@ -usr/lib/*.so.* +usr/lib/*.so* diff --git a/debian/libslp-location.postinst b/debian/libslp-location.postinst index ee6360c..872b534 100755 --- a/debian/libslp-location.postinst +++ b/debian/libslp-location.postinst @@ -3,46 +3,42 @@ #setting if [ "${USER}" = "root" ] then -vconftool set -t int db/location/lastposition/gps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/gps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/HorAccuracy "0.0" -f -vconftool set -t double db/location/lastposition/gps/VerAccuracy "0.0" -f -vconftool set -t int db/location/lastposition/wps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/wps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/HorAccuracy "0.0" -f -vconftool set -t int db/location/lastposition/sps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/sps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/HorAccuracy "0.0" -f -vconftool set -t double db/location/lastposition/sps/VerAccuracy "0.0" -f +vconftool set -t int db/location/last/gps/Timestamp "0" -f +vconftool set -t double db/location/last/gps/Latitude "0.0" -f +vconftool set -t double db/location/last/gps/Longitude "0.0" -f +vconftool set -t double db/location/last/gps/Altitude "0.0" -f +vconftool set -t double db/location/last/gps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/gps/VerAccuracy "0.0" -f +vconftool set -t double db/location/last/gps/Speed "0.0" -f +vconftool set -t double db/location/last/gps/Direction "0.0" -f +vconftool set -t int db/location/last/wps/Timestamp "0" -f +vconftool set -t double db/location/last/wps/Latitude "0.0" -f +vconftool set -t double db/location/last/wps/Longitude "0.0" -f +vconftool set -t double db/location/last/wps/Altitude "0.0" -f +vconftool set -t double db/location/last/wps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/wps/Speed "0.0" -f +vconftool set -t double db/location/last/wps/Direction "0.0" -f vconftool set -t int db/location/setting/GpsEnabled "0" -g 6514 -f vconftool set -t int db/location/setting/AgpsEnabled "0" -g 6514 -f vconftool set -t int db/location/setting/NetworkEnabled "0" -g 6514 -f vconftool set -t int db/location/setting/SensorEnabled "0" -g 6514 -f else -vconftool set -t int db/location/lastposition/gps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/gps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/HorAccuracy "0.0" -f -vconftool set -t double db/location/lastposition/gps/VerAccuracy "0.0" -f -vconftool set -t int db/location/lastposition/wps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/wps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/HorAccuracy "0.0" -f -vconftool set -t int db/location/lastposition/sps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/sps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/HorAccuracy "0.0" -f -vconftool set -t double db/location/lastposition/sps/VerAccuracy "0.0" -f +vconftool set -t int db/location/last/gps/Timestamp "0" -f +vconftool set -t double db/location/last/gps/Latitude "0.0" -f +vconftool set -t double db/location/last/gps/Longitude "0.0" -f +vconftool set -t double db/location/last/gps/Altitude "0.0" -f +vconftool set -t double db/location/last/gps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/gps/VerAccuracy "0.0" -f +vconftool set -t double db/location/last/gps/Speed "0.0" -f +vconftool set -t double db/location/last/gps/Direction "0.0" -f +vconftool set -t int db/location/last/wps/Timestamp "0" -f +vconftool set -t double db/location/last/wps/Latitude "0.0" -f +vconftool set -t double db/location/last/wps/Longitude "0.0" -f +vconftool set -t double db/location/last/wps/Altitude "0.0" -f +vconftool set -t double db/location/last/wps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/wps/Speed "0.0" -f +vconftool set -t double db/location/last/wps/Direction "0.0" -f vconftool set -t int db/location/setting/GpsEnabled "0" -g -f vconftool set -t int db/location/setting/AgpsEnabled "0" -f vconftool set -t int db/location/setting/NetworkEnabled "0" -f diff --git a/debian/rules b/debian/rules index 4f12d83..c997f77 100755 --- a/debian/rules +++ b/debian/rules @@ -61,6 +61,10 @@ clean: rm -rf install_manifest.txt rm -rf *.so rm -f pkgconfig/lbs-location.pc + rm -rf location/*.o + rm -rf location/*.lo + rm -rf location/*.la + rm -rf tests/.lib for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ rm -f $${f%.in}; \ diff --git a/location/Makefile.am b/location/Makefile.am old mode 100644 new mode 100755 index 799e4c8..a5dd525 --- a/location/Makefile.am +++ b/location/Makefile.am @@ -1,77 +1,49 @@ +SUBDIRS = manager map-service module lib_LTLIBRARIES = libSLP-location.la +COMMON_HEADER_DIR = include +MANAGER_DIR = manager +MAP_SERVICE_DIR = map-service +MODULE_DIR = module + libSLP_location_la_SOURCES = \ - location-marshal.c \ - location-marshal.h \ - location-ielement.c \ - location-ielement.h \ - location-setting.c \ - location-setting.h \ - location-module.h \ - location-module-internal.c\ - location-module-internal.h\ - location.c \ - location.h \ - location-position.c \ - location-position.h \ - location-velocity.c \ - location-velocity.h \ - location-accuracy.c \ - location-accuracy.h \ - location-address.c \ - location-address.h \ - location-boundary.c \ - location-boundary.h \ - location-satellite.c \ - location-satellite.h \ - location-poi-info.c \ - location-poi-info.h \ - location-signaling-util.c \ - location-signaling-util.h \ - location-common-util.c \ - location-common-util.h \ - location-gps.c \ - location-gps.h \ - location-wps.c \ - location-wps.h \ - location-ips.c \ - location-ips.h \ - location-cps.c \ - location-cps.h \ - location-sps.c \ - location-sps.h \ - location-hybrid.c \ - location-hybrid.h \ - location-geocode.c \ - location-geocode.h \ - location-poi.c \ - location-poi.h + ${MANAGER_DIR}/location.c\ + ${MAP_SERVICE_DIR}/location-map-service.c + libSLP_location_la_CFLAGS = \ -fPIC\ + -I${srcdir} \ + -I${srcdir}/include \ + -I${srcdir}/${MANAGER_DIR} \ + -I${srcdir}/${MODULE_DIR} \ + -I${srcdir}/${MAP_SERVICE_DIR} \ $(LOCATION_CFLAGS) libSLP_location_la_LIBADD = \ + ${MANAGER_DIR}/liblocation-manager.la \ + ${MAP_SERVICE_DIR}/liblocation-map-service.la \ + ${MODULE_DIR}/liblocation-module.la \ -lm\ $(LOCATION_LIBS) -EXTRA_DIST = \ - location-marshal.list - -location-marshal.h: location-marshal.list $(GLIB_GENMARSHAL) - $(GLIB_GENMARSHAL) $< --header --prefix=location > $@ -location-marshal.c: location-marshal.list location-marshal.h $(GLIB_GENMARSHAL) - echo "#include \"location-marshal.h\"" > $@ && $(GLIB_GENMARSHAL) location-marshal.list --body --prefix=location >> $@ - libSLP_location_includedir = $(includedir)/location libSLP_location_include_HEADERS = \ - location.h \ - location-types.h \ - location-position.h \ - location-velocity.h \ - location-accuracy.h \ - location-address.h \ - location-boundary.h \ - location-satellite.h \ - location-poi-info.h \ - location-module.h + ${COMMON_HEADER_DIR}/location-types.h \ + ${MANAGER_DIR}/location.h \ + ${MANAGER_DIR}/location-position.h \ + ${MANAGER_DIR}/location-velocity.h \ + ${MANAGER_DIR}/location-accuracy.h \ + ${MANAGER_DIR}/location-boundary.h \ + ${MANAGER_DIR}/location-satellite.h \ + ${MAP_SERVICE_DIR}/location-address.h \ + ${MAP_SERVICE_DIR}/location-map-service.h \ + ${MAP_SERVICE_DIR}/location-map-service-ext.h \ + ${MAP_SERVICE_DIR}/location-poi.h \ + ${MAP_SERVICE_DIR}/location-route.h \ + ${MAP_SERVICE_DIR}/location-route-ext.h \ + ${MAP_SERVICE_DIR}/location-geocode.h \ + ${MAP_SERVICE_DIR}/location-pref.h \ + ${MAP_SERVICE_DIR}/location-landmark.h \ + ${MAP_SERVICE_DIR}/location-landmark-ext.h \ + ${MODULE_DIR}/location-module.h diff --git a/location/location-log.h b/location/include/location-log.h similarity index 98% rename from location/location-log.h rename to location/include/location-log.h index 0f9f58a..ebc2448 100644 --- a/location/location-log.h +++ b/location/include/location-log.h @@ -25,9 +25,6 @@ /** * @file location-log.h * @brief This file contains macro functions for logging. - * @addtogroup LocationInternal - * @{ - * @} */ #define TAG_LOCATION "location" diff --git a/location/location-types.h b/location/include/location-types.h similarity index 60% rename from location/location-types.h rename to location/include/location-types.h index ab0c147..c1d150d 100644 --- a/location/location-types.h +++ b/location/include/location-types.h @@ -54,6 +54,7 @@ typedef enum { LOCATION_ERROR_CONFIGURATION, ///< Configuration setting is not correct. LOCATION_ERROR_PARAMETER, ///< Input parameter is not correct. LOCATION_ERROR_NOT_FOUND, ///< Output is not found. + LOCATION_ERROR_NOT_SUPPORTED, ///< Not supported. LOCATION_ERROR_UNKNOWN, ///< Unknown error. } LocationError; @@ -78,12 +79,55 @@ typedef enum { UPDATE_TYPE_NONE = -1, ///< Undefined update type. POSITION_UPDATED = 0, ///< This type is used when position information is updated. VELOCITY_UPDATED, ///< This type is used when velocity information is updated. - SATELLITE_UPDATED, ///< This type is used when satellite information is updated. + SATELLITE_UPDATED, ///< This type is used when satellite information is updated. ADDRESS_UPDATED, ///< This type is used when address information is updated. This is not implemented yet. GEOCODE_UPDATED, ///< This type is used when geocode information is updated. This is not implemented yet. REVERSEGEOCODE_UPDATED ///< This type is used when reverse geocode information is updated. This is not implemented yet. } LocationUpdateType; +typedef enum { + MAP_SERVICE_PREF_LANGUAGE, + MAP_SERVICE_PREF_DISTANCE_UNIT, + + MAP_SERVICE_PREF_PROPERTY, + + MAP_SERVICE_GEOCODE_TYPE, + MAP_SERVICE_REVERSE_GEOCODE_TYPE, + + MAP_SERVICE_POI_TYPE, + MAP_SERVICE_POI_SEARCH_BY_ADDRESS, + MAP_SERVICE_POI_SEARCH_BY_FREEFORM_ADDRESS, + MAP_SERVICE_POI_SEARCH_BY_CIRCLE_BOUNDARY, + MAP_SERVICE_POI_SEARCH_BY_RECT_BOUNDARY, + MAP_SERVICE_POI_SEARCH_BY_POLYGON_BOUNDARY, + MAP_SERVICE_POI_PREF_SORT_BY, + MAP_SERVICE_POI_PREF_PROPERTY, + MAP_SERVICE_POI_FILTER, + MAP_SERVICE_POI_FILTER_CATEGORY, + + MAP_SERVICE_ROUTE_REQUEST_FREEFORM_ADDR_TO_AVOID, + MAP_SERVICE_ROUTE_REQUEST_STRUCTED_ADDR_TO_AVOID, + MAP_SERVICE_ROUTE_REQUEST_CIRCLE_AREA_TO_AVOID, + MAP_SERVICE_ROUTE_REQUEST_RECT_AREA_TO_AVOID, + MAP_SERVICE_ROUTE_REQUEST_POLYGON_AREA_TO_AVOID, + MAP_SERVICE_ROUTE_REQUEST_FEATURE_TO_AVOID, + MAP_SERVICE_ROUTE_PREF_TYPE, + MAP_SERVICE_ROUTE_PREF_TRANSPORT_MODE, + MAP_SERVICE_ROUTE_PREF_GEOMETRY_BOUNDING_BOX, + MAP_SERVICE_ROUTE_PREF_GEOMETRY_RETRIEVAL, + MAP_SERVICE_ROUTE_PREF_INSTRUCTION_GEOMETRY, + MAP_SERVICE_ROUTE_PREF_INSTRUCTION_BOUNDING_BOX, + MAP_SERVICE_ROUTE_PREF_INSTRUCTION_RETRIEVAL, + MAP_SERVICE_ROUTE_PREF_REALTIME_TRAFFIC, + MAP_SERVICE_ROUTE_PREF_PROPERTY, + MAP_SERVICE_ROUTE_DISTANCE_UNIT, + MAP_SERVICE_ROUTE_PROPERTY, + MAP_SERVICE_ROUTE_SEGMENT_PROPERTY, + MAP_SERVICE_ROUTE_STEP_PROPERTY, + MAP_SERVICE_TYPE_MAX + +} LocationMapServiceType; + /** * @brief Location object redefined by GObject. */ @@ -95,11 +139,17 @@ typedef GObject LocationObject; typedef struct _LocationPosition LocationPosition; /** - * @brief This represents last known position information such as latitude-longitude values and accuracy. + * @brief This represents last known position information such as latitude-longitude values and accuracy. \n + * This would be deprecated soon. */ typedef struct _LocationLastPosition LocationLastPosition; /** + * @brief This represents position information such as number of satellites in used or in view. + */ +typedef struct _LocationSatellite LocationSatellite; + +/** * @brief This represents velocity information such as as speed, direction, climb. */ typedef struct _LocationVelocity LocationVelocity; @@ -110,24 +160,59 @@ typedef struct _LocationVelocity LocationVelocity; typedef struct _LocationAccuracy LocationAccuracy; /** + * @brief This represents boundary information such as rectangular or circle area. + */ +typedef struct _LocationBoundary LocationBoundary; + +/** * @brief This represents address information such as building number, street name, etc. */ typedef struct _LocationAddress LocationAddress; /** - * @brief This represents boundary information such as rectangular or circle area. + * @brief This represents a structure of Location preference. */ -typedef struct _LocationBoundary LocationBoundary; +typedef struct _LocationPreference LocationPreference; /** - * @brief This represents position information such as number of satellites in used or in view. + * @brief This represents a structure of Location POI filter. */ -typedef struct _LocationSatellite LocationSatellite; +typedef struct _LocationPOIFilter LocationPOIFilter; + +/** + * @brief This represents a structure of Location POI preference. + */ +typedef struct _LocationPOIPreference LocationPOIPreference; /** - * @brief This represents a number of POI informations. + * @brief This represents a structure of Landmark information. */ -typedef struct _LocationPOIInfo LocationPOIInfo; +typedef struct _LocationLandmark LocationLandmark; + +/** + * @brief This represents a structure of Landmark Url. + */ +typedef struct _LocationLandmarkUrl LocationLandmarkUrl; + +/** + * @brief This represents a structure of Location route preference. + */ +typedef struct _LocationRoutePreference LocationRoutePreference; + +/** + * @brief This represents a structure of Location route. + */ +typedef struct _LocationRoute LocationRoute; + +/** + * @brief This represents a structure of Location route segment. + */ +typedef struct _LocationRouteSegment LocationRouteSegment; + +/** + * @brief This represents a structure of Location route step. + */ +typedef struct _LocationRouteStep LocationRouteStep; /** * @brief This represents callback function which will be called to give position information. @@ -137,12 +222,17 @@ typedef void (*LocationPositionCB)(LocationError error, GList *position_list, GL /** * @brief This represents callback function which will be called to give address information. */ -typedef void (*LocationAddressCB)(LocationError error, LocationAddress *address, LocationAccuracy *acc, gpointer userdata); +typedef void (*LocationAddressCB)(LocationError error, LocationAddress *address, LocationAccuracy *acc, gpointer userdata); /** * @brief This represents callback function which will be called to give POI information. */ -typedef void (*LocationPOICB)(LocationError error, LocationPOIInfo *poi, gpointer userdata); +typedef void (*LocationPOICB)(LocationError error, guint req_id, GList *landmark_list, gchar *error_code, gchar *error_msg, gpointer userdata); + +/** + * @brief This represents callback function which will be called to give Route information. + */ +typedef void (*LocationRouteCB)(LocationError error, guint req_id, GList *route_list, gchar *error_code, gchar *error_msg, gpointer userdata); /** * @}@} diff --git a/location/location-geocode.c b/location/location-geocode.c deleted file mode 100644 index ce15850..0000000 --- a/location/location-geocode.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "location/location-log.h" - -#include "location/location-module-internal.h" - -#include "location/location-geocode.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" - -typedef struct _LocationGeocodePrivate { - LocationGeoMod* mod; -} LocationGeocodePrivate; - -enum { - PROP_0, - PROP_SERVICE_NAME -}; - -#define DEFAULT_SERVICE "decarta" - -#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOCATION_TYPE_GEOCODE, LocationGeocodePrivate)) - -static void location_ielement_interface_init (LocationIElementInterface *iface); - -G_DEFINE_TYPE_WITH_CODE (LocationGeocode, location_geocode, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (LOCATION_TYPE_IELEMENT, location_ielement_interface_init)); - - -static void -location_geocode_dispose (GObject *gobject) -{ - LOCATION_LOGD("location_geocode_dispose"); - - G_OBJECT_CLASS (location_geocode_parent_class)->dispose (gobject); -} - -static void -location_geocode_finalize (GObject *gobject) -{ - LOCATION_LOGD("location_geocode_finalize"); - LocationGeocodePrivate* priv = GET_PRIVATE(gobject); - module_free(priv->mod, "geocode"); - priv->mod = NULL; - G_OBJECT_CLASS (location_geocode_parent_class)->finalize (gobject); -} - -static void -location_geocode_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - LocationGeocodePrivate *priv = GET_PRIVATE (object); - - g_return_if_fail(priv->mod); - g_return_if_fail(priv->mod->handler); - switch (property_id){ - case PROP_SERVICE_NAME:{ - char* service_name = NULL; - if(priv->mod->ops.get_service_name){ - if( LOCATION_ERROR_NONE != priv->mod->ops.get_service_name(priv->mod->handler, &service_name) ){ - service_name = NULL; - } - } - LOCATION_LOGD("Get prop>> Service name: %s", service_name); - g_value_set_string(value, service_name); - g_free(service_name); - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static int -location_geocode_get_geocode (LocationGeocode *self, - const LocationAddress *address, - GList **position_list, - GList **accuracy_list) -{ - LOCATION_LOGD("location_geocode_get_geocode"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_geocode, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_geocode)(priv->mod->handler, address, position_list, accuracy_list); -} - -static int -location_geocode_get_geocode_freeform (LocationGeocode *self, - const gchar *address, - GList **position_list, - GList **accuracy_list) -{ - LOCATION_LOGD("location_geocode_get_geocode_freeform"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_geocode_freetext, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_geocode_freetext)(priv->mod->handler, address, position_list, accuracy_list); -} - -static int -location_geocode_get_reversegeocode (LocationGeocode *self, - const LocationPosition *position, - LocationAddress **address, - LocationAccuracy **accuracy) -{ - LOCATION_LOGD("location_geocode_get_reversegeocode"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_reverse_geocode, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_reverse_geocode)(priv->mod->handler, position, address, accuracy); -} - -static int -location_geocode_get_geocode_async (LocationGeocode *self, - LocationAddress *address, - LocationPositionCB callback, - gpointer userdata) -{ - LOCATION_LOGD("location_geocode_get_geocode_async"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_geocode_async, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_geocode_async)(priv->mod->handler, address, callback, userdata); -} - -static int -location_geocode_get_geocode_freeform_async (LocationGeocode *self, - const gchar *address, - LocationPositionCB callback, - gpointer userdata) -{ - LOCATION_LOGD("location_geocode_get_geocode_freeform_async"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_geocode_freetext_async, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_geocode_freetext_async)(priv->mod->handler, address, callback, userdata); -} - -static int -location_geocode_get_reversegeocode_async (LocationGeocode *self, - const LocationPosition *position, - LocationAddressCB callback, - gpointer userdata) -{ - LOCATION_LOGD("location_geocode_get_reversegeocode_async"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_reverse_geocode_async, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_reverse_geocode_async)(priv->mod->handler, position, callback, userdata); -} - -static void -location_ielement_interface_init (LocationIElementInterface *iface) -{ - iface->get_geocode = (TYPE_GET_GEOCODE)location_geocode_get_geocode; - iface->get_geocode_freeform = (TYPE_GET_GEOCODE_FREEFORM)location_geocode_get_geocode_freeform; - iface->get_reversegeocode = (TYPE_GET_REVERSEGEOCODE)location_geocode_get_reversegeocode; - iface->get_geocode_async = (TYPE_GET_GEOCODE_ASYNC)location_geocode_get_geocode_async; - iface->get_geocode_freeform_async = (TYPE_GET_GEOCODE_FREEFORM_ASYNC)location_geocode_get_geocode_freeform_async; - iface->get_reversegeocode_async = (TYPE_GET_REVERSEGEOCODE_ASYNC)location_geocode_get_reversegeocode_async; -} - -static void -location_geocode_init (LocationGeocode *self) -{ - LOCATION_LOGD("location_geocode_init"); - LocationGeocodePrivate* priv = GET_PRIVATE(self); - - priv->mod = (LocationGeoMod*)module_new("geocode"); - if(!priv->mod) LOCATION_LOGW("module loading failed"); -} - -static void -location_geocode_class_init (LocationGeocodeClass *klass) -{ - LOCATION_LOGD("location_geocode_class_init"); - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GParamSpec *pspec; - - gobject_class->get_property = location_geocode_get_property; - - gobject_class->dispose = location_geocode_dispose; - gobject_class->finalize = location_geocode_finalize; - - g_type_class_add_private (klass, sizeof (LocationGeocodePrivate)); - - pspec = g_param_spec_string ("service provider", - "geocode service provider name prop", - "geocode service provider name", - DEFAULT_SERVICE, - G_PARAM_READABLE); - g_object_class_install_property (gobject_class, - PROP_SERVICE_NAME, - pspec); -} diff --git a/location/location-ielement.h b/location/location-ielement.h deleted file mode 100644 index a283321..0000000 --- a/location/location-ielement.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LOCATION_IELEMENT_H__ -#define __LOCATION_IELEMENT_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * @file location-ielement.h - * @brief This file contains the internal definitions and structures related to location interface. - * @addtogroup LocationInternal - * @{ - *@} - */ - -G_BEGIN_DECLS - -enum { - SERVICE_ENABLED, - SERVICE_DISABLED, - SERVICE_UPDATED, - ZONE_IN, - ZONE_OUT, - LAST_SIGNAL -}; - -#define LOCATION_TYPE_IELEMENT (location_ielement_get_type ()) -#define LOCATION_IELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOCATION_TYPE_IELEMENT, LocationIElement)) -#define LOCATION_IS_IELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOCATION_TYPE_IELEMENT)) -#define LOCATION_IELEMENT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LOCATION_TYPE_IELEMENT, LocationIElementInterface)) - -typedef struct _LocationIElement LocationIElement; -typedef struct _LocationIElementInterface LocationIElementInterface; - -typedef int (*TYPE_START_FUNC)(LocationIElement *self); -typedef int (*TYPE_STOP_FUNC) (LocationIElement *self); -typedef int (*TYPE_GET_POSITION)(LocationIElement *self, LocationPosition **position, LocationAccuracy **accuracy); -typedef int (*TYPE_GET_VELOCITY)(LocationIElement *self, LocationVelocity **velocity, LocationAccuracy **accuracy); -typedef int (*TYPE_GET_GEOCODE)(LocationIElement *self, const LocationAddress *address, GList **position_list, GList **accuracy_list); -typedef int (*TYPE_GET_GEOCODE_FREEFORM)(LocationIElement *self, const gchar *address, GList **position_list, GList **accuracy_list); -typedef int (*TYPE_GET_REVERSEGEOCODE)(LocationIElement *self, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); -typedef int (*TYPE_GET_GEOCODE_ASYNC)(LocationIElement *self, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); -typedef int (*TYPE_GET_GEOCODE_FREEFORM_ASYNC)(LocationIElement *self, const gchar *address, LocationPositionCB callback, gpointer userdata); -typedef int (*TYPE_GET_REVERSEGEOCODE_ASYNC)(LocationIElement *self, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); -typedef int (*TYPE_GET_POI)(LocationIElement *self, gdouble radius, const gchar* keyword, LocationPOIInfo** poi); -typedef int (*TYPE_GET_POI_ASYNC)(LocationIElement *self, gdouble radius, const gchar* keyword, LocationPOICB callback, gpointer userdata); -typedef int (*TYPE_GET_POI_FROM_ADDRESS)(LocationIElement *self, const LocationAddress* address, gdouble radius, const gchar* keyword, LocationPOIInfo** poi); -typedef int (*TYPE_GET_POI_FROM_POSITION)(LocationIElement *self, const LocationPosition* position, gdouble radius, const gchar* keyword, LocationPOIInfo** poi); -typedef int (*TYPE_GET_POI_FROM_ADDRESS_ASYNC)(LocationIElement *self, const LocationAddress* address, gdouble radius, const gchar* keyword, LocationPOICB callback, gpointer userdata); -typedef int (*TYPE_GET_POI_FROM_POSITION_ASYNC)(LocationIElement *self, const LocationPosition* position, gdouble radius, const gchar* keyword, LocationPOICB callback, gpointer userdata); - -struct _LocationIElementInterface -{ - GTypeInterface parent_iface; - - TYPE_START_FUNC start; - TYPE_STOP_FUNC stop; - TYPE_GET_POSITION get_position; - TYPE_GET_VELOCITY get_velocity; - TYPE_GET_GEOCODE get_geocode; - TYPE_GET_GEOCODE_FREEFORM get_geocode_freeform; - TYPE_GET_REVERSEGEOCODE get_reversegeocode; - TYPE_GET_GEOCODE_ASYNC get_geocode_async; - TYPE_GET_GEOCODE_FREEFORM_ASYNC get_geocode_freeform_async; - TYPE_GET_REVERSEGEOCODE_ASYNC get_reversegeocode_async; - TYPE_GET_POI get_poi; - TYPE_GET_POI_FROM_ADDRESS get_poi_from_address; - TYPE_GET_POI_FROM_POSITION get_poi_from_position; - TYPE_GET_POI_ASYNC get_poi_async; - TYPE_GET_POI_FROM_ADDRESS_ASYNC get_poi_from_address_async; - TYPE_GET_POI_FROM_POSITION_ASYNC get_poi_from_position_async; -}; - -GType location_ielement_get_type (void); - -int location_ielement_start (LocationIElement *self); -int location_ielement_stop(LocationIElement *self); -int location_ielement_get_position (LocationIElement *self, LocationPosition **position, LocationAccuracy **accuracy); -int location_ielement_get_velocity (LocationIElement *self, LocationVelocity **velocity, LocationAccuracy **accuracy); -int location_ielement_get_geocode (LocationIElement *self, const LocationAddress *address, GList **position_list, GList **accuracy_list); -int location_ielement_get_geocode_freeform (LocationIElement *self, const gchar *address, GList **position_list, GList **accuracy_list); -int location_ielement_get_reversegeocode (LocationIElement *self, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); -int location_ielement_get_geocode_async (LocationIElement *self, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); -int location_ielement_get_geocode_freeform_async (LocationIElement *self, const gchar *address, LocationPositionCB callback, gpointer userdata); -int location_ielement_get_reversegeocode_async (LocationIElement *self, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); -int location_ielement_get_poi(LocationIElement *self, gdouble radius, const gchar *keyword, LocationPOIInfo **poi); -int location_ielement_get_poi_from_address(LocationIElement *self, const LocationAddress *address, gdouble radius, const gchar *keyword, LocationPOIInfo **poi); -int location_ielement_get_poi_from_position (LocationIElement *self, const LocationPosition *position, gdouble radius, const gchar *keyword, LocationPOIInfo **poi); -int location_ielement_get_poi_async(LocationIElement *self, gdouble radius, const gchar *keyword, LocationPOICB callback, gpointer userdata); -int location_ielement_get_poi_from_address_async(LocationIElement *self, const LocationAddress *address, gdouble radius, const gchar *keyword, LocationPOICB callback, gpointer userdata); -int location_ielement_get_poi_from_position_async (LocationIElement *self, const LocationPosition *position, gdouble radius, const gchar *keyword, LocationPOICB callback, gpointer userdata); - -G_END_DECLS - -#endif diff --git a/location/location-poi-info.c b/location/location-poi-info.c deleted file mode 100644 index 9429f5f..0000000 --- a/location/location-poi-info.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "location/location-poi-info.h" -#include "location/location-log.h" - -GType -location_poiinfo_get_type (void) -{ - static volatile gsize type_volatile = 0; - if(g_once_init_enter(&type_volatile)) { - GType type = g_boxed_type_register_static ( - g_intern_static_string ("LocationPOIInfo"), - (GBoxedCopyFunc) location_poiinfo_copy, - (GBoxedFreeFunc) location_poiinfo_free); - g_once_init_leave(&type_volatile, type); - } - return type_volatile; -} - -GHashTable* -location_poiinfo_detail_properties_new (void) -{ - return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); -} - -void -location_poiinfo_detail_properties_free (GHashTable* properties) -{ - g_return_if_fail(properties); - g_hash_table_destroy(properties); -} - -gboolean -location_poiinfo_detail_properties_insert (GHashTable* properties, - const gchar* key, - const gchar* value) -{ - g_return_val_if_fail(properties, FALSE); - g_hash_table_insert (properties, g_strdup(key), g_strdup(value)); - return TRUE; -} - -static void -copy_poiinfo_detail_properties (gchar *key, - gchar *value, - GHashTable *properties) -{ - location_poiinfo_detail_properties_insert(properties, key, value); -} - -GHashTable * -location_poiinfo_detail_properties_copy (const GHashTable *properties) -{ - g_return_val_if_fail(properties, NULL); - - GHashTable *dup = location_poiinfo_detail_properties_new (); - g_hash_table_foreach (properties, - (GHFunc)copy_poiinfo_detail_properties, - dup); - return dup; -} - -LocationPOIInfo * -location_poiinfo_new (int num_of_poi) -{ - LocationPOIInfo* poi_info = g_slice_new0(LocationPOIInfo); - poi_info->num_of_poi = num_of_poi; - poi_info->poi_detail = g_new0(LocationPOIDetail, poi_info->num_of_poi); - return poi_info; -} - -void -location_poiinfo_free (LocationPOIInfo* poi_info) -{ - g_return_if_fail(poi_info); - if(poi_info->poi_detail){ - int i = 0; - for (i = 0 ; i < poi_info->num_of_poi ; i++) { - g_free(poi_info->poi_detail[i].name); - g_free(poi_info->poi_detail[i].type); - location_address_free(poi_info->poi_detail[i].address); - location_position_free(poi_info->poi_detail[i].position); - g_free(poi_info->poi_detail[i].phone_number); - location_poiinfo_detail_properties_free(poi_info->poi_detail[i].properties); - } - } - g_free(poi_info->poi_detail); - g_slice_free(LocationPOIInfo, poi_info); -} - -LocationPOIInfo * -location_poiinfo_copy (const LocationPOIInfo* poi_info) -{ - LocationPOIInfo* poi_info_dup = location_poiinfo_new(poi_info->num_of_poi); - int i = 0; - for (i = 0 ; i < poi_info_dup->num_of_poi ; i++) - location_poiinfo_set_poi_detail (poi_info_dup, i, - poi_info->poi_detail[i].name, - poi_info->poi_detail[i].type, - poi_info->poi_detail[i].address, - poi_info->poi_detail[i].position, - poi_info->poi_detail[i].phone_number, - poi_info->poi_detail[i].properties); - - return poi_info_dup; -} - -gboolean -location_poiinfo_get_poi_detail (LocationPOIInfo *poi_info, - guint index, - gchar** name, - gchar** type, - LocationAddress** address, - LocationPosition** position, - gchar** phone_number, - GHashTable** properties) -{ - LOCATION_LOGD("location_poiinfo_get_poi_detail"); - g_return_val_if_fail(name, FALSE); - g_return_val_if_fail(type, FALSE); - g_return_val_if_fail(address, FALSE); - g_return_val_if_fail(position, FALSE); - g_return_val_if_fail(phone_number, FALSE); - g_return_val_if_fail(properties, FALSE); - g_return_val_if_fail(index < poi_info->num_of_poi, FALSE); - - *name = g_strdup(poi_info->poi_detail[index].name); - *type = g_strdup(poi_info->poi_detail[index].type); - *address = location_address_copy(poi_info->poi_detail[index].address); - *position = location_position_copy(poi_info->poi_detail[index].position); - *phone_number = g_strdup(poi_info->poi_detail[index].phone_number); - *properties = location_poiinfo_detail_properties_copy(poi_info->poi_detail[index].properties); - - return TRUE; -} - -gboolean -location_poiinfo_set_poi_detail (LocationPOIInfo *poi_info, - guint index, - const gchar* name, - const gchar* type, - const LocationAddress* address, - const LocationPosition* position, - const gchar* phone_number, - const GHashTable* properties) -{ - LOCATION_LOGD("location_poiinfo_set_poi_detail"); - g_return_val_if_fail(name, FALSE); - g_return_val_if_fail(type, FALSE); - g_return_val_if_fail(address, FALSE); - g_return_val_if_fail(position, FALSE); - g_return_val_if_fail(phone_number, FALSE); - g_return_val_if_fail( index < poi_info->num_of_poi, FALSE); - - g_free(poi_info->poi_detail[index].name); - g_free(poi_info->poi_detail[index].type); - location_address_free(poi_info->poi_detail[index].address); - location_position_free(poi_info->poi_detail[index].position); - g_free(poi_info->poi_detail[index].phone_number); - location_poiinfo_detail_properties_free(poi_info->poi_detail[index].properties); - - poi_info->poi_detail[index].name = g_strdup(name); - poi_info->poi_detail[index].type = g_strdup(type); - poi_info->poi_detail[index].address = location_address_copy(address); - poi_info->poi_detail[index].position = location_position_copy(position); - poi_info->poi_detail[index].phone_number = g_strdup(phone_number); - poi_info->poi_detail[index].properties = location_poiinfo_detail_properties_copy(properties); - - return TRUE; -} diff --git a/location/location-poi-info.h b/location/location-poi-info.h deleted file mode 100644 index 6488907..0000000 --- a/location/location-poi-info.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LOCATION_POI_INFO_H__ -#define __LOCATION_POI_INFO_H__ - -#include -#include -#include - -/** - * @file location-poi-info.h - * @brief This file contains the internal definitions and structures related to POI information. - * @addtogroup LocationTypes - * @{ - */ - -G_BEGIN_DECLS - -/** - * @brief This represents one POI information such as name, type of POI, etc. - */ -typedef struct _LocationPOIDetail { - gchar *name; // Name of a POI - gchar *type; // Type of a POI (e.g. cafe) - LocationAddress *address; // Address of a POI - LocationPosition *position; // Position of a POI - gchar *phone_number; // Phone number of a POI - GHashTable *properties; // GHashTable with detailed characteristics of a POI. -} LocationPOIDetail; - -/** - * @brief This represents a number of POI informations. - */ -struct _LocationPOIInfo -{ - guint num_of_poi; - LocationPOIDetail *poi_detail; -}; - -GType location_poiinfo_get_type (void); -#define LOCATION_TYPE_POIINFO (location_poiinfo_get_type ()) - -/** - * @brief Create a new GHashTable for properties in a #LocationPOIDetail. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param None. - * @return a new GHashTable. - * @retval NULL if error occured - */ -GHashTable *location_poiinfo_detail_properties_new (void); - -/** - * @brief Free a GHashTable for properties in a #LocationPOIDetail. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] properties - a #GHashTable. - * @return None. - */ -void location_poiinfo_detail_properties_free (GHashTable* properties); - -/** - * @brief Insert a new key and value into a GHashTable for properties in a #LocationPOIDetail. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] properties - a #GHashTable in a #LocationPOIDetail. - * @param [in] key - a key to insert (e.g. URL) - * @param [in] value - the value to associate with the key. (e.g. http://www.samsung.com) - * @return gboolean - * @retval\n - * TRUE - if success\n - * FALSE - if error occured\n - */ -gboolean location_poiinfo_detail_properties_insert (GHashTable* properties, const gchar* key, const gchar* value); - -/** - * @brief Makes a copy of GHashTable for properties in a #LocationPOIDetail. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] properties - a #GHashTable - * @return a new #GHashTable - * @retval NULL if error occured - */ -GHashTable *location_poiinfo_detail_properties_copy (const GHashTable *properties); - -/** - * @brief Create a new #LocationPOIInfo with given number of #LocationPOIDetail. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] num_of_poi - number of #LocationPOIDetail. - * @return a new #LocationPOIInfo - * @retval NULL if error occured - */ -LocationPOIInfo* location_poiinfo_new (int num_of_poi); - -/** - * @brief Free a #LocationPOIInfo. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] poi_info - a #LocationPOIInfo. - * @return None. - */ -void location_poiinfo_free(LocationPOIInfo* poi_info); - -/** - * @brief Makes a copy of #LocationPOIInfo - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] poi_info - a #LocationPOIInfo - * @return a new #LocationPOIInfo - * @retval NULL if error occured - */ -LocationPOIInfo *location_poiinfo_copy (const LocationPOIInfo* poi_info); - -/** - * @brief Get elements of #LocationPOIDetail with given index in #LocationPOIInfo. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] poi_info - a #LocationPOIInfo - * @param [in] index - index of #LocationPOIDetail in #LocationPOIInfo - * @param [out] name - a name of a #LocationPOIDetail - * @param [out] type - a type of a #LocationPOIDetail - * @param [out] address - a address of a #LocationPOIDetail - * @param [out] position - a position of a#LocationPOIDetail - * @param [out] phone_number - a phone number of #LocationPOIDetail - * @param [out] properties - a GHashTable with properties of #LocationPOIDetail - * @return gboolean - * @retval\n - * TRUE - if success\n - * FALSE - if error occured\n - */ -gboolean location_poiinfo_get_poi_detail(LocationPOIInfo *poi_info, guint index, gchar** name, gchar** type, LocationAddress** address, LocationPosition** position, gchar** phone_number, GHashTable** properties); - -/** - * @brief Set elements of #LocationPOIDetail with given index in #LocationPOIInfo. - * @remarks None. - * @pre #location_init should be called before.\n - * @post None. - * @param [in] poi_info - a #LocationPOIInfo - * @param [in] index - index of #LocationPOIDetail in #LocationPOIInfo - * @param [in] name - a name of a #LocationPOIDetail - * @param [in] type - a type of a #LocationPOIDetail - * @param [in] address - a address of a #LocationPOIDetail - * @param [in] position - a position of a #LocationPOIDetail - * @param [in] phone_number - a phone number of a #LocationPOIDetail - * @param [in] properties - a GHashTable with properties of a #LocationPOIDetail, can be NULL if a POI have no additional properties - * @return gboolean - * @retval\n - * TRUE - if success\n - * FALSE - if error occured\n - */ -gboolean location_poiinfo_set_poi_detail(LocationPOIInfo *poi_info, guint index, const gchar* name, const gchar* type, const LocationAddress* address, const LocationPosition* position, const gchar* phone_number, const GHashTable* properties); - -/** - * @} - */ - -G_END_DECLS - -#endif diff --git a/location/location-poi.c b/location/location-poi.c deleted file mode 100644 index 20084bb..0000000 --- a/location/location-poi.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "location/location-log.h" - -#include "location/location-module-internal.h" - -#include "location/location-poi.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" - -typedef struct _LocationPoiPrivate { - LocationPoiMod* mod; -} LocationPoiPrivate; - -enum { - PROP_0, - PROP_SERVICE_NAME -}; - -#define DEFAULT_SERVICE "decarta" - -#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOCATION_TYPE_POI, LocationPoiPrivate)) - -static void location_ielement_interface_init (LocationIElementInterface *iface); - -G_DEFINE_TYPE_WITH_CODE (LocationPoi, location_poi, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (LOCATION_TYPE_IELEMENT, location_ielement_interface_init)); - - -static void -location_poi_dispose (GObject *gobject) -{ - LOCATION_LOGD("location_poi_dispose"); - - G_OBJECT_CLASS (location_poi_parent_class)->dispose (gobject); -} - -static void -location_poi_finalize (GObject *gobject) -{ - LOCATION_LOGD("location_poi_finalize"); - LocationPoiPrivate* priv = GET_PRIVATE(gobject); - module_free(priv->mod, "poi"); - priv->mod = NULL; - G_OBJECT_CLASS (location_poi_parent_class)->finalize (gobject); -} - -static void -location_poi_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - LocationPoiPrivate *priv = GET_PRIVATE (object); - - g_return_if_fail(priv->mod); - g_return_if_fail(priv->mod->handler); - switch (property_id){ - case PROP_SERVICE_NAME:{ - char* service_name = NULL; - if(priv->mod->ops.get_service_name){ - if( LOCATION_ERROR_NONE != priv->mod->ops.get_service_name(priv->mod->handler, &service_name) ){ - service_name = NULL; - } - } - LOCATION_LOGD("Get prop>> Service name: %s", service_name); - g_value_set_string(value, service_name); - g_free(service_name); - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static int -location_poi_get_poi (LocationPoi *poi, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) -{ - LOCATION_LOGD("location_poi_get_poi"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_poi, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_poi)(priv->mod->handler, radius, keyword, poi_info); -} - -static int -location_poi_get_poi_from_address (LocationPoi *poi, - const LocationAddress *address, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) -{ - LOCATION_LOGD("location_poi_get_poi_from_address"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_poi_from_address, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_poi_from_address)(priv->mod->handler, address, radius, keyword, poi_info); -} - -static int -location_poi_get_poi_from_position (LocationPoi *poi, - const LocationPosition *position, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) -{ - LOCATION_LOGD("location_poi_get_poi_from_position"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_poi_from_position, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_poi_from_position)(priv->mod->handler, position, radius, keyword, poi_info); -} - -static int -location_poi_get_poi_async (LocationPoi *poi, - gdouble radius, - const gchar *keyword, - LocationPOICB callback, - gpointer userdata) -{ - LOCATION_LOGD("location_poi_get_poi_async"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_poi_async, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_poi_async)(priv->mod->handler, radius, keyword, callback, userdata); -} - -static int -location_poi_get_poi_from_address_async (LocationPoi *poi, - const LocationAddress *address, - gdouble radius, - const gchar *keyword, - LocationPOICB callback, - gpointer userdata) -{ - LOCATION_LOGD("location_poi_get_poi_from_address_async"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_poi_from_address_async, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_poi_from_address_async)(priv->mod->handler, address, radius, keyword, callback, userdata); -} - -static int -location_poi_get_poi_from_position_async (LocationPoi *poi, - const LocationPosition *position, - gdouble radius, - const gchar* keyword, - LocationPOICB callback, - gpointer userdata) -{ - LOCATION_LOGD("location_poi_get_poi_from_position_async"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (priv->mod->ops.get_poi_from_position_async, LOCATION_ERROR_NOT_AVAILABLE); - return (priv->mod->ops.get_poi_from_position_async)(priv->mod->handler, position, radius, keyword, callback, userdata); -} - -static void -location_ielement_interface_init (LocationIElementInterface *iface) -{ - iface->get_poi = (TYPE_GET_POI)location_poi_get_poi; - iface->get_poi_from_address = (TYPE_GET_POI_FROM_ADDRESS)location_poi_get_poi_from_address; - iface->get_poi_from_position = (TYPE_GET_POI_FROM_POSITION)location_poi_get_poi_from_position; - iface->get_poi_async = (TYPE_GET_POI_ASYNC)location_poi_get_poi_async; - iface->get_poi_from_address_async = (TYPE_GET_POI_FROM_ADDRESS_ASYNC)location_poi_get_poi_from_address_async; - iface->get_poi_from_position_async = (TYPE_GET_POI_FROM_POSITION_ASYNC)location_poi_get_poi_from_position_async; -} - -static void -location_poi_init (LocationPoi *poi) -{ - LOCATION_LOGD("location_poi_init"); - LocationPoiPrivate* priv = GET_PRIVATE(poi); - - priv->mod = (LocationPoiMod*)module_new("poi"); - if(!priv->mod) LOCATION_LOGW("module loading failed"); -} - -static void -location_poi_class_init (LocationPoiClass *klass) -{ - LOCATION_LOGD("location_poi_class_init"); - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GParamSpec *pspec; - - gobject_class->get_property = location_poi_get_property; - - gobject_class->dispose = location_poi_dispose; - gobject_class->finalize = location_poi_finalize; - - g_type_class_add_private (klass, sizeof (LocationPoiPrivate)); - - pspec = g_param_spec_string ("service provider", - "poi service provider name prop", - "poi service provider name", - DEFAULT_SERVICE, - G_PARAM_READABLE); - g_object_class_install_property (gobject_class, - PROP_SERVICE_NAME, - pspec); -} diff --git a/location/location-poi.h b/location/location-poi.h deleted file mode 100644 index 03dbf55..0000000 --- a/location/location-poi.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LOCATION_POI_H__ -#define __LOCATION_POI_H__ - -#include - -/** - * @addtogroup Location - * @{ - * @file location-poi.h - * @brief This file contains the internal definitions and structures related to POI. - *@} - */ - -G_BEGIN_DECLS - -#define LOCATION_TYPE_POI (location_poi_get_type ()) -#define LOCATION_POI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOCATION_TYPE_POI, LocationPoi)) -#define LOCATION_IS_POI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOCATION_TYPE_POI)) -#define LOCATION_POI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOCATION_TYPE_POI, LocationPoiClass)) -#define LOCATION_IS_POI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOCATION_TYPE_POI)) -#define LOCATION_POI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOCATION_TYPE_POI, LocationPoiClass)) - -typedef struct _LocationPoi LocationPoi; -typedef struct _LocationPoiClass LocationPoiClass; - -struct _LocationPoi -{ - GObject parent_instance; -}; - -struct _LocationPoiClass -{ - GObjectClass parent_class; -}; - -GType location_poi_get_type (void); - -G_END_DECLS - -#endif diff --git a/location/location.c b/location/location.c deleted file mode 100644 index 637aef5..0000000 --- a/location/location.c +++ /dev/null @@ -1,473 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include "location/location.h" -#include "location/location-log.h" -#include "location/location-setting.h" -#include "location/location-module-internal.h" -#include "location/location-ielement.h" -#include "location/location-hybrid.h" -#include "location/location-gps.h" -#include "location/location-wps.h" -#include "location/location-ips.h" -#include "location/location-cps.h" -#include "location/location-sps.h" -#include "location/location-geocode.h" -#include "location/location-poi.h" -#include "location/location-position.h" - -static LocationObject *geocode = NULL; -static LocationObject *poi = NULL; - -static gboolean -is_connected_network() -{ - gboolean is_connected = TRUE; - int net_state = 0; - - net_state = location_setting_get_int(VCONFKEY_NETWORK_STATUS); - - LOCATION_LOGW("net_state[%d]", net_state); - if(net_state == VCONFKEY_NETWORK_OFF) { - is_connected = FALSE; - } - - return is_connected; - -} - -EXPORT_API int location_init (void) -{ - LOCATION_LOGD("location_init"); - g_type_init (); - if( FALSE == module_init() ) - return LOCATION_ERROR_NOT_AVAILABLE; - - return LOCATION_ERROR_NONE; -} - -EXPORT_API LocationObject* -location_new (LocationMethod method) -{ - LocationObject *self = NULL; - - if (!geocode) - geocode = g_object_new (LOCATION_TYPE_GEOCODE, NULL); - - /*if (!poi) - poi = g_object_new (LOCATION_TYPE_POI, NULL);*/ - - switch (method) { - case LOCATION_METHOD_HYBRID: - self = g_object_new (LOCATION_TYPE_HYBRID, NULL); - break; - case LOCATION_METHOD_GPS: - self = g_object_new (LOCATION_TYPE_GPS, NULL); - break; - case LOCATION_METHOD_WPS: - self = g_object_new (LOCATION_TYPE_WPS, NULL); - break; - case LOCATION_METHOD_CPS: - self = g_object_new (LOCATION_TYPE_CPS, NULL); - break; - case LOCATION_METHOD_IPS: - self = g_object_new (LOCATION_TYPE_IPS, NULL); - break; - case LOCATION_METHOD_SPS: - self = g_object_new (LOCATION_TYPE_SPS, NULL); - break; - default: - break; - } - return self; -} - -EXPORT_API int -location_free (LocationObject *obj) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - - //location_ielement_stop(LOCATION_IELEMENT(obj)); - if (geocode) { - g_object_unref (geocode); - geocode = NULL; - } - /*if (poi) { - g_object_unref (poi); - poi = NULL; - }*/ - g_object_unref (obj); - return LOCATION_ERROR_NONE; -} - -EXPORT_API int -location_start (LocationObject *obj) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - return location_ielement_start (LOCATION_IELEMENT(obj)); -} - -EXPORT_API int -location_stop (LocationObject *obj) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - return location_ielement_stop (LOCATION_IELEMENT(obj)); -} - -EXPORT_API gboolean -location_is_supported_method(LocationMethod method) -{ - gboolean is_supported = FALSE; - - switch(method) { - case LOCATION_METHOD_HYBRID: - if(module_is_supported("gps") || module_is_supported("wps") || module_is_supported("sps")) - is_supported = TRUE; - break; - case LOCATION_METHOD_GPS: - is_supported = module_is_supported("gps"); - break; - case LOCATION_METHOD_WPS: - is_supported = module_is_supported("wps"); - break; - case LOCATION_METHOD_SPS: - is_supported = module_is_supported("sps"); - break; - case LOCATION_METHOD_CPS: - case LOCATION_METHOD_IPS: - default: - break; - } - - return is_supported; -} - -EXPORT_API gboolean -location_is_enabled_gps(LocationObject *obj) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - - return (gboolean) location_setting_get_int(GPS_ENABLED); -} - -EXPORT_API int -location_get_position (LocationObject *obj, - LocationPosition **position, - LocationAccuracy **accuracy) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); - return location_ielement_get_position (LOCATION_IELEMENT(obj), position, accuracy); -} - -EXPORT_API int -location_get_last_position (LocationObject *obj, LocationMethod method, - LocationPosition **position, - LocationAccuracy **accuracy) -{ - g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); - - return LOCATION_ERROR_NONE; -} - -EXPORT_API int -location_get_last_known_position (LocationObject *obj, LocationMethod method, - LocationLastPosition *last_position) -{ - g_return_val_if_fail (last_position, LOCATION_ERROR_PARAMETER); - - LocationMethod redefined_method = method; - - if (!obj) redefined_method = LOCATION_METHOD_HYBRID; - - if (redefined_method == LOCATION_METHOD_HYBRID) { - int gps_timestamp = 0, wps_timestamp = 0, sps_timestamp = 0; - int latest_timestamp = 0; - - redefined_method = LOCATION_METHOD_SPS; - vconf_get_int(GPS_LAST_TIMESTAMP, &gps_timestamp); - vconf_get_int(WPS_LAST_TIMESTAMP, &wps_timestamp); - vconf_get_int(SPS_LAST_TIMESTAMP, &sps_timestamp); - - redefined_method = LOCATION_METHOD_SPS; - latest_timestamp = sps_timestamp; - if (gps_timestamp > sps_timestamp) { - redefined_method = LOCATION_METHOD_GPS; - latest_timestamp = gps_timestamp; - } - - if (wps_timestamp > latest_timestamp) { - redefined_method = LOCATION_METHOD_WPS; - } - - } - - if (get_last_known_position (redefined_method, last_position)) { - return LOCATION_ERROR_UNKNOWN; - } - - return LOCATION_ERROR_NONE; -} - -EXPORT_API int -location_get_satellite (LocationObject *obj, LocationSatellite **satellite) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (satellite, LOCATION_ERROR_PARAMETER); - - return LOCATION_ERROR_NONE;; -} - -EXPORT_API int -location_get_last_satellite (LocationObject *obj, LocationSatellite **satellite) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (satellite, LOCATION_ERROR_PARAMETER); - - return LOCATION_ERROR_NONE;; -} - -EXPORT_API int -location_get_position_from_address (LocationObject *obj, - const LocationAddress *address, - GList **position_list, - GList **accuracy_list) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_geocode (LOCATION_IELEMENT(geocode), address, position_list, accuracy_list); -} - -EXPORT_API int -location_get_position_from_freeformed_address (LocationObject *obj, - const gchar *address, - GList **position_list, - GList **accuracy_list) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_geocode_freeform (LOCATION_IELEMENT(geocode), address, position_list, accuracy_list); -} - -EXPORT_API int -location_get_velocity (LocationObject *obj, - LocationVelocity **velocity, - LocationAccuracy **accuracy) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (velocity, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); - - return location_ielement_get_velocity (LOCATION_IELEMENT(obj), velocity, accuracy); -} - -EXPORT_API int -location_get_last_velocity (LocationObject *obj, - LocationVelocity **velocity, - LocationAccuracy **accuracy) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (velocity, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); - return LOCATION_ERROR_NONE; -} - -EXPORT_API int -location_get_address (LocationObject *obj, - LocationAddress **address, - LocationAccuracy **accuracy) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - - LocationPosition *position = NULL; - int ret = location_ielement_get_position(LOCATION_IELEMENT (obj), &position, accuracy); - if (LOCATION_ERROR_NONE != ret) return ret; - ret = location_ielement_get_reversegeocode (LOCATION_IELEMENT(geocode), position, address, accuracy); - location_position_free (position); - return ret; -} - -EXPORT_API int -location_get_address_from_position (LocationObject *obj, - const LocationPosition *position, - LocationAddress **address, - LocationAccuracy **accuracy) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_reversegeocode (LOCATION_IELEMENT(geocode), position, address, accuracy); -} - -EXPORT_API int -location_get_position_from_address_async (LocationObject *obj, - const LocationAddress *address, - LocationPositionCB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_geocode_async (LOCATION_IELEMENT(geocode), address, callback, userdata); -} - - -EXPORT_API int -location_get_position_from_freeformed_address_async (LocationObject *obj, - const gchar *address, - LocationPositionCB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_geocode_freeform_async (LOCATION_IELEMENT(geocode), address, callback, userdata); -} - -EXPORT_API int -location_get_address_async (LocationObject *obj, - LocationAddressCB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - - LocationPosition *position = NULL; - LocationAccuracy *acc = NULL; - int ret = location_ielement_get_position(LOCATION_IELEMENT(obj), &position, &acc); - if (LOCATION_ERROR_NONE != ret) return ret; - ret = location_ielement_get_reversegeocode_async (LOCATION_IELEMENT(geocode), position, callback, userdata); - location_position_free (position); - return ret; -} - -EXPORT_API int -location_get_address_from_position_async (LocationObject *obj, - const LocationPosition *position, - LocationAddressCB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (geocode, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_reversegeocode_async (LOCATION_IELEMENT(geocode), position, callback, userdata); -} - -EXPORT_API int -location_get_poi (LocationObject *obj, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_poi(LOCATION_IELEMENT(poi), radius, keyword, poi_info); -} - -EXPORT_API int -location_get_poi_from_address(LocationObject *obj, - const LocationAddress *address, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_poi_from_address(LOCATION_IELEMENT(poi), address, radius, keyword, poi_info); -} - -EXPORT_API int -location_get_poi_from_position(LocationObject *obj, - const LocationPosition *position, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_poi_from_position(LOCATION_IELEMENT(poi), position, radius, keyword, poi_info); -} - -EXPORT_API int -location_get_poi_async (LocationObject *obj, - gdouble radius, - const gchar *keyword, - LocationPOICB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_poi_async(LOCATION_IELEMENT(poi), radius, keyword, callback, userdata); -} - -EXPORT_API int -location_get_poi_from_address_async (LocationObject *obj, - const LocationAddress *address, - gdouble radius, - const gchar *keyword, - LocationPOICB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_poi_from_address_async(LOCATION_IELEMENT(poi), address, radius, keyword, callback, userdata); -} - -EXPORT_API int -location_get_poi_from_position_async (LocationObject *obj, - const LocationPosition *position, - gdouble radius, - const gchar*keyword, - LocationPOICB callback, - gpointer userdata) -{ - g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi, LOCATION_ERROR_NOT_AVAILABLE); - g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); - return location_ielement_get_poi_from_position_async(LOCATION_IELEMENT(poi), position, radius, keyword, callback, userdata); -} - -EXPORT_API int -location_send_command(const char *cmd) -{ - g_return_val_if_fail (cmd, LOCATION_ERROR_PARAMETER); - - return LOCATION_ERROR_NONE; -} - diff --git a/location/location.h b/location/location.h deleted file mode 100644 index 42f6f58..0000000 --- a/location/location.h +++ /dev/null @@ -1,1442 +0,0 @@ -/* - * libslp-location - * - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Youngae Kang , Yunhan Kim , - * Genie Kim , Minjune Kim - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef __LOCATION_H__ -#define __LOCATION_H__ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -G_BEGIN_DECLS - -/** - * @file location.h - * @brief This file contains the Location API and related structure and enumeration. - */ -/** - * @defgroup LocationFW LocationFW - * @brief This is a Locatoin Framework for providing location based services. - * @addtogroup LocationFW - * @{ - * @defgroup LocationAPI Location API - * @brief This sub module provides the Location API. - * @addtogroup LocationAPI - * @{ - */ - -/** - * @brief - * Initialize location sub module. - * @remarks None. - * This API should be called before any other Location APIs. - * @pre None. - * @post None. - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see None. - * @par Example - * @code -#include -int main (int argc, char *argv[]) -{ - location_init(); - // Now you can use any other Location APIs. - return 0; -} - * @endcode - */ -int location_init (void); - -/** - * @brief - * Create a new #LocationObject by using given #LocationMethod. - * @remarks - * Returned object is necessary for other APIs. - * @pre - * #location_init should be called before. - * @post None. - * @param [in] - * method - Location method to be used. - * @return a new #LocationObject - * @retval NULL if error occured - * @see location_free - * @par Example - * @code -#include -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - location_init (); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc) - return -1; - // You can use new location object now. - return 0; -} - * @endcode - */ -LocationObject *location_new (LocationMethod method); - -/** - * @brief - * Free memory of given #LocationObject. - * @remarks None. - * @pre - * #location_init should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new. - * @return int - * @retval 0 Success. - * - * Please refer #LocationError for more information. - * @see location_new - * @par Example - * @code -#include -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc) - return -1; - - location_free (loc); - // You can not use location object anymore. - return 0; -} - * @endcode - */ -int location_free (LocationObject *obj); - -/** - * @brief - * Start the location service by using given #LocationObject. - * @remarks - * If you want to recieve signals, you should use this API. - * @pre - * #location_init should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @return int - * @retval 0 Success. - * - * Please refer #LocationError for more information. - * @see location_stop - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -static void cb_service_enabled (GObject *self, guint status, gpointer userdata) -{ - LocationObject *loc = (LocationObject*)userdata; - LocationAccuracy *acc = NULL; - LocationPosition *pos = NULL; - LocationVelocity *vel = NULL; - LocationAddress *addr = NULL; - LocationMethod method; - - g_object_get(loc, "method", &method, NULL); - g_debug("Get property>> method:%d", method); - - if (LOCATION_ERROR_NONE == location_get_position (loc, &pos, &acc)) { - g_debug ("SYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", - pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_position_free(pos); - location_accuracy_free(acc); - } else g_warning ("SYNC>> Current position> failed"); - - if (LOCATION_ERROR_NONE == location_get_velocity (loc, &vel, &acc)) { - g_debug ("SYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", - vel->timestamp, vel->speed, vel->direction, vel->climb); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_velocity_free(vel); - location_accuracy_free(acc); - } else g_warning ("SYNC>> Current velocity> failed"); - - if (LOCATION_ERROR_NONE == location_get_address(loc, &addr, &acc)) { - g_debug ("SYNC>> Current address> %s %s %s %s %s %s %s", - addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_address_free(addr); - location_accuracy_free(acc); - } else g_warning ("SYNC>> Current address> failed"); -} - -static void -cb_service_updated (GObject *self, - guint type, - gpointer data, - gpointer accuracy, - gpointer userdata) -{ - LocationAccuracy *acc = (LocationAccuracy*) accuracy; - switch (type) { - case POSITION_UPDATED: { - LocationPosition *pos = (LocationPosition*) data; - g_debug ("ASYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", - pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - } - break; - case VELOCITY_UPDATED: { - LocationVelocity *vel = (LocationVelocity*) data; - g_debug ("ASYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", - vel->timestamp, vel->speed, vel->direction, vel->climb); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - } - break; - default: - g_warning ("ASYNC>> Undefined update type"); - break; - } -} - - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int interval = 6; //seconds - location_init (); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc) - return -1; - - g_object_set(loc, "update-interval", interval, NULL); - - g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); - g_signal_connect (loc, "service-updated", G_CALLBACK(cb_service_updated), loc); - - location_start(loc); - loop = g_main_loop_new (NULL, TRUE); - g_main_loop_run (loop); // GMainLoop is needed for receiving signals. - - // ... - return 0; -} -* @endcode -*/ -int location_start (LocationObject *obj); - -/** - * @brief - * Stop the location service by using given #LocationObject. - * @remarks - * After call this API, you can not recieve signals. - * @pre - * #location_init should be called before.\n - * #location_start should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see location_start - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc) - return -1; - - location_start(loc); - loop = g_main_loop_new (NULL, TRUE); - g_main_loop_run (loop); - - // .... - - location_stop (loc); - // you can not receive signals anymore. - return 0; -} - * @endcode - */ -int location_stop (LocationObject *obj); - -/** - * @brief - * Check wheither a method is available. - * @remarks - * @pre - * #location_init should be called before.\n - * @post None. - * @param [in] method - a #LocationMethod - * @return int - * @retval True Supported - * False Not supported - * @par Example - #include -static GMainLoop *loop = NULL; - -int main (int argc, char *argv[]) -{ - gboolean is_supported = FALSE; - - // .... - - is_supported = location_is_supported_method(LOCATION_METHOD_HYBRID); - if(is_supported == TRUE) - g_printf("Hybrid Method is supported.\n"); - else - g_printf("Hybrid Method is not supported.\n"); - - return 0; -}* @code - * @endcode - */ -gboolean location_is_supported_method(LocationMethod method); - -/** - * @brief - * Check wheither GPS is turned on or off. - * @remarks - * @pre - * #location_init should be called before.\n - * @post None. - * @param [in] method - a #LocationMethod - * @return int - * @retval True Turned on - * False Turned off - * @par Example - #include -static GMainLoop *loop = NULL; - -int main (int argc, char *argv[]) -{ - gboolean is_enabled = FALSE; - - // .... - - is_enabled = location_is_enabled_gps(loc); - if(is_enable == TRUE) - g_printf("GPS is turned on.\n"); - else - g_printf("GPS is turned off.\n"); - - return 0; -}* @code - * @endcode - */ -gboolean location_is_enabled_gps(LocationObject *obj); - -/** - * @brief - * Get current position information with estimate of the accuracy. - * @remarks Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * #location_start should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] - * position - a new #LocationPosition - * @param [out] - * accuracy - a new #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see location_get_velocity - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -static void cb_service_enabled (GObject *self, guint status, gpointer userdata) -{ - g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); - - LocationObject *loc = (LocationObject*)userdata; - LocationAccuracy *acc = NULL; - LocationPosition *pos = NULL; - - // This function works properly after service is enabled. - if (LOCATION_ERROR_NONE == location_get_position (loc, &pos, &acc)) { - g_debug ("SYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", - pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_position_free(pos); - location_accuracy_free(acc); - } else g_warning ("SYNC>> Current position> failed"); -} - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - gulong handler_id = 0; - - location_init (); - loop = g_main_loop_new (NULL, TRUE); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); - location_start (loc); - g_main_loop_run (loop); - - g_signal_handler_disconnect(loc, handler_id); - location_stop (loc); - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_position (LocationObject *obj, LocationPosition **position, LocationAccuracy **accuracy); - -/** - * @brief - * Get last position information with estimate of the accuracy. - * @remarks This API is not implemented now. \n - * Out parameters are should be freed. - * @pre - * #location_init should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] - * position - a new #LocationPosition - * @param [out] - * accuracy - a new #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see location_get_position - * @par Example - * @code -#include - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int ret = 0; - LocationPosition *last_pos = NULL; - LocationAccuracy *last_acc = NULL; - - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - if (LOCATION_ERROR_NONE == location_get_last_position (loc, LOCATION_METHOD_GPS, &last_pos, &last_acc)) { - g_debug ("SYNC>> Last position> time: %d, lat: %f, long: %f, alt: %f, status: %d", - last_pos->timestamp, last_pos->latitude, last_pos->longitude, last_pos->altitude, last_pos->status); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - last_acc->level, last_acc->horizontal_accuracy, last_acc->vertical_accuracy); - location_position_free(last_pos); - location_accuracy_free(last_acc); - } else g_warning ("SYNC>> Last position> failed"); - - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_last_position (LocationObject *obj, LocationMethod method, LocationPosition **position, LocationAccuracy **accuracy); - -/** - * @brief - * Get last satellite information. - * @remarks This API is not implemented now. \n - * Out parameters are should be freed. - * @pre - * #location_init should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] satellite - a new #LocationSatellite - * @return int - * @retval 0 Success - * Please refer #LocationError for more information. - * @see location_get_last_satellite - * @par Example - * @code -#include - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int ret = 0, idx = 0; - LocationSatellite *sat = NULL; - guint prn; - gboolean used; - guint elevation; - guint azimuth; - gint snr; - - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - if (LOCATION_ERROR_NONE == location_get_satellite (loc, &sat)) { - g_debug ("SYNC>> Current Sattelite> satellite in view = %d, satellite in used = %d", sat->num_of_sat_inview, sat->num_of_sat_used); - g_debug ("\tinview satellite information = "); - for (idx=0; idxnum_of_sat_inview; idx++) { - location_satellite_get_satellite_details(sat, idx, &prn, &used, &elevation, &azimuth, &snr); - g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); - } - location_satellite_free (sat); - } else g_warning ("SYNC>> Current satellite> failed"); - - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_satellite (LocationObject *obj, LocationSatellite **satellite); - -/** - * @brief - * Get last satellite information. - * @remarks This API is not implemented now. \n - * Out parameters are should be freed. - * @pre - * #location_init should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] - * satellite - a new #LocationSatellite - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @par Example - * @code -#include - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int ret = 0, idx = 0; - LocationSatellite *last_sat = NULL; - guint prn; - gboolean used; - guint elevation; - guint azimuth; - gint snr; - - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - if (LOCATION_ERROR_NONE == location_get_last_satellite (loc, &last_sat)) { - g_debug ("SYNC>> Last Sattelite> satellite in view = %d, satellite in used = %d", last_sat->num_of_sat_inview, last_sat->num_of_sat_used); - g_debug ("\tinview satellite information = "); - for (idx=0; idxnum_of_sat_inview; idx++) { - location_satellite_get_satellite_details(last_sat, idx, &prn, &used, &elevation, &azimuth, &snr); - g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); - } - location_satellite_free (last_sat); - } else g_warning ("SYNC>> Last satellite> failed"); - - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_last_satellite (LocationObject *obj, LocationSatellite **satellite); - -/** - * @brief - * Get last known position information with estimate of the accuracy. - * @remarks This API would be DEPRECATED. \n - * @see location_get_last_position - */ -int location_get_last_known_position (LocationObject *obj, LocationMethod method, LocationLastPosition *last_position) LOCATION_DEPRECATED_API; - -/** - * @brief - * Get current position information with estimate of the accuracy by using given address information. - * @remarks Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * address - a #LocationAddress - * @param [out] - * position_list - a list of #LocationPosition - * @param [out] - * accuracy_list - a list of #LocationAccuracy - * @return int - * @retval 0 Success. - * - * Please refer #LocationError for more information. - * @see - * location_get_position_from_address_async\n - * @par Example - * @code -#include - -static void PrintPos (gpointer data, gpointer user_data) -{ - LocationPosition *pos = (LocationPosition *)data; - - if (pos) { - g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); - location_position_free (pos); - } -} - -static void PrintAcc (gpointer data, gpointer user_data) -{ - LocationAccuracy *acc = (LocationAccuracy *)data; - - if (acc) { - g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_accuracy_free (acc); - } -} - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int ret = LOCATION_ERROR_NONE; - - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - GList *pos_list = NULL; - GList *acc_list = NULL; - LocationAddress *addr = NULL; - - addr = location_address_new ("1", "Post Street", NULL, "san jose", "ca", NULL, "95113"); - if (LOCATION_ERROR_NONE == location_get_position_from_address(loc, addr, &pos_list, &acc_list)) { - g_list_foreach (pos_list, PrintPos, NULL); - g_list_foreach (acc_list, PrintAcc, NULL); - } else g_warning ("SYNC>> position from address> failed"); - - if (pos_list) { - g_list_free (pos_list); - } - if (acc_list) { - g_list_free (acc_list); - } - - location_address_free (addr); - location_free (loc); - return 0; -} - * @endcode - */ -int location_get_position_from_address (LocationObject *obj, const LocationAddress *address, GList **position_list, GList **accuracy_list); - -/** - * @brief - * Get current position information asynchronously with estimate of the accuracy by using given address information. - * @remarks None. - * @pre - * #location_init should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * address - a #LocationAddress - * @param [in] - * callback - A pointer of function which will be called after position is gained or when an error occurs. - * @param [in] - * userdata - data to pass to function - * @return int - * @retval 0 Success. - * - * Please refer #LocationError for more information. - * @see - * location_get_position_from_address\n - * @par Example - * @code -#include - -static void PrintPos (gpointer data, gpointer user_data) -{ - LocationPosition *pos = (LocationPosition *)data; - - if (pos) { - g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); - } -} - -static void PrintAcc (gpointer data, gpointer user_data) -{ - LocationAccuracy *acc = (LocationAccuracy *)data; - - if (acc) { - g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - } -} -static void -cb_position_from_address (LocationError error, GList *position_list, GList *accuracy_list, gpointer userdata) -{ - if (position_list && accuracy_list) { - g_list_foreach (position_list, PrintPos); - g_list_foreach (accuracy_list, PrintAcc); - } -} - -void get_position_from_address(LocationObject* loc) -{ - LocationAddress *addr = location_address_new ("1", "Post Street", NULL, "san jose", "ca", NULL, "95113"); - //Calling application must have an active data connection before using this function. - if (LOCATION_ERROR_NONE == location_get_position_from_address_async(loc, addr, cb_position_from_address, loc)) - g_debug("location_get_position_from_address_async() success"); - else g_warning ("location_get_position_from_address_async() failed"); - location_address_free (addr); -} - * @endcode - */ -int location_get_position_from_address_async (LocationObject *obj, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); - -/** - * @brief - * Get current position information with estimate of the accuracy by using given free-formed address string. - * @remarks Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * address - Free-formed address string to be used - * @param [out] - * position_list - a list of #LocationPosition - * @param [out] - * accuracy_list - a list of #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see - * location_get_position_from_freeformed_address_async\n - * @par Example - * @code -#include - -static void PrintPos (gpointer data, gpointer user_data) -{ - LocationPosition *pos = (LocationPosition *)data; - - if (pos) { - g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); - location_position_free (pos); - } -} - -static void PrintAcc (gpointer data, gpointer user_data) -{ - LocationAccuracy *acc = (LocationAccuracy *)data; - - if (acc) { - g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_accuracy_free (acc); - } -} - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int ret = LOCATION_ERROR_NONE; - - location_init (); - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - GList *pos_list = NULL; - GList *acc_list = NULL; - char* addr_str = g_strdup("4 N 2nd Street 95113"); - //Calling application must have an active data connection before using this function. - if (LOCATION_ERROR_NONE == location_get_position_from_freeformed_address(loc, addr_str, &pos_list, &acc_list)) { - g_list_foreach (pos_list, PrintPos, NULL); - g_list_foreach (acc_list, PrintAcc, NULL); - } else g_warning ("SYNC>> position from freeformed address> failed"); - g_free(addr_str); - - location_free (loc); - return 0; -} - * @endcode - */ -int location_get_position_from_freeformed_address (LocationObject *obj, const gchar *address, GList **position_list, GList **accuracy_list); - -/** - * @brief - * Get current position information asynchronously with estimate of the accuracy by using given free-formed address string. - * @remarks None. - * @pre - * #location_init should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * address - Free-formed address string to be used - * @param [in] - * callback - A pointer of function which will be called after position is gained or when an error occurs. - * @param [in] - * userdata - data to pass to function - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see - * location_get_position_from_freeformed_address\n - * @par Example - * @code -#include - -static void PrintPos (gpointer data, gpointer user_data) -{ - LocationPosition *pos = (LocationPosition *)data; - - if (pos) { - g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); - } -} - -static void PrintAcc (gpointer data, gpointer user_data) -{ - LocationAccuracy *acc = (LocationAccuracy *)data; - - if (acc) { - g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - } -} - -static void -cb_position_from_freeformed_address (LocationError error, GList *position_list, GList *accuracy_list, gpointer userdata) -{ - if (position_list && accuracy_list) { - g_list_foreach (position_list, PrintPos); - g_list_foreach (accuracy_list, PrintAcc); - } -} - -void get_position_from_address(LocationObject* loc) -{ - gchar *addr_str = g_strdup("4 N 2nd Street 95113"); - //Calling application must have an active data connection before using this function. - if (LOCATION_ERROR_NONE == location_get_position_from_freeformed_address_async(loc, addr_str, cb_position_from_freeformed_address, loc)) - g_debug("location_get_position_from_freeformed_address_async() success"); - else g_warning ("location_get_position_from_freeformed_address_async() failed"); - g_free(addr_str); - -} - * @endcode - */ -int location_get_position_from_freeformed_address_async (LocationObject *obj, const gchar *address, LocationPositionCB callback, gpointer userdata); - -/** - * @brief - * Get current velocity information with estimate of the accuracy. - * @remarks Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * #location_start should be called before. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] - * velocity - a new #LocationVelocity - * @param [out] - * accuracy - a new #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see location_get_position - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -static void cb_service_enabled (GObject *self, guint status, gpointer userdata) -{ - g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); - - LocationObject *loc = (LocationObject*)userdata; - LocationAccuracy *acc = NULL; - LocationVelocity *vel = NULL; - - if (LOCATION_ERROR_NONE == location_get_velocity (loc, &vel, &acc)) { - g_debug ("SYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", - vel->timestamp, vel->speed, vel->direction, vel->climb); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_velocity_free(vel); - location_accuracy_free(acc); - } else g_warning ("SYNC>> Current velocity> failed"); -} - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - gulong hander_id = 0; - location_init (); - - loop = g_main_loop_new (NULL, TRUE); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); - location_start (loc); - g_main_loop_run (loop); - - g_signal_handler_disconnect(loc, handler_id); - location_stop (loc); - location_free (loc); - - return 0; -} - - * @endcode - */ -int location_get_velocity (LocationObject *obj, LocationVelocity **velocity, LocationAccuracy **accuracy); - -/** - * @brief - * Get last velocity information with estimate of the accuracy. - * @remarks This API is not implemented now. \n - * Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] - * velocity - a new #LocationVelocity - * @param [out] - * accuracy - a new #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see location_get_velocity - * @par Example - * @code -#include - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - LocationVelocity *last_vel = NULL; - LocationAccuracy *last_acc = NULL; - location_init (); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - if (LOCATION_ERROR_NONE == location_get_last_velocity (loc, &last_vel, &last_acc)) { - g_debug ("SYNC>> Last velocity> time: %d, speed: %f, direction:%f, climb:%f", - last_vel->timestamp, last_vel->speed, last_vel->direction, last_vel->climb); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - last_acc->level, last_acc->horizontal_accuracy, last_acc->vertical_accuracy); - location_velocity_free(last_vel); - location_accuracy_free(last_acc); - } else g_warning ("SYNC>> Last velocity> failed."); - - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_last_velocity (LocationObject *obj, LocationVelocity **velocity, LocationAccuracy **accuracy); - - -/** - * @brief - * Get current address information with estimate of the accuracy by using current position. - * @remarks Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * #location_start should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [out] - * address - a new #LocationAddress - * @param [out] - * accuracy - a new #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see - * location_get_address_async\n - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -static void cb_service_enabled (GObject *self, guint status, gpointer userdata) -{ - g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); - - LocationAddress *addr = NULL; - LocationAccuracy *acc = NULL; - LocationObject *loc = (LocationObject*)userdata; - - // This function works properly after service is enabled. - //Calling application must have an active data connection before using this function. - if (LOCATION_ERROR_NONE == location_get_address(loc, &addr, &acc)) { - g_debug ("SYNC>> Current address> %s %s %s %s %s %s %s", - addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_address_free(addr); - location_accuracy_free(acc); - } else g_warning ("SYNC>> Current address> failed"); -} - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - gulong handler_id = 0; - int ret = LOCATION_ERROR_NONE; - - location_init (); - - loop = g_main_loop_new (NULL, TRUE); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); - location_start (loc); - g_main_loop_run (loop); - - g_signal_handler_disconnect(loc, handler_id); - location_stop (loc); - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_address (LocationObject *obj, LocationAddress **address, LocationAccuracy **accuracy); - -/** - * @brief - * Get current address information asynchronously with estimate of the accuracy by using current position. - * @remarks None. - * @pre - * #location_init should be called before.\n - * #location_start should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * callback - A pointer of function which will be called after address is gained or when an error occurs. - * @param [in] - * userdata - data to pass to function - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see - * location_get_address\n - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -static void -cb_address (LocationError error, LocationAddress *addr, LocationAccuracy *acc, gpointer userdata) -{ - g_debug ("ASYNC>> location_get_address_async> %s %s %s %s %s %s %s", - addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); -} - -static void cb_service_enabled (GObject *self, guint status, gpointer userdata) -{ - g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); - - LocationObject *loc = (LocationObject*)userdata; - // This function works properly after service is enabled. - //Calling application must have an active data connection before using this function. - if (LOCATION_ERROR_NONE == location_get_address_async(loc, cb_address, loc)) - g_debug("location_get_address_async() success"); - else g_warning ("location_get_address_async() failed"); -} - - -int main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - gulong handler_id = 0; - int ret = LOCATION_ERROR_NONE; - - location_init (); - - loop = g_main_loop_new (NULL, TRUE); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); - location_start (loc); - g_main_loop_run (loop); - - g_signal_handler_disconnect(loc, handler_id); - location_stop (loc); - location_free (loc); - - return 0; -} - * @endcode - */ -int location_get_address_async (LocationObject *obj, LocationAddressCB callback, gpointer userdata); - -/** - * @brief - * Get current address information with estimate of the accuracy by using given position information. - * @remarks Out parameters are should be freed. - * @pre - * #location_init should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * position - a #LocationPosition - * @param [out] - * address - a new #LocationAddress - * @param [out] - * accuracy - a new #LocationAccuracy - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see - * location_get_address_from_position_async\n - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -int -main (int argc, char *argv[]) -{ - LocationObject *loc = NULL; - int ret = LOCATION_ERROR_NONE; - - location_init (); - - loop = g_main_loop_new (NULL, TRUE); - - loc = location_new (LOCATION_METHOD_GPS); - if(!loc){ - g_debug("location_new failed"); - return -1; - } - - LocationPosition *pos = NULL; - LocationAccuracy *acc = NULL; - LocationAddress *addr = NULL; - - //Calling application must have an active data connection before using this function. - pos = location_position_new (0, 37.257809, 127.056383, 0, LOCATION_STATUS_2D_FIX); - if (LOCATION_ERROR_NONE == location_get_address_from_position(loc, pos, &addr, &acc)) { - g_debug ("SYNC>> address from position> %s %s %s %s %s %s %s", - addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - location_address_free(addr); - location_accuracy_free(acc); - } else g_warning ("SYNC>> address from position> failed"); - location_position_free (pos); -} - * @endcode - */ -int location_get_address_from_position (LocationObject *obj, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); - -/** - * @brief - * Get current address information asynchronously with estimate of the accuracy by using given position information. - * @remarks None. - * @pre - * #location_init should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] - * obj - a #LocationObject created by #location_new - * @param [in] - * position - a #LocationPosition - * @param [in] - * callback - A pointer of function which will be called after address is gained or when an error occurs. - * @param [in] - * userdata - data to pass to function - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - * @see - * location_get_address_from_position\n - * @par Example - * @code -#include -static GMainLoop *loop = NULL; - -static void -cb_address_from_position (LocationError error, LocationAddress *addr, LocationAccuracy *acc, gpointer userdata) -{ - g_debug ("ASYNC>> location_get_address_from_position_async> %s %s %s %s %s %s %s", - addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); -} - -void get_address_from_position(LocationObject* loc) -{ - LocationPosition *pos = location_position_new (0, 37.257809, 127.056383, 0, LOCATION_STATUS_2D_FIX); - //Calling application must have an active data connection before using this function. - if (LOCATION_ERROR_NONE == location_get_address_from_position_async(loc, pos, cb_address_from_position, loc)) - g_debug("location_get_address_from_position_async() success"); - else g_warning ("location_get_address_from_position_async() failed"); - location_position_free (pos); -} - * @endcode - */ -int location_get_address_from_position_async (LocationObject *obj, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); - -/** - * @brief - * Get information of point of interests by using current position within a given radius. - * @remarks Out parameters are should be freed. - * \n This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * #location_start should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] obj - a #LocationObject created by #location_new - * @param [in] radius - radius of a circle - * @param [in] keyword - keyword for POI - * @param [out] poi_info - a new #LocationPOIInfo - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_get_poi (LocationObject *obj, gdouble radius, const gchar *keyword, LocationPOIInfo **poi_info); - -/** - * @brief - * Get information of point of interests asynchronously by using current position within a given radius. - * @remarks This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * #location_start should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] obj - a #LocationObject created by #location_new - * @param [in] radius - radius of a circle - * @param [in] callback - function to call - * @param [in] userdata - data to pass to function - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_get_poi_async (LocationObject *obj, gdouble radius, const gchar *keyword, LocationPOICB callback, gpointer userdata); - -/** - * @brief - * Get information of point of interests by using given address within a given radius. - * @remarks Out parameters are should be freed. - * \n This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] obj - a #LocationObject created by #location_new - * @param [in] address - a #LocationAddress - * @param [in] radius - radius of a circle - * @param [in] keyword - keyword for POI - * @param [out] poi_info - a new #LocationPOIInfo - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_get_poi_from_address(LocationObject *obj, const LocationAddress *address, gdouble radius, const gchar *keyword, LocationPOIInfo **poi_info); - -/** - * @brief - * Get information of point of interests asynchronously by using given address within a given radius. - * @remarks This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] obj - a #LocationObject created by #location_new - * @param [in] address - a #LocationAddress - * @param [in] radius - radius of a circle - * @param [in] callback - function to call - * @param [in] userdata - data to pass to function - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_get_poi_from_address_async (LocationObject *obj, const LocationAddress *address, gdouble radius, const gchar *keyword, LocationPOICB callback, gpointer userdata); - -/** - * @brief - * Get information of point of interests by using given position within a given radius. - * @remarks Out parameters are should be freed. - * \n This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] obj - a #LocationObject created by #location_new - * @param [in] position - a #LocationPosition - * @param [in] radius - radius of a circle - * @param [in] keyword - keyword for POI - * @param [out] poi_info - a new #LocationPOIInfo - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_get_poi_from_position(LocationObject *obj, const LocationPosition *position, gdouble radius, const gchar *keyword, LocationPOIInfo **poi_info); - -/** - * @brief - * Get information of point of interests asynchronously by using given position within a given radius. - * @remarks This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] obj - a #LocationObject created by #location_new - * @param [in] position - a #LocationPosition - * @param [in] radius - radius of a circle - * @param [in] callback - function to call - * @param [in] userdata - data to pass to function - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_get_poi_from_position_async (LocationObject *obj, const LocationPosition *position, gdouble radius, const gchar*keyword, LocationPOICB callback, gpointer userdata); - -/** - * @brief - * Send command to the server. - * @remarks This functions is not implemneted yet. - * @pre - * #location_init should be called before.\n - * Calling application must have glib or ecore main loop.\n - * Calling application must have an active data connection. - * @post None. - * @param [in] cmd - a #char - * @return int - * @retval 0 Success - * - * Please refer #LocationError for more information. - */ -int location_send_command(const char *cmd); - -/** - * @} @} - */ - -G_END_DECLS - -#endif /* __LOCATION_H__ */ diff --git a/location/manager/Makefile.am b/location/manager/Makefile.am new file mode 100644 index 0000000..df26216 --- /dev/null +++ b/location/manager/Makefile.am @@ -0,0 +1,41 @@ +noinst_LTLIBRARIES = liblocation-manager.la + +COMMON_HEADER_DIR = include +MANAGER_DIR = manager +MAP_SERVICE_DIR = map-service +MODULE_DIR = module + +liblocation_manager_la_SOURCES = \ + location-marshal.c \ + location-marshal.h \ + location-ielement.c \ + location-setting.c \ + location-position.c \ + location-velocity.c \ + location-accuracy.c \ + location-boundary.c \ + location-satellite.c \ + location-signaling-util.c \ + location-common-util.c \ + location-gps.c \ + location-wps.c \ + location-sps.c \ + location-hybrid.c + +liblocation_manager_la_CFLAGS = \ + -fPIC\ + -I${srcdir} \ + -I${srcdir}/.. \ + -I${srcdir}/../include \ + -I${srcdir}/../${MANAGER_DIR} \ + -I${srcdir}/../${MODULE_DIR} \ + -I${srcdir}/../${MAP_SERVICE_DIR} \ + $(LOCATION_CFLAGS) + +EXTRA_DIST = \ + location-marshal.list + +location-marshal.h: location-marshal.list $(GLIB_GENMARSHAL) + $(GLIB_GENMARSHAL) $< --header --prefix=location > $@ +location-marshal.c: location-marshal.list location-marshal.h $(GLIB_GENMARSHAL) + echo "#include \"location-marshal.h\"" > $@ && $(GLIB_GENMARSHAL) location-marshal.list --body --prefix=location >> $@ diff --git a/location/location-accuracy.c b/location/manager/location-accuracy.c similarity index 97% rename from location/location-accuracy.c rename to location/manager/location-accuracy.c index 4681e37..327e883 100644 --- a/location/location-accuracy.c +++ b/location/manager/location-accuracy.c @@ -23,8 +23,8 @@ #include "config.h" #endif -#include "location/location-accuracy.h" -#include "location/location-log.h" +#include "location-accuracy.h" +#include "location-log.h" GType location_accuracy_get_type (void) diff --git a/location/location-accuracy.h b/location/manager/location-accuracy.h similarity index 95% rename from location/location-accuracy.h rename to location/manager/location-accuracy.h index e006798..f257705 100644 --- a/location/location-accuracy.h +++ b/location/manager/location-accuracy.h @@ -22,14 +22,24 @@ #ifndef __LOCATION_ACCURACY_H_ #define __LOCATION_ACCURACY_H_ -#include +#include G_BEGIN_DECLS +GType location_accuracy_get_type(void); +#define LOCATION_TYPE_ACCURACY (location_accuracy_get_type()) + /** * @file location-accuracy.h * @brief This file contains the definitions, structures, and functions related to accuracy information. - * @addtogroup LocationTypes + */ + +/** + * @addtogroup LocationAPI + * @{ + * @defgroup LocationAPIAccuracy Location Accuracy + * @breif This provides APIs related to Location Accuracy. + * @addtogroup LocationAPIAccuracy * @{ */ @@ -56,9 +66,6 @@ struct _LocationAccuracy gdouble vertical_accuracy; ///< The vertical position uncertainty of the location in meters. }; -GType location_accuracy_get_type(void); -#define LOCATION_TYPE_ACCURACY (location_accuracy_get_type()) - /** * @brief Create a new #LocationAccuracy with given information. * @remarks None. @@ -124,7 +131,7 @@ int location_accuracy_level_compare(const LocationAccuracy *accuracy1, const Loc LocationAccuracy *location_accuracy_copy (const LocationAccuracy *accuracy); /** - * @} + * @} @} */ G_END_DECLS diff --git a/location/location-boundary.c b/location/manager/location-boundary.c similarity index 95% rename from location/location-boundary.c rename to location/manager/location-boundary.c index 5c06a17..7fa79ea 100644 --- a/location/location-boundary.c +++ b/location/manager/location-boundary.c @@ -56,8 +56,8 @@ #include #include -#include "location/location-boundary.h" -#include "location/location-log.h" +#include "location-boundary.h" +#include "location-log.h" GType location_boundary_get_type (void) @@ -245,7 +245,7 @@ location_boundary_if_inside (LocationBoundary* boundary, j = count - 1; pos1_list = g_list_first(position_list); pos2_list = g_list_last(position_list); - while(pos1_list = g_list_next(pos1_list)) { + while(pos1_list) { edge_area = FALSE; pos1 = pos1_list->data; pos2 = pos2_list->data; @@ -292,6 +292,7 @@ location_boundary_if_inside (LocationBoundary* boundary, else LOCATION_LOGD("It is not crossed."); pos2_list = pos1_list; + pos1_list = g_list_next(pos1_list); } LOCATION_LOGW("num[%d]", crossing_num); is_inside = crossing_num & 1; // Odd : inside, Even : outside @@ -352,3 +353,21 @@ location_boundary_foreach(const LocationObject *obj, LocationBoundaryFunc func, return LOCATION_ERROR_NONE; } + +EXPORT_API LocationBoundary * +location_boundary_get_bounding_box (LocationBoundary *boundary) +{ + g_return_val_if_fail (boundary, NULL); + LocationBoundary *bbox = NULL; + + return bbox; +} + +EXPORT_API LocationPosition * +location_boundary_get_center_position (LocationBoundary *boundary) +{ + g_return_val_if_fail (boundary, NULL); + LocationPosition *center = NULL; + + return center; +} diff --git a/location/location-boundary.h b/location/manager/location-boundary.h similarity index 94% rename from location/location-boundary.h rename to location/manager/location-boundary.h index 9fe0d6e..c3603ef 100644 --- a/location/location-boundary.h +++ b/location/manager/location-boundary.h @@ -22,18 +22,28 @@ #ifndef __LOCATION_BOUNDARY_H_ #define __LOCATION_BOUNDARY_H_ -#include -#include +#include +#include + +G_BEGIN_DECLS + +GType location_boundary_get_type (void); +#define LOCATION_TYPE_BOUNDARY (location_boundary_get_type ()) + /** * @file location-boundary.h * @brief This file contains the definitions, structures, and functions related to boundary information. - * @addtogroup LocationTypes + */ +/** + * @addtogroup LocationAPI + * @{ + * @defgroup LocationAPIBoundary Location Boundary + * @breif This provides APIs related to Location Boundary + * @addtogroup LocationAPIBoundary * @{ */ -G_BEGIN_DECLS - /** * @brief * The type of the @location_boundary_foreach function of #LocationObject @@ -85,9 +95,6 @@ struct _LocationBoundary{ }; }; -GType location_boundary_get_type (void); -#define LOCATION_TYPE_BOUNDARY (location_boundary_get_type ()) - /** * @brief Create a rectangular type of new #LocationBoundary with given information. * @remarks None. @@ -291,7 +298,18 @@ void location_test_boundary_if_inside(LocationObject *loc, LocationBoundary *bou gboolean location_boundary_if_inside (LocationBoundary *boundary, LocationPosition *position); /** - * @} + * @brief Get bounding box of #LocationBoundary + */ +LocationBoundary *location_boundary_get_bounding_box (LocationBoundary *boundary); + + +/** + * @brief Get the center position of #LocationBoundary + */ +LocationPosition * location_boundary_get_center_position (LocationBoundary *boundary); + +/** + * @} @} */ G_END_DECLS diff --git a/location/location-common-util.c b/location/manager/location-common-util.c similarity index 76% rename from location/location-common-util.c rename to location/manager/location-common-util.c index 231dc41..290a6e0 100644 --- a/location/location-common-util.c +++ b/location/manager/location-common-util.c @@ -169,58 +169,3 @@ int set_prop_removal_boundary(GList **prev_boundary_list, LocationBoundary* boun return LOCATION_ERROR_NONE; } - -int get_last_known_position (LocationMethod method, LocationLastPosition *last_pos) -{ - int timestamp = 0; - double longitude = 0.0, latitude = 0.0, altitude = 0.0; - double hor_accuracy = 0.0, ver_accuracy = 0.0; - LOCATION_LOGD("Method [%d]", method); - switch (method) { - case LOCATION_METHOD_SPS: - if (vconf_get_int(SPS_LAST_TIMESTAMP, ×tamp) || - vconf_get_dbl(SPS_LAST_LATITUDE, &latitude) || - vconf_get_dbl(SPS_LAST_LONGITUDE, &longitude) || - vconf_get_dbl(SPS_LAST_ALTITUDE, &altitude) || - vconf_get_dbl(SPS_LAST_HORACCURACY, &hor_accuracy) || - vconf_get_dbl(SPS_LAST_VERACCURACY, &ver_accuracy)) { - return -1; - } - break; - case LOCATION_METHOD_WPS: - if (vconf_get_int(WPS_LAST_TIMESTAMP, ×tamp) || - vconf_get_dbl(WPS_LAST_LATITUDE, &latitude) || - vconf_get_dbl(WPS_LAST_LONGITUDE, &longitude) || - vconf_get_dbl(WPS_LAST_ALTITUDE, &altitude) || - vconf_get_dbl(WPS_LAST_HORACCURACY, &hor_accuracy)) { - return -1; - } - break; - case LOCATION_METHOD_GPS: - if (vconf_get_int(GPS_LAST_TIMESTAMP, ×tamp) || - vconf_get_dbl(GPS_LAST_LATITUDE, &latitude) || - vconf_get_dbl(GPS_LAST_LONGITUDE, &longitude) || - vconf_get_dbl(GPS_LAST_ALTITUDE, &altitude) || - vconf_get_dbl(GPS_LAST_HORACCURACY, &hor_accuracy) || - vconf_get_dbl(GPS_LAST_VERACCURACY, &ver_accuracy)) { - return -1; - } - break; - case LOCATION_METHOD_HYBRID: - default: - return -1; - - } - - last_pos->method = method; - last_pos->timestamp = (guint) timestamp; - last_pos->longitude = (gdouble) longitude; - last_pos->latitude = (gdouble) latitude; - last_pos->altitude = (gdouble) altitude; - last_pos->horizontal_accuracy = (gdouble) hor_accuracy; - last_pos->vertical_accuracy = (gdouble) ver_accuracy; - - return 0; -} - - diff --git a/location/location-common-util.h b/location/manager/location-common-util.h similarity index 85% rename from location/location-common-util.h rename to location/manager/location-common-util.h index 99d9654..99d005d 100644 --- a/location/location-common-util.h +++ b/location/manager/location-common-util.h @@ -22,15 +22,12 @@ #ifndef __LOCATION_COMMON_UTIL_H__ #define __LOCATION_COMMON_UTIL_H__ -#include -#include +#include +#include /** * @file location-common-util.h * @brief This file contains the common utils for LocationObject. - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS @@ -38,8 +35,6 @@ G_BEGIN_DECLS int set_prop_boundary(GList **prev_boundary_list, GList *new_boundary_list); int set_prop_removal_boundary(GList **prev_boundary_list, LocationBoundary *boundary); -int get_last_known_position (LocationMethod method, LocationLastPosition *last_pos); - G_END_DECLS #endif diff --git a/location/location-cps.c b/location/manager/location-cps.c similarity index 95% rename from location/location-cps.c rename to location/manager/location-cps.c index c0c404a..63b0795 100644 --- a/location/location-cps.c +++ b/location/manager/location-cps.c @@ -23,14 +23,14 @@ #include "config.h" #endif -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-setting.h" +#include "location-log.h" -#include "location/location-module-internal.h" +#include "module-internal.h" -#include "location/location-cps.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" +#include "location-cps.h" +#include "location-marshal.h" +#include "location-ielement.h" typedef struct _LocationCpsPrivate { LocationCpsMod *mod; diff --git a/location/location-cps.h b/location/manager/location-cps.h similarity index 97% rename from location/location-cps.h rename to location/manager/location-cps.h index 5effdf4..8e12a36 100644 --- a/location/location-cps.h +++ b/location/manager/location-cps.h @@ -27,9 +27,6 @@ /** * @file location-cps.h * @brief This file contains the internal definitions and structures related to CPS. - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS diff --git a/location/location-gps.c b/location/manager/location-gps.c similarity index 81% rename from location/location-gps.c rename to location/manager/location-gps.c index 3c3588f..131b41b 100644 --- a/location/location-gps.c +++ b/location/manager/location-gps.c @@ -23,16 +23,16 @@ #include "config.h" #endif -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-setting.h" +#include "location-log.h" -#include "location/location-module-internal.h" +#include "module-internal.h" -#include "location/location-gps.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" -#include "location/location-signaling-util.h" -#include "location/location-common-util.h" +#include "location-gps.h" +#include "location-marshal.h" +#include "location-ielement.h" +#include "location-signaling-util.h" +#include "location-common-util.h" typedef struct _LocationGpsPrivate { @@ -46,6 +46,8 @@ typedef struct _LocationGpsPrivate { LocationAccuracy* acc; GList* boundary_list; ZoneStatus zone_status; + guint sat_timestamp; + LocationSatellite* sat; } LocationGpsPrivate; enum { @@ -111,6 +113,17 @@ gps_velocity_cb (gboolean enabled, } static void +gps_satellite_cb (gboolean enabled, + LocationSatellite *sat, + gpointer self) +{ + LOCATION_LOGD("gps_satellite_cb"); + g_return_if_fail(self); + LocationGpsPrivate* priv = GET_PRIVATE(self); + satellite_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->sat_timestamp), &(priv->sat), enabled, sat); +} + +static void location_setting_gps_cb (keynode_t *key, gpointer self) { @@ -130,7 +143,7 @@ location_setting_gps_cb (keynode_t *key, } else if (1 == location_setting_get_key_val(key) && priv->mod->ops.start && !priv->is_started) { LOCATION_LOGD("location resumed by setting"); - ret = priv->mod->ops.start (priv->mod->handler, gps_status_cb, gps_position_cb, gps_velocity_cb, self); + ret = priv->mod->ops.start (priv->mod->handler, gps_status_cb, gps_position_cb, gps_velocity_cb, gps_satellite_cb, self); if (ret == LOCATION_ERROR_NONE) priv->is_started = TRUE; } } @@ -153,7 +166,7 @@ location_gps_start (LocationGps *self) ret = LOCATION_ERROR_NOT_ALLOWED; } else { - ret = priv->mod->ops.start (priv->mod->handler, gps_status_cb, gps_position_cb, gps_velocity_cb, self); + ret = priv->mod->ops.start (priv->mod->handler, gps_status_cb, gps_position_cb, gps_velocity_cb, gps_satellite_cb, self); if (ret == LOCATION_ERROR_NONE) { priv->is_started = TRUE; } @@ -357,6 +370,24 @@ location_gps_get_position (LocationGps *self, } static int +location_gps_get_last_position (LocationGps *self, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_gps_get_position"); + // Enable to get a last position even though GPS_ENABLE dose not set on + + LocationGpsPrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + + LocModGpsOps ops = priv->mod->ops; + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (ops.get_last_position, LOCATION_ERROR_NOT_AVAILABLE); + return ops.get_last_position(priv->mod->handler, position, accuracy); + +} + +static int location_gps_get_velocity (LocationGps *self, LocationVelocity **velocity, LocationAccuracy **accuracy) @@ -373,13 +404,67 @@ location_gps_get_velocity (LocationGps *self, return ops.get_velocity(priv->mod->handler, velocity, accuracy); } +static int +location_gps_get_last_velocity (LocationGps *self, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_gps_get_last_velocity"); + + LocationGpsPrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + setting_retval_if_fail(GPS_ENABLED); + + LocModGpsOps ops = priv->mod->ops; + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (ops.get_last_velocity, LOCATION_ERROR_NOT_AVAILABLE); + return ops.get_last_velocity(priv->mod->handler, velocity, accuracy); + +} + +static int +location_gps_get_satellite (LocationGps *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_gps_get_satellite"); + + LocationGpsPrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + setting_retval_if_fail(GPS_ENABLED); + + LocModGpsOps ops = priv->mod->ops; + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (ops.get_satellite, LOCATION_ERROR_NOT_AVAILABLE); + return ops.get_satellite(priv->mod->handler, satellite); +} + +static int +location_gps_get_last_satellite (LocationGps *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_gps_get_last_satellite"); + + LocationGpsPrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + setting_retval_if_fail(GPS_ENABLED); + + LocModGpsOps ops = priv->mod->ops; + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (ops.get_last_satellite, LOCATION_ERROR_NOT_AVAILABLE); + return ops.get_last_satellite(priv->mod->handler, satellite); +} + static void location_ielement_interface_init (LocationIElementInterface *iface) { iface->start = (TYPE_START_FUNC)location_gps_start; iface->stop = (TYPE_STOP_FUNC)location_gps_stop; iface->get_position = (TYPE_GET_POSITION)location_gps_get_position; + iface->get_last_position = (TYPE_GET_POSITION)location_gps_get_last_position; iface->get_velocity = (TYPE_GET_VELOCITY)location_gps_get_velocity; + iface->get_last_velocity = (TYPE_GET_VELOCITY)location_gps_get_last_velocity; + iface->get_satellite = (TYPE_GET_SATELLITE)location_gps_get_satellite; + iface->get_last_satellite = (TYPE_GET_SATELLITE)location_gps_get_last_satellite; } static void diff --git a/location/location-gps.h b/location/manager/location-gps.h similarity index 96% rename from location/location-gps.h rename to location/manager/location-gps.h index 418bcf1..e658ce9 100644 --- a/location/location-gps.h +++ b/location/manager/location-gps.h @@ -28,10 +28,6 @@ /** * @file location-gps.h * @brief This file contains the internal definitions and structures related to GPS. - * @defgroup LocationInternal Location Internal - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS diff --git a/location/location-hybrid.c b/location/manager/location-hybrid.c similarity index 79% rename from location/location-hybrid.c rename to location/manager/location-hybrid.c index 6e82d86..41f4c9c 100644 --- a/location/location-hybrid.c +++ b/location/manager/location-hybrid.c @@ -23,20 +23,20 @@ #include "config.h" #endif -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-setting.h" +#include "location-log.h" -#include "location/location-module-internal.h" +#include "module-internal.h" -#include "location/location-hybrid.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" -#include "location/location-signaling-util.h" -#include "location/location-common-util.h" +#include "location-hybrid.h" +#include "location-marshal.h" +#include "location-ielement.h" +#include "location-signaling-util.h" +#include "location-common-util.h" -#include "location/location-gps.h" -#include "location/location-wps.h" -#include "location/location-sps.h" +#include "location-gps.h" +#include "location-wps.h" +#include "location-sps.h" typedef struct _LocationHybridPrivate { gboolean is_started; @@ -44,6 +44,7 @@ typedef struct _LocationHybridPrivate { gboolean wps_enabled; gboolean sps_enabled; guint interval; + guint sat_timestamp; LocationObject *gps; LocationObject *wps; LocationObject *sps; @@ -52,6 +53,7 @@ typedef struct _LocationHybridPrivate { LocationPosition *pos; LocationVelocity *vel; LocationAccuracy *acc; + LocationSatellite *sat; GList* boundary_list; ZoneStatus zone_status; @@ -106,7 +108,7 @@ hybrid_get_update_method_obj (LocationHybridPrivate* priv) } static gboolean -hyrid_is_equal_g_type_method(GType g_type, LocationMethod method) +hybrid_is_equal_g_type_method(GType g_type, LocationMethod method) { if (g_type == LOCATION_TYPE_SPS && method == LOCATION_METHOD_SPS) return TRUE; if (g_type == LOCATION_TYPE_GPS && method == LOCATION_METHOD_GPS) return TRUE; @@ -155,8 +157,14 @@ hybrid_service_updated (GObject *obj, LOCATION_LOGD ("hybrid_service_updated"); LocationHybridPrivate* priv = GET_PRIVATE((LocationHybrid*)self); GType g_type = G_TYPE_FROM_INSTANCE(obj); - if (g_type == LOCATION_TYPE_GPS) hybrid_update_sps((LocationHybrid*)self, type, data, accuracy); - if (hyrid_is_equal_g_type_method(g_type, priv->current_method)) { + if (g_type == LOCATION_TYPE_GPS) { + if (type == SATELLITE_UPDATED) { + LocationSatellite *sat = (LocationSatellite *) data; + satellite_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->sat_timestamp), &(priv->sat), TRUE, sat); + } else hybrid_update_sps((LocationHybrid*)self, type, data, accuracy); + } + + if (hybrid_is_equal_g_type_method(g_type, priv->current_method)) { LocationAccuracy *acc = (LocationAccuracy*)accuracy; if (type == POSITION_UPDATED) { LocationPosition *pos = (LocationPosition*)data; @@ -164,7 +172,7 @@ hybrid_service_updated (GObject *obj, } else if (type == VELOCITY_UPDATED) { LocationVelocity *vel = (LocationVelocity*) data; velocity_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->vel), TRUE, vel, acc); - } else LOCATION_LOGW ("Undefined GType updated"); + }else LOCATION_LOGW ("Undefined GType updated"); } } @@ -399,6 +407,48 @@ location_hybrid_get_position (LocationHybrid *self, } static int +location_hybrid_get_last_position (LocationHybrid *self, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_hybrid_get_last_position"); + setting_retval_if_fail(GPS_ENABLED); + + int ret = LOCATION_ERROR_NONE; + LocationPosition *gps_pos = NULL, *wps_pos = NULL; + LocationAccuracy *gps_acc = NULL, *wps_acc = NULL; + LocationHybridPrivate *priv = GET_PRIVATE (self); + + if (priv->gps) location_get_last_position (priv->gps, &gps_pos, &gps_acc); + if (priv->wps) location_get_last_position (priv->wps, &wps_pos, &wps_acc); + + if (gps_pos && wps_pos) { + if (wps_pos->timestamp > gps_pos->timestamp) { + *position = wps_pos; + *accuracy = wps_acc; + location_position_free (gps_pos); + location_accuracy_free (gps_acc); + } + else { + *position = gps_pos; + *accuracy = gps_acc; + location_position_free (wps_pos); + location_accuracy_free (wps_acc); + } + } else if (gps_pos) { + *position = gps_pos; + *accuracy = gps_acc; + } else if (wps_pos) { + *position = wps_pos; + *accuracy = wps_acc; + } else { + ret = LOCATION_ERROR_NOT_AVAILABLE; + } + + return ret; +} + +static int location_hybrid_get_velocity (LocationHybrid *self, LocationVelocity **velocity, LocationAccuracy **accuracy) @@ -412,13 +462,98 @@ location_hybrid_get_velocity (LocationHybrid *self, return location_get_velocity (obj, velocity, accuracy); } +static int +location_hybrid_get_last_velocity (LocationHybrid *self, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_hybrid_get_last_velocity"); + setting_retval_if_fail(GPS_ENABLED); + + int ret = LOCATION_ERROR_NONE; + LocationHybridPrivate *priv = GET_PRIVATE (self); + LocationVelocity *gps_vel = NULL, *wps_vel = NULL; + LocationAccuracy *gps_acc = NULL, *wps_acc = NULL; + + if (priv->gps) location_get_last_velocity (priv->gps, &gps_vel, &gps_acc); + if (priv->wps) location_get_last_velocity (priv->wps, &wps_vel, &wps_acc); + + if (gps_vel && wps_vel) { + if (wps_vel->timestamp > gps_vel->timestamp) { + *velocity = wps_vel; + *accuracy = wps_acc; + location_velocity_free (gps_vel); + location_accuracy_free (gps_acc); + } else { + *velocity = gps_vel; + *accuracy = gps_acc; + location_velocity_free (wps_vel); + location_accuracy_free (wps_acc); + } + } + else if (gps_vel) { + *velocity = gps_vel; + *accuracy = gps_acc; + } else if (wps_vel) { + *velocity = wps_vel; + *accuracy = wps_acc; + } else { + *velocity = NULL; + *accuracy = NULL; + ret = LOCATION_ERROR_NOT_AVAILABLE; + } + + return ret; +} + +static int +location_hybrid_get_satellite (LocationHybrid *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_hybrid_get_satellite"); + setting_retval_if_fail(GPS_ENABLED); + + int ret = LOCATION_ERROR_NONE; + LocationHybridPrivate *priv = GET_PRIVATE (self); + if (priv->gps) ret = location_get_satellite (priv->gps, satellite); + else { + *satellite = NULL; + ret = LOCATION_ERROR_NOT_AVAILABLE; + } + + return ret; +} + +static int +location_hybrid_get_last_satellite (LocationHybrid *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_hybrid_get_last_satellite"); + setting_retval_if_fail(GPS_ENABLED); + + int ret = LOCATION_ERROR_NONE; + LocationHybridPrivate *priv = GET_PRIVATE (self); + + if (priv->gps) ret = location_get_last_satellite (priv->gps, satellite); + else { + *satellite = NULL; + ret = LOCATION_ERROR_NOT_AVAILABLE; + } + + return ret; +} + static void location_ielement_interface_init (LocationIElementInterface *iface) { iface->start = (TYPE_START_FUNC)location_hybrid_start; iface->stop = (TYPE_STOP_FUNC)location_hybrid_stop; iface->get_position = (TYPE_GET_POSITION)location_hybrid_get_position; + iface->get_last_position = (TYPE_GET_POSITION)location_hybrid_get_last_position; iface->get_velocity = (TYPE_GET_VELOCITY)location_hybrid_get_velocity; + iface->get_last_velocity = (TYPE_GET_VELOCITY)location_hybrid_get_last_velocity; + iface->get_satellite = (TYPE_GET_SATELLITE)location_hybrid_get_satellite; + iface->get_last_satellite = (TYPE_GET_SATELLITE)location_hybrid_get_last_satellite; } static void diff --git a/location/location-hybrid.h b/location/manager/location-hybrid.h similarity index 98% rename from location/location-hybrid.h rename to location/manager/location-hybrid.h index b7434c3..a044992 100644 --- a/location/location-hybrid.h +++ b/location/manager/location-hybrid.h @@ -27,9 +27,6 @@ /** * @file location-hybrid.h * @brief This file contains the internal definitions and structures related to Hybrid method. - * @addtogroup LocationInternal - * @{ - *@} */ G_BEGIN_DECLS diff --git a/location/location-ielement.c b/location/manager/location-ielement.c similarity index 51% rename from location/location-ielement.c rename to location/manager/location-ielement.c index 3b17b01..ffa63cb 100644 --- a/location/location-ielement.c +++ b/location/manager/location-ielement.c @@ -23,8 +23,8 @@ #include "config.h" #endif -#include "location/location-log.h" -#include "location/location-ielement.h" +#include "location-log.h" +#include "location-ielement.h" static void location_ielement_base_init (gpointer g_class) @@ -87,6 +87,42 @@ location_ielement_get_position (LocationIElement *self, } int +location_ielement_get_last_position (LocationIElement *self, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_last_position, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->get_last_position (self, position, accuracy); +} + +int +location_ielement_get_satellite (LocationIElement *self, + LocationSatellite **satellite) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (satellite, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_satellite, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->get_satellite (self, satellite); +} + +int +location_ielement_get_last_satellite (LocationIElement *self, + LocationSatellite **satellite) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (satellite, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_last_satellite, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->get_last_satellite (self, satellite); +} + + +int location_ielement_get_velocity (LocationIElement *self, LocationVelocity **velocity, LocationAccuracy **accuracy) @@ -98,6 +134,17 @@ location_ielement_get_velocity (LocationIElement *self, } int +location_ielement_get_last_velocity (LocationIElement *self, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (velocity, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_last_velocity, LOCATION_ERROR_NOT_AVAILABLE); + return LOCATION_IELEMENT_GET_INTERFACE (self)->get_last_velocity (self, velocity, accuracy); +} + +int location_ielement_get_geocode (LocationIElement *self, const LocationAddress *address, GList **position_list, @@ -106,7 +153,6 @@ location_ielement_get_geocode (LocationIElement *self, g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); g_return_val_if_fail (address, LOCATION_ERROR_PARAMETER); g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_geocode, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_geocode (self, address, position_list, accuracy_list); } @@ -119,7 +165,6 @@ location_ielement_get_geocode_freeform (LocationIElement *self, g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); g_return_val_if_fail (address, LOCATION_ERROR_PARAMETER); g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_geocode_freeform, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_geocode_freeform (self, address, position_list, accuracy_list); } @@ -177,85 +222,125 @@ location_ielement_get_reversegeocode_async (LocationIElement *self, } int -location_ielement_get_poi (LocationIElement *self, - gdouble radius, - const gchar* keyword, - LocationPOIInfo **poi_info) +location_ielement_search_poi (LocationIElement *self, + const LocationPOIFilter * filter, const LocationPosition *position, + const LocationPreference *svc_pref, const LocationPOIPreference * pref, + LocationPOICB cb, const gpointer user_data, guint * req_id) { g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi_info, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi(self, radius, keyword, poi_info); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi(self, + filter, position, svc_pref, pref, cb, user_data, req_id); } int -location_ielement_get_poi_from_address (LocationIElement *self, - const LocationAddress* address, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) +location_ielement_search_poi_by_area (LocationIElement *self, + const LocationPOIFilter * filter, const LocationBoundary * boundary, + const LocationPreference *svc_pref, const LocationPOIPreference * pref, + LocationPOICB cb, const gpointer user_data, guint * req_id) { g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (boundary, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi_by_area, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi_by_area (self, + filter, boundary, svc_pref, pref, cb, user_data, req_id); +} + +int +location_ielement_search_poi_by_address (LocationIElement *self, + const LocationPOIFilter * filter, const LocationAddress * address, + const LocationPreference *svc_pref, const LocationPOIPreference * pref, + LocationPOICB cb, const gpointer user_data, guint * req_id) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); g_return_val_if_fail (address, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi_info, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_address, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_address(self, address, radius, keyword, poi_info); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi_by_address, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi_by_address (self, + filter, address, svc_pref, pref, cb, user_data, req_id); } int -location_ielement_get_poi_from_position (LocationIElement *self, - const LocationPosition *position, - gdouble radius, - const gchar *keyword, - LocationPOIInfo **poi_info) +location_ielement_search_poi_by_freeform (LocationIElement *self, const LocationPOIFilter * filter, + const gchar *freeform, const LocationPreference *svc_pref, const LocationPOIPreference *pref, LocationPOICB cb, + const gpointer user_data, guint * req_id) { g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (poi_info, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_position, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_position(self, position, radius, keyword, poi_info); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (freeform, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi_by_freeform, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->search_poi_by_freeform (self, + filter, freeform, svc_pref, pref, cb, user_data, req_id); } int -location_ielement_get_poi_async (LocationIElement *self, - gdouble radius, - const gchar *keyword, - LocationPOICB callback, - gpointer userdata) +location_ielement_cancel_poi_request (LocationIElement *self, guint req_id) { g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (callback, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_async, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_async (self, radius, keyword, callback, userdata); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->cancel_poi_request, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->cancel_poi_request (self, req_id); } int -location_ielement_get_poi_from_address_async (LocationIElement *self, - const LocationAddress *address, - gdouble radius, - const gchar* keyword, - LocationPOICB callback, - gpointer userdata) +location_ielement_request_route (LocationIElement *self, const LocationPosition *origin, + const LocationPosition *destination, GList *waypoint, + const LocationPreference *svc_pref, const LocationRoutePreference *pref, LocationRouteCB cb, const gpointer user_data, guint *req_id) { g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (address, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (callback, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_address_async, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_address_async (self, address, radius, keyword, callback, userdata); + g_return_val_if_fail (origin, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (destination, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->request_route, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->request_route (self, + origin, destination, waypoint, svc_pref, pref, cb, user_data, req_id); } +int +location_ielement_cancel_route_request (LocationIElement *self, guint req_id) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->cancel_route_request, LOCATION_ERROR_NOT_AVAILABLE); + return LOCATION_IELEMENT_GET_INTERFACE (self)->cancel_route_request (self, req_id); +} -int location_ielement_get_poi_from_position_async (LocationIElement *self, - const LocationPosition* position, - gdouble radius, - const gchar* keyword, - LocationPOICB callback, - gpointer userdata) +gboolean +location_ielement_is_supported_map_provider_capability (LocationIElement *self, LocationMapServiceType type) { g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (callback, LOCATION_ERROR_PARAMETER); - g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_position_async, LOCATION_ERROR_NOT_AVAILABLE); - return LOCATION_IELEMENT_GET_INTERFACE (self)->get_poi_from_position_async (self, position, radius, keyword, callback, userdata); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->is_supported_map_provider_capability, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->is_supported_map_provider_capability (self, type); +} + +int +location_ielement_get_map_provider_capability_key (LocationIElement *self, LocationMapServiceType type, GList **key) +{ + g_return_val_if_fail (LOCATION_IS_IELEMENT (self), LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (LOCATION_IELEMENT_GET_INTERFACE (self)->get_map_provider_capability_key, LOCATION_ERROR_NOT_AVAILABLE); + + return LOCATION_IELEMENT_GET_INTERFACE (self)->get_map_provider_capability_key (self, type, key); } diff --git a/location/manager/location-ielement.h b/location/manager/location-ielement.h new file mode 100644 index 0000000..325ff6d --- /dev/null +++ b/location/manager/location-ielement.h @@ -0,0 +1,138 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_IELEMENT_H__ +#define __LOCATION_IELEMENT_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * @file location-ielement.h + * @brief This file contains the internal definitions and structures related to location interface. + */ + +G_BEGIN_DECLS + +enum { + SERVICE_ENABLED, + SERVICE_DISABLED, + SERVICE_UPDATED, + ZONE_IN, + ZONE_OUT, + LAST_SIGNAL +}; + +#define LOCATION_TYPE_IELEMENT (location_ielement_get_type ()) +#define LOCATION_IELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOCATION_TYPE_IELEMENT, LocationIElement)) +#define LOCATION_IS_IELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOCATION_TYPE_IELEMENT)) +#define LOCATION_IELEMENT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LOCATION_TYPE_IELEMENT, LocationIElementInterface)) + +typedef struct _LocationIElement LocationIElement; +typedef struct _LocationIElementInterface LocationIElementInterface; + +typedef int (*TYPE_START_FUNC)(LocationIElement *self); +typedef int (*TYPE_STOP_FUNC) (LocationIElement *self); +typedef int (*TYPE_GET_POSITION)(LocationIElement *self, LocationPosition **position, LocationAccuracy **accuracy); +typedef int (*TYPE_GET_VELOCITY)(LocationIElement *self, LocationVelocity **velocity, LocationAccuracy **accuracy); +typedef int (*TYPE_GET_SATELLITE)(LocationIElement *self, LocationSatellite **satellite); +typedef int (*TYPE_GET_GEOCODE)(LocationIElement *self, const LocationAddress *address, GList **position_list, GList **accuracy_list); +typedef int (*TYPE_GET_GEOCODE_FREEFORM)(LocationIElement *self, const gchar *address, GList **position_list, GList **accuracy_list); +typedef int (*TYPE_GET_REVERSEGEOCODE)(LocationIElement *self, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); +typedef int (*TYPE_GET_GEOCODE_ASYNC)(LocationIElement *self, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); +typedef int (*TYPE_GET_GEOCODE_FREEFORM_ASYNC)(LocationIElement *self, const gchar *address, LocationPositionCB callback, gpointer userdata); +typedef int (*TYPE_GET_REVERSEGEOCODE_ASYNC)(LocationIElement *self, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); +typedef int (*TYPE_SEARCH_POI) (LocationIElement *self, const LocationPOIFilter * filter, const LocationPosition *position, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint *req_id); +typedef int (*TYPE_SEARCH_POI_BY_AREA) (LocationIElement *self, const LocationPOIFilter *filter, const LocationBoundary * boundary, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint *req_id); +typedef int (*TYPE_SEARCH_POI_BY_ADDR) (LocationIElement *self, const LocationPOIFilter *filter, const LocationAddress * address, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint *req_id); +typedef int (*TYPE_SEARCH_POI_BY_FREEFORM) (LocationIElement *self, const LocationPOIFilter *filter, const gchar *freeform, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint *req_id); +typedef int (*TYPE_CANCEL_POI_REQUEST) (LocationIElement *self, guint req_id); +typedef int (*TYPE_REQUEST_ROUTE) (LocationIElement *self, const LocationPosition *origin, const LocationPosition *destination, GList *waypoint, const LocationPreference *svc_pref, const LocationRoutePreference *pref, LocationRouteCB cb, const gpointer user_data, guint *req_id); +typedef int (*TYPE_CANCEL_ROUTE_REQUEST) (LocationIElement *self, guint req_id); +typedef gboolean (*TYPE_IS_SUPPORTED_MAP_PROVIDER_CAPABILITY) (LocationIElement *self, LocationMapServiceType type); +typedef int (*TYPE_GET_MAP_PROVIDER_CAPABILITY_KEY)(LocationIElement *self, LocationMapServiceType type, GList **key); + +struct _LocationIElementInterface +{ + GTypeInterface parent_iface; + + TYPE_START_FUNC start; + TYPE_STOP_FUNC stop; + TYPE_GET_POSITION get_position; + TYPE_GET_POSITION get_last_position; + TYPE_GET_VELOCITY get_velocity; + TYPE_GET_VELOCITY get_last_velocity; + TYPE_GET_SATELLITE get_satellite; + TYPE_GET_SATELLITE get_last_satellite; + TYPE_GET_GEOCODE get_geocode; + TYPE_GET_GEOCODE_FREEFORM get_geocode_freeform; + TYPE_GET_REVERSEGEOCODE get_reversegeocode; + TYPE_GET_GEOCODE_ASYNC get_geocode_async; + TYPE_GET_GEOCODE_FREEFORM_ASYNC get_geocode_freeform_async; + TYPE_GET_REVERSEGEOCODE_ASYNC get_reversegeocode_async; + TYPE_SEARCH_POI search_poi; + TYPE_SEARCH_POI_BY_AREA search_poi_by_area; + TYPE_SEARCH_POI_BY_ADDR search_poi_by_address; + TYPE_SEARCH_POI_BY_FREEFORM search_poi_by_freeform; + TYPE_CANCEL_POI_REQUEST cancel_poi_request; + TYPE_REQUEST_ROUTE request_route; + TYPE_CANCEL_ROUTE_REQUEST cancel_route_request; + TYPE_IS_SUPPORTED_MAP_PROVIDER_CAPABILITY is_supported_map_provider_capability; + TYPE_GET_MAP_PROVIDER_CAPABILITY_KEY get_map_provider_capability_key; + +}; + +GType location_ielement_get_type (void); + +int location_ielement_start (LocationIElement *self); +int location_ielement_stop(LocationIElement *self); +int location_ielement_get_position (LocationIElement *self, LocationPosition **position, LocationAccuracy **accuracy); +int location_ielement_get_last_position (LocationIElement *self, LocationPosition **position, LocationAccuracy **accuracy); +int location_ielement_get_velocity (LocationIElement *self, LocationVelocity **velocity, LocationAccuracy **accuracy); +int location_ielement_get_last_velocity (LocationIElement *self, LocationVelocity **velocity, LocationAccuracy **accuracy); +int location_ielement_get_satellite (LocationIElement *self, LocationSatellite **satellite); +int location_ielement_get_last_satellite (LocationIElement *self, LocationSatellite **satellite); +int location_ielement_get_geocode (LocationIElement *self, const LocationAddress *address, GList **position_list, GList **accuracy_list); +int location_ielement_get_geocode_freeform (LocationIElement *self, const gchar *address, GList **position_list, GList **accuracy_list); +int location_ielement_get_reversegeocode (LocationIElement *self, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); +int location_ielement_get_geocode_async (LocationIElement *self, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); +int location_ielement_get_geocode_freeform_async (LocationIElement *self, const gchar *address, LocationPositionCB callback, gpointer userdata); +int location_ielement_get_reversegeocode_async (LocationIElement *self, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); +int location_ielement_search_poi (LocationIElement *self, const LocationPOIFilter * filter, const LocationPosition *position, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint * req_id); +int location_ielement_search_poi_by_area (LocationIElement *self, const LocationPOIFilter * filter, const LocationBoundary * boundary, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint * req_id); +int location_ielement_search_poi_by_address (LocationIElement *self, const LocationPOIFilter * filter, const LocationAddress * address, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint * req_id); +int location_ielement_search_poi_by_freeform (LocationIElement *self, const LocationPOIFilter * filter, const gchar * freeform, const LocationPreference *svc_pref, const LocationPOIPreference * pref, LocationPOICB cb, const gpointer user_data, guint * req_id); +int location_ielement_cancel_poi_request (LocationIElement *self, guint req_id); +int location_ielement_request_route (LocationIElement *self, const LocationPosition *origin, const LocationPosition *destination, GList *waypoint, const LocationPreference *svc_pref, const LocationRoutePreference * pref, LocationRouteCB cb, const gpointer user_data, guint * req_id); +int location_ielement_cancel_route_request (LocationIElement *self, guint req_id); +gboolean location_ielement_is_supported_map_provider_capability (LocationIElement *self, LocationMapServiceType type); +int location_ielement_get_map_provider_capability_key (LocationIElement *self, LocationMapServiceType type, GList **key); + +G_END_DECLS + +#endif diff --git a/location/location-ips.c b/location/manager/location-ips.c similarity index 95% rename from location/location-ips.c rename to location/manager/location-ips.c index 0412c01..b596404 100644 --- a/location/location-ips.c +++ b/location/manager/location-ips.c @@ -23,14 +23,14 @@ #include "config.h" #endif -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-setting.h" +#include "location-log.h" -#include "location/location-module-internal.h" +#include "module-internal.h" -#include "location/location-ips.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" +#include "location-ips.h" +#include "location-marshal.h" +#include "location-ielement.h" typedef struct _LocationIpsPrivate { LocationIpsMod *mod; diff --git a/location/location-ips.h b/location/manager/location-ips.h similarity index 97% rename from location/location-ips.h rename to location/manager/location-ips.h index b2523b6..b8f1cc6 100644 --- a/location/location-ips.h +++ b/location/manager/location-ips.h @@ -27,9 +27,6 @@ /** * @file location-ips.h * @brief This file contains the internal definitions and structures related to IPS. - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS diff --git a/location/location-marshal.list b/location/manager/location-marshal.list similarity index 100% rename from location/location-marshal.list rename to location/manager/location-marshal.list diff --git a/location/location-position.c b/location/manager/location-position.c similarity index 96% rename from location/location-position.c rename to location/manager/location-position.c index dd3b387..bac60f9 100644 --- a/location/location-position.c +++ b/location/manager/location-position.c @@ -26,9 +26,9 @@ #include #include -#include "location/location-position.h" -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-position.h" +#include "location-setting.h" +#include "location-log.h" #define DEG2RAD(x) ((x) * M_PI / 180) @@ -53,6 +53,9 @@ location_position_new (guint timestamp, gdouble altitude, LocationStatus status) { + if (latitude < -90 || latitude > 90) return NULL; + if (longitude < -180 || longitude > 180) return NULL; + LocationPosition* position = g_slice_new0(LocationPosition); position->timestamp = timestamp; position->latitude = latitude; diff --git a/location/location-position.h b/location/manager/location-position.h similarity index 96% rename from location/location-position.h rename to location/manager/location-position.h index 4ef257b..1a2b08c 100644 --- a/location/location-position.h +++ b/location/manager/location-position.h @@ -22,20 +22,30 @@ #ifndef __LOCATION_POSITION_H_ #define __LOCATION_POSITION_H_ -#include +#include #define MAX_KEY_LENGTH 16 #define HALF_KEY_LENGTH 8 +G_BEGIN_DECLS + +GType location_position_get_type (void); +#define LOCATION_TYPE_POSITION (location_position_get_type ()) + /** * @file location-position.h * @brief This file contains the internal definitions and structures related to position information. - * @addtogroup LocationTypes + */ +/** + * @addtogroup LocationAPI * @{ + * @defgroup LocationAPIPosition Location Position + * @breif This provides APIs related to Location Position + * @addtogroup LocationAPIPosition + * @{ + * */ -G_BEGIN_DECLS - /** * @brief This represents the various fix states. */ @@ -73,9 +83,6 @@ struct _LocationLastPosition gdouble vertical_accuracy; ///< Vertical accuracy data. }; -GType location_position_get_type (void); -#define LOCATION_TYPE_POSITION (location_position_get_type ()) - /** * @brief Create a new #LocationPosition with given information. * @remarks None. @@ -162,7 +169,7 @@ int location_get_distance(const LocationPosition *pos1, const LocationPosition * void location_last_position_a2i(char *position, int *lat, int *lon); /** - * @} + * @} @} */ G_END_DECLS diff --git a/location/location-satellite.c b/location/manager/location-satellite.c similarity index 97% rename from location/location-satellite.c rename to location/manager/location-satellite.c index 6c19ed4..f572c44 100644 --- a/location/location-satellite.c +++ b/location/manager/location-satellite.c @@ -23,8 +23,8 @@ #include "config.h" #endif -#include "location/location-satellite.h" -#include "location/location-log.h" +#include "location-satellite.h" +#include "location-log.h" GType location_satellite_get_type (void) @@ -75,6 +75,7 @@ location_satellite_copy (const LocationSatellite *satellite) { g_return_val_if_fail(satellite, NULL); LocationSatellite* satellite_dup = location_satellite_new(satellite->num_of_sat_inview); + satellite_dup->timestamp = satellite->timestamp; satellite_dup->num_of_sat_used = satellite->num_of_sat_used; int i = 0; for (i = 0 ; i < satellite_dup->num_of_sat_inview ; i++) diff --git a/location/location-satellite.h b/location/manager/location-satellite.h similarity index 95% rename from location/location-satellite.h rename to location/manager/location-satellite.h index f91f98f..3bdb534 100644 --- a/location/location-satellite.h +++ b/location/manager/location-satellite.h @@ -22,17 +22,26 @@ #ifndef __LOCATION_SATELLITE_H_ #define __LOCATION_SATELLITE_H_ -#include +#include + +G_BEGIN_DECLS + +GType location_satellite_get_type (void); +#define LOCATION_TYPE_SATELLITE (location_satellite_get_type ()) /** * @file location-satellite.h * @brief This file contains the internal definitions and structures related to satellite information. - * @addtogroup LocationTypes + */ +/** + * @addtogroup LocationAPI + * @{ + * @defgroup LocationAPISatellite Location Satellite + * @breif This provides APIs related to Location Satellite + * @addtogroup LocationAPISatellite * @{ */ -G_BEGIN_DECLS - /** * @brief This represents one satellite information in view. */ @@ -55,9 +64,6 @@ struct _LocationSatellite LocationSatelliteDetail* sat_inview; ///< The information of satellites in view . }; -GType location_satellite_get_type (void); -#define LOCATION_TYPE_SATELLITE (location_satellite_get_type ()) - /** * @brief Create a new #LocationSatellite with given number of #LocationSatelliteDetail. * @remarks None. @@ -129,7 +135,7 @@ gboolean location_satellite_get_satellite_details (const LocationSatellite *sate gboolean location_satellite_set_satellite_details( LocationSatellite *satellite, guint index, guint prn, gboolean used, guint elevation, guint azimuth, gint snr); /** - * @} + * @} @} */ G_END_DECLS diff --git a/location/location-setting.c b/location/manager/location-setting.c similarity index 97% rename from location/location-setting.c rename to location/manager/location-setting.c index 9f7e73a..21358e2 100644 --- a/location/location-setting.c +++ b/location/manager/location-setting.c @@ -24,8 +24,8 @@ #endif #include -#include "location/location-log.h" -#include "location/location-setting.h" +#include "location-log.h" +#include "location-setting.h" gint location_setting_get_key_val(keynode_t *key) diff --git a/location/location-setting.h b/location/manager/location-setting.h similarity index 58% rename from location/location-setting.h rename to location/manager/location-setting.h index 705f778..852e288 100644 --- a/location/location-setting.h +++ b/location/manager/location-setting.h @@ -29,38 +29,9 @@ /** * @file location-setting.h * @brief This file contains the definitions and functions for setting. - * @addtogroup LocationInternal - * @{ - * @} */ -#define VCONF_LOCATION_PATH "db/location" - -#define LOCATION_LAST_POSITION_PATH VCONF_LOCATION_PATH"/lastposition" -#define GPS_LAST_POSITION_PATH LOCATION_LAST_POSITION_PATH"/gps" -#define WPS_LAST_POSITION_PATH LOCATION_LAST_POSITION_PATH"/wps" -#define SPS_LAST_POSITION_PATH LOCATION_LAST_POSITION_PATH"/sps" - -#define GPS_LAST_TIMESTAMP GPS_LAST_POSITION_PATH"/Timestamp" -#define GPS_LAST_LATITUDE GPS_LAST_POSITION_PATH"/Latitude" -#define GPS_LAST_LONGITUDE GPS_LAST_POSITION_PATH"/Longitude" -#define GPS_LAST_ALTITUDE GPS_LAST_POSITION_PATH"/Altitude" -#define GPS_LAST_HORACCURACY GPS_LAST_POSITION_PATH"/HorAccuracy" -#define GPS_LAST_VERACCURACY GPS_LAST_POSITION_PATH"/VerAccuracy" - -#define WPS_LAST_TIMESTAMP WPS_LAST_POSITION_PATH"/Timestamp" -#define WPS_LAST_LATITUDE WPS_LAST_POSITION_PATH"/Latitude" -#define WPS_LAST_LONGITUDE WPS_LAST_POSITION_PATH"/Longitude" -#define WPS_LAST_ALTITUDE WPS_LAST_POSITION_PATH"/Altitude" -#define WPS_LAST_HORACCURACY WPS_LAST_POSITION_PATH"/HorAccuracy" -#define WPS_LAST_VERACCURACY WPS_LAST_POSITION_PATH"/VerAccuracy" - -#define SPS_LAST_TIMESTAMP SPS_LAST_POSITION_PATH"/Timestamp" -#define SPS_LAST_LATITUDE SPS_LAST_POSITION_PATH"/Latitude" -#define SPS_LAST_LONGITUDE SPS_LAST_POSITION_PATH"/Longitude" -#define SPS_LAST_ALTITUDE SPS_LAST_POSITION_PATH"/Altitude" -#define SPS_LAST_HORACCURACY SPS_LAST_POSITION_PATH"/HorAccuracy" -#define SPS_LAST_VERACCURACY SPS_LAST_POSITION_PATH"/VerAccuracy" +#define VCONF_LOCATION_PATH "db/location" #define GPS_ENABLED VCONFKEY_LOCATION_ENABLED #define LOCATION_SETTING_PATH VCONF_LOCATION_PATH"/setting" diff --git a/location/location-signaling-util.c b/location/manager/location-signaling-util.c similarity index 84% rename from location/location-signaling-util.c rename to location/manager/location-signaling-util.c index 263dc2f..4306c46 100644 --- a/location/location-signaling-util.c +++ b/location/manager/location-signaling-util.c @@ -23,8 +23,8 @@ #include "config.h" #endif -#include "location/location-signaling-util.h" -#include "location/location-log.h" +#include "location-signaling-util.h" +#include "location-log.h" #define POS_EXPIRATION_TIME 9 /* sec */ @@ -165,3 +165,35 @@ velocity_signaling (LocationObject *obj, } } + +void +satellite_signaling(LocationObject *obj, + guint32 signals[LAST_SIGNAL], + gboolean *prev_enabled, + guint interval, + guint *sat_timestamp, + LocationSatellite **prev_sat, + gboolean enabled, + const LocationSatellite *sat) +{ + g_return_if_fail(obj); + g_return_if_fail(signals); + g_return_if_fail(sat); + + if (*prev_sat) { + location_satellite_free(*prev_sat); + } + + *prev_sat = location_satellite_copy (sat); + if (!(*sat_timestamp) || sat->timestamp - *sat_timestamp > interval) { + + LOCATION_LOGD ("Signal emit: SATELLITE SERVICE_UPDATED"); + LocationSatellite *temp_sat = location_satellite_copy (sat); + + g_signal_emit (obj, signals[SERVICE_UPDATED], 0, SATELLITE_UPDATED, temp_sat, NULL); + + *sat_timestamp = sat->timestamp; + + location_satellite_free(temp_sat); + } +} diff --git a/location/location-signaling-util.h b/location/manager/location-signaling-util.h similarity index 87% rename from location/location-signaling-util.h rename to location/manager/location-signaling-util.h index c2474bf..0ef62d5 100644 --- a/location/location-signaling-util.h +++ b/location/manager/location-signaling-util.h @@ -22,15 +22,12 @@ #ifndef __LOCATION_SIGNALING_UTIL_H__ #define __LOCATION_SIGNALING_UTIL_H__ -#include -#include +#include +#include /** * @file location-signaling.h * @brief This file contains the signaling utils for LocationObject. - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS @@ -47,6 +44,9 @@ void position_signaling (LocationObject *obj, guint32 signals[LAST_SIGNAL], gboo void velocity_signaling (LocationObject* obj, guint32 signals[LAST_SIGNAL], gboolean *prev_enabled, guint interval, LocationVelocity **prev_vel, gboolean enabled, const LocationVelocity *vel, const LocationAccuracy *acc); +void +satellite_signaling(LocationObject *obj, guint32 signals[LAST_SIGNAL], gboolean *prev_enabled, guint interval, guint *sat_timestamp, LocationSatellite **pre_sat, gboolean enabled, const LocationSatellite *sat); + G_END_DECLS #endif diff --git a/location/location-sps.c b/location/manager/location-sps.c similarity index 92% rename from location/location-sps.c rename to location/manager/location-sps.c index 4f54fed..734d1d1 100644 --- a/location/location-sps.c +++ b/location/manager/location-sps.c @@ -23,16 +23,16 @@ #include "config.h" #endif -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-setting.h" +#include "location-log.h" -#include "location/location-module-internal.h" +#include "module-internal.h" -#include "location/location-sps.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" -#include "location/location-signaling-util.h" -#include "location/location-common-util.h" +#include "location-sps.h" +#include "location-marshal.h" +#include "location-ielement.h" +#include "location-signaling-util.h" +#include "location-common-util.h" typedef struct _LocationSpsPrivate { LocationSpsMod* mod; @@ -376,6 +376,15 @@ location_sps_get_position (LocationSps *self, } static int +location_sps_get_last_position (LocationSps *self, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_sps_get_last_position"); + return LOCATION_ERROR_NOT_SUPPORTED; +} + +static int location_sps_get_velocity (LocationSps *self, LocationVelocity **velocity, LocationAccuracy **accuracy) @@ -393,13 +402,42 @@ location_sps_get_velocity (LocationSps *self, return ops.get_velocity(priv->mod->handler, velocity, accuracy); } +static int +location_sps_get_last_velocity (LocationSps *self, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_sps_get_last_velocity"); + return LOCATION_ERROR_NOT_SUPPORTED; +} + +static int +location_sps_get_satellite (LocationSps *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_sps_get_satellite"); + return LOCATION_ERROR_NOT_SUPPORTED; +} + +static int +location_sps_get_last_satellite (LocationSps *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_sps_get_last_satellite"); + return LOCATION_ERROR_NOT_SUPPORTED; +} + static void location_ielement_interface_init (LocationIElementInterface *iface) { iface->start = (TYPE_START_FUNC)location_sps_start; iface->stop = (TYPE_STOP_FUNC)location_sps_stop; iface->get_position = (TYPE_GET_POSITION)location_sps_get_position; + iface->get_last_position = (TYPE_GET_POSITION)location_sps_get_last_position; iface->get_velocity = (TYPE_GET_VELOCITY)location_sps_get_velocity; + iface->get_last_velocity = (TYPE_GET_VELOCITY)location_sps_get_last_velocity; + iface->get_satellite = (TYPE_GET_SATELLITE)location_sps_get_satellite; + iface->get_last_satellite = (TYPE_GET_SATELLITE)location_sps_get_last_satellite; } static void diff --git a/location/location-sps.h b/location/manager/location-sps.h similarity index 98% rename from location/location-sps.h rename to location/manager/location-sps.h index 5d82a9a..f39815d 100644 --- a/location/location-sps.h +++ b/location/manager/location-sps.h @@ -27,9 +27,6 @@ /** * @file location-sps.h * @brief This file contains the internal definitions and structures related to SPS. - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS diff --git a/location/location-velocity.c b/location/manager/location-velocity.c similarity index 97% rename from location/location-velocity.c rename to location/manager/location-velocity.c index fd7b523..61c839e 100644 --- a/location/location-velocity.c +++ b/location/manager/location-velocity.c @@ -23,8 +23,8 @@ #include "config.h" #endif -#include "location/location-velocity.h" -#include "location/location-log.h" +#include "location-velocity.h" +#include "location-log.h" GType location_velocity_get_type (void) diff --git a/location/location-velocity.h b/location/manager/location-velocity.h similarity index 93% rename from location/location-velocity.h rename to location/manager/location-velocity.h index 5dc1c81..5112298 100644 --- a/location/location-velocity.h +++ b/location/manager/location-velocity.h @@ -22,17 +22,26 @@ #ifndef __LOCATION_VELOCITY_H_ #define __LOCATION_VELOCITY_H_ -#include +#include + +G_BEGIN_DECLS + +GType location_velocity_get_type (void); +#define LOCATION_TYPE_VELOCITY (location_velocity_get_type ()) /** * @file location-velocity.h * @brief This file contains the internal definitions and structures related to velocity information. - * @addtogroup LocationTypes + */ +/** + * @addtogroup LocationAPI + * @{ + * @defgroup LocationAPIVelocity Location Velocity + * @breif This provides APIs related to Location Velocity + * @addtogroup LocationAPIVelocity * @{ */ -G_BEGIN_DECLS - /** * @brief This represents velocity information such as as speed, direction, climb. */ @@ -45,9 +54,6 @@ struct _LocationVelocity gdouble climb; ///< The vertical speed. (km/h) }; -GType location_velocity_get_type (void); -#define LOCATION_TYPE_VELOCITY (location_velocity_get_type ()) - /** * @brief Create a new #LocationVelocity with given information. * @remarks None. @@ -98,7 +104,7 @@ gboolean location_velocity_equal (const LocationVelocity *velocity1, const Locat LocationVelocity *location_velocity_copy (const LocationVelocity *velocity); /** - * @} + * @} @} */ G_END_DECLS diff --git a/location/location-wps.c b/location/manager/location-wps.c similarity index 85% rename from location/location-wps.c rename to location/manager/location-wps.c index 8d11352..06da7ca 100644 --- a/location/location-wps.c +++ b/location/manager/location-wps.c @@ -23,16 +23,16 @@ #include "config.h" #endif -#include "location/location-setting.h" -#include "location/location-log.h" +#include "location-setting.h" +#include "location-log.h" -#include "location/location-module-internal.h" +#include "module-internal.h" -#include "location/location-wps.h" -#include "location/location-marshal.h" -#include "location/location-ielement.h" -#include "location/location-signaling-util.h" -#include "location/location-common-util.h" +#include "location-wps.h" +#include "location-marshal.h" +#include "location-ielement.h" +#include "location-signaling-util.h" +#include "location-common-util.h" /* * forward definitions */ @@ -131,7 +131,7 @@ location_setting_wps_cb(keynode_t *key, else { if (1 == location_setting_get_int(NETWORK_ENABLED) && priv->mod->ops.start && !priv->is_started) { LOCATION_LOGD("location resumed by setting"); - ret = priv->mod->ops.start (priv->mod->handler, wps_status_cb, wps_position_cb, wps_velocity_cb, self); + ret = priv->mod->ops.start (priv->mod->handler, wps_status_cb, wps_position_cb, wps_velocity_cb, NULL, self); if (ret == LOCATION_ERROR_NONE) priv->is_started = TRUE; } } @@ -156,7 +156,7 @@ location_wps_start (LocationWps *self) ret = LOCATION_ERROR_NOT_ALLOWED; } else { - ret = priv->mod->ops.start (priv->mod->handler, wps_status_cb, wps_position_cb, wps_velocity_cb, self); + ret = priv->mod->ops.start (priv->mod->handler, wps_status_cb, wps_position_cb, wps_velocity_cb, NULL, self); if (ret == LOCATION_ERROR_NONE) { priv->is_started = TRUE; } @@ -319,6 +319,26 @@ location_wps_get_position (LocationWps *self, } static int +location_wps_get_last_position (LocationWps *self, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_wps_get_last_position"); + + /* Do not need to check GPS_ENABLED and NETWORK_ENABLED */ + + LocationWpsPrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + + LocModWpsOps ops = priv->mod->ops; + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (ops.get_last_position, LOCATION_ERROR_NOT_AVAILABLE); + + return ops.get_last_position(priv->mod->handler, position, accuracy); + +} + +static int location_wps_get_velocity (LocationWps *self, LocationVelocity **velocity, LocationAccuracy **accuracy) @@ -336,13 +356,52 @@ location_wps_get_velocity (LocationWps *self, return ops.get_velocity(priv->mod->handler, velocity, accuracy); } +static int +location_wps_get_last_velocity (LocationWps *self, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("location_wps_get_last_velocity"); + + /* Do not need to check GPS_ENABLED and NETWORK_ENABLED */ + + LocationWpsPrivate *priv = GET_PRIVATE (self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + + LocModWpsOps ops = priv->mod->ops; + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (ops.get_last_velocity, LOCATION_ERROR_NOT_AVAILABLE); + return ops.get_last_velocity(priv->mod->handler, velocity, accuracy); + +} + +static int +location_wps_get_satellite (LocationWps *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_wps_get_satellite"); + return LOCATION_ERROR_NOT_SUPPORTED; +} + +static int +location_wps_get_last_satellite (LocationWps *self, + LocationSatellite **satellite) +{ + LOCATION_LOGD("location_wps_get_last_satellite"); + return LOCATION_ERROR_NOT_SUPPORTED; +} + static void location_ielement_interface_init (LocationIElementInterface *iface) { iface->start = (TYPE_START_FUNC)location_wps_start; iface->stop = (TYPE_STOP_FUNC)location_wps_stop; iface->get_position = (TYPE_GET_POSITION)location_wps_get_position; + iface->get_last_position = (TYPE_GET_POSITION)location_wps_get_last_position; iface->get_velocity = (TYPE_GET_VELOCITY)location_wps_get_velocity; + iface->get_last_velocity = (TYPE_GET_VELOCITY)location_wps_get_last_velocity; + iface->get_satellite = (TYPE_GET_SATELLITE)location_wps_get_satellite; + iface->get_last_satellite = (TYPE_GET_SATELLITE)location_wps_get_last_satellite; } static void diff --git a/location/location-wps.h b/location/manager/location-wps.h similarity index 98% rename from location/location-wps.h rename to location/manager/location-wps.h index 77ec679..67c9e54 100644 --- a/location/location-wps.h +++ b/location/manager/location-wps.h @@ -27,9 +27,6 @@ /** * @file location-wps.h * @brief This file contains the internal definitions and structures related to WPS. - * @addtogroup LocationInternal - * @{ - * @} */ G_BEGIN_DECLS diff --git a/location/manager/location.c b/location/manager/location.c new file mode 100644 index 0000000..29c6612 --- /dev/null +++ b/location/manager/location.c @@ -0,0 +1,230 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "location.h" +#include "location-log.h" +#include "location-setting.h" +#include "location-ielement.h" +#include "location-hybrid.h" +#include "location-gps.h" +#include "location-wps.h" +#include "location-ips.h" +#include "location-cps.h" +#include "location-sps.h" +#include "location-position.h" +#include "map-service.h" +#include "module-internal.h" +#include "location-common-util.h" + +extern LocationObject *g_map_service; + +EXPORT_API +int location_init (void) +{ + LOCATION_LOGD("location_init"); + g_type_init (); + if (!g_thread_supported()) g_thread_init (NULL); + dbus_g_thread_init (); + if( FALSE == module_init() ) + return LOCATION_ERROR_NOT_AVAILABLE; + + return LOCATION_ERROR_NONE; +} + +EXPORT_API LocationObject* +location_new (LocationMethod method) +{ + LocationObject *self = NULL; + + if (!g_map_service) + g_map_service = g_object_new (MAP_TYPE_SERVICE, NULL); + + switch (method) { + case LOCATION_METHOD_HYBRID: + self = g_object_new (LOCATION_TYPE_HYBRID, NULL); + break; + case LOCATION_METHOD_GPS: + self = g_object_new (LOCATION_TYPE_GPS, NULL); + break; + case LOCATION_METHOD_WPS: + self = g_object_new (LOCATION_TYPE_WPS, NULL); + break; + case LOCATION_METHOD_SPS: + self = g_object_new (LOCATION_TYPE_SPS, NULL); + break; + default: + break; + } + return self; +} + +EXPORT_API int +location_free (LocationObject *obj) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + + if (g_map_service) { + g_object_unref (g_map_service); + g_map_service = NULL; + } + + g_object_unref (obj); + return LOCATION_ERROR_NONE; +} + +EXPORT_API int +location_start (LocationObject *obj) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + return location_ielement_start (LOCATION_IELEMENT(obj)); +} + +EXPORT_API int +location_stop (LocationObject *obj) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + return location_ielement_stop (LOCATION_IELEMENT(obj)); +} + +EXPORT_API gboolean +location_is_supported_method(LocationMethod method) +{ + gboolean is_supported = FALSE; + + switch(method) { + case LOCATION_METHOD_HYBRID: + if(module_is_supported("gps") || module_is_supported("wps") || module_is_supported("sps")) + is_supported = TRUE; + break; + case LOCATION_METHOD_GPS: + is_supported = module_is_supported("gps"); + break; + case LOCATION_METHOD_WPS: + is_supported = module_is_supported("wps"); + break; + case LOCATION_METHOD_SPS: + is_supported = module_is_supported("sps"); + break; + case LOCATION_METHOD_CPS: /* deprecated */ + case LOCATION_METHOD_IPS: /* deprecated */ + default: + break; + } + + return is_supported; +} + +EXPORT_API gboolean +location_is_enabled_gps(LocationObject *obj) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + + return (gboolean) location_setting_get_int(GPS_ENABLED); +} + +EXPORT_API int +location_get_position (LocationObject *obj, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); + return location_ielement_get_position (LOCATION_IELEMENT(obj), position, accuracy); +} + +EXPORT_API int +location_get_last_position (LocationObject *obj, + LocationPosition **position, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); + return location_ielement_get_last_position (LOCATION_IELEMENT(obj), position, accuracy); +} + +EXPORT_API int +location_get_last_known_position (LocationObject *obj, LocationMethod method, + LocationLastPosition *last_position) +{ + return LOCATION_ERROR_NOT_SUPPORTED; +} + +EXPORT_API int +location_get_satellite (LocationObject *obj, LocationSatellite **satellite) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (satellite, LOCATION_ERROR_PARAMETER); + + return location_ielement_get_satellite (LOCATION_IELEMENT(obj), satellite); +} + +EXPORT_API int +location_get_last_satellite (LocationObject *obj, LocationSatellite **satellite) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (satellite, LOCATION_ERROR_PARAMETER); + + return location_ielement_get_last_satellite (LOCATION_IELEMENT(obj), satellite); +} + +EXPORT_API int +location_get_velocity (LocationObject *obj, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (velocity, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); + + return location_ielement_get_velocity (LOCATION_IELEMENT(obj), velocity, accuracy); +} + +EXPORT_API int +location_get_last_velocity (LocationObject *obj, + LocationVelocity **velocity, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (velocity, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (accuracy, LOCATION_ERROR_PARAMETER); + + return location_ielement_get_last_velocity (LOCATION_IELEMENT(obj), velocity, accuracy); +} + + +EXPORT_API int +location_send_command(const char *cmd) +{ + g_return_val_if_fail (cmd, LOCATION_ERROR_PARAMETER); + + return LOCATION_ERROR_NONE; +} + diff --git a/location/manager/location.h b/location/manager/location.h new file mode 100644 index 0000000..17f1164 --- /dev/null +++ b/location/manager/location.h @@ -0,0 +1,738 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __LOCATION_H__ +#define __LOCATION_H__ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +/** + * @file location.h + * @brief This file contains the Location API and related structure and enumeration. + */ +/** + * @defgroup LocationFW LocationFW + * @brief This is a Location Framework for providing location based services. + * @addtogroup LocationFW + * @{ + * @defgroup LocationAPI Location API + * @brief This sub module provides the Location API. + * @addtogroup LocationAPI + * @{ + */ + +/** + * @brief + * Initialize location sub module. + * @remarks None. + * This API should be called before any other Location APIs. + * @pre None. + * @post None. + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see None. + */ +int location_init (void); + +/** + * @brief + * Create a new #LocationObject by using given #LocationMethod. + * @remarks + * Returned object is necessary for other APIs. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * method - Location method to be used. + * @return a new #LocationObject + * @retval NULL if error occured + * @see location_free + */ +LocationObject *location_new (LocationMethod method); + +/** + * @brief + * Free memory of given #LocationObject. + * @remarks None. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new. + * @return int + * @retval 0 Success. + * + * Please refer #LocationError for more information. + * @see location_new + * @par Example + * @code +#include +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc) + return -1; + + // ... Implement your code + + location_free (loc); + // You must free LocationObject when you don't need to use anymore. + return 0; +} + * @endcode + */ +int location_free (LocationObject *obj); + +/** + * @brief + * Start the location service by using given #LocationObject. + * @remarks + * If you want to recieve signals, you should use this API. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @return int + * @retval 0 Success. + * + * Please refer #LocationError for more information. + * @see location_stop + * @par Example + * @code +#include +static GMainLoop *loop = NULL; + +static void cb_service_enabled (GObject *self, guint status, gpointer userdata) +{ + LocationObject *loc = (LocationObject*)userdata; + LocationAccuracy *acc = NULL; + LocationPosition *pos = NULL; + LocationVelocity *vel = NULL; + LocationAddress *addr = NULL; + LocationMethod method; + + g_object_get(loc, "method", &method, NULL); + g_debug("Get property>> method:%d", method); + + if (LOCATION_ERROR_NONE == location_get_position (loc, &pos, &acc)) { + g_debug ("SYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", + pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_position_free(pos); + location_accuracy_free(acc); + } else g_warning ("SYNC>> Current position> failed"); + + if (LOCATION_ERROR_NONE == location_get_velocity (loc, &vel, &acc)) { + g_debug ("SYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", + vel->timestamp, vel->speed, vel->direction, vel->climb); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_velocity_free(vel); + location_accuracy_free(acc); + } else g_warning ("SYNC>> Current velocity> failed"); + + if (LOCATION_ERROR_NONE == location_get_address(loc, &addr, &acc)) { + g_debug ("SYNC>> Current address> %s %s %s %s %s %s %s", + addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_address_free(addr); + location_accuracy_free(acc); + } else g_warning ("SYNC>> Current address> failed"); +} + +static void +cb_service_updated (GObject *self, + guint type, + gpointer data, + gpointer accuracy, + gpointer userdata) +{ + LocationAccuracy *acc = (LocationAccuracy*) accuracy; + switch (type) { + case POSITION_UPDATED: { + LocationPosition *pos = (LocationPosition*) data; + g_debug ("ASYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", + pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + } + break; + case VELOCITY_UPDATED: { + LocationVelocity *vel = (LocationVelocity*) data; + g_debug ("ASYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", + vel->timestamp, vel->speed, vel->direction, vel->climb); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + } + break; + default: + g_warning ("ASYNC>> Undefined update type"); + break; + } +} + + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int interval = 6; //seconds + location_init (); + + loc = location_new (LOCATION_METHOD_GPS); + if(!loc) + return -1; + + g_object_set(loc, "update-interval", interval, NULL); + + g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); + g_signal_connect (loc, "service-updated", G_CALLBACK(cb_service_updated), loc); + + location_start(loc); + loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (loop); // GMainLoop is needed for receiving signals. + + // ... + return 0; +} + * @endcode + */ +int location_start (LocationObject *obj); + +/** + * @brief + * Stop the location service by using given #LocationObject. + * @remarks + * After call this API, you can not recieve signals. + * @pre + * #location_init should be called before.\n + * #location_start should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see location_start + * @par Example + * @code +#include +static GMainLoop *loop = NULL; + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc) + return -1; + + location_start(loc); + loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (loop); + + // .... + + location_stop (loc); + // you can not receive signals anymore. + return 0; +} + * @endcode + */ +int location_stop (LocationObject *obj); + +/** + * @brief + * Check wheither a method is available. + * @remarks + * @pre + * #location_init should be called before.\n + * @post None. + * @param [in] method - a #LocationMethod + * @return int + * @retval True Supported + * False Not supported + * @par Example + #include +static GMainLoop *loop = NULL; + +int main (int argc, char *argv[]) +{ + gboolean is_supported = FALSE; + + // .... + + is_supported = location_is_supported_method(LOCATION_METHOD_HYBRID); + if(is_supported == TRUE) + g_printf("Hybrid Method is supported.\n"); + else + g_printf("Hybrid Method is not supported.\n"); + + return 0; +}* @code + * @endcode + */ +gboolean location_is_supported_method(LocationMethod method); + +/** + * @brief + * Check wheither GPS is turned on or off. + * @remarks + * @pre + * #location_init should be called before.\n + * @post None. + * @param [in] method - a #LocationMethod + * @return int + * @retval True Turned on + * False Turned off + * @par Example + #include +static GMainLoop *loop = NULL; + +int main (int argc, char *argv[]) +{ + gboolean is_enabled = FALSE; + + // .... + + is_enabled = location_is_enabled_gps(loc); + if(is_enable == TRUE) + g_printf("GPS is turned on.\n"); + else + g_printf("GPS is turned off.\n"); + + return 0; +}* @code + * @endcode + */ +gboolean location_is_enabled_gps(LocationObject *obj); + +/** + * @brief + * Get current position information with estimate of the accuracy. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before.\n + * #location_start should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] + * position - a new #LocationPosition + * @param [out] + * accuracy - a new #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see location_get_velocity + * @par Example + * @code +#include +static GMainLoop *loop = NULL; + +static void cb_service_enabled (GObject *self, guint status, gpointer userdata) +{ + g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); + + LocationObject *loc = (LocationObject*)userdata; + LocationAccuracy *acc = NULL; + LocationPosition *pos = NULL; + + // This function works properly after service is enabled. + if (LOCATION_ERROR_NONE == location_get_position (loc, &pos, &acc)) { + g_debug ("SYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", + pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_position_free(pos); + location_accuracy_free(acc); + } else g_warning ("SYNC>> Current position> failed"); +} + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + gulong handler_id = 0; + + location_init (); + loop = g_main_loop_new (NULL, TRUE); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); + location_start (loc); + g_main_loop_run (loop); + + g_signal_handler_disconnect(loc, handler_id); + location_stop (loc); + location_free (loc); + + return 0; +} + * @endcode + */ +int location_get_position (LocationObject *obj, LocationPosition **position, LocationAccuracy **accuracy); + +/** + * @brief + * Get last position information with estimate of the accuracy. + * @remarks This API is not implemented now. \n + * Out parameters are should be freed. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] + * position - a new #LocationPosition + * @param [out] + * accuracy - a new #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see location_get_position + * @par Example + * @code +#include + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int ret = 0; + LocationPosition *last_pos = NULL; + LocationAccuracy *last_acc = NULL; + + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + if (LOCATION_ERROR_NONE == location_get_last_position (loc, &last_pos, &last_acc)) { + g_debug ("SYNC>> Last position> time: %d, lat: %f, long: %f, alt: %f, status: %d", + last_pos->timestamp, last_pos->latitude, last_pos->longitude, last_pos->altitude, last_pos->status); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + last_acc->level, last_acc->horizontal_accuracy, last_acc->vertical_accuracy); + location_position_free(last_pos); + location_accuracy_free(last_acc); + } else g_warning ("SYNC>> Last position> failed"); + + location_free (loc); + + return 0; +} + * @endcode + */ +int location_get_last_position (LocationObject *obj, LocationPosition **position, LocationAccuracy **accuracy); + +/** + * @brief + * Get last satellite information. + * @remarks This API is not implemented now. \n + * Out parameters are should be freed. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] satellite - a new #LocationSatellite + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @see location_get_last_satellite + * @par Example + * @code +#include + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int ret = 0, idx = 0; + LocationSatellite *sat = NULL; + guint prn; + gboolean used; + guint elevation; + guint azimuth; + gint snr; + + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + if (LOCATION_ERROR_NONE == location_get_satellite (loc, &sat)) { + g_debug ("SYNC>> Current Sattelite> satellite in view = %d, satellite in used = %d", sat->num_of_sat_inview, sat->num_of_sat_used); + g_debug ("\tinview satellite information = "); + for (idx=0; idxnum_of_sat_inview; idx++) { + location_satellite_get_satellite_details(sat, idx, &prn, &used, &elevation, &azimuth, &snr); + g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); + } + location_satellite_free (sat); + } else g_warning ("SYNC>> Current satellite> failed"); + + location_free (loc); + + return 0; +} + * @endcode + */ +int location_get_satellite (LocationObject *obj, LocationSatellite **satellite); + +/** + * @brief + * Get last satellite information. + * @remarks This API is not implemented now. \n + * Out parameters are should be freed. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] + * satellite - a new #LocationSatellite + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @par Example + * @code +#include + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int ret = 0, idx = 0; + LocationSatellite *last_sat = NULL; + guint prn; + gboolean used; + guint elevation; + guint azimuth; + gint snr; + + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + if (LOCATION_ERROR_NONE == location_get_last_satellite (loc, &last_sat)) { + g_debug ("SYNC>> Last Sattelite> satellite in view = %d, satellite in used = %d", last_sat->num_of_sat_inview, last_sat->num_of_sat_used); + g_debug ("\tinview satellite information = "); + for (idx=0; idxnum_of_sat_inview; idx++) { + location_satellite_get_satellite_details(last_sat, idx, &prn, &used, &elevation, &azimuth, &snr); + g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); + } + location_satellite_free (last_sat); + } else g_warning ("SYNC>> Last satellite> failed"); + + location_free (loc); + + return 0; +} + * @endcode + */ +int location_get_last_satellite (LocationObject *obj, LocationSatellite **satellite); + +/** + * @brief + * Get last known position information with estimate of the accuracy. + * @remarks This API would be DEPRECATED. \n + * @see location_get_last_position + */ +int location_get_last_known_position (LocationObject *obj, LocationMethod method, LocationLastPosition *last_position) LOCATION_DEPRECATED_API; + +/** + * @brief + * Get current velocity information with estimate of the accuracy. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before.\n + * #location_start should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] + * velocity - a new #LocationVelocity + * @param [out] + * accuracy - a new #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see location_get_position + * @par Example + * @code +#include +static GMainLoop *loop = NULL; + +static void cb_service_enabled (GObject *self, guint status, gpointer userdata) +{ + g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); + + LocationObject *loc = (LocationObject*)userdata; + LocationAccuracy *acc = NULL; + LocationVelocity *vel = NULL; + + if (LOCATION_ERROR_NONE == location_get_velocity (loc, &vel, &acc)) { + g_debug ("SYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", + vel->timestamp, vel->speed, vel->direction, vel->climb); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_velocity_free(vel); + location_accuracy_free(acc); + } else g_warning ("SYNC>> Current velocity> failed"); +} + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + gulong hander_id = 0; + location_init (); + + loop = g_main_loop_new (NULL, TRUE); + + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); + location_start (loc); + g_main_loop_run (loop); + + g_signal_handler_disconnect(loc, handler_id); + location_stop (loc); + location_free (loc); + + return 0; +} + + * @endcode + */ +int location_get_velocity (LocationObject *obj, LocationVelocity **velocity, LocationAccuracy **accuracy); + +/** + * @brief + * Get last velocity information with estimate of the accuracy. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] + * velocity - a new #LocationVelocity + * @param [out] + * accuracy - a new #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see location_get_position + * @par Example + * @code +#include + +int main (int argc, char *argv[]) +{ + int ret = 0; + LocationObject *loc = NULL; + LocationVelocity *vel = NULL; + LocationAccuracy *acc = NULL; + gulong hander_id = 0; + + location_init (); + + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + ret = location_get_last_velocity (loc, &vel, &acc); + if (ret == LOCATION_ERROR_NONE) { + g_debug ("SYNC>> Last velocity> time: %d, speed: %f, direction:%f, climb:%f", + vel->timestamp, vel->speed, vel->direction, vel->climb); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_velocity_free(vel); + location_accuracy_free(acc); + } + + location_free (loc); + return 0; +} + * @endcode + */ +int location_get_last_velocity (LocationObject *obj, LocationVelocity **velocity, LocationAccuracy **accuracy); + +/** + * @brief + * Send command to the server. + * @remarks This functions is not implemneted yet. + * @pre + * #location_init should be called before.\n + * Calling application must have glib or ecore main loop.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] cmd - a #char + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + */ +int location_send_command(const char *cmd); + +/** + * @} @} + */ + +G_END_DECLS + +#endif /* __LOCATION_H__ */ diff --git a/location/map-service/Makefile.am b/location/map-service/Makefile.am new file mode 100644 index 0000000..8105fcb --- /dev/null +++ b/location/map-service/Makefile.am @@ -0,0 +1,27 @@ +noinst_LTLIBRARIES = liblocation-map-service.la + +COMMON_HEADER_DIR = include +MANAGER_DIR = manager +MAP_SERVICE_DIR = map-service +MODULE_DIR = module + +liblocation_map_service_la_SOURCES = \ + location-pref.c \ + location-address.c \ + location-geocode.c \ + location-poi.c \ + location-landmark.c \ + location-route.c \ + map-service.c \ + map-internal.c + +liblocation_map_service_la_CFLAGS = \ + -fPIC\ + -I${srcdir} \ + -I${srcdir}/.. \ + -I${srcdir}/../include \ + -I${srcdir}/../${MANAGER_DIR} \ + -I${srcdir}/../${MODULE_DIR} \ + -I${srcdir}/../${MAP_SERVICE_DIR} \ + $(LOCATION_CFLAGS) + diff --git a/location/location-address.c b/location/map-service/location-address.c similarity index 97% rename from location/location-address.c rename to location/map-service/location-address.c index 61bf429..856757c 100644 --- a/location/location-address.c +++ b/location/map-service/location-address.c @@ -23,8 +23,8 @@ #include "config.h" #endif -#include "location/location-address.h" -#include "location/location-log.h" +#include "location-address.h" +#include "location-log.h" GType location_address_get_type (void) diff --git a/location/location-address.h b/location/map-service/location-address.h similarity index 91% rename from location/location-address.h rename to location/map-service/location-address.h index eb450a5..77e6208 100644 --- a/location/location-address.h +++ b/location/map-service/location-address.h @@ -22,14 +22,21 @@ #ifndef __LOCATION_ADDRESS_H_ #define __LOCATION_ADDRESS_H_ -#include +#include G_BEGIN_DECLS +GType location_address_get_type(void); +#define LOCATION_TYPE_ADDRESS (location_address_get_type()) + /** * @file location-address.h * @brief This file contains the definitions, structures, and functions related to address information. - * @addtogroup LocationTypes + * @addtogroup LocationMapService + * @{ + * @defgroup LocationMapServiceGeocode Location Geocode + * @brief This sub module provides structure, enumeration, and asynchronous function definitions. + * @addtogroup LocationMapServiceGeocode * @{ */ @@ -47,9 +54,6 @@ struct _LocationAddress gchar *postal_code; ///< Postal delivery code. }; -GType location_address_get_type(void); -#define LOCATION_TYPE_ADDRESS (location_address_get_type()) - /** * @brief Create a new #LocationAddress with given information. * @remarks None. @@ -89,7 +93,7 @@ void location_address_free (LocationAddress *address); LocationAddress *location_address_copy (const LocationAddress *address); /** - * @} + * @} @} */ G_END_DECLS diff --git a/location/map-service/location-geocode.c b/location/map-service/location-geocode.c new file mode 100644 index 0000000..aee43c8 --- /dev/null +++ b/location/map-service/location-geocode.c @@ -0,0 +1,27 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "location-log.h" + diff --git a/location/location-geocode.h b/location/map-service/location-geocode.h similarity index 51% rename from location/location-geocode.h rename to location/map-service/location-geocode.h index efb4ac1..1e8b4de 100644 --- a/location/location-geocode.h +++ b/location/map-service/location-geocode.h @@ -22,40 +22,18 @@ #ifndef __LOCATION_GEOCODE_H__ #define __LOCATION_GEOCODE_H__ -#include +#include + +G_BEGIN_DECLS /** * @file location-geocode.h * @brief This file contains the internal definitions and structures related to geocode. - * @addtogroup LocationInternal + * @addtogroup LocationMapService * @{ * @} */ -G_BEGIN_DECLS - -#define LOCATION_TYPE_GEOCODE (location_geocode_get_type ()) -#define LOCATION_GEOCODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOCATION_TYPE_GEOCODE, LocationGeocode)) -#define LOCATION_IS_GEOCODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOCATION_TYPE_GEOCODE)) -#define LOCATION_GEOCODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOCATION_TYPE_GEOCODE, LocationGeocodeClass)) -#define LOCATION_IS_GEOCODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOCATION_TYPE_GEOCODE)) -#define LOCATION_GEOCODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOCATION_TYPE_GEOCODE, LocationGeocodeClass)) - -typedef struct _LocationGeocode LocationGeocode; -typedef struct _LocationGeocodeClass LocationGeocodeClass; - -struct _LocationGeocode -{ - GObject parent_instance; -}; - -struct _LocationGeocodeClass -{ - GObjectClass parent_class; -}; - -GType location_geocode_get_type (void); - G_END_DECLS #endif diff --git a/location/map-service/location-landmark-ext.h b/location/map-service/location-landmark-ext.h new file mode 100644 index 0000000..3658d6d --- /dev/null +++ b/location/map-service/location-landmark-ext.h @@ -0,0 +1,117 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_LANDMARK_EXT_H__ +#define __LOCATION_LANDMARK_EXT_H__ + +#include + +G_BEGIN_DECLS + +/** + * @file location-landmark-ext.h + * @brief This file contains the extensional definitions and structures related to Landmark. + */ + +/** + * @addtogroup LocationMapServicePOI + * @{ + * @defgroup LocationMapServiceLandmarkExt Location Landmark Ext + * @brief This provides Location Landmark Ext APIs + * @addtogroup LocationMapServiceLandmarkExt + * @{ + */ + +/** + * @brief Set the ID of the given #LocationLandmark + */ +gboolean location_landmark_set_id (LocationLandmark *landmark, guint id); + +/** + * @brief Set the name of the given #LocationLandmark + */ +gboolean location_landmark_set_name (LocationLandmark *landmark, const gchar *name); +/** + * @brief Set the position in the given #LocationLandmark + */ +gboolean location_landmark_set_position (LocationLandmark *landmark, const LocationPosition *position); +/** + * @brief Set the address of the given #LocationLandmark + */ +gboolean location_landmark_set_address (LocationLandmark *landmark, const LocationAddress *addr); +/** + * @brief Set the description of the given #LocationLandmark + */ +gboolean location_landmark_set_description (LocationLandmark *landmark, const gchar *desc); +/** + * @brief Set the timestamp of the given #LocationLandmark + */ +gboolean location_landmark_set_timestamp (LocationLandmark *landmark, guint timestamp); +/** + * @brief Set the priority of the given #LocationLandmark + */ +gboolean location_landmark_set_priority (LocationLandmark *landmark, guint priority); +/** + * @brief Set the boundary of the given #LocationLandmark + */ +gboolean location_landmark_set_bounding_box (LocationLandmark *landmark, const LocationBoundary *bbox); +/** + * @brief Set the author of the given #LocationLandmark + */ +gboolean location_landmark_set_author (LocationLandmark *landmark, const gchar *author); +/** + * @brief Set the urls of the given #LocationLandmark + */ +gboolean location_landmark_set_url (LocationLandmark *landmark, GList *url); + +/** + * @brief Set the categories of the given #LocationLandmark + */ +gboolean location_landmark_set_category (const LocationLandmark *landmark, GList *category); + +/** + * @brief Set the phone number of the given #LocationLandmark + */ +gboolean location_landmark_set_phone_number (const LocationLandmark *landmark, const gchar *number); + +/** + * @brief Set the property data of the given #LocationLandmark + */ +gboolean location_landmark_set_property (const LocationLandmark *landmark, gconstpointer key, gconstpointer value); + +/** + * @brief Set url of the given #LocationLandmarkUrl + */ +gboolean location_landmark_url_set_url_path (LocationLandmarkUrl *url, const gchar *path); +/** + * @brief Set the description of the given #LocationLandmarkUrl + */ +gboolean location_landmark_url_set_description (LocationLandmarkUrl *url, const gchar *desc); + +/** + * @} @} + */ + +G_END_DECLS + +#endif + + diff --git a/location/map-service/location-landmark.c b/location/map-service/location-landmark.c new file mode 100644 index 0000000..91c4504 --- /dev/null +++ b/location/map-service/location-landmark.c @@ -0,0 +1,528 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "location-log.h" +#include "location.h" +#include "location-types.h" +#include "map-service.h" + +struct _LocationLandmark { + + guint id; ///< Unique identifier of the landmark + guint priority; ///< Degree of importance of the landmark (Between HIGHEST_LANDMARK_PRIORITY and LOWEST_LANDMARK_PRIORITY) + gchar *name; ///< Name of landmark + LocationPosition *position; ///< Positon of the landmark, may be null if not known + LocationAddress *addr; ///< Textual address information of the landmark, may be null if not + LocationBoundary *bbox; ///< Coverage area of the landmark, may be null if not available + guint timestamp; ///< Time when the landmark data was last updated (updated by system and used to facilitate tracking) + + gchar *author; ///< Provider of the landmark data, may be null + gchar *store; ///< Name of landmark store that the landmark belongs to + gchar *phone_number; ///< Nhone number of the landmark, may be null + GList *category; ///< Categories to which the landmark belongs to + GList *url; ///< Url to additional content (Optional) + gchar *desc; ///< Description of the landmark, may be null if not available + + GHashTable *properties; ///< Extra info of the landmark + +}; + +struct _LocationLandmarkUrl { + gchar *path; ///< Url of landmark url info + gchar *desc; ///< Description of landmark url info +}; + +EXPORT_API guint +location_landmark_get_id (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, 0); + + return landmark->id; +} + + +EXPORT_API gchar * +location_landmark_get_name (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->name; +} + +EXPORT_API LocationPosition * +location_landmark_get_position (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->position; +} + +EXPORT_API LocationAddress * +location_landmark_get_address (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->addr; +} + +EXPORT_API gchar * +location_landmark_get_description (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->desc; +} + +EXPORT_API guint +location_landmark_get_timestamp (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, 0); + + return landmark->timestamp; +} + +EXPORT_API guint +location_landmark_get_priority (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, 0); + + return landmark->priority; +} + +EXPORT_API LocationBoundary * +location_landmark_get_bounding_box (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->bbox; +} + +EXPORT_API gchar * +location_landmark_get_author (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->author; +} + +EXPORT_API GList * +location_landmark_get_url (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->url; +} + +EXPORT_API GList * +location_landmark_get_category (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return landmark->category; +} + +EXPORT_API gchar * +location_landmark_get_phone_number (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return (const gchar *) landmark->phone_number; +} + +EXPORT_API GList * +location_landmark_get_property_key (const LocationLandmark *landmark) +{ + g_return_val_if_fail(landmark, NULL); + + return g_hash_table_get_keys (landmark->properties); +} + +EXPORT_API gconstpointer +location_landmark_get_property (const LocationLandmark *landmark, gconstpointer key) +{ + g_return_val_if_fail(landmark, NULL); + g_return_val_if_fail(key, NULL); + if (!landmark->properties) return NULL; + + return g_hash_table_lookup (landmark->properties, key); +} + +EXPORT_API gboolean +location_landmark_set_id (LocationLandmark *landmark, guint id) +{ + g_return_val_if_fail(landmark, FALSE); + + landmark->id = id; + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_name (LocationLandmark *landmark, const gchar *name) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->name) { + g_free(landmark->name); + landmark->name = NULL; + } + if (name) landmark->name = g_strdup (name); + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_position (LocationLandmark *landmark, const LocationPosition *position) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->position) { + location_position_free(landmark->position); + landmark->position = NULL; + } + + if (position) landmark->position = location_position_copy (position); + + return TRUE; + +} + +EXPORT_API gboolean +location_landmark_set_address (LocationLandmark *landmark, const LocationAddress *addr) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->addr) { + location_address_free (landmark->addr); + landmark->addr = NULL; + } + + if (addr) landmark->addr = location_address_copy (addr); + + return TRUE; + +} + +EXPORT_API gboolean +location_landmark_set_description (LocationLandmark *landmark, const gchar *desc) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->desc) { + g_free(landmark->desc); + landmark->desc = NULL; + } + + if (desc) landmark->desc = g_strdup (desc); + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_timestamp (LocationLandmark *landmark, guint timestamp) +{ + g_return_val_if_fail(landmark, FALSE); + + landmark->timestamp = timestamp; + + return TRUE; + +} + +EXPORT_API gboolean +location_landmark_set_priority (LocationLandmark *landmark, guint priority) +{ + g_return_val_if_fail(landmark, FALSE); + + landmark->priority = priority; + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_bounding_box (LocationLandmark *landmark, const LocationBoundary *bbox) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->bbox) { + location_boundary_free(landmark->bbox); + landmark->bbox = NULL; + } + + if (bbox) landmark->bbox = location_boundary_copy (bbox); + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_author (LocationLandmark *landmark, const gchar *author) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->author) { + g_free(landmark->author); + landmark->author = NULL; + } + if (author) landmark->author = g_strdup (author); + + return TRUE; +} + +static void landmark_url_foreach_free (gpointer data) +{ + g_return_if_fail(data); + + LocationLandmarkUrl *url = (LocationLandmarkUrl *)data; + + location_landmark_url_free (url); +} + +static void landmark_foreach_url_copy (gpointer data, gpointer user_data) +{ + g_return_if_fail(data); + g_return_if_fail(user_data); + + LocationLandmarkUrl *url = (LocationLandmarkUrl *)data; + LocationLandmark *landmark = (LocationLandmark *) user_data; + + if(!url || !landmark) return; + + landmark->url = g_list_append(landmark->url, url); +} + +EXPORT_API gboolean +location_landmark_set_url (LocationLandmark *landmark, GList *url) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->url) { + g_list_free_full(landmark->url, landmark_url_foreach_free); + landmark->url = NULL; + } + + if (url) g_list_foreach (url, landmark_foreach_url_copy, landmark); + + return TRUE; +} + +static void landmark_foreach_copy_category (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + g_return_if_fail (user_data); + + gchar *category_name = (gchar *)data; + LocationLandmark *landmark = (LocationLandmark *) user_data; + + landmark->category = g_list_append (landmark->category, g_strdup(category_name)); +} + +static void landmark_free_category (gpointer data) +{ + g_return_if_fail (data); + + gchar * category_name = (gchar *)data; + + g_free (category_name); +} + +EXPORT_API gboolean +location_landmark_set_category (LocationLandmark *landmark, GList *category) +{ + g_return_val_if_fail(landmark, FALSE); + + if (landmark->category) { + g_list_free_full(landmark->category, landmark_free_category); + landmark->category = NULL; + } + + if (category) g_list_foreach ((GList*) category, landmark_foreach_copy_category, landmark); + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_phone_number (LocationLandmark *landmark, const gchar *number) +{ + g_return_val_if_fail(landmark, FALSE); + g_return_val_if_fail(number, FALSE); + + if (landmark->phone_number) { + g_free(landmark->phone_number); + landmark->phone_number = NULL; + } + if (number) landmark->phone_number = g_strdup (number); + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_set_property(LocationLandmark *landmark, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail(landmark, FALSE); + g_return_val_if_fail(key, FALSE); + if (!landmark->properties) return FALSE; + + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert(landmark->properties, re_key, re_val); + } + else g_hash_table_remove (landmark->properties, key); + + return TRUE; +} + +EXPORT_API gchar * +location_landmark_url_get_url_path (const LocationLandmarkUrl *url) +{ + g_return_val_if_fail (url, NULL); + + return url->path; +} + +EXPORT_API gchar * +location_landmark_url_get_description (const LocationLandmarkUrl *url) +{ + g_return_val_if_fail (url, NULL); + + return url->desc; +} + +EXPORT_API gboolean +location_landmark_url_set_url_path (LocationLandmarkUrl *url, const gchar *path) +{ + g_return_val_if_fail (url, FALSE); + + if (url->path) { + g_free(url->path); + url->path = NULL; + } + + if (path) url->path = g_strdup (path); + + return TRUE; +} + +EXPORT_API gboolean +location_landmark_url_set_description (LocationLandmarkUrl *url, const gchar *desc) +{ + g_return_val_if_fail (url, FALSE); + + if (url->desc) { + g_free(url->desc); + url->desc = NULL; + } + + if (desc) url->desc = g_strdup (desc); + + return TRUE; +} + +EXPORT_API LocationLandmarkUrl * +location_landmark_url_new (void) +{ + LocationLandmarkUrl *url = g_slice_new0 (LocationLandmarkUrl); + if(!url) return NULL; + + + return url; +} + +EXPORT_API void +location_landmark_url_free (LocationLandmarkUrl * url) +{ + g_return_if_fail (url); + + + location_landmark_url_set_url_path(url, NULL); + location_landmark_url_set_description(url, NULL); + + g_slice_free(LocationLandmarkUrl, url); +} + +EXPORT_API LocationLandmarkUrl * +location_landmark_url_copy (const LocationLandmarkUrl *url) +{ + g_return_val_if_fail(url, NULL); + + LocationLandmarkUrl *new_url = location_landmark_url_new(); + + location_landmark_url_set_url_path(new_url, location_landmark_url_get_url_path(url)); + location_landmark_url_set_description(new_url, location_landmark_url_get_description(url)); + + return new_url; +} + +EXPORT_API LocationLandmark * +location_landmark_new (void) +{ + LocationLandmark *landmark = g_slice_new0 (LocationLandmark); + if (!landmark) return NULL; + + landmark->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + return landmark; +} + +EXPORT_API LocationLandmark * +location_landmark_copy (const LocationLandmark *landmark) +{ + g_return_val_if_fail (landmark, NULL); + + LocationLandmark *new_landmark = location_landmark_new(); + if (!new_landmark) return NULL; + + location_landmark_set_id(new_landmark, location_landmark_get_id(landmark)); + location_landmark_set_name (new_landmark, location_landmark_get_name (landmark)); + location_landmark_set_position (new_landmark, location_landmark_get_position(landmark)); + location_landmark_set_address (new_landmark, location_landmark_get_address (landmark)); + location_landmark_set_description (new_landmark, location_landmark_get_description(landmark)); + location_landmark_set_timestamp (new_landmark, location_landmark_get_timestamp(landmark)); + location_landmark_set_priority (new_landmark, location_landmark_get_priority(landmark)); + location_landmark_set_bounding_box (new_landmark, location_landmark_get_bounding_box(landmark)); + location_landmark_set_author (new_landmark, location_landmark_get_author(landmark)); + location_landmark_set_url(new_landmark, location_landmark_get_url(landmark)); + + return new_landmark; +} + +EXPORT_API void +location_landmark_free (LocationLandmark *landmark) +{ + g_return_if_fail (landmark); + + location_landmark_set_id(landmark, 0); + location_landmark_set_name (landmark, NULL); + location_landmark_set_position (landmark, NULL); + location_landmark_set_address (landmark, NULL); + location_landmark_set_description (landmark, NULL); + location_landmark_set_timestamp (landmark, 0); + location_landmark_set_priority (landmark, 0); + location_landmark_set_bounding_box (landmark, NULL); + location_landmark_set_author (landmark, NULL); + location_landmark_set_url(landmark, NULL); + + g_slice_free (LocationLandmark, landmark); +} diff --git a/location/map-service/location-landmark.h b/location/map-service/location-landmark.h new file mode 100644 index 0000000..401c801 --- /dev/null +++ b/location/map-service/location-landmark.h @@ -0,0 +1,147 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_LANDMARK_H__ +#define __LOCATION_LANDMARK_H__ + +#include + +G_BEGIN_DECLS + +/** + * @file location-landmark.h + * @brief This file contains the internal definitions and structures related to Landmark. + */ + +/** + * @addtogroup LocationMapServicePOI + * @{ + * @defgroup LocationMapServiceLandmark Location Landmark + * @brief This provides structure, enumeration and APIs for Landmark + * @addtogroup LocationMapServiceLandmark + * @{ + */ + +/** + * @brief Create a new Landmark + */ +LocationLandmark *location_landmark_new (void); + +/** + * @brief Copy the given Landmark + */ +LocationLandmark *location_landmark_copy (const LocationLandmark *landmark); + +/** + * @brief Free the given Landmark + */ +void location_landmark_free (LocationLandmark *landmark); + +/** + * @brief Get the ID of the given landmark + */ +guint location_landmark_get_id (const LocationLandmark *landmark); + +/** + * @brief Get the name of the given landmark + */ +gchar *location_landmark_get_name (const LocationLandmark *landmark); +/** + * @brief Get the position in the given landmark + */ +LocationPosition *location_landmark_get_position (const LocationLandmark *landmark); +/** + * @brief Get the address of the given landmark + */ +LocationAddress *location_landmark_get_address (const LocationLandmark *landmark); +/** + * @brief Get the description of the given landmark + */ +gchar *location_landmark_get_description (const LocationLandmark *landmark); +/** + * @brief Get the timestamp of the given landmark + */ +guint location_landmark_get_timestamp (const LocationLandmark *landmark); +/** + * @brief Get the priority of the given landmark + */ +guint location_landmark_get_priority (const LocationLandmark *landmark); +/** + * @brief Get the bounding box of the given landmark + */ +LocationBoundary *location_landmark_get_bounding_box (const LocationLandmark *landmark); +/** + * @brief Get the author of the given landmark + */ +gchar *location_landmark_get_author (const LocationLandmark *landmark); +/** + * @brief Get the list of urls of the given landmark + */ +GList *location_landmark_get_url (const LocationLandmark *landmark); +/** + * @brief Get the categories of the given landmark + */ +GList *location_landmark_get_category (const LocationLandmark *landmark); +/** + * @brief Get the phone number of the given landmark + */ +gchar *location_landmark_get_phone_number (const LocationLandmark *landmark); +/** + * @brief Get the property keys of the given landmark + */ +GList *location_landmark_get_property_key (const LocationLandmark *landmark); + +/** + * @brief Get the property data of the given landmark + */ +gconstpointer location_landmark_get_property (const LocationLandmark *landmark, gconstpointer key); + +/** + * @brief Create a new #LocationLandmarkUrl + */ +LocationLandmarkUrl * location_landmark_url_new (void); + +/** + * @brief Free a #LocationLandmarkUrl + */ +void location_landmark_url_free (LocationLandmarkUrl *url); + +/** + * @brief Copy a #LocationLandmarkUrl + */ +LocationLandmarkUrl *location_landmark_url_copy (const LocationLandmarkUrl *url); + +/** + * @brief Get the url path of the given #LocationLandmarkUrl + */ +gchar *location_landmark_url_get_url_path (const LocationLandmarkUrl *url); +/** + * @brief Get the url's description of the given #LocationLandmarkUrl + */ +gchar *location_landmark_url_get_description (const LocationLandmarkUrl *url); + +/** + * @} @} + */ + +G_END_DECLS + +#endif diff --git a/location/map-service/location-map-service-ext.h b/location/map-service/location-map-service-ext.h new file mode 100644 index 0000000..e7df5ae --- /dev/null +++ b/location/map-service/location-map-service-ext.h @@ -0,0 +1,40 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __LOCATION_MAP_SERVICE_EXT_H__ +#define __LOCATION_MAP_SERVICE_EXT_H__ + + +#include +#include +#include + +G_BEGIN_DECLS + +/** + * @file location-map-service-ext.h + * @brief This file contains the extensional headers. + */ + +G_END_DECLS + +#endif /* __LOCATION_MAP_SERVICE_EXT_H__ */ diff --git a/location/map-service/location-map-service.c b/location/map-service/location-map-service.c new file mode 100644 index 0000000..9bb0ebb --- /dev/null +++ b/location/map-service/location-map-service.c @@ -0,0 +1,327 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "location.h" +#include "location-log.h" +#include "location-setting.h" +#include "location-ielement.h" +#include "location-pref.h" +#include "map-service.h" + +LocationObject *g_map_service = NULL; + +//static LocationObject *poi = NULL; + +static gboolean +is_connected_network() +{ + gboolean is_connected = TRUE; + int net_state = 0; + + net_state = location_setting_get_int(VCONFKEY_NETWORK_STATUS); + + LOCATION_LOGW("net_state[%d]", net_state); + if(net_state == VCONFKEY_NETWORK_OFF) { + is_connected = FALSE; + } + + return is_connected; + +} + +EXPORT_API int +location_get_position_from_address (LocationObject *obj, + const LocationAddress *address, + GList **position_list, + GList **accuracy_list) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + return location_ielement_get_geocode (LOCATION_IELEMENT(g_map_service), address, position_list, accuracy_list); +} + +EXPORT_API int +location_get_position_from_freeformed_address (LocationObject *obj, + const gchar *address, + GList **position_list, + GList **accuracy_list) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + return location_ielement_get_geocode_freeform (LOCATION_IELEMENT(g_map_service), address, position_list, accuracy_list); +} + +EXPORT_API int +location_get_address (LocationObject *obj, + LocationAddress **address, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPosition *position = NULL; + int ret = location_ielement_get_position(LOCATION_IELEMENT (obj), &position, accuracy); + if (LOCATION_ERROR_NONE != ret) return ret; + ret = location_ielement_get_reversegeocode (LOCATION_IELEMENT(g_map_service), position, address, accuracy); + location_position_free (position); + return ret; +} + +EXPORT_API int +location_get_address_from_position (LocationObject *obj, + const LocationPosition *position, + LocationAddress **address, + LocationAccuracy **accuracy) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + return location_ielement_get_reversegeocode (LOCATION_IELEMENT(g_map_service), position, address, accuracy); +} + +EXPORT_API int +location_get_position_from_address_async (LocationObject *obj, + const LocationAddress *address, + LocationPositionCB callback, + gpointer userdata) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + return location_ielement_get_geocode_async (LOCATION_IELEMENT(g_map_service), address, callback, userdata); +} + + +EXPORT_API int +location_get_position_from_freeformed_address_async (LocationObject *obj, + const gchar *address, + LocationPositionCB callback, + gpointer userdata) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + return location_ielement_get_geocode_freeform_async (LOCATION_IELEMENT(g_map_service), address, callback, userdata); +} + +EXPORT_API int +location_get_address_async (LocationObject *obj, + LocationAddressCB callback, + gpointer userdata) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPosition *position = NULL; + LocationAccuracy *acc = NULL; + int ret = location_ielement_get_position(LOCATION_IELEMENT(obj), &position, &acc); + if (LOCATION_ERROR_NONE != ret) return ret; + ret = location_ielement_get_reversegeocode_async (LOCATION_IELEMENT(g_map_service), position, callback, userdata); + location_position_free (position); + return ret; +} + +EXPORT_API int +location_get_address_from_position_async (LocationObject *obj, + const LocationPosition *position, + LocationAddressCB callback, + gpointer userdata) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + return location_ielement_get_reversegeocode_async (LOCATION_IELEMENT(g_map_service), position, callback, userdata); +} + +EXPORT_API int +location_search_poi (LocationObject *obj, + const LocationPOIFilter * filter, + const LocationPosition *position, + const LocationPOIPreference * pref, + LocationPOICB cb, gpointer user_data, guint * req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (position, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPreference *svc_pref = location_get_map_service_pref (g_map_service); + + return location_ielement_search_poi (LOCATION_IELEMENT(g_map_service), filter, position, svc_pref, pref, cb, user_data, req_id); +} + +EXPORT_API int +location_search_poi_by_area (LocationObject *obj, + const LocationPOIFilter * filter, + const LocationBoundary * boundary, + const LocationPOIPreference * pref, + LocationPOICB cb, gpointer user_data, guint * req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (boundary, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPreference *svc_pref = location_get_map_service_pref (g_map_service); + + return location_ielement_search_poi_by_area (LOCATION_IELEMENT(g_map_service), filter, boundary, svc_pref, pref, cb, user_data, req_id); +} + +EXPORT_API int +location_search_poi_by_address (LocationObject *obj, const LocationPOIFilter * filter, + const LocationAddress * address, const LocationPOIPreference * pref, + LocationPOICB cb, gpointer user_data, guint * req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (address, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPreference *svc_pref = location_get_map_service_pref (g_map_service); + + return location_ielement_search_poi_by_address (LOCATION_IELEMENT(g_map_service), filter, address, svc_pref, pref, cb, user_data, req_id); +} + +EXPORT_API int +location_search_poi_by_freeformed_address (LocationObject *obj, + const LocationPOIFilter * filter, + const gchar * address, + const LocationPOIPreference * pref, + LocationPOICB cb, gpointer user_data, guint * req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (filter, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (address, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPreference *svc_pref = location_get_map_service_pref (g_map_service); + + return location_ielement_search_poi_by_freeform (LOCATION_IELEMENT(g_map_service), filter, address, svc_pref, pref, cb, user_data, req_id); +} + +EXPORT_API int +location_cancel_poi_request (LocationObject *obj, guint req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + return location_ielement_cancel_poi_request (LOCATION_IELEMENT(g_map_service), req_id); +} + +EXPORT_API int +location_request_route (LocationObject *obj, LocationPosition *origin, LocationPosition *destination, + GList *waypoint, const LocationRoutePreference * pref, + LocationRouteCB cb, gpointer user_data, guint * req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (origin, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (destination, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (pref, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (cb, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (req_id, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + LocationPreference *svc_pref = location_get_map_service_pref (g_map_service); + + return location_ielement_request_route (LOCATION_IELEMENT(g_map_service), origin, destination, + waypoint, svc_pref, pref, cb, user_data, req_id); +} + +EXPORT_API int +location_cancel_route_request (LocationObject *obj, guint req_id) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + return location_ielement_cancel_route_request (LOCATION_IELEMENT(g_map_service), req_id); +} + +EXPORT_API gboolean +location_is_supported_map_provider_capability (LocationObject *obj, LocationMapServiceType type) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + return location_ielement_is_supported_map_provider_capability (LOCATION_IELEMENT(g_map_service), type); +} + +EXPORT_API int +location_get_map_provider_capability_key (LocationObject *obj, LocationMapServiceType type, GList **key) +{ + g_return_val_if_fail (obj, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (key, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (g_map_service, LOCATION_ERROR_PARAMETER); + g_return_val_if_fail (is_connected_network(), LOCATION_ERROR_NETWORK_NOT_CONNECTED); + + return location_ielement_get_map_provider_capability_key (LOCATION_IELEMENT(g_map_service), type, key); +} + +EXPORT_API LocationPreference * +location_get_map_service_pref (LocationObject *obj) +{ + g_return_val_if_fail (obj, NULL); + g_return_val_if_fail (g_map_service, NULL); + + return map_service_get_pref (g_map_service); +} + +EXPORT_API gboolean +location_set_map_service_pref (LocationObject *obj, LocationPreference *pref) +{ + g_return_val_if_fail (obj, FALSE); + g_return_val_if_fail (pref, FALSE); + g_return_val_if_fail (g_map_service, FALSE); + + return map_service_set_pref (g_map_service, pref); +} diff --git a/location/map-service/location-map-service.h b/location/map-service/location-map-service.h new file mode 100644 index 0000000..73421a4 --- /dev/null +++ b/location/map-service/location-map-service.h @@ -0,0 +1,1389 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __LOCATION_MAP_SERVICE_H__ +#define __LOCATION_MAP_SERVICE_H__ + + +#include +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +/** + * @file location-map-service.h + * @brief This file contains the Location API and related structure and enumeration. + */ +/** + * @addtogroup LocationFW + * @{ + * @defgroup LocationMapService Location Map Service API + * @brief This sub module provides the Location Map Service API. + * @addtogroup LocationMapService + * @{ + */ + +/** + * @brief + * Get current position information with estimate of the accuracy by using given address information. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * address - a #LocationAddress + * @param [out] + * position_list - a list of #LocationPosition + * @param [out] + * accuracy_list - a list of #LocationAccuracy + * @return int + * @retval 0 Success. + * + * Please refer #LocationError for more information. + * @see + * location_get_position_from_address_async\n + * @par Example + * @code +#include +#include + +static void PrintPos (gpointer data, gpointer user_data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) { + g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); + location_position_free (pos); + } +} + +static void PrintAcc (gpointer data, gpointer user_data) +{ + LocationAccuracy *acc = (LocationAccuracy *)data; + + if (acc) { + g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_accuracy_free (acc); + } + +} + +static void PrintPos (gpointer data, gpointer user_data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) { + g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); + location_position_free (pos); + } +} + +static void PrintAcc (gpointer data, gpointer user_data) +{ + LocationAccuracy *acc = (LocationAccuracy *)data; + + if (acc) { + g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_accuracy_free (acc); + } +} + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int ret = LOCATION_ERROR_NONE; + + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + GList *pos_list = NULL; + GList *acc_list = NULL; + LocationAddress *addr = NULL; + + addr = location_address_new ("1", "Post Street", NULL, "san jose", "ca", NULL, "95113"); + if (LOCATION_ERROR_NONE == location_get_position_from_address(loc, addr, &pos_list, &acc_list)) { + + } else g_warning ("SYNC>> position from address> failed"); + location_address_free (addr); + g_list_foreach (pos_list, PrintPos, NULL); + g_list_foreach (acc_list, PrintAcc, NULL); + g_list_free (pos_list); + g_list_free (acc_list); + location_free (loc); + return 0; +} + * @endcode + */ +int location_get_position_from_address (LocationObject *obj, const LocationAddress *address, GList **position_list, GList **accuracy_list); + +/** + * @brief + * Get current position information asynchronously with estimate of the accuracy by using given address information. + * @remarks None. + * @pre + * #location_init should be called before.\n + * Calling application must have glib or ecore main loop.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * address - a #LocationAddress + * @param [in] + * callback - A pointer of function which will be called after position is gained or when an error occurs. + * @param [in] + * userdata - data to pass to function + * @return int + * @retval 0 Success. + * + * Please refer #LocationError for more information. + * @see + * location_get_position_from_address\n + * @par Example + * @code +#include +#include + +static void PrintPos (gpointer data, gpointer user_data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) { + g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); + } +} + +static void PrintAcc (gpointer data, gpointer user_data) +{ + LocationAccuracy *acc = (LocationAccuracy *)data; + + if (acc) { + g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + } +} +static void +cb_position_from_address (LocationError error, GList *position_list, GList *accuracy_list, gpointer userdata) +{ + if (position_list && accuracy_list) { + g_list_foreach (position_list, PrintPos); + g_list_foreach (accuracy_list, PrintAcc); + } +} + +void get_position_from_address(LocationObject* loc) +{ + LocationAddress *addr = location_address_new ("1", "Post Street", NULL, "san jose", "ca", NULL, "95113"); + //Calling application must have an active data connection before using this function. + if (LOCATION_ERROR_NONE == location_get_position_from_address_async(loc, addr, cb_position_from_address, loc)) + g_debug("location_get_position_from_address_async() success"); + else g_warning ("location_get_position_from_address_async() failed"); + location_address_free (addr); +} + * @endcode + */ +int location_get_position_from_address_async (LocationObject *obj, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); + +/** + * @brief + * Get current position information with estimate of the accuracy by using given free-formed address string. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * address - Free-formed address string to be used + * @param [out] + * position_list - a list of #LocationPosition + * @param [out] + * accuracy_list - a list of #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see + * location_get_position_from_freeformed_address_async\n + * @par Example + * @code +#include +#include + +static void PrintPos (gpointer data, gpointer user_data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) { + g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); + location_position_free (pos); + } +} + +static void PrintAcc (gpointer data, gpointer user_data) +{ + LocationAccuracy *acc = (LocationAccuracy *)data; + + if (acc) { + g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_accuracy_free (acc); + } +} + +static void PrintPos (gpointer data, gpointer user_data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) { + g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); + location_position_free (pos); + } +} + +static void PrintAcc (gpointer data, gpointer user_data) +{ + LocationAccuracy *acc = (LocationAccuracy *)data; + + if (acc) { + g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_accuracy_free (acc); + } +} + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int ret = LOCATION_ERROR_NONE; + + location_init (); + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + GList *pos_list = NULL; + GList *acc_list = NULL; + char* addr_str = g_strdup("4 N 2nd Street 95113"); + + //Calling application must have an active data connection before using this function. + if (LOCATION_ERROR_NONE == location_get_position_from_freeformed_address(loc, addr_str, &pos_list, &acc_list)) { + g_list_foreach (pos_list, PrintPos, NULL); + g_list_foreach (acc_list, PrintAcc, NULL); + g_list_free (pos_list); + g_list_free (acc_list); + } else g_warning ("SYNC>> position from freeformed address> failed"); + g_free(addr_str); + + location_free (loc); + return 0; +} + * @endcode + */ +int location_get_position_from_freeformed_address (LocationObject *obj, const gchar *address, GList **position_list, GList **accuracy_list); + +/** + * @brief + * Get current position information asynchronously with estimate of the accuracy by using given free-formed address string. + * @remarks None. + * @pre + * #location_init should be called before.\n + * Calling application must have glib or ecore main loop.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * address - Free-formed address string to be used + * @param [in] + * callback - A pointer of function which will be called after position is gained or when an error occurs. + * @param [in] + * userdata - data to pass to function + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see + * location_get_position_from_freeformed_address\n + * @par Example + * @code +#include +#include + +static void PrintPos (gpointer data, gpointer user_data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) { + g_debug("time: [%d], latitude: [%f], longitude: [%f], altitude: [%f]\n", pos->timestamp, pos->latitude, pos->longitude, pos->altitude); + } +} + +static void PrintAcc (gpointer data, gpointer user_data) +{ + LocationAccuracy *acc = (LocationAccuracy *)data; + + if (acc) { + g_debug("level: [%d], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + } +} + +static void +cb_position_from_freeformed_address (LocationError error, GList *position_list, GList *accuracy_list, gpointer userdata) +{ + if (position_list && accuracy_list) { + g_list_foreach (position_list, PrintPos); + g_list_foreach (accuracy_list, PrintAcc); + } +} + +void get_position_from_address(LocationObject* loc) +{ + gchar *addr_str = g_strdup("4 N 2nd Street 95113"); + //Calling application must have an active data connection before using this function. + if (LOCATION_ERROR_NONE == location_get_position_from_freeformed_address_async(loc, addr_str, cb_position_from_freeformed_address, loc)) + g_debug("location_get_position_from_freeformed_address_async() success"); + else g_warning ("location_get_position_from_freeformed_address_async() failed"); + g_free(addr_str); + +} + * @endcode + */ +int location_get_position_from_freeformed_address_async (LocationObject *obj, const gchar *address, LocationPositionCB callback, gpointer userdata); + +/** + * @brief + * Get current address information with estimate of the accuracy by using current position. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before.\n + * #location_start should be called before.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [out] + * address - a new #LocationAddress + * @param [out] + * accuracy - a new #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see + * location_get_address_async\n + * @par Example + * @code +#include +#include +static GMainLoop *loop = NULL; + +static void cb_service_enabled (GObject *self, guint status, gpointer userdata) +{ + g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); + + LocationAddress *addr = NULL; + LocationAccuracy *acc = NULL; + LocationObject *loc = (LocationObject*)userdata; + + // This function works properly after service is enabled. + //Calling application must have an active data connection before using this function. + if (LOCATION_ERROR_NONE == location_get_address(loc, &addr, &acc)) { + g_debug ("SYNC>> Current address> %s %s %s %s %s %s %s", + addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_address_free(addr); + location_accuracy_free(acc); + } else g_warning ("SYNC>> Current address> failed"); +} + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + gulong handler_id = 0; + int ret = LOCATION_ERROR_NONE; + + location_init (); + + loop = g_main_loop_new (NULL, TRUE); + + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); + location_start (loc); + g_main_loop_run (loop); + + g_signal_handler_disconnect(loc, handler_id); + location_stop (loc); + location_free (loc); + + return 0; +} + * @endcode + */ +int location_get_address (LocationObject *obj, LocationAddress **address, LocationAccuracy **accuracy); + +/** + * @brief + * Get current address information asynchronously with estimate of the accuracy by using current position. + * @remarks None. + * @pre + * #location_init should be called before.\n + * #location_start should be called before.\n + * Calling application must have glib or ecore main loop.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * callback - A pointer of function which will be called after address is gained or when an error occurs. + * @param [in] + * userdata - data to pass to function + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see + * location_get_address\n + * @par Example + * @code +#include +#include +static GMainLoop *loop = NULL; + +static void +cb_address (LocationError error, LocationAddress *addr, LocationAccuracy *acc, gpointer userdata) +{ + g_debug ("ASYNC>> location_get_address_async> %s %s %s %s %s %s %s", + addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); +} + +static void cb_service_enabled (GObject *self, guint status, gpointer userdata) +{ + g_debug("cb_service_enabled: status(%d) userdata(0x%x)", status, (unsigned int)userdata); + + LocationObject *loc = (LocationObject*)userdata; + // This function works properly after service is enabled. + //Calling application must have an active data connection before using this function. + if (LOCATION_ERROR_NONE == location_get_address_async(loc, cb_address, loc)) + g_debug("location_get_address_async() success"); + else g_warning ("location_get_address_async() failed"); +} + + +int main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + gulong handler_id = 0; + int ret = LOCATION_ERROR_NONE; + + location_init (); + + loop = g_main_loop_new (NULL, TRUE); + + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + handler_id = g_signal_connect (loc, "service-enabled", G_CALLBACK(cb_service_enabled), loc); + location_start (loc); + g_main_loop_run (loop); + + g_signal_handler_disconnect(loc, handler_id); + location_stop (loc); + location_free (loc); + + return 0; +} + * @endcode + */ +int location_get_address_async (LocationObject *obj, LocationAddressCB callback, gpointer userdata); + +/** + * @brief + * Get current address information with estimate of the accuracy by using given position information. + * @remarks Out parameters are should be freed. + * @pre + * #location_init should be called before.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * position - a #LocationPosition + * @param [out] + * address - a new #LocationAddress + * @param [out] + * accuracy - a new #LocationAccuracy + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see + * location_get_address_from_position_async\n + * @par Example + * @code +#include +#include +static GMainLoop *loop = NULL; + +int +main (int argc, char *argv[]) +{ + LocationObject *loc = NULL; + int ret = LOCATION_ERROR_NONE; + + location_init (); + + loop = g_main_loop_new (NULL, TRUE); + + loc = location_new (LOCATION_METHOD_GPS); + if(!loc){ + g_debug("location_new failed"); + return -1; + } + + LocationPosition *pos = NULL; + LocationAccuracy *acc = NULL; + LocationAddress *addr = NULL; + + //Calling application must have an active data connection before using this function. + pos = location_position_new (0, 37.257809, 127.056383, 0, LOCATION_STATUS_2D_FIX); + if (LOCATION_ERROR_NONE == location_get_address_from_position(loc, pos, &addr, &acc)) { + g_debug ("SYNC>> address from position> %s %s %s %s %s %s %s", + addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + location_address_free(addr); + location_accuracy_free(acc); + } else g_warning ("SYNC>> address from position> failed"); + location_position_free (pos); +} + * @endcode + */ +int location_get_address_from_position (LocationObject *obj, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); + +/** + * @brief + * Get current address information asynchronously with estimate of the accuracy by using given position information. + * @remarks None. + * @pre + * #location_init should be called before.\n + * Calling application must have glib or ecore main loop.\n + * Calling application must have an active data connection. + * @post None. + * @param [in] + * obj - a #LocationObject created by #location_new + * @param [in] + * position - a #LocationPosition + * @param [in] + * callback - A pointer of function which will be called after address is gained or when an error occurs. + * @param [in] + * userdata - data to pass to function + * @return int + * @retval 0 Success + * + * Please refer #LocationError for more information. + * @see + * location_get_address_from_position\n + * @par Example + * @code +#include +#include +static GMainLoop *loop = NULL; + +static void +cb_address_from_position (LocationError error, LocationAddress *addr, LocationAccuracy *acc, gpointer userdata) +{ + g_debug ("ASYNC>> location_get_address_from_position_async> %s %s %s %s %s %s %s", + addr->building_number, addr->street, addr->district, addr->city, addr->state, addr->postal_code, addr->country_code); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); +} + +void get_address_from_position(LocationObject* loc) +{ + LocationPosition *pos = location_position_new (0, 37.257809, 127.056383, 0, LOCATION_STATUS_2D_FIX); + //Calling application must have an active data connection before using this function. + if (LOCATION_ERROR_NONE == location_get_address_from_position_async(loc, pos, cb_address_from_position, loc)) + g_debug("location_get_address_from_position_async() success"); + else g_warning ("location_get_address_from_position_async() failed"); + location_position_free (pos); +} + * @endcode + */ +int location_get_address_from_position_async (LocationObject *obj, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); + +/** + * @brief Request a search service from service provider. + * @remarks refer #LocationLandmark + * @pre #location_init should be called before.\n + * #location_poi_pref_new should be set before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] filter - a #LocaitonPOIFilter created by #location_poi_filter_new + * @param [in] position - a #LocationPosition + * @param [in] pref - a #LocationPOIPreference created by #location_poi_pref_new + * @param [in] cb - #LocationPOICB + * @param [in] user_data - data to pass to function + * @param [out] req_id - a guint + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +static GMainLoop *loop = NULL; + +void PrintLandmarkCb (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + + LocationLandmark *landmark = (LocationLandmark *)data; + + g_debug ("id[%d], Priority[%d], Name:[%s], Author[%s], Phone[%s], Category[%s]\n", location_landmark_get_id (landmark), + location_landmark_get_priority(landmark), + location_landmark_get_name(landmark), + location_landmark_get_author(landmark), + location_landmark_get_phone_number(landmark), + location_landmark_get_category(landmark)); +} + +static void poi_cb(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + if (error != LOCATION_ERROR_NONE || landmark_list == NULL) { + g_debug ("Fail to get poi. Error[%d], ErrCode[%s], ErrMsg[%s]", error, error_code, error_msg); + return; + } + g_list_foreach (landmark_list, PrintLandmarkCb, NULL); +} + +void search_poi(LocationObject* loc) +{ + int ret = 0; + guint req_id = 0; + LocationPosition *pos = location_position_new (0, 37.257809, 127.056383, 0, LOCATION_STATUS_2D_FIX); + LocationPOIFilter *filter = location_poi_filter_new(); + LocationPOIPreference *pref = location_poi_pref_new(); + + location_poi_filter_set(filter, "CATEGORY", "restaurant"); + + location_poi_pref_set_max_result(pref, 5); + location_poi_pref_set_sort_by(pref, "name"); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + ret = location_search_poi (loc, filter, pos, pref, poi_cb, loc, &req_id); + if (ret != LOCATION_ERROR_NONE) { + g_debug("Fail to get poi. Error[%d]", ret); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(pos); + +} + * @endcode + */ +int location_search_poi (LocationObject *obj, const LocationPOIFilter * filter, const LocationPosition *position, const LocationPOIPreference * pref, LocationPOICB cb, gpointer user_data, guint * req_id); + +/** + * @brief Request a search service with area filter from service provider. + * @remarks refer #LocationLandmark + * @pre #location_init should be called before.\n + * #location_poi_pref_new should be set before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] filter - a #LocaitonPOIFilter created by #location_poi_filter_new + * @param [in] boundary - a #LocationBoundary + * @param [in] pref - a #LocationPOIPreference created by #location_poi_pref_new + * @param [in] cb - #LocationPOICB + * @param [in] user_data - data to pass to function + * @param [out] req_id - a guint + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +static GMainLoop *loop = NULL; + +void PrintLandmarkCb (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + + LocationLandmark *landmark = (LocationLandmark *)data; + + g_debug ("id[%d], Priority[%d], Name:[%s], Author[%s], Phone[%s], Category[%s]\n", location_landmark_get_id (landmark), + location_landmark_get_priority(landmark), + location_landmark_get_name(landmark), + location_landmark_get_author(landmark), + location_landmark_get_phone_number(landmark), + location_landmark_get_category(landmark)); +} + +static void poi_cb(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + if (error != LOCATION_ERROR_NONE || landmark_list == NULL) { + g_debug ("Fail to get poi. Error[%d], ErrCode[%s], ErrMsg[%s]", error, error_code, error_msg); + return; + } + g_list_foreach (landmark_list, PrintLandmarkCb, NULL); +} + +void search_poi(LocationObject* loc) +{ + int ret = 0; + guint req_id = 0; + + LocationPosition* rb = location_position_new (0, 37.300, -121.86, 0, LOCATION_STATUS_2D_FIX); + LocationPosition* lt = location_position_new (0, 37.360, -121.92, 0, LOCATION_STATUS_2D_FIX); + LocationBoundary *bbox = location_boundary_new_for_rect (lt, rb); + LocationPOIFilter *filter = location_poi_filter_new(); + LocationPOIPreference *pref = location_poi_pref_new(); + + location_poi_filter_set(filter, "CATEGORY", "restaurant"); + + location_poi_pref_set_max_result(pref, 5); + location_poi_pref_set_sort_by(pref, "name"); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + ret = location_search_poi_by_area (loc, filter, bbox, pref, poi_cb, loc, &req_id); + if (ret != LOCATION_ERROR_NONE) { + g_debug("Fail to get poi. Error[%d]", ret); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_boundary_free (bbox); +} + * @endcode + */ +int location_search_poi_by_area (LocationObject *obj, const LocationPOIFilter * filter, const LocationBoundary * boundary, const LocationPOIPreference * pref, LocationPOICB cb, gpointer user_data, guint * req_id); + +/** + * @brief Request a search service with address filter from service provider. + * @remarks refer #LocationLandmark + * @pre #location_init should be called before.\n + * #location_poi_pref_new should be set before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] filter - a #LocaitonPOIFilter created by #location_poi_filter_new + * @param [in] address - a #LocationAddress + * @param [in] pref - a #LocationPOIPreference created by #location_poi_pref_new + * @param [in] cb - #LocationPOICB + * @param [in] user_data - data to pass to function + * @param [out] req_id - a guint + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +static GMainLoop *loop = NULL; + +void PrintLandmarkCb (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + + LocationLandmark *landmark = (LocationLandmark *)data; + + g_debug ("id[%d], Priority[%d], Name:[%s], Author[%s], Phone[%s], Category[%s]\n", location_landmark_get_id (landmark), + location_landmark_get_priority(landmark), + location_landmark_get_name(landmark), + location_landmark_get_author(landmark), + location_landmark_get_phone_number(landmark), + location_landmark_get_category(landmark)); +} + +static void poi_cb(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + if (error != LOCATION_ERROR_NONE || landmark_list == NULL) { + g_debug ("Fail to get poi. Error[%d], ErrCode[%s], ErrMsg[%s]", error, error_code, error_msg); + return; + } + g_list_foreach (landmark_list, PrintLandmarkCb, NULL); +} + +void search_poi(LocationObject* loc) +{ + int ret = 0; + guint req_id = 0; + + LocationAddress *addr = location_address_new ("1", "Post Street", NULL, "san jose", "ca", NULL, "95113"); + LocationPOIFilter *filter = location_poi_filter_new(); + LocationPOIPreference *pref = location_poi_pref_new(); + + location_poi_filter_set(filter, "CATEGORY", "restaurant"); + + location_poi_pref_set_max_result(pref, 5); + location_poi_pref_set_sort_by(pref, "name"); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + ret = location_search_poi_by_address (loc, filter, addr, pref, poi_cb, loc, &req_id); + if (ret != LOCATION_ERROR_NONE) { + g_debug("Fail to get poi. Error[%d]", ret); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_address_free (addr); +} + * @endcode + */ +int location_search_poi_by_address (LocationObject *obj, const LocationPOIFilter * filter, const LocationAddress * addr, const LocationPOIPreference * pref, LocationPOICB cb, gpointer user_data, guint * req_id); + +/** + * @brief Request a search service with area filter from service provider. + * @remarks refer #LocationLandmark + * @pre #location_init should be called before.\n + * #location_poi_pref_new should be set before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] filter - a #LocaitonPOIFilter created by #location_poi_filter_new + * @param [in] address - a freeformed address + * @param [in] pref - a #LocationPOIPreference created by #location_poi_pref_new + * @param [in] cb - #LocationPOICB + * @param [in] user_data - data to pass to function + * @param [out] req_id - a guint + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +static GMainLoop *loop = NULL; + +void PrintLandmarkCb (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + + LocationLandmark *landmark = (LocationLandmark *)data; + + g_debug ("id[%d], Priority[%d], Name:[%s], Author[%s], Phone[%s], Category[%s]\n", location_landmark_get_id (landmark), + location_landmark_get_priority(landmark), + location_landmark_get_name(landmark), + location_landmark_get_author(landmark), + location_landmark_get_phone_number(landmark), + location_landmark_get_category(landmark)); +} + +static void poi_cb(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + if (error != LOCATION_ERROR_NONE || landmark_list == NULL) { + g_debug ("Fail to get poi. Error[%d], ErrCode[%s], ErrMsg[%s]", error, error_code, error_msg); + return; + } + g_list_foreach (landmark_list, PrintLandmarkCb, NULL); +} + +void search_poi(LocationObject* loc) +{ + int ret = 0; + guint req_id = 0; + + gchar *addr = g_strdup("4 N 2nd Street 95113"); + LocationPOIFilter *filter = location_poi_filter_new(); + LocationPOIPreference *pref = location_poi_pref_new(); + + location_poi_filter_set(filter, "CATEGORY", "restaurant"); + + location_poi_pref_set_max_result(pref, 5); + location_poi_pref_set_sort_by(pref, "name"); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + ret = location_search_poi_by_freeformed_address (loc, filter, addr, pref, poi_cb, loc, &req_id); + if (ret != LOCATION_ERROR_NONE) { + g_debug("Fail to get poi. Error[%d]", ret); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + g_free (addr); +} + * @endcode + */ +int location_search_poi_by_freeformed_address (LocationObject *obj, const LocationPOIFilter * filter, const gchar * address, const LocationPOIPreference * pref, LocationPOICB cb, gpointer user_data, guint * req_id); + +/** + * @brief Cancel the previous poi search. + * @remarks refer #LocationLandmark + * @pre #location_search_poi should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] req_id - a poi request id returned by location_search_poi + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +static GMainLoop *loop = NULL; + +void PrintLandmarkCb (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + + LocationLandmark *landmark = (LocationLandmark *)data; + + g_debug ("id[%d], Priority[%d], Name:[%s], Author[%s], Phone[%s], Category[%s]\n", location_landmark_get_id (landmark), + location_landmark_get_priority(landmark), + location_landmark_get_name(landmark), + location_landmark_get_author(landmark), + location_landmark_get_phone_number(landmark), + location_landmark_get_category(landmark)); +} + +static void poi_cb(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + if (error != LOCATION_ERROR_NONE || landmark_list == NULL) { + g_debug ("Fail to get poi. Error[%d], ErrCode[%s], ErrMsg[%s]", error, error_code, error_msg); + return; + } + g_list_foreach (landmark_list, PrintLandmarkCb, NULL); +} + +void search_poi(LocationObject* loc) +{ + int ret = 0; + guint req_id = 0; + + gchar *addr = g_strdup("4 N 2nd Street 95113"); + LocationPOIFilter *filter = location_poi_filter_new(); + LocationPOIPreference *pref = location_poi_pref_new(); + + location_poi_filter_set(filter, "CATEGORY", "restaurant"); + + location_poi_pref_set_max_result(pref, 5); + location_poi_pref_set_sort_by(pref, "name"); + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); + + ret = location_search_poi (loc, filter, addr, pref, poi_cb, loc, &req_id); + if (ret != LOCATION_ERROR_NONE) { + g_debug("Fail to get poi. Error[%d]", ret); + } + + ret = location_cancel_poi_request (loc, req_id); + if (ret != LOCATION_ERROR_NONE) { + g_debug("Fail to cancel poi request. Err[%d]", ret); + } + + location_poi_filter_free(filter); + location_poi_pref_free(pref); + g_free (addr); +} + * @endcode + */ +int location_cancel_poi_request (LocationObject *obj, guint req_id); + +/** + * @brief Request a route service from service provider. + * @remarks refer #LocationRoute, #LocationRouteSegment and #LocationRouteStep + * @pre #location_new should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] origin - a #LocationPosition + * @param [in] destination - a #LocationPosition + * @param [in] waypoint - a list of #LocationPosition + * const LocationRoutePreference * pref, LocationRouteCB cb, gpointer user_data, guint * req_id); + * @param [in] pref - a #LocationRoutePreference created by #location_route_pref_new + * @param [in] cb - a #LocationRouteCB + * @param [in] user_data - a gpointer + * @param [out] req_id - a guint + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +static void free_waypoint (gpointer data) +{ + LocationPosition *pos = (LocationPosition *)data; + + if (pos) location_position_free(pos); +} + +static void __print_route_step (gpointer data, gpointer user_data) +{ + g_printf("+++Step begin\n"); + LocationRouteStep *step = (LocationRouteStep *)data; + + const LocationPosition *start = location_route_step_get_start_point(step); + gdouble start_lat = 0; + gdouble start_lon = 0; + if (start) { + start_lat = start->latitude; + start_lon = start->longitude; + } else { + g_printf("Step start position NULL\n"); + } + const LocationPosition *end = location_route_step_get_end_point(step); + gdouble end_lat = 0; + gdouble end_lon = 0; + if (end) { + end_lat = end->latitude; + end_lon = end->longitude; + } else { + g_printf("Step end postion NULL\n"); + } + const gchar *inst = location_route_step_get_instruction(step); + + g_printf("Step: start(%f/%f), end(%f/%f), instruction(%s)\n", start_lat, start_lon, end_lat, end_lon, inst); + + g_printf("---Step end\n"); +} + +static void print_route_segment (gpointer data, gpointer user_data) +{ + g_printf("++Segment begin\n"); + LocationRouteSegment *seg = (LocationRouteSegment *)data; + gdouble seg_dist = location_route_segment_get_distance(seg); + glong seg_duration = location_route_segment_get_duration(seg); + const LocationPosition *start = location_route_segment_get_start_point(seg); + gdouble start_lat = 0; + gdouble start_lon = 0; + if (start) { + start_lat = start->latitude; + start_lon = start->longitude; + } else { + g_printf("Segment start postion NULL\n"); + } + const LocationPosition *end = location_route_segment_get_end_point(seg); + gdouble end_lat = 0; + gdouble end_lon = 0; + if (end) { + end_lat = end->latitude; + end_lon = end->longitude; + } else { + g_printf("Segment end postion NULL\n"); + } + g_printf("Segment info: Distance[%f], Duration[%ld], start(%f/%f), end(%f/%f)\n", seg_dist, seg_duration, + start_lat, start_lon, end_lat, end_lon); + + GList *step_list = location_route_segment_get_route_step(seg); + GList *tmp_list = (GList *)step_list; + if (tmp_list) { + g_list_foreach(tmp_list, print_route_step, NULL); + } + g_printf("--Segment end\n"); +} + + +static void print_route_list (gpointer data, gpointer user_data) +{ + g_printf("+Route begin\n"); + LocationRoute *route = (LocationRoute *)data; + + const LocationPosition *start = location_route_get_origin(route); + gdouble start_lat = 0; + gdouble start_lon = 0; + if (start) { + start_lat = start->latitude; + start_lon = start->longitude; + } else { + g_printf("Route start position NULL\n"); + } + const LocationPosition *end = location_route_get_destination(route); + gdouble end_lat = 0; + gdouble end_lon = 0; + if (end) { + end_lat = end->latitude; + end_lon = end->longitude; + } else { + g_printf("Route end position NULL\n"); + } + g_printf("Route: start(%f/%f), end(%f/%f)\n", start_lat, start_lon, end_lat, end_lon); + + gdouble distance = location_route_get_total_distance(route); + const gchar *dis_unit = location_route_get_distance_unit(route); + glong duration = location_route_get_total_duration(route); + const LocationBoundary *bound = location_route_get_bounding_box(route); + if (bound && bound->type == LOCATION_BOUNDARY_RECT) { + g_printf("RECT left top[%f-%f], right bottom[%f-%f]\n", bound->rect.left_top->latitude, bound->rect.left_top->longitude, + bound->rect.right_bottom->latitude, bound->rect.right_bottom->longitude); + } else { + g_printf("route boundary not exist, or not RECT\n"); + } + g_printf ("Distance[%f], Distance unit[%s], Duration[%ld]\n", distance, dis_unit, duration); + + GList *seg_list = location_route_get_route_segment(route); + if (seg_list) { + g_list_foreach(seg_list, print_route_segment, NULL); + } + + g_printf("-Route end\n"); +} + +static void cb_route(LocationError error, guint req_id, GList * route_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + if (error != LOCATION_ERROR_NONE) { + g_printf("Failed :%d\n", error); + return; + } + + g_printf("Success, poi_list[0x%x] user_data[0x%x] req_id[%d]\n", (unsigned int)route_list, (unsigned int)userdata, req_id); + g_list_foreach (route_list, print_route_list, NULL); + + if (error_code && error_msg) { + g_printf("cb_route: error_code[%s], error_msg[%s]\n", error_code, error_msg); + } +} + +int request_route(LocationObject *loc) +{ + int ret = 0; + LocationPosition *origin = location_position_new(0, 37.564263, 126.974676, 0, LOCATION_STATUS_2D_FIX); // Seoul city hall + LocationPosition *destination = location_position_new(0, 37.557120, 126.992410, 0, LOCATION_STATUS_2D_FIX); // NamSan + + GList *waypoint = NULL; + LocationPosition *via_pos = location_position_new(0, 37.560950, 126.986240, 0, LOCATION_STATUS_2D_FIX); // Wangsimli + waypoint = g_list_append (waypoint, (gpointer)via_pos); + + LocationRoutePreference *pref = location_route_pref_new(); + gchar *type = g_strdup("FASTEST"); + location_route_pref_set_route_type(pref, type); + + ret = location_request_route(loc, origin, destination, waypoint, pref, cb_route, NULL, &req_id); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search route by address. Error[%d]\n", ret); + } else { + g_printf("Search Route successfully, req_id %d\n", req_id); + } + + g_free(type); + g_list_free_full (waypoint, free_waypoint); + location_position_free(origin); + location_position_free(destination); + location_route_pref_free(pref); + + return ret; + } + * @endcode + */ +int location_request_route (LocationObject *obj, LocationPosition *origin, LocationPosition *destination, GList *waypoint, const LocationRoutePreference * pref, LocationRouteCB cb, gpointer user_data, guint * req_id); + +/** + * @brief Cancel the previous route request. + * @remarks None + * @pre #location_request_route should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] req_id - a route request id returned by location_search_route + * @return int + * @retval 0 Success + * Please refer #LocationError for more information. + * @par Example + * @code +#include +#include + +int cancel_route_request (LocationObject *loc, guint req_id) +{ + g_printf("cancel_route_request\n"); + + int ret = LOCATION_ERROR_NONE; + + ret = location_cancel_route_request(loc, req_id); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to cancel route request. Error[%d]\n", ret); + } + else { + g_printf("location_cancel_route_request, req_id %d\n", req_id); + } +} + * @endcode + */ +int location_cancel_route_request (LocationObject *obj, guint req_id); + +/** + * @brief Check wheither a map service is available on a service provider + * @remarks None + * @pre #location_new should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] type - a #LocationMapService + * @return gboolean + * @retval TRUE if supported + * @par Example + * @code +#include +#include + +int check_map_service (LocationObject *loc) +{ + g_printf("check_map_service\n"); + + gboolean is_supported = FALSE; + + is_supported = location_is_supported_map_provider_capability(loc, MAP_SERVICE_ROUTE_REQUEST_FEATURE_TO_AVOID); + if (is_supported == TRUE) { + g_printf("Map Service(MAP_SERVICE_ROUTE_REQUEST_FEATURE_TO_AVOID) is supported.\n"); + } + else { + g_printf("Map Service(MAP_SERVICE_ROUTE_REQUEST_FEATURE_TO_AVOID) is not supported.\n"); + } +} + * @endcode + */ +gboolean location_is_supported_map_provider_capability (LocationObject *obj, LocationMapServiceType type); + +/** + * @brief Get Map service key on a service provider + * @remarks None + * @pre #location_new should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] type - a #LocationMapService + * @return GList + * @retval a list of keys + * @par Example + * @code +#include +#include + +static void _print_keys(gpointer data) +{ + g_return_if_fail(data); + gchar *key = (gchar *)data; + + g_printf("Key[%s] is available now\n", key); +} + +int get_map_service_key (LocationObject *loc) +{ + g_printf("check_map_service\n"); + + GList *keys = NULL; + + keys = location_get_map_provider_capability_key(loc, MAP_SERVICE_ROUTE_REQUEST_FEATURE_TO_AVOID); + if (keys) { + g_list_foreach (keys, _print_keys, NULL); + g_list_free_full (keys, g_free); + } + else { + g_printf("Map Service(MAP_SERVICE_ROUTE_REQUEST_FEATURE_TO_AVOID) doesnot have keys. Need to check wheither its service is supported.\n"); + } +} + * @endcode + */ +int location_get_map_provider_capability_key (LocationObject *obj, LocationMapServiceType type, GList **key); + +/** + * @brief Get Map service Preference on a service provider + * @remarks None + * @pre #location_new should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @return #LocationPreference + * @retval a preference + * @par Example + * @code +#include +#include + int get_map_service_pref (LocationObject loc) + { + if (!loc) return -1; + + LocationPreference *svc_pref = location_get_map_service_pref (loc); + if (!svc_pref) return -1; + + gchar *name = location_pref_get_provider_name (svc_pref); + gchar *unit = location_pref_get_distance_unit (svc_pref); + gchar *language = location_pref_get_language (svc_pref); + + g_printf("provider [%s]: distance unit [%s], languange [%s]\n", name, unit, language); + + return 0; + } + + * @endcode + */ +LocationPreference *location_get_map_service_pref (LocationObject *obj); + +/** + * @brief Set Map service preference on a service provider + * @remarks None + * @pre #location_new should be called before. + * @post None. + * @param [in] obj - a #LocationObject created by #location_new + * @param [in] pref = a #LocationPreference + * @return gboolean + * @retval TRUE if success + * @par Example + * @code +#include +#include + +int set_map_service_pref (LocationObject *loc) +{ + if (!loc) return -1; + + LocationPreference *svc_pref = location_pref_new(); + location_pref_set_language (svc_pref, "en"); + location_pref_set_distance_unit (svc_pref, "MI"); + + gboolean ret = location_set_map_service_pref (loc, svc_pref); + if (!ret) { + location_pref_pref (svc_pref); + return -1; + } + location_pref_pref (svc_pref); + return 0; +} + * @endcode + */ +gboolean location_set_map_service_pref (LocationObject *obj, LocationPreference *pref); + +/** + * @} @} + */ + +G_END_DECLS + +#endif /* __LOCATION_MAP_SERVICE_H__ */ diff --git a/location/map-service/location-poi.c b/location/map-service/location-poi.c new file mode 100644 index 0000000..9dba262 --- /dev/null +++ b/location/map-service/location-poi.c @@ -0,0 +1,289 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "location-log.h" +#include "location-types.h" +#include "location-pref.h" + +#include "map-service.h" + +#include "location-poi.h" + +struct _LocationPOIPreference { + guint max_result_cnt; ///< Maximum number of results + LocationPOIPrefSortOrder sort_order; ///< Sort order + gchar* item; ///< Sory by item + GHashTable *properties; +}; + +struct _LocationPOIFilter { + // "CATEGORY", "KEYWORD", "POINAME" + GHashTable *properties; +}; + +EXPORT_API guint +location_poi_pref_get_max_result (const LocationPOIPreference *pref) +{ + g_return_val_if_fail(pref, 0); + + return pref->max_result_cnt; +} + +EXPORT_API gchar * +location_poi_pref_get_sort_by (const LocationPOIPreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->item; +} + +EXPORT_API LocationPOIPrefSortOrder +location_poi_pref_get_sort_order (const LocationPOIPreference *pref) +{ + g_return_val_if_fail(pref, LOCATION_POI_PRE_SO_NONE); + + return pref->sort_order; +} + +EXPORT_API GList * +location_poi_pref_get_property_key (const LocationPOIPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + if (!pref->properties) return NULL; + + return g_hash_table_get_keys (pref->properties); +} + +EXPORT_API gpointer +location_poi_pref_get_property (const LocationPOIPreference *pref, gconstpointer key) +{ + g_return_val_if_fail (pref, NULL); + g_return_val_if_fail (key, NULL); + + if (!pref->properties) return NULL; + + return g_hash_table_lookup (pref->properties, key); +} + + +EXPORT_API gboolean +location_poi_pref_set_max_result (LocationPOIPreference *pref, guint max_num) +{ + g_return_val_if_fail(pref, FALSE); + g_return_val_if_fail(max_num > 0, FALSE); + + pref->max_result_cnt = max_num; + + return TRUE; +} + +EXPORT_API gboolean +location_poi_pref_set_sort_by(LocationPOIPreference * pref, const gchar * item) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->item) { + g_free(pref->item); + pref->item = NULL; + } + + if (item) pref->item = g_strdup(item); + + return TRUE; +} + +EXPORT_API gboolean +location_poi_pref_set_sort_order (LocationPOIPreference *pref, LocationPOIPrefSortOrder sort_order) +{ + g_return_val_if_fail(pref, FALSE); + + if (sort_order < LOCATION_POI_PREF_SO_ASC || sort_order > LOCATION_POI_PREF_SO_DESC) return FALSE; + + pref->sort_order = sort_order; + + return TRUE; +} + +EXPORT_API gboolean +location_poi_pref_set_property (LocationPOIPreference *pref, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail(pref, FALSE); + g_return_val_if_fail(key, FALSE); + g_return_val_if_fail(pref->properties, FALSE); + + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (pref->properties, re_key, re_val); + } else g_hash_table_remove (pref->properties, key); + + return TRUE; +} + +EXPORT_API LocationPOIPreference * +location_poi_pref_new (void) +{ + LocationPOIPreference *pref = g_slice_new0 (LocationPOIPreference); + g_return_val_if_fail(pref, NULL); + + pref->sort_order = LOCATION_POI_PREF_SO_ASC; + pref->max_result_cnt = 25; + pref->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return pref; +} + +static void poi_pref_property_copy_cb (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail (key); + g_return_if_fail (value); + g_return_if_fail (user_data); + + LocationPOIPreference *pref = (LocationPOIPreference *) user_data; + if (pref->properties) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (pref->properties, re_key, re_val); + } +} + +EXPORT_API LocationPOIPreference * +location_poi_pref_copy (LocationPOIPreference *pref) +{ + LocationPOIPreference *new_pref = location_poi_pref_new(); + g_return_val_if_fail (new_pref, NULL); + + location_poi_pref_set_sort_by(new_pref, location_poi_pref_get_sort_by(pref)); + location_poi_pref_set_sort_order(new_pref, location_poi_pref_get_sort_order(pref)); + location_poi_pref_set_max_result(new_pref, location_poi_pref_get_max_result(pref)); + + g_hash_table_foreach (pref->properties, poi_pref_property_copy_cb ,new_pref); + + return new_pref; +} + +EXPORT_API void +location_poi_pref_free (LocationPOIPreference * pref) +{ + g_return_if_fail(pref); + + location_poi_pref_set_sort_by(pref, NULL); + if (pref->properties) g_hash_table_destroy (pref->properties); + + g_slice_free(LocationPOIPreference, pref); +} + +EXPORT_API gboolean +location_poi_filter_set (const LocationPOIFilter *filter, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail(filter, FALSE); + g_return_val_if_fail(key, FALSE); + + if (filter->properties) { + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (filter->properties, re_key, re_val); + } else g_hash_table_remove (filter->properties, key); + } + else + return FALSE; + + return TRUE; +} + +EXPORT_API gpointer +location_poi_filter_get (const LocationPOIFilter *filter, gconstpointer key) +{ + g_return_val_if_fail(filter, NULL); + g_return_val_if_fail(key, NULL); + + if (filter->properties) { + return g_hash_table_lookup (filter->properties, key); + } + return NULL; +} + +EXPORT_API GList * +location_poi_filter_get_key (const LocationPOIFilter *filter) +{ + g_return_val_if_fail(filter, NULL); + + if (filter->properties) { + return g_hash_table_get_keys (filter->properties); + } + + return NULL; +} + +EXPORT_API LocationPOIFilter * +location_poi_filter_new (void) +{ + LocationPOIFilter *filter = g_slice_new0(LocationPOIFilter); + g_return_val_if_fail (filter, NULL); + + filter->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return filter; +} + +static void poi_filter_copy_cb (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail (key); + g_return_if_fail (value); + g_return_if_fail (user_data); + + LocationPOIFilter *filter = (LocationPOIFilter *) user_data; + if (filter->properties) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (filter->properties, re_key, re_val); + } +} + +EXPORT_API LocationPOIFilter * +location_poi_filter_copy (LocationPOIFilter *filter) +{ + g_return_val_if_fail (filter, NULL); + + LocationPOIFilter * new_filter = location_poi_filter_new(); + g_return_val_if_fail (new_filter, NULL); + + if (new_filter->properties) g_hash_table_foreach (filter->properties, poi_filter_copy_cb, new_filter); + + return new_filter; +} + +EXPORT_API void +location_poi_filter_free (LocationPOIFilter *filter) +{ + g_return_if_fail(filter); + + if (filter->properties) { + g_hash_table_destroy (filter->properties); + filter->properties = NULL; + } + g_slice_free(LocationPOIFilter, filter); +} diff --git a/location/map-service/location-poi.h b/location/map-service/location-poi.h new file mode 100644 index 0000000..8e5d20b --- /dev/null +++ b/location/map-service/location-poi.h @@ -0,0 +1,282 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_POI_H__ +#define __LOCATION_POI_H__ + +#include + +G_BEGIN_DECLS + +/** + * @file location-poi.h + * @brief This file contains the internal definitions and structures related to POI. + */ + +/** + * @addtogroup LocationMapService + * @{ + * @defgroup LocationMapServicePOI Location POI + * @brief This is a location POI for providing location map services. + * @addtogroup LocationMapServicePOI + * @{ + */ + +typedef enum { + LOCATION_POI_PRE_SO_NONE, ///< None of sorting the results in order. + LOCATION_POI_PREF_SO_ASC, ///< A constant for sorting the results in ascending order + LOCATION_POI_PREF_SO_DESC ///< A constant for sorting the results in descending order +} LocationPOIPrefSortOrder; + +/** + * @brief Retrive LocationPreperence that the given LocationPOIPreference inherits. + */ + +/** + * @brief Create a new LocationPOIPreference + * @remarks None. + * @pre None + * @post None. + * @return #LocationPOIPreference + * @retval NULL if error occured + * @see location_location_poi_pref_free + * + */ +LocationPOIPreference *location_poi_pref_new (void); + +/** + * @brief Copy a LocationPOIPreference + * @remarks None. + * @pre None + * @post None. + * @return #LocationPOIPreference + * @retval NULL if error occured + * @see location_location_poi_pref_free + * + */ +LocationPOIPreference *location_poi_pref_copy (LocationPOIPreference *pref); + +/** + * @brief Free a LocationPOIPreference + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @return #LocationPreference + * @retval NULL if error occured + * @see location_location_poi_pref_set_pref + */ +void location_poi_pref_free (LocationPOIPreference * pref); + +/** + * @brief Get the maximum number of results for poi service. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @return guint + * @retval 0 if error occured + * @see location_poi_pref_set_max_result + */ +guint location_poi_pref_get_max_result (const LocationPOIPreference * pref); + +/** + * @brief Get the sort criterion for poi service. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @return gchar + * @retval sorting item + * @see location_poi_pref_set_sort_by + */ +gchar *location_poi_pref_get_sort_by (const LocationPOIPreference * pref); + +/** + * @brief Get the sort order for poi service. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @return LocationPOIPrefSortOrder + * @retval sort order + * @see location_poi_pref_set_sort_order + */ +LocationPOIPrefSortOrder location_poi_pref_get_sort_order (const LocationPOIPreference * pref); + +/** + * @brief Get the property keys of poi preference + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @return GList + * @retval list of property key + * @see location_poi_pref_set_property + */ +GList *location_poi_pref_get_property_key (const LocationPOIPreference *pref); + +/** + * @brief Get the property of poi preference + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @param [in] key - gconstpointer + * @return gconstpointer + * @retval property value + * @see location_poi_pref_set_property + */ +gpointer location_poi_pref_get_property (const LocationPOIPreference *pref, gconstpointer key); + + +/** + * @brief Set the maximum number of results for poi service. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @return gboolean + * @retval TRUE if success + * @see location_poi_pref_get_max_result + */ +gboolean location_poi_pref_set_max_result (LocationPOIPreference * pref, guint max_num); + +/** + * @brief Set the sort criterion for poi service. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @param [in] item - gchar or NULL if reset + * @return gboolean + * @retval TRUE if success + * @see location_poi_pref_get_sort_by + */ +gboolean location_poi_pref_set_sort_by (LocationPOIPreference * pref, const gchar * item); + +/** + * @brief Set the sort order for poi service. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @param [in] sort_order - #LocationPOIPrefSortOrder + * @return gboolean + * @retval TRUE if success + * @see location_poi_pref_get_sort_order + */ +gboolean location_poi_pref_set_sort_order (LocationPOIPreference *pref, LocationPOIPrefSortOrder sort_order); + +/** + * @brief Set property of poi preference. + * @remarks None. + * @pre #location_poi_pref_new should be called before. + * @post None. + * @param [in] pref - #LocationPOIPreference + * @param [in] key - gconstpoiner + * @param [in] value - gconstpointer or NULL if reset + * @return gboolean + * @retval TRUE if success + * @see location_poi_pref_get_property + */ +gboolean location_poi_pref_set_property (LocationPOIPreference *pref, gconstpointer key, gconstpointer value); + +/** + * @brief Create a new LocationPOIFilter + * @remarks None + * @pre #location_init should be called before. + * @post None. + * @return a new #LocationPOIFilter + * @retval NULL if error occured + * @see location_poi_filter_free + */ +LocationPOIFilter *location_poi_filter_new (void); + +/** + * @brief Copy a LocationPOIFilter + * @remarks None + * @pre #location_init should be called before. + * @post None. + * @return a #LocationPOIFilter + * @retval NULL if error occured + * @see location_poi_filter_new + */ +LocationPOIFilter *location_poi_filter_copy (LocationPOIFilter *filter); + +/** + * @brief Free a LocationPOIFilter + * @remarks None + * @pre #location_new should be called before. + * @post None. + * @param [in] filter - #LocationPOIFilter + * @return None + * @see location_poi_filter_new + */ +void location_poi_filter_free (LocationPOIFilter *filter); + +/** + * @brief Set filter for poi service + * @remarks None + * @pre #location_poi_filter_new should be called before. + * @post None. + * @param [in] filter - #LocationPOIFilter + * @param [in] key - gconstpointer + * @param [in] value - gconstpointer or NULL if reset + * @return gboolean + * @retval TRUE if success + * @see location_poi_filter_get + */ +gboolean location_poi_filter_set (const LocationPOIFilter *filter, gconstpointer key, gconstpointer value); + +/** + * @brief Get filter for poi service + * @remarks None + * @pre #location_poi_filter_new should be called before. + * @post None. + * @param [in] filter - #LocationPOIFilter + * @param [in] key - gconstpointer + * @return gconstpointer + * @retval Filter property key + * @see location_poi_filter_set + */ +gpointer location_poi_filter_get (const LocationPOIFilter *filter, gconstpointer key); + +/** + * @brief Get keys in the given filter + * @remarks The content of returned list is owned by the poi filter and should not be modified or freed. \n + * Use g_list_free when done using the returned. + * @pre #location_poi_filter_new should be called before. + * @post None. + * @param [in] filter - #LocationPOIFilter + * @return GList + * @retval Filter key + * @see None + */ +GList *location_poi_filter_get_key (const LocationPOIFilter *filter); + +/** + * @} @} + */ + +G_END_DECLS + +#endif diff --git a/location/map-service/location-pref.c b/location/map-service/location-pref.c new file mode 100644 index 0000000..28f2abb --- /dev/null +++ b/location/map-service/location-pref.c @@ -0,0 +1,222 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "location-types.h" +#include "map-service.h" +#include "location-pref.h" + +struct _LocationPreference { + gchar *provider_name; ///< Name of the service provier + gchar *language; ///< Language of the service preference. + gchar *country; ///< Country of the service preference. + gchar *distance_unit; ///< Distance unit of the service preference. + GHashTable *properties; ///< properties of the service preference. +}; + +EXPORT_API GList * +location_pref_get_property_key (const LocationPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + + if (!pref->properties) return NULL; + + return g_hash_table_get_keys (pref->properties); +} + +EXPORT_API gchar * +location_pref_get_language (const LocationPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + + return pref->language; +} + +EXPORT_API gchar * +location_pref_get_country (const LocationPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + + return pref->country; +} + +EXPORT_API gchar * +location_pref_get_distance_unit (const LocationPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + + return pref->distance_unit; +} + +EXPORT_API gconstpointer +location_pref_get_property (const LocationPreference *pref, gconstpointer key) +{ + g_return_val_if_fail (pref, NULL); + g_return_val_if_fail (key, NULL); + if (!pref->properties) return NULL; + + return (gconstpointer) g_hash_table_lookup (pref->properties, key); +} + +EXPORT_API gchar * +location_pref_get_provider_name (const LocationPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + + return pref->provider_name; +} + +EXPORT_API gboolean +location_pref_set_provider_name (LocationPreference *pref, const gchar *name) +{ + g_return_val_if_fail (pref, FALSE); + + if (pref->provider_name) { + g_free (pref->provider_name); + pref->provider_name = NULL; + } + + if (name) pref->provider_name = g_strdup ((gchar *)name); + + return TRUE; +} + +EXPORT_API gboolean +location_pref_set_language (LocationPreference *pref, const gchar * language) +{ + g_return_val_if_fail (pref, FALSE); + + if (pref->language) { + g_free (pref->language); + pref->language = NULL; + } + + if (language) pref->language = g_strdup(language); + + return TRUE; +} + +EXPORT_API gboolean +location_pref_set_country (LocationPreference *pref, const gchar *country) +{ + g_return_val_if_fail (pref, FALSE); + + if (pref->country) { + g_free (pref->country); + pref->country = NULL; + } + + if (country) pref->country = g_strdup(country); + + return TRUE; +} + + +EXPORT_API gboolean +location_pref_set_distance_unit (LocationPreference *pref, const gchar * unit) +{ + g_return_val_if_fail (pref, FALSE); + + if (pref->distance_unit) { + g_free (pref->distance_unit); + pref->distance_unit = NULL; + } + + if (unit) pref->distance_unit = g_strdup (unit); + + return TRUE; +} + +EXPORT_API gboolean +location_pref_set_property (LocationPreference *pref, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail (pref, FALSE); + g_return_val_if_fail (key, FALSE); + if (!pref->properties) return FALSE; + + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (pref->properties, re_key, re_val); + } else g_hash_table_remove (pref->properties, key); + + return TRUE; +} + +EXPORT_API LocationPreference * +location_pref_new (void) +{ + LocationPreference *pref = g_slice_new0(LocationPreference); + if (!pref) return NULL; + + pref->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return pref; +} + +static void property_copy (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail (key); + g_return_if_fail (value); + g_return_if_fail (user_data); + + GHashTable *properties = (GHashTable *) user_data; + + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (properties, re_key, re_val); +} + +EXPORT_API LocationPreference * +location_pref_copy (LocationPreference *pref) +{ + g_return_val_if_fail (pref, NULL); + + LocationPreference *new_pref = location_pref_new(); + if (!new_pref) return NULL; + + location_pref_set_provider_name (new_pref, location_pref_get_provider_name(pref)); + location_pref_set_language (new_pref, location_pref_get_language(pref)); + location_pref_set_distance_unit (new_pref, location_pref_get_distance_unit(pref)); + + + g_hash_table_foreach (pref->properties, property_copy, new_pref->properties); + + return new_pref; +} + +EXPORT_API void +location_pref_free (LocationPreference * pref) +{ + g_return_if_fail(pref); + + location_pref_set_provider_name (pref, NULL); + location_pref_set_language (pref, NULL); + location_pref_set_distance_unit (pref, NULL); + g_hash_table_destroy (pref->properties); + + g_slice_free (LocationPreference, pref); + pref = NULL; +} diff --git a/location/map-service/location-pref.h b/location/map-service/location-pref.h new file mode 100644 index 0000000..577eb17 --- /dev/null +++ b/location/map-service/location-pref.h @@ -0,0 +1,121 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_PREF_H__ +#define __LOCATION_PREF_H__ + +#include + +G_BEGIN_DECLS + +/** + * @file location-pref.h + * @brief This file contains the internal definitions and structures related to a service provider. + * @addtogroup LocationMapService + * @{ + * @defgroup LocationMapServiceProvider Service Provider + * @brief This represents preference and capability of Service providers + * @addtogroup LocationMapServiceProvider + * @{ + */ + +/** + * @brief Get provider name to be used in the service request + */ +gchar *location_pref_get_provider_name (const LocationPreference *pref); + +/** + * @brief Get language to be used in the service request. + */ +gchar *location_pref_get_language (const LocationPreference *pref); + +/** + * @brief Get country to be used in the service request. + */ +gchar *location_pref_get_country (const LocationPreference *pref); + + +/** + * @brief Get the preferred length unit to be used in the service request. + */ +gchar *location_pref_get_distance_unit (const LocationPreference *pref); + +/** + * @brief Get available service of the service provider. + */ +GList *location_pref_get_property_key (const LocationPreference *pref); + +/** + * @brief Get property to be used in the service request. + */ +gconstpointer location_pref_get_property (const LocationPreference *pref, gconstpointer key); + +/** + * @brief Set provider's name to be used in the service request. + */ +gboolean location_pref_set_provider_name (LocationPreference *pref, const gchar *name); + +/** + * @brief Set language to be used in the service request. + */ +gboolean location_pref_set_language (LocationPreference *pref, const gchar *language); + +/** + * @brief Set country to be used in the service request. + */ +gboolean location_pref_set_country (LocationPreference *pref, const gchar *country); + +/** + * @brief Get the preferred length unit to be used in the service request. + */ +gboolean location_pref_set_distance_unit (LocationPreference *pref, const gchar * unit); + +/** + * @brief Set property to be used in the service request. + */ +gboolean location_pref_set_property (LocationPreference *pref, gconstpointer key, gconstpointer value); + +/** + * @brief Create a new LocationPreference. + */ +LocationPreference * location_pref_new (void); + +/** + * @brief Create a new LocationPreference. + */ +LocationPreference * location_pref_copy (LocationPreference *pref); + + +/** + * @brief Free a LocationPreference. + */ +void location_pref_free (LocationPreference * pref); + +/** + * @} @} + */ + +G_END_DECLS + +#endif /* __LOCATION_PREF_H__ */ + + + diff --git a/location/map-service/location-route-ext.h b/location/map-service/location-route-ext.h new file mode 100644 index 0000000..14f59cc --- /dev/null +++ b/location/map-service/location-route-ext.h @@ -0,0 +1,362 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_ROUTE_EXT_H__ +#define __LOCATION_ROUTE_EXT_H__ + +#include + +G_BEGIN_DECLS + +/** + * @file location-route-ext.h + * @brief This file contains the extensional definitions and structures related to Route. + */ +/** + * @addtogroup LocationMapServiceRoute + * @{ + * @defgroup LocationMapServiceRouteExt Location Route Ext + * @brief This provides Location Route Ext APIs. + * @addtogroup LocationMapServiceRouteExt + * @{ + */ + +/** + * @brief Set the origin #LocationPosition of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] origin - a #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_get_origin + */ +gboolean location_route_set_origin (LocationRoute *route, const LocationPosition* origin); + +/** + * @brief Set the destication #LocationPosition of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] destination - a #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_get_destination + */ +gboolean location_route_set_destination (LocationRoute *route, const LocationPosition* destination); + +/** + * @brief Set the bounding box #LocationBoundary of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] bbox - a #LocationBoundary + * @return gboolean + * @retval TRUE if success + * @see location_route_get_bounding_box + */ +gboolean location_route_set_bounding_box (LocationRoute *route, const LocationBoundary* bbox); +/** + * @brief Set the distance of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] total_distance - gdouble + * @return gboolean + * @retval TRUE if success + * @see location_route_get_total_distance + */ +gboolean location_route_set_total_distance (LocationRoute *route, gdouble total_distance); + +/** + * @brief Set the distance unit of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] distance_unit - gchar + * @return gboolean + * @retval TRUE if success + * @see location_route_get_distance_unit + */ +gboolean location_route_set_distance_unit (LocationRoute *route, const gchar* distance_unit); + +/** + * @brief Set the duration of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] total_duration - glong + * @return gboolean + * @retval TRUE if success + * @see location_route_get_total_duration + */ +gboolean location_route_set_total_duration (LocationRoute *route, glong total_duration); + +/** + * @brief Set the propery value of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] key - gconstpointer + * @param [in] value - gconstpointer + * @return gboolean + * @retval TRUE if success + * @see location_route_get_property + */ +gboolean location_route_set_property (LocationRoute *route, gconstpointer key, gconstpointer value); + +/** + * @brief Set the list of segments #LocationRouteSegment of #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @param [in] segment - a list of #LocationRouteSegment + * @return gboolean + * @retval TRUE if success + * @see location_route_get_route_segment + */ +gboolean location_route_set_route_segment (LocationRoute *route, GList* segment); + +/** + * @brief Set the start point #LocationPosition of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] start - a #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_start_point + */ +gboolean location_route_segment_set_start_point (LocationRouteSegment *segment, const LocationPosition *start); + +/** + * @brief Set the end point #LocationPosition of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] end - a #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_end_point + */ +gboolean location_route_segment_set_end_point (LocationRouteSegment *segment, const LocationPosition *end); + +/** + * @brief Set the bounding box #LocationBoundary of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] bbox - a #LocationBoundary + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_bounding_box + */ +gboolean location_route_segment_set_bounding_box (LocationRouteSegment *segment, const LocationBoundary *bbox); + +/** + * @brief Set the distance of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] distance - gdouble + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_distance + */ +gboolean location_route_segment_set_distance (LocationRouteSegment *segment, gdouble distance); + +/** + * @brief Set the duration of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] duration - glong + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_duration + */ +gboolean location_route_segment_set_duration (LocationRouteSegment *segment, glong duration); + +/** + * @brief Set the property value of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] key - gconstpointer + * @param [in] value - gconstpointer + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_property + */ +gboolean location_route_segment_set_property (LocationRouteSegment *segment, gconstpointer key, gconstpointer value); + +/** + * @brief Set the list of route steps #LocationRouteStep in #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @param [in] step - a list of #locationRouteStep + * @return gboolean + * @retval TRUE if success + * @see location_route_segment_get_route_step + */ +gboolean location_route_segment_set_route_step (LocationRouteSegment *segment, GList* step); + +/** + * @brief Set the start point #LocationPosition of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] start - a #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_start_point + */ +gboolean location_route_step_set_start_point (LocationRouteStep *step, const LocationPosition *start); + +/** + * @brief Set the end point #LocationPosition of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] end - a #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_end_point + */ +gboolean location_route_step_set_end_point (LocationRouteStep *step, const LocationPosition *end); + +/** + * @brief Set the bounding box #LocationBoundary of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] bbox - a #LocationBoundary + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_bounding_box + */ +gboolean location_route_step_set_bounding_box (LocationRouteStep *step, const LocationBoundary *bbox); + +/** + * @brief Set the distance of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] distance - gdouble + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_distance + */ +gboolean location_route_step_set_distance (LocationRouteStep *step, gdouble distance); + +/** + * @brief Set the duration of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] duration - glong + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_duration + */ +gboolean location_route_step_set_duration (LocationRouteStep *step, glong duration); + +/** + * @brief Set the transport mode of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] transport_mode - gchar + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_transport_mode + */ +gboolean location_route_step_set_transport_mode (LocationRouteStep *step, const gchar *transport_mode); + +/** + * @brief Set the instruction of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] instruction - gchar + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_instruction + */ +gboolean location_route_step_set_instruction (LocationRouteStep *step, const gchar *instruction); + +/** + * @brief Set the list of geometry #LocationPosition in #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] geometry - a list of #LocationPosition + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_geometry + */ +gboolean location_route_step_set_geometry (LocationRouteStep *step, GList *geometry); + +/** + * @brief Set the property value of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] key - gconstpointer + * @param [in] value - gconstpointer + * @return gboolean + * @retval TRUE if success + * @see location_route_step_get_property + */ +gboolean location_route_step_set_property (LocationRouteStep *step, gconstpointer key, gconstpointer value); + +/** + * @} @} + */ + +G_END_DECLS + +#endif diff --git a/location/map-service/location-route.c b/location/map-service/location-route.c new file mode 100644 index 0000000..7ffe8e5 --- /dev/null +++ b/location/map-service/location-route.c @@ -0,0 +1,1372 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "location-types.h" +#include "location-route.h" +#include "location-route-ext.h" +#include "location-boundary.h" +#include "map-service.h" + + +struct _LocationRoute { +// gint req_id; //< Request id : for expandability + LocationPosition *origin; //< Coordinate StartCoord + LocationPosition *destination; //< Coordinates destCoord + LocationBoundary *bbox; //< a rectangular geographical area + gdouble total_distance; //< Total distance + gchar *distance_unit; //< Distance Unit + glong total_duration; //< Total duration + GHashTable *properties; // + GList *segment; +}; + +//Waypoints +struct _LocationRouteSegment { + LocationPosition *start; //< Coordinate StartCoord; + LocationPosition *end; //< Coordinates destCoord; + LocationBoundary *bbox; //< a rectangular geographical area + gdouble distance; + glong duration; + GHashTable *properties; // + GList *step; +}; + +// Each instruction +struct _LocationRouteStep { + LocationPosition *start; //< Coordinate StartCoord; + LocationPosition *end; //< Coordinates destCoord; + LocationBoundary *bbox; //< a rectangular geographical area + gdouble distance; + glong duration; + gchar *transport_mode; + gchar *instruction; + GList *geometry; + + GHashTable *properties; +}; + +struct _LocationRoutePreference { + GList* addr_to_avoid; + GList* area_to_avoid; + GList* feature_to_avoid; + GList* freeformed_addr_to_avoid; + LocationBoundary* bbox; + guint max_matches_count; + gchar *distance_unit; + + gchar *route_type; + gchar *transport_mode; + gboolean is_geometry_used; + gboolean is_instruction_bounding_box_used; + gboolean is_instruction_geometry_used; + gboolean is_instruction_used; + gboolean is_traffic_data_used; + + // AvoidFreeways, Easy, Fastest, MoreFreeways, NoFreeways, Pedestrian, Shortest + GHashTable *properties; + +}; + +static void route_pref_addr_to_avoid_copy_cb (gpointer data, gpointer user_data) +{ + g_return_if_fail(data); + g_return_if_fail(user_data); + + LocationAddress *address = (LocationAddress *)data; + LocationRoutePreference *pref = (LocationRoutePreference *)user_data; + + pref->addr_to_avoid = g_list_append (pref->addr_to_avoid, location_address_copy(address)); +} + +static void addr_to_avoid_free_cb (gpointer data) +{ + g_return_if_fail (data); + + LocationAddress *addr = (LocationAddress *)data; + + location_address_free (addr); +} + +EXPORT_API gboolean +location_route_pref_set_addr_to_avoid (LocationRoutePreference *pref, GList *addr) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->addr_to_avoid) { + g_list_free_full (pref->addr_to_avoid, addr_to_avoid_free_cb); + pref->addr_to_avoid = NULL; + } + + if (addr) g_list_foreach (addr, route_pref_addr_to_avoid_copy_cb, pref); + + return TRUE; +} + +static void route_pref_area_to_avoid_copy_cb (gpointer data, gpointer user_data) +{ + g_return_if_fail(data); + g_return_if_fail(user_data); + + LocationBoundary *area = (LocationBoundary *)data; + LocationRoutePreference *pref = (LocationRoutePreference *)user_data; + + pref->area_to_avoid = g_list_append (pref->area_to_avoid, location_boundary_copy((const LocationBoundary *)area)); +} + +static void route_pref_area_to_avoid_free_cb (gpointer data) +{ + g_return_if_fail (data); + + LocationBoundary *boundary = (LocationBoundary *)data; + + location_boundary_free (boundary); +} + +EXPORT_API gboolean +location_route_pref_set_area_to_avoid (LocationRoutePreference *pref, GList *area) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->area_to_avoid) { + g_list_free_full (pref->area_to_avoid, route_pref_area_to_avoid_free_cb); + pref->area_to_avoid = NULL; + } + + if (area) g_list_foreach (area, route_pref_area_to_avoid_copy_cb, pref); + + return TRUE; +} + +static void route_pref_feature_to_avoid_copy_cb (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + g_return_if_fail (user_data); + + gchar *feature = (gchar *)data; + LocationRoutePreference *pref = (LocationRoutePreference *) user_data; + + pref->feature_to_avoid = g_list_append (pref->feature_to_avoid, g_strdup (feature)); +} + +EXPORT_API gboolean +location_route_pref_set_feature_to_avoid (LocationRoutePreference *pref, GList * feature) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->feature_to_avoid) { + g_list_free_full (pref->feature_to_avoid, g_free); + pref->feature_to_avoid = NULL; + } + + g_list_foreach (feature, route_pref_feature_to_avoid_copy_cb, pref); + + return TRUE; +} + +static void route_pref_freeforemd_addr_to_avoid_foreach_copy (gpointer data, gpointer user_data) +{ + g_return_if_fail(data); + g_return_if_fail(user_data); + + gchar *freeformed_addr = (gchar *)data; + LocationRoutePreference *pref = (LocationRoutePreference *)user_data; + + pref->freeformed_addr_to_avoid = g_list_append (pref->freeformed_addr_to_avoid, g_strdup(freeformed_addr)); +} + +EXPORT_API gboolean +location_route_pref_set_freeformed_addr_to_avoid (LocationRoutePreference *pref, GList *freeformed_addr) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->freeformed_addr_to_avoid) { + g_list_free_full (pref->freeformed_addr_to_avoid, g_free); + pref->freeformed_addr_to_avoid = NULL; + } + + if (freeformed_addr) g_list_foreach (freeformed_addr, route_pref_freeforemd_addr_to_avoid_foreach_copy, pref); + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_bounding_box (LocationRoutePreference *pref, const LocationBoundary *bbox) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->bbox) { + location_boundary_free (pref->bbox); + pref->bbox = NULL; + } + + if (bbox) pref->bbox = location_boundary_copy (bbox); + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_max_result (LocationRoutePreference *pref, guint max_num) +{ + g_return_val_if_fail(pref, FALSE); + g_return_val_if_fail(max_num > 0, FALSE); + + pref->max_matches_count = max_num; + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_route_type (LocationRoutePreference *pref, const gchar *type) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->route_type) { + g_free(pref->route_type); + pref->route_type = NULL; + } + + if (type) pref->route_type = g_strdup (type); + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_transport_mode (LocationRoutePreference *pref, const gchar *mode) +{ + g_return_val_if_fail(pref, FALSE); + + if (pref->transport_mode) { + g_free(pref->transport_mode); + pref->transport_mode = NULL; + } + + if (mode) pref->transport_mode = g_strdup (mode); + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_geometry_used (LocationRoutePreference *pref, gboolean is_used) +{ + g_return_val_if_fail(pref, FALSE); + + pref->is_geometry_used = is_used; + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_instruction_bounding_box_used (LocationRoutePreference *pref, gboolean is_used) +{ + g_return_val_if_fail(pref, FALSE); + + pref->is_instruction_bounding_box_used = is_used; + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_instruction_geometry_used (LocationRoutePreference *pref, gboolean is_used) +{ + g_return_val_if_fail(pref, FALSE); + + pref->is_instruction_geometry_used = is_used; + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_instruction_used (LocationRoutePreference *pref, gboolean is_used) +{ + g_return_val_if_fail(pref, FALSE); + + pref->is_instruction_used = is_used; + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_traffic_data_used (LocationRoutePreference *pref, gboolean is_used) +{ + g_return_val_if_fail(pref, FALSE); + + pref->is_traffic_data_used = is_used; + + return TRUE; +} + +EXPORT_API gboolean +location_route_pref_set_property (LocationRoutePreference *pref, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail(pref, FALSE); + g_return_val_if_fail(key, FALSE); + + if (value) { + gchar *re_key = g_strdup(key); + gchar *re_val = g_strdup(value); + g_hash_table_insert (pref->properties, re_key, re_val); + } else g_hash_table_remove (pref->properties, key); + + return TRUE; +} + +EXPORT_API GList * +location_route_pref_get_addr_to_avoid (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->addr_to_avoid; +} + +EXPORT_API GList * +location_route_pref_get_area_to_avoid (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->area_to_avoid; +} + +EXPORT_API GList * +location_route_pref_get_feature_to_avoid (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->feature_to_avoid; +} + +EXPORT_API GList * +location_route_pref_get_freeformed_addr_to_avoid (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->freeformed_addr_to_avoid; +} + +EXPORT_API LocationBoundary * +location_route_pref_get_bounding_box (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->bbox; +} + +EXPORT_API guint +location_route_pref_get_max_result (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, 0); + + return pref->max_matches_count; +} + +EXPORT_API gchar * +location_route_pref_get_route_type (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->route_type; +} + +EXPORT_API gchar * +location_route_pref_get_transport_mode (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return pref->transport_mode; +} + +EXPORT_API gboolean +location_route_pref_get_geometry_used (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, FALSE); + + return pref->is_geometry_used; +} + +EXPORT_API gboolean +location_route_pref_get_instruction_bounding_box_used (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, FALSE); + + return pref->is_instruction_bounding_box_used; +} + +EXPORT_API gboolean +location_route_pref_get_instruction_geometry_used (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, FALSE); + + return pref->is_instruction_geometry_used; +} + +EXPORT_API gboolean +location_route_pref_get_instruction_used (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, FALSE); + + return pref->is_instruction_used; +} + +EXPORT_API gboolean +location_route_pref_get_traffic_data_used (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, FALSE); + + return pref->is_traffic_data_used; +} + +EXPORT_API GList* +location_route_pref_get_property_key (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + return g_hash_table_get_keys(pref->properties); +} + +EXPORT_API gpointer +location_route_pref_get_property (const LocationRoutePreference *pref, gconstpointer key) +{ + g_return_val_if_fail(pref, NULL); + g_return_val_if_fail(key, NULL); + + return g_hash_table_lookup(pref->properties, key); +} + +EXPORT_API LocationRoutePreference * +location_route_pref_new (void) +{ + LocationRoutePreference *pref = g_slice_new0(LocationRoutePreference); + g_return_val_if_fail (pref, NULL); + + pref->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + return pref; +} + +static void route_pref_property_copy_cb (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail(key); + g_return_if_fail(value); + g_return_if_fail(user_data); + + LocationRoutePreference *pref = (LocationRoutePreference *)user_data; + + if (pref->properties) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (pref->properties, re_key, re_val); + } +} + +EXPORT_API LocationRoutePreference * +location_route_pref_copy (const LocationRoutePreference *pref) +{ + g_return_val_if_fail(pref, NULL); + + LocationRoutePreference *new_pref = location_route_pref_new(); + g_return_val_if_fail (pref, NULL); + + location_route_pref_set_addr_to_avoid(new_pref, location_route_pref_get_addr_to_avoid (pref)); + location_route_pref_set_area_to_avoid(new_pref, location_route_pref_get_area_to_avoid (pref)); + location_route_pref_set_feature_to_avoid(new_pref, location_route_pref_get_feature_to_avoid (pref)); + location_route_pref_set_freeformed_addr_to_avoid(new_pref, location_route_pref_get_freeformed_addr_to_avoid (pref)); + location_route_pref_set_bounding_box(new_pref, location_route_pref_get_bounding_box (pref)); + location_route_pref_set_max_result(new_pref, location_route_pref_get_max_result (pref)); + location_route_pref_set_route_type(new_pref, location_route_pref_get_route_type (pref)); + location_route_pref_set_transport_mode(new_pref, location_route_pref_get_transport_mode (pref)); + location_route_pref_set_geometry_used(new_pref, location_route_pref_get_geometry_used (pref)); + location_route_pref_set_instruction_bounding_box_used(new_pref, location_route_pref_get_instruction_bounding_box_used (pref)); + location_route_pref_set_instruction_geometry_used(new_pref, location_route_pref_get_instruction_geometry_used (pref)); + location_route_pref_set_instruction_used(new_pref, location_route_pref_get_instruction_used (pref)); + location_route_pref_set_traffic_data_used(new_pref, location_route_pref_get_traffic_data_used (pref)); + location_route_pref_set_traffic_data_used(new_pref, location_route_pref_get_traffic_data_used (pref)); + + if (new_pref->properties) g_hash_table_foreach (pref->properties, route_pref_property_copy_cb, new_pref); + + return new_pref; +} + + +EXPORT_API void +location_route_pref_free (LocationRoutePreference *pref) +{ + g_return_if_fail(pref); + + location_route_pref_set_addr_to_avoid(pref, NULL); + location_route_pref_set_area_to_avoid(pref, NULL); + location_route_pref_set_feature_to_avoid(pref, NULL); + location_route_pref_set_freeformed_addr_to_avoid(pref, NULL); + location_route_pref_set_bounding_box(pref, NULL); + location_route_pref_set_route_type(pref, NULL); + location_route_pref_set_transport_mode(pref, NULL); + + if (pref->properties) { + g_hash_table_destroy (pref->properties); + pref->properties = NULL; + } + + g_slice_free (LocationRoutePreference, pref); +} + +/* for expandability +EXPORT_API gint +location_route_get_req_id (const LocationRoute *route) +{ + g_return_val_if_fail(route, 0); + + return route->req_id; +} +*/ + +EXPORT_API LocationPosition * +location_route_get_origin (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + + return route->origin; +} + +EXPORT_API LocationPosition * +location_route_get_destination (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + + return route->destination; +} + +EXPORT_API LocationBoundary * +location_route_get_bounding_box (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + + return route->bbox; +} + +EXPORT_API gdouble +location_route_get_total_distance (const LocationRoute *route) +{ + g_return_val_if_fail(route, 0.0); + + return route->total_distance; +} + +EXPORT_API gchar * +location_route_get_distance_unit (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + + return route->distance_unit; +} + +EXPORT_API glong +location_route_get_total_duration (const LocationRoute *route) +{ + g_return_val_if_fail(route, 0); + + return route->total_duration; +} + +EXPORT_API GList * +location_route_get_property_key (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + + return g_hash_table_get_keys(route->properties); +} + +EXPORT_API gpointer +location_route_get_property (const LocationRoute *route, gconstpointer key) +{ + g_return_val_if_fail(route, NULL); + g_return_val_if_fail(key, NULL); + + return g_hash_table_lookup(route->properties, key); +} + +EXPORT_API GList * +location_route_get_route_segment (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + + return route->segment; +} + +/* for expandability +EXPORT_API gboolean +location_route_set_req_id (LocationRoute *route, gint req_id) +{ + g_return_val_if_fail(route, FALSE); + + route->req_id = req_id; + + return TRUE; +} +*/ + +EXPORT_API gboolean +location_route_set_origin (LocationRoute *route, const LocationPosition* origin) +{ + g_return_val_if_fail(route, FALSE); + + if (route->origin) { + location_position_free(route->origin); + route->origin = NULL; + } + + if (origin) route->origin = location_position_copy(origin); + + return TRUE; +} + +EXPORT_API gboolean +location_route_set_destination (LocationRoute *route, const LocationPosition* destination) +{ + g_return_val_if_fail(route, FALSE); + + if (route->destination) { + location_position_free(route->destination); + route->destination = NULL; + } + + if (destination) route->destination = location_position_copy(destination); + + return TRUE; +} + +EXPORT_API gboolean +location_route_set_bounding_box (LocationRoute *route, const LocationBoundary* bbox) +{ + g_return_val_if_fail(route, FALSE); + + if (route->bbox) { + location_boundary_free(route->bbox); + route->bbox = NULL; + } + + if (bbox) route->bbox = location_boundary_copy(bbox); + + return TRUE; +} + +EXPORT_API +gboolean location_route_set_total_distance (LocationRoute *route, gdouble total_distance) +{ + g_return_val_if_fail(route, FALSE); + + route->total_distance = total_distance; + + return TRUE; +} + +EXPORT_API +gboolean location_route_set_distance_unit (LocationRoute *route, const gchar* distance_unit) +{ + g_return_val_if_fail(route, FALSE); + + if (route->distance_unit) { + g_free(route->distance_unit); + route->distance_unit = NULL; + } + + if (distance_unit) route->distance_unit = g_strdup(distance_unit); + + return TRUE; +} + +EXPORT_API gboolean +location_route_set_total_duration (LocationRoute *route, glong total_duration) +{ + g_return_val_if_fail(route, FALSE); + + route->total_duration = total_duration; + + return TRUE; +} + +EXPORT_API gboolean +location_route_set_property (LocationRoute *route, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail(route, FALSE); + g_return_val_if_fail(key, FALSE); + if (!route->properties) return FALSE; + + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert(route->properties, re_key, re_val); + } else g_hash_table_remove (route->properties, key); + + return TRUE; +} + +static void route_segment_foreach_copy (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + + LocationRouteSegment *segment = (LocationRouteSegment *) data; + LocationRoute *route = (LocationRoute *) user_data; + + route->segment = g_list_append (route->segment, location_route_segment_copy (segment)); +} + +static void route_segment_foreach_free (gpointer data) +{ + g_return_if_fail (data); + + LocationRouteSegment *segment = (LocationRouteSegment *)data; + + location_route_segment_free(segment); +} + + +EXPORT_API gboolean +location_route_set_route_segment (LocationRoute *route, GList* segment) +{ + g_return_val_if_fail(route, FALSE); + + if (route->segment) { + g_list_free_full (route->segment, route_segment_foreach_free); + route->segment = NULL; + } + + if (segment) g_list_foreach (segment, route_segment_foreach_copy, route); + + return TRUE; +} + +EXPORT_API LocationRoute * +location_route_new (void) +{ + LocationRoute *route = g_slice_new0(LocationRoute); + g_return_val_if_fail (route, NULL); + + route->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return route; +} + +static void route_property_copy_cb (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail (key); + g_return_if_fail (value); + g_return_if_fail (user_data); + + LocationRoute *route = (LocationRoute *)user_data; + + if (route->properties) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (route->properties, re_key, re_val); + } +} + +EXPORT_API LocationRoute * +location_route_copy (const LocationRoute *route) +{ + g_return_val_if_fail(route, NULL); + LocationRoute *new_route = location_route_new(); + g_return_val_if_fail(new_route, NULL); + + location_route_set_origin (new_route, location_route_get_origin(route)); + location_route_set_destination (new_route, location_route_get_destination(route)); + location_route_set_bounding_box (new_route, location_route_get_bounding_box(route)); + location_route_set_total_distance (new_route, location_route_get_total_distance(route)); + location_route_set_distance_unit (new_route, location_route_get_distance_unit(route)); + location_route_set_total_duration (new_route, location_route_get_total_duration(route)); + + g_list_foreach(route->segment, route_segment_foreach_copy, new_route); + + if (route->properties) g_hash_table_foreach (route->properties, route_property_copy_cb, new_route); + + return new_route; +} + +EXPORT_API void +location_route_free (LocationRoute *route) +{ + g_return_if_fail (route); + + location_route_set_origin (route, NULL); + location_route_set_destination (route, NULL); + location_route_set_bounding_box (route, NULL); + location_route_set_distance_unit (route, NULL); + location_route_set_route_segment (route, NULL); + + if (route->properties) { + g_hash_table_destroy (route->properties); + route->properties = NULL; + } + + g_slice_free (LocationRoute, route); +} + +EXPORT_API LocationPosition * +location_route_segment_get_start_point (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, NULL); + + return segment->start; +} + +EXPORT_API LocationPosition * +location_route_segment_get_end_point (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, NULL); + + return segment->end; +} + +EXPORT_API LocationBoundary * +location_route_segment_get_bounding_box (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, NULL); + + return segment->bbox; +} + +EXPORT_API gdouble +location_route_segment_get_distance (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, 0.0); + + return segment->distance; +} + +EXPORT_API glong +location_route_segment_get_duration (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, 0); + + return segment->duration; +} + +EXPORT_API GList* +location_route_segment_get_property_key (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, NULL); + + return g_hash_table_get_keys(segment->properties); +} + +EXPORT_API gpointer +location_route_segment_get_property (const LocationRouteSegment *segment, gconstpointer key) +{ + g_return_val_if_fail(segment, NULL); + g_return_val_if_fail(key, NULL); + + return g_hash_table_lookup(segment->properties, (gpointer) key); +} + +EXPORT_API GList* +location_route_segment_get_route_step (const LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, NULL); + + return segment->step; +} + +EXPORT_API gboolean +location_route_segment_set_start_point (LocationRouteSegment *segment, const LocationPosition *start) +{ + g_return_val_if_fail (segment, FALSE); + + if (segment->start) { + location_position_free(segment->start); + segment->start = NULL; + } + + if (start) segment->start = location_position_copy (start); + + return TRUE; +} + +EXPORT_API gboolean +location_route_segment_set_end_point (LocationRouteSegment *segment, const LocationPosition *end) +{ + g_return_val_if_fail (segment, FALSE); + + if (segment->end) { + location_position_free(segment->end); + segment->end = NULL; + } + + if (end) segment->end = location_position_copy (end); + + return TRUE; + +} + +EXPORT_API gboolean +location_route_segment_set_bounding_box (LocationRouteSegment *segment, const LocationBoundary *bbox) +{ + g_return_val_if_fail (segment, FALSE); + + if (segment->bbox) { + location_boundary_free(segment->bbox); + segment->bbox = NULL; + } + + if (bbox) segment->bbox = location_boundary_copy (bbox); + + return TRUE; +} + +EXPORT_API gboolean +location_route_segment_set_distance (LocationRouteSegment *segment, gdouble distance) +{ + g_return_val_if_fail (segment, FALSE); + + segment->distance = distance; + + return TRUE; +} + +EXPORT_API gboolean +location_route_segment_set_duration (LocationRouteSegment *segment, glong duration) +{ + g_return_val_if_fail (segment, FALSE); + + segment->duration = duration; + + return TRUE; +} + +EXPORT_API gboolean +location_route_segment_set_property (LocationRouteSegment *segment, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail (segment, FALSE); + g_return_val_if_fail (key, FALSE); + if (!segment->properties) return FALSE; + + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert(segment->properties, re_key, re_val); + } else g_hash_table_remove (segment->properties, key); + + return TRUE; +} + +static void route_step_foreach_free (gpointer data) +{ + g_return_if_fail (data); + + LocationRouteStep *step = (LocationRouteStep *) data; + + location_route_step_free(step); +} + +static void route_step_foreach_copy (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + g_return_if_fail (user_data); + + LocationRouteStep *step = (LocationRouteStep *) data; + LocationRouteSegment *segment = (LocationRouteSegment *) user_data; + + LocationRouteStep *step_new = location_route_step_copy(step); + segment->step = g_list_append(segment->step, step_new); + +} + +EXPORT_API gboolean +location_route_segment_set_route_step (LocationRouteSegment *segment, GList* step) +{ + g_return_val_if_fail (segment, FALSE); + + if (segment->step) { + g_list_free_full (segment->step, route_step_foreach_free); + segment->step = NULL; + } + + if (step) g_list_foreach (step, route_step_foreach_copy, segment); + + return TRUE; + +} + +EXPORT_API LocationRouteSegment * +location_route_segment_new (void) +{ + LocationRouteSegment *segment = g_slice_new0 (LocationRouteSegment); + g_return_val_if_fail (segment, NULL); + + segment->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return segment; +} + +static void segment_property_copy_cb (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail (key); + g_return_if_fail (value); + g_return_if_fail (user_data); + + LocationRouteSegment *segment = (LocationRouteSegment *)user_data; + + if (segment->properties) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (segment->properties, re_key, re_val); + } +} + +EXPORT_API LocationRouteSegment * +location_route_segment_copy (LocationRouteSegment *segment) +{ + g_return_val_if_fail(segment, NULL); + + LocationRouteSegment *new_segment = location_route_segment_new(); + g_return_val_if_fail(new_segment, NULL); + + location_route_segment_set_start_point(new_segment, location_route_segment_get_start_point(segment)); + location_route_segment_set_end_point(new_segment, location_route_segment_get_end_point(segment)); + location_route_segment_set_bounding_box(new_segment, location_route_segment_get_bounding_box(segment)); + location_route_segment_set_distance(new_segment, location_route_segment_get_distance(segment)); + location_route_segment_set_duration(new_segment, location_route_segment_get_duration(segment)); + location_route_segment_set_route_step(new_segment, location_route_segment_get_route_step(segment)); + + if (segment->properties) g_hash_table_foreach (segment->properties, segment_property_copy_cb, new_segment); + + return new_segment; +} + +EXPORT_API void +location_route_segment_free (LocationRouteSegment *segment) +{ + g_return_if_fail(segment); + + location_route_segment_set_start_point(segment, NULL); + location_route_segment_set_end_point(segment, NULL); + location_route_segment_set_bounding_box(segment, NULL); + location_route_segment_set_distance(segment, 0.0); + location_route_segment_set_duration(segment, 0); + location_route_segment_set_route_step(segment, NULL); + + if (segment->properties) { + g_hash_table_destroy (segment->properties); + segment->properties = NULL; + } + + g_slice_free(LocationRouteSegment, segment); +} + +EXPORT_API LocationPosition* +location_route_step_get_start_point (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return step->start; +} + +EXPORT_API LocationPosition* +location_route_step_get_end_point (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return step->end; +} + +EXPORT_API LocationBoundary* +location_route_step_get_bounding_box (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return step->bbox; +} + +EXPORT_API gdouble +location_route_step_get_distance (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, 0.0); + + return step->distance; +} + +EXPORT_API glong +location_route_step_get_duration (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, 0); + + return step->duration; +} + +EXPORT_API gchar* +location_route_step_get_transport_mode (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return step->transport_mode; +} + +EXPORT_API gchar* +location_route_step_get_instruction (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return step->instruction; +} + +EXPORT_API GList * +location_route_step_get_geometry (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return step->geometry; +} + +EXPORT_API GList* +location_route_step_get_property_key (const LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + return g_hash_table_get_keys (step->properties); +} + +EXPORT_API gpointer +location_route_step_get_property (const LocationRouteStep *step, gconstpointer key) +{ + g_return_val_if_fail(step, NULL); + g_return_val_if_fail(key, NULL); + + return g_hash_table_lookup (step->properties, key); +} + +EXPORT_API gboolean +location_route_step_set_start_point (LocationRouteStep *step, const LocationPosition *start) +{ + g_return_val_if_fail (step, FALSE); + + if (step->start) { + location_position_free (step->start); + step->start = NULL; + } + + if (start) step->start = location_position_copy (start); + + return TRUE; +} + +EXPORT_API gboolean +location_route_step_set_end_point (LocationRouteStep *step, const LocationPosition *end) +{ + g_return_val_if_fail (step, FALSE); + + if (step->end) { + location_position_free (step->end); + step->end = NULL; + } + + if (end) step->end = location_position_copy (end); + + return TRUE; +} + +EXPORT_API gboolean +location_route_step_set_bounding_box (LocationRouteStep *step, const LocationBoundary *bbox) +{ + g_return_val_if_fail (step, FALSE); + + if (step->bbox) { + location_boundary_free (step->bbox); + step->bbox = NULL; + } + + if (bbox) step->bbox = location_boundary_copy (bbox); + + return TRUE; +} + +EXPORT_API gboolean +location_route_step_set_distance (LocationRouteStep *step, gdouble distance) +{ + g_return_val_if_fail (step, FALSE); + + step->distance = distance; + + return TRUE; + +} + +EXPORT_API gboolean +location_route_step_set_duration (LocationRouteStep *step, glong duration) +{ + g_return_val_if_fail (step, FALSE); + + step->duration = duration; + + return TRUE; +} + +EXPORT_API gboolean +location_route_step_set_transport_mode (LocationRouteStep *step, const gchar *transport_mode) +{ + g_return_val_if_fail (step, FALSE); + + if (step->transport_mode) { + g_free(step->transport_mode); + step->transport_mode = NULL; + } + + if (transport_mode) step->transport_mode = g_strdup(transport_mode); + + return TRUE; + +} + +EXPORT_API gboolean +location_route_step_set_instruction (LocationRouteStep *step, const gchar *instruction) +{ + g_return_val_if_fail (step, FALSE); + + if (step->instruction) { + g_free(step->instruction); + step->instruction = NULL; + } + + if (instruction) step->instruction = g_strdup(instruction); + + return TRUE; + +} + +static void route_step_geometry_foreach_copy (gpointer data, gpointer user_data) +{ + g_return_if_fail (data); + g_return_if_fail (user_data); + + LocationPosition *pos = (LocationPosition *)data; + LocationRouteStep *step = (LocationRouteStep *)user_data; + + step->geometry = g_list_append (step->geometry, location_position_copy (pos)); +} + +static void route_step_geometry_free (gpointer data) +{ + g_return_if_fail (data); + + LocationPosition *pos = (LocationPosition *)data; + + location_position_free(pos); +} + +EXPORT_API gboolean +location_route_step_set_geometry (LocationRouteStep *step, GList *geometry) +{ + g_return_val_if_fail (step, FALSE); + + if (step->geometry) { + g_list_free_full (step->geometry, route_step_geometry_free); + step->geometry = NULL; + } + + if (geometry) g_list_foreach (geometry, route_step_foreach_copy, step); + + return TRUE; + +} + +EXPORT_API gboolean +location_route_step_set_property (LocationRouteStep *step, gconstpointer key, gconstpointer value) +{ + g_return_val_if_fail(step, FALSE); + g_return_val_if_fail(key, FALSE); + + if (!step->properties) return FALSE; + + if (value) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (step->properties, re_key, re_val); + } + else g_hash_table_remove (step->properties, key); + + return TRUE; +} + +EXPORT_API LocationRouteStep * +location_route_step_new (void) +{ + LocationRouteStep *step = g_slice_new0 (LocationRouteStep); + g_return_val_if_fail(step, NULL); + + step->properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + return step; +} + +static void step_property_copy_cb (gpointer key, gpointer value, gpointer user_data) +{ + g_return_if_fail (key); + g_return_if_fail (value); + g_return_if_fail (user_data); + + LocationRouteStep *step = (LocationRouteStep *) user_data; + + if (step->properties) { + gchar *re_key = g_strdup (key); + gchar *re_val = g_strdup (value); + g_hash_table_insert (step->properties, re_key, re_val); + } +} + + +EXPORT_API LocationRouteStep * +location_route_step_copy (LocationRouteStep *step) +{ + g_return_val_if_fail(step, NULL); + + LocationRouteStep *new_step = location_route_step_new (); + g_return_val_if_fail (new_step, NULL); + + location_route_step_set_start_point (new_step, location_route_step_get_start_point(step)); + location_route_step_set_end_point (new_step, location_route_step_get_end_point(step)); + location_route_step_set_bounding_box (new_step, location_route_step_get_bounding_box(step)); + location_route_step_set_distance (new_step, location_route_step_get_distance(step)); + location_route_step_set_duration (new_step, location_route_step_get_duration(step)); + location_route_step_set_instruction (new_step, location_route_step_get_instruction(step)); + location_route_step_set_geometry (new_step, location_route_step_get_geometry(step)); + + if (step->properties) g_hash_table_foreach (step->properties, step_property_copy_cb, new_step); + return new_step; +} + +EXPORT_API void +location_route_step_free (LocationRouteStep *step) +{ + g_return_if_fail(step); + + location_route_step_set_start_point (step, NULL); + location_route_step_set_end_point (step, NULL); + location_route_step_set_bounding_box (step, NULL); + location_route_step_set_distance (step, 0.0); + location_route_step_set_duration (step, 0); + location_route_step_set_instruction (step, NULL); + location_route_step_set_geometry (step, NULL); + + if (step->properties) { + g_hash_table_destroy (step->properties); + step->properties = NULL; + } + g_slice_free(LocationRouteStep, step); +} diff --git a/location/map-service/location-route.h b/location/map-service/location-route.h new file mode 100644 index 0000000..8bd8fa7 --- /dev/null +++ b/location/map-service/location-route.h @@ -0,0 +1,873 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCATION_ROUTE_H__ +#define __LOCATION_ROUTE_H__ + +#include + +G_BEGIN_DECLS + +/** + * @file location-route.h + * @brief This file contains the internal definitions and structures related to Route. + */ + +/** + * @addtogroup LocationMapService + * @{ + * @defgroup LocationMapServiceRoute Location Route + * @brief This is a Location Route for providing location map services. + * @addtogroup LocationMapServiceRoute + * @{ + */ + +/** + * @brief Create a new Location route preference + * @remarks None. + * @pre #location_init should be called before.\n + * @post None. + * @return a #LocationRoutePreference + * @retval NULL if error occured + * @see location_route_pref_free + */ +LocationRoutePreference *location_route_pref_new (void); + +/** + * @brief Copy Location route preference + * @remarks None. + * @pre #location_init should be called before.\n + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return a new #LocationRoutePreference + * @retval NULL if error occured + */ +LocationRoutePreference *location_route_pref_copy (const LocationRoutePreference *pref); + +/** + * @brief Free Location route preference + * @remarks None. + * @pre #location_init should be called before.\n + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @see location_route_pref_new + * @return None + * @retval None + */ +void location_route_pref_free (LocationRoutePreference * pref); + +/** + * @brief Get a list of address structures to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return GList + * @retval list of #LocationAddress + * @see location_route_pref_set_addr_to_avoid + */ +GList *location_route_pref_get_addr_to_avoid (const LocationRoutePreference *pref); + +/** + * @brief Get a list of area to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return GList + * @retval list of #LocationBoundary + * @see location_route_pref_set_area_to_avoid + */ +GList *location_route_pref_get_area_to_avoid (const LocationRoutePreference *pref); + +/** + * @brief Get a list of features to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return GList + * @retval list of gchar + * @see location_route_pref_set_feature_to_avoid + */ +GList *location_route_pref_get_feature_to_avoid (const LocationRoutePreference *pref); + +/** + * @brief Get a list of freeformed address to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return GList + * @retval list of gchar + * @see location_route_pref_set_freeformed_to_avoid + */ +GList *location_route_pref_get_freeformed_addr_to_avoid (const LocationRoutePreference *pref); + +/** + * @brief Get a list of bounding box to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return #LocationBoundary + * @retval bounding box + * @see location_route_pref_set_addr_to_avoid + */ +LocationBoundary *location_route_pref_get_bounding_box (const LocationRoutePreference *pref); + +/** + * @brief Get a maximum number of matches returned from route service provider + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return guint + * @retval maximum number of matches + * @see location_route_pref_set_max_result + */ +guint location_route_pref_get_max_result (const LocationRoutePreference *pref); + +/** + * @brief Get a route type to be used in route service + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gchar + * @retval route type + * @see location_route_pref_set_route_type + */ +gchar *location_route_pref_get_route_type (const LocationRoutePreference *pref); + +/** + * @brief Get a transport mode to be used in route service + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gchar + * @retval transport mode + * @see location_route_pref_set_transport_mode + */ +gchar *location_route_pref_get_transport_mode (const LocationRoutePreference *pref); + +/** + * @brief Get whether the route service provider must provide the route geometry in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gboolean + * @retval TRUE if used + * @see location_route_pref_set_geometry_used + */ +gboolean location_route_pref_get_geometry_used (const LocationRoutePreference *pref); +/** + * @brief Get whether the route service provider must provide the route instruction bounding box in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gboolean + * @retval TRUE if used + * @see location_route_pref_set_instruction_bounding_box_used + */ +gboolean location_route_pref_get_instruction_bounding_box_used (const LocationRoutePreference *pref); +/** + * @brief Get whether the route service provider must provide the route geometry in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gboolean + * @retval TRUE if used + * @see location_route_pref_set_instruction_geometry_used + */ +gboolean location_route_pref_get_instruction_geometry_used (const LocationRoutePreference *pref); + +/** + * @brief Get whether the route service provider must provide the route instruction in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gboolean + * @retval TRUE if used + * @see location_route_pref_set_instruction_used + */ +gboolean location_route_pref_get_instruction_used (const LocationRoutePreference *pref); +/** + * @brief Get whether the route service provider must provide traffic data in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return gboolean + * @retval TRUE if used + * @see location_route_pref_set_traffic_data_used + */ +gboolean location_route_pref_get_traffic_data_used (const LocationRoutePreference *pref); +/** + * @brief Get a list of Property Keys in #LocationRoutePreference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return GList + * @retval list of property key + */ +GList *location_route_pref_get_property_key (const LocationRoutePreference *pref); +/** + * @brief Get Property value in #LocationRoutePreference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @return GList + * @retval property value + * @see location_route_pref_set_property + */ +gpointer location_route_pref_get_property (const LocationRoutePreference *pref, gconstpointer key); + +/** + * @brief Set a list of address structures to be avoided in #LocationRoutePreference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] addr - a list of #LocationAddress + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_addr_to_avoid + */ +gboolean location_route_pref_set_addr_to_avoid (LocationRoutePreference * pref, GList *addr); + +/** + * @brief Set a list of area to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] area - a list of #LocationBoundary + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_area_to_avoid + */ +gboolean location_route_pref_set_area_to_avoid (LocationRoutePreference * pref, GList *area); + +/** + * @brief Set a list of features to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] feature - a list of features + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_feature_to_avoid + */ +gboolean location_route_pref_set_feature_to_avoid (LocationRoutePreference * pref, GList * feature); + +/** + * @brief Set a list of freeformed address to be avoided in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] addr - a list of #gchar + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_freeformed_addr_to_avoid + */ +gboolean location_route_pref_set_freeformed_addr_to_avoid (LocationRoutePreference *pref, GList * freeformed_addr); + +/** + * @brief Set a bounding box #LocationBoundary in Location route preference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] bbox - a #LocationBoundary + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_bounding_box + */ +gboolean location_route_pref_set_bounding_box (LocationRoutePreference *pref, const LocationBoundary *boundary); + +/** + * @brief Set a maximum number of matches returned from route service provider + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] max_num - a #gint + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_set_max_result + */ +gboolean location_route_pref_set_max_result (LocationRoutePreference *pref, guint max_num); + +/** + * @brief Set a route type to be used in route service + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] type - a #gchar + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_route_type + */ +gboolean location_route_pref_set_route_type (LocationRoutePreference *pref, const gchar *type); + +/** + * @brief Set a transport mode to be used in route service + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] mode - a #gchar + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_transport_mode + */ +gboolean location_route_pref_set_transport_mode (LocationRoutePreference *pref, const gchar * mode); + +/** + * @brief Set whether the route service provider must provide the route geometry in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] is_used - a #gboolean + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_geometry_used + */ +gboolean location_route_pref_set_geometry_used (LocationRoutePreference *pref, gboolean is_used); + +/** + * @brief Set whether the route service provider must provide the route instruction bounding box in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] is_used - a #gboolean + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_instruction_bounding_box_used + */ +gboolean location_route_pref_set_instruction_bounding_box_used (LocationRoutePreference *pref, gboolean is_used); + +/** + * @brief Set whether the route service provider must provide the route geometry in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] is_used - a #gboolean + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_instruction_geometry_used + */ +gboolean location_route_pref_set_instruction_geometry_used (LocationRoutePreference *pref, gboolean is_used); + +/** + * @brief Set whether the route service provider must provide the route instruction in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] is_used - a #gboolean + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_instruction_used + */ +gboolean location_route_pref_set_instruction_used (LocationRoutePreference *pref, gboolean is_used); + +/** + * @brief Set whether the route service provider must provide traffic data in the service requests + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] is_used - a #gboolean + * @return #gboolean + * @retval TRUE if success + * @see location_route_pref_get_traffic_data_used + */ +gboolean location_route_pref_set_traffic_data_used (LocationRoutePreference *pref, gboolean is_used); + +/** + * @brief Set Property in Location route proference + * @remarks The service provider should support route service. + * @pre #location_route_pref_new should be called before. + * @post None. + * @param [in] pref - a #LocationRoutePreference + * @param [in] key - a #gconstpointer + * @param [in] value - a #gconstpointer + * @return gboolean + * @retval TRUE if success + * @see location_route_pref_get_property + */ +gboolean location_route_pref_set_property (LocationRoutePreference *pref, gconstpointer key, gconstpointer value); + +/** + * @defgroup LocationMapServiceRouteResult Location Route Result + * @brief This provides structure, enumeration and APIs for Route Result + * @addtogroup LocationMapServiceRouteResult + * @{ + */ +/** + * @brief Create a new Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @return #LocationRoute + * @retval a new location route + * @see location_route_free + */ +LocationRoute *location_route_new (void); +/** + * @brief Copy Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return #LocationRoute + * @retval a copied location route + */ +LocationRoute *location_route_copy (const LocationRoute *route); + +/** + * @brief Free #LocationRoute + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return void + * @retval None + */ +void location_route_free (LocationRoute *route); + +/** + * @brief Get the origin of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return #Location position + * @retval origin + * @see location_route_set_origin + */ +LocationPosition *location_route_get_origin (const LocationRoute *route); + +/** + * @brief Get the destination of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return #LocationPosition + * @retval destination + * @see location_route_set_destination + */ +LocationPosition *location_route_get_destination (const LocationRoute *route); + +/** + * @brief Get the bounding box of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return #LocationBoundary + * @retval bounding box + * @see location_route_set_bounding box + */ +LocationBoundary *location_route_get_bounding_box (const LocationRoute *route); + +/** + * @brief Get the total distance of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return gdouble + * @retval total distance + * @see location_route_set_total_distance + */ +gdouble location_route_get_total_distance (const LocationRoute *route); + +/** + * @brief Get the distance unit of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return gchar + * @retval distance unit + * @see location_route_set_distance_unit + */ +gchar *location_route_get_distance_unit (const LocationRoute *route); + +/** + * @brief Get the total duration of location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return glong + * @retval total duration + * @see location_route_set_total_duration + */ +glong location_route_get_total_duration (const LocationRoute *route); + +/** + * @brief Get the list of property key of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return GList + * @retval list of property keys + * @see location_route_set_property + */ +GList *location_route_get_property_key (const LocationRoute *route); + +/** + * @brief Get the property value of Location route + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] route - a #LocationRoute + * @return gconstpointer + * @retval property + * @see location_route_set_property + */ +gpointer location_route_get_property (const LocationRoute *route, gconstpointer key); + +/** + * @brief Get the list of segments in Location route + * @remarks The service provider should support route service. + * @post None. + * @pre None. + * @param [in] route - a #LocationRoute + * @return GList + * @retval list of #LocationRouteSegment + * @see location_route_set_route_segment + */ +GList *location_route_get_route_segment (const LocationRoute *route); + +/** + * @brief Create a new Location route segment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @return #LocationPositionSegment + * @retval Location route segment + * @see location_route_segment_free + */ +LocationRouteSegment *location_route_segment_new (void); + +/** + * @brief Copy Location route segment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return #LocationRouteSegment + * @retval copied Location route segment + */ +LocationRouteSegment *location_route_segment_copy (LocationRouteSegment *segment); + +/** + * @brief Free Location route segment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_new + */ +void location_route_segment_free (LocationRouteSegment *segment); + +/** + * @brief Get the start point #LocationPosition of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_start_point + */ +LocationPosition *location_route_segment_get_start_point (const LocationRouteSegment *segment); + +/** + * @brief Get the end point #LocationPosition of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_end_point + */ +LocationPosition *location_route_segment_get_end_point (const LocationRouteSegment *segment); + +/** + * @brief Get the bounding box #LocationBoundary of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_bounding_box + */ +LocationBoundary *location_route_segment_get_bounding_box (const LocationRouteSegment *segment); + +/** + * @brief Get the distance of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_distance + */ +gdouble location_route_segment_get_distance (const LocationRouteSegment *segment); + +/** + * @brief Get the duration #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_duration + */ +glong location_route_segment_get_duration (const LocationRouteSegment *segment); + +/** + * @brief Get the list of property keys of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_property_key + */ +GList *location_route_segment_get_property_key (const LocationRouteSegment *segment); + +/** + * @brief Get the property value of #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_property + */ +gpointer location_route_segment_get_property (const LocationRouteSegment *segment, gconstpointer key); + +/** + * @brief Get the list of route steps #LocationRouteStep in #LocationRouteSegment + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] segment - a #LocationRouteSegment + * @return void + * @retval None. + * @see location_route_segment_set_route_step + */ +GList *location_route_segment_get_route_step (const LocationRouteSegment *segment); + +/** + * @brief Create a new #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param None. + * @return #LocationRouteStep + * @retval route step + * @see location_route_step_free + */ +LocationRouteStep *location_route_step_new (void); + +/** + * @brief Copy #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return #LocationRouteStep + * @retval route step + * @see location_route_step_new + */ +LocationRouteStep *location_route_step_copy (LocationRouteStep *step); + +/** + * @brief Free #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return void + * @retval None + * @see location_route_step_new + */ +void location_route_step_free (LocationRouteStep *step); + +/** + * @brief Get the start point #LocationPosition of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return #LocationPosition + * @retval start point + * @see location_route_step_set_start_point + */ +LocationPosition *location_route_step_get_start_point (const LocationRouteStep *step); + +/** + * @brief Get the end point #LocationPosition of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return #LocationPosition + * @retval end point + * @see location_route_step_set_end_point + */ +LocationPosition *location_route_step_get_end_point (const LocationRouteStep *step); + +/** + * @brief Get the bounding box #LocationBoundary of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return #LocationBoundary + * @retval bounding box + * @see location_route_step_set_bounding_box + */ +LocationBoundary *location_route_step_get_bounding_box (const LocationRouteStep *step); + +/** + * @brief Get the distance of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return gboolean + * @retval distance + * @see location_route_step_set_distance + */ +gdouble location_route_step_get_distance (const LocationRouteStep *step); + +/** + * @brief Get the duration of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return glong + * @retval duration + * @see location_route_step_set_duration + */ +glong location_route_step_get_duration (const LocationRouteStep *step); + +/** + * @brief Get the transport mode of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return gchar + * @retval transport mode + * @see location_route_step_set_transport_mode + */ +gchar *location_route_step_get_transport_mode (const LocationRouteStep *step); + +/** + * @brief Get the instruction of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return gchar + * @retval instruction + * @see location_route_step_set_instruction + */ +gchar *location_route_step_get_instruction (const LocationRouteStep *step); + +/** + * @brief Get the list of geometry #LocationPosition of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return GList + * @retval a list of LocationPosition + * @see location_route_step_set_geometry + */ +GList *location_route_step_get_geometry (const LocationRouteStep *step); + +/** + * @brief Get the list of property key of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @return GList + * @retval a list of property key + * @see location_route_step_set_property_key + */ +GList *location_route_step_get_property_key (const LocationRouteStep *step); + +/** + * @brief Get the property value of #LocationRouteStep + * @remarks The service provider should support route service. + * @pre None. + * @post None. + * @param [in] step - a #LocationRouteStep + * @param [in] key - a gconstpointer + * @return gpointer + * @retval value + * @see location_route_step_set_property + */ +gpointer location_route_step_get_property (const LocationRouteStep *step, gconstpointer key); + +/** + * @} @} @} + */ + +G_END_DECLS + +#endif diff --git a/location/map-service/map-internal.c b/location/map-service/map-internal.c new file mode 100644 index 0000000..0fcc499 --- /dev/null +++ b/location/map-service/map-internal.c @@ -0,0 +1,235 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "location-log.h" +#include "location-types.h" +#include "module-internal.h" +#include "location-route.h" +#include "location-ielement.h" +#include "map-service.h" + +int +map_service_get_geocode (LocationIElement *self, + const LocationAddress *address, + GList **position_list, + GList **accuracy_list) +{ + LOCATION_LOGD("map_service_get_geocode"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_geocode, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.get_geocode)(priv->mod->handler, address, position_list, accuracy_list); +} + +int +map_service_get_geocode_freeform (LocationIElement *self, + const gchar *address, + GList **position_list, + GList **accuracy_list) +{ + LOCATION_LOGD("map_service_get_geocode_freeform"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_geocode_freetext, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.get_geocode_freetext)(priv->mod->handler, address, position_list, accuracy_list); +} + +int +map_service_get_reversegeocode (LocationIElement *self, + const LocationPosition *position, + LocationAddress **address, + LocationAccuracy **accuracy) +{ + LOCATION_LOGD("map_service_get_reversegeocode"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_reverse_geocode, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.get_reverse_geocode)(priv->mod->handler, position, address, accuracy); +} + +int +map_service_get_geocode_async (LocationIElement *self, + LocationAddress *address, + LocationPositionCB callback, + gpointer userdata) +{ + LOCATION_LOGD("map_service_get_geocode_async"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_geocode_async, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.get_geocode_async)(priv->mod->handler, address, callback, userdata); +} + +int +map_service_get_geocode_freeform_async (LocationIElement *self, + const gchar *address, + LocationPositionCB callback, + gpointer userdata) +{ + LOCATION_LOGD("map_service_get_geocode_freeform_async"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_geocode_freetext_async, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.get_geocode_freetext_async)(priv->mod->handler, address, callback, userdata); +} + +int +map_service_get_reversegeocode_async (LocationIElement *self, + const LocationPosition *position, + LocationAddressCB callback, + gpointer userdata) +{ + LOCATION_LOGD("map_service_get_reversegeocode_async"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_reverse_geocode_async, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.get_reverse_geocode_async)(priv->mod->handler, position, callback, userdata); +} + +int +map_service_search_poi (LocationIElement *self, + const LocationPOIFilter *filter, const LocationPosition *position, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint *req_id) +{ + LOCATION_LOGD("map_service_search_poi"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.search_poi, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.search_poi)(priv->mod->handler, filter, position, svc_pref, pref, cb, user_data, req_id); +} + +int +map_service_search_poi_by_area (LocationIElement *self, + const LocationPOIFilter * filter, const LocationBoundary *boundary, + const LocationPreference *svc_pref, const LocationPOIPreference * pref, + LocationPOICB cb, const gpointer user_data, guint *req_id) +{ + LOCATION_LOGD("map_service_search_poi_by_area"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.search_poi_by_area, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.search_poi_by_area)(priv->mod->handler, filter, boundary, svc_pref, pref, cb, user_data, req_id); +} + +int +map_service_search_poi_by_address (LocationIElement *self, + const LocationPOIFilter *filter, const LocationAddress *address, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint *req_id) +{ + LOCATION_LOGD("map_service_search_poi_by_address"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.search_poi_by_address, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.search_poi_by_address)(priv->mod->handler, filter, address, svc_pref, pref, cb, user_data, req_id); +} + +int +map_service_search_poi_by_freeform (LocationIElement *self, + const LocationPOIFilter *filter, const gchar *freeform, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint *req_id) +{ + LOCATION_LOGD("map_service_search_poi_by_freeform"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.search_poi_by_freeform, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.search_poi_by_freeform)(priv->mod->handler, filter, freeform, svc_pref, pref, cb, user_data, req_id); +} + +int +map_service_cancel_poi_request (LocationIElement *self, guint req_id) +{ + LOCATION_LOGD("map_service_cancel_poi_request"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.cancel_poi_request, LOCATION_ERROR_NOT_AVAILABLE); + return (priv->mod->ops.cancel_poi_request)(priv->mod->handler, req_id); +} + + +int +map_service_request_route (LocationIElement *self, + const LocationPosition *origin, const LocationPosition *destination, GList *waypoint, + const LocationPreference *svc_pref, const LocationRoutePreference * pref, + LocationRouteCB cb, const gpointer user_data, guint * req_id) +{ + LOCATION_LOGD("map_service_request_route"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.request_route, LOCATION_ERROR_NOT_AVAILABLE); + + return (priv->mod->ops.request_route)(priv->mod->handler, origin, destination, waypoint, svc_pref, pref, cb, user_data, req_id); +} + +int +map_service_cancel_route_request (LocationIElement *self, guint req_id) +{ + LOCATION_LOGD("map_service_cancel_route_request"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.cancel_route_request, LOCATION_ERROR_NOT_AVAILABLE); + + return (priv->mod->ops.cancel_route_request)(priv->mod->handler, req_id); +} + +gboolean +map_service_is_supported_map_provider_capability (LocationIElement *self, LocationMapServiceType type) +{ + LOCATION_LOGD("map_service_is_supported_map_provider_capability"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.is_supported_map_provider_capability, LOCATION_ERROR_NOT_AVAILABLE); + + return (priv->mod->ops.is_supported_map_provider_capability)(priv->mod->handler, type); +} + +int +map_service_get_map_provider_capability_key (LocationIElement *self, LocationMapServiceType type, GList **key) +{ + LOCATION_LOGD("map_service_get_map_provider_capability_key"); + MapServicePrivate* priv = GET_PRIVATE(self); + g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE); + g_return_val_if_fail (priv->mod->ops.get_map_provider_capability_key, LOCATION_ERROR_NOT_AVAILABLE); + + return (priv->mod->ops.get_map_provider_capability_key)(priv->mod->handler, type, key); +} + diff --git a/location/map-service/map-internal.h b/location/map-service/map-internal.h new file mode 100644 index 0000000..09aded7 --- /dev/null +++ b/location/map-service/map-internal.h @@ -0,0 +1,82 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MAP_INTERNAL_H__ +#define __MAP_INTERNAL_H__ + +#include "location-types.h" +#include "location-ielement.h" + +/** + * @file map-internal.h + * @brief This file contains the internal definitions and structures related to geocode. + */ + +G_BEGIN_DECLS + +int map_service_get_geocode (LocationIElement *self, const LocationAddress *address, GList **position_list, GList **accuracy_list); + +int map_service_get_geocode_freeform (LocationIElement *self, const gchar *address, GList **position_list, GList **accuracy_list); + +int map_service_get_reversegeocode (LocationIElement *self, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); + +int map_service_get_geocode_async (LocationIElement *self, LocationAddress *address, LocationPositionCB callback, gpointer userdata); + +int map_service_get_geocode_freeform_async (LocationIElement *self, const gchar *address, LocationPositionCB callback, gpointer userdata); + +int map_service_get_reversegeocode_async (LocationIElement *self, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); + +int map_service_search_poi (LocationIElement *self, + const LocationPOIFilter *filter, const LocationPosition *position, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint * req_id); + +int map_service_search_poi_by_area (LocationIElement *self, + const LocationPOIFilter *filter, const LocationBoundary *boundary, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint * req_id); + +int map_service_search_poi_by_address (LocationIElement *self, + const LocationPOIFilter *filter, const LocationAddress *address, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint * req_id); + +int map_service_search_poi_by_freeform (LocationIElement *self, + const LocationPOIFilter * filter, const gchar *freeform, + const LocationPreference *svc_pref, const LocationPOIPreference *pref, + LocationPOICB cb, const gpointer user_data, guint *req_id); + +int map_service_cancel_poi_request (LocationIElement *self, guint req_id); + +int map_service_request_route (LocationIElement *self, + const LocationPosition *origin, const LocationPosition *destination, GList *waypoint, + const LocationPreference *svc_pref, const LocationRoutePreference *pref, + LocationRouteCB cb, const gpointer user_data, guint * req_id); + +int map_service_cancel_route_request (LocationIElement *self, guint req_id); + +gboolean map_service_is_supported_map_provider_capability (LocationIElement *self, LocationMapServiceType type); + +int map_service_get_map_provider_capability_key (LocationIElement *self, LocationMapServiceType type, GList **key); + +G_END_DECLS + +#endif diff --git a/location/map-service/map-service.c b/location/map-service/map-service.c new file mode 100644 index 0000000..6c811b6 --- /dev/null +++ b/location/map-service/map-service.c @@ -0,0 +1,209 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "location-log.h" +#include "location-pref.h" + +#include "module-internal.h" + +#include "map-internal.h" +#include "map-service.h" +#include "location-ielement.h" + +enum { + PROP_0, + PROP_SERVICE_NAME +}; + +static void map_service_ielement_interface_init (LocationIElementInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (MapService, map_service, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (LOCATION_TYPE_IELEMENT, map_service_ielement_interface_init)); + +static void +_get_lang (gchar country_code[3], gchar lang_code[3]) +{ + if (!country_code || !lang_code) return; + gchar* langset = vconf_get_str(VCONFKEY_LANGSET); + LOCATION_LOGD("getenv: %s", langset); + + if(langset == NULL){ + lang_code[0] = 'E'; + lang_code[1] = 'N'; + lang_code[2] = '\0'; + country_code[0] = 'U'; + country_code[1] = 'S'; + country_code[2] = '\0'; + }else{ + gchar* langset_upper = g_ascii_strup(langset, -1); + lang_code[0] = langset_upper[0]; + lang_code[1] = langset_upper[1]; + lang_code[2] = '\0'; + country_code[0] = langset_upper[3]; + country_code[1] = langset_upper[4]; + country_code[2] = '\0'; + g_free(langset_upper); + } + LOCATION_LOGD("Language: %s, Country: %s", lang_code, country_code); +} + + +static void +map_service_dispose (GObject *gobject) +{ + LOCATION_LOGD("map_service_dispose"); + + G_OBJECT_CLASS (map_service_parent_class)->dispose (gobject); +} + +static void +map_service_finalize (GObject *gobject) +{ + LOCATION_LOGD("map_service_finalize"); + MapServicePrivate* priv = GET_PRIVATE(gobject); + module_free(priv->mod, "map-service"); + priv->mod = NULL; + G_OBJECT_CLASS (map_service_parent_class)->finalize (gobject); +} + +static void +map_service_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + MapServicePrivate *priv = GET_PRIVATE (object); + + g_return_if_fail(priv->mod); + g_return_if_fail(priv->mod->handler); + switch (property_id){ + case PROP_SERVICE_NAME:{ + char* service_name = NULL; + if(priv->mod->ops.get_service_name){ + if( LOCATION_ERROR_NONE != priv->mod->ops.get_service_name(priv->mod->handler, &service_name) ){ + service_name = NULL; + } + } + LOCATION_LOGD("Get prop>> Service name: %s", service_name); + g_value_set_string(value, service_name); + g_free(service_name); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +map_service_ielement_interface_init (LocationIElementInterface *iface) +{ + iface->get_geocode = (TYPE_GET_GEOCODE)map_service_get_geocode; + iface->get_geocode_freeform = (TYPE_GET_GEOCODE_FREEFORM)map_service_get_geocode_freeform; + iface->get_reversegeocode = (TYPE_GET_REVERSEGEOCODE)map_service_get_reversegeocode; + iface->get_geocode_async = (TYPE_GET_GEOCODE_ASYNC)map_service_get_geocode_async; + iface->get_geocode_freeform_async = (TYPE_GET_GEOCODE_FREEFORM_ASYNC)map_service_get_geocode_freeform_async; + iface->get_reversegeocode_async = (TYPE_GET_REVERSEGEOCODE_ASYNC)map_service_get_reversegeocode_async; + iface->search_poi = (TYPE_SEARCH_POI) map_service_search_poi; + iface->search_poi_by_area = (TYPE_SEARCH_POI_BY_AREA) map_service_search_poi_by_area; + iface->search_poi_by_address = (TYPE_SEARCH_POI_BY_ADDR) map_service_search_poi_by_address; + iface->search_poi_by_freeform = (TYPE_SEARCH_POI_BY_FREEFORM) map_service_search_poi_by_freeform; + iface->cancel_poi_request = (TYPE_CANCEL_POI_REQUEST) map_service_cancel_poi_request; + iface->request_route = (TYPE_REQUEST_ROUTE) map_service_request_route; + iface->cancel_route_request = (TYPE_CANCEL_ROUTE_REQUEST) map_service_cancel_route_request; + iface->is_supported_map_provider_capability = (TYPE_IS_SUPPORTED_MAP_PROVIDER_CAPABILITY) map_service_is_supported_map_provider_capability; + iface->get_map_provider_capability_key = (TYPE_GET_MAP_PROVIDER_CAPABILITY_KEY) map_service_get_map_provider_capability_key; + +} + +static void +map_service_init (MapService *self) +{ + LOCATION_LOGD("map_service_init"); + MapServicePrivate* priv = GET_PRIVATE(self); + + priv->mod = (LocationServiceMod*)module_new("map-service"); + if(!priv->mod) LOCATION_LOGW("module loading failed"); + priv->pref = location_pref_new (); + if(!priv->pref) LOCATION_LOGW("Service preference failed"); + + gchar country[3], lang[3]; + _get_lang (country, lang); + location_pref_set_language (priv->pref, lang); + location_pref_set_distance_unit (priv->pref, "MI"); + location_pref_set_provider_name (priv->pref, "decarta"); +} + +static void +map_service_class_init (MapServiceClass *klass) +{ + LOCATION_LOGD("map_service_class_init"); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; + + gobject_class->get_property = map_service_get_property; + + gobject_class->dispose = map_service_dispose; + gobject_class->finalize = map_service_finalize; + + g_type_class_add_private (klass, sizeof (MapServicePrivate)); + + pspec = g_param_spec_string ("service provider", + "map service provider name prop", + "map service provider name", + DEFAULT_SERVICE, + G_PARAM_READABLE); + g_object_class_install_property (gobject_class, + PROP_SERVICE_NAME, + pspec); +} + +LocationPreference * +map_service_get_pref(GObject *obj) +{ + LOCATION_LOGD("map_service_get_pref"); + MapServicePrivate* priv = GET_PRIVATE(obj); + if (!priv) return NULL; + if (!priv->pref) return NULL; + + LocationPreference *pref = location_pref_copy(priv->pref); + + return pref; +} + +gboolean +map_service_set_pref (GObject *obj, LocationPreference *pref) +{ + LOCATION_LOGD("map_service_set_pref"); + MapServicePrivate* priv = GET_PRIVATE(obj); + if (!priv) return FALSE; + if (!priv->pref) location_pref_free(priv->pref); + + priv->pref = location_pref_copy (pref); + + return TRUE; +} diff --git a/location/map-service/map-service.h b/location/map-service/map-service.h new file mode 100644 index 0000000..bde83c6 --- /dev/null +++ b/location/map-service/map-service.h @@ -0,0 +1,73 @@ +/* + * libslp-location + * + * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngae Kang , Yunhan Kim , + * Genie Kim , Minjune Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MAP_SERVICE_H__ +#define __MAP_SERVICE_H__ + +#include +#include + +/** + * @file map-service.h + * @brief This file contains the internal definitions and structures related to a service provider. + */ + +G_BEGIN_DECLS + +typedef struct _MapService MapService; +typedef struct _MapServiceClass MapServiceClass; +typedef struct _MapServicePrivate MapServicePrivate; + +#define MAP_TYPE_SERVICE (map_service_get_type ()) +#define MAP_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAP_TYPE_SERVICE, MapService)) +#define MAP_IS_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAP_TYPE_SERVICE)) +#define MAP_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAP_TYPE_SERVICE, MapServiceClass)) +#define MAP_IS_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAP_TYPE_SERVICE)) +#define MAP_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAP_TYPE_SERVICE, MapServiceClass)) + +#define DEFAULT_SERVICE "decarta" + +#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MAP_TYPE_SERVICE, MapServicePrivate)) + +struct _MapService +{ + GObject parent_instance; +}; + +struct _MapServiceClass +{ + GObjectClass parent_class; +}; + +struct _MapServicePrivate { + LocationServiceMod* mod; + LocationPreference *pref; +}; + +GType map_service_get_type (void); + +LocationPreference *map_service_get_pref(GObject *obj); + +gboolean map_service_set_preference (GObject *obj, LocationPreference *pref); + +G_END_DECLS + +#endif /* __MAP_SERVICE_H__ */ diff --git a/location/module/Makefile.am b/location/module/Makefile.am new file mode 100644 index 0000000..d517f09 --- /dev/null +++ b/location/module/Makefile.am @@ -0,0 +1,20 @@ +noinst_LTLIBRARIES = liblocation-module.la + +COMMON_HEADER_DIR = include +MANAGER_DIR = manager +MAP_SERVICE_DIR = map-service +MODULE_DIR = module + +liblocation_module_la_SOURCES = \ + module-internal.c + +liblocation_module_la_CFLAGS = \ + -fPIC\ + -I${srcdir} \ + -I${srcdir}/.. \ + -I${srcdir}/../include \ + -I${srcdir}/../${MANAGER_DIR} \ + -I${srcdir}/../${MODULE_DIR} \ + -I${srcdir}/../${MAP_SERVICE_DIR} \ + $(LOCATION_CFLAGS) + diff --git a/location/location-module.h b/location/module/location-module.h similarity index 58% rename from location/location-module.h rename to location/module/location-module.h index a4469af..9f374c9 100644 --- a/location/location-module.h +++ b/location/module/location-module.h @@ -23,13 +23,12 @@ #define __LOCATION_MODULE_H__ #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include G_BEGIN_DECLS @@ -41,7 +40,7 @@ G_BEGIN_DECLS /** * @addtogroup LocationFW * @{ - * @defgroup LocationModules Location Moduels + * @defgroup LocationModules Location Modules * @brief This sub module provides the definitions and structrues for 3rd party plugin modules. * @addtogroup LocationModules * @{ @@ -51,27 +50,39 @@ G_BEGIN_DECLS * @brief This represents APIs declared in a geocode plug-in for location geocode modules. */ typedef struct{ - int (*get_service_name)(gpointer handle, gchar **servicename); ///< This is used for getting a service name from a plug-in. - int (*get_geocode)(gpointer handle, const LocationAddress *address, GList **position_list, GList **accuracy_list); ///< This is used for getting a geocode from a plug-in. - int (*get_geocode_freetext)(gpointer handle, const gchar *address, GList **position_list, GList **accuracy_list); ///< This is used for getting a geocode by using a free-fromed address from a plug-in. - int (*get_reverse_geocode)(gpointer handle, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); ///< This is used for getting a reverse geocode from a plug-in. - int (*get_geocode_async)(gpointer handle, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); ///< This is used for getting a geocode from a plug-in asynchronously. - int (*get_geocode_freetext_async)(gpointer handle, const gchar *address, LocationPositionCB callback, gpointer userdata); ///< This is used for getting a geocode by using a free-fromed address from a plug-in asynchronously. - int (*get_reverse_geocode_async)(gpointer handle, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); ///< This is used for getting a reverse geocode from a plug-in asynchronously. -} LocModGeoOps; - -/** - * @brief This represents APIs declared in a POI plug-in for location POI modules. - */ -typedef struct{ - int (*get_service_name)(gpointer handle, gchar** servicename); ///< This is used for getting a service name from a plug-in. - int (*get_poi)(gpointer handle, gdouble radius, const gchar* keyword, LocationPOIInfo **poi); ///< This is used for getting a POI from a plug-in. - int (*get_poi_from_address)(gpointer handle, const LocationAddress *address, gdouble radius, const gchar* keyword, LocationPOIInfo **poi); ///< This is used for getting a POI by using a address from a plug-in. - int (*get_poi_from_position)(gpointer handle, const LocationPosition *position, gdouble radius, const gchar* keyword, LocationPOIInfo **poi); ///< This is used for getting a POI by using a position from a plug-in. - int (*get_poi_async)(gpointer handle, gdouble radius, const gchar* keyword, LocationPOICB callback, gpointer userdata); ///< This is used for getting a POI from a plug-in asynchronously. - int (*get_poi_from_address_async)(gpointer handle, const LocationAddress *address, gdouble radius, const gchar* keyword, LocationPOICB callback, gpointer userdata); ///< This is used for getting a POI by using a address from a plug-in asynchronously. - int (*get_poi_from_position_async)(gpointer handle, const LocationPosition *position, gdouble radius, const gchar* keyword, LocationPOICB callback, gpointer userdata); ///< This is used for getting a POI by using a position from a plug-in asynchronously. -} LocModPoiOps; + int (*get_service_name)(gpointer handle, gchar **servicename); + ///< This is used for getting a service name from a plug-in. + int (*get_geocode)(gpointer handle, const LocationAddress *address, GList **position_list, GList **accuracy_list); + ///< This is used for getting a geocode from a plug-in. + int (*get_geocode_freetext)(gpointer handle, const gchar *address, GList **position_list, GList **accuracy_list); + ///< This is used for getting a geocode by using a free-fromed address from a plug-in. + int (*get_reverse_geocode)(gpointer handle, const LocationPosition *position, LocationAddress **address, LocationAccuracy **accuracy); + ///< This is used for getting a reverse geocode from a plug-in. + int (*get_geocode_async)(gpointer handle, const LocationAddress *address, LocationPositionCB callback, gpointer userdata); + ///< This is used for getting a geocode from a plug-in asynchronously. + int (*get_geocode_freetext_async)(gpointer handle, const gchar *address, LocationPositionCB callback, gpointer userdata); + ///< This is used for getting a geocode by using a free-fromed address from a plug-in asynchronously. + int (*get_reverse_geocode_async)(gpointer handle, const LocationPosition *position, LocationAddressCB callback, gpointer userdata); + ///< This is used for getting a reverse geocode from a plug-in asynchronously. + int (*search_poi) (gpointer handle, const LocationPOIFilter *filter, const LocationPosition *position, const LocationPreference *svc_pref, const LocationPOIPreference *pref, LocationPOICB cb, const gpointer user_data, guint * req_id); + ///< This is used for searching poi with the position from a plug-in asynchronously. + int (*search_poi_by_area) (gpointer handle, const LocationPOIFilter *filter, const LocationBoundary *boundary, const LocationPreference *svc_pref, const LocationPOIPreference *pref, LocationPOICB cb, const gpointer user_data, guint * req_id); + ///< This is used for searching poi with the boundary from a plug-in asynchronously. + int (*search_poi_by_address) (gpointer handle, const LocationPOIFilter *filter, const LocationAddress *address, const LocationPreference *svc_pref, const LocationPOIPreference *pref, LocationPOICB cb, const gpointer user_data, guint * req_id); + ///< This is used for searching poi with the address from a plug-in asynchronously. + int (*search_poi_by_freeform) (gpointer handle, const LocationPOIFilter * filter, const gchar *freeform, const LocationPreference *svc_pref, const LocationPOIPreference *pref, LocationPOICB cb, const gpointer user_data, guint *req_id); + ///< This is used for searching poi with the freeform address from a plug-in asynchronously. + int (*cancel_poi_request) (gpointer handle, guint req_id); + ///< This is used for cancel poi request from a plug-in. + int (*request_route) (gpointer handle, const LocationPosition *origin, const LocationPosition *destination, GList *waypoint, const LocationPreference *svc_pref, const LocationRoutePreference * pref, LocationRouteCB cb, const gpointer user_data, guint * req_id); + ///< This is used for requesting route from a plug-in asynchronously. + int (*cancel_route_request) (gpointer handle, guint req_id); + ///< This is used for cancel route request from a plug-in. + gboolean (*is_supported_map_provider_capability) (gpointer handle, LocationMapServiceType type); + ///< This is used to check whether map service is supported on a plug-in. + int (*get_map_provider_capability_key) (gpointer handle, LocationMapServiceType type, GList **key); + ///< This is used to get map service keys on a plug-in. +} LocModServiceOps; /** * @brief This represents a enabled/disabled callback function for a plug-in. @@ -89,15 +100,23 @@ typedef void (*LocModPositionCB) (gboolean enabled, LocationPosition *position, typedef void (*LocModVelocityCB) (gboolean enabled, LocationVelocity *velocity, LocationAccuracy *accuracy, gpointer userdata); /** + * @brief This represents a velocity callback function for a plug-in. + */ +typedef void (*LocModSatelliteCB) (gboolean enabled, LocationSatellite *satellite, gpointer userdata); + +/** * @brief This represents APIs declared in a GPS plug-in for location GPS modules. */ typedef struct{ - int (*start)(gpointer handle, LocModStatusCB status_cb, LocModPositionCB pos_cb, LocModVelocityCB vel_cb, gpointer userdata); ///< This is used for starting a GPS device from a plug-in. #LocModStatusCB, #LocModPositionCB, and #LocModVelocityCB are given from a location framework to a plug-in for asynchronous signaling. + int (*start)(gpointer handle, LocModStatusCB status_cb, LocModPositionCB pos_cb, LocModVelocityCB vel_cb, LocModSatelliteCB sat_cb, gpointer userdata); ///< This is used for starting a GPS device from a plug-in. #LocModStatusCB, #LocModPositionCB, and #LocModVelocityCB are given from a location framework to a plug-in for asynchronous signaling. int (*stop)(gpointer handle); ///< This is used for stopping a GPS device name from a plug-in. int (*get_position)(gpointer handle, LocationPosition **position, LocationAccuracy **accuracy); ///< This is used for getting a position from a plug-in. int (*get_velocity)(gpointer handle, LocationVelocity **velocity, LocationAccuracy **accuracy); ///< This is used for getting a velocity from a plug-in. + int (*get_last_position)(gpointer handle, LocationPosition **position, LocationAccuracy **accuracy); ///< This is used for getting a last position from a plug-in. + int (*get_last_velocity)(gpointer handle, LocationVelocity **velocity, LocationAccuracy **accuracy); ///< This is used for getting a last velocity from a plug-in. int (*get_nmea)(gpointer handle, gchar** nmea_data); ///< This is used for getting a nmea string from a plug-in. int (*get_satellite)(gpointer handle, LocationSatellite **satellite); ///< This is used for getting a satellite information from a plug-in. + int (*get_last_satellite)(gpointer handle, LocationSatellite **satellite); ///< This is used for getting a last satellite information from a plug-in. int (*set_devname)(gpointer handle, const gchar *devname); ///< This is used for setting a device name from a plug-in. int (*get_devname)(gpointer handle, gchar **devname); ///< This is used for getting a device name from a plug-in. } LocModGpsOps; @@ -106,10 +125,12 @@ typedef struct{ * @brief This represents APIs declared in a WPS plug-in for location WPS modules. */ typedef struct{ - int (*start)(gpointer handle, LocModStatusCB status_cb, LocModPositionCB pos_cb, LocModVelocityCB vel_cb, gpointer userdata); ///< This is used for starting a WPS service from a plug-in. #LocModStatusCB, #LocModPositionCB, and #LocModVelocityCB are given from a location framework to a plug-in for asynchronous signaling. + int (*start)(gpointer handle, LocModStatusCB status_cb, LocModPositionCB pos_cb, LocModVelocityCB vel_cb, LocModSatelliteCB sat_cb, gpointer userdata); ///< This is used for starting a WPS service from a plug-in. #LocModStatusCB, #LocModPositionCB, #LocModVelocityCB and #LocModSatelliteCB(Not used) are given from a location framework to a plug-in for asynchronous signaling. int (*stop)(gpointer handle); ///< This is used for stopping a WPS service from a plug-in. int (*get_position)(gpointer handle, LocationPosition **position, LocationAccuracy **accuracy); ///< This is used for getting a position from a plug-in. int (*get_velocity)(gpointer handle, LocationVelocity **velocity, LocationAccuracy **accuracy); ///< This is used for getting a velocity from a plug-in. + int (*get_last_position)(gpointer handle, LocationPosition **position, LocationAccuracy **accuracy); ///< This is used for getting a last position from a plug-in. + int (*get_last_velocity)(gpointer handle, LocationVelocity **velocity, LocationAccuracy **accuracy); ///< This is used for getting a last velocity from a plug-in. } LocModWpsOps; /** @@ -140,7 +161,7 @@ typedef struct{ /** * @brief This is used for exported APIs in a plug-in for a location framework. */ -#define LOCATION_MODULE_API __attribute__((visibility("default"))) G_MODULE_EXPORT +#define LOCATION_MODULE_API __attribute__((visibility("default"))) G_MODULE_EXPORT /** * @} @} diff --git a/location/location-module-internal.c b/location/module/module-internal.c similarity index 77% rename from location/location-module-internal.c rename to location/module/module-internal.c index 1c9a19b..302a159 100644 --- a/location/location-module-internal.c +++ b/location/module/module-internal.c @@ -23,9 +23,9 @@ #include "config.h" #endif -#include -#include "location/location-module-internal.h" -#include "location/location-log.h" +#include +#include "module-internal.h" +#include "location-log.h" #define MAX_MODULE_INDEX 10 const char* MODULE_PATH_PREFIX = "/usr/lib/location/module"; @@ -67,11 +67,11 @@ gmod_new (const char* module_name, gboolean is_resident) static void gmod_free (GMod* gmod) -{ +{ if(gmod->name) g_free(gmod->name); if(gmod->path) - g_free(gmod->path); + g_free(gmod->path); if(gmod->module) g_module_close(gmod->module); g_free(gmod); @@ -85,7 +85,7 @@ gmod_find_sym (GMod* gmod, g_stpcpy(sym, "init"); if ( !g_module_symbol (gmod->module, sym, init_func) ){ LOCATION_LOGW("symbol not found: %s", sym); - return FALSE; + return FALSE; } g_stpcpy(sym, "shutdown"); if ( !g_module_symbol (gmod->module, sym, shutdown_func) ){ @@ -98,7 +98,7 @@ gmod_find_sym (GMod* gmod, static gpointer mod_new (const char* module_name) { - gpointer ret_mod = NULL; + gpointer ret_mod = NULL; if(!module_name) return NULL; @@ -109,24 +109,24 @@ mod_new (const char* module_name) if(!gmod){ LOCATION_LOGW("module(%s) new failed", module_name); return NULL; - } + } if( !gmod_find_sym(gmod, &init, &shutdown) ){ LOCATION_LOGW("symbol (init, shutdown) finding failed"); gmod_free(gmod); return NULL; } if(!init || !shutdown){ - LOCATION_LOGW("init, shutdown symbol is NULL"); + LOCATION_LOGW("init, shutdown symbol is NULL"); gmod_free(gmod); return NULL; - } - if(g_str_has_prefix(module_name, "geocode")){ - LocationGeoMod* _mod = g_new0(LocationGeoMod, 1); + } + if(g_str_has_prefix(module_name, "map-service")){ + LocationServiceMod* _mod = g_new0(LocationServiceMod, 1); _mod->gmod = gmod; _mod->init = init; - _mod->shutdown= shutdown; - _mod->handler= _mod->init(&(_mod->ops)); - if(!_mod->handler){ + _mod->shutdown= shutdown; + _mod->handler= _mod->init(&(_mod->ops)); + if(!_mod->handler){ LOCATION_LOGW("module init failed"); gmod_free(_mod->gmod); ret_mod = NULL; @@ -136,9 +136,9 @@ mod_new (const char* module_name) LocationGpsMod* _mod = g_new0(LocationGpsMod, 1); _mod->gmod = gmod; _mod->init = init; - _mod->shutdown= shutdown; - _mod->handler= _mod->init(&(_mod->ops)); - if(!_mod->handler){ + _mod->shutdown= shutdown; + _mod->handler= _mod->init(&(_mod->ops)); + if(!_mod->handler){ LOCATION_LOGW("module init failed"); gmod_free(_mod->gmod); ret_mod = NULL; @@ -148,9 +148,9 @@ mod_new (const char* module_name) LocationWpsMod* _mod = g_new0(LocationWpsMod, 1); _mod->gmod = gmod; _mod->init = init; - _mod->shutdown= shutdown; - _mod->handler= _mod->init(&(_mod->ops)); - if(!_mod->handler){ + _mod->shutdown= shutdown; + _mod->handler= _mod->init(&(_mod->ops)); + if(!_mod->handler){ LOCATION_LOGW("module init failed"); gmod_free(_mod->gmod); ret_mod = NULL; @@ -172,9 +172,9 @@ mod_new (const char* module_name) LocationIpsMod* _mod = g_new0(LocationIpsMod, 1); _mod->gmod = gmod; _mod->init = init; - _mod->shutdown= shutdown; - _mod->handler= _mod->init(&(_mod->ops)); - if(!_mod->handler){ + _mod->shutdown= shutdown; + _mod->handler= _mod->init(&(_mod->ops)); + if(!_mod->handler){ LOCATION_LOGW("module init failed"); gmod_free(_mod->gmod); ret_mod = NULL; @@ -184,45 +184,33 @@ mod_new (const char* module_name) LocationSpsMod* _mod = g_new0(LocationSpsMod, 1); _mod->gmod = gmod; _mod->init = init; - _mod->shutdown= shutdown; - _mod->handler= _mod->init(&(_mod->ops)); - if(!_mod->handler){ - LOCATION_LOGW("module init failed"); - gmod_free(_mod->gmod); - ret_mod = NULL; - }else - ret_mod = (gpointer)_mod; - }else if(g_str_has_prefix(module_name, "poi")){ - LocationPoiMod* _mod = g_new0(LocationPoiMod, 1); - _mod->gmod = gmod; - _mod->init = init; - _mod->shutdown= shutdown; - _mod->handler= _mod->init(&(_mod->ops)); - if(!_mod->handler){ + _mod->shutdown= shutdown; + _mod->handler= _mod->init(&(_mod->ops)); + if(!_mod->handler){ LOCATION_LOGW("module init failed"); gmod_free(_mod->gmod); ret_mod = NULL; }else ret_mod = (gpointer)_mod; }else{ - LOCATION_LOGW("module name (%s) is wrong", module_name); + LOCATION_LOGW("module name (%s) is wrong", module_name); ret_mod = NULL; - } + } return ret_mod; } - + static void mod_free (gpointer mod, - const char* module_name) + const char* module_name) { if(!mod || !module_name) return; - - if(0 == g_strcmp0(module_name, "geocode")){ - LocationGeoMod* _mod = (LocationGeoMod*)mod; + + if(0 == g_strcmp0(module_name, "map-service")){ + LocationServiceMod* _mod = (LocationServiceMod*)mod; if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); + _mod->shutdown(_mod->handler); } _mod->handler = NULL; _mod->init = NULL; @@ -232,7 +220,7 @@ mod_free (gpointer mod, }else if(0 == g_strcmp0(module_name, "gps")){ LocationGpsMod* _mod = (LocationGpsMod*)mod; if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); + _mod->shutdown(_mod->handler); } _mod->handler = NULL; _mod->init = NULL; @@ -242,8 +230,8 @@ mod_free (gpointer mod, }else if(0 == g_strcmp0(module_name, "wps")){ LocationWpsMod* _mod = (LocationWpsMod*)mod; if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); - } + _mod->shutdown(_mod->handler); + } _mod->handler = NULL; _mod->init = NULL; _mod->shutdown= NULL; @@ -252,8 +240,8 @@ mod_free (gpointer mod, }else if(0 == g_strcmp0(module_name, "cps")){ LocationCpsMod* _mod = (LocationCpsMod*)mod; if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); - } + _mod->shutdown(_mod->handler); + } _mod->handler = NULL; _mod->init = NULL; _mod->shutdown= NULL; @@ -262,8 +250,8 @@ mod_free (gpointer mod, }else if(0 == g_strcmp0(module_name, "ips")){ LocationIpsMod* _mod = (LocationIpsMod*)mod; if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); - } + _mod->shutdown(_mod->handler); + } _mod->handler = NULL; _mod->init = NULL; _mod->shutdown= NULL; @@ -272,17 +260,7 @@ mod_free (gpointer mod, }else if(0 == g_strcmp0(module_name, "sps")){ LocationSpsMod* _mod = (LocationSpsMod*)mod; if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); - } - _mod->handler = NULL; - _mod->init = NULL; - _mod->shutdown= NULL; - gmod_free(_mod->gmod); - _mod->gmod = NULL; - }else if(0 == g_strcmp0(module_name, "poi")){ - LocationPoiMod* _mod = (LocationPoiMod*)mod; - if(_mod->shutdown && _mod->handler){ - _mod->shutdown(_mod->handler); + _mod->shutdown(_mod->handler); } _mod->handler = NULL; _mod->init = NULL; @@ -290,7 +268,7 @@ mod_free (gpointer mod, gmod_free(_mod->gmod); _mod->gmod = NULL; }else - LOCATION_LOGW("module name (%s) is wrong", module_name); + LOCATION_LOGW("module name (%s) is wrong", module_name); g_free(mod); } @@ -310,8 +288,8 @@ mod_is_supported(const char *module_name) gboolean module_init (void) { - if (!g_module_supported()) { - LOCATION_LOGW("module is not supported"); + if (!g_module_supported()) { + LOCATION_LOGW("module is not supported"); return FALSE; } return TRUE; @@ -342,10 +320,10 @@ module_new (const char* module_name) continue; } }else{ - if( 0 >= g_snprintf(name, 256, "%s", module_name)){ + if( 0 >= g_snprintf(name, 256, "%s", module_name)){ LOCATION_LOGW("module name(%s) is wrong", name); continue; - } + } } mod = mod_new(name); if(mod){ diff --git a/location/location-module-internal.h b/location/module/module-internal.h similarity index 82% rename from location/location-module-internal.h rename to location/module/module-internal.h index 868e743..47b8280 100644 --- a/location/location-module-internal.h +++ b/location/module/module-internal.h @@ -19,41 +19,30 @@ * limitations under the License. */ -#ifndef __LOCATION_MODULE_INTERNAL_H__ -#define __LOCATION_MODULE_INTERNAL_H__ +#ifndef __MODULE_INTERNAL_H__ +#define __MODULE_INTERNAL_H__ #include -#include "location/location-module.h" +#include "location-module.h" /** - * @file location-module-internal.h + * @file module-internal.h * @brief This file contains the internal definitions and structures related to module. - * @addtogroup LocationInternal - * @{ - * @} */ typedef struct{ GModule* module; char* name; - char* path; + char* path; } GMod; typedef struct{ GMod* gmod; gpointer handler; - gpointer (*init)(LocModGeoOps* ops); + gpointer (*init)(LocModServiceOps* ops); void (*shutdown)(gpointer handle); - LocModGeoOps ops; -} LocationGeoMod; - -typedef struct{ - GMod* gmod; - gpointer handler; - gpointer (*init)(LocModPoiOps* ops); - void (*shutdown)(gpointer handle); - LocModPoiOps ops; -} LocationPoiMod; + LocModServiceOps ops; +} LocationServiceMod; typedef struct{ GMod* gmod; @@ -100,9 +89,8 @@ G_BEGIN_DECLS gboolean module_init(void); gpointer module_new(const char* module_name); void module_free(gpointer mod, const char* module_name); - gboolean module_is_supported(const char *module_name); - + G_END_DECLS #endif diff --git a/packaging/libslp-location.spec b/packaging/libslp-location.spec index d0e3cb8..0ba8019 100644 --- a/packaging/libslp-location.spec +++ b/packaging/libslp-location.spec @@ -1,3 +1,4 @@ + Name: libslp-location Summary: Location Based Service Version: 0.3.34 @@ -10,9 +11,11 @@ Requires(post): /usr/bin/vconftool Requires(postun): /sbin/ldconfig BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gconf-2.0) +BuildRequires: pkgconfig(dbus-glib-1) +BuildRequires: pkgconfig(gmodule-2.0) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(vconf) -BuildRequires: pkgconfig(json-glib-1.0) +BuildRequires: pkgconfig(json-glib-1.0) %description @@ -28,7 +31,6 @@ Requires: %{name} = %{version}-%{release} Location Based Service Development Package - %prep %setup -q -n %{name}-%{version} @@ -36,48 +38,57 @@ Location Based Service Development Package %build ./autogen.sh -./configure --prefix=%{_prefix} --enable-dlog +./configure --prefix=%{_prefix} --enable-dlog --enable-debug +# Call make instruction with smp support make %{?jobs:-j%jobs} + %install +rm -rf %{buildroot} %make_install +%clean +rm -rf %{buildroot} -%post + +%post /sbin/ldconfig -vconftool set -t int db/location/lastposition/gps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/gps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/gps/HorAccuracy "0.0" -f -vconftool set -t double db/location/lastposition/gps/VerAccuracy "0.0" -f -vconftool set -t int db/location/lastposition/wps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/wps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/wps/HorAccuracy "0.0" -f -vconftool set -t int db/location/lastposition/sps/Timestamp "0" -f -vconftool set -t double db/location/lastposition/sps/Latitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/Longitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/Altitude "0.0" -f -vconftool set -t double db/location/lastposition/sps/HorAccuracy "0.0" -f -vconftool set -t double db/location/lastposition/sps/VerAccuracy "0.0" -f +vconftool set -t int db/location/last/gps/Timestamp "0" -f +vconftool set -t double db/location/last/gps/Latitude "0.0" -f +vconftool set -t double db/location/last/gps/Longitude "0.0" -f +vconftool set -t double db/location/last/gps/Altitude "0.0" -f +vconftool set -t double db/location/last/gps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/gps/VerAccuracy "0.0" -f +vconftool set -t double db/location/last/gps/Speed "0.0" -f +vconftool set -t double db/location/last/gps/Direction "0.0" -f +vconftool set -t int db/location/last/wps/Timestamp "0" -f +vconftool set -t double db/location/last/wps/Latitude "0.0" -f +vconftool set -t double db/location/last/wps/Longitude "0.0" -f +vconftool set -t double db/location/last/wps/Altitude "0.0" -f +vconftool set -t double db/location/last/wps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/wps/Speed "0.0" -f +vconftool set -t double db/location/last/wps/Direction "0.0" -f +vconftool set -t int db/location/last/sps/Timestamp "0" -f +vconftool set -t double db/location/last/sps/Latitude "0.0" -f +vconftool set -t double db/location/last/sps/Longitude "0.0" -f +vconftool set -t double db/location/last/sps/Altitude "0.0" -f +vconftool set -t double db/location/last/sps/HorAccuracy "0.0" -f +vconftool set -t double db/location/last/sps/VerAccuracy "0.0" -f vconftool set -t int db/location/setting/GpsEnabled "0" -g 6514 -f vconftool set -t int db/location/setting/AgpsEnabled "0" -g 6514 -f vconftool set -t int db/location/setting/NetworkEnabled "0" -g 6514 -f vconftool set -t int db/location/setting/SensorEnabled "0" -g 6514 -f + %postun -p /sbin/ldconfig %files -%{_libdir}/lib*.so.* +%{_libdir}/lib*.so* %files devel %{_includedir}/location/*.h -%{_libdir}/lib*.so %{_libdir}/pkgconfig/*.pc - diff --git a/tests/Makefile.am b/tests/Makefile.am index 51837cd..c9d697d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -20,7 +20,10 @@ LDADD = \ $(dir_location)/libSLP-location.la\ $(TEST_LIBS) AM_CFLAGS = \ - -I$(dir_location)\ + -I$(dir_location) \ + -I$(dir_location)/include \ + -I$(dir_location)/manager \ + -I$(dir_location)/map-service \ $(TEST_CFLAGS) dir_tests = $(top_srcdir)/tests diff --git a/tests/address-sample.c b/tests/address-sample.c index 4505288..e830329 100644 --- a/tests/address-sample.c +++ b/tests/address-sample.c @@ -20,15 +20,10 @@ */ #include -#include +#include static GMainLoop *loop = NULL; -#define GCONF_PROXY_MODE "/system/proxy/mode" -#define GCONF_HTTP_PROXY_HOST "/system/http_proxy/host" -#define GCONF_HTTP_PROXY_PORT "/system/http_proxy/port" -#define ENV_HTTP_PROXY "http_proxy" - static gboolean exit_program (gpointer data) { diff --git a/tests/cps-test.c b/tests/cps-test.c index f4bfff0..ea7c707 100644 --- a/tests/cps-test.c +++ b/tests/cps-test.c @@ -20,7 +20,7 @@ */ #include -#include +#include int main (int argc, char *argv[]) diff --git a/tests/gps-test.c b/tests/gps-test.c index 23d5438..c36dbf7 100644 --- a/tests/gps-test.c +++ b/tests/gps-test.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/hybrid-test.c b/tests/hybrid-test.c index 4b6ae5d..90b0d06 100644 --- a/tests/hybrid-test.c +++ b/tests/hybrid-test.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/ips-test.c b/tests/ips-test.c index f7b2269..19e40a1 100644 --- a/tests/ips-test.c +++ b/tests/ips-test.c @@ -20,7 +20,7 @@ */ #include -#include +#include int main (int argc, char *argv[]) diff --git a/tests/location-api-test-util.c b/tests/location-api-test-util.c index 7131c42..fe565f2 100644 --- a/tests/location-api-test-util.c +++ b/tests/location-api-test-util.c @@ -17,189 +17,189 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ - -#include -#include -#include "location.h" - -JsonParser *parser; -JsonNode *root; - -static int _get_polygon_position_count(int polygon_index) -{ - if (parser == NULL || root == NULL) return 0; - - JsonObject* polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - if (polygon_obj == NULL) return 0; - - JsonArray * positions = json_object_get_array_member (polygon_obj, "positions"); - if (positions == NULL) return 0; - - return json_array_get_length(positions); -} - -static LocationPosition* _get_position_from_polygon(int polygon_index, int pos_index) -{ - double latitude = 0.0; - double longitude = 0.0; - LocationPosition *position = NULL; - if (parser == NULL || root == NULL) return NULL; - - JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - JsonArray * pos_array = json_object_get_array_member(polygon_obj, "positions"); - JsonObject* pos = json_array_get_object_element(pos_array, pos_index); - - latitude = json_object_get_double_member(pos, "latitude"); - longitude = json_object_get_double_member(pos, "longitude"); - - if (latitude == 0.0 || longitude == 0.0) return NULL; - - position = location_position_new(0, latitude, longitude, 0.0, LOCATION_STATUS_2D_FIX); - - return position; -} - -static LocationPosition* _get_marker_position_from_polygon(int polygon_index, int pos_index) -{ - double latitude = 0.0; - double longitude = 0.0; - LocationPosition *position = NULL; - if (parser == NULL || root == NULL) return NULL; - - JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - JsonArray * pos_array = json_object_get_array_member(polygon_obj, "marker_position"); - JsonObject* pos = json_array_get_object_element(pos_array, pos_index); - - latitude = json_object_get_double_member(pos, "latitude"); - longitude = json_object_get_double_member(pos, "longitude"); - - if (latitude == 0.0 || longitude == 0.0) return NULL; - - position = location_position_new(0, latitude, longitude, 0.0, LOCATION_STATUS_2D_FIX); - - return position; -} - -static void _free_position_list(gpointer data) -{ - if (data == NULL) return; - - LocationPosition *position = (LocationPosition*) data; - - location_position_free(position); -} - - -LocationBoundary* json_util_get_polygon_boundary(int polygon_index) -{ - if (parser == NULL || root == NULL) { - g_printf("invalid param parser[%d], root[%d]\n", parser, root); - return NULL; - } - GList* position_list = NULL; - LocationBoundary *boundary = NULL; - int index = 0; - int pos_count = _get_polygon_position_count(polygon_index); - if (pos_count == 0) return NULL; - - for(index = 0; index < pos_count; index++) { - position_list = g_list_append(position_list, _get_position_from_polygon(polygon_index, index)); - } - - boundary = location_boundary_new_for_polygon(position_list); - - g_list_free_full(position_list, (GDestroyNotify)_free_position_list); - - return boundary; -} - - -/* Polygon boundary */ -int json_util_get_polygon_count(void) -{ - JsonArray * array = json_node_get_array(root); - - return json_array_get_length(array); -} - -char *json_util_get_polygon_name(int polygon_index) -{ - char *name = NULL; - JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - - name = (char *)json_object_get_string_member(polygon_obj, "name"); - if (name == NULL) return NULL; - - return g_strdup(name); -} - -/* Test Marker */ -char * json_util_get_marker_name(int polygon_index, int pos_index) -{ - char *result = NULL; - if (parser == NULL || root == NULL) return NULL; - - JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - JsonArray * pos_array = json_object_get_array_member(polygon_obj, "marker_position"); - JsonObject* pos = json_array_get_object_element(pos_array, pos_index); - - result = (char *)json_object_get_string_member(pos, "where"); - if (result == NULL) return NULL; - - return g_strdup(result); -} - -int json_util_get_marker_position_count(int polygon_index) -{ - if (parser == NULL || root == NULL) return 0; - - JsonObject* polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - JsonArray * marker_position = json_object_get_array_member (polygon_obj, "marker_position"); - - return json_array_get_length(marker_position); -} - -LocationPosition *json_util_get_marker_position(int polygon_index, int marker_index) -{ - if (parser == NULL || root == NULL) return NULL; - - LocationPosition* position = NULL; - position = _get_marker_position_from_polygon(polygon_index, marker_index); - - return position; -} - -char* json_util_result_zone_test(int polygon_index, int marker_index) -{ - if (parser == NULL || root == NULL) return NULL; - - char *result = NULL; - JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); - JsonArray * pos_array = json_object_get_array_member(polygon_obj, "marker_position"); - JsonObject* pos = json_array_get_object_element(pos_array, marker_index); - - result = (char *)json_object_get_string_member(pos, "result"); - if (result == NULL) return NULL; - - return g_strdup(result); -} - -void json_util_init(const char * file_name) -{ - g_print("Enter init_json_parser"); - GError *error; - gboolean ret = FALSE; - if (parser != NULL) return; - - parser = json_parser_new(); - - error = NULL; - ret = json_parser_load_from_file(parser, file_name, &error); - if (ret == FALSE) { - g_print("Unable to parser[%s]:[%s]\n", file_name, error->message); - return ; - } - - root = json_parser_get_root(parser); -} + */ + +#include +#include +#include "location.h" + +JsonParser *parser; +JsonNode *root; + +static int _get_polygon_position_count(int polygon_index) +{ + if (parser == NULL || root == NULL) return 0; + + JsonObject* polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + if (polygon_obj == NULL) return 0; + + JsonArray * positions = json_object_get_array_member (polygon_obj, "positions"); + if (positions == NULL) return 0; + + return json_array_get_length(positions); +} + +static LocationPosition* _get_position_from_polygon(int polygon_index, int pos_index) +{ + double latitude = 0.0; + double longitude = 0.0; + LocationPosition *position = NULL; + if (parser == NULL || root == NULL) return NULL; + + JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + JsonArray * pos_array = json_object_get_array_member(polygon_obj, "positions"); + JsonObject* pos = json_array_get_object_element(pos_array, pos_index); + + latitude = json_object_get_double_member(pos, "latitude"); + longitude = json_object_get_double_member(pos, "longitude"); + + if (latitude == 0.0 || longitude == 0.0) return NULL; + + position = location_position_new(0, latitude, longitude, 0.0, LOCATION_STATUS_2D_FIX); + + return position; +} + +static LocationPosition* _get_marker_position_from_polygon(int polygon_index, int pos_index) +{ + double latitude = 0.0; + double longitude = 0.0; + LocationPosition *position = NULL; + if (parser == NULL || root == NULL) return NULL; + + JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + JsonArray * pos_array = json_object_get_array_member(polygon_obj, "marker_position"); + JsonObject* pos = json_array_get_object_element(pos_array, pos_index); + + latitude = json_object_get_double_member(pos, "latitude"); + longitude = json_object_get_double_member(pos, "longitude"); + + if (latitude == 0.0 || longitude == 0.0) return NULL; + + position = location_position_new(0, latitude, longitude, 0.0, LOCATION_STATUS_2D_FIX); + + return position; +} + +static void _free_position_list(gpointer data) +{ + if (data == NULL) return; + + LocationPosition *position = (LocationPosition*) data; + + location_position_free(position); +} + + +LocationBoundary* json_util_get_polygon_boundary(int polygon_index) +{ + if (parser == NULL || root == NULL) { + g_printf("invalid param parser[%d], root[%d]\n", parser, root); + return NULL; + } + GList* position_list = NULL; + LocationBoundary *boundary = NULL; + int index = 0; + int pos_count = _get_polygon_position_count(polygon_index); + if (pos_count == 0) return NULL; + + for(index = 0; index < pos_count; index++) { + position_list = g_list_append(position_list, _get_position_from_polygon(polygon_index, index)); + } + + boundary = location_boundary_new_for_polygon(position_list); + + g_list_free_full(position_list, (GDestroyNotify)_free_position_list); + + return boundary; +} + + +/* Polygon boundary */ +int json_util_get_polygon_count(void) +{ + JsonArray * array = json_node_get_array(root); + + return json_array_get_length(array); +} + +char *json_util_get_polygon_name(int polygon_index) +{ + char *name = NULL; + JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + + name = (char *)json_object_get_string_member(polygon_obj, "name"); + if (name == NULL) return NULL; + + return g_strdup(name); +} + +/* Test Marker */ +char * json_util_get_marker_name(int polygon_index, int pos_index) +{ + char *result = NULL; + if (parser == NULL || root == NULL) return NULL; + + JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + JsonArray * pos_array = json_object_get_array_member(polygon_obj, "marker_position"); + JsonObject* pos = json_array_get_object_element(pos_array, pos_index); + + result = (char *)json_object_get_string_member(pos, "where"); + if (result == NULL) return NULL; + + return g_strdup(result); +} + +int json_util_get_marker_position_count(int polygon_index) +{ + if (parser == NULL || root == NULL) return 0; + + JsonObject* polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + JsonArray * marker_position = json_object_get_array_member (polygon_obj, "marker_position"); + + return json_array_get_length(marker_position); +} + +LocationPosition *json_util_get_marker_position(int polygon_index, int marker_index) +{ + if (parser == NULL || root == NULL) return NULL; + + LocationPosition* position = NULL; + position = _get_marker_position_from_polygon(polygon_index, marker_index); + + return position; +} + +char* json_util_result_zone_test(int polygon_index, int marker_index) +{ + if (parser == NULL || root == NULL) return NULL; + + char *result = NULL; + JsonObject *polygon_obj = json_array_get_object_element(json_node_get_array(root), polygon_index); + JsonArray * pos_array = json_object_get_array_member(polygon_obj, "marker_position"); + JsonObject* pos = json_array_get_object_element(pos_array, marker_index); + + result = (char *)json_object_get_string_member(pos, "result"); + if (result == NULL) return NULL; + + return g_strdup(result); +} + +void json_util_init(const char * file_name) +{ + g_print("Enter init_json_parser"); + GError *error; + gboolean ret = FALSE; + if (parser != NULL) return; + + parser = json_parser_new(); + + error = NULL; + ret = json_parser_load_from_file(parser, file_name, &error); + if (ret == FALSE) { + g_print("Unable to parser[%s]:[%s]\n", file_name, error->message); + return ; + } + + root = json_parser_get_root(parser); +} diff --git a/tests/location-api-test-util.h b/tests/location-api-test-util.h index 47948a9..7c31a86 100644 --- a/tests/location-api-test-util.h +++ b/tests/location-api-test-util.h @@ -29,7 +29,7 @@ G_BEGIN_DECLS void json_util_init(const char *file_file); char* json_util_result_zone_test(int polygon_index, int marker_index); -int* json_util_get_marker_name(int polygon_index, int marker_index); +char* json_util_get_marker_name(int polygon_index, int marker_index); int json_util_get_marker_position_count(int polygon_index); LocationPosition *json_util_get_marker_position(int polygon_index, int marker_index); diff --git a/tests/location-api-test.c b/tests/location-api-test.c index b69070b..2247f89 100644 --- a/tests/location-api-test.c +++ b/tests/location-api-test.c @@ -23,18 +23,15 @@ #include #include #include -#include +#include +#include +#include #include "location-api-test-util.h" #define STR_MAX 128 LocationObject* location_obj = NULL; static GMainLoop *g_mainloop = NULL; -#define GCONF_PROXY_MODE "/system/proxy/mode" -#define GCONF_HTTP_PROXY_HOST "/system/http_proxy/host" -#define GCONF_HTTP_PROXY_PORT "/system/http_proxy/port" -#define ENV_HTTP_PROXY "http_proxy" - #define LOCATION_API_TEST_JSON_FILE "/opt/data/location-api-test.json" static gpointer GmainThread(gpointer data) @@ -378,20 +375,37 @@ cb_service_updated (GObject *self, LocationAccuracy *acc = (LocationAccuracy*) accuracy; switch (type) { case POSITION_UPDATED: { - LocationPosition *pos = (LocationPosition*) data; - g_debug ("ASYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", + LocationPosition *pos = (LocationPosition*) data; + g_debug ("ASYNC>> Current position> time: %d, lat: %f, long: %f, alt: %f, status: %d", pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); - } + } break; case VELOCITY_UPDATED: { - LocationVelocity *vel = (LocationVelocity*) data; - g_debug ("ASYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", - vel->timestamp, vel->speed, vel->direction, vel->climb); - g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", - acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + LocationVelocity *vel = (LocationVelocity*) data; + g_debug ("ASYNC>> Current velocity> time: %d, speed: %f, direction:%f, climb:%f", + vel->timestamp, vel->speed, vel->direction, vel->climb); + g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", + acc->level, acc->horizontal_accuracy, acc->vertical_accuracy); + } + break; + case SATELLITE_UPDATED: { + int idx = 0; + guint prn; + gboolean used; + guint elevation; + guint azimuth; + gint snr; + + LocationSatellite *sat = (LocationSatellite *)data; + g_debug ("SYNC>> Current Satellite> time: %d, satellite in view = %d, satellite in used = %d", sat->timestamp, sat->num_of_sat_inview, sat->num_of_sat_used); + g_debug ("\tinview satellite information = "); + for (idx=0; idxnum_of_sat_inview; idx++) { + location_satellite_get_satellite_details(sat, idx, &prn, &used, &elevation, &azimuth, &snr); + g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); } + } break; default: g_warning ("ASYNC>> Undefined update type"); @@ -399,6 +413,187 @@ cb_service_updated (GObject *self, } } +static void _print_property (gpointer data, gpointer user_data) +{ + LocationLandmark *landmark = (LocationLandmark *)user_data; + gpointer key = (gpointer)data; + gpointer value = NULL; + + if (key) { + value = (gpointer)location_landmark_get_property(landmark, key); + g_printf(", [%s:%s]", (gchar*) key, (gchar*) value); + } +} + +static void +__plugin_print_poi_list (gpointer data, gpointer user_data) +{ + LocationLandmark *landmark = (LocationLandmark *)data; + LocationPosition *pos = location_landmark_get_position (landmark); + LocationAddress *addr = location_landmark_get_address (landmark); + + g_printf ("[ID:%d], [NAME:%s], phone[%s],pos[%f:%f], addr[%s:%s:%s:%s:%s]", + location_landmark_get_id (landmark), + location_landmark_get_name(landmark), + location_landmark_get_phone_number (landmark), + pos->latitude, pos->longitude, + addr->building_number, addr->city, addr->country_code, addr->district, + addr->postal_code); + + GList *key_list = location_landmark_get_property_key(landmark); + if (key_list) { + g_list_foreach(key_list, _print_property, landmark); + } + + g_printf("\n"); +} + + +static void cb_poi(LocationError error, guint req_id, GList * landmark_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + g_printf("\n===== __location_POI_cb ======\n"); + if (error != LOCATION_ERROR_NONE) { + g_printf("Failed :%d\n", error); + return; + } + g_printf("Success, poi_list[0x%x] user_data[0x%x] req_id[%d]\n", (unsigned int)landmark_list, (unsigned int)userdata, req_id); + g_list_foreach (landmark_list, __plugin_print_poi_list, NULL); + + if (error_code && error_msg) { + g_printf("__location_POI_cb: error_code[%s], error_msg[%s]\n", error_code, error_msg); + } +} +static void PrintStepInfo(const LocationRouteStep *step) +{ + const LocationPosition *start = location_route_step_get_start_point(step); + gdouble start_lat = 0; + gdouble start_lon = 0; + if (start) { + start_lat = start->latitude; + start_lon = start->longitude; + } else { + g_printf("Step start position NULL\n"); + } + const LocationPosition *end = location_route_step_get_end_point(step); + gdouble end_lat = 0; + gdouble end_lon = 0; + if (end) { + end_lat = end->latitude; + end_lon = end->longitude; + } else { + g_printf("Step end position NULL\n"); + } + const gchar *inst = location_route_step_get_instruction(step); + + g_printf("Step: start(%f/%f), end(%f/%f), instruction(%s)\n", start_lat, start_lon, end_lat, end_lon, inst); +} + +static void cb_print_route_step (gpointer data, gpointer user_data) +{ + g_printf("+++Step begin\n"); + LocationRouteStep *step = (LocationRouteStep *)data; + + PrintStepInfo(step); + g_printf("---Step end\n"); +} + +static void cb_print_route_segment (gpointer data, gpointer user_data) +{ + g_printf("++Segment begin\n"); + LocationRouteSegment *seg = (LocationRouteSegment *)data; + gdouble seg_dist = location_route_segment_get_distance(seg); + glong seg_duration = location_route_segment_get_duration(seg); + const LocationPosition *start = location_route_segment_get_start_point(seg); + gdouble start_lat = 0; + gdouble start_lon = 0; + if (start) { + start_lat = start->latitude; + start_lon = start->longitude; + } else { + g_printf("Segment start position NULL\n"); + } + const LocationPosition *end = location_route_segment_get_end_point(seg); + gdouble end_lat = 0; + gdouble end_lon = 0; + if (end) { + end_lat = end->latitude; + end_lon = end->longitude; + } else { + g_printf("Segment end postion NULL\n"); + } + g_printf("Segment info: Distance[%f], Duration[%ld], start(%f/%f), end(%f/%f)\n", seg_dist, seg_duration, + start_lat, start_lon, end_lat, end_lon); + + GList *step_list = location_route_segment_get_route_step(seg); + GList *tmp_list = (GList *)step_list; + if (tmp_list) { + g_list_foreach(tmp_list, cb_print_route_step, NULL); + } + g_printf("--Segment end\n"); +} + + +static void cb_print_route_list (gpointer data, gpointer user_data) +{ + g_printf("+Route begin\n"); + LocationRoute *route = (LocationRoute *)data; + + const LocationPosition *start = location_route_get_origin(route); + gdouble start_lat = 0; + gdouble start_lon = 0; + if (start) { + start_lat = start->latitude; + start_lon = start->longitude; + } else { + g_printf("Route start position NULL\n"); + } + const LocationPosition *end = location_route_get_destination(route); + gdouble end_lat = 0; + gdouble end_lon = 0; + if (end) { + end_lat = end->latitude; + end_lon = end->longitude; + } else { + g_printf("Route end position NULL\n"); + } + g_printf("Route: start(%f/%f), end(%f/%f)\n", start_lat, start_lon, end_lat, end_lon); + + gdouble distance = location_route_get_total_distance(route); + const gchar *dis_unit = location_route_get_distance_unit(route); + glong duration = location_route_get_total_duration(route); + const LocationBoundary *bound = location_route_get_bounding_box(route); + if (bound && bound->type == LOCATION_BOUNDARY_RECT) { + g_printf("RECT left top[%f-%f], right bottom[%f-%f]\n", bound->rect.left_top->latitude, bound->rect.left_top->longitude, + bound->rect.right_bottom->latitude, bound->rect.right_bottom->longitude); + } else { + g_printf("route boundary not exist, or not RECT\n"); + } + g_printf ("Distance[%f], Distance unit[%s], Duration[%ld]\n", distance, dis_unit, duration); + + GList *seg_list = location_route_get_route_segment(route); + if (seg_list) { + g_list_foreach(seg_list, cb_print_route_segment, NULL); + } + + g_printf("-Route end\n"); +} + +static void cb_route(LocationError error, guint req_id, GList * route_list, gchar * error_code, gchar * error_msg, gpointer userdata) +{ + g_printf("\n===== cb_route ======\n"); + if (error != LOCATION_ERROR_NONE) { + g_printf("Failed :%d\n", error); + return; + } + + g_printf("Success, poi_list[0x%x] user_data[0x%x] req_id[%d]\n", (unsigned int)route_list, (unsigned int)userdata, req_id); + g_list_foreach (route_list, cb_print_route_list, NULL); + + if (error_code && error_msg) { + g_printf("cb_route: error_code[%s], error_msg[%s]\n", error_code, error_msg); + } +} + static void cb_position (LocationError error, GList *pos_list, GList *acc_list, @@ -483,6 +678,24 @@ static gboolean idle_address_from_position_async(gpointer data) return FALSE; } +void _print_keys(gpointer value) +{ + g_printf(" %s ", (gchar*) value); +} + +static void print_map_service_keys (LocationObject *obj, int type) +{ + GList *key = NULL; + + int ret = location_get_map_provider_capability_key (obj, type, &key); + + if (key) { + g_list_foreach (key, _print_keys, NULL); + } + + g_list_free_full(key, g_free); +} + static void print_menu() { g_printf("\n================================= Location API Test =================================\n"); @@ -510,6 +723,16 @@ static void print_menu() g_printf("13. location_get_distance\n"); g_printf("14. location_is_supported_method\n"); g_printf("15. location_is_enabled_gps\n"); + g_printf("16. location_search_poi\n"); + g_printf("16a. location_search_poi_by_area\n"); + g_printf("16b. location_search_poi_by_addr\n"); + g_printf("16c. location_search_poi_by_freeformed_address\n"); + g_printf("16d. location_search_poi_by_area\n"); + g_printf("16e. location_cancel_poi_request\n"); + g_printf("17. location_request_route\n"); + g_printf("17a. location_cancel_route_request\n"); + g_printf("18. location_is_supported_map_provider_capability\n"); + g_printf("19. location_get_map_provider_capability_key\n"); g_printf("99. location_send_command\n"); g_printf("a?. signals:(1)'service-enabled',(2)'service-disabled',(3)'service-updated',(4)'zone-in',(5)'zone-out'\n"); g_printf("b?. disconnect signals:(1)'service-enabled',(2)'service-disabled',(3)'service-updated',(4)'zone-in',(5)'zone-out'\n"); @@ -525,6 +748,7 @@ int main(int argc, char** argv) int ret; char str[STR_MAX]; GError *gerr = NULL; + guint req_id = 0; // If application is executed by AUL, this is not needed. g_setenv("PKG_NAME", "com.samsung.location-api-test", 1); @@ -602,14 +826,12 @@ int main(int argc, char** argv) if(pos) location_position_free(pos); if(acc) location_accuracy_free(acc); } else if (0 == g_strcmp0("6a",strOpt)) { - g_printf("LOCATION_METHOD_HYBRID[0] LOCATION_METHOD_GPS[1] LOCATION_METHOD_WPS[2] LOCATION_METHOD_SPS[5]\n"); - g_printf("Select Location Method: "); - LocationMethod method = PromptInt(); LocationPosition *last_pos; LocationAccuracy *last_acc; int ret = 0; - ret = location_get_last_position (location_obj, LOCATION_METHOD_GPS, &last_pos, &last_acc); + ret = location_get_last_position (location_obj, &last_pos, &last_acc); + GetLocationError(str, ret); if (ret == LOCATION_ERROR_NONE) { g_debug ("SYNC>> Last position> time: %d, lat: %f, long: %f, alt: %f, status: %d", last_pos->timestamp, last_pos->latitude, last_pos->longitude, last_pos->altitude, last_pos->status); @@ -617,7 +839,7 @@ int main(int argc, char** argv) last_acc->level, last_acc->horizontal_accuracy, last_acc->vertical_accuracy); location_position_free(last_pos); location_accuracy_free(last_acc); - } else g_warning ("SYNC>> Last position> failed. Error[%d]",ret); + } else g_warning ("SYNC>> Last position> failed. Error[%s]",str); } else if (0 == g_strcmp0("6b",strOpt)) { g_printf("LOCATION_METHOD_HYBRID[0] LOCATION_METHOD_GPS[1] LOCATION_METHOD_WPS[2] LOCATION_METHOD_SPS[5]\n"); @@ -684,7 +906,7 @@ int main(int argc, char** argv) g_printf("Select Address: "); int opt = PromptInt(); if (opt == 0) data->addr = location_address_new ("1", "Post Street", NULL, "san jose", "ca", NULL, "95113"); - else if (opt == 1) data->addr = location_address_new (NULL, "삼성전자", "매탄3동", "수원시 영통구", "경기도", NULL, NULL); + else if (opt == 1) data->addr = location_address_new (NULL, "삼성전자", "매탄3동", "수원시 영통구", "경기도", NULL, NULL); else if (opt == 2) data->addr = location_address_new (NULL, "Samsung Electro-Mechanics Co. LTD", "Maetan 3-dong", "Suwon Si Yeongtong-gu", "Gyeonggi-do", NULL, NULL); else { char building_number[255], street[255], state[255], country_code[255], city[255], district[255], postal_code[255]; @@ -768,26 +990,31 @@ int main(int argc, char** argv) LocationVelocity *vel = NULL; LocationAccuracy *acc = NULL; ret = location_get_velocity(location_obj, &vel, &acc); - GetLocationError(str, ret); g_printf("location_get_velocity: returned value [%s]\n", str); if (ret == LOCATION_ERROR_NONE) { g_printf("time: [%d], speed: [%f], direction: [%f], climb: [%f]\n", vel->timestamp, vel->speed, vel->direction, vel->climb); GetAccuracyLevel(str, acc->level); g_printf("level: [%s], horizontal_accuracy: [%f], vertical_accuracy: [%f]\n", str, acc->horizontal_accuracy, acc->vertical_accuracy); } + else { + GetLocationError(str, ret); + g_warning ("SYNC>> velocity> failed. Error[%s]", str); + } if(vel) location_velocity_free(vel); if(acc) location_accuracy_free(acc); }else if(0 == g_strcmp0("9a",strOpt) ){ LocationVelocity *last_vel = NULL; LocationAccuracy *last_acc = NULL; - if (LOCATION_ERROR_NONE == location_get_last_velocity (location_obj, &last_vel, &last_acc)) { + ret = location_get_last_velocity (location_obj, &last_vel, &last_acc); + GetLocationError(str, ret); + if (ret == LOCATION_ERROR_NONE) { g_debug ("SYNC>> Last velocity> time: %d, speed: %f, direction:%f, climb:%f", last_vel->timestamp, last_vel->speed, last_vel->direction, last_vel->climb); g_debug ("\tAccuracy level %d (%.0f meters %.0f meters)", last_acc->level, last_acc->horizontal_accuracy, last_acc->vertical_accuracy); location_velocity_free(last_vel); location_accuracy_free(last_acc); - } else g_warning ("SYNC>> Last velocity> failed."); + } else g_warning ("SYNC>> Last velocity> failed. Error[%s]", str); }else if(0 == g_strcmp0("10",strOpt) ){ int ret = 0, idx = 0; LocationSatellite *sat = NULL; @@ -798,15 +1025,16 @@ int main(int argc, char** argv) gint snr; ret = location_get_satellite (location_obj, &sat); + GetLocationError(str, ret); if (ret == LOCATION_ERROR_NONE) { - g_debug ("SYNC>> Current Sattelite> satellite in view = %d, satellite in used = %d", sat->num_of_sat_inview, sat->num_of_sat_used); + g_debug ("SYNC>> Current Sattelite> time = %d, satellite in view = %d, satellite in used = %d", sat->timestamp, sat->num_of_sat_inview, sat->num_of_sat_used); g_debug ("\tinview satellite information = "); for (idx=0; idxnum_of_sat_inview; idx++) { location_satellite_get_satellite_details(sat, idx, &prn, &used, &elevation, &azimuth, &snr); g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); } location_satellite_free (sat); - } else g_warning ("SYNC>> Current satellite> failed. Error[%d]", ret); + } else g_warning ("SYNC>> Current satellite> failed. Error[%s]", str); }else if(0 == g_strcmp0("10a",strOpt) ){ int ret = 0, idx = 0; LocationSatellite *last_sat = NULL; @@ -817,16 +1045,16 @@ int main(int argc, char** argv) gint snr; ret = location_get_last_satellite (location_obj, &last_sat); - + GetLocationError(str, ret); if (ret == LOCATION_ERROR_NONE) { - g_debug ("SYNC>> Last Sattelite> satellite in view = %d, satellite in used = %d", last_sat->num_of_sat_inview, last_sat->num_of_sat_used); + g_debug ("SYNC>> Last Sattelite> time = %d, satellite in view = %d, satellite in used = %d", last_sat->timestamp, last_sat->num_of_sat_inview, last_sat->num_of_sat_used); g_debug ("\tinview satellite information = "); for (idx=0; idxnum_of_sat_inview; idx++) { location_satellite_get_satellite_details(last_sat, idx, &prn, &used, &elevation, &azimuth, &snr); g_debug ("\t\t[%02d] used: %d, prn: %d, elevation: %d, azimuth: %d, snr: %d", idx, used, prn, elevation, azimuth, snr); } location_satellite_free (last_sat); - } else g_warning ("SYNC>> Last satellite> failed"); + } else g_warning ("SYNC>> Last satellite> failed. Error[%s]", str); } else if(0 == g_strcmp0("11",strOpt) ){ LocationAddress *addr = NULL; LocationAccuracy *acc = NULL; @@ -953,6 +1181,238 @@ int main(int argc, char** argv) is_enabled = location_is_enabled_gps(location_obj); if(is_enabled == TRUE) g_printf("GPS is turned on"); else g_printf("GPS is turned off"); + }else if(0 == g_strcmp0("16", strOpt)) { + g_printf("location_search_poi\n"); + //guint req_id = 0; // move to upper + + LocationPOIFilter *filter = location_poi_filter_new(); +// gchar *key = g_strdup("KEYWORD"); +// gchar *value = g_strdup("pizza"); +// location_poi_filter_set(filter, key, value); // same with Type ? CATEGORY, KEYWORD, POIName + //location_poi_filter_set(filter, "CATEGORY", "restaurant"); // error, const char* can't be free!!!!, 120214 + location_poi_filter_set(filter, "KEYWORD", "pizza"); + //location_poi_filter_set(filter, "POIName", "cafe"); + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 2); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); // can't set const char* directly !! + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_DESC); //LOCATION_POI_PREF_SO_ASC + + // only the latitude/longitude + LocationPosition *position = location_position_new(0, 37.771008, -122.41175, 0, LOCATION_STATUS_2D_FIX); + + ret = location_search_poi(location_obj, filter, position, pref, cb_poi, NULL, &req_id); + GetLocationError(str, ret); + if(ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search POI. Error[%s]\n", str); + } else { + g_printf("Seach POI success, req_id %d\n", req_id); + } +// g_free(item); +// g_free(key); +// g_free(value); + location_poi_filter_free(filter); + location_poi_pref_free(pref); + location_position_free(position); + + }else if(0 == g_strcmp0("16a", strOpt)) { + g_printf("location_search_poi_by_area\n"); + + // only circle supported by decarta + LocationPosition *center = location_position_new(0, 37.336723, -121.889555, 0, LOCATION_STATUS_2D_FIX); + gdouble radius = 400; + LocationBoundary *bound = location_boundary_new_for_circle(center, radius); + + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("KEYWORD"); + gchar *value = g_strdup("cafe"); + location_poi_filter_set(filter, key, value); // same with Type ? CATEGORY, KEYWORD, POIName + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 2); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); // can't set const char* directly !! + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); //LOCATION_POI_PREF_SO_ASC + + + ret = location_search_poi_by_area(location_obj, filter, bound, pref, cb_poi, NULL, &req_id); + GetLocationError(str, ret); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search POI by area. Error[%s]\n", str); + } else { + g_printf("Seach POI by area sucess, req_id %d\n", req_id); + } + + g_free(key); + g_free(value); + g_free(item); + location_position_free(center); + location_boundary_free(bound); + location_poi_filter_free(filter); + location_poi_pref_free(pref); + }else if(0 == g_strcmp0("16b", strOpt)) { + g_printf("location_search_poi_by_address\n"); + + LocationAddress *addr = location_address_new("51", "N SAN PEDRO ST", NULL, "SAN JOSE", "SANTA CLARA", "CA", "95110"); + //landmark type ? + //landmark name ? + + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("KEYWORD"); + gchar *value = g_strdup("cafe"); + location_poi_filter_set(filter, key, value); // same with Type ? CATEGORY, KEYWORD, POIName + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 10); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); // can't set const char* directly !! + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); //LOCATION_POI_PREF_SO_ASC + + ret = location_search_poi_by_address(location_obj, filter, addr, pref, cb_poi, NULL, &req_id); + GetLocationError(str, ret); + if(ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search POI by address. Error[%s]\n", str); + } else { + g_printf("Seach POI by address sucess, req_id %d\n", req_id); + } + + g_free(key); + g_free(value); + g_free(item); + + location_address_free(addr); + location_poi_filter_free(filter); + location_poi_pref_free(pref); + }else if(0 == g_strcmp0("16c", strOpt)) { + g_printf("location_search_poi_by_freeformed_address\n"); + + gchar *addr = g_strdup("North Second St."); + + LocationPOIFilter *filter = location_poi_filter_new(); + gchar *key = g_strdup("KEYWORD"); + gchar *value = g_strdup("restaurant"); + location_poi_filter_set(filter, key, value); // same with Type ? CATEGORY, KEYWORD, POIName + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 10); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); // can't set const char* directly !! + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); //LOCATION_POI_PREF_SO_ASC + + ret = location_search_poi_by_freeformed_address(location_obj, filter, addr, pref, cb_poi, NULL, &req_id); + GetLocationError(str, ret); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search POI by address. Error[%s]\n", str); + } else { + g_printf("Seach POI by address success, req_id %d\n", req_id); + } + + g_free(key); + g_free(value); + g_free(item); + + g_free(addr); + location_poi_filter_free(filter); + location_poi_pref_free(pref); + }else if(0 == g_strcmp0("16d", strOpt)) { + gchar value[255] = {0, }; + + // only circle supported by decarta + LocationPosition *center = location_position_new(0, 37.56693, 126.97819, 0, LOCATION_STATUS_2D_FIX); + gdouble radius = 800; + LocationBoundary *bound = location_boundary_new_for_circle(center, radius); + + LocationPOIFilter *filter = location_poi_filter_new(); + + g_printf("Input keyword :"); + scanf("%s", value); + gchar *key = g_strdup("KEYWORD"); + location_poi_filter_set(filter, key, value); // same with Type ? CATEGORY, KEYWORD, POIName + + LocationPOIPreference *pref = location_poi_pref_new(); + location_poi_pref_set_max_result(pref, 2); + gchar *item = g_strdup("Distance"); + location_poi_pref_set_sort_by(pref, item); // can't set const char* directly !! + location_poi_pref_set_sort_order(pref, LOCATION_POI_PREF_SO_ASC); //LOCATION_POI_PREF_SO_ASC + + + ret = location_search_poi_by_area(location_obj, filter, bound, pref, cb_poi, NULL, &req_id); + GetLocationError(str, ret); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search POI by area. Error[%s]\n", str); + } else { + g_printf("Seach POI by area sucess, req_id %d\n", req_id); + } + + g_free(key); + g_free(value); + g_free(item); + location_position_free(center); + location_boundary_free(bound); + location_poi_filter_free(filter); + location_poi_pref_free(pref); + }else if(0 == g_strcmp0("16e", strOpt)) { + int req_id; + + g_printf("Input ReqID : "); + scanf("%d", &req_id); + + ret = location_cancel_poi_request(location_obj, req_id); + GetLocationError(str, ret); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to cancel POI request. Error[%s]\n", str); + } + else + g_printf("location_cancel_poi_request, req_id %d\n", req_id); + }else if(0 == g_strcmp0("17", strOpt)) { + g_printf("17. location_request_route\n\n"); + + LocationPosition *origin = location_position_new(0, 37.564263, 126.974676, 0, LOCATION_STATUS_2D_FIX); // Seoul city hall + LocationPosition *destination = location_position_new(0, 37.557120, 126.992410, 0, LOCATION_STATUS_2D_FIX); // NamSan + + GList *waypoint = NULL; + LocationPosition *via_pos = location_position_new(0, 37.560950, 126.986240, 0, LOCATION_STATUS_2D_FIX); // Wangsimli + waypoint = g_list_append (waypoint, (gpointer)via_pos); + + LocationRoutePreference *pref = location_route_pref_new(); + location_route_pref_set_route_type(pref, "FASTEST"); + + ret = location_request_route(location_obj, origin, destination, waypoint, pref, cb_route, NULL, &req_id); + GetLocationError(str, ret); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to search route by address. Error[%s]\n", str); + } else { + g_printf("Search Route successfully, req_id %d\n", req_id); + } + }else if(0 == g_strcmp0("17a", strOpt)) { + g_printf("17a. location_cancel_route_request\n"); + + int req_id; + g_printf("Input ReqID : "); + scanf("%d", &req_id); + + ret = location_cancel_route_request(location_obj, req_id); + GetLocationError(str, ret); + if (ret != LOCATION_ERROR_NONE) { + g_printf("Fail to cancel route request. Error[%s]\n", str); + } + else { + g_printf("location_cancel_route_request, req_id %d\n", req_id); + } + + }else if (0 == g_strcmp0 ("18", strOpt)) { + int idx = 0; + for (idx = 0; idx < MAP_SERVICE_TYPE_MAX; idx++) { + g_printf("[%d:%d], ", idx, location_is_supported_map_provider_capability (location_obj, idx)); + } + }else if (0 == g_strcmp0 ("19", strOpt)) { + int idx = 0; + for (idx = 0; idx < MAP_SERVICE_TYPE_MAX; idx++) { + g_printf("[%d:", idx); + print_map_service_keys(location_obj, idx); + g_printf("]\n"); + } }else if(0 == g_strcmp0("99", strOpt)) { int ret = 0; const *str = "command"; diff --git a/tests/nmea-sample.c b/tests/nmea-sample.c index 7491589..62073a3 100644 --- a/tests/nmea-sample.c +++ b/tests/nmea-sample.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; GSource* nmea_src = NULL; diff --git a/tests/position-sample-gps.c b/tests/position-sample-gps.c index 60432f3..fb5b7d8 100644 --- a/tests/position-sample-gps.c +++ b/tests/position-sample-gps.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/property-sample.c b/tests/property-sample.c index b11844e..b3096bd 100644 --- a/tests/property-sample.c +++ b/tests/property-sample.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/satellite-sample.c b/tests/satellite-sample.c index 50fac0a..0c48b9a 100644 --- a/tests/satellite-sample.c +++ b/tests/satellite-sample.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; GSource* sat_src = NULL; diff --git a/tests/sps-test.c b/tests/sps-test.c index d8c9745..a426aad 100644 --- a/tests/sps-test.c +++ b/tests/sps-test.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/velocity-sample.c b/tests/velocity-sample.c index 18cffdf..f62aead 100644 --- a/tests/velocity-sample.c +++ b/tests/velocity-sample.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/wps-test.c b/tests/wps-test.c index 0d45e4a..bd49060 100644 --- a/tests/wps-test.c +++ b/tests/wps-test.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; diff --git a/tests/zone-sample.c b/tests/zone-sample.c index 28b2c76..0be3195 100644 --- a/tests/zone-sample.c +++ b/tests/zone-sample.c @@ -20,7 +20,7 @@ */ #include -#include +#include static GMainLoop *loop = NULL; -- 2.7.4