diff --git a/headers/os/bluetooth/HCI/btHCI_command.h b/headers/os/bluetooth/HCI/btHCI_command.h index 0fa938ec6f..e0f5619ef4 100644 --- a/headers/os/bluetooth/HCI/btHCI_command.h +++ b/headers/os/bluetooth/HCI/btHCI_command.h @@ -96,6 +96,10 @@ struct hci_command_header { #define OCF_WRITE_LOCAL_NAME 0x0013 + struct hci_write_local_name { + char local_name[HCI_DEVICE_NAME_SIZE]; + } __attribute__ ((packed)); + #define OCF_READ_LOCAL_NAME 0x0014 struct hci_rp_read_local_name { uint8 status; diff --git a/headers/os/bluetooth/LocalDevice.h b/headers/os/bluetooth/LocalDevice.h index 99752d06be..48c0e7b231 100644 --- a/headers/os/bluetooth/LocalDevice.h +++ b/headers/os/bluetooth/LocalDevice.h @@ -33,6 +33,7 @@ public: DiscoveryAgent* GetDiscoveryAgent(); BString GetFriendlyName(); + status_t SetFriendlyName(BString& name); DeviceClass GetDeviceClass(); status_t SetDeviceClass(DeviceClass deviceClass); diff --git a/src/kits/bluetooth/LocalDevice.cpp b/src/kits/bluetooth/LocalDevice.cpp index af0fd432e8..7d76a92ead 100644 --- a/src/kits/bluetooth/LocalDevice.cpp +++ b/src/kits/bluetooth/LocalDevice.cpp @@ -273,6 +273,36 @@ LocalDevice::GetFriendlyName() } +status_t +LocalDevice::SetFriendlyName(BString& name) +{ + int8 btStatus = BT_ERROR; + + if (fMessenger == NULL) + return btStatus; + + BluetoothCommand + writeName(OGF_CONTROL_BASEBAND, OCF_WRITE_LOCAL_NAME); + + strcpy(writeName->local_name, name.String()); + + BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST); + BMessage reply; + + request.AddInt32("hci_id", fHid); + request.AddData("raw command", B_ANY_TYPE, + writeName.Data(), writeName.Size()); + request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE); + request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_CONTROL_BASEBAND, + OCF_WRITE_LOCAL_NAME)); + + if (fMessenger->SendMessage(&request, &reply) == B_OK) + reply.FindInt8("status", &btStatus); + + return btStatus; +} + + DeviceClass LocalDevice::GetDeviceClass() { @@ -521,6 +551,11 @@ LocalDevice::LocalDevice(hci_id hid) _ReadTimeouts(); _ReadLinkKeys(); + // Uncomment this if you want your device to have a nicer default name + // BString name("HaikuBluetooth"); + // SetFriendlyName(name); + + uint32 value; // HARDCODE -> move this to addons diff --git a/src/servers/bluetooth/LocalDeviceImpl.cpp b/src/servers/bluetooth/LocalDeviceImpl.cpp index 67f2c34129..d63948f719 100644 --- a/src/servers/bluetooth/LocalDeviceImpl.cpp +++ b/src/servers/bluetooth/LocalDeviceImpl.cpp @@ -649,6 +649,7 @@ LocalDeviceImpl::CommandComplete(struct hci_ev_cmd_complete* event, case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_PG_TIMEOUT): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_CA_TIMEOUT): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_AUTH_ENABLE): + case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_LOCAL_NAME): case PACK_OPCODE(OGF_VENDOR_CMD, OCF_WRITE_BCM2035_BDADDR): { reply.AddInt8("status", *(uint8*)(event + 1));