4 * Copyright (c) 2011-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.
27 #include <glib-object.h>
31 #include <lbs_dbus_server.h>
33 #include "gps_plugin_data_types.h"
34 #include "lbs_server.h"
36 #include "nps_plugin_module.h"
37 #include "nps_plugin_intf.h"
40 #include "last_position.h"
41 #include "debug_util.h"
54 gboolean is_gps_running;
55 gint gps_client_count;
58 NpsManagerHandle handle;
60 NpsManagerPositionExt pos;
61 NpsManagerLastPositionExt last_pos;
62 Plugin_LocationInfo location;
64 gboolean is_nps_running;
65 gint nps_client_count;
68 /* shared variables */
74 /* dynamic interval update */
75 GHashTable *dynamic_interval_table;
76 guint *optimized_interval_array;
77 guint temp_minimum_interval;
78 gboolean is_needed_changing_interval;
80 lbs_server_dbus_h lbs_dbus_server;
84 lbs_server_s *lbs_server;
86 } dynamic_interval_updator_user_data;
88 static gboolean gps_remove_all_clients(lbs_server_s *lbs_server);
90 static void __setting_gps_cb(keynode_t *key, gpointer user_data)
92 LOG_GPS(DBG_LOW, "ENTER >>>");
93 lbs_server_s *lbs_server = (lbs_server_s *)user_data;
97 setting_get_int(VCONFKEY_LOCATION_ENABLED, &onoff);
100 ret = gps_remove_all_clients(lbs_server);
102 LOG_GPS(DBG_LOW, "already removed.");
107 static void nps_set_last_position(NpsManagerPositionExt pos)
109 LOG_NPS(DBG_LOW, "nps_set_last_position[%d]", pos.timestamp);
111 char location[128] = {0,};
112 snprintf(location, sizeof(location), "%.6lf;%.6lf;%.2lf;%.2lf;%.2lf;%.2lf;", pos.latitude, pos.longitude, pos.altitude, pos.speed, pos.direction, pos.hor_accuracy);
114 setting_set_int(VCONFKEY_LOCATION_NV_LAST_WPS_TIMESTAMP, pos.timestamp);
115 setting_set_string(VCONFKEY_LOCATION_NV_LAST_WPS_LOCATION, location);
118 static void nps_set_position(lbs_server_s *lbs_server_nps, NpsManagerPositionExt pos)
120 LOG_NPS(DBG_LOW, "set position timestamp : %d", pos.timestamp);
121 lbs_server_nps->last_pos.timestamp = pos.timestamp;
122 setting_set_int(VCONFKEY_LOCATION_LAST_WPS_TIMESTAMP, lbs_server_nps->last_pos.timestamp);
124 if ((lbs_server_nps->last_pos.latitude != pos.latitude) || (lbs_server_nps->last_pos.longitude != pos.longitude)) {
125 lbs_server_nps->last_pos.latitude = pos.latitude;
126 lbs_server_nps->last_pos.longitude = pos.longitude;
127 lbs_server_nps->last_pos.altitude = pos.altitude;
128 lbs_server_nps->last_pos.hor_accuracy = pos.hor_accuracy;
129 lbs_server_nps->last_pos.speed = pos.speed;
130 lbs_server_nps->last_pos.direction = pos.direction;
132 setting_set_double(VCONFKEY_LOCATION_LAST_WPS_LATITUDE, lbs_server_nps->last_pos.latitude);
133 setting_set_double(VCONFKEY_LOCATION_LAST_WPS_LONGITUDE, lbs_server_nps->last_pos.longitude);
134 setting_set_double(VCONFKEY_LOCATION_LAST_WPS_ALTITUDE, lbs_server_nps->last_pos.altitude);
135 setting_set_double(VCONFKEY_LOCATION_LAST_WPS_SPEED, lbs_server_nps->last_pos.speed);
136 setting_set_double(VCONFKEY_LOCATION_LAST_WPS_DIRECTION, lbs_server_nps->last_pos.direction);
137 setting_set_double(VCONFKEY_LOCATION_LAST_WPS_HOR_ACCURACY, lbs_server_nps->last_pos.hor_accuracy);
140 int last_timestamp = 0;
141 setting_get_int(VCONFKEY_LOCATION_NV_LAST_WPS_TIMESTAMP, &last_timestamp);
143 LOG_NPS(DBG_LOW, "last_time stamp: %d, pos.timestamp: %d, UPDATE_INTERVAL: %d ", last_timestamp, pos.timestamp, UPDATE_INTERVAL);
144 if ((pos.timestamp - last_timestamp) > UPDATE_INTERVAL) {
145 nps_set_last_position(pos);
150 static void nps_set_status(lbs_server_s *lbs_server, LbsStatus status)
153 LOG_NPS(DBG_ERR, "lbs_server is NULL!!");
156 LOG_NPS(DBG_LOW, "nps_set_status[%d]", status);
157 if (lbs_server->status == status) {
158 LOG_NPS(DBG_ERR, "Donot update NPS status");
162 lbs_server->status = status;
164 if (lbs_server->status == LBS_STATUS_AVAILABLE) {
165 setting_set_int(VCONFKEY_LOCATION_WPS_STATE, POSITION_CONNECTED);
166 } else if (lbs_server->status == LBS_STATUS_ACQUIRING) {
167 setting_set_int(VCONFKEY_LOCATION_WPS_STATE, POSITION_SEARCHING);
169 setting_set_int(VCONFKEY_LOCATION_WPS_STATE, POSITION_OFF);
172 if (status != LBS_STATUS_AVAILABLE) {
173 lbs_server->pos.fields = LBS_POSITION_FIELDS_NONE;
176 lbs_server_emit_status_changed(lbs_server->lbs_dbus_server, LBS_SERVER_METHOD_NPS, status);
179 static void nps_update_position(lbs_server_s *lbs_server_nps, NpsManagerPositionExt pos)
181 if (!lbs_server_nps) {
182 LOG_NPS(DBG_ERR, "lbs-server is NULL!!");
186 GVariant *accuracy = NULL;
188 LOG_NPS(DBG_LOW, "nps_update_position");
189 lbs_server_nps->pos.fields = pos.fields;
190 lbs_server_nps->pos.timestamp = pos.timestamp;
191 lbs_server_nps->pos.latitude = pos.latitude;
192 lbs_server_nps->pos.longitude = pos.longitude;
193 lbs_server_nps->pos.altitude = pos.altitude;
194 lbs_server_nps->pos.hor_accuracy = pos.hor_accuracy;
195 lbs_server_nps->pos.ver_accuracy = pos.ver_accuracy;
197 accuracy = g_variant_ref_sink(g_variant_new("(idd)", lbs_server_nps->pos.acc_level, lbs_server_nps->pos.hor_accuracy, lbs_server_nps->pos.ver_accuracy));
199 LOG_NPS(DBG_LOW, "time:%d", lbs_server_nps->pos.timestamp);
201 lbs_server_emit_position_changed(lbs_server_nps->lbs_dbus_server, LBS_SERVER_METHOD_NPS,
202 lbs_server_nps->pos.fields, lbs_server_nps->pos.timestamp, lbs_server_nps->pos.latitude,
203 lbs_server_nps->pos.longitude, lbs_server_nps->pos.altitude, lbs_server_nps->pos.speed,
204 lbs_server_nps->pos.direction, 0.0, accuracy);
206 g_variant_unref(accuracy);
209 static gboolean nps_report_callback(gpointer user_data)
211 LOG_NPS(DBG_LOW, "ENTER >>>");
212 double vertical_accuracy = -1.0; /* vertical accuracy's invalid value is -1 */
213 Plugin_LocationInfo location;
214 memset(&location, 0x00, sizeof(Plugin_LocationInfo));
215 lbs_server_s *lbs_server_nps = (lbs_server_s *) user_data;
216 if (NULL == lbs_server_nps) {
217 LOG_GPS(DBG_ERR, "lbs_server_s is NULL!!");
222 g_mutex_lock(&lbs_server_nps->mutex);
223 memcpy(&location, &lbs_server_nps->location, sizeof(Plugin_LocationInfo));
224 g_mutex_unlock(&lbs_server_nps->mutex);
227 if (timestamp == lbs_server_nps->last_pos.timestamp) {
231 nps_set_status(lbs_server_nps, LBS_STATUS_AVAILABLE);
233 NpsManagerPositionExt pos;
234 memset(&pos, 0x00, sizeof(NpsManagerPositionExt));
236 pos.timestamp = timestamp;
238 if (location.latitude) {
239 pos.fields |= LBS_POSITION_EXT_FIELDS_LATITUDE;
240 pos.latitude = location.latitude;
243 if (location.longitude) {
244 pos.fields |= LBS_POSITION_EXT_FIELDS_LONGITUDE;
245 pos.longitude = location.longitude;
248 if (location.altitude) {
249 pos.fields |= LBS_POSITION_EXT_FIELDS_ALTITUDE;
250 pos.altitude = location.altitude;
253 if (location.speed >= 0) {
254 pos.fields |= LBS_POSITION_EXT_FIELDS_SPEED;
255 pos.speed = location.speed;
257 if (location.bearing >= 0) {
258 pos.fields |= LBS_POSITION_EXT_FIELDS_DIRECTION;
259 pos.direction = location.bearing;
262 pos.acc_level = LBS_ACCURACY_LEVEL_STREET;
263 pos.hor_accuracy = location.hpe;
264 pos.ver_accuracy = vertical_accuracy;
266 nps_update_position(lbs_server_nps, pos);
268 nps_set_position(lbs_server_nps, pos);
273 static void __nps_callback(void *arg, const Plugin_LocationInfo *location, const void *reserved)
275 LOG_NPS(DBG_LOW, "ENTER >>>");
276 lbs_server_s *lbs_server = (lbs_server_s *)arg;
278 LOG_NPS(DBG_ERR, "lbs_server is NULL!!");
283 LOG_NPS(DBG_LOW, "NULL is returned from plugin...");
284 /* sometimes plugin returns NULL even if it is connected... */
285 /*nps_set_status (lbs_server , LBS_STATUS_ACQUIRING); */
289 g_mutex_lock(&lbs_server->mutex);
290 memcpy(&lbs_server->location, location, sizeof(Plugin_LocationInfo));
291 g_mutex_unlock(&lbs_server->mutex);
293 g_main_context_invoke(NULL, nps_report_callback, arg);
296 static void _nps_token_callback(void *arg, const unsigned char *token, unsigned tokenSize)
298 LOG_NPS(DBG_LOW, "ENTER >>>");
299 lbs_server_s *lbs_server_nps = (lbs_server_s *)arg;
300 if (NULL == lbs_server_nps) {
301 LOG_NPS(DBG_ERR, "lbs-server is NULL!!");
306 LOG_NPS(DBG_ERR, "*** no token to save\n");
308 /* save the token in persistent storage */
309 g_mutex_lock(&lbs_server_nps->mutex);
310 lbs_server_nps->token = g_new0(unsigned char, tokenSize);
311 if (lbs_server_nps->token) {
312 memcpy(lbs_server_nps->token, token, tokenSize);
314 g_mutex_unlock(&lbs_server_nps->mutex);
316 LOG_NPS(DBG_LOW, "_nps_token_callback ended");
319 static void _network_enabled_cb(keynode_t *key, void *user_data)
321 LOG_GPS(DBG_LOW, "ENTER >>>");
324 setting_get_int(VCONFKEY_LOCATION_NETWORK_ENABLED, &enabled);
326 /* This is vestige of nps-server
327 lbs_server_s *lbs_server_nps = (lbs_server_s *)user_data;
330 if (lbs_server_nps->loop != NULL) {
331 g_main_loop_quit(lbs_server_nps->loop);
336 static gboolean nps_offline_location(lbs_server_s *lbs_server)
338 LOG_NPS(DBG_LOW, "ENTER >>>");
339 if (NULL == lbs_server) {
340 LOG_GPS(DBG_ERR, "lbs-server is NULL!!");
343 char key[NPS_UNIQUE_ID_LEN] = { 0, };
345 if (setting_get_unique_id(key)) {
346 LOG_NPS(DBG_LOW, "key = %s", key);
347 get_nps_plugin_module()->getOfflineToken((unsigned char *)key, NPS_UNIQUE_ID_LEN,
348 _nps_token_callback, lbs_server);
349 if (lbs_server->token != NULL) {
350 LOG_NPS(DBG_LOW, "Token = %s", lbs_server->token);
351 int ret = get_nps_plugin_module()->offlineLocation((unsigned char *)key,
352 NPS_UNIQUE_ID_LEN, lbs_server->token, 0,
353 __nps_callback, lbs_server);
355 if (lbs_server->is_nps_running) {
356 LOG_NPS(DBG_LOW, "offlineLocation() called nps_callback successfully.");
361 LOG_NPS(DBG_ERR, "getOfflineToken(): Token is NULL");
364 LOG_NPS(DBG_ERR, "lbs_get_unique_id() failed.");
369 static void __nps_cancel_callback(void *arg)
371 LOG_NPS(DBG_LOW, "__nps_cancel_callback");
372 lbs_server_s *lbs_server = (lbs_server_s *) arg;
374 LOG_NPS(DBG_ERR, "lbs-server is NULL!!");
378 g_mutex_lock(&lbs_server->mutex);
379 lbs_server->is_nps_running = FALSE;
380 g_cond_signal(&lbs_server->cond);
381 g_mutex_unlock(&lbs_server->mutex);
384 static void start_batch_tracking(lbs_server_s *lbs_server, int batch_interval, int batch_period)
386 g_mutex_lock(&lbs_server->mutex);
387 lbs_server->gps_client_count++;
388 g_mutex_unlock(&lbs_server->mutex);
390 if (lbs_server->is_gps_running == TRUE) {
391 LOG_GPS(DBG_LOW, "Batch: gps is already running");
394 LOG_GPS(DBG_LOW, "Batch: start_tracking GPS");
395 lbs_server->status = LBS_STATUS_ACQUIRING;
397 if (request_start_batch_session(batch_interval, batch_period) == TRUE) {
398 g_mutex_lock(&lbs_server->mutex);
399 lbs_server->is_gps_running = TRUE;
400 g_mutex_unlock(&lbs_server->mutex);
402 lbs_server->is_needed_changing_interval = FALSE;
405 setting_notify_key_changed(VCONFKEY_LOCATION_ENABLED, __setting_gps_cb, lbs_server);
407 LOG_GPS(DBG_ERR, "Batch: Fail to request_start_batch_session");
411 static void stop_batch_tracking(lbs_server_s *lbs_server)
413 LOG_GPS(DBG_LOW, "ENTER >>>");
415 g_mutex_lock(&lbs_server->mutex);
416 lbs_server->gps_client_count--;
417 g_mutex_unlock(&lbs_server->mutex);
419 if (lbs_server->is_gps_running == FALSE) {
420 LOG_GPS(DBG_LOW, "Batch: gps- is already stopped");
424 if (lbs_server->gps_client_count <= 0) {
425 g_mutex_lock(&lbs_server->mutex);
426 lbs_server->gps_client_count = 0;
428 if (request_stop_batch_session() == TRUE) {
429 lbs_server->is_gps_running = FALSE;
430 lbs_server->sv_used = FALSE;
432 setting_ignore_key_changed(VCONFKEY_LOCATION_ENABLED, __setting_gps_cb);
433 g_mutex_unlock(&lbs_server->mutex);
437 lbs_server->status = LBS_STATUS_UNAVAILABLE;
438 lbs_server_emit_status_changed(lbs_server->lbs_dbus_server, LBS_SERVER_METHOD_GPS, LBS_STATUS_UNAVAILABLE);
441 static void start_tracking(lbs_server_s *lbs_server, lbs_server_method_e method)
444 case LBS_SERVER_METHOD_GPS:
446 g_mutex_lock(&lbs_server->mutex);
447 lbs_server->gps_client_count++;
448 g_mutex_unlock(&lbs_server->mutex);
450 if (lbs_server->is_gps_running == TRUE) {
451 LOG_GPS(DBG_LOW, "gps is already running");
454 LOG_GPS(DBG_LOW, "start_tracking GPS");
455 lbs_server->status = LBS_STATUS_ACQUIRING;
457 if (request_start_session((int)(lbs_server->optimized_interval_array[method])) == TRUE) {
458 g_mutex_lock(&lbs_server->mutex);
459 lbs_server->is_gps_running = TRUE;
460 g_mutex_unlock(&lbs_server->mutex);
462 lbs_server->is_needed_changing_interval = FALSE;
465 setting_notify_key_changed(VCONFKEY_LOCATION_ENABLED, __setting_gps_cb, lbs_server);
467 LOG_GPS(DBG_ERR, "Fail to request_start_session");
472 case LBS_SERVER_METHOD_NPS:
473 g_mutex_lock(&lbs_server->mutex);
474 lbs_server->nps_client_count++;
475 g_mutex_unlock(&lbs_server->mutex);
477 if (lbs_server->is_nps_running == TRUE) {
478 LOG_NPS(DBG_LOW, "nps is already running");
482 LOG_NPS(DBG_LOW, "start_tracking - LBS_SERVER_METHOD_NPS");
483 nps_set_status(lbs_server, LBS_STATUS_ACQUIRING);
485 void *handle_str = NULL;
486 int ret = get_nps_plugin_module()->start(lbs_server->period, __nps_callback, lbs_server, &(handle_str));
487 LOG_NPS(DBG_LOW, "after get_nps_plugin_module()->location");
490 lbs_server->handle = handle_str;
491 g_mutex_lock(&lbs_server->mutex);
492 lbs_server->is_nps_running = TRUE;
493 g_mutex_unlock(&lbs_server->mutex);
494 vconf_ignore_key_changed(VCONFKEY_LOCATION_NETWORK_ENABLED, _network_enabled_cb);
498 if (nps_is_dummy_plugin_module() != TRUE) {
499 nps_offline_location(lbs_server);
502 LOG_NPS(DBG_ERR, "FAILS WPS START");
503 nps_set_status(lbs_server, LBS_STATUS_ERROR);
507 LOG_GPS(DBG_LOW, "start_tracking Invalid");
512 static gboolean nps_stop(lbs_server_s *lbs_server_nps)
514 LOG_NPS(DBG_LOW, "ENTER >>>");
515 if (!lbs_server_nps) {
516 LOG_NPS(DBG_ERR, "lbs-server is NULL!!");
520 int ret = get_nps_plugin_module()->stop(lbs_server_nps->handle, __nps_cancel_callback, lbs_server_nps);
522 g_mutex_lock(&lbs_server_nps->mutex);
523 while (lbs_server_nps->is_nps_running) {
524 g_cond_wait(&lbs_server_nps->cond, &lbs_server_nps->mutex);
526 lbs_server_nps->is_nps_running = FALSE;
527 g_mutex_unlock(&lbs_server_nps->mutex);
529 /* This is vestige of nps-server
531 if (lbs_server_nps->loop != NULL) {
532 LOG_NPS(DBG_ERR, "module->stop() is failed. nps is cloesed.");
533 g_main_loop_quit(lbs_server_nps->loop);
539 nps_set_status(lbs_server_nps, LBS_STATUS_UNAVAILABLE);
544 static void stop_tracking(lbs_server_s *lbs_server, lbs_server_method_e method)
547 case LBS_SERVER_METHOD_GPS:
548 LOG_GPS(DBG_LOW, "stop_tracking GPS");
550 gps_set_last_position(&lbs_server->position);
552 g_mutex_lock(&lbs_server->mutex);
553 lbs_server->gps_client_count--;
554 g_mutex_unlock(&lbs_server->mutex);
556 if (lbs_server->is_gps_running == FALSE) {
557 LOG_GPS(DBG_LOW, "gps- is already stopped");
561 if (lbs_server->gps_client_count <= 0) {
562 g_mutex_lock(&lbs_server->mutex);
563 lbs_server->gps_client_count = 0;
565 if (request_stop_session() == TRUE) {
566 lbs_server->is_gps_running = FALSE;
567 lbs_server->sv_used = FALSE;
569 setting_ignore_key_changed(VCONFKEY_LOCATION_ENABLED, __setting_gps_cb);
570 g_mutex_unlock(&lbs_server->mutex);
574 lbs_server->status = LBS_STATUS_UNAVAILABLE;
575 lbs_server_emit_status_changed(lbs_server->lbs_dbus_server, LBS_SERVER_METHOD_GPS,
576 LBS_STATUS_UNAVAILABLE);
579 case LBS_SERVER_METHOD_NPS:
580 LOG_NPS(DBG_LOW, "stop_tracking NPS");
582 g_mutex_lock(&lbs_server->mutex);
583 lbs_server->nps_client_count--;
584 g_mutex_unlock(&lbs_server->mutex);
586 if (lbs_server->is_nps_running == FALSE) {
587 LOG_NPS(DBG_LOW, "nps- is already stopped");
591 if (lbs_server->nps_client_count <= 0) {
592 g_mutex_lock(&lbs_server->mutex);
593 lbs_server->nps_client_count = 0;
594 g_mutex_unlock(&lbs_server->mutex);
596 LOG_NPS(DBG_LOW, "lbs_server_nps Normal stop");
597 nps_stop(lbs_server);
602 LOG_GPS(DBG_LOW, "stop_tracking Invalid");
606 static void update_dynamic_interval_table_foreach_cb(gpointer key, gpointer value, gpointer userdata)
608 guint *interval_array = (guint *)value;
609 dynamic_interval_updator_user_data *updator_ud = (dynamic_interval_updator_user_data *)userdata;
610 lbs_server_s *lbs_server = updator_ud->lbs_server;
611 int method = updator_ud->method;
613 LOG_GPS(DBG_LOW, "method:[%d], key:[%s] interval:[%u], current optimized interval [%u]", method, (char *)key, interval_array[method], lbs_server->optimized_interval_array[method]);
614 if ((lbs_server->temp_minimum_interval > interval_array[method])) {
615 lbs_server->temp_minimum_interval = interval_array[method];
619 static gboolean update_pos_tracking_interval(lbs_server_interval_manipulation_type type, const gchar *client, int method, guint interval, gpointer userdata)
621 LOG_GPS(DBG_LOW, "ENTER >>>");
622 if (userdata == NULL) return FALSE;
623 if (client == NULL) {
624 LOG_GPS(DBG_ERR, "client is NULL");
628 if (method < LBS_SERVER_METHOD_GPS || method >= LBS_SERVER_METHOD_SIZE) {
629 LOG_GPS(DBG_ERR, "unavailable method [%d]", method);
633 gboolean ret_val = FALSE;
634 lbs_server_s *lbs_server = (lbs_server_s *)userdata;
636 /* manipulate logic for dynamic-interval hash table */
638 case LBS_SERVER_INTERVAL_ADD: {
639 LOG_GPS(DBG_LOW, "ADD, client[%s], method[%d], interval[%u]", client, method, interval);
640 gchar *client_cpy = NULL;
641 client_cpy = g_strdup(client);
643 guint *interval_array = (guint *) g_hash_table_lookup(lbs_server->dynamic_interval_table, client_cpy);
644 if (!interval_array) {
645 LOG_GPS(DBG_LOW, "first add key[%s] to interval-table", client);
646 interval_array = (guint *)g_malloc0(LBS_SERVER_METHOD_SIZE * sizeof(guint));
647 if (!interval_array) {
648 LOG_GPS(DBG_ERR, "interval_array is NULL");
652 g_hash_table_insert(lbs_server->dynamic_interval_table, (gpointer)client_cpy, (gpointer)interval_array);
654 interval_array[method] = interval;
655 lbs_server->temp_minimum_interval = interval;
656 LOG_GPS(DBG_LOW, "ADD done");
660 case LBS_SERVER_INTERVAL_REMOVE: {
661 LOG_GPS(DBG_LOW, "REMOVE, client[%s], method[%d]", client, method);
662 lbs_server->temp_minimum_interval = 120; /* interval max value */
663 guint *interval_array = (guint *) g_hash_table_lookup(lbs_server->dynamic_interval_table, client);
664 if (!interval_array) {
665 LOG_GPS(DBG_INFO, "Client[%s] Method[%d] is already removed from interval-table", client, method);
668 LOG_GPS(DBG_LOW, "Found interval_array[%d](%p):[%u] from interval-table", method, interval_array, interval_array[method]);
669 interval_array[method] = 0;
672 guint interval_each = 0;
673 gboolean is_need_remove_client_from_table = TRUE;
674 for (i = 0; i < LBS_SERVER_METHOD_SIZE; i++) {
675 interval_each = interval_array[i];
676 if (interval_each != 0) {
677 LOG_GPS(DBG_LOW, "[%s] method[%d]'s interval is not zero - interval: %d. It will not be removed.", client, i, interval_each);
678 is_need_remove_client_from_table = FALSE;
683 if (is_need_remove_client_from_table) {
684 LOG_GPS(DBG_LOW, "is_need_remove_client_from_table is TRUE");
685 if (!g_hash_table_remove(lbs_server->dynamic_interval_table, client)) {
686 LOG_GPS(DBG_ERR, "g_hash_table_remove is failed.");
688 LOG_GPS(DBG_LOW, "REMOVE done.");
693 case LBS_SERVER_INTERVAL_UPDATE: {
694 LOG_GPS(DBG_LOW, "UPDATE client[%s], method[%d], interval[%u]", client, method, interval);
695 guint *interval_array = (guint *) g_hash_table_lookup(lbs_server->dynamic_interval_table, client);
696 if (!interval_array) {
697 LOG_GPS(DBG_LOW, "Client[%s] is not exist in interval-table", client, method);
700 interval_array[method] = interval;
701 lbs_server->temp_minimum_interval = interval;
702 LOG_GPS(DBG_LOW, "UPDATE done.");
707 LOG_GPS(DBG_ERR, "unhandled interval-update type");
712 /* update logic for optimized-interval value */
713 if (g_hash_table_size(lbs_server->dynamic_interval_table) == 0) {
714 LOG_GPS(DBG_LOW, "dynamic_interval_table size is zero. It will be updated all value as 0");
716 for (i = 0; i < LBS_SERVER_METHOD_SIZE; i++) {
717 lbs_server->optimized_interval_array[i] = 0;
721 LOG_GPS(DBG_LOW, "dynamic_interval_table size is not zero.");
723 dynamic_interval_updator_user_data updator_user_data;
724 updator_user_data.lbs_server = lbs_server;
725 updator_user_data.method = method;
727 g_hash_table_foreach(lbs_server->dynamic_interval_table, (GHFunc)update_dynamic_interval_table_foreach_cb, (gpointer)&updator_user_data);
729 if (lbs_server->optimized_interval_array[method] != lbs_server->temp_minimum_interval) {
730 LOG_GPS(DBG_INFO, "Changing optimized_interval value [%u -> %u] for method [%d]",
731 lbs_server->optimized_interval_array[method], lbs_server->temp_minimum_interval, method);
732 lbs_server->optimized_interval_array[method] = lbs_server->temp_minimum_interval;
734 /* need to send message to provider device */
735 lbs_server->is_needed_changing_interval = TRUE;
738 if (lbs_server->is_needed_changing_interval) {
744 LOG_GPS(DBG_LOW, "update_pos_tracking_interval done.");
748 static void request_change_pos_update_interval(int method, gpointer userdata)
750 LOG_GPS(DBG_LOW, "ENTER >>>");
751 if (!userdata) return;
753 lbs_server_s *lbs_server = (lbs_server_s *)userdata;
755 case LBS_SERVER_METHOD_GPS:
756 request_change_pos_update_interval_standalone_gps(lbs_server->optimized_interval_array[method]);
763 static void get_nmea(int *timestamp, gchar **nmea_data, gpointer userdata)
765 LOG_GPS(DBG_LOW, "ENTER >>>");
766 if (!userdata) return;
768 get_nmea_from_server(timestamp, nmea_data);
770 LOG_GPS(DBG_LOW, "timestmap: %d, nmea_data: %s", *timestamp, *nmea_data);
773 static void set_options(GVariant *options, const gchar *client, gpointer userdata)
775 LOG_GPS(DBG_LOW, "ENTER >>>");
776 lbs_server_s *lbs_server = (lbs_server_s *)userdata;
780 GVariant *value = NULL;
781 gboolean ret = FALSE;
782 #ifdef _TIZEN_PUBLIC_
783 char *msg_header = NULL;
784 char *msg_body = NULL;
792 lbs_server_method_e method = 0;
794 g_variant_iter_init(&iter, options);
795 ret = g_variant_iter_next(&iter, "{&sv}", &key, &value);
797 LOG_GPS(DBG_ERR, "Invalid GVariant");
800 if (!g_strcmp0(key, "CMD")) {
801 LOG_GPS(DBG_LOW, "set_options [%s]", g_variant_get_string(value, &length));
802 if (!g_strcmp0(g_variant_get_string(value, &length), "START")) {
804 while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
805 if (!g_strcmp0(key, "METHOD")) {
806 method = g_variant_get_int32(value);
807 LOG_GPS(DBG_LOW, "METHOD [%d]", method);
810 if (!g_strcmp0(key, "INTERVAL")) {
811 interval = g_variant_get_uint32(value);
812 LOG_GPS(DBG_LOW, "INTERVAL [%u]", interval);
815 if (!g_strcmp0(key, "APP_ID")) {
816 app_id = g_variant_dup_string(value, &length);
817 LOG_GPS(DBG_LOW, "APP_ID [%s]", app_id);
822 update_pos_tracking_interval(LBS_SERVER_INTERVAL_ADD, client, method, interval, lbs_server);
826 if (LBS_SERVER_METHOD_GPS == method) {
827 gps_dump_log("START GPS", app_id);
832 start_tracking(lbs_server, method);
834 if (lbs_server->is_needed_changing_interval) {
835 lbs_server->is_needed_changing_interval = FALSE;
836 request_change_pos_update_interval(method, (gpointer)lbs_server);
838 } else if (!g_strcmp0(g_variant_get_string(value, &length), "STOP")) {
840 while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
841 if (!g_strcmp0(key, "METHOD")) {
842 method = g_variant_get_int32(value);
843 LOG_GPS(DBG_LOW, "METHOD [%d]", method);
846 if (!g_strcmp0(key, "APP_ID")) {
847 app_id = g_variant_dup_string(value, &length);
848 LOG_GPS(DBG_LOW, "APP_ID [%s]", app_id);
853 update_pos_tracking_interval(LBS_SERVER_INTERVAL_REMOVE, client, method, interval, lbs_server);
857 if (LBS_SERVER_METHOD_GPS == method) {
858 gps_dump_log("STOP GPS", app_id);
863 stop_tracking(lbs_server, method);
865 if (lbs_server->is_needed_changing_interval) {
866 lbs_server->is_needed_changing_interval = FALSE;
867 request_change_pos_update_interval(method, (gpointer)lbs_server);
869 } else if (!g_strcmp0(g_variant_get_string(value, &length), "START_BATCH")) {
871 int batch_interval = 0;
872 int batch_period = 0;
873 while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
875 if (!g_strcmp0(key, "BATCH_INTERVAL")) {
876 batch_interval = g_variant_get_int32(value);
877 LOG_GPS(DBG_LOW, "BATCH_INTERVAL [%d]", batch_interval);
878 } else if (!g_strcmp0(key, "BATCH_PERIOD")) {
879 batch_period = g_variant_get_int32(value);
880 LOG_GPS(DBG_LOW, "BATCH_PERIOD [%d]", batch_period);
885 update_pos_tracking_interval(LBS_SERVER_INTERVAL_ADD, client, method, batch_interval, lbs_server);
888 start_batch_tracking(lbs_server, batch_interval, batch_period);
890 if (lbs_server->is_needed_changing_interval) {
891 lbs_server->is_needed_changing_interval = FALSE;
892 request_change_pos_update_interval(method, (gpointer)lbs_server);
895 } else if (!g_strcmp0(g_variant_get_string(value, &length), "STOP_BATCH")) {
898 update_pos_tracking_interval(LBS_SERVER_INTERVAL_REMOVE, client, method, interval, lbs_server);
901 stop_batch_tracking(lbs_server);
903 if (lbs_server->is_needed_changing_interval) {
904 lbs_server->is_needed_changing_interval = FALSE;
905 request_change_pos_update_interval(method, (gpointer)lbs_server);
908 #ifdef _TIZEN_PUBLIC_
909 } else if (!g_strcmp0(g_variant_get_string(value, &length), "SUPLNI")) {
910 while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
911 if (!g_strcmp0(key, "HEADER")) {
912 msg_header = g_variant_dup_string(value, &length);
913 } else if (!g_strcmp0(key, "BODY")) {
914 size = (int) g_variant_get_size(value);
915 msg_body = (char *) g_malloc0(sizeof(char) * size);
916 memcpy(msg_body, g_variant_get_data(value), size);
917 } else if (!g_strcmp0(key, "SIZE")) {
918 size = (int) g_variant_get_int32(value);
921 request_supl_ni_session(msg_header, msg_body, size);
922 if (msg_header) g_free(msg_header);
923 if (msg_body) g_free(msg_body);
926 else if (!g_strcmp0(g_variant_get_string(value, &length), "SET:OPT")) {
927 LOG_GPS(DBG_LOW, "SET:OPT is called");
928 gboolean is_update_interval = FALSE, is_update_interval_method = FALSE;
930 while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
932 if (!g_strcmp0(key, "OPTION")) {
933 option = g_variant_dup_string(value, &length);
934 LOG_GPS(DBG_ERR, "option [%s]", option);
936 if (!g_strcmp0(option, "DELGPS")) {
937 if (request_delete_gps_data() != TRUE) {
938 LOG_GPS(DBG_ERR, "Fail to request_delete_gps_data");
940 } else if (!g_strcmp0(option, "USE_SV")) {
941 g_mutex_lock(&lbs_server->mutex);
942 if (lbs_server->sv_used == FALSE)
943 lbs_server->sv_used = TRUE;
944 g_mutex_unlock(&lbs_server->mutex);
949 if (!g_strcmp0(key, "METHOD")) {
950 method = g_variant_get_int32(value);
951 LOG_GPS(DBG_LOW, "METHOD [%d]", method);
952 is_update_interval_method = TRUE;
955 if (!g_strcmp0(key, "INTERVAL_UPDATE")) {
956 interval = g_variant_get_uint32(value);
957 LOG_GPS(DBG_LOW, "INTERVAL_UPDATE [%u] <-- [%u] ", interval, lbs_server->temp_minimum_interval);
958 if (interval != lbs_server->temp_minimum_interval)
959 is_update_interval = TRUE;
963 if (is_update_interval && is_update_interval_method && client) {
964 update_pos_tracking_interval(LBS_SERVER_INTERVAL_UPDATE, client, method, interval, lbs_server);
965 if (lbs_server->is_needed_changing_interval) {
966 lbs_server->is_needed_changing_interval = FALSE;
967 request_change_pos_update_interval(method, (gpointer)lbs_server);
974 static gboolean gps_remove_all_clients(lbs_server_s *lbs_server)
976 LOG_GPS(DBG_LOW, "remove_all_clients GPS");
977 if (lbs_server->gps_client_count <= 0) {
978 lbs_server->gps_client_count = 0;
982 lbs_server->gps_client_count = 0;
983 stop_tracking(lbs_server, LBS_SERVER_METHOD_GPS);
988 static void shutdown(gpointer userdata, gboolean *shutdown_arr)
990 LOG_GPS(DBG_LOW, "shutdown callback gps:%d nps:%d", shutdown_arr[LBS_SERVER_METHOD_GPS], shutdown_arr[LBS_SERVER_METHOD_NPS]);
991 lbs_server_s *lbs_server = (lbs_server_s *)userdata;
993 if (shutdown_arr[LBS_SERVER_METHOD_GPS]) {
994 LOG_GPS(DBG_LOW, "-> shutdown GPS");
995 if (lbs_server->is_gps_running) {
996 if (gps_remove_all_clients(lbs_server)) {
997 LOG_GPS(DBG_ERR, "<<<< Abnormal shutdown >>>>");
1002 if (shutdown_arr[LBS_SERVER_METHOD_NPS]) {
1003 LOG_NPS(DBG_LOW, "-> shutdown NPS");
1004 if (lbs_server->is_nps_running) {
1005 LOG_NPS(DBG_ERR, "lbs_server_nps is running. nps_stop");
1006 nps_stop(lbs_server);
1012 setting_get_int(VCONFKEY_LOCATION_NETWORK_ENABLED, &enabled);
1014 if (lbs_server->loop != NULL) {
1015 g_main_loop_quit(lbs_server->loop);
1018 if (vconf_notify_key_changed(VCONFKEY_LOCATION_NETWORK_ENABLED, _network_enabled_cb, lbs_server)) {
1019 LOG_NPS(DBG_ERR, "fail to notify VCONFKEY_LOCATION_NETWORK_ENABLED");
1025 static void gps_update_position_cb(pos_data_t *pos, gps_error_t error, void *user_data)
1027 LOG_GPS(DBG_LOW, "ENTER >>>");
1029 GVariant *accuracy = NULL;
1030 LbsPositionExtFields fields;
1032 lbs_server_s *lbs_server = (lbs_server_s *)(user_data);
1034 memcpy(&lbs_server->position, pos, sizeof(pos_data_t));
1036 if (lbs_server->status != LBS_STATUS_AVAILABLE) {
1037 lbs_server_emit_status_changed(lbs_server->lbs_dbus_server, LBS_SERVER_METHOD_GPS, LBS_STATUS_AVAILABLE);
1038 lbs_server->status = LBS_STATUS_AVAILABLE;
1041 fields = (LBS_POSITION_EXT_FIELDS_LATITUDE | LBS_POSITION_EXT_FIELDS_LONGITUDE | LBS_POSITION_EXT_FIELDS_ALTITUDE | LBS_POSITION_EXT_FIELDS_SPEED | LBS_POSITION_EXT_FIELDS_DIRECTION);
1043 accuracy = g_variant_new("(idd)", LBS_ACCURACY_LEVEL_DETAILED, pos->hor_accuracy, pos->ver_accuracy);
1044 if (NULL == accuracy) {
1045 LOG_GPS(DBG_LOW, "accuracy is NULL");
1048 lbs_server_emit_position_changed(lbs_server->lbs_dbus_server, LBS_SERVER_METHOD_GPS,
1049 fields, pos->timestamp, pos->latitude, pos->longitude, pos->altitude,
1050 pos->speed, pos->bearing, 0.0, accuracy);
1053 static void gps_update_batch_cb(batch_data_t *batch, void *user_data)
1055 LOG_GPS(DBG_LOW, "ENTER >>>");
1056 lbs_server_s *lbs_server = (lbs_server_s *)(user_data);
1057 memcpy(&lbs_server->batch, batch, sizeof(batch_data_t));
1059 if (lbs_server->status != LBS_STATUS_AVAILABLE) {
1060 lbs_server_emit_status_changed(lbs_server->lbs_dbus_server, LBS_SERVER_METHOD_GPS, LBS_STATUS_AVAILABLE);
1061 lbs_server->status = LBS_STATUS_AVAILABLE;
1064 lbs_server_emit_batch_changed(lbs_server->lbs_dbus_server, batch->num_of_location);
1067 static void gps_update_satellite_cb(sv_data_t *sv, void *user_data)
1069 lbs_server_s *lbs_server = (lbs_server_s *)(user_data);
1070 if (lbs_server->sv_used == FALSE) {
1071 /*LOG_GPS(DBG_LOW, "sv_used is FALSE"); */
1075 LOG_GPS(DBG_LOW, "ENTER >>>");
1078 int satellite_used = 0;
1079 GVariant *used_prn = NULL;
1080 GVariantBuilder *used_prn_builder = NULL;
1081 GVariant *satellite_info = NULL;
1082 GVariantBuilder *satellite_info_builder = NULL;
1084 memcpy(&lbs_server->satellite, sv, sizeof(sv_data_t));
1085 timestamp = sv->timestamp;
1087 used_prn_builder = g_variant_builder_new(G_VARIANT_TYPE("ai"));
1088 for (index = 0; index < sv->num_of_sat; ++index) {
1089 if (sv->sat[index].used) {
1090 g_variant_builder_add(used_prn_builder, "i", sv->sat[index].prn);
1094 used_prn = g_variant_builder_end(used_prn_builder);
1096 satellite_info_builder = g_variant_builder_new(G_VARIANT_TYPE("a(iiii)"));
1097 for (index = 0; index < sv->num_of_sat; ++index) {
1098 g_variant_builder_add(satellite_info_builder, "(iiii)", sv->sat[index].prn,
1099 sv->sat[index].elevation, sv->sat[index].azimuth, sv->sat[index].snr);
1101 satellite_info = g_variant_builder_end(satellite_info_builder);
1103 lbs_server_emit_satellite_changed(lbs_server->lbs_dbus_server, timestamp, satellite_used, sv->num_of_sat,
1104 used_prn, satellite_info);
1107 static void gps_update_nmea_cb(nmea_data_t *nmea, void *user_data)
1109 lbs_server_s *lbs_server = (lbs_server_s *)(user_data);
1111 if (lbs_server->nmea.data) {
1112 g_free(lbs_server->nmea.data);
1113 lbs_server->nmea.len = 0;
1114 lbs_server->nmea.data = NULL;
1116 lbs_server->nmea.timestamp = lbs_server->position.timestamp;
1117 lbs_server->nmea.data = g_malloc(nmea->len + 1);
1118 g_return_if_fail(lbs_server->nmea.data);
1120 g_memmove(lbs_server->nmea.data, nmea->data, nmea->len);
1121 lbs_server->nmea.data[nmea->len] = '\0';
1122 lbs_server->nmea.len = nmea->len;
1124 if (lbs_server->nmea_used == FALSE) {
1125 /*LOG_GPS(DBG_LOW, "nmea_used is FALSE"); */
1128 LOG_GPS(DBG_LOW, "[%d] %s", lbs_server->nmea.timestamp, lbs_server->nmea.data);
1129 lbs_server_emit_nmea_changed(lbs_server->lbs_dbus_server, lbs_server->nmea.timestamp, lbs_server->nmea.data);
1132 int gps_update_geofence_transition(int geofence_id, geofence_zone_state_t transition, double latitude, double longitude, double altitude, double speed, double bearing, double hor_accuracy, void *data)
1134 lbs_server_s *lbs_server = (lbs_server_s *)data;
1135 lbs_server_emit_gps_geofence_changed(lbs_server->lbs_dbus_server, geofence_id, transition, latitude, longitude, altitude, speed, bearing, hor_accuracy);
1139 int gps_update_geofence_service_status(int status, void *data)
1141 lbs_server_s *lbs_server = (lbs_server_s *)data;
1142 lbs_server_emit_gps_geofence_status_changed(lbs_server->lbs_dbus_server, status);
1146 static void add_fence(gint fence_id, gdouble latitude, gdouble longitude, gint radius, gint last_state, gint monitor_states, gint notification_responsiveness, gint unknown_timer, gpointer userdata)
1148 request_add_geofence(fence_id, latitude, longitude, radius, last_state, monitor_states, notification_responsiveness, unknown_timer);
1151 static void remove_fence(gint fence_id, gpointer userdata)
1153 request_delete_geofence(fence_id);
1156 static void pause_fence(gint fence_id, gpointer userdata)
1158 request_pause_geofence(fence_id);
1161 static void resume_fence(gint fence_id, gint monitor_states, gpointer userdata)
1163 request_resume_geofence(fence_id, monitor_states);
1166 static void nps_init(lbs_server_s *lbs_server_nps);
1168 static void lbs_server_init(lbs_server_s *lbs_server)
1170 LOG_GPS(DBG_LOW, "lbs_server_init");
1172 lbs_server->status = LBS_STATUS_UNAVAILABLE;
1173 g_mutex_init(&lbs_server->mutex);
1175 memset(&lbs_server->position, 0x00, sizeof(pos_data_t));
1176 memset(&lbs_server->satellite, 0x00, sizeof(sv_data_t));
1177 memset(&lbs_server->nmea, 0x00, sizeof(nmea_data_t));
1179 lbs_server->is_gps_running = FALSE;
1180 lbs_server->sv_used = FALSE;
1181 lbs_server->nmea_used = FALSE;
1182 lbs_server->gps_client_count = 0;
1184 nps_init(lbs_server);
1186 /* create resource for dynamic-interval */
1187 lbs_server->dynamic_interval_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1188 lbs_server->optimized_interval_array = (guint *)g_malloc0(LBS_SERVER_METHOD_SIZE * sizeof(guint));
1189 lbs_server->is_needed_changing_interval = FALSE;
1192 static void nps_get_last_position(lbs_server_s *lbs_server_nps)
1195 char location[128] = {0,};
1196 char *last_location[MAX_NPS_LOC_ITEM] = {0,};
1201 setting_get_int(VCONFKEY_LOCATION_NV_LAST_WPS_TIMESTAMP, ×tamp);
1202 str = setting_get_string(VCONFKEY_LOCATION_NV_LAST_WPS_LOCATION);
1206 snprintf(location, sizeof(location), "%s", str);
1209 last_location[index] = (char *)strtok_r(location, ";", &last);
1210 lbs_server_nps->last_pos.timestamp = timestamp;
1212 while (last_location[index] != NULL) {
1215 lbs_server_nps->last_pos.latitude = strtod(last_location[index], NULL);
1218 lbs_server_nps->last_pos.longitude = strtod(last_location[index], NULL);
1221 lbs_server_nps->last_pos.altitude = strtod(last_location[index], NULL);
1224 lbs_server_nps->last_pos.speed = strtod(last_location[index], NULL);
1227 lbs_server_nps->last_pos.direction = strtod(last_location[index], NULL);
1230 lbs_server_nps->last_pos.hor_accuracy = strtod(last_location[index], NULL);
1235 if (++index == MAX_NPS_LOC_ITEM) break;
1236 last_location[index] = (char *)strtok_r(NULL, ";", &last);
1238 LOG_NPS(DBG_LOW, "get nps_last_position timestamp : %d", lbs_server_nps->last_pos.timestamp);
1241 static void nps_init(lbs_server_s *lbs_server_nps)
1243 LOG_NPS(DBG_LOW, "nps_init");
1245 lbs_server_nps->handle = NULL;
1246 lbs_server_nps->period = 5000;
1247 nps_set_status(lbs_server_nps, LBS_STATUS_UNAVAILABLE);
1249 lbs_server_nps->pos.fields = LBS_POSITION_EXT_FIELDS_NONE;
1250 lbs_server_nps->pos.timestamp = 0;
1251 lbs_server_nps->pos.latitude = 0.0;
1252 lbs_server_nps->pos.longitude = 0.0;
1253 lbs_server_nps->pos.altitude = 0.0;
1254 lbs_server_nps->pos.acc_level = LBS_POSITION_EXT_FIELDS_NONE;
1255 lbs_server_nps->pos.hor_accuracy = -1.0;
1256 lbs_server_nps->pos.ver_accuracy = -1.0;
1258 lbs_server_nps->last_pos.timestamp = 0;
1259 lbs_server_nps->last_pos.latitude = 0.0;
1260 lbs_server_nps->last_pos.longitude = 0.0;
1261 lbs_server_nps->last_pos.altitude = 0.0;
1262 lbs_server_nps->last_pos.hor_accuracy = 0.0;
1263 lbs_server_nps->last_pos.speed = 0.0;
1264 lbs_server_nps->last_pos.direction = 0.0;
1266 #if !GLIB_CHECK_VERSION (2, 31, 0)
1267 GMutex *mutex_temp = g_mutex_new();
1268 lbs_server_nps->mutex = *mutex_temp;
1269 GCond *cond_temp = g_cond_new();
1270 lbs_server_nps->cond = *cond_temp;
1273 g_mutex_init(&lbs_server_nps->mutex);
1274 g_cond_init(&lbs_server_nps->cond);
1276 lbs_server_nps->is_nps_running = FALSE;
1277 lbs_server_nps->nps_client_count = 0;
1279 if (!get_nps_plugin_module()->load()) {
1280 LOG_NPS(DBG_ERR, "lbs_server_nps plugin load() failed.");
1284 nps_get_last_position(lbs_server_nps);
1287 static void nps_deinit(lbs_server_s *lbs_server_nps)
1289 LOG_NPS(DBG_LOW, "nps_deinit");
1290 if (get_nps_plugin_module()->unload()) {
1291 if (lbs_server_nps->is_nps_running) {
1292 g_mutex_lock(&lbs_server_nps->mutex);
1293 lbs_server_nps->is_nps_running = FALSE;
1294 g_cond_signal(&lbs_server_nps->cond);
1295 g_mutex_unlock(&lbs_server_nps->mutex);
1298 if (lbs_server_nps->token) {
1299 g_mutex_lock(&lbs_server_nps->mutex);
1300 g_free(lbs_server_nps->token);
1301 g_mutex_unlock(&lbs_server_nps->mutex);
1304 LOG_NPS(DBG_ERR, "unload() failed.");
1307 lbs_server_nps->handle = NULL;
1308 lbs_server_nps->is_nps_running = FALSE;
1309 lbs_server_nps->nps_client_count = 0;
1311 #if !GLIB_CHECK_VERSION (2, 31, 0)
1312 g_cond_free(&lbs_server_nps->cond);
1313 g_mutex_free(&lbs_server_nps->mutex);
1316 g_cond_clear(&lbs_server_nps->cond);
1317 g_mutex_clear(&lbs_server_nps->mutex);
1319 nps_set_status(lbs_server_nps, LBS_STATUS_UNAVAILABLE);
1322 static void _glib_log(const gchar *log_domain, GLogLevelFlags log_level,
1323 const gchar *msg, gpointer user_data)
1325 LOG_NPS(DBG_ERR, "GLIB[%d] : %s", log_level, msg);
1328 int main(int argc, char **argv)
1330 lbs_server_s *lbs_server = NULL;
1331 struct gps_callbacks cb;
1333 cb.pos_cb = gps_update_position_cb;
1334 cb.batch_cb = gps_update_batch_cb;
1335 cb.sv_cb = gps_update_satellite_cb;
1336 cb.nmea_cb = gps_update_nmea_cb;
1338 #if !GLIB_CHECK_VERSION (2, 31, 0)
1339 if (!g_thread_supported()) {
1340 g_thread_init(NULL);
1344 #if !GLIB_CHECK_VERSION (2, 35, 0)
1348 ret_code = initialize_server(argc, argv);
1349 if (ret_code != 0) {
1350 LOG_GPS(DBG_ERR, "initialize_server failed");
1354 lbs_server = g_new0(lbs_server_s, 1);
1356 LOG_GPS(DBG_ERR, "lbs_server_s create fail");
1359 lbs_server_init(lbs_server);
1362 register_update_callbacks(&cb, lbs_server);
1364 g_log_set_default_handler(_glib_log, lbs_server);
1366 /* create lbs-dbus server */
1367 ret_code = lbs_server_create(SERVICE_NAME, SERVICE_PATH, "lbs-server", "lbs-server",
1368 &(lbs_server->lbs_dbus_server), set_options, shutdown, update_pos_tracking_interval,
1369 request_change_pos_update_interval, get_nmea,
1370 add_fence, remove_fence, pause_fence, resume_fence, (gpointer)lbs_server);
1371 if (ret_code != LBS_SERVER_ERROR_NONE) {
1372 LOG_GPS(DBG_ERR, "lbs_server_create failed");
1376 LOG_GPS(DBG_LOW, "lbs_server_create called");
1378 lbs_server->loop = g_main_loop_new(NULL, TRUE);
1379 g_main_loop_run(lbs_server->loop);
1381 LOG_GPS(DBG_LOW, "lbs_server deamon Stop....");
1385 /* destroy resource for dynamic-interval */
1386 g_free(lbs_server->optimized_interval_array);
1387 g_hash_table_destroy(lbs_server->dynamic_interval_table);
1389 /* destroy lbs-dbus server */
1390 lbs_server_destroy(lbs_server->lbs_dbus_server);
1391 LOG_GPS(DBG_LOW, "lbs_server_destroy called");
1393 g_main_loop_unref(lbs_server->loop);
1395 nps_deinit(lbs_server);
1398 deinitialize_server();