[ACR-476] Added mock location APIs (Version 1.0.0) 77/52877/7 accepted/tizen_tv accepted/tizen/ivi/20160218.023402 accepted/tizen/mobile/20160122.034842 accepted/tizen/tv/20160122.034859 accepted/tizen/wearable/20160122.034919 submit/tizen/20160122.005552 submit/tizen_common/20160218.142243 submit/tizen_ivi/20160217.000000 submit/tizen_ivi/20160217.000002
authorYoung-Ae Kang <youngae.kang@samsung.com>
Fri, 27 Nov 2015 06:00:01 +0000 (15:00 +0900)
committerYoungae Kang <youngae.kang@samsung.com>
Thu, 21 Jan 2016 10:27:28 +0000 (02:27 -0800)
Change-Id: Ia1d36aa65485a9f1de302efba9d42ab0ffc00695

client/include/lbs_dbus_client.h
client/src/lbs_dbus_client.c [changed mode: 0644->0755]
introspection/lbs.xml
packaging/liblbs-dbus.changes
packaging/liblbs-dbus.spec
server/include/lbs_dbus_server.h
server/src/lbs_dbus_server.c

index fe4e45c..c2d17f9 100644 (file)
@@ -34,6 +34,7 @@ typedef enum {
     LBS_CLIENT_METHOD_NPS,
     LBS_CLIENT_METHOD_AGPS,
     LBS_CLIENT_METHOD_GEOFENCE,
+    LBS_CLIENT_METHOD_MOCK,
 } lbs_client_method_e;
 
 typedef enum {
@@ -71,6 +72,12 @@ int lbs_client_stop_batch(lbs_client_dbus_h lbs_client);
 int lbs_client_get_nmea(lbs_client_dbus_h lbs_client, int *timestamp, char **nmea);
 int lbs_client_set_position_update_interval(lbs_client_dbus_h lbs_client, unsigned int interval);
 
+/* Tizen 3.0 */
+int lbs_client_set_mock_location_async(lbs_client_dbus_h lbs_client,
+       gint method, gdouble latitude, gdouble longitude, gdouble altitude,
+       gdouble speed, gdouble direction, gdouble accuracy,
+       lbs_client_cb callback, void *user_data);
+
 __END_DECLS
 
 #endif /* __LBS_DBUS_CLIENT_H__ */
old mode 100644 (file)
new mode 100755 (executable)
index f32000f..a831347
@@ -43,6 +43,7 @@ typedef struct _lbs_client_dbus_s {
        int privacy_evt_id;
        lbs_client_cb user_cb;
        lbs_client_cb batch_cb;
+       lbs_client_cb set_mock_cb;
        void *user_data;
 } lbs_client_dbus_s;
 
@@ -594,7 +595,6 @@ EXPORT_API int
 lbs_client_start(lbs_client_dbus_h lbs_client, unsigned int interval, lbs_client_callback_e callback_type, lbs_client_cb callback, void *user_data)
 {
        LBS_CLIENT_LOGD("lbs_client_start");
-
        g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
        g_return_val_if_fail(callback_type >= LBS_CLIENT_LOCATION_CB && callback_type <= LBS_CLIENT_BATCH_CB, LBS_CLIENT_ERROR_PARAMETER);
 
@@ -927,7 +927,6 @@ lbs_client_stop(lbs_client_dbus_h lbs_client)
 EXPORT_API int
 lbs_client_get_nmea(lbs_client_dbus_h lbs_client, int *timestamp, char **nmea)
 {
-       LBS_CLIENT_LOGD("ENTER >>>");
        g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
        g_return_val_if_fail(timestamp, LBS_CLIENT_ERROR_PARAMETER);
        g_return_val_if_fail(nmea, LBS_CLIENT_ERROR_PARAMETER);
@@ -961,7 +960,6 @@ lbs_client_get_nmea(lbs_client_dbus_h lbs_client, int *timestamp, char **nmea)
                                ret = LBS_CLIENT_ERROR_DBUS_CALL;
                        }
                        g_error_free(error);
-                       lbs_client_signal_unsubcribe(handle);
                        return ret;
                }
 
@@ -1042,6 +1040,7 @@ lbs_client_destroy(lbs_client_dbus_h lbs_client)
 
        handle->user_cb = NULL;
        handle->batch_cb = NULL;
+       handle->set_mock_cb = NULL;
        handle->user_data = NULL;
 
        if (handle->conn) {
@@ -1053,3 +1052,108 @@ lbs_client_destroy(lbs_client_dbus_h lbs_client)
 
        return LBS_CLIENT_ERROR_NONE;
 }
+
+/* Tizen 3.0 */
+
+static void __dbus_set_location_callback(GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+       LBS_CLIENT_LOGD("ENTER >>>");
+
+       g_return_if_fail(source_object);
+       g_return_if_fail(res);
+
+       lbs_client_dbus_s *handle = (lbs_client_dbus_s *)user_data;
+       GError *error = NULL;
+       gboolean success = FALSE;
+       gchar *sig = NULL;
+       GVariant *param = NULL;
+
+       LbsManager *proxy = (LbsManager *)source_object;
+
+       /* TODO: lbs-server will send method and status via DBUS. Have to change lbs.xml */
+       success = lbs_manager_call_set_mock_location_finish(proxy, res, &error);
+       if (success) {
+               if (handle && handle->set_mock_cb) {
+                       sig = g_strdup("SetLocation");
+                       param = g_variant_new("(ii)", LBS_CLIENT_METHOD_MOCK, 5); /* LBS_STATUS_BATCH + 1 */
+                       handle->set_mock_cb(sig, param, handle->user_data);
+
+                       g_free(sig);
+                       g_variant_unref(param);
+               }
+       } else {
+               LBS_CLIENT_LOGW("SetLocation failed!!!");
+               if (handle && handle->set_mock_cb) {
+                       sig = g_strdup("SetLocation");
+                       param = g_variant_new("(ii)", LBS_CLIENT_METHOD_MOCK, 6); /* LBS_STATUS_BATCH + 2 */
+                       handle->set_mock_cb(sig, param, handle->user_data);
+
+                       g_free(sig);
+                       g_variant_unref(param);
+               }
+
+               if (error && error->message) {
+                       if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
+                               LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
+                       } else {
+                               LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
+                       }
+                       g_error_free(error);
+               }
+       }
+
+       LBS_CLIENT_LOGD("EXIT <<<");
+}
+
+EXPORT_API int
+lbs_client_set_mock_location_async(lbs_client_dbus_h lbs_client,
+       gint method,
+       gdouble latitude,
+       gdouble longitude,
+       gdouble altitude,
+       gdouble speed,
+       gdouble direction,
+       gdouble accuracy,
+       lbs_client_cb callback, void *user_data)
+{
+       LBS_CLIENT_LOGD("ENTER >>>");
+       g_return_val_if_fail(lbs_client, LBS_CLIENT_ERROR_PARAMETER);
+
+       lbs_client_dbus_s *handle = (lbs_client_dbus_s *)lbs_client;
+       int ret = LBS_CLIENT_ERROR_NONE;
+
+       handle->set_mock_cb = callback;
+       handle->user_data = user_data;
+
+       LbsManager *proxy = NULL;
+       GError *error = NULL;
+
+       proxy = lbs_manager_proxy_new_sync(handle->conn,
+                                       G_DBUS_PROXY_FLAGS_NONE,
+                                       SERVICE_NAME,
+                                       SERVICE_PATH,
+                                       NULL,
+                                       &error);
+
+       if (proxy) {
+               lbs_manager_call_set_mock_location(proxy, method, latitude, longitude, altitude, speed, direction, accuracy,
+                       NULL, __dbus_set_location_callback, handle);
+
+               g_object_unref(proxy);
+               proxy = NULL;
+       } else {
+               if (error && error->message) {
+                       if (error->code == G_DBUS_ERROR_ACCESS_DENIED) {
+                               LBS_CLIENT_LOGE("Access denied. Msg[%s]", error->message);
+                               ret = LBS_CLIENT_ERROR_ACCESS_DENIED;
+                       } else {
+                               LBS_CLIENT_LOGE("Fail to new proxy ErrCode[%d], Msg[%s]", error->code, error->message);
+                               ret = LBS_CLIENT_ERROR_DBUS_CALL;
+                       }
+                       g_error_free(error);
+               }
+       }
+       LBS_CLIENT_LOGD("EXIT <<<");
+
+       return ret;
+}
index e54241f..5a79c3d 100644 (file)
                        <arg direction="in" type="i" name="method" />
                        <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
                </method>
