1. Code synchronization with tizen_2.4
[platform/core/location/lbs-location.git] / location / manager / location-common-util.c
1 /*
2  * libslp-location
3  *
4  * Copyright (c) 2010-2013 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
7  *          Genie Kim <daejins.kim@samsung.com>
8  *
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
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
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.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include <stdio.h>
27 #include <string.h>
28 #include <sys/types.h>
29 #include <unistd.h>
30
31 #include "location.h"
32 #include "location-common-util.h"
33 #include "location-setting.h"
34 #include "location-log.h"
35
36
37 int location_application_get_authority(void)
38 {
39         return LOCATION_APP_ON;
40 }
41
42 int location_application_set_authority(int auth)
43 {
44         return LOCATION_ERROR_NONE;
45 }
46
47 static gint compare_position(gconstpointer a, gconstpointer b)
48 {
49         g_return_val_if_fail(a, 1);
50         g_return_val_if_fail(b, -1);
51
52         if (location_position_equal((LocationPosition *) a, (LocationPosition *)b) == TRUE) {
53                 return 0;
54         }
55
56         return -1;
57 }
58
59 static int
60 boundary_compare(gconstpointer comp1, gconstpointer comp2)
61 {
62         g_return_val_if_fail(comp1, 1);
63         g_return_val_if_fail(comp2, -1);
64
65         int ret = -1;
66
67         LocationBoundaryPrivate *priv1 = (LocationBoundaryPrivate *)comp1;
68         LocationBoundaryPrivate *priv2 = (LocationBoundaryPrivate *)comp2;
69
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) {
75                                                 ret = 0;
76                                         }
77                                         break;
78                                 }
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)) {
82                                                 ret = 0;
83                                         }
84                                         break;
85                                 }
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)) {
90                                                 return -1;
91                                         }
92
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;
96
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);
101
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) {
109                                                                 return -1;
110                                                         }
111                                                         boundary1_next = g_list_next(boundary1_next);
112                                                 }
113                                                 ret = 0;
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) {
120                                                                 return -1;
121                                                         }
122                                                         boundary1_next = g_list_next(boundary1_next);
123                                                 }
124                                                 ret = 0;
125                                         } else {
126                                                 return -1;
127                                         }
128                                         break;
129                                 }
130                         default: {
131                                         ret = -1;
132                                         break;
133                                 }
134
135                 }
136         }
137
138         return ret;
139 }
140
141 int set_prop_boundary(GList **prev_boundary_priv_list, GList *new_boundary_priv_list)
142 {
143         LOCATION_LOGD("ENTER >>>");
144         g_return_val_if_fail(new_boundary_priv_list, LOCATION_ERROR_PARAMETER);
145
146         int index = 0;
147         GList *check_list = NULL;
148
149         LocationBoundaryPrivate *new_priv = NULL;
150
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);
161
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);
164                 }
165                 location_boundary_free(new_priv->boundary);
166                 index++;
167         }
168
169         LOCATION_LOGD("EXIT <<<");
170         return LOCATION_ERROR_NONE;
171 }
172
173 int set_prop_removal_boundary(GList **prev_boundary_list, LocationBoundary *boundary)
174 {
175         LOCATION_LOGD("ENTER >>>");
176         g_return_val_if_fail(*prev_boundary_list, LOCATION_ERROR_PARAMETER);
177
178         GList *check_list = NULL;
179         LocationBoundaryPrivate *remove_priv = g_slice_new0(LocationBoundaryPrivate);
180         g_return_val_if_fail(remove_priv, LOCATION_ERROR_PARAMETER);
181
182         remove_priv->boundary = location_boundary_copy(boundary);
183         g_return_val_if_fail(remove_priv->boundary, LOCATION_ERROR_PARAMETER);
184
185         check_list = g_list_find_custom(*prev_boundary_list, remove_priv, (GCompareFunc) boundary_compare);
186         if (check_list) {
187                 LOCATION_LOGD("Found");
188                 *prev_boundary_list = g_list_delete_link(*prev_boundary_list, check_list);
189         }
190
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;
195         }
196
197         location_boundary_free(remove_priv->boundary);
198         g_slice_free(LocationBoundaryPrivate, remove_priv);
199
200         LOCATION_LOGD("EXIT <<<");
201         return LOCATION_ERROR_NONE;
202 }
203
204 void free_boundary_list(gpointer data)
205 {
206         LocationBoundaryPrivate *priv = (LocationBoundaryPrivate *)data;
207
208         location_boundary_free(priv->boundary);
209         g_slice_free(LocationBoundaryPrivate, priv);
210 }