[bluetooth-frwk] Create/destroy session implementation added 44/102844/2
authorPiotr Kosko <p.kosko@samsung.com>
Wed, 19 Oct 2016 10:31:45 +0000 (12:31 +0200)
committerPyun DoHyun <dh79.pyun@samsung.com>
Thu, 8 Dec 2016 00:18:09 +0000 (16:18 -0800)
Change-Id: I3fcba252d63b110328f5fb1478ea27dd70993e3f
Signed-off-by: Piotr Kosko <p.kosko@samsung.com>
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
bt-api/bt-map-client.c
bt-api/bt-request-sender.c
bt-service/bt-request-handler.c
bt-service/bt-service-map-client.c
bt-service/include/bt-service-map-client.h
include/bluetooth-api.h
include/bt-internal-types.h

index 32bfebe..ab2418a 100644 (file)
@@ -30,6 +30,7 @@
 
 BT_EXPORT_API int bluetooth_map_init(void)
 {
+       BT_DBG("bluetooth_map_init");
        bt_user_info_t *user_info;
 
        user_info = _bt_get_user_data(BT_COMMON);
@@ -40,7 +41,63 @@ BT_EXPORT_API int bluetooth_map_init(void)
 
 BT_EXPORT_API int bluetooth_map_deinit(void)
 {
+       BT_DBG("bluetooth_map_deinit");
        return _bt_unregister_event(BT_MAP_CLIENT_EVENT);
 }
 
+BT_EXPORT_API int bluetooth_map_create_session(bt_map_session_info_s* session) {
+       BT_DBG("bluetooth_map_create_session");
+       int result = 0;
+
+       BT_CHECK_ENABLED(return);
+       BT_CHECK_PARAMETER(session->remote_address, return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, session->remote_address, strlen(session->remote_address)+1);
+
+       result = _bt_send_request(BT_OBEX_SERVICE, BT_MAP_CREATE_SESSION,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               if (out_param->len > 0) {
+                       session->session_path = strdup(&g_array_index(out_param, char, 0));
+                       BT_DBG("session id: %s", session->session_path);
+               } else {
+                       BT_ERR("out_param length is 0!!");
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
+       }
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_map_destroy_session(bt_map_session_info_s* session) {
+       LOGE("bluetooth_map_destroy_session");
+       int result = 0;
+
+       BT_CHECK_ENABLED(return);
+       BT_CHECK_PARAMETER(session->session_path, return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       g_array_append_vals(in_param1, session->session_path, strlen(session->session_path)+1);
+
+       result = _bt_send_request(BT_OBEX_SERVICE, BT_MAP_DESTROY_SESSION,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       if (result == BLUETOOTH_ERROR_NONE) {
+               BT_DBG("session (%s) was destroyed", session->session_path);
+               free(session->remote_address);
+               free(session->session_path);
+               free(session);
+       }
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       return result;
+}
+
+
+
 /* TODO: MAP API */
index df4812c..ddb1cb5 100644 (file)
@@ -315,8 +315,7 @@ static void __send_request_cb(GDBusProxy *proxy,
                                request_id = g_array_index(out_param1, int, 0);
                                BT_DBG("request_id : %d", request_id);
                                _bt_add_push_request_id(request_id);
-                       }
-                       if (cb_data->service_function == BT_MAP_111) {
+                       } else if (cb_data->service_function == BT_MAP_444) {
                                /* TODO: MAP service functions */
                        }
 
index 026fea6..51b9570 100644 (file)
@@ -154,6 +154,7 @@ static void __bt_service_method(GDBusConnection *connection,
                gpointer user_data)
 {
        FN_START;
+
        BT_DBG("Method[%s] Object Path[%s] Interface Name[%s]",
                        method_name, object_path, interface_name);
 
@@ -180,14 +181,15 @@ static void __bt_service_method(GDBusConnection *connection,
 
                sender = g_dbus_method_invocation_get_sender(invocation);
 
-               if (service_type == BT_CORE_SERVICE) {
+               // TODO map - privileges should be checked, just debugging purposes
+               /*if (service_type == BT_CORE_SERVICE) {
                        BT_DBG("No need to check privilege from bt-core");
                } else if (__bt_service_check_privilege(service_function,
                                        service_type, (const char *)sender) == FALSE) {
                        BT_ERR("Client don't have the privilege to excute this function");
                        result = BLUETOOTH_ERROR_PERMISSION_DEINED;
                        goto fail;
-               }
+               }*/
 
                if (request_type == BT_ASYNC_REQ
                                || service_function == BT_OBEX_SERVER_ACCEPT_CONNECTION) {
@@ -2259,6 +2261,36 @@ int __bt_obexd_request(int function_name,
 
                break;
        }
+
+       case BT_MAP_CREATE_SESSION: {
+               BT_DBG("BT_MAP_CREATE_SESSION");
+               char *address = (char *)g_variant_get_data(in_param1);
+               char* session_id = NULL;
+               result = _bt_create_session_sync(address, &session_id);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       g_array_append_vals(*out_param1, session_id, strlen(session_id)+1);
+               }
+               break;
+       }
+
+       case BT_MAP_DESTROY_SESSION: {
+               BT_DBG("BT_MAP_DESTROY_SESSION");
+               char* session_id = (char *)g_variant_get_data(in_param1);
+               result = _bt_destroy_session_sync(session_id);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       BT_DBG("successfully destroyed session");
+               }
+               free(session_id);
+               break;
+       }
+
+       case BT_MAP_LIST_FOLDERS: {
+               BT_DBG("BT_MAP_LIST_FOLDERS");
+
+               result = BLUETOOTH_ERROR_NOT_SUPPORT;
+               break;
+       }
+
        /* TODO: MAP? MAP functions, see above */
        case BT_OBEX_SERVER_ALLOCATE: {
                int app_pid;
index 187854e..b42e1fa 100644 (file)
@@ -230,4 +230,99 @@ static int __bt_opp_client_start_XXXXXXXXXX(int request_id, char *address
        /* TODO: MAP */
 }
 
+int _bt_create_session_sync(char* address, char** session_id)
+{
+       BT_DBG("Entered SERVICE create session");
+       GDBusConnection *g_conn;
+       GDBusProxy *session_proxy;
+       GError *err = NULL;
+       const char *session_path;
+
+       retv_if(address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
+                                               NULL, BT_OBEX_SERVICE_NAME,
+                                               BT_OBEX_CLIENT_PATH,
+                                               BT_OBEX_CLIENT_INTERFACE,
+                                               NULL, &err);
+       if (err) {
+               BT_ERR("Unable to create session_proxy: %s", err->message);
+               g_clear_error(&err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       GVariantBuilder* builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+       g_variant_builder_add(builder, "{sv}", "Target",
+                       g_variant_new("s", "map"));
+       GVariant *args = g_variant_builder_end(builder);
+       g_variant_builder_unref (builder);
+       GVariant *param = g_variant_new("(s@a{sv})", address, args);
+
+       char* string = g_variant_print (param, true);
+
+       GVariant *value = g_dbus_proxy_call_sync(session_proxy, "CreateSession", param,
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+       if (err != NULL) {
+               BT_ERR("Could not create session: %s\n", err->message);
+               g_error_free(err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               if (NULL == value) {
+                       BT_ERR("create session returned value is null\n");
+                       return BLUETOOTH_ERROR_INTERNAL;
+               } else {
+                       BT_DBG("create session succeed\n");
+               }
+       }
+
+       g_variant_get(value, "(&o)", session_id);
+       BT_DBG("session_id = \"%s\"\n", *session_id);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_destroy_session_sync(char* session_id)
+{
+       BT_DBG("Entered SERVICE destroy session with id: \"%s\"", session_id);
+       GDBusConnection *g_conn;
+       GDBusProxy *session_proxy;
+       GError *err = NULL;
+
+       retv_if(session_id == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
+                                               NULL, BT_OBEX_SERVICE_NAME,
+                                               BT_OBEX_CLIENT_PATH,
+                                               BT_OBEX_CLIENT_INTERFACE,
+                                               NULL, &err);
+       if (err) {
+               BT_ERR("Unable to create session_proxy: %s", err->message);
+               g_clear_error(&err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       GVariant *param = g_variant_new("(o)", session_id);
+
+       char* string = g_variant_print (param, true);
+
+       GVariant *value = g_dbus_proxy_call_sync(session_proxy, "RemoveSession", param,
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+       if (err != NULL) {
+               BT_ERR("Could not remove session: %s\n", err->message);
+               g_error_free(err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               BT_DBG("remove session succeed\n");
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
 /* TODO: MAP */
index a413387..b1aebd5 100644 (file)
@@ -61,6 +61,9 @@ typedef struct {
 
 } bt_session_data_t; /* TODO: "session"? */
 
+
+int _bt_create_session_sync(char* address, char** session_id);
+int _bt_destroy_session_sync(char* session_id);
 /* TODO: MAP */
 
 #ifdef __cplusplus
index 46c1a80..3e17ac0 100644 (file)
@@ -35,6 +35,7 @@ extern "C" {
  * @{
  */
 
+#define BLUETOOTH_ADDRESS_STRING_LENGTH                17 /**< This specifies bluetooth device address length (AA:BB:CC:DD:EE:FF) */
 #define BLUETOOTH_ADDRESS_LENGTH               6 /**< This specifies bluetooth device address length */
 #define BLUETOOTH_VERSION_LENGTH_MAX           30 /**< This specifies bluetooth device version length */
 #define BLUETOOTH_INTERFACE_NAME_LENGTH                16
@@ -1789,6 +1790,13 @@ typedef struct {
        char if_name[16];
 } bt_ipsp_connection_info_t;
 
+
+/* TODO MAP structures */
+typedef struct {
+       char* session_path;
+       char* remote_address;
+} bt_map_session_info_s;
+
 /**
  * Callback pointer type
  */
@@ -4853,6 +4861,10 @@ int bluetooth_map_init(void);
  */
  int bluetooth_map_deinit(void);
 
+ int bluetooth_map_create_session(bt_map_session_info_s* s);
+
+ int bluetooth_map_destroy_session(bt_map_session_info_s* session);
+
  /* TODO: MAP, see above */
 
 
index 1244757..d16feaf 100644 (file)
@@ -257,9 +257,9 @@ typedef enum {
        BT_OPP_CANCEL_PUSH,
        BT_OPP_IS_PUSHING_FILES,
        BT_OPP_GET_TRANSFER_PROGRESS,
-       BT_MAP_111 = BT_FUNC_MAP_BASE,
-       BT_MAP_222,
-       BT_MAP_333,
+       BT_MAP_CREATE_SESSION = BT_FUNC_MAP_BASE,
+       BT_MAP_DESTROY_SESSION,
+       BT_MAP_LIST_FOLDERS,
        BT_MAP_444,
        BT_MAP_555,
        BT_MAP_666,