static DBusMessage *set_property(DBusConnection *conn,
DBusMessage *msg, void *data)
{
+ struct near_adapter *adapter = data;
+ DBusMessageIter iter, value;
+ const char *name;
+ int type, err;
+
DBG("conn %p", conn);
+ if (dbus_message_iter_init(msg, &iter) == FALSE)
+ return __near_error_invalid_arguments(msg);
+
+ dbus_message_iter_get_basic(&iter, &name);
+ dbus_message_iter_next(&iter);
+ dbus_message_iter_recurse(&iter, &value);
+
+ type = dbus_message_iter_get_arg_type(&value);
+
+ if (g_str_equal(name, "Powered") == TRUE) {
+ near_bool_t powered;
+
+ if (type != DBUS_TYPE_BOOLEAN)
+ return __near_error_invalid_arguments(msg);
+
+ dbus_message_iter_get_basic(&value, &powered);
+
+ err = __near_netlink_adapter_enable(adapter->idx, powered);
+ if (err < 0)
+ return __near_error_failed(msg, -err);
+
+ adapter->powered = powered;
+ } else
+ return __near_error_invalid_property(msg);
+
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
int __near_netlink_dep_link_up(uint32_t idx, uint32_t target_idx,
uint8_t comm_mode, uint8_t rf_mode);
int __near_netlink_dep_link_down(uint32_t idx);
+int __near_netlink_adapter_enable(int idx, near_bool_t enable);
int __near_netlink_activate_target(uint32_t adapter_idx,
uint32_t target_idx,
uint32_t protocol);
return err;
}
+int __near_netlink_adapter_enable(int idx, near_bool_t enable)
+{
+ struct nl_msg *msg;
+ void *hdr;
+ int family, err = 0;
+ uint8_t cmd;
+
+ DBG("");
+
+ msg = nlmsg_alloc();
+ if (msg == NULL)
+ return -ENOMEM;
+
+ family = genl_family_get_id(nfc_state->nlnfc);
+
+ if (enable == TRUE)
+ cmd = NFC_CMD_DEV_UP;
+ else
+ cmd = NFC_CMD_DEV_DOWN;
+
+ hdr = genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0,
+ NLM_F_REQUEST, cmd, NFC_GENL_VERSION);
+ if (hdr == NULL) {
+ err = -EINVAL;
+ goto nla_put_failure;
+ }
+
+ NLA_PUT_U32(msg, NFC_ATTR_DEVICE_INDEX, idx);
+
+ err = nl_send_msg(nfc_state->nl_sock, msg, NULL, NULL);
+
+nla_put_failure:
+ nlmsg_free(msg);
+
+ return err;
+}
+
+
static int no_seq_check(struct nl_msg *n, void *arg)
{
DBG("");