bluetooth: adding a functioning cancel button to the Inquiry Panel

- This is a mandatory feature in HCI Implementation Conformance Statement (ICS).
- The inquiry cancel logic was implemented in Haiku, but wasn't linked to the inquiry panel.

Change-Id: Ic827b0a09979a078bed5b9f99a8541dc319ac449
Reviewed-on: https://review.haiku-os.org/c/haiku/+/11106
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
mohammedrattia
2026-06-17 17:47:53 +00:00
committed by waddlesplash
parent 31c245ae13
commit a309dd6890
6 changed files with 72 additions and 9 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ public:
virtual void servicesDiscovered(int transID, ServiceRecord[] servRecord); virtual void servicesDiscovered(int transID, ServiceRecord[] servRecord);
virtual void serviceSearchCompleted(int transID, int respCode); virtual void serviceSearchCompleted(int transID, int respCode);
*/ */
virtual void InquiryCompleted(int discType); virtual void InquiryResponse(int discType);
/* JSR82 non-defined methods */ /* JSR82 non-defined methods */
virtual void InquiryStarted(status_t status); virtual void InquiryStarted(status_t status);
+1 -1
View File
@@ -119,7 +119,7 @@ DiscoveryAgent::CancelInquiry(DiscoveryListener* listener)
cancelInquiryCommand = buildInquiryCancel(&size); cancelInquiryCommand = buildInquiryCancel(&size);
request.AddData("raw command", B_ANY_TYPE, cancelInquiryCommand, size); request.AddData("raw command", B_ANY_TYPE, cancelInquiryCommand, size);
request.AddInt16("eventExpected", HCI_EVENT_CMD_STATUS); request.AddInt16("eventExpected", HCI_EVENT_CMD_COMPLETE);
request.AddInt16("opcodeExpected", request.AddInt16("opcodeExpected",
PACK_OPCODE(OGF_LINK_CONTROL, OCF_INQUIRY_CANCEL)); PACK_OPCODE(OGF_LINK_CONTROL, OCF_INQUIRY_CANCEL));
+4 -4
View File
@@ -37,7 +37,7 @@ DiscoveryListener::InquiryStarted(status_t status)
void void
DiscoveryListener::InquiryCompleted(int discType) DiscoveryListener::InquiryResponse(int discType)
{ {
CALLED(); CALLED();
} }
@@ -156,15 +156,15 @@ DiscoveryListener::MessageReceived(BMessage* message)
break; break;
case BT_MSG_INQUIRY_COMPLETED: case BT_MSG_INQUIRY_COMPLETED:
InquiryCompleted(BT_INQUIRY_COMPLETED); InquiryResponse(BT_INQUIRY_COMPLETED);
break; break;
case BT_MSG_INQUIRY_TERMINATED: /* inquiry was cancelled */ case BT_MSG_INQUIRY_TERMINATED: /* inquiry was cancelled */
InquiryCompleted(BT_INQUIRY_TERMINATED); InquiryResponse(BT_INQUIRY_TERMINATED);
break; break;
case BT_MSG_INQUIRY_ERROR: case BT_MSG_INQUIRY_ERROR:
InquiryCompleted(BT_INQUIRY_ERROR); InquiryResponse(BT_INQUIRY_ERROR);
break; break;
default: default:
+45 -3
View File
@@ -40,6 +40,7 @@ extern uint8 GetInquiryTime();
static const uint32 kMsgStart = 'InSt'; static const uint32 kMsgStart = 'InSt';
static const uint32 kMsgFinish = 'InFn'; static const uint32 kMsgFinish = 'InFn';
static const uint32 kMsgCancel = 'InCl';
static const uint32 kMsgShowDebug = 'ShDG'; static const uint32 kMsgShowDebug = 'ShDG';
static const uint32 kMsgInquiry = 'iQbt'; static const uint32 kMsgInquiry = 'iQbt';
@@ -73,10 +74,24 @@ public:
void void
InquiryCompleted(int discType) InquiryResponse(int discType)
{ {
BMessage* message = new BMessage(kMsgFinish); BMessage* message;
fInquiryPanel->PostMessage(message); switch (discType)
{
case BT_INQUIRY_COMPLETED:
message = new BMessage(kMsgFinish);
fInquiryPanel->PostMessage(message);
break;
case BT_INQUIRY_TERMINATED:
message = new BMessage(kMsgCancel);
fInquiryPanel->PostMessage(message);
break;
case BT_INQUIRY_ERROR:
break;
}
} }
@@ -119,6 +134,10 @@ InquiryPanel::InquiryPanel(BRect frame, LocalDevice* lDevice)
fInquiryButton = new BButton("Inquiry", B_TRANSLATE("Inquiry"), fInquiryButton = new BButton("Inquiry", B_TRANSLATE("Inquiry"),
new BMessage(kMsgInquiry), B_WILL_DRAW); new BMessage(kMsgInquiry), B_WILL_DRAW);
fCancelButton = new BButton("cancel", B_TRANSLATE("Cancel"),
new BMessage(kMsgCancel), B_WILL_DRAW);
fCancelButton->SetEnabled(false);
fAddButton = new BButton("add", B_TRANSLATE("Add device to list"), fAddButton = new BButton("add", B_TRANSLATE("Add device to list"),
new BMessage(kMsgAddToRemoteList), B_WILL_DRAW); new BMessage(kMsgAddToRemoteList), B_WILL_DRAW);
fAddButton->SetEnabled(false); fAddButton->SetEnabled(false);
@@ -159,6 +178,7 @@ InquiryPanel::InquiryPanel(BRect frame, LocalDevice* lDevice)
.AddGroup(B_HORIZONTAL, 10) .AddGroup(B_HORIZONTAL, 10)
.Add(fAddButton) .Add(fAddButton)
.AddGlue() .AddGlue()
.Add(fCancelButton)
.Add(fInquiryButton) .Add(fInquiryButton)
.End() .End()
.End(); .End();
@@ -222,6 +242,7 @@ InquiryPanel::MessageReceived(BMessage* message)
fAddButton->SetEnabled(false); fAddButton->SetEnabled(false);
fInquiryButton->SetEnabled(false); fInquiryButton->SetEnabled(false);
fCancelButton->SetEnabled(true);
BMessageRunner::StartSending(fMessenger, fSecondsMessage, 1000000, timer); BMessageRunner::StartSending(fMessenger, fSecondsMessage, 1000000, timer);
@@ -236,6 +257,7 @@ InquiryPanel::MessageReceived(BMessage* message)
fScanning = false; fScanning = false;
fRetrieving = true; fRetrieving = true;
labelPlaced = false; labelPlaced = false;
fCancelButton->SetEnabled(false);
fScanProgress->SetTo(100); fScanProgress->SetTo(100);
fScanProgress->SetTrailingText(B_TRANSLATE("Retrieving names" fScanProgress->SetTrailingText(B_TRANSLATE("Retrieving names"
B_UTF8_ELLIPSIS)); B_UTF8_ELLIPSIS));
@@ -243,6 +265,21 @@ InquiryPanel::MessageReceived(BMessage* message)
break; break;
case kMsgCancel:
fDiscoveryAgent->CancelInquiry(fDiscoveryListener);
retrievalIndex = 0;
fScanning = false;
fRetrieving = true;
labelPlaced = false;
fCancelButton->SetEnabled(false);
fScanProgress->SetTo(100);
fScanProgress->SetTrailingText(B_TRANSLATE("Canceling Inquiry"
B_UTF8_ELLIPSIS));
BMessageRunner::StartSending(fMessenger, fRetrieveMessage, 1000000, 1);
break;
case kMsgSecond: case kMsgSecond:
if (fScanning && scanningTime < timer) { if (fScanning && scanningTime < timer) {
// TODO time formatting could use Locale Kit // TODO time formatting could use Locale Kit
@@ -328,6 +365,11 @@ InquiryPanel::UpdateListStatus(void)
bool bool
InquiryPanel::QuitRequested(void) InquiryPanel::QuitRequested(void)
{ {
if (fScanning)
fDiscoveryAgent->CancelInquiry(fDiscoveryListener);
if (fDiscoveryListener->Lock())
fDiscoveryListener->Quit();
return true; return true;
} }
+1
View File
@@ -33,6 +33,7 @@ private:
BStatusBar* fScanProgress; BStatusBar* fScanProgress;
BButton* fAddButton; BButton* fAddButton;
BButton* fInquiryButton; BButton* fInquiryButton;
BButton* fCancelButton;
BTextView* fMessage; BTextView* fMessage;
BListView* fRemoteList; BListView* fRemoteList;
BScrollView* fScrollView; BScrollView* fScrollView;
+20
View File
@@ -738,6 +738,26 @@ LocalDeviceImpl::CommandComplete(struct hci_ev_cmd_complete* event,
break; break;
} }
case PACK_OPCODE(OGF_LINK_CONTROL, OCF_INQUIRY_CANCEL):
{
reply.AddInt8("status", *(uint8*)(event + 1));
TRACE_BT("LocalDeviceImpl: %s for %s status %x\n", __FUNCTION__,
BluetoothCommandOpcode(opcodeExpected), *(uint8*)(event + 1));
status = request->SendReply(&reply);
printf("%s: Sending reply write...\n", __func__);
if (status < B_OK)
printf("%s: Error sending reply write!\n", __func__);
BMessage* inquiry_request = FindPetition(HCI_EVENT_INQUIRY_COMPLETE);
if (inquiry_request != NULL)
ClearWantedEvent(inquiry_request);
ClearWantedEvent(request);
break;
}
// place here all CC that just replies a uint8 status // place here all CC that just replies a uint8 status
case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_RESET): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_RESET):
case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_SCAN_ENABLE): case PACK_OPCODE(OGF_CONTROL_BASEBAND, OCF_WRITE_SCAN_ENABLE):