[bluetooth-frwk] added getMessage implementation 52/102852/2
authorPiotr Kosko <p.kosko@samsung.com>
Wed, 9 Nov 2016 07:01:50 +0000 (08:01 +0100)
committerPyun DoHyun <dh79.pyun@samsung.com>
Thu, 8 Dec 2016 00:21:06 +0000 (16:21 -0800)
Change-Id: Iedb4fc0d4bd721a496112c1aed36ae79ef0093f4
Signed-off-by: Piotr Kosko <p.kosko@samsung.com>
bt-api/bt-event-handler.c
bt-api/bt-map-client.c
bt-api/bt-request-sender.c
bt-service/bt-request-handler.c
bt-service/bt-service-event-receiver.c
bt-service/bt-service-event-sender.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 c34b91b..9dc2ea0 100644 (file)
@@ -70,6 +70,7 @@ static gboolean __bt_is_request_id_exist(int request_id)
                if (info == NULL)
                        continue;
 
+               BT_DBG("compare %d  with %d", info->request_id, request_id);
                if (info->request_id == request_id)
                        return TRUE;
        }
@@ -2267,8 +2268,24 @@ void __bt_map_client_event_filter(GDBusConnection *connection,
                free(messages_struct.message_items);
 
                g_variant_unref(messages_list_var);
+       } else if (strcasecmp(signal_name, BT_MAP_GET_MESSAGE_COMPLETE) == 0) {
+               BT_DBG("BT_MAP_GET_MESSAGE_COMPLETE");
+               int request_id = 0;
+
+               g_variant_get(parameters, "(ii)", &result, &request_id);
+               if (__bt_is_request_id_exist(request_id) == FALSE) {
+                       BT_ERR("Different request id!");
+                       return;
+               }
+
+               // currently there is no result value passed from here, just passing NULL
+               void* some_result_value = NULL;
+               _bt_common_event_cb(BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE,
+                               result, some_result_value, event_info->cb, event_info->user_data);
+
+               __bt_remove_push_request_id(request_id);
+
        }
-       // TODO MAP place for you else 3
        // TODO MAP place for you else 4
        // TODO MAP place for you else 5
        // TODO MAP place for you else 6
index 78b66e7..660a4f8 100644 (file)
@@ -271,10 +271,31 @@ BT_EXPORT_API int bluetooth_map_client_get_message(
     const char *target_file,
     bool attachment)
 {
-    BT_DBG("bluetooth_map_client_get_message");
-    int result = BLUETOOTH_ERROR_INTERNAL;
+    BT_DBG("Entered bluetooth_map_client_get_message");
+       int result = 0;
 
-    /* TODO: MAP */
+       BT_CHECK_ENABLED(return);
+       BT_CHECK_PARAMETER(session, return);
+       BT_CHECK_PARAMETER(session->session_path, return);
+       BT_CHECK_PARAMETER(message_object_name, return);
+       BT_CHECK_PARAMETER(target_file, return);
 
-    return result;
+       bt_user_info_t *user_info = _bt_get_user_data(BT_COMMON);
+       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       // TODO session currently is not used, but should be valid
+       //g_array_append_vals(in_param1, session->session_path, strlen(session->session_path)+1);
+       g_array_append_vals(in_param2, message_object_name, strlen(message_object_name)+1);
+       g_array_append_vals(in_param3, target_file, strlen(target_file)+1);
+       g_array_append_vals(in_param4, &attachment, sizeof(attachment));
+
+       result = _bt_send_request_async(BT_OBEX_SERVICE, BT_MAP_GET_MESSAGE,
+                       in_param1, in_param2, in_param3, in_param4, user_info->cb, user_info->user_data);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
 }
index 0f2bcf1..f23faf2 100644 (file)
@@ -329,9 +329,11 @@ 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);
+                       } else if (cb_data->service_function == BT_MAP_GET_MESSAGE) {
+                               request_id = g_array_index(out_param1, int, 0);
+                               BT_DBG("request_id : %d", request_id);
+                               _bt_add_push_request_id(request_id);
                        }
-                       // TODO MAP place for your own if 2
-                       // TODO MAP place for your own if 3
                        // TODO MAP place for your own if 4
                        // TODO MAP place for your own if 5
                        // TODO MAP place for your own if 6
