if (info == NULL)
continue;
+ BT_DBG("compare %d with %d", info->request_id, request_id);
if (info->request_id == request_id)
return TRUE;
}
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
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;
}
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
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;
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;
}
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);
}
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)
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);
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
#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)
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;
}
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 */
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
#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