[bluetooth-frwk] pushMessage 55/102855/2
authorPiotr Dabrowski <p.dabrowski2@samsung.com>
Fri, 18 Nov 2016 08:58:48 +0000 (09:58 +0100)
committerPyun DoHyun <dh79.pyun@samsung.com>
Thu, 8 Dec 2016 00:23:39 +0000 (16:23 -0800)
Change-Id: I47f99f194f1992cf8c6ef7127dd48c6bfd5e9fbc

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 8c3ba53..9c86f26 100644 (file)
@@ -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
 
 }
 
index 05c5776..d1b52cb 100644 (file)
@@ -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(
index f23faf2..d93015b 100644 (file)
@@ -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;
                }
index c98149d..528c432 100644 (file)
@@ -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;
        }
 
index fd5e640..ca34153 100644 (file)
@@ -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);
index 59d447d..f3e97a5 100644 (file)
@@ -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;
index d2e7d3f..614178e 100644 (file)
 
 #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;
 
index 3479b3f..4adde5d 100644 (file)
@@ -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 */
index eead2ee..624abb0 100644 (file)
@@ -1886,7 +1886,6 @@ typedef struct {
        void* user_data;
 } bt_get_message_callback_data;
 
-
 /**
  * Callback pointer type
  */
index fd1a663..9361d2b 100644 (file)
@@ -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"