index 8565ce8..3c3e015 100644 (file)
@@ -2293,9 +2293,6 @@ int __bt_obexd_request(int function_name,
 
        case BT_MAP_LIST_FOLDERS: {
                BT_DBG("BT_MAP_LIST_FOLDERS");
-               // TODO MAP add filter handling
-               GVariant *filter = g_variant_new("()");
-
                char* session_id = (char *)g_variant_get_data(in_param1);
                int offset = 0;
                int maxcount = 0;
@@ -2356,10 +2353,19 @@ int __bt_obexd_request(int function_name,
 
        case BT_MAP_GET_MESSAGE: {
                BT_DBG("BT_MAP_GET_MESSAGE");
+               // TODO session currently is not used, but should be valid
+               //char* session_id = (char *)g_variant_get_data(in_param1);
+               char* message_object_name = (char *)g_variant_get_data(in_param2);
+               char* target_file = (char *)g_variant_get_data(in_param3);
+               bool attachment = false;
+               __bt_service_get_parameters(in_param4, &attachment, sizeof(bool));
+
+               result = _bt_map_client_get_message(request_id, context, message_object_name,
+                               target_file, attachment);
+               if (result == BLUETOOTH_ERROR_NONE) {
+                       BT_DBG("_bt_map_client_get_message succeed");
+               }
 
-               /* TODO: MAP */
-
-               result = BLUETOOTH_ERROR_NOT_SUPPORT;
                break;
        }
 
index ccad244..fd5e640 100644 (file)
@@ -1467,12 +1467,62 @@ void _bt_opc_property_changed_event(GVariant *msg, char *path)
 void __bt_map_property_changed_event(GVariant *msg,
                                                const char *path)
 {
-       /* TODO: MAP, do we need this? see above */
+       BT_DBG("Entered");
+       GVariantIter value_iter;
+       char *property = NULL;
+       GVariant *val = NULL;
+       GVariant *child = NULL;
+
+       g_variant_iter_init(&value_iter, msg);
+       while ((child = g_variant_iter_next_value(&value_iter))) {
+               g_variant_get(child, "{sv}", &property, &val);
+               ret_if(property == NULL);
+
+               if (strcasecmp(property, "Status") == 0) {
+                       char *status = NULL;
+                       g_variant_get(val, "s", &status);
+                       BT_DBG("Status is %s", status);
+
+                       if (strcasecmp(status, "active") == 0) {
+                               BT_DBG("EVENT : STARTED");
+                               // currently doing nothing
+                       } else if (strcasecmp(status, "complete") == 0) {
+                               BT_DBG("EVENT : COMPLETED");
+                               _bt_on_get_message_finished(path);
+                       } else if (strcasecmp(status, "error") == 0) {
+                               BT_DBG("EVENT : FAILED");
+                               // currently doing nothing
+                       }
+                       g_free(status);
+               } else if (strcasecmp(property, "Transferred") == 0) {
+                       guint64 transferred  = 0;
+                       g_variant_get(val, "t", &transferred);
+
+                       BT_DBG("EVENT : PROGRESS CALLBACK");
+                       // currently doing nothing - progress callback type is not used
+               } else {
+                       BT_DBG("OTHER EVENT : property : [%s]", property);
+               }
+               g_free(property);
+               g_variant_unref(child);
+               g_variant_unref(val);
+       }
 }
 
 void _bt_map_property_changed_event(GVariant *msg, char *path)
 {
-       /* TODO: MAP, do we need this? see above */
+       BT_DBG("Entered _bt_map_property_changed_event");
+       char *interface_name = NULL;
+       GVariant *value = NULL;
+       g_variant_get(msg, "(&s@a{sv}@as)", &interface_name, &value, NULL);
+       BT_INFO("interface_name = %s", interface_name);
+       if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
+               __bt_map_property_changed_event(value,
+                               path);
+       } else {
+               BT_DBG("interface_name : [%s]", interface_name);
+       }
+       g_variant_unref(value);
 }
 
 
@@ -3089,7 +3139,22 @@ static  void __bt_map_event_filter(GDBusConnection *connection,
                                        GVariant *parameters,
                                        gpointer user_data)
 {
-       /* TODO: MAP, do we need this here? see above */
+       BT_DBG("Entered __bt_map_event_filter");
+       const char *member = signal_name;
+
+       if (strcasecmp(member, "InterfacesAdded") == 0) {
+               BT_DBG("------------------------------------ADDED------------------------------------");
+               // currently doing nothing
+       } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
+               BT_DBG("------------------------------------REMOVED------------------------------------");
+               // TODO check if something should be called here?
+               //_bt_on_get_message_finished(object_path);
+       } else if (__bt_is_obexd_client_event(parameters, interface_name) == TRUE) {
+               BT_DBG("------------------------------------CLIENT EVENT------------------------------------");
+               _bt_map_property_changed_event(parameters, object_path);
+       }
+
+       return;
 }
 
 int _bt_map_client_event_init(void)
@@ -3604,11 +3669,11 @@ int _bt_register_service_event(GDBusConnection *g_conn, int event_type)
        case BT_HEADSET_EVENT:
                _bt_register_audio_subscribe_signal(g_conn, TRUE);
                break;
-
        case BT_OPP_SERVER_EVENT:
                BT_ERR("BT_OPP_SERVER_EVENT: register service event");
                _bt_register_opp_server_subscribe_signal(g_conn, TRUE);
                break;
+
        case BT_OPP_CLIENT_EVENT:
                BT_ERR("BT_OPP_CLIENT_EVENT: register service event");
                _bt_register_opp_client_subscribe_signal(g_conn, TRUE);
index 937df18..59d447d 100644 (file)
@@ -340,7 +340,10 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                signal = BT_MAP_LIST_MESSAGES_COMPLETE;
                BT_INFO_C("Completed list messages operation [MAP]");
                break;
-               // TODO MAP place for your own case 3
+       case BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE:
+               signal = BT_MAP_GET_MESSAGE_COMPLETE;
+               BT_INFO_C("Completed get message operation [MAP]");
+               break;
                // TODO MAP place for your own case 4
                // TODO MAP place for your own case 5
                // TODO MAP place for your own case 6
index f457155..314ae2e 100644 (file)
 
 #define DBUS_TIMEOUT 20 * 1000  /* 20 Seconds */
 
+
+typedef struct {
+       char *transfer_path;
+       int request_id;
+} bt_callback_data_t;
+
+
+static GSList *transfer_list = NULL;
+
 bt_session_info_t *session_info;
 
 static void __bt_free_session_info(bt_session_info_t *info)
@@ -696,17 +705,134 @@ int _bt_map_client_push_message(
        return BLUETOOTH_ERROR_NONE;
 }
 
+void _bt_on_get_message_finished(const char* transfer_object_path) {
+       BT_DBG("Entered _bt_on_get_message_finished");
+       BT_DBG("Looking for transfer %s id", transfer_object_path);
+
+
+       bt_callback_data_t *callback_data = NULL;
+       GSList* transfer = NULL;
+       for (transfer = transfer_list; transfer != NULL; transfer = g_slist_next(transfer)) {
+               callback_data = transfer->data;
+               if (NULL == callback_data) {
+                       continue;
+               }
+
+               if (0 == strcmp(transfer_object_path, callback_data->transfer_path)) {
+                       BT_DBG("request id FOUND - triggering event");
+
+                       GVariant *param = g_variant_new("(ii)", BLUETOOTH_ERROR_NONE, callback_data->request_id);
+                       _bt_send_event(BT_MAP_CLIENT_EVENT, BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE, param);
+
+                       // remove callback data from list
+                       g_slist_remove(transfer_list, transfer);
+
+                       //free memory and break loop
+                       free(callback_data->transfer_path);
+                       callback_data->transfer_path = NULL;
+                       free(callback_data);
+                       break;
+               }
+
+       }
+}
+
+static void __bt_get_message_cb(GDBusProxy *proxy,
+                               GAsyncResult *res, gpointer user_data)
+{
+       BT_DBG("+");
+
+       GError *error = NULL;
+       GVariant *value, *in_param, *param;
+
+       char *transfer_object_path = NULL;
+       GVariantIter *iter = NULL;
+
+       int result = BLUETOOTH_ERROR_NONE;
+       int request_id;
+       int size = 0;
+
+       in_param = (GVariant*) user_data;
+       g_variant_get(in_param, "(i)", &request_id);
+
+       value = g_dbus_proxy_call_finish(proxy, res, &error);
+       if (error) {
+               BT_ERR("%s", error->message);
+               g_clear_error(&error);
+               result = BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       if (value) {
+               g_variant_get(value, "(oa{sv})", &transfer_object_path, &iter);
+               g_variant_unref(value);
+       }
+
+       BT_DBG("transfer object path: [%s]", transfer_object_path);
+
+       BT_DBG("Adding request id %d - transfer [%s]", request_id, transfer_object_path);
+       bt_callback_data_t* callback_data = malloc(sizeof(*callback_data));
+       callback_data->request_id = request_id;
+       callback_data->transfer_path = transfer_object_path;
+
+       transfer_list = g_slist_append(transfer_list, callback_data);
+
+       g_variant_unref(value);
+       g_variant_unref(in_param);
+
+       BT_DBG("-");
+}
+
 int _bt_map_client_get_message(
-               const char* session_id,
+               int request_id,
+               GDBusMethodInvocation *context,
                const char* message_object_name,
                const char* target_file,
                bool attachment)
 {
-       BT_DBG("+");
+       BT_DBG("Entered _bt_map_client_get_message");
 
-       /* TODO: MAP */
+       GDBusConnection *g_conn;
+       GDBusProxy *message_proxy;
+       GError *error = NULL;
+       int result = BLUETOOTH_ERROR_NONE;
+
+       retv_if(message_object_name == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       // TODO event listeners registration on first call, where should it be unregistered??
+       _bt_map_client_event_init();
 
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       GVariant *out_param1 = g_variant_new_from_data((const GVariantType *)"ay",
+                       &request_id, sizeof(int),
+                       TRUE, NULL, NULL);
+       g_dbus_method_invocation_return_value(context, g_variant_new("(iv)", result, out_param1));
+
+       // create message proxy
+       g_clear_error(&error);
+       message_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       BT_OBEX_SERVICE_NAME, message_object_name, "org.bluez.obex.Message1",
+                       NULL, &error);
+       if (error != NULL) {
+               BT_ERR("Could not create message proxy: %s\n", error->message);
+               result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               if (!message_proxy) {
+                       BT_ERR("message proxy handle is null\n");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               } else {
+                       BT_DBG("message proxy set");
+                       GVariant *params = g_variant_new("(sb)", target_file, attachment);
+                       GVariant *req_id = g_variant_new("(i)", request_id);
+
+                       g_dbus_proxy_call(message_proxy, "Get", params, G_DBUS_CALL_FLAGS_NONE, -1,
+                               NULL, (GAsyncReadyCallback)__bt_get_message_cb, (void*)req_id);
+               }
+       }
+
+       g_object_unref(message_proxy);
        BT_DBG("-");
 
-       return BLUETOOTH_ERROR_NONE;
+       return result;
 }
index fdfe63a..85d3bb0 100644 (file)
@@ -81,11 +81,15 @@ int _bt_map_client_push_message(
                const char* folder,
                GVariant *args);
 int _bt_map_client_get_message(
-               const char* session_id,
+               int request_id,
+               GDBusMethodInvocation *context,
                const char* message_object_name,
                const char* target_file,
                bool attachment);
 
+void _bt_on_get_message_finished(const char* transfer_object_path);
+
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 74d330c..24b0c7f 100644 (file)
@@ -1879,6 +1879,11 @@ typedef struct {
        int64_t size;
 } bt_map_client_message_items_s;
 
+typedef struct {
+       const char* target_file;
+       void* user_data;
+} bt_get_message_callback_data;
+
 
 /**
  * Callback pointer type
index 551e6a5..fd1a663 100644 (file)
@@ -504,7 +504,7 @@ typedef struct {
 #define BT_MAP_LIST_FOLDERS_COMPLETE "ListFoldersComplete"
 #define BT_MAP_FILTER_FIELDS_COMPLETE "MapListFiltersFieldComplete"
 #define BT_MAP_LIST_MESSAGES_COMPLETE "MapListMessagesComplete"
-//  TODO MAP place for your define 3
+#define BT_MAP_GET_MESSAGE_COMPLETE "MapGetMessageComplete"
 //  TODO MAP place for your define 4
 //  TODO MAP place for your define 5
 //  TODO MAP place for your define 6