4 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
7 * Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 #include "location-common-util.h"
24 #include "location-setting.h"
25 #include "location-log.h"
27 static gint compare_position (gconstpointer a, gconstpointer b)
29 g_return_val_if_fail(a, 1);
30 g_return_val_if_fail(b, -1);
32 if(location_position_equal((LocationPosition*) a, (LocationPosition *)b) == TRUE) {
40 boundary_compare (gconstpointer comp1, gconstpointer comp2)
42 g_return_val_if_fail(comp1, 1);
43 g_return_val_if_fail(comp2, -1);
47 LocationBoundary *boundary1 = (LocationBoundary *)comp1;
48 LocationBoundary *boundary2 = (LocationBoundary *)comp2;
50 if (boundary1->type == boundary2->type) {
51 switch (boundary1->type) {
52 case LOCATION_BOUNDARY_CIRCLE: {
53 if (location_position_equal(boundary1->circle.center, boundary2->circle.center)
54 && boundary1->circle.radius == boundary2->circle.radius) {
59 case LOCATION_BOUNDARY_RECT: {
60 if (location_position_equal(boundary1->rect.left_top, boundary2->rect.left_top)
61 && location_position_equal(boundary1->rect.right_bottom, boundary2->rect.right_bottom)) {
66 case LOCATION_BOUNDARY_POLYGON: {
68 GList *boundary1_next = NULL;
69 GList *boundary2_start = NULL, *boundary2_prev = NULL, *boundary2_next = NULL;
70 if (g_list_length(boundary1->polygon.position_list) != g_list_length(boundary2->polygon.position_list)) {
74 // Find a matching index of Boundary2 with Boundary1's 1st postion.
75 boundary2_start = g_list_find_custom(boundary2->polygon.position_list, g_list_nth_data(boundary1->polygon.position_list, 0), (GCompareFunc) compare_position);
76 if (boundary2_start == NULL) return -1;
78 boundary2_prev = g_list_previous(boundary2_start);
79 boundary2_next = g_list_next(boundary2_start);
80 if (boundary2_prev == NULL) boundary2_prev = g_list_last(boundary2->polygon.position_list);
81 if (boundary2_next == NULL) boundary2_next = g_list_first(boundary2->polygon.position_list);
83 boundary1_next = g_list_next(boundary1->polygon.position_list);
84 if (location_position_equal((LocationPosition*)boundary1_next->data, (LocationPosition*)boundary2_prev->data) == TRUE){
85 boundary1_next = g_list_next(boundary1_next);
86 while (boundary1_next) {
87 boundary2_prev = g_list_previous(boundary2_prev);
88 if (boundary2_prev == NULL) boundary2_prev = g_list_last(boundary2->polygon.position_list);
89 if (location_position_equal((LocationPosition*)boundary1_next->data, (LocationPosition*) boundary2_prev->data) == FALSE){
92 boundary1_next = g_list_next(boundary1_next);
96 else if (location_position_equal((LocationPosition*)boundary1_next->data, (LocationPosition*)boundary2_next->data) == TRUE) {
97 boundary1_next = g_list_next(boundary1_next);
98 while(boundary1_next) {
99 boundary2_next = g_list_next(boundary2_next);
100 if (boundary2_next == NULL) boundary2_next = g_list_first(boundary2->polygon.position_list);
101 if (location_position_equal((LocationPosition*)boundary1_next->data, (LocationPosition*) boundary2_next->data) == FALSE){
104 boundary1_next = g_list_next(boundary1_next);
124 int set_prop_boundary(GList **prev_boundary_list, GList *new_boundary_list)
126 g_return_val_if_fail(new_boundary_list, LOCATION_ERROR_PARAMETER);
129 GList *check_list = NULL;
131 LocationBoundary *new_boundary = NULL;
132 LocationBoundary *copy_boundary = NULL;
135 while((new_boundary = (LocationBoundary*) g_list_nth_data(new_boundary_list, index)) != NULL) {
137 check_list = g_list_find_custom(*prev_boundary_list, new_boundary, (GCompareFunc)boundary_compare);
138 if (check_list == NULL) {
139 LOCATION_LOGD("Set Prop >> boundary type: [%d]", new_boundary->type);
140 copy_boundary = location_boundary_copy(new_boundary);
141 *prev_boundary_list = g_list_append(*prev_boundary_list, copy_boundary);
145 *prev_boundary_list = g_list_first(*prev_boundary_list);
147 return LOCATION_ERROR_NONE;
152 int set_prop_removal_boundary(GList **prev_boundary_list, LocationBoundary* boundary)
154 g_return_val_if_fail(*prev_boundary_list, LOCATION_ERROR_PARAMETER);
156 GList *check_list = NULL;
158 check_list = g_list_find_custom (*prev_boundary_list, boundary, (GCompareFunc) boundary_compare);
160 LOCATION_LOGD("Found");
161 *prev_boundary_list = g_list_delete_link(*prev_boundary_list, check_list);
164 if (g_list_length(*prev_boundary_list) == 0 ) {
165 LOCATION_LOGD("Boundary List is empty");
166 g_list_free(*prev_boundary_list);
167 *prev_boundary_list = NULL;
170 return LOCATION_ERROR_NONE;
173 int get_last_known_position (LocationMethod method, LocationLastPosition *last_pos)
176 double longitude = 0.0, latitude = 0.0, altitude = 0.0;
177 double hor_accuracy = 0.0, ver_accuracy = 0.0;
178 LOCATION_LOGD("Method [%d]", method);
180 case LOCATION_METHOD_SPS:
181 if (vconf_get_int(SPS_LAST_TIMESTAMP, ×tamp) ||
182 vconf_get_dbl(SPS_LAST_LATITUDE, &latitude) ||
183 vconf_get_dbl(SPS_LAST_LONGITUDE, &longitude) ||
184 vconf_get_dbl(SPS_LAST_ALTITUDE, &altitude) ||
185 vconf_get_dbl(SPS_LAST_HORACCURACY, &hor_accuracy) ||
186 vconf_get_dbl(SPS_LAST_VERACCURACY, &ver_accuracy)) {
190 case LOCATION_METHOD_WPS:
191 if (vconf_get_int(WPS_LAST_TIMESTAMP, ×tamp) ||
192 vconf_get_dbl(WPS_LAST_LATITUDE, &latitude) ||
193 vconf_get_dbl(WPS_LAST_LONGITUDE, &longitude) ||
194 vconf_get_dbl(WPS_LAST_ALTITUDE, &altitude) ||
195 vconf_get_dbl(WPS_LAST_HORACCURACY, &hor_accuracy)) {
199 case LOCATION_METHOD_GPS:
200 if (vconf_get_int(GPS_LAST_TIMESTAMP, ×tamp) ||
201 vconf_get_dbl(GPS_LAST_LATITUDE, &latitude) ||
202 vconf_get_dbl(GPS_LAST_LONGITUDE, &longitude) ||
203 vconf_get_dbl(GPS_LAST_ALTITUDE, &altitude) ||
204 vconf_get_dbl(GPS_LAST_HORACCURACY, &hor_accuracy) ||
205 vconf_get_dbl(GPS_LAST_VERACCURACY, &ver_accuracy)) {
209 case LOCATION_METHOD_HYBRID:
215 last_pos->method = method;
216 last_pos->timestamp = (guint) timestamp;
217 last_pos->longitude = (gdouble) longitude;
218 last_pos->latitude = (gdouble) latitude;
219 last_pos->altitude = (gdouble) altitude;
220 last_pos->horizontal_accuracy = (gdouble) hor_accuracy;
221 last_pos->vertical_accuracy = (gdouble) ver_accuracy;