- I expected once Haiku sets a connection with a remote device, such connection

was to expire in a couple of minutes, but not, seems to stay forever.
- Implement a Disconnect button in prefrences&kit



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36450 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Oliver Ruiz Dorantes
2010-04-24 16:01:08 +00:00
parent 36cb67b24e
commit ddbc9a0f2a
6 changed files with 91 additions and 11 deletions
+4 -1
View File
@@ -6,6 +6,7 @@
#define _REMOTE_DEVICE_H
#include <bluetooth/bluetooth.h>
#include <bluetooth/bluetooth_error.h>
#include <bluetooth/BluetoothDevice.h>
#include <String.h>
@@ -36,7 +37,8 @@ public:
bool Equals(RemoteDevice* obj);
/*static RemoteDevice* GetRemoteDevice(Connection conn); Throwing */
bool Authenticate(); /* Throwing */
bool Authenticate(); /* Throwing */
status_t Disconnect(int8 reason = BT_REMOTE_USER_ENDED_CONNECTION);
/* bool Authorize(Connection conn); Throwing */
/*bool Encrypt(Connection conn, bool on); Throwing */
bool IsAuthenticated(); /* Throwing */
@@ -61,6 +63,7 @@ private:
LocalDevice* fDiscovererLocalDevice;
BMessenger* fMessenger;
uint16 fHandle;
uint8 fPageRepetitionMode;
uint8 fScanPeriodMode;
uint8 fScanMode;
+3 -3
View File
@@ -30,9 +30,9 @@
#define BT_HOST_TIMEOUT 0x10
#define BT_UNSUPPORTED_FEATURE 0x11
#define BT_INVALID_PARAMETERS 0x12
#define BT_OE_USER_ENDED_CONNECTION 0x13
#define BT_OE_LOW_RESOURCES 0x14
#define BT_OE_POWER_OFF 0x15
#define BT_REMOTE_USER_ENDED_CONNECTION 0x13
#define BT_REMOTE_LOW_RESOURCES 0x14
#define BT_REMOTE_POWER_OFF 0x15
#define BT_CONNECTION_TERMINATED 0x16
#define BT_REPEATED_ATTEMPTS 0x17
#define BT_PAIRING_NOT_ALLOWED 0x18
+53 -4
View File
@@ -24,6 +24,8 @@
namespace Bluetooth {
// TODO: Check headers for valid/reserved ranges
static const uint16 invalidConnectionHandle = 0xF000;
bool
RemoteDevice::IsTrustedDevice(void)
@@ -184,13 +186,58 @@ RemoteDevice::Authenticate()
if (fMessenger->SendMessage(&request, &reply) == B_OK)
reply.FindInt8("status", &btStatus);
if (btStatus == BT_OK)
if (btStatus == BT_OK) {
reply.FindInt16("handle", (int16*)&fHandle);
return true;
else
} else
return false;
}
status_t
RemoteDevice::Disconnect(int8 reason)
{
if (fHandle != invalidConnectionHandle) {
int8 btStatus = BT_ERROR;
if (fMessenger == NULL || fDiscovererLocalDevice == NULL)
return false;
BluetoothCommand<typed_command(struct hci_disconnect)>
disconnect(OGF_LINK_CONTROL, OCF_DISCONNECT);
disconnect->reason = reason;
disconnect->handle = fHandle;
BMessage request(BT_MSG_HANDLE_SIMPLE_REQUEST);
BMessage reply;
request.AddInt32("hci_id", fDiscovererLocalDevice->ID());
request.AddData("raw command", B_ANY_TYPE,
disconnect.Data(), disconnect.Size());
request.AddInt16("eventExpected", HCI_EVENT_CMD_STATUS);
request.AddInt16("opcodeExpected", PACK_OPCODE(OGF_LINK_CONTROL,
OCF_DISCONNECT));
request.AddInt16("eventExpected", HCI_EVENT_DISCONNECTION_COMPLETE);
if (fMessenger->SendMessage(&request, &reply) == B_OK)
reply.FindInt8("status", &btStatus);
if (btStatus == BT_OK)
fHandle = invalidConnectionHandle;
return btStatus;
}
return B_ERROR;
}
// bool Authorize(Connection conn);
// bool Encrypt(Connection conn, bool on);
@@ -231,7 +278,8 @@ RemoteDevice::SetLocalDeviceOwner(LocalDevice* ld)
RemoteDevice::RemoteDevice(const bdaddr_t address, uint8 record[3])
:
BluetoothDevice(),
fDiscovererLocalDevice(NULL)
fDiscovererLocalDevice(NULL),
fHandle(invalidConnectionHandle)
{
fBdaddr = address;
fDeviceClass.SetRecord(record);
@@ -242,7 +290,8 @@ RemoteDevice::RemoteDevice(const bdaddr_t address, uint8 record[3])
RemoteDevice::RemoteDevice(const BString& address)
:
BluetoothDevice(),
fDiscovererLocalDevice(NULL)
fDiscovererLocalDevice(NULL),
fHandle(invalidConnectionHandle)
{
fBdaddr = bdaddrUtils::FromString((const char*)address.String());
fMessenger = _RetrieveBluetoothMessenger();
@@ -31,6 +31,7 @@
static const uint32 kMsgAddDevices = 'ddDv';
static const uint32 kMsgRemoveDevice = 'rmDv';
static const uint32 kMsgPairDevice = 'trDv';
static const uint32 kMsgDisconnectDevice = 'dsDv';
static const uint32 kMsgBlockDevice = 'blDv';
static const uint32 kMsgRefreshDevices = 'rfDv';
@@ -50,6 +51,8 @@ RemoteDevicesView::RemoteDevicesView(const char* name, uint32 flags)
pairButton = new BButton("pair", TR("Pair" B_UTF8_ELLIPSIS),
new BMessage(kMsgPairDevice));
disconnectButton = new BButton("disconnect", TR("Disconnect"),
new BMessage(kMsgDisconnectDevice));
blockButton = new BButton("block", TR("As blocked"),
new BMessage(kMsgBlockDevice));
@@ -77,6 +80,7 @@ RemoteDevicesView::RemoteDevicesView(const char* name, uint32 flags)
.Add(availButton)
.AddGlue()
.Add(pairButton)
.Add(disconnectButton)
.Add(blockButton)
.AddGlue()
.SetInsets(0, 15, 0, 15)
@@ -101,6 +105,7 @@ RemoteDevicesView::AttachedToWindow(void)
addButton->SetTarget(this);
removeButton->SetTarget(this);
pairButton->SetTarget(this);
disconnectButton->SetTarget(this);
blockButton->SetTarget(this);
availButton->SetTarget(this);
@@ -145,6 +150,17 @@ RemoteDevicesView::MessageReceived(BMessage* message)
break;
}
case kMsgDisconnectDevice:
{
DeviceListItem* device = static_cast<DeviceListItem*>(fDeviceList
->ItemAt(fDeviceList->CurrentSelection(0)));
RemoteDevice* remote = dynamic_cast<RemoteDevice*>(device->Device());
if (remote != NULL)
remote->Disconnect();
break;
}
default:
BView::MessageReceived(message);
@@ -42,6 +42,7 @@ protected:
BButton* addButton;
BButton* removeButton;
BButton* pairButton;
BButton* disconnectButton;
BButton* blockButton;
BButton* availButton;
BListView* fDeviceList;
+14 -3
View File
@@ -163,8 +163,8 @@ LocalDeviceImpl::HandleExpectedRequest(struct hci_event_header* event,
case HCI_EVENT_DISCONNECTION_COMPLETE:
// should belong to a request? can be sporadic or initiated by us¿?...
DisconnectionComplete(
JumpEventHeader<struct hci_ev_disconnection_complete_reply>(event),
request);
JumpEventHeader<struct hci_ev_disconnection_complete_reply>
(event), request);
break;
case HCI_EVENT_AUTH_COMPLETE:
@@ -864,6 +864,7 @@ LocalDeviceImpl::ConnectionComplete(struct hci_ev_conn_complete* event,
if (event->status == BT_OK) {
uint8 cod[3] = {0, 0, 0};
// TODO: Review, this rDevice is leaked
ConnectionIncoming* iConnection = new ConnectionIncoming(
new RemoteDevice(event->bdaddr, cod));
iConnection->Show();
@@ -883,6 +884,9 @@ LocalDeviceImpl::ConnectionComplete(struct hci_ev_conn_complete* event,
BMessage reply;
reply.AddInt8("status", event->status);
if (event->status == BT_OK)
reply.AddInt16("handle", event->handle);
request->SendReply(&reply);
reply.PrintToStream();
@@ -901,8 +905,15 @@ LocalDeviceImpl::DisconnectionComplete(
"%s: Handle=%#x, reason=%s status=%x\n", __FUNCTION__, event->handle,
BluetoothError(event->reason), event->status);
if (request != NULL)
if (request != NULL) {
BMessage reply;
reply.AddInt8("status", event->status);
request->SendReply(&reply);
reply.PrintToStream();
ClearWantedEvent(request);
}
}