+int _bt_async_send_request_with_unix_fd_list(int service_type, int service_function,
+ GArray *in_param1, GArray *in_param2,
+ GArray *in_param3, GArray *in_param4,
+ void *callback, void *user_data,
+ GUnixFDList *fd_list, GAsyncReadyCallback __async_req_cb)
+{
+ GArray* in_param5 = NULL;
+ bt_req_info_t *cb_data;
+
+ GDBusProxy *proxy;
+ int timeout;
+ GVariant *param1;
+ GVariant *param2;
+ GVariant *param3;
+ GVariant *param4;
+ GVariant *param5;
+
+ BT_DBG("service_function : %d", service_function);
+
+ cb_data = g_new0(bt_req_info_t, 1);
+ cb_data->service_function = service_function;
+ cb_data->cb = callback;
+ cb_data->user_data = user_data;
+
+ switch (service_type) {
+ case BT_BLUEZ_SERVICE:
+ case BT_OBEX_SERVICE:
+ proxy = __bt_gdbus_get_service_proxy();
+ if (!proxy) {
+ g_free(cb_data);
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ /* Do not timeout the request in certain cases. Sometime the
+ * request may take undeterministic time to reponse.
+ * (for ex: pairing retry) */
+ if (service_function == BT_BOND_DEVICE ||
+ service_function == BT_BOND_DEVICE_BY_TYPE)
+ timeout = INT_MAX;
+ else
+ timeout = BT_DBUS_TIMEOUT_MAX;
+
+ in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar));
+
+ param1 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param1->data, in_param1->len,
+ TRUE, NULL, NULL);
+ param2 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param2->data, in_param2->len,
+ TRUE, NULL, NULL);
+ param3 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param3->data, in_param3->len,
+ TRUE, NULL, NULL);
+ param4 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param4->data, in_param4->len,
+ TRUE, NULL, NULL);
+ param5 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param5->data, in_param5->len,
+ TRUE, NULL, NULL);
+
+ g_dbus_proxy_call_with_unix_fd_list(proxy, "service_request",
+ g_variant_new("(iii@ay@ay@ay@ay@ay)",
+ service_type, service_function,
+ BT_ASYNC_REQ, param1, param2,
+ param3, param4, param5),
+ G_DBUS_CALL_FLAGS_NONE,
+ timeout, fd_list, NULL,
+ __async_req_cb, (gpointer)cb_data);
+ sending_requests = g_slist_append(sending_requests, cb_data);
+
+ g_array_free(in_param5, TRUE);
+ break;
+ default:
+ g_free(cb_data);
+ break;
+ }
+
+ return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_sync_send_request_with_unix_fd_list(
+ int service_type, int service_function,
+ GArray *in_param1, GArray *in_param2,
+ GArray *in_param3, GArray *in_param4,
+ GUnixFDList *fd_list, GArray **out_param1,
+ GUnixFDList **out_fd_list)
+{
+ int result = BLUETOOTH_ERROR_NONE;
+ GError *error = NULL;
+ GArray *in_param5 = NULL;
+
+ GDBusProxy *proxy;
+ GVariant *ret;
+ GVariant *param1;
+ GVariant *param2;
+ GVariant *param3;
+ GVariant *param4;
+ GVariant *param5;
+
+ switch (service_type) {
+ case BT_BLUEZ_SERVICE:
+ case BT_OBEX_SERVICE:
+ case BT_AGENT_SERVICE:
+ case BT_CHECK_PRIVILEGE:
+ proxy = __bt_gdbus_get_service_proxy();
+ if (!proxy)
+ return BLUETOOTH_ERROR_INTERNAL;
+
+ in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar));
+
+ param1 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param1->data, in_param1->len,
+ TRUE, NULL, NULL);
+ param2 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param2->data, in_param2->len,
+ TRUE, NULL, NULL);
+ param3 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param3->data, in_param3->len,
+ TRUE, NULL, NULL);
+ param4 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param4->data, in_param4->len,
+ TRUE, NULL, NULL);
+ param5 = g_variant_new_from_data((const GVariantType *)"ay",
+ in_param5->data, in_param5->len,
+ TRUE, NULL, NULL);
+
+ ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, "service_request",
+ g_variant_new("(iii@ay@ay@ay@ay@ay)",
+ service_type, service_function,
+ BT_SYNC_REQ, param1, param2,
+ param3, param4, param5),
+ G_DBUS_CALL_FLAGS_NONE, -1,
+ fd_list, out_fd_list, NULL, &error);
+ g_array_free(in_param5, TRUE);
+
+ if (ret == NULL) {
+ /* dBUS-RPC is failed */
+ BT_ERR("dBUS-RPC is failed");
+
+ if (error != NULL) {
+ /* dBUS gives error cause */
+ BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
+ error->code, error->message);
+
+ g_clear_error(&error);
+ } else {
+ /* dBUS does not give error cause dBUS-RPC is failed */
+ BT_ERR("error returned was NULL");
+ }
+
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ param1 = NULL;
+ g_variant_get(ret, "(iv)", &result, ¶m1);
+
+ if (param1) {
+ *out_param1 = g_array_new(TRUE, TRUE, sizeof(gchar));
+ __bt_fill_garray_from_variant(param1, *out_param1);
+ g_variant_unref(param1);
+ }
+
+ g_variant_unref(ret);
+ break;
+ default:
+ BT_ERR("Unknown service type");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ return result;
+}