4 * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <app_manager.h>
21 #include <package_manager.h>
22 #include "lbs_dbus_client.h"
23 #include "lbs_dbus_client_priv.h"
24 #include "generated-code.h"
26 #define LOCATION_PRIVACY_ID "http://tizen.org/privacy/location"
27 #define PRIVACY_INTERFACE "org.tizen.privacy_manager.signal"
28 #define PRIVACY_MEMBER "privacy_setting_changed"
29 #define PRIVACY_PATH "/privacy_manager/dbus_notification"
31 typedef struct _lbs_client_dbus_s {
33 GDBusConnection *conn;
34 lbs_client_method_e method;
36 int loc_status_evt_id;
42 unsigned int interval;
43 lbs_client_cb user_cb;
44 lbs_client_cb batch_cb;
48 static int __lbs_get_appid(char **app_id)
54 ret = app_manager_get_app_id(pid, &aid);
55 if (ret != APP_MANAGER_ERROR_NONE || aid == NULL) {
56 LBS_CLIENT_LOGE("Fail to app_manager_get_package. Error[%d]", ret);
59 *app_id = (char *)g_malloc0(sizeof(char) * 64);
60 g_strlcpy(*app_id, aid, 64);
61 LBS_CLIENT_LOGD("get_appid [%s]", *app_id);
67 static int __lbs_get_app_type(char *app_id, char **type)
71 char *app_type = NULL;
73 ret = app_info_create(app_id, &app_info);
74 if (ret != APP_MANAGER_ERROR_NONE) {
75 LBS_CLIENT_LOGE("Fail to get app_info. Err[%d]", ret);
79 ret = app_info_get_type(app_info, &app_type);
80 if (ret != APP_MANAGER_ERROR_NONE) {
81 LBS_CLIENT_LOGE("Fail to get type. Err[%d]", ret);
82 app_info_destroy(app_info);
86 *type = (char *)g_malloc0(sizeof(char) * 16);
87 g_strlcpy(*type, app_type, 16);
89 app_info_destroy(app_info);
94 static int __lbs_check_package_id(char *pkg_id)
99 char *package_id = NULL;
101 if (!__lbs_get_appid(&app_id))
104 if (!__lbs_get_app_type(app_id, &type))
107 if ((g_strcmp0(type, "c++app") == 0) || (g_strcmp0(type, "webapp") == 0)) {
108 LBS_CLIENT_LOGE("Do not check for App[%s] Type[%s]", app_id, type);
115 ret = package_manager_get_package_id_by_app_id(app_id, &package_id);
116 if (ret != PACKAGE_MANAGER_ERROR_NONE) {
117 LBS_CLIENT_LOGE("Fail to get package_id for [%s]. Err[%d]", app_id, ret);
121 LBS_CLIENT_LOGD("Current package[%s] / Privacy package[%s]", package_id, pkg_id);
123 if (g_strcmp0(pkg_id, package_id) == 0)
135 static void __signal_batch_callback(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data)
137 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)user_data;
138 if (handle == NULL) {
139 LBS_CLIENT_LOGD("Invalid handle");
143 if (handle->is_started == FALSE) {
144 LBS_CLIENT_LOGD("Handle[%p] is not started", handle);
148 if (handle->batch_cb)
149 handle->batch_cb(sig, param, handle->user_data);
152 static void __signal_callback(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data)
154 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)user_data;
155 if (handle == NULL) {
156 LBS_CLIENT_LOGD("Invalid handle");
160 if (handle->is_started == FALSE) {
161 LBS_CLIENT_LOGD("Handle[%p] is not started", handle);
166 handle->user_cb(sig, param, handle->user_data);
169 static void __privacy_setting_changed(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data)
171 LBS_CLIENT_LOGD("ENTER >>>");
173 gchar *pkg_id = NULL;
174 gchar *privacy_id = NULL;
176 g_variant_get(param, "(ss)", &pkg_id, &privacy_id);
185 if (g_strcmp0(privacy_id, LOCATION_PRIVACY_ID) != 0) {
186 LBS_CLIENT_LOGD("[%s]'s [%s] privacy is changed", pkg_id, privacy_id);
192 LBS_CLIENT_LOGD("[%s]'s [%s] location privacy is changed", pkg_id, privacy_id);
193 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)user_data;
195 if (handle == NULL || handle->is_started == FALSE) {
196 LBS_CLIENT_LOGE("Invalid handle or is_started [FALSE]");
202 if (!__lbs_check_package_id(pkg_id)) {
203 LBS_CLIENT_LOGE("pkg_id[%s] is not current pakcage id", pkg_id);
211 if (lbs_client_stop(handle, handle->interval, handle->fused_mode) != LBS_CLIENT_ERROR_NONE)
212 LBS_CLIENT_LOGE("lbs_client_stop is fail");
215 handle->user_cb("StatusChanged", g_variant_new("(i)", FALSE), handle->user_data);
217 lbs_client_destroy(handle);
220 LBS_CLIENT_LOGD("EXIT <<<");
224 lbs_client_signal_unsubcribe(lbs_client_dbus_h lbs_client)
226 LBS_CLIENT_LOGD("lbs_client_unsubcribe");
228 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
229 if (handle == NULL) {
230 LBS_CLIENT_LOGD("Invalid handle");
233 if (handle->conn == NULL) {
234 LBS_CLIENT_LOGD("Invalid dbus_connection");
238 if (handle->loc_evt_id) {
239 g_dbus_connection_signal_unsubscribe(handle->conn, handle->loc_evt_id);
240 handle->loc_evt_id = 0;
243 if (handle->batch_evt_id) {
244 g_dbus_connection_signal_unsubscribe(handle->conn, handle->batch_evt_id);
245 handle->batch_evt_id = 0;
248 if (handle->sat_evt_id) {
249 g_dbus_connection_signal_unsubscribe(handle->conn, handle->sat_evt_id);
250 handle->sat_evt_id = 0;
253 if (handle->loc_status_evt_id) {
254 g_dbus_connection_signal_unsubscribe(handle->conn, handle->loc_status_evt_id);
255 handle->loc_status_evt_id = 0;
258 if (handle->nmea_evt_id) {
259 g_dbus_connection_signal_unsubscribe(handle->conn, handle->nmea_evt_id);
260 handle->nmea_evt_id = 0;
265 lbs_client_privacy_signal_subcribe(lbs_client_dbus_h lbs_client)
267 LBS_CLIENT_LOGD("lbs_client_privacy_signal_subcribe");
269 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
270 handle->privacy_evt_id = g_dbus_connection_signal_subscribe(handle->conn,
271 NULL, PRIVACY_INTERFACE, PRIVACY_MEMBER, PRIVACY_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE, __privacy_setting_changed, handle, NULL);
273 if (handle->privacy_evt_id)
274 LBS_CLIENT_LOGD("Listening Privacy info");
276 LBS_CLIENT_LOGD("Fail to listen Privacy info");
280 lbs_client_privacy_signal_unsubcribe(lbs_client_dbus_h lbs_client)
282 LBS_CLIENT_LOGD("lbs_client_privacy_signal_unsubcribe");
284 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
285 if (handle->privacy_evt_id) {
286 g_dbus_connection_signal_unsubscribe(handle->conn, handle->privacy_evt_id);
287 handle->privacy_evt_id = 0;
292 lbs_client_batch_start(lbs_client_dbus_h lbs_client, lbs_client_callback_e callback_type, lbs_client_cb callback, unsigned int batch_interval, unsigned int batch_period, void *user_data)
294 LBS_CLIENT_LOGD("lbs_client_batch_start");
296 g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
297 g_return_val_if_fail(callback_type >= LBS_CLIENT_LOCATION_CB && callback_type <= LBS_CLIENT_BATCH_CB, LBS_CLIENT_ERROR_PARAMETER);
299 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
300 g_return_val_if_fail(handle->is_started == FALSE, LBS_CLIENT_ERROR_STATUS);
302 GVariant *reg = NULL;
303 GVariant *param = NULL, *method = NULL;
304 GError *error = NULL;
305 GVariantBuilder *builder = NULL;
306 GDBusProxy *proxy = NULL;
307 gchar *signal_path = NULL;
308 int ret = LBS_CLIENT_ERROR_NONE;
310 signal_path = g_strdup_printf("%s/%s", SERVICE_PATH, "SAMSUNG");
311 LBS_CLIENT_SECLOG("LBS signal subscribe Object Path [%s]", signal_path);
314 handle->batch_cb = callback;
315 handle->user_data = user_data;
317 if (callback_type & LBS_CLIENT_BATCH_CB) {
318 handle->batch_evt_id = g_dbus_connection_signal_subscribe(handle->conn,
319 SERVICE_NAME, "org.tizen.lbs.Batch", "BatchChanged",
320 signal_path, NULL, G_DBUS_SIGNAL_FLAGS_NONE, __signal_batch_callback, handle, NULL);
322 if (handle->batch_evt_id)
323 LBS_CLIENT_LOGD("Listening batch info");
325 LBS_CLIENT_LOGD("Fail to listen batch info");
331 LBS_CLIENT_LOGD("START: CMD-START_BATCH");
332 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
333 g_variant_builder_add(builder, "{sv}", "CMD", g_variant_new_string("START_BATCH"));
334 g_variant_builder_add(builder, "{sv}", "BATCH_INTERVAL", g_variant_new_int32((gint32) batch_interval));
335 g_variant_builder_add(builder, "{sv}", "BATCH_PERIOD", g_variant_new_int32((gint32) batch_period));
336 param = g_variant_ref_sink(g_variant_new("(@a{sv})", g_variant_builder_end(builder)));
337 method = g_variant_ref_sink(g_variant_new("(i)", handle->method));
339 proxy = g_dbus_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
340 SERVICE_NAME, SERVICE_PATH, "org.tizen.lbs.Manager", NULL, &error);
342 if (error && error->message) {
343 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
344 LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
345 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
347 LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
348 ret = LBS_CLIENT_ERROR_DBUS_CALL;
351 g_variant_unref(param);
352 g_variant_unref(method);
353 lbs_client_signal_unsubcribe(handle);
358 reg = g_dbus_proxy_call_sync(proxy, "AddReference", method, G_DBUS_CALL_FLAGS_NONE, -1, NULL,
361 if (error && error->message) {
362 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
363 LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
364 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
366 LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
367 ret = LBS_CLIENT_ERROR_DBUS_CALL;
370 g_variant_unref(param);
371 g_variant_unref(method);
372 lbs_client_signal_unsubcribe(handle);
376 g_variant_unref(reg);
380 reg = g_dbus_proxy_call_sync(proxy, "SetOptions", param, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
382 if (error && error->message) {
383 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
384 LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
385 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
387 LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
388 ret = LBS_CLIENT_ERROR_DBUS_CALL;
391 g_variant_unref(param);
392 g_variant_unref(method);
394 lbs_client_signal_unsubcribe(handle);
398 g_variant_unref(reg);
402 g_object_unref(proxy);
405 /* g_variant_builder_unref(builder); */
406 g_variant_unref(method);
407 g_variant_unref(param);
409 lbs_client_privacy_signal_subcribe(handle);
410 handle->is_started = TRUE;
412 return LBS_CLIENT_ERROR_NONE;
416 lbs_client_set_position_update_interval(lbs_client_dbus_h lbs_client, unsigned int interval, unsigned int prev_interval)
418 LBS_CLIENT_LOGD("lbs_client_set_position_update_interval");
419 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
421 g_return_val_if_fail(handle, LBS_CLIENT_ERROR_PARAMETER);
422 g_return_val_if_fail(handle->is_started == TRUE, LBS_CLIENT_ERROR_STATUS);
424 GVariant *reg = NULL;
425 GVariant *param = NULL;
426 GVariant *method = NULL;
427 GError *error = NULL;
428 GVariantBuilder *builder = NULL;
429 GDBusProxy *proxy = NULL;
430 gchar *signal_path = NULL;
431 int ret = LBS_CLIENT_ERROR_NONE;
433 signal_path = g_strdup_printf("%s/%s", SERVICE_PATH, "SAMSUNG");
434 LBS_CLIENT_LOGD("LBS signal subscribe Object Path [%s]", signal_path);
437 LBS_CLIENT_LOGD("SET option INTERVAL_UPDATE:[%u -> %u], method:[%d]", prev_interval, interval, method);
438 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
439 g_variant_builder_add(builder, "{sv}", "CMD", g_variant_new_string("SET:OPT"));
440 g_variant_builder_add(builder, "{sv}", "INTERVAL_UPDATE", g_variant_new_uint32(interval));
441 g_variant_builder_add(builder, "{sv}", "PREV_INTERVAL", g_variant_new_uint32(prev_interval));
442 g_variant_builder_add(builder, "{sv}", "METHOD", g_variant_new_int32(handle->method));
443 g_variant_builder_add(builder, "{sv}", "FUSED_MODE", g_variant_new_int32(handle->fused_mode));
444 param = g_variant_ref_sink(g_variant_new("(@a{sv})", g_variant_builder_end(builder)));
445 method = g_variant_ref_sink(g_variant_new("(i)", handle->method));
447 proxy = g_dbus_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, SERVICE_NAME, SERVICE_PATH, "org.tizen.lbs.Manager", NULL, &error);
449 if (error && error->message) {
450 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
451 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
452 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
454 LBS_CLIENT_LOGI("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
455 ret = LBS_CLIENT_ERROR_DBUS_CALL;
458 g_variant_unref(param);
459 g_variant_unref(method);
461 g_object_unref(proxy);
467 reg = g_dbus_proxy_call_sync(proxy, "SetOptions", param, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
468 if (error && error->message) {
469 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
470 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
471 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
473 LBS_CLIENT_LOGI("Fail to proxy call. ErrCode[%d], Msg[%s]", error->code, error->message);
474 ret = LBS_CLIENT_ERROR_DBUS_CALL;
477 g_variant_unref(param);
478 g_variant_unref(method);
480 g_object_unref(proxy);
485 g_variant_unref(reg);
489 reg = g_dbus_proxy_call_sync(proxy, "RemoveReference", method, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
491 if (error && error->message) {
492 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
493 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
494 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
496 LBS_CLIENT_LOGI("Fail to proxy call. ErrCode[%d], Msg[%s]", error->code, error->message);
497 ret = LBS_CLIENT_ERROR_DBUS_CALL;
500 g_variant_unref(param);
501 g_variant_unref(method);
503 g_object_unref(proxy);
507 g_variant_unref(reg);
511 g_object_unref(proxy);
513 /* g_variant_builder_unref(builder); */
514 g_variant_unref(param);
515 g_variant_unref(method);
517 return LBS_CLIENT_ERROR_NONE;
521 lbs_client_batch_stop(lbs_client_dbus_h lbs_client)
523 LBS_CLIENT_LOGD("lbs_client_batch_stop");
525 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
526 g_return_val_if_fail(handle, LBS_CLIENT_ERROR_PARAMETER);
527 g_return_val_if_fail(handle->is_started == TRUE, LBS_CLIENT_ERROR_STATUS);
529 int ret = LBS_CLIENT_ERROR_NONE;
530 GVariant *param = NULL, *method = NULL, *reg = NULL;
531 GError *error = NULL;
532 GVariantBuilder *builder = NULL;
534 lbs_client_privacy_signal_unsubcribe(handle);
535 lbs_client_signal_unsubcribe(handle);
538 LBS_CLIENT_LOGD("STOP: CMD-STOP_BATCH");
539 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
540 g_variant_builder_add(builder, "{sv}", "CMD", g_variant_new_string("STOP_BATCH"));
542 LBS_CLIENT_LOGD("METHOD: %d", handle->method);
543 g_variant_builder_add(builder, "{sv}", "METHOD", g_variant_new_int32(handle->method));
544 param = g_variant_ref_sink(g_variant_new("(@a{sv})", g_variant_builder_end(builder)));
545 method = g_variant_ref_sink(g_variant_new("(i)", handle->method));
547 GDBusProxy *proxy = NULL;
548 proxy = g_dbus_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, SERVICE_NAME, SERVICE_PATH, "org.tizen.lbs.Manager", NULL, &error);
550 if (error && error->message) {
551 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
552 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
553 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
555 LBS_CLIENT_LOGI("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
556 ret = LBS_CLIENT_ERROR_DBUS_CALL;
559 g_variant_unref(param);
560 g_variant_unref(method);
562 g_object_unref(proxy);
568 reg = g_dbus_proxy_call_sync(proxy, "SetOptions", param, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
569 if (error && error->message) {
570 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
571 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
572 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
574 LBS_CLIENT_LOGI("Fail to proxy call. ErrCode[%d], Msg[%s]", error->code, error->message);
575 ret = LBS_CLIENT_ERROR_DBUS_CALL;
578 g_variant_unref(param);
579 g_variant_unref(method);
581 g_object_unref(proxy);
586 g_variant_unref(reg);
590 g_object_unref(proxy);
592 /* g_variant_builder_unref (builder); */
593 g_variant_unref(param);
594 g_variant_unref(method);
596 handle->is_started = FALSE;
602 lbs_client_start(lbs_client_dbus_h lbs_client, unsigned int interval, lbs_client_callback_e callback_type, lbs_client_cb callback, int fused_mode, void *user_data)
604 LBS_CLIENT_LOGD("lbs_client_start");
605 g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
606 g_return_val_if_fail(callback_type >= LBS_CLIENT_LOCATION_CB && callback_type <= LBS_CLIENT_BATCH_CB, LBS_CLIENT_ERROR_PARAMETER);
608 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
609 g_return_val_if_fail(handle->is_started == FALSE, LBS_CLIENT_ERROR_STATUS);
611 GVariant *reg = NULL;
612 GVariant *param = NULL, *method = NULL;
613 GError *error = NULL;
614 GVariantBuilder *builder = NULL;
615 GDBusProxy *proxy = NULL;
616 gchar *signal_path = NULL;
617 gchar *app_id = NULL;
618 int ret = LBS_CLIENT_ERROR_NONE;
620 signal_path = g_strdup_printf("%s/%s", SERVICE_PATH, "SAMSUNG");
621 LBS_CLIENT_SECLOG("LBS signal subscribe Object Path [%s]", signal_path);
624 handle->user_cb = callback;
625 handle->user_data = user_data;
627 if (callback_type & LBS_CLIENT_LOCATION_CB) {
628 handle->loc_evt_id = g_dbus_connection_signal_subscribe(handle->conn,
629 SERVICE_NAME, "org.tizen.lbs.Position", "PositionChanged", signal_path,
630 NULL, G_DBUS_SIGNAL_FLAGS_NONE, __signal_callback, handle, NULL);
632 if (handle->loc_evt_id)
633 LBS_CLIENT_LOGD("Listening Position info");
635 LBS_CLIENT_LOGD("Fail to listen Position info");
638 if (callback_type & LBS_CLIENT_LOCATION_STATUS_CB) {
639 handle->loc_status_evt_id = g_dbus_connection_signal_subscribe(handle->conn,
640 SERVICE_NAME, "org.tizen.lbs.Manager", "StatusChanged", SERVICE_PATH,
641 NULL, G_DBUS_SIGNAL_FLAGS_NONE, __signal_callback, handle, NULL);
643 if (handle->loc_status_evt_id)
644 LBS_CLIENT_LOGD("Listening location Status");
646 LBS_CLIENT_LOGD("Fail to listen location Status");
649 if (callback_type & LBS_CLIENT_SATELLITE_CB) {
650 handle->sat_evt_id = g_dbus_connection_signal_subscribe(handle->conn,
651 SERVICE_NAME, "org.tizen.lbs.Satellite", "SatelliteChanged", signal_path,
652 NULL, G_DBUS_SIGNAL_FLAGS_NONE, __signal_callback, handle, NULL);
654 if (handle->sat_evt_id)
655 LBS_CLIENT_LOGD("Listening satellite info");
657 LBS_CLIENT_LOGD("Fail to listen satellite info");
660 if (callback_type & LBS_CLIENT_NMEA_CB) {
661 handle->nmea_evt_id = g_dbus_connection_signal_subscribe(handle->conn,
662 SERVICE_NAME, "org.tizen.lbs.Nmea", "NmeaChanged", signal_path,
663 NULL, G_DBUS_SIGNAL_FLAGS_NONE, __signal_callback, handle, NULL);
665 if (handle->nmea_evt_id)
666 LBS_CLIENT_LOGD("Listening nmea info");
668 LBS_CLIENT_LOGD("Fail to listen nmea info");
674 LBS_CLIENT_LOGD("START: CMD-START");
675 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
676 g_variant_builder_add(builder, "{sv}", "CMD", g_variant_new_string("START"));
677 g_variant_builder_add(builder, "{sv}", "METHOD", g_variant_new_int32(handle->method));
678 g_variant_builder_add(builder, "{sv}", "INTERVAL", g_variant_new_uint32(interval));
679 g_variant_builder_add(builder, "{sv}", "FUSED_MODE", g_variant_new_int32(fused_mode));
681 if (__lbs_get_appid(&app_id)) {
682 LBS_CLIENT_LOGD("[%s] Request START", app_id);
683 g_variant_builder_add(builder, "{sv}", "APP_ID", g_variant_new_string(app_id));
689 param = g_variant_ref_sink(g_variant_new("(@a{sv})", g_variant_builder_end(builder)));
690 method = g_variant_ref_sink(g_variant_new("(i)", handle->method));
691 proxy = g_dbus_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
692 SERVICE_NAME, SERVICE_PATH, "org.tizen.lbs.Manager", NULL, &error);
694 if (error && error->message) {
695 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
696 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
697 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
699 LBS_CLIENT_LOGI("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
700 ret = LBS_CLIENT_ERROR_DBUS_CALL;
703 g_variant_unref(param);
704 g_variant_unref(method);
705 lbs_client_signal_unsubcribe(handle);
710 reg = g_dbus_proxy_call_sync(proxy, "AddReference", method, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
712 if (error && error->message) {
713 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
714 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
715 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
717 LBS_CLIENT_LOGI("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
718 ret = LBS_CLIENT_ERROR_DBUS_CALL;
721 g_variant_unref(param);
722 g_variant_unref(method);
723 lbs_client_signal_unsubcribe(handle);
727 g_variant_unref(reg);
731 reg = g_dbus_proxy_call_sync(proxy, "SetOptions", param, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
732 if (error && error->message) {
733 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
734 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
735 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
737 LBS_CLIENT_LOGI("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
738 ret = LBS_CLIENT_ERROR_DBUS_CALL;
741 g_variant_unref(param);
742 g_variant_unref(method);
744 lbs_client_signal_unsubcribe(handle);
748 g_variant_unref(reg);
752 g_object_unref(proxy);
755 /* g_variant_builder_unref (builder); */
756 g_variant_unref(param);
757 g_variant_unref(method);
759 lbs_client_privacy_signal_subcribe(handle);
760 handle->is_started = TRUE;
761 handle->interval = interval;
762 handle->fused_mode = fused_mode;
764 return LBS_CLIENT_ERROR_NONE;
768 lbs_client_stop(lbs_client_dbus_h lbs_client, unsigned int interval, int fused_mode)
770 LBS_CLIENT_LOGD("lbs_client_stop [interval: %d]", interval);
772 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
773 g_return_val_if_fail(handle, LBS_CLIENT_ERROR_PARAMETER);
774 g_return_val_if_fail(handle->is_started == TRUE, LBS_CLIENT_ERROR_STATUS);
776 int ret = LBS_CLIENT_ERROR_NONE;
777 GVariant *param = NULL, *method = NULL, *reg = NULL;
778 GError *error = NULL;
779 GVariantBuilder *builder = NULL;
780 gchar *app_id = NULL;
782 lbs_client_privacy_signal_unsubcribe(handle);
783 lbs_client_signal_unsubcribe(handle);
786 LBS_CLIENT_LOGD("STOP: CMD-STOP");
787 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
788 g_variant_builder_add(builder, "{sv}", "CMD", g_variant_new_string("STOP"));
790 LBS_CLIENT_LOGD("METHOD: %d", handle->method);
791 g_variant_builder_add(builder, "{sv}", "METHOD", g_variant_new_int32(handle->method));
792 g_variant_builder_add(builder, "{sv}", "INTERVAL", g_variant_new_uint32(interval));
793 g_variant_builder_add(builder, "{sv}", "FUSED_MODE", g_variant_new_int32(fused_mode));
795 if (__lbs_get_appid(&app_id)) {
796 LBS_CLIENT_LOGD("[%s] Request STOP", app_id);
797 g_variant_builder_add(builder, "{sv}", "APP_ID", g_variant_new_string(app_id));
803 param = g_variant_ref_sink(g_variant_new("(@a{sv})", g_variant_builder_end(builder)));
804 method = g_variant_ref_sink(g_variant_new("(i)", handle->method));
806 GDBusProxy *proxy = NULL;
807 proxy = g_dbus_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
808 SERVICE_NAME, SERVICE_PATH, "org.tizen.lbs.Manager", NULL, &error);
810 if (error && error->message) {
811 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
812 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
813 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
815 LBS_CLIENT_LOGI("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
816 ret = LBS_CLIENT_ERROR_DBUS_CALL;
819 g_variant_unref(param);
820 g_variant_unref(method);
822 g_object_unref(proxy);
828 reg = g_dbus_proxy_call_sync(proxy, "SetOptions", param, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
829 if (error && error->message) {
830 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
831 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
832 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
834 LBS_CLIENT_LOGI("Fail to proxy call. ErrCode[%d], Msg[%s]", error->code, error->message);
835 ret = LBS_CLIENT_ERROR_DBUS_CALL;
838 g_variant_unref(param);
839 g_variant_unref(method);
841 g_object_unref(proxy);
846 g_variant_unref(reg);
850 reg = g_dbus_proxy_call_sync(proxy, "RemoveReference", method, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL, &error);
852 if (error && error->message) {
853 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
854 LBS_CLIENT_LOGI("Access denied. Msg[%s]", error->message);
855 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
857 LBS_CLIENT_LOGI("Fail to proxy call. ErrCode[%d], Msg[%s]", error->code, error->message);
858 ret = LBS_CLIENT_ERROR_DBUS_CALL;
861 g_variant_unref(param);
862 g_variant_unref(method);
864 g_object_unref(proxy);
868 g_variant_unref(reg);
872 g_object_unref(proxy);
874 /* g_variant_builder_unref (builder); */
875 g_variant_unref(param);
876 g_variant_unref(method);
878 handle->is_started = FALSE;
884 lbs_client_get_nmea(lbs_client_dbus_h lbs_client, int *timestamp, char **nmea)
886 g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
887 g_return_val_if_fail(timestamp, LBS_CLIENT_ERROR_PARAMETER);
888 g_return_val_if_fail(nmea, LBS_CLIENT_ERROR_PARAMETER);
890 GError *error = NULL;
891 int ret = LBS_CLIENT_ERROR_NONE;
893 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
897 LbsNmea *proxy = NULL;
898 proxy = lbs_nmea_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, SERVICE_NAME, SERVICE_PATH, NULL, &error);
900 gint cur_timestamp = 0;
901 gchar *cur_nmea_data = NULL;
904 ret = lbs_nmea_call_get_nmea_sync(proxy, &cur_timestamp, &cur_nmea_data, NULL, &error);
905 if (error && error->message) {
906 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
907 LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
908 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
910 LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
911 ret = LBS_CLIENT_ERROR_DBUS_CALL;
917 LBS_CLIENT_LOGD("Get NMEA: Timestamp[%d], NMEA[%s]", cur_timestamp, cur_nmea_data);
918 *timestamp = cur_timestamp;
919 *nmea = cur_nmea_data;
921 g_object_unref(proxy);
924 return LBS_CLIENT_ERROR_NONE;
928 _client_create_connection(lbs_client_dbus_s *client)
930 LBS_CLIENT_LOGD("create connection");
931 g_return_val_if_fail(client, LBS_CLIENT_ERROR_PARAMETER);
932 GError *error = NULL;
934 client->conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
936 if (error && error->message) {
937 LBS_CLIENT_LOGI("Fail to get GBus. ErrCode[%d], Msg[%s]", error->code, error->message);
941 LBS_CLIENT_LOGI("Fail to get addr of bus.");
942 return LBS_CLIENT_ERROR_CONNECTION;
945 LBS_CLIENT_LOGD("client->conn: %p", client->conn);
947 return LBS_CLIENT_ERROR_NONE;
950 static void _glib_log(const gchar *log_domain, GLogLevelFlags log_level,
951 const gchar *msg, gpointer user_data)
953 LBS_CLIENT_LOGD("GLIB[%d] : %s", log_level, msg);
956 /* The reason why we seperate this from start is to support IPC for db operation between a server and a client. */
958 lbs_client_create(lbs_client_method_e method, lbs_client_dbus_h *lbs_client)
960 LBS_CLIENT_LOGD("lbs_client_create");
961 g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
963 int ret = LBS_CLIENT_ERROR_NONE;
965 lbs_client_dbus_s *client = g_new0(lbs_client_dbus_s, 1);
966 g_return_val_if_fail(client, LBS_CLIENT_ERROR_MEMORY);
968 g_log_set_default_handler(_glib_log, NULL);
970 ret = _client_create_connection(client);
971 if (ret != LBS_CLIENT_ERROR_NONE) {
976 client->method = method;
978 *lbs_client = (lbs_client_dbus_s *)client;
980 return LBS_CLIENT_ERROR_NONE;
984 lbs_client_destroy(lbs_client_dbus_h lbs_client)
986 LBS_CLIENT_LOGD("lbs_client_destroy");
987 g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
989 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
990 g_return_val_if_fail(handle->is_started == FALSE, LBS_CLIENT_ERROR_STATUS);
992 handle->user_cb = NULL;
993 handle->batch_cb = NULL;
994 handle->user_data = NULL;
997 g_object_unref(handle->conn);
1003 return LBS_CLIENT_ERROR_NONE;
1008 static void __dbus_set_location_callback(GObject *source_object, GAsyncResult *res, gpointer user_data)
1010 LBS_CLIENT_LOGD(">>> __dbus_set_location_callback");
1012 g_return_if_fail(source_object);
1013 g_return_if_fail(res);
1015 GError *error = NULL;
1016 gboolean success = FALSE;
1017 LbsManager *proxy = (LbsManager *)source_object;
1019 /* TODO: lbs-server will send method and status via DBUS. Have to change lbs.xml */
1020 success = lbs_manager_call_set_mock_location_finish(proxy, res, &error);
1021 if (success != TRUE) {
1022 LBS_CLIENT_LOGW("SetLocation failed!!!");
1024 if (error && error->message) {
1025 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
1026 LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
1028 LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
1030 g_error_free(error);
1036 lbs_client_set_mock_location_async(lbs_client_dbus_h lbs_client, gint method,
1037 gdouble latitude, gdouble longitude, gdouble altitude, gdouble speed, gdouble direction,
1038 gdouble accuracy, lbs_client_cb callback, void *user_data)
1040 LBS_CLIENT_LOGD("ENTER >>> lbs_client_set_mock_location_async");
1041 g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
1043 lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
1044 int ret = LBS_CLIENT_ERROR_NONE;
1046 handle->user_data = user_data;
1048 LbsManager *proxy = NULL;
1049 GError *error = NULL;
1051 proxy = lbs_manager_proxy_new_sync(handle->conn, G_DBUS_PROXY_FLAGS_NONE, SERVICE_NAME, SERVICE_PATH, NULL, &error);
1054 lbs_manager_call_set_mock_location(proxy, method, latitude, longitude, altitude, speed, direction,
1055 accuracy, NULL, __dbus_set_location_callback, handle);
1057 g_object_unref(proxy);
1060 if (error && error->message) {
1061 if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
1062 LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
1063 ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
1065 LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
1066 ret = LBS_CLIENT_ERROR_DBUS_CALL;
1068 g_error_free(error);