+               <method name="SetMockLocation">
+                       <arg direction="in" type="i" name="method"/>
+                       <arg direction="in" type="d" name="latitude"/>
+                       <arg direction="in" type="d" name="longitude"/>
+                       <arg direction="in" type="d" name="altitude"/>
+                       <arg direction="in" type="d" name="speed"/>
+                       <arg direction="in" type="d" name="direction"/>
+                       <arg direction="in" type="d" name="accuracy"/>
+                       <!--
+                       <arg direction="out" type="i" name="method"/>
+                       <arg direction="out" type="i" name="status"/>
+                       -->
+                       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+               </method>
+       
        </interface>
 </node>
index 476b4ee..13b8901 100644 (file)
@@ -1,3 +1,9 @@
+[Version] lbs-dbus_1.0.0
+[Date] 20 January 2016
+[Changes] Supported mock location
+[Developer] Young-Ae Kang <youngae.kang@samsung.com>
+================================================================================
+
 [Version] lbs-dbus_0.3.4
 [Date] 12 November 2015
 [Changes] 1.Fixed memory corruption
index b7f362c..bbf1707 100644 (file)
@@ -1,6 +1,6 @@
 Name:          liblbs-dbus
 Summary:       DBus interface for Location Based Service
-Version:       0.3.4
+Version:       1.0.0
 Release:       1
 Group:         Location/Libraries
 License:       Apache-2.0
