static DBusMessage *try_acquire(DBusConnection *conn, DBusMessage *msg, void *data) { struct media_transport *transport = data; struct media_owner *owner; struct media_request *req; guint id; if (transport->owner != NULL) return btd_error_not_authorized(msg); if (transport->state >= TRANSPORT_STATE_REQUESTING) return btd_error_not_authorized(msg); if (transport->state != TRANSPORT_STATE_PENDING) return btd_error_not_available(msg); owner = media_owner_create(msg); id = transport->resume(transport, owner); if (id == 0) { media_owner_free(owner); return btd_error_not_authorized(msg); } req = media_request_create(msg, id); media_owner_add(owner, req); media_transport_set_owner(transport, owner); return NULL; }
static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg, void *data) { struct monitor *monitor = data; const char *property; DBusMessageIter iter; DBusMessageIter sub; const char *level; if (!dbus_message_iter_init(msg, &iter)) return btd_error_invalid_args(msg); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return btd_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &property); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) return btd_error_invalid_args(msg); dbus_message_iter_recurse(&iter, &sub); if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) return btd_error_invalid_args(msg); dbus_message_iter_get_basic(&sub, &level); if (g_str_equal("ImmediateAlertLevel", property)) { if (monitor->enabled.findme == FALSE && monitor->enabled.pathloss == FALSE) return btd_error_not_available(msg); return set_immediate_alert(conn, msg, level, data); } else if (g_str_equal("LinkLossAlertLevel", property)) { if (monitor->enabled.linkloss == FALSE) return btd_error_not_available(msg); return set_link_loss_alert(conn, msg, level, data); } return btd_error_invalid_args(msg); }
static DBusMessage *remove_service_record(DBusConnection *conn, DBusMessage *msg, void *data) { struct service_adapter *serv_adapter = data; dbus_uint32_t handle; const char *sender; if (dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID) == FALSE) return NULL; sender = dbus_message_get_sender(msg); if (remove_record(conn, sender, serv_adapter, handle) < 0) return btd_error_not_available(msg); return dbus_message_new_method_return(msg); }
static DBusMessage *time_updated(DBusConnection *conn, DBusMessage *msg, void *data) { time_t next_dst_time = 0; uint8_t next_dst_offset; struct current_time curtime; uint8_t reason; uint8_t offset; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BYTE, &reason, DBUS_TYPE_BYTE, &offset, DBUS_TYPE_UINT32, &next_dst_time, DBUS_TYPE_BYTE, &next_dst_offset, DBUS_TYPE_INVALID)) { error("Invalid arguments"); return NULL; } if (reason & ~0xf) { error("Invalid adjust reason"); return btd_error_invalid_args(msg); } adjust_reason = reason; dst_offset.dst_offset = offset; encode_date_time(next_dst_time, &next_dst.date_time, NULL); next_dst.dst_offset.dst_offset = next_dst_offset; DBG("adjust_reason = %d, dst_offset = %d, " "next_dst_time = %u, next_dst_offset = %d", adjust_reason, dst_offset.dst_offset, (uint32_t)next_dst_time, next_dst_offset); if (get_current_time(&curtime) < 0) { error("Could not get current time"); return btd_error_not_available(msg); } if (reason) g_slist_foreach(time_adapters, notify_curr_time, &curtime); return dbus_message_new_method_return(msg); }
static DBusMessage *update_record(DBusMessage *msg, struct service_adapter *serv_adapter, dbus_uint32_t handle, sdp_record_t *sdp_record) { int err; if (remove_record_from_server(handle) < 0) { sdp_record_free(sdp_record); return btd_error_not_available(msg); } sdp_record->handle = handle; err = add_record_to_server(get_address(serv_adapter), sdp_record); if (err < 0) { sdp_record_free(sdp_record); error("Failed to update the service record"); return btd_error_failed(msg, strerror(-err)); } return dbus_message_new_method_return(msg); }
static DBusMessage *hrcp_reset(DBusConnection *conn, DBusMessage *msg, void *data) { struct heartrate *hr = data; uint8_t value; char *vmsg; if (!hr->hrcp_val_handle) return btd_error_not_supported(msg); if (!hr->attrib) return btd_error_not_available(msg); value = 0x01; vmsg = g_strdup("Reset Control Point"); gatt_write_char(hr->attrib, hr->hrcp_val_handle, &value, sizeof(value), char_write_cb, vmsg); DBG("Energy Expended Value has been reset"); return dbus_message_new_method_return(msg); }