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-mock.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>
44 typedef struct _LocationMockPrivate {
51 guint pos_updated_timestamp;
53 guint vel_updated_timestamp;
55 guint loc_updated_timestamp;
58 guint dist_updated_timestamp;
61 LocationPosition *pos;
62 LocationVelocity *vel;
63 LocationAccuracy *acc;
65 } LocationMockPrivate;
76 PROP_REMOVAL_BOUNDARY,
83 static guint32 signals[LAST_SIGNAL] = {0, };
84 static GParamSpec *properties[PROP_MAX] = {NULL, };
86 #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), LOCATION_TYPE_MOCK, LocationMockPrivate))
88 static void location_ielement_interface_init(LocationIElementInterface *iface);
90 G_DEFINE_TYPE_WITH_CODE(LocationMock, location_mock, G_TYPE_OBJECT,
91 G_IMPLEMENT_INTERFACE(LOCATION_TYPE_IELEMENT,
92 location_ielement_interface_init));
95 __reset_pos_data_from_priv(LocationMockPrivate *priv)
98 g_return_if_fail(priv);
101 location_position_free(priv->pos);
105 location_velocity_free(priv->vel);
109 location_accuracy_free(priv->acc);
112 priv->pos_updated_timestamp = 0;
113 priv->vel_updated_timestamp = 0;
117 __get_started(gpointer self)
119 LocationMockPrivate *priv = GET_PRIVATE(self);
120 g_return_val_if_fail(priv, FALSE);
122 return priv->is_started;
126 __set_started(gpointer self, gboolean started)
128 LocationMockPrivate *priv = GET_PRIVATE(self);
129 g_return_val_if_fail(priv, -1);
131 if (priv->is_started != started) {
132 g_mutex_lock(&priv->mutex);
133 priv->is_started = started;
134 g_mutex_unlock(&priv->mutex);
141 mock_status_cb(gboolean enabled, LocationStatus status, gpointer self)
144 g_return_if_fail(self);
145 LocationMockPrivate *priv = GET_PRIVATE(self);
146 g_return_if_fail(priv);
147 if (priv->enabled == TRUE && enabled == FALSE) {
148 __set_started(self, FALSE);
149 enable_signaling(self, signals, &(priv->enabled), enabled, status);
154 mock_location_cb(gboolean enabled, LocationPosition *pos, LocationVelocity *vel, LocationAccuracy *acc, gpointer self)
156 g_return_if_fail(self);
157 g_return_if_fail(pos);
158 g_return_if_fail(vel);
159 g_return_if_fail(acc);
160 LocationMockPrivate *priv = GET_PRIVATE(self);
161 g_return_if_fail(priv);
163 if (priv->min_interval != LOCATION_UPDATE_INTERVAL_NONE) {
164 distance_based_position_signaling(self,
173 &(priv->dist_updated_timestamp),
179 LOCATION_LOGD("Calling location_signaling, status =%d", pos->status);
181 location_signaling(self,
192 &(priv->pos_updated_timestamp),
193 &(priv->vel_updated_timestamp),
194 &(priv->loc_updated_timestamp),
201 location_setting_mock_cb(keynode_t *key, gpointer self)
204 g_return_if_fail(key);
205 g_return_if_fail(self);
206 LocationMockPrivate *priv = GET_PRIVATE(self);
207 g_return_if_fail(priv);
208 g_return_if_fail(priv->mod);
209 g_return_if_fail(priv->mod->handler);
211 int ret = LOCATION_ERROR_NONE;
213 if (location_setting_get_key_val(key) == 0) {
214 if (priv->mod->ops.stop && __get_started(self)) {
215 __set_started(self, FALSE);
216 ret = priv->mod->ops.stop(priv->mod->handler);
217 if (ret == LOCATION_ERROR_NONE)
218 __reset_pos_data_from_priv(priv);
221 if (location_setting_get_int(VCONFKEY_LOCATION_MOCK_ENABLED) == 1 && priv->mod->ops.start && !__get_started(self)) {
222 LOCATION_LOGD("location resumed by setting");
223 __set_started(self, TRUE);
224 ret = priv->mod->ops.start(priv->mod->handler, mock_status_cb, mock_location_cb, self);
225 if (ret != LOCATION_ERROR_NONE) {
226 __set_started(self, FALSE);
227 LOCATION_LOGD("Fail to start. Error[%d]", ret);
235 location_mock_start(LocationMock *self)
238 LocationMockPrivate *priv = GET_PRIVATE(self);
239 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
240 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
241 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
242 g_return_val_if_fail(priv->mod->ops.start, LOCATION_ERROR_NOT_AVAILABLE);
244 if (__get_started(self) == TRUE) return LOCATION_ERROR_NONE;
246 int ret = LOCATION_ERROR_NONE;
248 if (!location_setting_get_int(VCONFKEY_LOCATION_MOCK_ENABLED)) {
249 ret = LOCATION_ERROR_SETTING_OFF;
251 __set_started(self, TRUE);
252 ret = priv->mod->ops.start(priv->mod->handler, mock_status_cb, mock_location_cb, self);
253 if (ret != LOCATION_ERROR_NONE) {
254 __set_started(self, FALSE);
255 LOCATION_LOGE("Failed to start mock. Error[%d]", ret);
260 if (priv->app_type != CPPAPP && priv->set_noti == FALSE) {
261 location_setting_add_notify(VCONFKEY_LOCATION_MOCK_ENABLED, location_setting_mock_cb, self);
262 priv->set_noti = TRUE;
264 LOCATION_LOGD("EXIT <<<, ret = %d", ret);
270 location_mock_stop(LocationMock *self)
273 LocationMockPrivate *priv = GET_PRIVATE(self);
274 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
275 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
276 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
277 g_return_val_if_fail(priv->mod->ops.stop, LOCATION_ERROR_NOT_AVAILABLE);
279 int ret = LOCATION_ERROR_NONE;
281 if (__get_started(self) == TRUE) {
282 __set_started(self, FALSE);
283 ret = priv->mod->ops.stop(priv->mod->handler);
284 LOC_IF_FAIL_LOG(ret, _E, "Failed to stop [%s]", err_msg(ret));
287 if (priv->app_type != CPPAPP && priv->set_noti == TRUE) {
288 location_setting_ignore_notify(VCONFKEY_LOCATION_MOCK_ENABLED, location_setting_mock_cb);
289 priv->set_noti = FALSE;
292 __reset_pos_data_from_priv(priv);
298 location_mock_dispose(GObject *gobject)
301 LocationMockPrivate *priv = GET_PRIVATE(gobject);
302 g_return_if_fail(priv);
304 g_mutex_clear(&priv->mutex);
305 if (priv->app_type != CPPAPP && priv->set_noti == TRUE) {
306 location_setting_ignore_notify(VCONFKEY_LOCATION_MOCK_ENABLED, location_setting_mock_cb);
307 priv->set_noti = FALSE;
311 G_OBJECT_CLASS(location_mock_parent_class)->dispose(gobject);
315 location_mock_finalize(GObject *gobject)
318 LocationMockPrivate *priv = GET_PRIVATE(gobject);
319 g_return_if_fail(priv);
320 module_free(priv->mod, "mock");
322 if (priv->boundary_list) {
323 g_list_free_full(priv->boundary_list, free_boundary_list);
324 priv->boundary_list = NULL;
328 location_position_free(priv->pos);
333 location_velocity_free(priv->vel);
338 location_accuracy_free(priv->acc);
342 G_OBJECT_CLASS(location_mock_parent_class)->finalize(gobject);
346 location_mock_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
348 LocationMockPrivate *priv = GET_PRIVATE(object);
349 g_return_if_fail(priv);
352 switch (property_id) {
353 case PROP_BOUNDARY: {
354 GList *boundary_list = (GList *)g_list_copy(g_value_get_pointer(value));
355 ret = set_prop_boundary(&priv->boundary_list, boundary_list);
356 LOC_IF_FAIL_LOG(ret, _E, "Set boundary. Error[%s]", err_msg(ret));
357 if (boundary_list) g_list_free(boundary_list);
360 case PROP_REMOVAL_BOUNDARY: {
361 LocationBoundary *req_boundary = (LocationBoundary *) g_value_dup_boxed(value);
362 ret = set_prop_removal_boundary(&priv->boundary_list, req_boundary);
363 LOC_IF_FAIL_LOG(ret, _E, "Set removal boundary. Error[%s]", err_msg(ret));
366 case PROP_POS_INTERVAL: {
367 guint interval = g_value_get_uint(value);
369 if (interval < LOCATION_UPDATE_INTERVAL_MAX)
370 priv->pos_interval = interval;
372 priv->pos_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
374 priv->pos_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
378 case PROP_VEL_INTERVAL: {
379 guint interval = g_value_get_uint(value);
381 if (interval < LOCATION_UPDATE_INTERVAL_MAX)
382 priv->vel_interval = interval;
384 priv->vel_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
386 priv->vel_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
390 case PROP_LOC_INTERVAL: {
391 guint interval = g_value_get_uint(value);
392 LOCATION_LOGD("Set prop>> PROP_LOC_INTERVAL: %u", interval);
394 if (interval < LOCATION_UPDATE_INTERVAL_MAX)
395 priv->loc_interval = interval;
397 priv->loc_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
399 priv->loc_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
403 case PROP_MIN_INTERVAL: {
404 guint interval = g_value_get_uint(value);
405 LOCATION_LOGD("Set prop>> update-min-interval: %u", interval);
407 if (interval < LOCATION_MIN_INTERVAL_MAX)
408 priv->min_interval = interval;
410 priv->min_interval = (guint)LOCATION_MIN_INTERVAL_MAX;
412 priv->min_interval = (guint)LOCATION_MIN_INTERVAL_DEFAULT;
416 case PROP_MIN_DISTANCE: {
417 gdouble distance = g_value_get_double(value);
418 LOCATION_LOGD("Set prop>> update-min-distance: %u", distance);
420 if (distance < LOCATION_MIN_DISTANCE_MAX)
421 priv->min_distance = distance;
423 priv->min_distance = (gdouble)LOCATION_MIN_DISTANCE_MAX;
425 priv->min_distance = (gdouble)LOCATION_MIN_DISTANCE_DEFAULT;
430 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
436 location_mock_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
438 LocationMockPrivate *priv = GET_PRIVATE(object);
439 g_return_if_fail(priv);
441 switch (property_id) {
442 case PROP_METHOD_TYPE:
443 g_value_set_int(value, LOCATION_METHOD_MOCK);
445 case PROP_IS_STARTED:
446 g_value_set_boolean(value, __get_started(object));
448 case PROP_LAST_POSITION:
449 g_value_set_boxed(value, priv->pos);
452 g_value_set_pointer(value, g_list_first(priv->boundary_list));
454 case PROP_POS_INTERVAL:
455 g_value_set_uint(value, priv->pos_interval);
457 case PROP_VEL_INTERVAL:
458 g_value_set_uint(value, priv->vel_interval);
460 case PROP_LOC_INTERVAL:
461 g_value_set_uint(value, priv->loc_interval);
463 case PROP_MIN_INTERVAL:
464 g_value_set_uint(value, priv->min_interval);
466 case PROP_MIN_DISTANCE:
467 g_value_set_double(value, priv->min_distance);
469 case PROP_SERVICE_STATUS:
470 g_value_set_int(value, priv->enabled);
473 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
479 location_mock_get_position(LocationMock *self, LocationPosition **position, LocationAccuracy **accuracy)
481 int ret = LOCATION_ERROR_NOT_AVAILABLE;
483 LocationMockPrivate *priv = GET_PRIVATE(self);
484 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
485 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
486 setting_retval_if_fail(VCONFKEY_LOCATION_MOCK_ENABLED);
488 LOC_COND_RET(__get_started(self) != TRUE, LOCATION_ERROR_NOT_AVAILABLE, _E, "location is not started [%s]", err_msg(LOCATION_ERROR_NOT_AVAILABLE));
491 *position = location_position_copy(priv->pos);
492 if (priv->acc) *accuracy = location_accuracy_copy(priv->acc);
493 else *accuracy = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
494 ret = LOCATION_ERROR_NONE;
501 location_mock_get_position_ext(LocationMock *self, LocationPosition **position, LocationVelocity **velocity, LocationAccuracy **accuracy)
503 int ret = LOCATION_ERROR_NOT_AVAILABLE;
505 LocationMockPrivate *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_MOCK_ENABLED);
510 LOC_COND_RET(__get_started(self) != TRUE, LOCATION_ERROR_NOT_AVAILABLE, _E, "location is not started [%s]", err_msg(LOCATION_ERROR_NOT_AVAILABLE));
512 if (priv->pos && priv->vel) {
513 *position = location_position_copy(priv->pos);
514 *velocity = location_velocity_copy(priv->vel);
516 *accuracy = location_accuracy_copy(priv->acc);
518 *accuracy = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
520 ret = LOCATION_ERROR_NONE;
528 location_mock_get_last_position(LocationMock *self, LocationPosition **position, LocationAccuracy **accuracy)
530 LocationMockPrivate *priv = GET_PRIVATE(self);
531 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
532 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
533 setting_retval_if_fail(VCONFKEY_LOCATION_MOCK_ENABLED);
535 int ret = LOCATION_ERROR_NONE;
536 LocationVelocity *_velocity = NULL;
538 LocModMockOps ops = priv->mod->ops;
539 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
540 g_return_val_if_fail(ops.get_last_position, LOCATION_ERROR_NOT_AVAILABLE);
542 ret = ops.get_last_position(priv->mod->handler, position, &_velocity, accuracy);
543 if (_velocity) location_velocity_free(_velocity);
549 location_mock_get_last_position_ext(LocationMock *self, LocationPosition **position, LocationVelocity **velocity, LocationAccuracy **accuracy)
551 LocationMockPrivate *priv = GET_PRIVATE(self);
552 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
553 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
554 setting_retval_if_fail(VCONFKEY_LOCATION_MOCK_ENABLED);
556 LocModMockOps ops = priv->mod->ops;
557 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
558 g_return_val_if_fail(ops.get_last_position, LOCATION_ERROR_NOT_AVAILABLE);
560 return ops.get_last_position(priv->mod->handler, position, velocity, accuracy);
565 location_mock_get_velocity(LocationMock *self, LocationVelocity **velocity, LocationAccuracy **accuracy)
567 int ret = LOCATION_ERROR_NOT_AVAILABLE;
569 LocationMockPrivate *priv = GET_PRIVATE(self);
570 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
571 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
572 setting_retval_if_fail(VCONFKEY_LOCATION_MOCK_ENABLED);
574 LOC_COND_RET(__get_started(self) != TRUE, LOCATION_ERROR_NOT_AVAILABLE, _E, "location is not started [%s]", err_msg(LOCATION_ERROR_NOT_AVAILABLE));
577 *velocity = location_velocity_copy(priv->vel);
578 if (priv->acc) *accuracy = location_accuracy_copy(priv->acc);
579 else *accuracy = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
580 ret = LOCATION_ERROR_NONE;
587 location_mock_get_last_velocity(LocationMock *self, LocationVelocity **velocity, LocationAccuracy **accuracy)
589 LocationMockPrivate *priv = GET_PRIVATE(self);
590 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
591 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
592 setting_retval_if_fail(VCONFKEY_LOCATION_MOCK_ENABLED);
594 int ret = LOCATION_ERROR_NONE;
595 LocationPosition *_position = NULL;
597 LocModMockOps ops = priv->mod->ops;
598 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
599 ret = ops.get_last_position(priv->mod->handler, &_position, velocity, accuracy);
600 if (!_position) location_position_free(_position);
606 __single_location_timeout_cb(void *data)
609 LocationMock *self = (LocationMock *)data;
610 LocationMockPrivate *priv = GET_PRIVATE(self);
611 g_return_val_if_fail(priv, FALSE);
613 LocationPosition *pos = location_position_new(0, 0.0, 0.0, 0.0, LOCATION_STATUS_NO_FIX);
614 LocationVelocity *vel = location_velocity_new(0, 0.0, 0.0, 0.0);
615 LocationAccuracy *acc = location_accuracy_new(LOCATION_ACCURACY_LEVEL_NONE, 0.0, 0.0);
617 if (priv->loc_timeout) g_source_remove(priv->loc_timeout);
618 priv->loc_timeout = 0;
620 g_signal_emit(self, signals[LOCATION_UPDATED], 0, LOCATION_ERROR_NOT_AVAILABLE, pos, vel, acc);
621 location_mock_stop(self);
628 mock_single_location_cb(gboolean enabled, LocationPosition *pos, LocationVelocity *vel, LocationAccuracy *acc, gpointer self)
631 g_return_if_fail(self);
632 g_return_if_fail(pos);
633 g_return_if_fail(vel);
634 g_return_if_fail(acc);
636 LocationMockPrivate *priv = GET_PRIVATE(self);
637 g_return_if_fail(priv);
639 g_signal_emit(self, signals[LOCATION_UPDATED], 0, LOCATION_ERROR_NONE, pos, vel, acc);
640 if (priv->loc_timeout) {
641 g_source_remove(priv->loc_timeout);
642 priv->loc_timeout = 0;
644 location_mock_stop(self);
648 location_mock_request_single_location(LocationMock *self, int timeout)
651 LocationMockPrivate *priv = GET_PRIVATE(self);
652 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
653 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
654 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
655 g_return_val_if_fail(priv->mod->ops.start, LOCATION_ERROR_NOT_AVAILABLE);
657 if (__get_started(self) == TRUE) return LOCATION_ERROR_NONE;
659 int ret = LOCATION_ERROR_NONE;
661 __set_started(self, TRUE);
662 ret = priv->mod->ops.start(priv->mod->handler, mock_status_cb, mock_single_location_cb, self);
663 if (ret != LOCATION_ERROR_NONE) {
664 LOCATION_LOGE("Fail to start request single. Error[%d]", ret);
665 __set_started(self, FALSE);
668 if (priv->loc_timeout != 0)
669 g_source_remove(priv->loc_timeout);
671 priv->loc_timeout = g_timeout_add_seconds(timeout, __single_location_timeout_cb, self);
678 location_mock_get_satellite(LocationMock *self, LocationSatellite **satellite)
680 return LOCATION_ERROR_NOT_SUPPORTED;
684 location_mock_get_last_satellite(LocationMock *self, LocationSatellite **satellite)
686 return LOCATION_ERROR_NOT_SUPPORTED;
690 location_mock_set_option(LocationMock *self, const char *option)
692 LocationMockPrivate *priv = GET_PRIVATE(self);
693 g_return_val_if_fail(priv, LOCATION_ERROR_NOT_AVAILABLE);
694 g_return_val_if_fail(priv->mod, LOCATION_ERROR_NOT_AVAILABLE);
695 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
696 g_return_val_if_fail(priv->mod->ops.start, LOCATION_ERROR_NOT_AVAILABLE);
698 int ret = LOCATION_ERROR_NONE;
700 ret = priv->mod->ops.set_option(priv->mod->handler, option);
701 LOC_IF_FAIL_LOG(ret, _E, "Failed to set_option. Error[%d]", ret);
707 location_mock_get_nmea(LocationMock *self, char **nmea_data)
709 return LOCATION_ERROR_NOT_SUPPORTED;
716 location_mock_get_status(LocationMock *self, int *status)
718 LocationMockPrivate *priv = GET_PRIVATE(self);
719 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
721 if (__get_started(self) == TRUE)
726 return LOCATION_ERROR_NONE;
731 __set_mock_location_cb(gboolean enabled, LocationStatus status, gpointer self)
733 g_return_if_fail(self);
734 LocationObject *obj = (LocationObject *) self;
735 LocationMockPrivate *priv = GET_PRIVATE(obj);
736 g_return_if_fail(priv);
738 LOCATION_LOGD("ENTER >>>");
739 LOCATION_LOGD("status = %d");
740 if (status == LOCATION_STATUS_MOCK_FAIL) {
741 /* g_signal_emit(obj, signals[SERVICE_DISABLED], 0, LOCATION_STATUS_NO_FIX); */
742 g_signal_emit(obj, signals[STATUS_CHANGED], 0, LOCATION_STATUS_MOCK_FAIL);
745 LOCATION_LOGD("EXIT <<<");
749 location_mock_set_mock_location(LocationMock *self, LocationPosition *position, LocationVelocity *velocity, LocationAccuracy *accuracy)
752 LocationMockPrivate *priv = GET_PRIVATE(self);
753 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
754 g_return_val_if_fail(priv->mod->ops.set_mock_location, LOCATION_ERROR_NOT_AVAILABLE);
756 int ret = LOCATION_ERROR_NONE;
757 if (!location_setting_get_int(VCONFKEY_LOCATION_MOCK_ENABLED)) {
758 ret = LOCATION_ERROR_SETTING_OFF;
760 ret = priv->mod->ops.set_mock_location(priv->mod->handler, position, velocity, accuracy, __set_mock_location_cb, self);
761 LOC_IF_FAIL_LOG(ret, _E, "Failed to set_mock_location [%s]", err_msg(ret));
768 location_mock_clear_mock_location(LocationMock *self)
771 LocationMockPrivate *priv = GET_PRIVATE(self);
772 g_return_val_if_fail(priv->mod->handler, LOCATION_ERROR_NOT_AVAILABLE);
773 g_return_val_if_fail(priv->mod->ops.set_mock_location, LOCATION_ERROR_NOT_AVAILABLE);
775 int ret = LOCATION_ERROR_NONE;
776 if (!location_setting_get_int(VCONFKEY_LOCATION_MOCK_ENABLED)) {
777 ret = LOCATION_ERROR_SETTING_OFF;
779 ret = priv->mod->ops.clear_mock_location(priv->mod->handler, __set_mock_location_cb, self);
780 LOC_IF_FAIL_LOG(ret, _E, "Failed to clear_mock_location [%s]", err_msg(ret));
786 static void _glib_log(const gchar *log_domain, GLogLevelFlags log_level, const gchar *msg, gpointer user_data)
788 LOCATION_LOGD("GLIB[%d]: %s", log_level, msg);
793 location_ielement_interface_init(LocationIElementInterface *iface)
795 iface->start = (TYPE_START_FUNC)location_mock_start;
796 iface->stop = (TYPE_STOP_FUNC)location_mock_stop;
797 iface->get_position = (TYPE_GET_POSITION)location_mock_get_position;
798 iface->get_position_ext = (TYPE_GET_POSITION_EXT)location_mock_get_position_ext;
799 iface->get_last_position = (TYPE_GET_POSITION)location_mock_get_last_position;
800 iface->get_last_position_ext = (TYPE_GET_POSITION_EXT)location_mock_get_last_position_ext;
801 iface->get_velocity = (TYPE_GET_VELOCITY)location_mock_get_velocity;
802 iface->get_last_velocity = (TYPE_GET_VELOCITY)location_mock_get_last_velocity;
803 iface->get_satellite = (TYPE_GET_SATELLITE)location_mock_get_satellite;
804 iface->get_last_satellite = (TYPE_GET_SATELLITE)location_mock_get_last_satellite;
805 iface->set_option = (TYPE_SET_OPTION)location_mock_set_option;
806 iface->request_single_location = (TYPE_REQUEST_SINGLE_LOCATION)location_mock_request_single_location;
807 iface->get_nmea = (TYPE_GET_NMEA)location_mock_get_nmea;
809 iface->get_status = (TYPE_GET_STATUS) location_mock_get_status;
810 iface->set_mock_location = (TYPE_SET_MOCK_LOCATION) location_mock_set_mock_location;
811 iface->clear_mock_location = (TYPE_CLEAR_MOCK_LOCATION) location_mock_clear_mock_location;
815 location_mock_init(LocationMock *self)
818 LocationMockPrivate *priv = GET_PRIVATE(self);
819 g_return_if_fail(priv);
821 priv->mod = (LocationMockMod *)module_new("mock");
822 LOC_COND_LOG(!priv->mod, _E, "Module loading failed");
824 g_mutex_init(&priv->mutex);
825 priv->is_started = FALSE;
826 priv->set_noti = FALSE;
827 priv->enabled = FALSE;
829 priv->pos_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
830 priv->vel_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
831 priv->loc_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
832 priv->min_interval = LOCATION_UPDATE_INTERVAL_NONE;
834 priv->pos_updated_timestamp = 0;
835 priv->vel_updated_timestamp = 0;
836 priv->loc_updated_timestamp = 0;
841 priv->boundary_list = NULL;
843 priv->loc_timeout = 0;
845 priv->app_type = location_get_app_type(NULL);
846 LOC_COND_LOG(priv->app_type == 0, _E, "Fail to get app_type");
850 location_mock_class_init(LocationMockClass *klass)
854 GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
856 g_log_set_default_handler(_glib_log, NULL);
859 gobject_class->set_property = location_mock_set_property;
860 gobject_class->get_property = location_mock_get_property;
862 gobject_class->dispose = location_mock_dispose;
863 gobject_class->finalize = location_mock_finalize;
865 g_type_class_add_private(klass, sizeof(LocationMockPrivate));
869 signals[SERVICE_ENABLED] = g_signal_new("service-enabled",
870 G_TYPE_FROM_CLASS(klass),
873 G_STRUCT_OFFSET(LocationMockClass, enabled),
881 signals[SERVICE_DISABLED] = g_signal_new("service-disabled",
882 G_TYPE_FROM_CLASS(klass),
885 G_STRUCT_OFFSET(LocationMockClass, disabled),
891 #if 0 /* TODO: STATUS_CHANGED will aggregate SERVICE_ENABLED and SERVICE_DISABLED */
892 signals[STATUS_CHANGED] = g_signal_new("status-changed",
893 G_TYPE_FROM_CLASS(klass),
896 G_STRUCT_OFFSET(LocationMockClass, status_changed),
903 signals[SERVICE_UPDATED] = g_signal_new("service-updated",
904 G_TYPE_FROM_CLASS(klass),
907 G_STRUCT_OFFSET(LocationMockClass, service_updated),
909 location_VOID__INT_POINTER_POINTER_POINTER,
916 signals[LOCATION_UPDATED] = g_signal_new("location-updated",
917 G_TYPE_FROM_CLASS(klass),
920 G_STRUCT_OFFSET(LocationMockClass, location_updated),
922 location_VOID__INT_POINTER_POINTER_POINTER,
929 signals[ZONE_IN] = g_signal_new("zone-in",
930 G_TYPE_FROM_CLASS(klass),
933 G_STRUCT_OFFSET(LocationMockClass, zone_in),
935 location_VOID__POINTER_POINTER_POINTER,
941 signals[ZONE_OUT] = g_signal_new("zone-out",
942 G_TYPE_FROM_CLASS(klass),
945 G_STRUCT_OFFSET(LocationMockClass, zone_out),
947 location_VOID__POINTER_POINTER_POINTER,
953 properties[PROP_METHOD_TYPE] = g_param_spec_int("method",
955 "location method type name",
956 LOCATION_METHOD_MOCK,
957 LOCATION_METHOD_MOCK,
958 LOCATION_METHOD_MOCK,
961 properties[PROP_IS_STARTED] = g_param_spec_boolean("is_started",
962 "mock is started prop",
963 "mock is started status",
967 properties[PROP_LAST_POSITION] = g_param_spec_boxed("last-position",
968 "mock last position prop",
969 "mock last position data",
970 LOCATION_TYPE_POSITION,
973 properties[PROP_POS_INTERVAL] = g_param_spec_uint("pos-interval",
974 "mock position interval prop",
975 "mock position interval data",
976 LOCATION_UPDATE_INTERVAL_MIN,
977 LOCATION_UPDATE_INTERVAL_MAX,
978 LOCATION_UPDATE_INTERVAL_DEFAULT,
981 properties[PROP_VEL_INTERVAL] = g_param_spec_uint("vel-interval",
982 "mock velocity interval prop",
983 "mock velocity interval data",
984 LOCATION_UPDATE_INTERVAL_MIN,
985 LOCATION_UPDATE_INTERVAL_MAX,
986 LOCATION_UPDATE_INTERVAL_DEFAULT,
989 properties[PROP_LOC_INTERVAL] = g_param_spec_uint("loc-interval",
990 "gps location interval prop",
991 "gps location interval data",
992 LOCATION_UPDATE_INTERVAL_MIN,
993 LOCATION_UPDATE_INTERVAL_MAX,
994 LOCATION_UPDATE_INTERVAL_DEFAULT,
997 properties[PROP_MIN_INTERVAL] = g_param_spec_uint("min-interval",
998 "mock distance-based interval prop",
999 "mock distance-based interval data",
1000 LOCATION_MIN_INTERVAL_MIN,
1001 LOCATION_MIN_INTERVAL_MAX,
1002 LOCATION_MIN_INTERVAL_DEFAULT,
1005 properties[PROP_MIN_DISTANCE] = g_param_spec_double("min-distance",
1006 "mock distance-based distance prop",
1007 "mock distance-based distance data",
1008 LOCATION_MIN_DISTANCE_MIN,
1009 LOCATION_MIN_DISTANCE_MAX,
1010 LOCATION_MIN_DISTANCE_DEFAULT,
1013 properties[PROP_BOUNDARY] = g_param_spec_pointer("boundary",
1014 "mock boundary prop",
1015 "mock boundary data",
1018 properties[PROP_REMOVAL_BOUNDARY] = g_param_spec_boxed("removal-boundary",
1019 "mock removal boundary prop",
1020 "mock removal boundary data",
1021 LOCATION_TYPE_BOUNDARY,
1025 properties[PROP_SERVICE_STATUS] = g_param_spec_int("service-status",
1026 "location service status prop",
1027 "location service status data",
1028 LOCATION_STATUS_NO_FIX,
1029 LOCATION_STATUS_3D_FIX,
1030 LOCATION_STATUS_NO_FIX,
1033 g_object_class_install_properties(gobject_class, PROP_MAX, properties);