index fc076e7..44ebd06 100644 (file)
@@ -68,6 +68,11 @@ typedef void (*GpsGeofenceDeleteFenceCB)(gint fence_id, gpointer userdata);
 typedef void (*GpsGeofencePauseFenceCB)(gint fence_id, gpointer userdata);
 typedef void (*GpsGeofenceResumeFenceCB)(gint fence_id, gint monitor_states, gpointer userdata);
 
+/* Tizen 3.0 */
+typedef void (*LbsDbusSetMockLocationCB)(int method, double latitude, double longtitude, double altitude,
+                                         double speed, double direction, double accuracy, gpointer userdata);
+
+
 typedef enum {
     LBS_SERVER_ERROR_NONE = 0x0,
     LBS_SERVER_ERROR_UNKNOWN,
@@ -81,6 +86,22 @@ typedef enum {
 
 typedef void *lbs_server_dbus_h;
 
+/* Tizen 3.0 */
+typedef struct _lbs_server_dbus_cb_t {
+       LbsDbusSetOptionsCB set_options_cb;
+       LbsDbusShutdownCB shutdown_cb;
+       LbsDbusUpdateIntervalCB update_interval_cb;
+       LbsDbusRequestChangeIntervalCB request_change_interval_cb;
+       LbsDbusGetNmeaCB get_nmea_cb;
+       GpsGeofenceAddFenceCB add_hw_fence_cb;
+       GpsGeofenceDeleteFenceCB delete_hw_fence_cb;
+       GpsGeofencePauseFenceCB pause_hw_fence_cb;
+       GpsGeofenceResumeFenceCB resume_hw_fence_cb;
+
+       LbsDbusSetMockLocationCB set_mock_location_cb;
+} lbs_server_dbus_cb_t;
+
+
 int
 lbs_server_emit_position_changed(lbs_server_dbus_h lbs_server,
                                  gint arg_method,
@@ -126,6 +147,8 @@ lbs_server_emit_gps_geofence_status_changed(lbs_server_dbus_h lbs_server, gint s
 int
 lbs_server_emit_gps_geofence_changed(lbs_server_dbus_h lbs_server, gint fence_id, gint transition, gdouble latitude, gdouble longitude, gdouble altitude, gdouble speed, gdouble bearing, gdouble hor_accuracy);
 
+
+#ifdef TIZEN_2_4
 int
 lbs_server_create(char *service_name,
                   char *service_path,
@@ -143,6 +166,19 @@ lbs_server_create(char *service_name,
                   GpsGeofenceResumeFenceCB resume_hw_fence_cb,
                   gpointer userdata);
 
+#endif
+
+/* Tizen 3.0 */
+
+int
+lbs_server_create(char *service_name,
+                  char *service_path,
+                  char *name,
+                  char *description,
+                  lbs_server_dbus_h *lbs_server,
+                  lbs_server_dbus_cb_t *lbs_server_cb,
+                  gpointer userdata);
+
 int
 lbs_server_destroy(lbs_server_dbus_h lbs_server);
 
index 63f109f..0f814ef 100644 (file)
@@ -72,6 +72,14 @@ typedef struct _lbs_server_dbus_s {
        GpsGeofenceDeleteFenceCB delete_hw_fence_cb;
        GpsGeofencePauseFenceCB pause_hw_fence_cb;
        GpsGeofenceResumeFenceCB resume_hw_fence_cb;
+
+       /* Tizen 3.0 */
+       guint set_mock_location_h;
+       LbsDbusSetMockLocationCB set_mock_location_cb;
+
+#ifdef TIZEN_3_0_OPT
+       lbs_server_dbus_cb_t callback;
+#endif
 } lbs_server_dbus_s;
 
 typedef enum {
@@ -79,6 +87,7 @@ typedef enum {
     LBS_SERVER_METHOD_NPS,
     LBS_SERVER_METHOD_AGPS,
     LBS_SERVER_METHOD_GEOFENCE,
+    LBS_SERVER_METHOD_MOCK,
     LBS_SERVER_METHOD_SIZE,
 } lbs_server_method_e;
 
@@ -160,8 +169,8 @@ static gboolean lbs_dbus_setup_gps_geofence_interface(LbsObjectSkeleton *object,
 
 static gboolean
 on_manager_getproviderinfo(LbsManager *mgr,
-                           GDBusMethodInvocation       *invocation,
-                           gpointer                            user_data)
+                           GDBusMethodInvocation *invocation,
+                           gpointer user_data)
 {
        LBS_SERVER_LOGD("on_manager_getproviderinfo");
        lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
@@ -180,8 +189,8 @@ on_manager_getproviderinfo(LbsManager *mgr,
 
 static gboolean
 on_manager_getstatus(LbsManager *mgr,
-                     GDBusMethodInvocation     *invocation,
-                     gpointer                          user_data)
+                     GDBusMethodInvocation *invocation,
+                     gpointer user_data)
 {
        LBS_SERVER_LOGD("on_manager_getstatus");
        lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
@@ -196,7 +205,7 @@ on_manager_getstatus(LbsManager *mgr,
 
 static gboolean
 on_nmea_getnmea(LbsNmea *nmea,
-                GDBusMethodInvocation  *invocation,
+                GDBusMethodInvocation *invocation,
                 gpointer user_data)
 {
        lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
@@ -220,8 +229,8 @@ on_nmea_getnmea(LbsNmea *nmea,
 static gboolean
 on_manager_setoptions(LbsManager *mgr,
                       GDBusMethodInvocation *invocation,
-                      GVariant *options,
-                      gpointer user_data)
+                      GVariant *options,
+                      gpointer user_data)
 {
        LBS_SERVER_LOGD("ENTER >>>");
        lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
@@ -243,12 +252,12 @@ on_manager_setoptions(LbsManager *mgr,
 
 static gboolean
 on_manager_addreference(LbsManager *mgr,
-                        GDBusMethodInvocation  *invocation,
+                        GDBusMethodInvocation *invocation,
                         int method,
-                        gpointer                               user_data)
+                        gpointer user_data)
 {
        LBS_SERVER_LOGD("method: %d", method);
-       if(method < 0 || method >= LBS_SERVER_METHOD_SIZE) return FALSE;
+       if (method < 0 || method >= LBS_SERVER_METHOD_SIZE) return FALSE;
 
        lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
        if (!ctx) {
@@ -273,8 +282,6 @@ on_manager_addreference(LbsManager *mgr,
        }
 
        count = count_arr[method];
-
-       LBS_SERVER_LOGD("sender: [%s] method:%d count:%d table:%p", sender_cp, method, count, count_arr);
        count++;
 
        if (count <= 0) {
@@ -368,8 +375,8 @@ lbs_server_remove_client(lbs_server_dbus_s *ctx, const char *client, int method)
 
        if (ctx->shutdown_cb) {
                ctx->shutdown_cb(ctx->userdata, shutdown_arr);
-               LBS_SERVER_LOGD("shutdown_cb called.. gps:%d, nps:%d",
-                               shutdown_arr[LBS_SERVER_METHOD_GPS], shutdown_arr[LBS_SERVER_METHOD_NPS]);
+               LBS_SERVER_LOGD("shutdown_cb called.. gps:%d, nps:%d, mock:%d",
+                               shutdown_arr[LBS_SERVER_METHOD_GPS], shutdown_arr[LBS_SERVER_METHOD_NPS], shutdown_arr[LBS_SERVER_METHOD_MOCK]);
        }
 
        g_free(shutdown_arr);
@@ -377,12 +384,12 @@ lbs_server_remove_client(lbs_server_dbus_s *ctx, const char *client, int method)
 }
 
 static gboolean on_manager_removereference(LbsManager *mgr,
-                                           GDBusMethodInvocation       *invocation,
-                                           int                                         method,
-                                           gpointer                            user_data)
+                                           GDBusMethodInvocation *invocation,
+                                           int method,
+                                           gpointer user_data)
 {
        LBS_SERVER_LOGD("method: %d", method);
-       if(method < 0 || method >= LBS_SERVER_METHOD_SIZE) return FALSE;
+       if (method < 0 || method >= LBS_SERVER_METHOD_SIZE) return FALSE;
 
        lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
        if (!ctx) {
@@ -414,7 +421,7 @@ on_gps_geofence_addfence(LbsGpsGeofence *gps_geofence,
                          gint monitor_states,
                          gint notification_responsiveness,
                          gint unknown_timer,
-                         gpointer      user_data)
+                         gpointer user_data)
 {
        LBS_SERVER_LOGD("on_gps_geofence_addfence");
 
@@ -435,9 +442,9 @@ on_gps_geofence_addfence(LbsGpsGeofence *gps_geofence,
 
 static gboolean
 on_gps_geofence_deletefence(LbsGpsGeofence *gps_geofence,
-                            GDBusMethodInvocation      *invocation,
-                            gint                                       fence_id,
-                            gpointer                           user_data)
+                            GDBusMethodInvocation *invocation,
+                            gint fence_id,
+                            gpointer user_data)
 {
        LBS_SERVER_LOGD("on_gps_geofence_deletefence");
 
@@ -457,7 +464,7 @@ on_gps_geofence_deletefence(LbsGpsGeofence *gps_geofence,
 
 static gboolean
 on_gps_geofence_pausefence(LbsGpsGeofence *gps_geofence,
-                           GDBusMethodInvocation       *invocation,
+                           GDBusMethodInvocation *invocation,
                            gint fence_id,
                            gpointer    user_data)
 {
@@ -480,10 +487,10 @@ on_gps_geofence_pausefence(LbsGpsGeofence *gps_geofence,
 
 static gboolean
 on_gps_geofence_resumefence(LbsGpsGeofence *gps_geofence,
-                            GDBusMethodInvocation      *invocation,
+                            GDBusMethodInvocation *invocation,
                             gint fence_id,
                             gint monitor_states,
-                            gpointer   user_data)
+                            gpointer user_data)
 {
        LBS_SERVER_LOGD("on_gps_geofence_resumefence");
 
@@ -502,6 +509,40 @@ on_gps_geofence_resumefence(LbsGpsGeofence *gps_geofence,
        return TRUE;
 }
 
+
+/* Tizen 3.0 */
+
+static gboolean
+on_manager_setmocklocation(LbsManager *mgr,
+                           GDBusMethodInvocation *invocation,
+                           gint method,
+                           gdouble latitude,
+                           gdouble longitude,
+                           gdouble altitude,
+                           gdouble speed,
+                           gdouble direction,
+                           gdouble accuracy,
+                           gpointer user_data)
+{
+       LBS_SERVER_LOGD("method: %d", method);
+       if (method < 0 || method >= LBS_SERVER_METHOD_SIZE) return FALSE;
+
+       lbs_server_dbus_s *ctx = (lbs_server_dbus_s *)user_data;
+       if (!ctx) {
+               return FALSE;
+       }
+
+       if (ctx->set_mock_location_cb) {
+               ctx->set_mock_location_cb(method, latitude, longitude, altitude, speed, direction, accuracy, user_data);
+
+               LBS_SERVER_LOGD("set_mock_location_cb was called");
+       }
+
+       lbs_manager_complete_set_mock_location(mgr, invocation);
+
+       return TRUE;
+}
+
 static gboolean
 lbs_remove_client_by_force(const char *client, void *data)
 {
@@ -541,8 +582,8 @@ lbs_remove_client_by_force(const char *client, void *data)
 
        if (ctx->shutdown_cb) {
                ctx->shutdown_cb(ctx->userdata, shutdown_arr);
-               LBS_SERVER_LOGD("shutdown_cb called.. gps:%d, nps:%d",
-                               shutdown_arr[LBS_SERVER_METHOD_GPS], shutdown_arr[LBS_SERVER_METHOD_NPS]);
+               LBS_SERVER_LOGD("shutdown_cb called.. gps:%d, nps:%d, mock:%d",
+                               shutdown_arr[LBS_SERVER_METHOD_GPS], shutdown_arr[LBS_SERVER_METHOD_NPS], shutdown_arr[LBS_SERVER_METHOD_MOCK]);
        }
 
        if (ctx->update_interval_cb) {
@@ -580,12 +621,12 @@ lbs_scan_sender(char *key, char *value, gpointer user_data)
 
 static void
 on_name_owner_changed(GDBusConnection *connection,
-                      const gchar              *sender_name,
-                      const gchar              *object_path,
-                      const gchar              *interface_name,
-                      const gchar              *signal_name,
-                      GVariant         *parameters,    /* 1. service name 2. prev_owner 3. new_owner */
-                      gpointer         user_data)
+                      const gchar *sender_name,
+                      const gchar *object_path,
+                      const gchar *interface_name,
+                      const gchar *signal_name,
+                      GVariant *parameters,    /* 1. service name 2. prev_owner 3. new_owner */
+                      gpointer user_data)
 {
        lbs_server_dbus_s *handle = (lbs_server_dbus_s *)user_data;
        g_return_if_fail(handle);
@@ -680,6 +721,14 @@ static void on_bus_acquired(GDBusConnection *conn, const gchar *name, gpointer u
                                                           ctx); /* user_data */
        }
 
+       /* Tizen 3.0 */
+       if (ctx->set_mock_location_cb) {
+               ctx->set_mock_location_h = g_signal_connect(mgr,
+                                                          "handle-set-mock-location",
+                                                          G_CALLBACK(on_manager_setmocklocation),
+                                                          ctx);
+       }
+
        /* Add interface for nmea method*/
        LbsNmea *nmea = NULL;
        nmea = lbs_nmea_skeleton_new();
@@ -734,7 +783,6 @@ static void on_bus_acquired(GDBusConnection *conn, const gchar *name, gpointer u
 
        g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(mgr), conn, ctx->service_path, NULL);
        g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(nmea), conn, ctx->service_path, NULL);
-       /*      g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(nmea), conn, path, NULL); */
 
        g_dbus_object_manager_server_set_connection(ctx->manager, conn);
 
@@ -944,17 +992,8 @@ lbs_server_create(char *service_name,
                   char *name,
                   char *description,
                   lbs_server_dbus_h *lbs_server,
-                  LbsDbusSetOptionsCB set_options_cb,
-                  LbsDbusShutdownCB shutdown_cb,
-                  LbsDbusUpdateIntervalCB update_interval_cb,
-                  LbsDbusRequestChangeIntervalCB request_change_interval_cb,
-                  LbsDbusGetNmeaCB get_nmea_cb,
-                  GpsGeofenceAddFenceCB add_hw_fence_cb,
-                  GpsGeofenceDeleteFenceCB delete_hw_fence_cb,
-                  GpsGeofencePauseFenceCB pause_hw_fence_cb,
-                  GpsGeofenceResumeFenceCB resume_hw_fence_cb,
+                  lbs_server_dbus_cb_t *lbs_server_cb,
                   gpointer userdata)
-
 {
        LBS_SERVER_LOGD("ENTER >>>");
        g_return_val_if_fail(service_name, LBS_SERVER_ERROR_PARAMETER);
@@ -982,17 +1021,25 @@ lbs_server_create(char *service_name,
 
        server->connections = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
        server->userdata = userdata;
-       server->set_options_cb = set_options_cb;
-       server->shutdown_cb = shutdown_cb;
-       server->update_interval_cb = update_interval_cb;
-       server->request_change_interval_cb = request_change_interval_cb;
-       server->get_nmea_cb = get_nmea_cb;
+
+#if TIZEN_3_0_OPT
+       server->callback = lbs_server_cb;
+#endif
+
+       server->set_options_cb = lbs_server_cb->set_options_cb;
+       server->shutdown_cb = lbs_server_cb->shutdown_cb;
+       server->update_interval_cb = lbs_server_cb->update_interval_cb;
+       server->request_change_interval_cb = lbs_server_cb->request_change_interval_cb;
+       server->get_nmea_cb = lbs_server_cb->get_nmea_cb;
+
+       /* Tizen 3.0 */
+       server->set_mock_location_cb = lbs_server_cb->set_mock_location_cb;
 
        /* add H/W gps-gefence callbacks */
-       server->add_hw_fence_cb = add_hw_fence_cb;
-       server->delete_hw_fence_cb = delete_hw_fence_cb;
-       server->pause_hw_fence_cb = pause_hw_fence_cb;
-       server->resume_hw_fence_cb = resume_hw_fence_cb;
+       server->add_hw_fence_cb = lbs_server_cb->add_hw_fence_cb;
+       server->delete_hw_fence_cb = lbs_server_cb->delete_hw_fence_cb;
+       server->pause_hw_fence_cb = lbs_server_cb->pause_hw_fence_cb;
+       server->resume_hw_fence_cb = lbs_server_cb->resume_hw_fence_cb;
 
        server->owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
                                          service_name,
@@ -1056,6 +1103,11 @@ lbs_server_destroy(lbs_server_dbus_h lbs_server)
                g_signal_handler_disconnect(lbs_mgr, handle->remove_reference_h);
                handle->remove_reference_h = 0;
        }
+
+       if (handle->set_mock_location_h) {
+               g_signal_handler_disconnect(lbs_mgr, handle->set_mock_location_h);
+               handle->set_mock_location_h = 0;
+       }
        g_object_unref(lbs_mgr);
 
        LbsNmea *nmea = NULL;