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