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.
26 #include "location-setting.h"
27 #include "location-log.h"
29 #include "module-internal.h"
31 #include "location-passive.h"
32 #include "location-marshal.h"
33 #include "location-ielement.h"
34 #include "location-signaling-util.h"
35 #include "location-common-util.h"
36 #include "location-privacy.h"
38 #include <vconf-internal-location-keys.h>
40 typedef struct _LocationPassivePrivate {
41 LocationPassiveMod *mod;
47 guint pos_updated_timestamp;
48 guint vel_updated_timestamp;
49 guint sat_updated_timestamp;
50 guint loc_updated_timestamp;
51 guint dist_updated_timestamp;
59 LocationPosition *pos;
60 LocationVelocity *vel;
61 LocationAccuracy *acc;
62 LocationSatellite *sat;
64 } LocationPassivePrivate;
76 PROP_REMOVAL_BOUNDARY,
84 static guint32 signals[LAST_SIGNAL] = {0, };
85 static GParamSpec *properties[PROP_MAX] = {NULL, };
87 #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), LOCATION_TYPE_PASSIVE, LocationPassivePrivate))
89 static void location_ielement_interface_init(LocationIElementInterface *iface);
91 G_DEFINE_TYPE_WITH_CODE(LocationPassive, location_passive, G_TYPE_OBJECT,
92 G_IMPLEMENT_INTERFACE(LOCATION_TYPE_IELEMENT, location_ielement_interface_init));
94 static void __reset_pos_data_from_priv(LocationPassivePrivate *priv)
97 g_return_if_fail(priv);
100 location_position_free(priv->pos);
104 location_velocity_free(priv->vel);
108 location_satellite_free(priv->sat);
112 location_accuracy_free(priv->acc);
115 priv->pos_updated_timestamp = 0;
116 priv->vel_updated_timestamp = 0;
117 priv->sat_updated_timestamp = 0;
118 priv->loc_updated_timestamp = 0;
121 static gboolean __get_started(gpointer self)
123 LocationPassivePrivate *priv = GET_PRIVATE(self);
124 g_return_val_if_fail(priv, FALSE);
126 return priv->is_started;
129 static int __set_started(gpointer self, gboolean started)
131 LocationPassivePrivate *priv = GET_PRIVATE(self);
132 g_return_val_if_fail(priv, -1);
134 if (priv->is_started != started) {
135 g_mutex_lock(&priv->mutex);
136 priv->is_started = started;
137 g_mutex_unlock(&priv->mutex);
143 static void passive_location_cb(gboolean enabled, LocationPosition *pos, LocationVelocity *vel, LocationAccuracy *acc, gpointer self)
145 g_return_if_fail(self);
146 g_return_if_fail(pos);
147 g_return_if_fail(vel);
148 g_return_if_fail(acc);
150 LocationPassivePrivate *priv = GET_PRIVATE(self);
151 g_return_if_fail(priv);
153 if (priv->min_interval != LOCATION_UPDATE_INTERVAL_NONE) {
154 distance_based_position_signaling(self, signals, enabled, pos, vel, acc,
155 priv->min_interval, priv->min_distance, &(priv->enabled),
156 &(priv->dist_updated_timestamp), &(priv->pos), &(priv->vel), &(priv->acc));
158 location_signaling(self, signals, enabled, priv->boundary_list, pos, vel, acc,
159 priv->pos_interval, priv->vel_interval, priv->loc_interval, &(priv->enabled),
160 &(priv->pos_updated_timestamp), &(priv->vel_updated_timestamp),
161 &(priv->loc_updated_timestamp), &(priv->pos), &(priv->vel), &(priv->acc));
164 static void passive_satellite_cb(gboolean enabled, LocationSatellite *sat, gpointer self)
166 g_return_if_fail(self);
167 LocationPassivePrivate *priv = GET_PRIVATE(self);
168 g_return_if_fail(priv);
170 satellite_signaling(self, signals, &(priv->enabled), priv->sat_interval, TRUE, &(priv->sat_updated_timestamp), &(priv->sat), sat);
173 static int location_passive_start(LocationPassive *self)
176 LocationPassivePrivate *priv = GET_PRIVATE(self);
177 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
178 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
179 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
180 g_return_val_if_fail(priv->mod->ops.start, LOCATION_ERROR_NOT_AVAILABLE);
182 LOC_COND_RET(__get_started(self) == TRUE, LOCATION_ERROR_NONE, _E, "Passive already started. Error[%s]", err_msg(LOCATION_ERROR_NONE));
184 int ret = LOCATION_ERROR_NONE;
186 if (!location_setting_get_int(VCONFKEY_LOCATION_ENABLED)) {
187 ret = LOCATION_ERROR_SETTING_OFF;
189 __set_started(self, TRUE);
191 ret = priv->mod->ops.start(priv->mod->handler, 1, NULL, passive_location_cb, passive_satellite_cb, self);
192 if (ret != LOCATION_ERROR_NONE) {
193 LOCATION_LOGE("Fail to start gps. Error[%d]", ret);
194 __set_started(self, FALSE);
199 if (priv->app_type != CPPAPP && priv->set_noti == FALSE)
200 priv->set_noti = TRUE;
205 static int location_passive_stop(LocationPassive *self)
208 LocationPassivePrivate *priv = GET_PRIVATE(self);
209 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
210 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
211 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
212 g_return_val_if_fail(priv->mod->ops.stop, LOCATION_ERROR_NOT_AVAILABLE);
214 int ret = LOCATION_ERROR_NONE;
216 if (__get_started(self) == TRUE) {
217 __set_started(self, FALSE);
218 ret = priv->mod->ops.stop(priv->mod->handler);
219 LOC_IF_FAIL_LOG(ret, _E, "Failed to stop [%s]", err_msg(ret));
220 g_signal_emit(self, signals[SERVICE_DISABLED], 0, LOCATION_STATUS_NO_FIX);
223 if (priv->app_type != CPPAPP && priv->set_noti == TRUE)
224 priv->set_noti = FALSE;
226 __reset_pos_data_from_priv(priv);
231 static void location_passive_dispose(GObject *gobject)
234 LocationPassivePrivate *priv = GET_PRIVATE(gobject);
235 g_return_if_fail(priv);
237 g_mutex_clear(&priv->mutex);
239 if (priv->app_type != CPPAPP && priv->set_noti == TRUE)
240 priv->set_noti = FALSE;
242 G_OBJECT_CLASS(location_passive_parent_class)->dispose(gobject);
245 static void location_passive_finalize(GObject *gobject)
248 LocationPassivePrivate *priv = GET_PRIVATE(gobject);
249 g_return_if_fail(priv);
251 if (priv->boundary_list) {
252 g_list_free_full(priv->boundary_list, free_boundary_list);
253 priv->boundary_list = NULL;
257 location_position_free(priv->pos);
262 location_velocity_free(priv->vel);
267 location_accuracy_free(priv->acc);
270 G_OBJECT_CLASS(location_passive_parent_class)->finalize(gobject);
273 static guint get_valid_interval(guint interval, int max_interval, int min_interval)
275 if (interval > max_interval)
276 return (guint)max_interval;
277 else if (interval < min_interval)
278 return (guint)min_interval;
283 static void location_passive_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
285 LocationPassivePrivate *priv = GET_PRIVATE(object);
286 g_return_if_fail(priv);
289 switch (property_id) {
290 case PROP_BOUNDARY: {
291 GList *boundary_list = (GList *)g_list_copy(g_value_get_pointer(value));
292 ret = set_prop_boundary(&priv->boundary_list, boundary_list);
293 if (ret != LOCATION_ERROR_NONE)
294 LOCATION_LOGE("Set boundary. Error[%d]", ret);
296 g_list_free(boundary_list);
299 case PROP_REMOVAL_BOUNDARY: {
300 LocationBoundary *req_boundary = (LocationBoundary *) g_value_dup_boxed(value);
301 ret = set_prop_removal_boundary(&priv->boundary_list, req_boundary);
302 if (ret != 0) LOCATION_LOGD("Set removal boundary. Error[%d]", ret);
305 case PROP_POS_INTERVAL: {
306 guint interval = g_value_get_uint(value);
308 if (interval < LOCATION_UPDATE_INTERVAL_MAX)
309 priv->pos_interval = interval;
311 priv->pos_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
313 priv->pos_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
318 case PROP_VEL_INTERVAL: {
319 guint interval = g_value_get_uint(value);
321 if (interval < LOCATION_UPDATE_INTERVAL_MAX)
322 priv->vel_interval = interval;
324 priv->vel_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
326 priv->vel_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
330 case PROP_SAT_INTERVAL: {
331 guint interval = g_value_get_uint(value);
332 LOCATION_LOGD("Set prop>> PROP_SAT_INTERVAL: %u", interval);
333 priv->sat_interval = get_valid_interval(interval, LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_MIN);
336 case PROP_LOC_INTERVAL: {
337 guint interval = g_value_get_uint(value);
338 LOCATION_LOGD("Set prop>> PROP_LOC_INTERVAL: %u", interval);
340 if (interval < LOCATION_UPDATE_INTERVAL_MAX)
341 priv->loc_interval = interval;
343 priv->loc_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
345 priv->loc_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
350 case PROP_MIN_INTERVAL: {
351 guint interval = g_value_get_uint(value);
352 LOCATION_LOGD("Set prop>> update-min-interval: %u", interval);
354 if (interval < LOCATION_MIN_INTERVAL_MAX)
355 priv->min_interval = interval;
357 priv->min_interval = (guint)LOCATION_MIN_INTERVAL_MAX;
359 priv->min_interval = (guint)LOCATION_MIN_INTERVAL_DEFAULT;
364 case PROP_MIN_DISTANCE: {
365 gdouble distance = g_value_get_double(value);
366 LOCATION_LOGD("Set prop>> update-min-distance: %u", distance);
368 if (distance < LOCATION_MIN_DISTANCE_MAX)
369 priv->min_distance = distance;
371 priv->min_distance = (gdouble)LOCATION_MIN_DISTANCE_MAX;
373 priv->min_distance = (gdouble)LOCATION_MIN_DISTANCE_DEFAULT;
378 case PROP_SERVICE_STATUS: {
379 gint enabled = g_value_get_int(value);
380 LOCATION_LOGD("Set prop>> PROP_SERVICE_STATUS: %u", enabled);
381 priv->enabled = enabled;
385 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
390 static void location_passive_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
392 LocationPassivePrivate *priv = GET_PRIVATE(object);
393 g_return_if_fail(priv);
394 g_return_if_fail(priv->mod);
395 g_return_if_fail(priv->mod->handler);
396 LocModPassiveOps ops = priv->mod->ops;
398 switch (property_id) {
399 case PROP_METHOD_TYPE:
400 g_value_set_int(value, LOCATION_METHOD_PASSIVE);
402 case PROP_IS_STARTED:
403 g_value_set_boolean(value, __get_started(object));
405 case PROP_LAST_POSITION:
406 g_value_set_boxed(value, priv->pos);
409 g_value_set_pointer(value, g_list_first(priv->boundary_list));
411 case PROP_POS_INTERVAL:
412 g_value_set_uint(value, priv->pos_interval);
414 case PROP_VEL_INTERVAL:
415 g_value_set_uint(value, priv->vel_interval);
417 case PROP_SAT_INTERVAL:
418 g_value_set_uint(value, priv->sat_interval);
420 case PROP_LOC_INTERVAL:
421 g_value_set_uint(value, priv->loc_interval);
423 case PROP_MIN_INTERVAL:
424 g_value_set_uint(value, priv->min_interval);
426 case PROP_MIN_DISTANCE:
427 g_value_set_double(value, priv->min_distance);
429 case PROP_SATELLITE: {
430 LocationSatellite *satellite = NULL;
431 if (ops.get_satellite && priv->mod->handler && LOCATION_ERROR_NONE == ops.get_satellite(priv->mod->handler, &satellite) && satellite) {
432 LOCATION_LOGD("Get prop>> Last sat: num_used(%d) num_view(%d)", satellite->num_of_sat_used, satellite->num_of_sat_inview);
433 g_value_set_boxed(value, satellite);
434 location_satellite_free(satellite);
436 LOCATION_LOGW("Get prop>> Last sat: failed");
437 g_value_set_boxed(value, NULL);
441 case PROP_SERVICE_STATUS:
442 g_value_set_int(value, priv->enabled);
445 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
450 static int location_passive_get_position(LocationPassive *self, LocationPosition **position, LocationAccuracy **accuracy)
453 int ret = LOCATION_ERROR_NOT_AVAILABLE;
455 LocationPassivePrivate *priv = GET_PRIVATE(self);
456 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
457 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
458 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
460 if (__get_started(self) != TRUE) {
461 LOCATION_LOGE("location is not started");
462 return LOCATION_ERROR_NOT_AVAILABLE;
466 *position = location_position_copy(priv->pos);
467 if (priv->acc) *accuracy = location_accuracy_copy(priv->acc);
468 else *accuracy = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
469 ret = LOCATION_ERROR_NONE;
475 static int location_passive_get_position_ext(LocationPassive *self, LocationPosition **position, LocationVelocity **velocity, LocationAccuracy **accuracy)
478 int ret = LOCATION_ERROR_NOT_AVAILABLE;
480 LocationPassivePrivate *priv = GET_PRIVATE(self);
481 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
482 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
483 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
485 if (__get_started(self) != TRUE) {
486 LOCATION_LOGE("location is not started");
487 return LOCATION_ERROR_NOT_AVAILABLE;
490 if (priv->pos && priv->vel) {
491 *position = location_position_copy(priv->pos);
492 *velocity = location_velocity_copy(priv->vel);
493 if (priv->acc) *accuracy = location_accuracy_copy(priv->acc);
494 else *accuracy = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
495 ret = LOCATION_ERROR_NONE;
502 static int location_passive_get_last_position(LocationPassive *self, LocationPosition **position, LocationAccuracy **accuracy)
505 LocationPassivePrivate *priv = GET_PRIVATE(self);
506 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
507 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
508 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
510 int ret = LOCATION_ERROR_NONE;
511 LocationVelocity *_velocity = NULL;
513 LocModPassiveOps ops = priv->mod->ops;
514 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
515 g_return_val_if_fail(ops.get_last_position, LOCATION_ERROR_NOT_AVAILABLE);
517 ret = ops.get_last_position(priv->mod->handler, position, &_velocity, accuracy);
518 if (_velocity) location_velocity_free(_velocity);
523 static int location_passive_get_last_position_ext(LocationPassive *self, LocationPosition **position, LocationVelocity **velocity, LocationAccuracy **accuracy)
526 LocationPassivePrivate *priv = GET_PRIVATE(self);
527 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
528 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
529 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
531 LocModPassiveOps ops = priv->mod->ops;
532 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
533 g_return_val_if_fail(ops.get_last_position, LOCATION_ERROR_NOT_AVAILABLE);
535 return ops.get_last_position(priv->mod->handler, position, velocity, accuracy);
538 static int location_passive_get_velocity(LocationPassive *self, LocationVelocity **velocity, LocationAccuracy **accuracy)
540 int ret = LOCATION_ERROR_NOT_AVAILABLE;
542 LocationPassivePrivate *priv = GET_PRIVATE(self);
543 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
544 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
545 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
547 if (__get_started(self) != TRUE) {
548 LOCATION_LOGE("location is not started");
549 return LOCATION_ERROR_NOT_AVAILABLE;
553 *velocity = location_velocity_copy(priv->vel);
554 if (priv->acc) *accuracy = location_accuracy_copy(priv->acc);
555 else *accuracy = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
556 ret = LOCATION_ERROR_NONE;
562 static int location_passive_get_last_velocity(LocationPassive *self, LocationVelocity **velocity, LocationAccuracy **accuracy)
565 LocationPassivePrivate *priv = GET_PRIVATE(self);
566 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
567 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
568 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
570 int ret = LOCATION_ERROR_NONE;
571 LocationPosition *_position = NULL;
573 LocModPassiveOps ops = priv->mod->ops;
574 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
575 ret = ops.get_last_position(priv->mod->handler, &_position, velocity, accuracy);
576 if (!_position) location_position_free(_position);
581 static int location_passive_get_satellite(LocationPassive *self, LocationSatellite **satellite)
584 LocationPassivePrivate *priv = GET_PRIVATE(self);
585 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
586 setting_retval_if_fail(VCONFKEY_LOCATION_ENABLED);
588 LOC_COND_RET(__get_started(self) != TRUE, LOCATION_ERROR_NOT_AVAILABLE, _E, "Passive is not started [%s]", err_msg(LOCATION_ERROR_NOT_AVAILABLE));
590 int ret = LOCATION_ERROR_NOT_AVAILABLE;
592 *satellite = location_satellite_copy(priv->sat);
593 ret = LOCATION_ERROR_NONE;
599 static int location_passive_get_last_satellite(LocationPassive *self, LocationSatellite **satellite)
602 return location_passive_get_satellite(self, satellite);
605 static int location_passive_set_option(LocationPassive *self, const char *option)
608 return LOCATION_ERROR_NONE;
611 static int location_passive_request_single_location(LocationPassive *self, int timeout)
614 return LOCATION_ERROR_NOT_SUPPORTED;
617 static int location_passive_cancel_single_location(LocationPassive *self, int timeout)
620 return LOCATION_ERROR_NOT_SUPPORTED;
623 static int location_passive_get_nmea(LocationPassive *self, char **nmea_data)
626 return LOCATION_ERROR_NOT_SUPPORTED;
629 static int location_passive_set_mock_location(LocationPassive *self, LocationPosition *position, LocationVelocity *velocity, LocationAccuracy *accuracy)
632 return LOCATION_ERROR_NOT_SUPPORTED;
635 static int location_passive_clear_mock_location(LocationPassive *self)
638 return LOCATION_ERROR_NOT_SUPPORTED;
641 static void location_ielement_interface_init(LocationIElementInterface *iface)
643 iface->start = (TYPE_START_FUNC)location_passive_start;
644 iface->stop = (TYPE_STOP_FUNC)location_passive_stop;
645 iface->get_position = (TYPE_GET_POSITION)location_passive_get_position;
646 iface->get_position_ext = (TYPE_GET_POSITION_EXT)location_passive_get_position_ext;
647 iface->get_last_position = (TYPE_GET_POSITION)location_passive_get_last_position;
648 iface->get_last_position_ext = (TYPE_GET_POSITION_EXT)location_passive_get_last_position_ext;
649 iface->get_velocity = (TYPE_GET_VELOCITY)location_passive_get_velocity;
650 iface->get_last_velocity = (TYPE_GET_VELOCITY)location_passive_get_last_velocity;
651 iface->get_satellite = (TYPE_GET_SATELLITE)location_passive_get_satellite;
652 iface->get_last_satellite = (TYPE_GET_SATELLITE)location_passive_get_last_satellite;
653 iface->set_option = (TYPE_SET_OPTION)location_passive_set_option;
654 iface->request_single_location = (TYPE_REQUEST_SINGLE_LOCATION)location_passive_request_single_location;
655 iface->cancel_single_location = (TYPE_CANCEL_SINGLE_LOCATION)location_passive_cancel_single_location;
656 iface->get_nmea = (TYPE_GET_NMEA)location_passive_get_nmea;
657 iface->set_mock_location = (TYPE_SET_MOCK_LOCATION) location_passive_set_mock_location;
658 iface->clear_mock_location = (TYPE_CLEAR_MOCK_LOCATION) location_passive_clear_mock_location;
661 static void location_passive_init(LocationPassive *self)
664 LocationPassivePrivate *priv = GET_PRIVATE(self);
665 g_return_if_fail(priv);
667 priv->mod = (LocationPassiveMod *)module_new("passive");
668 if (!priv->mod) LOCATION_LOGW("module loading failed");
670 g_mutex_init(&priv->mutex);
671 priv->is_started = FALSE;
672 priv->set_noti = FALSE;
673 priv->enabled = FALSE;
675 priv->pos_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
676 priv->vel_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
677 priv->sat_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
678 priv->loc_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
679 priv->min_interval = LOCATION_UPDATE_INTERVAL_NONE;
681 priv->pos_updated_timestamp = 0;
682 priv->vel_updated_timestamp = 0;
683 priv->sat_updated_timestamp = 0;
684 priv->loc_updated_timestamp = 0;
690 priv->boundary_list = NULL;
692 priv->loc_timeout = 0;
694 priv->app_type = location_get_app_type(NULL);
695 LOC_COND_LOG(priv->app_type == 0, _W, "[Info] Fail to get app_type");
698 static void location_passive_class_init(LocationPassiveClass *klass)
701 GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
703 gobject_class->set_property = location_passive_set_property;
704 gobject_class->get_property = location_passive_get_property;
706 gobject_class->dispose = location_passive_dispose;
707 gobject_class->finalize = location_passive_finalize;
709 g_type_class_add_private(klass, sizeof(LocationPassivePrivate));
711 signals[SERVICE_ENABLED] =
712 g_signal_new("service-enabled", G_TYPE_FROM_CLASS(klass),
713 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
714 G_STRUCT_OFFSET(LocationPassiveClass, enabled),
715 NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
717 signals[SERVICE_DISABLED] =
718 g_signal_new("service-disabled", G_TYPE_FROM_CLASS(klass),
719 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
720 G_STRUCT_OFFSET(LocationPassiveClass, disabled),
721 NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
723 signals[SERVICE_UPDATED] =
724 g_signal_new("service-updated", G_TYPE_FROM_CLASS(klass),
725 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
726 G_STRUCT_OFFSET(LocationPassiveClass, service_updated),
727 NULL, NULL, location_VOID__INT_POINTER_POINTER_POINTER, G_TYPE_NONE, 4,
728 G_TYPE_INT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
730 signals[LOCATION_UPDATED] =
731 g_signal_new("location-updated", G_TYPE_FROM_CLASS(klass),
732 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
733 G_STRUCT_OFFSET(LocationPassiveClass, location_updated),
734 NULL, NULL, location_VOID__INT_POINTER_POINTER_POINTER,
735 G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
738 g_signal_new("zone-in", G_TYPE_FROM_CLASS(klass),
739 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
740 G_STRUCT_OFFSET(LocationPassiveClass, zone_in),
741 NULL, NULL, location_VOID__POINTER_POINTER_POINTER,
742 G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
745 g_signal_new("zone-out", G_TYPE_FROM_CLASS(klass),
746 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
747 G_STRUCT_OFFSET(LocationPassiveClass, zone_out),
748 NULL, NULL, location_VOID__POINTER_POINTER_POINTER,
749 G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
751 properties[PROP_METHOD_TYPE] =
752 g_param_spec_int("method", "method type", "location method type name",
753 LOCATION_METHOD_PASSIVE, LOCATION_METHOD_PASSIVE, LOCATION_METHOD_PASSIVE, G_PARAM_READABLE);
755 properties[PROP_IS_STARTED] =
756 g_param_spec_boolean("is_started", "passive is started prop",
757 "passive is started status", FALSE, G_PARAM_READWRITE);
759 properties[PROP_LAST_POSITION] =
760 g_param_spec_boxed("last-position", "passive last position prop",
761 "passive last position data", LOCATION_TYPE_POSITION, G_PARAM_READABLE);
763 properties[PROP_POS_INTERVAL] =
764 g_param_spec_uint("pos-interval", "passive position interval prop",
765 "passive position interval data", LOCATION_UPDATE_INTERVAL_MIN,
766 LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_DEFAULT, G_PARAM_READWRITE);
768 properties[PROP_VEL_INTERVAL] =
769 g_param_spec_uint("vel-interval", "passive velocity interval prop",
770 "passive velocity interval data", LOCATION_UPDATE_INTERVAL_MIN,
771 LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_DEFAULT, G_PARAM_READWRITE);
773 properties[PROP_SAT_INTERVAL] =
774 g_param_spec_uint("sat-interval", "passive satellite interval prop",
775 "passive satellite interval data", LOCATION_UPDATE_INTERVAL_MIN,
776 LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_DEFAULT, G_PARAM_READWRITE);
778 properties[PROP_LOC_INTERVAL] =
779 g_param_spec_uint("loc-interval", "passive location interval prop",
780 "passive location interval data", LOCATION_UPDATE_INTERVAL_MIN,
781 LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_DEFAULT, G_PARAM_READWRITE);
783 properties[PROP_MIN_INTERVAL] =
784 g_param_spec_uint("min-interval", "passive distance-based interval prop",
785 "passive distance-based interval data", LOCATION_MIN_INTERVAL_MIN,
786 LOCATION_MIN_INTERVAL_MAX, LOCATION_MIN_INTERVAL_DEFAULT, G_PARAM_READWRITE);
788 properties[PROP_MIN_DISTANCE] =
789 g_param_spec_double("min-distance", "passive distance-based distance prop",
790 "passive distance-based distance data", LOCATION_MIN_DISTANCE_MIN,
791 LOCATION_MIN_DISTANCE_MAX, LOCATION_MIN_DISTANCE_DEFAULT, G_PARAM_READWRITE);
793 properties[PROP_BOUNDARY] =
794 g_param_spec_pointer("boundary", "passive boundary prop",
795 "passive boundary data", G_PARAM_READWRITE);
797 properties[PROP_REMOVAL_BOUNDARY] =
798 g_param_spec_boxed("removal-boundary", "passive removal boundary prop",
799 "passive removal boundary data", LOCATION_TYPE_BOUNDARY, G_PARAM_READWRITE);
801 properties[PROP_SATELLITE] =
802 g_param_spec_boxed("satellite", "passive satellite prop",
803 "passive satellite data", LOCATION_TYPE_SATELLITE, G_PARAM_READABLE);
805 properties[PROP_SERVICE_STATUS] =
806 g_param_spec_int("service-status", "location service status prop",
807 "location service status data", LOCATION_STATUS_NO_FIX,
808 LOCATION_STATUS_3D_FIX, LOCATION_STATUS_NO_FIX, G_PARAM_READABLE);
810 g_object_class_install_properties(gobject_class, PROP_MAX, properties);