From 5705041c57a945cc57db14912bba55c0c26becc4 Mon Sep 17 00:00:00 2001 From: Piotr Dabrowski Date: Fri, 18 Nov 2016 09:58:48 +0100 Subject: [PATCH] [bluetooth-frwk] pushMessage Change-Id: I47f99f194f1992cf8c6ef7127dd48c6bfd5e9fbc --- bt-api/bt-event-handler.c | 20 +++- bt-api/bt-map-client.c | 39 ++++++- bt-api/bt-request-sender.c | 9 +- bt-service/bt-request-handler.c | 13 ++- bt-service/bt-service-event-receiver.c | 10 +- bt-service/bt-service-event-sender.c | 9 +- bt-service/bt-service-map-client.c | 158 ++++++++++++++++++++++++----- bt-service/include/bt-service-map-client.h | 5 +- include/bluetooth-api.h | 1 - include/bt-internal-types.h | 7 +- 10 files changed, 211 insertions(+), 60 deletions(-) diff --git a/bt-api/bt-event-handler.c b/bt-api/bt-event-handler.c index 8c3ba53..9c86f26 100644 --- a/bt-api/bt-event-handler.c +++ b/bt-api/bt-event-handler.c @@ -2284,13 +2284,23 @@ void __bt_map_client_event_filter(GDBusConnection *connection, result, some_result_value, event_info->cb, event_info->user_data); __bt_remove_push_request_id(request_id); + } else if (strcasecmp(signal_name, BT_MAP_PUSH_MESSAGE_COMPLETE) == 0) { + BT_DBG("BT_MAP_PUSH_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_PUSH_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 4 - // TODO MAP place for you else 5 - // TODO MAP place for you else 6 - // TODO MAP place for you else 7 - // TODO MAP place for you else 8 } diff --git a/bt-api/bt-map-client.c b/bt-api/bt-map-client.c index 05c5776..d1b52cb 100644 --- a/bt-api/bt-map-client.c +++ b/bt-api/bt-map-client.c @@ -302,12 +302,43 @@ BT_EXPORT_API int bluetooth_map_client_push_message( const char *folder, bt_map_client_push_message_args_t *args) { - BT_DBG("bluetooth_map_client_push_message"); - int result = BLUETOOTH_ERROR_INTERNAL; + BT_DBG("Entered bluetooth_map_client_push_message"); + int result = 0; + + BT_CHECK_ENABLED(return); + BT_CHECK_PARAMETER(session, return); + BT_CHECK_PARAMETER(session->session_path, return); + BT_CHECK_PARAMETER(source_file, return); + BT_CHECK_PARAMETER(folder, return); - /* TODO: MAP */ + 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); - return result; + GVariantBuilder b; + g_variant_builder_init(&b, (const GVariantType*) "a{sv}"); + if (args->is_transparent > -1) + g_variant_builder_add(&b, "{sv}", "Transparent", g_variant_new_boolean(args->is_transparent == 1 ? TRUE : FALSE)); + if (args->is_retry > -1) + g_variant_builder_add(&b, "{sv}", "Retry", g_variant_new_boolean(args->is_retry == 1 ? TRUE : FALSE)); + if (args->charset != NULL) + g_variant_builder_add(&b, "{sv}", "Charset", g_variant_new_string(args->charset)); + GVariant *args_variant = g_variant_builder_end(&b); + char *args_serialized = g_variant_print(args_variant, TRUE); + + g_array_append_vals(in_param1, session->session_path, strlen(session->session_path)+1); + g_array_append_vals(in_param2, source_file, strlen(source_file)+1); + g_array_append_vals(in_param3, folder, strlen(folder)+1); + g_array_append_vals(in_param4, args_serialized, strlen(args_serialized)+1); + + result = _bt_send_request_async(BT_OBEX_SERVICE, BT_MAP_PUSH_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; } BT_EXPORT_API int bluetooth_map_client_get_message( diff --git a/bt-api/bt-request-sender.c b/bt-api/bt-request-sender.c index f23faf2..d93015b 100644 --- a/bt-api/bt-request-sender.c +++ b/bt-api/bt-request-sender.c @@ -333,12 +333,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_PUSH_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 4 - // TODO MAP place for your own if 5 - // TODO MAP place for your own if 6 - // TODO MAP place for your own if 7 - // TODO MAP place for your own if 8 goto done; } diff --git a/bt-service/bt-request-handler.c b/bt-service/bt-request-handler.c index c98149d..528c432 100644 --- a/bt-service/bt-request-handler.c +++ b/bt-service/bt-request-handler.c @@ -2342,9 +2342,18 @@ int __bt_obexd_request(int function_name, case BT_MAP_PUSH_MESSAGE: { BT_DBG("BT_MAP_PUSH_MESSAGE"); - /* TODO: MAP */ + char* session_id = (char *)g_variant_get_data(in_param1); + char* source_file = (char *)g_variant_get_data(in_param2); + char* folder = (char *)g_variant_get_data(in_param3); + char* args_serialized = (char *)g_variant_get_data(in_param4); - result = BLUETOOTH_ERROR_NOT_SUPPORT; + result = _bt_map_client_push_message( + request_id, context, session_id, source_file, folder, args_serialized); + if (result == BLUETOOTH_ERROR_NONE) { + BT_DBG("_bt_map_client_push_message succeed"); + } else { + BT_ERR("_bt_map_client_push_message failed"); + } break; } diff --git a/bt-service/bt-service-event-receiver.c b/bt-service/bt-service-event-receiver.c index fd5e640..ca34153 100644 --- a/bt-service/bt-service-event-receiver.c +++ b/bt-service/bt-service-event-receiver.c @@ -84,7 +84,7 @@ typedef enum { void _bt_handle_property_changed_event(GVariant *msg, const char *object_path); void _bt_opc_property_changed_event(GVariant *msg, char *path); -void _bt_map_property_changed_event(GVariant *msg, char *path); /* TODO: MAP, do we need this? */ +void _bt_map_property_changed_event(GVariant *msg, const char *path); int _bt_register_service_event(GDBusConnection *g_conn, int event_type); void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type); void _bt_opp_client_event_deinit(void); @@ -1488,10 +1488,10 @@ void __bt_map_property_changed_event(GVariant *msg, // currently doing nothing } else if (strcasecmp(status, "complete") == 0) { BT_DBG("EVENT : COMPLETED"); - _bt_on_get_message_finished(path); + _bt_map_on_transfer_finished(path, BLUETOOTH_ERROR_NONE); } else if (strcasecmp(status, "error") == 0) { BT_DBG("EVENT : FAILED"); - // currently doing nothing + _bt_map_on_transfer_finished(path, BLUETOOTH_ERROR_INTERNAL); } g_free(status); } else if (strcasecmp(property, "Transferred") == 0) { @@ -1509,7 +1509,7 @@ void __bt_map_property_changed_event(GVariant *msg, } } -void _bt_map_property_changed_event(GVariant *msg, char *path) +void _bt_map_property_changed_event(GVariant *msg, const char *path) { BT_DBG("Entered _bt_map_property_changed_event"); char *interface_name = NULL; @@ -3148,7 +3148,7 @@ static void __bt_map_event_filter(GDBusConnection *connection, } else if (strcasecmp(member, "InterfacesRemoved") == 0) { BT_DBG("------------------------------------REMOVED------------------------------------"); // TODO check if something should be called here? - //_bt_on_get_message_finished(object_path); + //_bt_map_on_transfer_finished(object_path, error); } else if (__bt_is_obexd_client_event(parameters, interface_name) == TRUE) { BT_DBG("------------------------------------CLIENT EVENT------------------------------------"); _bt_map_property_changed_event(parameters, object_path); diff --git a/bt-service/bt-service-event-sender.c b/bt-service/bt-service-event-sender.c index 59d447d..f3e97a5 100644 --- a/bt-service/bt-service-event-sender.c +++ b/bt-service/bt-service-event-sender.c @@ -344,11 +344,10 @@ int _bt_send_event(int event_type, int event, GVariant *param) 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 - // TODO MAP place for your own case 7 - // TODO MAP place for your own case 8 + case BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE: + signal = BT_MAP_PUSH_MESSAGE_COMPLETE; + BT_INFO_C("Completed push message operation [MAP]"); + break; case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED: signal = BT_TRANSFER_CONNECTED; break; diff --git a/bt-service/bt-service-map-client.c b/bt-service/bt-service-map-client.c index d2e7d3f..614178e 100644 --- a/bt-service/bt-service-map-client.c +++ b/bt-service/bt-service-map-client.c @@ -35,12 +35,16 @@ #define DBUS_TIMEOUT 20 * 1000 /* 20 Seconds */ +enum bt_map_transfer_type { + BT_MAP_TRANSFER_GET_MESSAGE = 0, + BT_MAP_TRANSFER_PUSH_MESSAGE +}; typedef struct { + enum bt_map_transfer_type transfer_type; char *transfer_path; int request_id; -} bt_callback_data_t; - +} bt_map_callback_data_t; static GSList *transfer_list = NULL; @@ -684,27 +688,11 @@ int _bt_map_client_update_inbox(const char* session_id) return BLUETOOTH_ERROR_NONE; } -int _bt_map_client_push_message( - const char* session_id, - const char* source_file, - const char* folder, - const char* args_serialized) -{ - BT_DBG("+"); - - /* TODO: MAP */ - - BT_DBG("-"); - - return BLUETOOTH_ERROR_NONE; -} - -void _bt_on_get_message_finished(const char* transfer_object_path) { - BT_DBG("Entered _bt_on_get_message_finished"); +void _bt_map_on_transfer_finished(const char* transfer_object_path, const int error) { + BT_DBG("Entered _bt_map_on_transfer_finished"); BT_DBG("Looking for transfer %s id", transfer_object_path); - - bt_callback_data_t *callback_data = NULL; + bt_map_callback_data_t *callback_data = NULL; GSList* transfer = NULL; for (transfer = transfer_list; transfer != NULL; transfer = g_slist_next(transfer)) { callback_data = transfer->data; @@ -715,8 +703,19 @@ void _bt_on_get_message_finished(const char* transfer_object_path) { 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); + GVariant *param = g_variant_new("(ii)", error, callback_data->request_id); + + int event = -1; + switch (callback_data->transfer_type) { + case BT_MAP_TRANSFER_GET_MESSAGE: + event = BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE; + break; + case BT_MAP_TRANSFER_PUSH_MESSAGE: + event = BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE; + break; + } + + _bt_send_event(BT_MAP_CLIENT_EVENT, event, param); // remove callback data from list g_slist_remove(transfer_list, transfer); @@ -731,6 +730,116 @@ void _bt_on_get_message_finished(const char* transfer_object_path) { } } +static void __bt_push_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_map_callback_data_t* callback_data = malloc(sizeof(*callback_data)); + callback_data->transfer_type = BT_MAP_TRANSFER_PUSH_MESSAGE; + 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_push_message( + int request_id, + GDBusMethodInvocation *context, + const char* session_id, + const char* source_file, + const char* folder, + const char* args_serialized) +{ + BT_DBG("Entered _bt_map_client_push_message with session id: \"%s\"", session_id); + BT_DBG("Entered source_file: %s", source_file); + BT_DBG("Entered folder: %s", folder); + + GDBusConnection *g_conn; + GDBusProxy *message_access_proxy; + GError *error = NULL; + int result = BLUETOOTH_ERROR_NONE; + + retv_if(session_id == 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 access proxy + g_clear_error(&error); + message_access_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, + BT_OBEX_SERVICE_NAME, session_id, BT_OBEX_MESSAGE_INTERFACE, + NULL, &error); + if (error != NULL) { + BT_ERR("Could not create message access proxy: %s\n", error->message); + result = BLUETOOTH_ERROR_INTERNAL; + } else { + if (!message_access_proxy) { + BT_ERR("message proxy handle is null\n"); + result = BLUETOOTH_ERROR_INTERNAL; + } else { + BT_DBG("message proxy set"); + + GVariant *args_variant = g_variant_parse(NULL, args_serialized, NULL, NULL, NULL); + + GVariant *params = g_variant_new("(ss@a{sv})", source_file, folder, args_variant); + GVariant *req_id = g_variant_new("(i)", request_id); + + g_dbus_proxy_call(message_access_proxy, + "PushMessage", params, + G_DBUS_CALL_FLAGS_NONE, -1, + NULL, (GAsyncReadyCallback)__bt_push_message_cb, + (void*)req_id); + } + } + + g_object_unref(message_access_proxy); + BT_DBG("-"); + + return result; +} + static void __bt_get_message_cb(GDBusProxy *proxy, GAsyncResult *res, gpointer user_data) { @@ -764,7 +873,8 @@ static void __bt_get_message_cb(GDBusProxy *proxy, 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)); + bt_map_callback_data_t* callback_data = malloc(sizeof(*callback_data)); + callback_data->transfer_type = BT_MAP_TRANSFER_GET_MESSAGE; callback_data->request_id = request_id; callback_data->transfer_path = transfer_object_path; diff --git a/bt-service/include/bt-service-map-client.h b/bt-service/include/bt-service-map-client.h index 3479b3f..4adde5d 100644 --- a/bt-service/include/bt-service-map-client.h +++ b/bt-service/include/bt-service-map-client.h @@ -87,6 +87,8 @@ int _bt_map_client_list_messages( int _bt_map_client_update_inbox( const char* session_id); int _bt_map_client_push_message( + int request_id, + GDBusMethodInvocation *context, const char* session_id, const char* source_file, const char* folder, @@ -98,9 +100,6 @@ int _bt_map_client_get_message( const char* target_file, bool attachment); -void _bt_on_get_message_finished(const char* transfer_object_path); - - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/include/bluetooth-api.h b/include/bluetooth-api.h index eead2ee..624abb0 100644 --- a/include/bluetooth-api.h +++ b/include/bluetooth-api.h @@ -1886,7 +1886,6 @@ typedef struct { void* user_data; } bt_get_message_callback_data; - /** * Callback pointer type */ diff --git a/include/bt-internal-types.h b/include/bt-internal-types.h index fd1a663..9361d2b 100644 --- a/include/bt-internal-types.h +++ b/include/bt-internal-types.h @@ -505,12 +505,7 @@ typedef struct { #define BT_MAP_FILTER_FIELDS_COMPLETE "MapListFiltersFieldComplete" #define BT_MAP_LIST_MESSAGES_COMPLETE "MapListMessagesComplete" #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 -// TODO MAP place for your define 7 -// TODO MAP place for your define 8 -#define BT_MAP_OP_COMPLETE "Complete" +#define BT_MAP_PUSH_MESSAGE_COMPLETE "MapPushMessageComplete" #define BT_TRANSFER_CONNECTED "TransferConnected" #define BT_TRANSFER_DISCONNECTED "TransferDisonnected" #define BT_TRANSFER_STARTED "TransferStarted" -- 2.7.4