#define DBUS_TIMEOUT 20 * 1000 /* 20 Seconds */
-bt_session_info_t *session_info;
+enum bt_map_transfer_type {
+ BT_MAP_TRANSFER_GET_MESSAGE = 0,
+ BT_MAP_TRANSFER_PUSH_MESSAGE
+};
-static void __bt_free_session_info(bt_session_info_t *info)
-{
- ret_if(info == NULL);
+typedef struct {
+ enum bt_map_transfer_type transfer_type;
+ char *transfer_path;
+ int request_id;
+} bt_map_callback_data_t;
- /* TODO: MAP bt_session_info_t, see bt-service-opp-client.c */
+static GSList *transfer_list = NULL;
- g_free(info->address);
- g_free(info);
-}
+bt_session_info_t *session_info;
-static void __bt_free_session_data(gpointer data)
+static void __bt_free_session_info(bt_session_info_t *info)
{
- bt_session_data_t *info = data;
-
ret_if(info == NULL);
-
- _bt_delete_request_id(info->request_id);
-
- /* TODO: MAP bt_session_data_t, see bt-service-opp-client.c */
-
g_free(info->address);
g_free(info);
}
-static void __bt_session_release_cb(GDBusProxy *proxy,
- GAsyncResult *res, gpointer user_data)
-{
- BT_DBG("+");
- ret_if(session_info == NULL);
-
- GError *error = NULL;
- int result = BLUETOOTH_ERROR_NONE;
- GVariant *param = NULL;
- g_dbus_proxy_call_finish(proxy, res, &error);
- if (proxy)
- g_object_unref(proxy);
-
- if (error) {
- BT_ERR("%s", error->message);
- g_error_free(error);
-
- result = BLUETOOTH_ERROR_INTERNAL;
- } else {
- BT_DBG("Session Removed");
- }
-
- session_info->result = result;
- param = g_variant_new("(isi)", session_info->result,
- session_info->address,
- session_info->request_id);
- /* Send the event in only error none case */
- _bt_send_event(BT_OPP_CLIENT_EVENT,
- BLUETOOTH_EVENT_OPC_DISCONNECTED,
- param);
-
- __bt_free_session_info(session_info);
- session_info = NULL;
-
- _bt_map_client_event_deinit();
-
- /* Operate remain works */
- /* TODO: MAP */
-
- return;
-fail:
-
- BT_DBG("-");
-
- return;
-}
-
-static int _bt_remove_session()
-{
- GDBusConnection *g_conn;
- GDBusProxy *session_proxy;
- GError *err = NULL;
-
- g_conn = _bt_gdbus_get_session_gconn();
- retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
- retv_if(session_info->session_path == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
-
- session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
- NULL, BT_OBEXD_DBUS_NAME,
- BT_OBEX_CLIENT_PATH,
- BT_OBEX_CLIENT_INTERFACE,
- NULL, &err);
-
- retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- g_dbus_proxy_call(session_proxy, "RemoveSession",
- g_variant_new("(o)", session_info->session_path),
- G_DBUS_CALL_FLAGS_NONE,
- DBUS_TIMEOUT, NULL,
- (GAsyncReadyCallback)__bt_session_release_cb,
- NULL);
-
- return BLUETOOTH_ERROR_NONE;
-}
-
void _bt_map_disconnected(const char *session_path)
{
BT_DBG("+");
BT_DBG("-");
}
-static void __bt_create_session_cb(GDBusProxy *proxy,
- GAsyncResult *res, gpointer user_data)
-{
- BT_DBG("+");
-
- GError *error = NULL;
- GVariant *value;
- int result = BLUETOOTH_ERROR_NONE;
- char *session_path = NULL;
- GVariant *param = NULL;
-
- value = g_dbus_proxy_call_finish(proxy, res, &error);
- if (value) {
- g_variant_get(value, "(o)", &session_path);
- g_variant_unref(value);
- }
- if (error) {
-
- BT_ERR("%s", error->message);
- g_clear_error(&error);
-
- result = BLUETOOTH_ERROR_INTERNAL;
- } else {
- BT_DBG("Session created");
- if (session_info != NULL)
- session_info->session_path = g_strdup(session_path);
- }
- g_free(session_path);
- g_object_unref(proxy);
- ret_if(session_info == NULL);
-
- session_info->result = result;
- param = g_variant_new("(isi)", result,
- session_info->address,
- session_info->request_id);
- /* Send the event in only error none case */
- _bt_send_event(BT_MAP_CLIENT_EVENT,
- BLUETOOTH_EVENT_MAP_CONNECTED,
- param);
-
- if (result != BLUETOOTH_ERROR_NONE) {
- BT_ERR("Calling __bt_session_release");
- gboolean ret = __bt_session_release();
-
- __bt_free_session_info(session_info);
- session_info = NULL;
-
- if (ret == FALSE) {
- BT_DBG("ReleaseSession Not called");
- /* Operate remain works */
-
- /* TODO: MAP */
-
- }
- } else {
-
- /* TODO: MAP */
-
- }
- BT_DBG("-");
-
-}
-
-static int __bt_opp_client_start_XXXXXXXXXX(int request_id, char *address
- /* parameters................... */)
-{
- /* TODO: MAP */
-}
-
int _bt_create_session_sync(const 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);
}
retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- GVariantBuilder* builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+ 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);
+ 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);
+
+ g_object_unref(session_proxy);
+
if (err != NULL) {
BT_ERR("Could not create session: %s\n", err->message);
g_error_free(err);
GVariant *param = g_variant_new("(o)", session_id);
- GVariant *value = g_dbus_proxy_call_sync(session_proxy, "RemoveSession", param,
+ g_dbus_proxy_call_sync(session_proxy, "RemoveSession", param,
G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+
+ g_object_unref(session_proxy);
+
if (err != NULL) {
BT_ERR("Could not remove session: %s\n", err->message);
g_error_free(err);
GVariant *ret = NULL;
g_conn = _bt_gdbus_get_session_gconn();
- ret_if(g_conn == NULL);
-
- GVariant *param = g_variant_new("(o)", session_id);
+ retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
message_proxy = g_dbus_proxy_new_sync(g_conn,
G_DBUS_PROXY_FLAGS_NONE, NULL,
return BLUETOOTH_ERROR_NONE;
}
-int _bt_map_client_list_folders(int request_id, GDBusMethodInvocation *context,
- const char* session_id, int offset, int maxcount)
+static void __bt_list_folders_cb(GDBusProxy *proxy,
+ GAsyncResult *res, gpointer user_data)
+{
+ BT_DBG("+");
+
+ GError *error = NULL;
+ GVariant *value, *in_param, *param;
+
+ int result = BLUETOOTH_ERROR_NONE;
+ int request_id;
+
+ 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;
+ }
+
+ param = g_variant_new("(iiv)", result, request_id, value);
+ BT_DBG("RequestID[%d]", request_id);
+ result = _bt_send_event(BT_MAP_CLIENT_EVENT,
+ BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE, param);
+
+ g_variant_unref(value);
+ g_variant_unref(in_param);
+
+ BT_DBG("-");
+}
+
+int _bt_map_client_list_folders(
+ int request_id,
+ GDBusMethodInvocation *context,
+ const char* session_id,
+ const char* filter_serialized)
{
BT_DBG("Entered _bt_map_list_folders with session id: \"%s\"", session_id);
- BT_DBG("Entered offset: %d maxcount: %d", offset, maxcount);
GDBusConnection *g_conn;
GDBusProxy *message_access_proxy;
GError *error = NULL;
} else {
BT_DBG("message proxy set");
- GVariantBuilder* b = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+ GVariant *filter_variant = g_variant_parse(NULL, filter_serialized, NULL, NULL, NULL);
- if (offset >= 0) {
- g_variant_builder_add(b, "{sv}", "Offset", g_variant_new_uint16(offset));
- }
- if (maxcount >= 0) {
- g_variant_builder_add(b, "{sv}", "MaxCount", g_variant_new_uint16(maxcount));
- }
- GVariant *args = g_variant_builder_end(b);
- GVariant *params = g_variant_new("(@a{sv})", args);
- g_variant_builder_unref (b);
-
- int* request_id_p = malloc(sizeof(*request_id_p));
- *request_id_p = request_id;
-
- GVariant *folder_list_var = g_dbus_proxy_call_sync(message_access_proxy,
- "ListFolders", params, G_DBUS_CALL_FLAGS_NONE, -1,
- NULL, &error);
- if (error != NULL) {
- BT_ERR("Could not ListFolders: %s\n", error->message);
- // TODO return correct error
- result = BLUETOOTH_ERROR_INTERNAL;
- } else {
- if (!folder_list_var) {
- BT_ERR("returned ListFolders is null\n");
- result = BLUETOOTH_ERROR_INTERNAL;
- } else {
- BT_DBG("ListFolders succeed\n");
-
- GVariant *param = g_variant_new("(iiv)", result, request_id, folder_list_var);
- BT_DBG("RequestID[%d]", request_id);
- result = _bt_send_event(BT_MAP_CLIENT_EVENT,
- BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE, param);
- }
- }
+ GVariant *params = g_variant_new("(@a{sv})", filter_variant);
+ GVariant *param = g_variant_new("(i)", request_id);
+
+ g_dbus_proxy_call(message_access_proxy,
+ "ListFolders", params,
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL,
+ (GAsyncReadyCallback)__bt_list_folders_cb,
+ (void*)param);
}
}
return result;
}
-int _bt_map_client_list_filter_fields(const char* session_id)
+static void __bt_list_filter_fields_cb(GDBusProxy *proxy,
+ GAsyncResult *res, gpointer user_data)
+{
+ BT_DBG("+");
+
+ GError *error = NULL;
+ GVariant *value, *in_param, *param;
+
+ int result = BLUETOOTH_ERROR_NONE;
+ int request_id;
+
+ 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;
+ }
+
+ param = g_variant_new("(ivi)", result, value, request_id);
+
+ _bt_send_event(BT_MAP_CLIENT_EVENT, BLUETOOTH_EVENT_MAP_LIST_FILTER_FIELD_COMPLETE,
+ param);
+
+ g_variant_unref(value);
+ g_variant_unref(in_param);
+
+ BT_DBG("-");
+}
+
+int _bt_map_client_list_filter_fields(int request_id, GDBusMethodInvocation *context, const char* session_id)
{
BT_DBG("+");
- /* TODO: MAP */
+ GError *err = NULL;
+ GDBusConnection *g_conn;
+ GDBusProxy *message_proxy;
+ int result = BLUETOOTH_ERROR_NONE;
+
+ retv_if(session_id == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+ g_conn = _bt_gdbus_get_session_gconn();
+ retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ GVariant *out_param = 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_param));
+
+
+ message_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, &err);
+
+ retv_if(message_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ GVariant *param = g_variant_new("(i)", request_id);
+
+ g_dbus_proxy_call(message_proxy,
+ "ListFilterFields", g_variant_new("()"),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL,
+ (GAsyncReadyCallback)__bt_list_filter_fields_cb,
+ (void*)param);
+
+ g_object_unref(message_proxy);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
+static void __bt_list_messages_cb(
+ GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
+{
+ BT_DBG("+");
+
+ GError *error = NULL;
+ GVariant *value, *in_param, *param;
+
+ int result = BLUETOOTH_ERROR_NONE;
+ int request_id;
+
+ 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;
+ }
+
+ param = g_variant_new("(iiv)", result, request_id, value);
+ BT_DBG("RequestID[%d]", request_id);
+ result = _bt_send_event(BT_MAP_CLIENT_EVENT,
+ BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE, param);
+
+ g_variant_unref(value);
+ g_variant_unref(in_param);
+
+ BT_DBG("-");
+}
+
int _bt_map_client_list_messages(
+ int request_id,
+ GDBusMethodInvocation *context,
const char* session_id,
const char* folder,
- GVariant *filter)
+ const char* filter_serialized)
{
- BT_DBG("+");
+ BT_DBG("Entered _bt_map_client_list_messages with session id: \"%s\"", session_id);
+ 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);
+
+ 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, "org.bluez.obex.MessageAccess1",
+ 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 *filter_variant = g_variant_parse(NULL, filter_serialized, NULL, NULL, NULL);
+
+ GVariant *params = g_variant_new("(s@a{sv})", folder, filter_variant);
+ GVariant *param = g_variant_new("(i)", request_id);
- /* TODO: MAP */
+ g_dbus_proxy_call(message_access_proxy,
+ "ListMessages", params,
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ NULL,
+ (GAsyncReadyCallback)__bt_list_messages_cb,
+ (void*)param);
+ }
+ }
+ g_object_unref(message_access_proxy);
BT_DBG("-");
- return BLUETOOTH_ERROR_NONE;
+ return result;
}
int _bt_map_client_update_inbox(const char* session_id)
GError *err = NULL;
GDBusConnection *g_conn;
GDBusProxy *message_proxy;
- GVariantBuilder *builder;
GVariant *ret = NULL;
g_conn = _bt_gdbus_get_session_gconn();
- ret_if(g_conn == NULL);
-
- GVariant *param = g_variant_new("(o)", session_id);
+ retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
message_proxy = g_dbus_proxy_new_sync(g_conn,
G_DBUS_PROXY_FLAGS_NONE, NULL,
return BLUETOOTH_ERROR_NONE;
}
+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_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;
+ 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)", 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
+ transfer_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_push_message_cb(GDBusProxy *proxy,
+ GAsyncResult *res, gpointer user_data)
+{
+ BT_DBG("+");
+
+ GError *error = NULL;
+ GVariant *value, *in_param;
+
+ char *transfer_object_path = NULL;
+ GVariantIter *iter = NULL;
+
+ int request_id;
+
+ 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);
+ }
+
+ if (value)
+ g_variant_get(value, "(oa{sv})", &transfer_object_path, &iter);
+
+ 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,
- GVariant *args)
+ const char* args_serialized)
{
- BT_DBG("+");
+ 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);
- /* TODO: MAP */
+ 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 BLUETOOTH_ERROR_NONE;
+ return result;
+}
+
+static void __bt_get_message_cb(GDBusProxy *proxy,
+ GAsyncResult *res, gpointer user_data)
+{
+ BT_DBG("+");
+
+ GError *error = NULL;
+ GVariant *value, *in_param;
+
+ char *transfer_object_path = NULL;
+ GVariantIter *iter = NULL;
+
+ int request_id;
+
+ 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);
+ }
+
+ if (value)
+ g_variant_get(value, "(oa{sv})", &transfer_object_path, &iter);
+
+ 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_GET_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_get_message(
- const char* session_id,
- const char* message_object_name,
+ int request_id,
+ GDBusMethodInvocation *context,
+ const char* message_object,
const char* target_file,
bool attachment)
{
- BT_DBG("+");
+ BT_DBG("Entered _bt_map_client_get_message");
+
+ GDBusConnection *g_conn;
+ GDBusProxy *message_proxy;
+ GError *error = NULL;
+ int result = BLUETOOTH_ERROR_NONE;
+
+ retv_if(message_object == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
- /* TODO: MAP */
+ // 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, "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;
}