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.
26 #include "location/location-setting.h"
27 #include "location/location-log.h"
29 #include "location/location-module-internal.h"
31 #include "location/location-wps.h"
32 #include "location/location-marshal.h"
33 #include "location/location-ielement.h"
34 #include "location/location-signaling-util.h"
35 #include "location/location-common-util.h"
40 typedef struct _LocationWpsPrivate {
45 LocationPosition *pos;
46 LocationVelocity *vel;
47 LocationAccuracy *acc;
49 ZoneStatus zone_status;
58 PROP_REMOVAL_BOUNDARY,
62 static guint32 signals[LAST_SIGNAL] = {0, };
63 static GParamSpec *properties[PROP_MAX] = {NULL, };
65 #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOCATION_TYPE_WPS, LocationWpsPrivate))
67 static void location_ielement_interface_init (LocationIElementInterface *iface);
69 G_DEFINE_TYPE_WITH_CODE (LocationWps, location_wps, G_TYPE_OBJECT,
70 G_IMPLEMENT_INTERFACE (LOCATION_TYPE_IELEMENT,
71 location_ielement_interface_init));
74 wps_status_cb (gboolean enabled,
75 LocationStatus status,
78 LOCATION_LOGD("wps_status_cb");
79 g_return_if_fail(self);
80 LocationWpsPrivate* priv = GET_PRIVATE(self);
81 enable_signaling(self, signals, &(priv->enabled), enabled, status);
85 wps_position_cb (gboolean enabled,
86 LocationPosition *pos,
87 LocationAccuracy *acc,
90 LOCATION_LOGD("wps_position_cb");
91 g_return_if_fail(self);
92 g_return_if_fail(pos);
93 g_return_if_fail(acc);
94 LocationWpsPrivate* priv = GET_PRIVATE(self);
95 enable_signaling(self, signals, &(priv->enabled), enabled, pos->status);
96 position_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->pos), &(priv->acc), priv->boundary_list, &(priv->zone_status), enabled, pos, acc);
100 wps_velocity_cb(gboolean enabled,
101 LocationVelocity *vel,
102 LocationAccuracy *acc,
105 LOCATION_LOGD("wps_velocity_cb");
106 g_return_if_fail(self);
107 LocationWpsPrivate* priv = GET_PRIVATE(self);
108 velocity_signaling(self, signals, &(priv->enabled), priv->interval, &(priv->vel), enabled, vel, acc);
112 location_setting_wps_cb(keynode_t *key,
115 LOCATION_LOGD("location_setting_wps_cb");
116 g_return_if_fail(key);
117 g_return_if_fail(self);
118 LocationWpsPrivate* priv = GET_PRIVATE(self);
119 g_return_if_fail (priv->mod);
120 g_return_if_fail (priv->mod->handler);
121 if (0 == location_setting_get_key_val(key) && priv->mod->ops.stop) {
122 LOCATION_LOGD("location stopped by setting");
123 priv->mod->ops.stop(priv->mod->handler);
125 else if (1 == location_setting_get_key_val(key) && priv->mod->ops.start) {
126 LOCATION_LOGD("location resumed by setting");
127 priv->mod->ops.start (priv->mod->handler, wps_status_cb, wps_position_cb, wps_velocity_cb, self);
132 location_wps_start (LocationWps *self)
134 LOCATION_LOGD("location_wps_start");
135 LocationWpsPrivate* priv = GET_PRIVATE(self);
136 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
137 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
138 g_return_val_if_fail (priv->mod->ops.start, LOCATION_ERROR_NOT_AVAILABLE);
139 setting_retval_if_fail (GPS_ENABLED);
140 setting_retval_if_fail (NETWORK_ENABLED);
141 if (priv->is_started == TRUE) return LOCATION_ERROR_NONE;
143 int ret = priv->mod->ops.start (priv->mod->handler, wps_status_cb, wps_position_cb, wps_velocity_cb, self);
144 if (ret == LOCATION_ERROR_NONE) {
145 priv->is_started = TRUE;
146 location_setting_add_notify (GPS_ENABLED, location_setting_wps_cb, self);
147 location_setting_add_notify (NETWORK_ENABLED, location_setting_wps_cb, self);
153 location_wps_stop (LocationWps *self)
155 LOCATION_LOGD("location_wps_stop");
156 LocationWpsPrivate* priv = GET_PRIVATE(self);
157 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
158 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
159 g_return_val_if_fail (priv->mod->ops.stop, LOCATION_ERROR_NOT_AVAILABLE);
160 if( priv->is_started == FALSE) return LOCATION_ERROR_NONE;
162 int ret = priv->mod->ops.stop (priv->mod->handler);
163 if (ret == LOCATION_ERROR_NONE) {
164 priv->is_started = FALSE;
165 location_setting_ignore_notify (GPS_ENABLED, location_setting_wps_cb);
166 location_setting_ignore_notify (NETWORK_ENABLED, location_setting_wps_cb);
172 location_wps_dispose (GObject *gobject)
174 LOCATION_LOGD("location_wps_dispose");
175 G_OBJECT_CLASS (location_wps_parent_class)->dispose (gobject);
179 location_wps_finalize (GObject *gobject)
181 LOCATION_LOGD("location_wps_finalize");
182 LocationWpsPrivate* priv = GET_PRIVATE(gobject);
183 module_free(priv->mod, "wps");
184 G_OBJECT_CLASS (location_wps_parent_class)->finalize (gobject);
188 location_wps_set_property (GObject *object,
193 LocationWpsPrivate* priv = GET_PRIVATE(object);
196 switch (property_id){
198 GList *boundary_list = (GList *)g_list_copy(g_value_get_pointer(value));
199 ret = set_prop_boundary(&priv->boundary_list, boundary_list);
200 if(ret != 0) LOCATION_LOGD("Set boundary. Error[%d]", ret);
203 case PROP_REMOVAL_BOUNDARY: {
204 LocationBoundary *req_boundary = (LocationBoundary*) g_value_dup_boxed(value);
205 ret = set_prop_removal_boundary(&priv->boundary_list, req_boundary);
206 if(ret != 0) LOCATION_LOGD("Set removal boundary. Error[%d]", ret);
209 case PROP_UPDATE_INTERVAL: {
210 guint interval = g_value_get_uint(value);
212 if(interval < LOCATION_UPDATE_INTERVAL_MAX)
213 priv->interval = interval;
215 priv->interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
218 priv->interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
222 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
228 location_wps_get_property (GObject *object,
233 LocationWpsPrivate *priv = GET_PRIVATE (object);
235 switch (property_id){
236 case PROP_METHOD_TYPE:
237 g_value_set_int(value, LOCATION_METHOD_WPS);
239 case PROP_LAST_POSITION:
240 g_value_set_boxed (value, priv->pos);
243 g_value_set_pointer(value, g_list_first(priv->boundary_list));
245 case PROP_UPDATE_INTERVAL:
246 g_value_set_uint(value, priv->interval);
249 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
255 location_wps_get_position (LocationWps *self,
256 LocationPosition **position,
257 LocationAccuracy **accuracy)
259 LOCATION_LOGD("location_wps_get_position");
261 LocationWpsPrivate *priv = GET_PRIVATE (self);
262 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
263 setting_retval_if_fail(GPS_ENABLED);
264 setting_retval_if_fail(NETWORK_ENABLED);
266 LocModWpsOps ops = priv->mod->ops;
267 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
268 g_return_val_if_fail (ops.get_position, LOCATION_ERROR_NOT_AVAILABLE);
269 return ops.get_position(priv->mod->handler, position, accuracy);
273 location_wps_get_velocity (LocationWps *self,
274 LocationVelocity **velocity,
275 LocationAccuracy **accuracy)
277 LOCATION_LOGD("location_wps_get_velocity");
279 LocationWpsPrivate *priv = GET_PRIVATE (self);
280 g_return_val_if_fail (priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
281 setting_retval_if_fail(GPS_ENABLED);
282 setting_retval_if_fail(NETWORK_ENABLED);
284 LocModWpsOps ops = priv->mod->ops;
285 g_return_val_if_fail (priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
286 g_return_val_if_fail (ops.get_velocity, LOCATION_ERROR_NOT_AVAILABLE);
287 return ops.get_velocity(priv->mod->handler, velocity, accuracy);
291 location_ielement_interface_init (LocationIElementInterface *iface)
293 iface->start = (TYPE_START_FUNC)location_wps_start;
294 iface->stop = (TYPE_STOP_FUNC)location_wps_stop;
295 iface->get_position = (TYPE_GET_POSITION)location_wps_get_position;
296 iface->get_velocity = (TYPE_GET_VELOCITY)location_wps_get_velocity;
300 location_wps_init (LocationWps *self)
302 LOCATION_LOGD("location_wps_init");
303 LocationWpsPrivate* priv = GET_PRIVATE(self);
305 priv->mod = (LocationWpsMod*)module_new("wps");
306 if(!priv->mod) LOCATION_LOGW("module loading failed");
308 priv->is_started = FALSE;
309 priv->enabled= FALSE;
310 priv->interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
315 priv->zone_status = ZONE_STATUS_NONE;
316 priv->boundary_list = NULL;
320 location_wps_class_init (LocationWpsClass *klass)
322 LOCATION_LOGD("location_wps_class_init");
323 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
325 gobject_class->set_property = location_wps_set_property;
326 gobject_class->get_property = location_wps_get_property;
328 gobject_class->dispose = location_wps_dispose;
329 gobject_class->finalize = location_wps_finalize;
331 g_type_class_add_private (klass, sizeof (LocationWpsPrivate));
333 signals[SERVICE_ENABLED] = g_signal_new ("service-enabled",
334 G_TYPE_FROM_CLASS (klass),
337 G_STRUCT_OFFSET (LocationWpsClass, enabled),
343 signals[SERVICE_DISABLED] = g_signal_new ("service-disabled",
344 G_TYPE_FROM_CLASS (klass),
347 G_STRUCT_OFFSET (LocationWpsClass, disabled),
353 signals[SERVICE_UPDATED] = g_signal_new ("service-updated",
354 G_TYPE_FROM_CLASS (klass),
357 G_STRUCT_OFFSET (LocationWpsClass, updated),
359 location_VOID__UINT_POINTER_POINTER,
365 signals[ZONE_IN] = g_signal_new ("zone-in",
366 G_TYPE_FROM_CLASS (klass),
369 G_STRUCT_OFFSET (LocationWpsClass, zone_in),
371 location_VOID__UINT_POINTER_POINTER,
377 signals[ZONE_OUT] = g_signal_new ("zone-out",
378 G_TYPE_FROM_CLASS (klass),
381 G_STRUCT_OFFSET (LocationWpsClass, zone_out),
383 location_VOID__UINT_POINTER_POINTER,
389 properties[PROP_METHOD_TYPE] = g_param_spec_int ("method",
391 "location method type name",
397 properties[PROP_LAST_POSITION] = g_param_spec_boxed ("last-position",
398 "wps last position prop",
399 "wps last position data",
400 LOCATION_TYPE_POSITION,
403 properties[PROP_UPDATE_INTERVAL] = g_param_spec_uint ("update-interval",
404 "wps update interval prop",
405 "wps update interval data",
406 LOCATION_UPDATE_INTERVAL_MIN,
407 LOCATION_UPDATE_INTERVAL_MAX,
408 LOCATION_UPDATE_INTERVAL_DEFAULT,
411 properties[PROP_BOUNDARY] = g_param_spec_pointer ("boundary",
416 properties[PROP_REMOVAL_BOUNDARY] = g_param_spec_boxed("removal-boundary",
417 "wps removal boundary prop",
418 "wps removal boundary data",
419 LOCATION_TYPE_BOUNDARY,
422 g_object_class_install_properties (gobject_class,