- Implement a suitable BListItem(me) for bluetooth Devices

- Add functionality to the Menu starting or shutting down the server(Monni)
- Add the desired device after the inquiry to the RemoveDevices List (Monni & me)



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29361 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Oliver Ruiz Dorantes 2009-02-28 20:48:27 +00:00
parent 4438cb3b69
commit 623f4e6534
9 changed files with 259 additions and 148 deletions

View File

@ -24,45 +24,48 @@ void
BluetoothApplication::AboutRequested()
{
(new BAlert("about", "Haiku Bluetooth System, (ARCE)
Created by Oliver Ruiz Dorantes
With support of:
- Mika Lindqvist
- Maksym Yevmenkin
Thanks to the individuals who helped...
Shipping/donating hardware:
- Henry Jair Abril Florez(el Colombian)
& Stefanie Bartolich
- Dennis d'Entremont
- Luroh
- Pieter Panman
Economically:
- Karl von Dorf, Andrea Bernardi (OSDrawer),
- Matt M, Doug F, Hubert H,
- Sebastian B, Andrew M, Jared E,
- Frederik H, Tom S, Ferry B,
- Greg G, David F, Richard S, Martin W:
With patches:
- Fredrik Ekdahl
- Andreas Färber
Testing:
- Petter H. Juliussen
- Raynald Lesieur
- Adrien Destugues
- Jörg Meyer
Who gave me all the knowledge:
- the yellowTAB team", "OK"))->Go();
(new BAlert("about", "Haiku Bluetooth System, (ARCE)\n\n"
"Created by Oliver Ruiz Dorantes\n\n"
"With support of:\n"
" - Mika Lindqvist\n"
" - Maksym Yevmenkin\n\n"
"Thanks to the individuals who helped...\n\n"
"Shipping/donating hardware:\n"
" - Henry Jair Abril Florez(el Colombian)\n"
" & Stefanie Bartolich\n"
" - Dennis d'Entremont\n"
" - Luroh\n"
" - Pieter Panman\n\n"
"Economically:\n"
" - Karl von Dorf, Andrea Bernardi (OSDrawer),\n"
" - Matt M, Doug F, Hubert H,\n"
" - Sebastian B, Andrew M, Jared E,\n"
" - Frederik H, Tom S, Ferry B,\n"
" - Greg G, David F, Richard S, Martin W:\n\n"
"With patches:\n"
" - Fredrik Ekdahl\n"
" - Andreas Färber\n\n"
"Testing:\n"
" - Petter H. Juliussen\n"
" - Raynald Lesieur\n"
" - Adrien Destugues\n"
" - Jörg Meyer\n\n"
"Who gave me all the knowledge:\n"
" - the yellowTAB team", "OK"))->Go();
}
void
BluetoothApplication::MessageReceived(BMessage *message)
{
switch (message->what) {
case kMsgAddToRemoteList:
fWindow->PostMessage(message);
break;
default:
BApplication::MessageReceived(message);
}
}
int
main(int, char**)

View File

@ -14,6 +14,7 @@ class BluetoothApplication : public BApplication
public:
BluetoothApplication(void);
virtual void MessageReceived(BMessage*);
virtual void AboutRequested();
private:

View File

@ -10,6 +10,8 @@
#include <Messenger.h>
#include <SpaceLayoutItem.h>
#include <TabView.h>
#include <Roster.h>
#include <stdio.h>
#include <bluetooth/LocalDevice.h>
#include "RemoteDevicesView.h"
@ -105,6 +107,25 @@ BluetoothWindow::MessageReceived(BMessage *message)
|| fAntialiasingSettings->IsDefaultable());
fRevertButton->SetEnabled(false);
*/ break;
case kMsgStartServices:
printf("kMsgStartServices\n");
if (!be_roster->IsRunning("application/x-vnd.Be-bluetooth_server"))
{
printf("kMsgStopServices: %s\n", strerror(be_roster->Launch("application/x-vnd.Be-bluetooth_server")));
}
break;
case kMsgStopServices:
printf("kMsgStopServices\n");
if (be_roster->IsRunning("application/x-vnd.Be-bluetooth_server"))
{
printf("kMsgStopServices: %s\n", strerror(BMessenger("application/x-vnd.Be-bluetooth_server").SendMessage(B_QUIT_REQUESTED)));
}
break;
case kMsgAddToRemoteList:
{
PostMessage(message, fRemoteDevices);
}
break;
case B_ABOUT_REQUESTED:
be_app->PostMessage(message);
break;

View File

@ -2,86 +2,126 @@
* Copyright 2009, Oliver Ruiz Dorantes, <oliver.ruiz.dorantes_at_gmail.com>
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "DeviceListItem.h"
#include <bluetooth/bdaddrUtils.h>
#include <Bitmap.h>
#include <View.h>
namespace bluetooth {
#include <bluetooth/bdaddrUtils.h>
#include <bluetooth/BluetoothDevice.h>
RangeItem::RangeItem(uint32 lowAddress, uint32 highAddress, const char* name)
: BListItem(),
fLowAddress(lowAddress),
fHighAddress(highAddress)
{
fName = strdup(name);
}
RangeItem::~RangeItem()
{
delete fName;
}
#include "DeviceListItem.h"
#define PIXELS_FOR_ICON 32
#define INSETS 2
#define TEXT_ROWS 2
namespace Bluetooth {
DeviceListItem::DeviceListItem(BluetoothDevice* bDevice)
: BListItem(),
fDevice(bDevice)
{
SetDevice(fDevice);
}
DeviceListItem::DeviceListItem(bdaddr_t bdaddr, DeviceClass dClass, int32 rssi = 0)
: BListItem(),
fDevice(NULL),
fAddress(bdaddr),
fClass(dClass),
fName("unknown"),
fRSSI(rssi)
{
}
/***********************************************************
* DrawItem
***********************************************************/
void
RangeItem::DrawItem(BView *owner, BRect itemRect, bool complete)
DeviceListItem::SetDevice(BluetoothDevice* bDevice)
{
rgb_color kBlack = { 0,0,0,0 };
rgb_color kHighlight = { 156,154,156,0 };
if (IsSelected() || complete) {
rgb_color color;
if (IsSelected())
color = kHighlight;
else
color = owner->ViewColor();
owner->SetHighColor(color);
owner->SetLowColor(color);
owner->FillRect(itemRect);
owner->SetHighColor(kBlack);
} else {
owner->SetLowColor(owner->ViewColor());
}
BFont font = be_plain_font;
font_height finfo;
font.GetHeight(&finfo);
BPoint point = BPoint(itemRect.left + 17, itemRect.bottom - finfo.descent + 1);
owner->SetFont(be_fixed_font);
owner->SetHighColor(kBlack);
owner->MovePenTo(point);
/* if (fLowAddress >= 0) {
char string[255];
sprintf(string, "0x%04lx - 0x%04lx", fLowAddress, fHighAddress);
owner->DrawString(string);
}
point += BPoint(174, 0);*/
owner->SetFont(be_plain_font);
owner->MovePenTo(point);
owner->DrawString(fName);
fAddress = bDevice->GetBluetoothAddress();
fClass = bDevice->GetDeviceClass();
fName = bDevice->GetFriendlyName();
// AKAIR rssi can only be got at inquiry time...
}
int
RangeItem::Compare(const void *firstArg, const void *secondArg)
DeviceListItem::~DeviceListItem()
{
}
/***********************************************************
* DrawItem
***********************************************************/
void
DeviceListItem::DrawItem(BView *owner, BRect itemRect, bool complete)
{
rgb_color kBlack = { 0,0,0,0 };
rgb_color kHighlight = { 156,154,156,0 };
if (IsSelected() || complete) {
rgb_color color;
if (IsSelected())
color = kHighlight;
else
color = owner->ViewColor();
owner->SetHighColor(color);
owner->SetLowColor(color);
owner->FillRect(itemRect);
owner->SetHighColor(kBlack);
} else {
owner->SetLowColor(owner->ViewColor());
}
font_height finfo;
be_plain_font->GetHeight(&finfo);
BPoint point = BPoint(itemRect.left + PIXELS_FOR_ICON + INSETS, itemRect.bottom - finfo.descent + 1);
owner->SetFont(be_fixed_font);
owner->SetHighColor(kBlack);
owner->MovePenTo(point);
owner->DrawString(bdaddrUtils::ToString(fAddress));
point -= BPoint(0, (finfo.ascent + finfo.descent + finfo.leading));
owner->SetFont(be_plain_font);
owner->MovePenTo(point);
owner->DrawString(fName.String());
// TODO: Stroke icon
// TODO: Draw rssi
}
void
DeviceListItem::Update(BView *owner, const BFont *font)
{
const RangeItem *item1 = *static_cast<const RangeItem * const *>(firstArg);
const RangeItem *item2 = *static_cast<const RangeItem * const *>(secondArg);
BListItem::Update(owner,font);
font_height height;
font->GetHeight(&height);
//SetHeight(finfo.leading*TEXT_ROWS + TEXT_ROWS*INSETS + 50);
SetHeight((height.ascent + height.descent + height.leading) * TEXT_ROWS + TEXT_ROWS*INSETS);
if (item1->fLowAddress < item2->fLowAddress) {
return -1;
} else if (item1->fLowAddress > item2->fLowAddress) {
return 1;
} else
return 0;
}
int
DeviceListItem::Compare(const void *firstArg, const void *secondArg)
{
const DeviceListItem *item1 = *static_cast<const DeviceListItem * const *>(firstArg);
const DeviceListItem *item2 = *static_cast<const DeviceListItem * const *>(secondArg);
return (int)bdaddrUtils::Compare((bdaddr_t*)&item1->fAddress, (bdaddr_t*)&item2->fAddress);
}
}

View File

@ -6,20 +6,37 @@
#define DEVICELISTITEM_H_
#include <ListItem.h>
#include <String.h>
namespace bluetooth {
#include <bluetooth/bluetooth.h>
#include <bluetooth/DeviceClass.h>
// TODO: Implement a BluetoothDeviceListItem class, this one is stolen from somewhere .....
class RangeItem : public BListItem
class BluetoothDevice;
namespace Bluetooth {
class DeviceListItem : public BListItem
{
public:
RangeItem(uint32 lowAddress, uint32 highAddress, const char* name);
~RangeItem();
virtual void DrawItem(BView *, BRect, bool = false);
DeviceListItem(BluetoothDevice* bDevice);
DeviceListItem(bdaddr_t bdaddr, DeviceClass dClass, int32 rssi = 0);
~DeviceListItem();
void DrawItem(BView *, BRect, bool = false);
void Update(BView *owner, const BFont *font);
static int Compare(const void *firstArg, const void *secondArg);
private:
char* fName;
uint32 fLowAddress, fHighAddress;
void SetDevice(BluetoothDevice* bDevice);
BluetoothDevice* fDevice;
bdaddr_t fAddress;
DeviceClass fClass;
BString fName;
int32 fRSSI;
};
}

View File

@ -21,8 +21,9 @@
#include "InquiryPanel.h"
#include "DeviceListItem.h"
#include "defs.h"
using namespace bluetooth;
using Bluetooth::DeviceListItem;
// private funcionaility provided by kit
extern uint8 GetInquiryTime();
@ -34,7 +35,6 @@ static const uint32 kMsgShowDebug = 'ShDG';
static const uint32 kMsgInquiry = 'iQbt';
static const uint32 kMsgAddListDevice = 'aDdv';
static const uint32 kMsgAddToRemoteList = 'aDdL';
static const uint32 kMsgSecond = 'sCMs';
@ -52,7 +52,8 @@ public:
DeviceDiscovered(RemoteDevice* btDevice, DeviceClass cod)
{
BMessage* message = new BMessage(kMsgAddListDevice);
message->AddPointer("remote", btDevice);
message->AddPointer("remoteItem", new DeviceListItem(btDevice->GetBluetoothAddress(), cod));
fInquiryPanel->PostMessage(message);
}
@ -85,18 +86,17 @@ InquiryPanel::InquiryPanel(BRect frame, LocalDevice* lDevice)
B_ALL_WORKSPACES ), fScanning(false)
, fLocalDevice(lDevice)
{
BRect iDontCare(0,0,0,0);
// BRect iDontCare(0,0,0,0);
SetLayout(new BGroupLayout(B_HORIZONTAL));
fScanProgress = new BStatusBar(iDontCare, "status", "Scanning progress", "");
fScanProgress = new BStatusBar("status", "Scanning progress", "");
activeColor = fScanProgress->BarColor();
if (fLocalDevice == NULL)
fLocalDevice = LocalDevice::GetLocalDevice();
fMessage = new BTextView(iDontCare, "description",
iDontCare, B_FOLLOW_NONE, B_WILL_DRAW | B_SUPPORTS_LAYOUT);
fMessage = new BTextView("description", B_WILL_DRAW);
fMessage->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
fMessage->SetLowColor(fMessage->ViewColor());
fMessage->MakeEditable(false);
@ -167,11 +167,24 @@ InquiryPanel::MessageReceived(BMessage *message)
case kMsgAddListDevice:
{
RemoteDevice* rDevice;
DeviceListItem* listItem;
message->FindPointer("remote", (void **)&rDevice);
message->FindPointer("remoteItem", (void **)&listItem);
fRemoteList->AddItem(new RangeItem(0,1,bdaddrUtils::ToString(rDevice->GetBluetoothAddress())));
fRemoteList->AddItem(listItem);
}
break;
case kMsgAddToRemoteList:
{
message->PrintToStream();
int32 index = fRemoteList->CurrentSelection(0);
DeviceListItem* item = (DeviceListItem*) fRemoteList->ItemAt(index);
BMessage message(kMsgAddToRemoteList);
message.AddPointer("device", item);
be_app->PostMessage(&message);
}
break;
@ -205,7 +218,7 @@ InquiryPanel::MessageReceived(BMessage *message)
scanningTime = scanningTime + 1;
}
if (fRemoteList->CurrentSelection() < 0)
if (fRemoteList->CurrentSelection() < 0 || fScanning)
fAddButton->SetEnabled(false);
else
fAddButton->SetEnabled(true);

View File

@ -21,36 +21,39 @@
#include "RemoteDevicesView.h"
static const uint32 kMsgAddDevices = 'ddDv';
static const uint32 kMsgRemoveDevice = 'rmDv';
static const uint32 kMsgTrustDevice = 'trDv';
static const uint32 kMsgBlockDevice = 'blDv';
static const uint32 kMsgRefreshDevices = 'rfDv';
RemoteDevicesView::RemoteDevicesView(const char *name, uint32 flags)
: BView(name, flags)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
addButton = new BButton(BRect(5,5,5,5), "add", "Add" B_UTF8_ELLIPSIS,
new BMessage(kMsgAddDevices), B_FOLLOW_RIGHT);
addButton = new BButton("add", "Add" B_UTF8_ELLIPSIS,
new BMessage(kMsgAddDevices));
BButton* removeButton = new BButton(BRect(5,5,5,5), "remove", "Remove",
new BMessage(kMsgAddDevices), B_FOLLOW_RIGHT);
removeButton = new BButton("remove", "Remove",
new BMessage(kMsgRemoveDevice));
BButton* trustButton = new BButton(BRect(5,5,5,5), "trust", "As Trusted",
new BMessage(kMsgAddDevices), B_FOLLOW_RIGHT);
trustButton = new BButton("trust", "As Trusted",
new BMessage(kMsgTrustDevice));
BButton* blockButton = new BButton(BRect(5,5,5,5), "trust", "As Blocked",
new BMessage(kMsgAddDevices), B_FOLLOW_RIGHT);
blockButton = new BButton("trust", "As Blocked",
new BMessage(kMsgBlockDevice));
BButton* availButton = new BButton(BRect(5,5,5,5), "check", "Refresh" B_UTF8_ELLIPSIS,
new BMessage(kMsgAddDevices), B_FOLLOW_RIGHT);
availButton = new BButton("check", "Refresh" B_UTF8_ELLIPSIS,
new BMessage(kMsgRefreshDevices));
// Set up list of color attributes
fAttrList = new BListView("AttributeList", B_SINGLE_SELECTION_LIST);
// Set up device list
fDeviceList = new BListView("DeviceList", B_SINGLE_SELECTION_LIST);
fScrollView = new BScrollView("ScrollView", fAttrList, 0, false, true);
fScrollView = new BScrollView("ScrollView", fDeviceList, 0, false, true);
fScrollView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
SetLayout(new BGroupLayout(B_VERTICAL));
@ -74,7 +77,7 @@ RemoteDevicesView::RemoteDevicesView(const char *name, uint32 flags)
.SetInsets(5, 5, 5, 100)
);
fAttrList->SetSelectionMessage(NULL);
fDeviceList->SetSelectionMessage(NULL);
}
RemoteDevicesView::~RemoteDevicesView(void)
@ -85,25 +88,21 @@ RemoteDevicesView::~RemoteDevicesView(void)
void
RemoteDevicesView::AttachedToWindow(void)
{
fAttrList->SetTarget(this);
fDeviceList->SetTarget(this);
addButton->SetTarget(this);
removeButton->SetTarget(this);
trustButton->SetTarget(this);
blockButton->SetTarget(this);
availButton->SetTarget(this);
LoadSettings();
fAttrList->Select(0);
fDeviceList->Select(0);
}
void
RemoteDevicesView::MessageReceived(BMessage *msg)
{
if (msg->WasDropped()) {
rgb_color *color;
ssize_t size;
if (msg->FindData("RGBColor", (type_code)'RGBC', (const void**)&color, &size) == B_OK) {
}
}
printf("what = %ld\n", msg->what);
switch(msg->what) {
case kMsgAddDevices:
{
@ -111,6 +110,17 @@ RemoteDevicesView::MessageReceived(BMessage *msg)
iPanel->Show();
}
break;
case kMsgRemoveDevice:
printf("kMsgRemoveDevice: %ld\n", fDeviceList->CurrentSelection(0));
fDeviceList->RemoveItem(fDeviceList->CurrentSelection(0));
break;
case kMsgAddToRemoteList:
{
BListItem* device;
msg->FindPointer("device", (void**)&device);
fDeviceList->AddItem(device);
}
break;
default:
BView::MessageReceived(msg);
break;

View File

@ -40,7 +40,11 @@ protected:
void UpdateAllColors();
BButton* addButton;
BListView* fAttrList;
BButton* removeButton;
BButton* trustButton;
BButton* blockButton;
BButton* availButton;
BListView* fDeviceList;
BScrollView* fScrollView;

View File

@ -26,6 +26,8 @@
const uint32 kBorderSpace = 10;
const uint32 kItemSpace = 7;
static const uint32 kMsgAddToRemoteList = 'aDdL';
extern LocalDevice* ActiveLocalDevice;
#endif