4 * Copyright (c) 2010-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
7 * Genie Kim <daejins.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.
28 #include <sys/types.h>
32 #include "location-common-util.h"
33 #include "location-setting.h"
34 #include "location-log.h"
37 int location_application_get_authority(void)
39 return LOCATION_APP_ON;
42 int location_application_set_authority(int auth)
44 return LOCATION_ERROR_NONE;
47 static gint compare_position(gconstpointer a, gconstpointer b)
49 g_return_val_if_fail(a, 1);
50 g_return_val_if_fail(b, -1);
52 if (location_position_equal((LocationPosition *) a, (LocationPosition *)b) == TRUE) {
60 boundary_compare(gconstpointer comp1, gconstpointer comp2)
62 g_return_val_if_fail(comp1, 1);
63 g_return_val_if_fail(comp2, -1);
67 LocationBoundaryPrivate *priv1 = (LocationBoundaryPrivate *)comp1;
68 LocationBoundaryPrivate *priv2 = (LocationBoundaryPrivate *)comp2;
70 if (priv1->boundary->type == priv2->boundary->type) {
71 switch (priv1->boundary->type) {
72 case LOCATION_BOUNDARY_CIRCLE: {
73 if (location_position_equal(priv1->boundary->circle.center, priv2->boundary->circle.center)
74 && priv1->boundary->circle.radius == priv2->boundary->circle.radius) {
79 case LOCATION_BOUNDARY_RECT: {
80 if (location_position_equal(priv1->boundary->rect.left_top, priv2->boundary->rect.left_top)
81 && location_position_equal(priv1->boundary->rect.right_bottom, priv2->boundary->rect.right_bottom)) {
86 case LOCATION_BOUNDARY_POLYGON: {
87 GList *boundary1_next = NULL;
88 GList *boundary2_start = NULL, *boundary2_prev = NULL, *boundary2_next = NULL;
89 if (g_list_length(priv1->boundary->polygon.position_list) != g_list_length(priv2->boundary->polygon.position_list)) {
93 /* Find a matching index of Boundary2 with Boundary1's 1st postion. */
94 boundary2_start = g_list_find_custom(priv2->boundary->polygon.position_list, g_list_nth_data(priv1->boundary->polygon.position_list, 0), (GCompareFunc) compare_position);
95 if (boundary2_start == NULL) return -1;
97 boundary2_prev = g_list_previous(boundary2_start);
98 boundary2_next = g_list_next(boundary2_start);
99 if (boundary2_prev == NULL) boundary2_prev = g_list_last(priv2->boundary->polygon.position_list);
100 if (boundary2_next == NULL) boundary2_next = g_list_first(priv2->boundary->polygon.position_list);
102 boundary1_next = g_list_next(priv1->boundary->polygon.position_list);
103 if (boundary1_next && location_position_equal((LocationPosition *)boundary1_next->data, (LocationPosition *)boundary2_prev->data) == TRUE) {
104 boundary1_next = g_list_next(boundary1_next);
105 while (boundary1_next) {
106 boundary2_prev = g_list_previous(boundary2_prev);
107 if (boundary2_prev == NULL) boundary2_prev = g_list_last(priv2->boundary->polygon.position_list);
108 if (location_position_equal((LocationPosition *)boundary1_next->data, (LocationPosition *) boundary2_prev->data) == FALSE) {
111 boundary1_next = g_list_next(boundary1_next);
114 } else if (boundary1_next && location_position_equal((LocationPosition *)boundary1_next->data, (LocationPosition *)boundary2_next->data) == TRUE) {
115 boundary1_next = g_list_next(boundary1_next);
116 while (boundary1_next) {
117 boundary2_next = g_list_next(boundary2_next);
118 if (boundary2_next == NULL) boundary2_next = g_list_first(priv2->boundary->polygon.position_list);
119 if (location_position_equal((LocationPosition *)boundary1_next->data, (LocationPosition *) boundary2_next->data) == FALSE) {
122 boundary1_next = g_list_next(boundary1_next);
141 int set_prop_boundary(GList **prev_boundary_priv_list, GList *new_boundary_priv_list)
143 LOCATION_LOGD("ENTER >>>");
144 g_return_val_if_fail(new_boundary_priv_list, LOCATION_ERROR_PARAMETER);
147 GList *check_list = NULL;
149 LocationBoundaryPrivate *new_priv = NULL;
151 while ((new_priv = (LocationBoundaryPrivate *) g_list_nth_data(new_boundary_priv_list, index)) != NULL) {
152 *prev_boundary_priv_list = g_list_first(*prev_boundary_priv_list);
153 check_list = g_list_find_custom(*prev_boundary_priv_list, new_priv, (GCompareFunc)boundary_compare);
154 if (check_list == NULL) {
155 LocationBoundaryPrivate *copy_priv = g_slice_new0(LocationBoundaryPrivate);
156 if (!copy_priv) break;
157 copy_priv->boundary = location_boundary_copy(new_priv->boundary);
158 if (!copy_priv->boundary) break;
159 copy_priv->zone_status = new_priv->zone_status;
160 *prev_boundary_priv_list = g_list_append(*prev_boundary_priv_list, copy_priv);
162 LOCATION_LOGD("copy_priv: %p, copy_priv->boundary: %p, copy_priv->boundary->type: %d",
163 copy_priv, copy_priv->boundary, copy_priv->boundary->type);
165 location_boundary_free(new_priv->boundary);
169 LOCATION_LOGD("EXIT <<<");
170 return LOCATION_ERROR_NONE;
173 int set_prop_removal_boundary(GList **prev_boundary_list, LocationBoundary *boundary)
175 LOCATION_LOGD("ENTER >>>");
176 g_return_val_if_fail(*prev_boundary_list, LOCATION_ERROR_PARAMETER);
178 GList *check_list = NULL;
179 LocationBoundaryPrivate *remove_priv = g_slice_new0(LocationBoundaryPrivate);
180 g_return_val_if_fail(remove_priv, LOCATION_ERROR_PARAMETER);
182 remove_priv->boundary = location_boundary_copy(boundary);
183 g_return_val_if_fail(remove_priv->boundary, LOCATION_ERROR_PARAMETER);
185 check_list = g_list_find_custom(*prev_boundary_list, remove_priv, (GCompareFunc) boundary_compare);
187 LOCATION_LOGD("Found");
188 *prev_boundary_list = g_list_delete_link(*prev_boundary_list, check_list);
191 if (g_list_length(*prev_boundary_list) == 0) {
192 LOCATION_LOGD("Boundary List is empty");
193 g_list_free(*prev_boundary_list);
194 *prev_boundary_list = NULL;
197 location_boundary_free(remove_priv->boundary);
198 g_slice_free(LocationBoundaryPrivate, remove_priv);
200 LOCATION_LOGD("EXIT <<<");
201 return LOCATION_ERROR_NONE;
204 void free_boundary_list(gpointer data)
206 LocationBoundaryPrivate *priv = (LocationBoundaryPrivate *)data;
208 location_boundary_free(priv->boundary);
209 g_slice_free(LocationBoundaryPrivate, priv);