haiku/src/kits/bluetooth/DeviceClass.cpp

437 lines
12 KiB
C++

/*
* Copyright 2007-2008 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include <bluetooth/DeviceClass.h>
#include <bluetooth/debug.h>
#include <Catalog.h>
#include <Locale.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "DeviceClass"
namespace Bluetooth {
void
DeviceClass::GetServiceClass(BString& serviceClass)
{
CALLED();
static const char *services[] = {
B_TRANSLATE_MARK("Positioning"),
B_TRANSLATE_MARK("Networking"),
B_TRANSLATE_MARK("Rendering"),
B_TRANSLATE_MARK("Capturing"),
B_TRANSLATE_MARK("Object transfer"),
B_TRANSLATE_MARK("Audio"),
B_TRANSLATE_MARK("Telephony"),
B_TRANSLATE_MARK("Information")
};
if (ServiceClass() != 0) {
bool first = true;
for (uint s = 0; s < (sizeof(services) / sizeof(*services)); s++) {
if (ServiceClass() & (1 << s)) {
if (first) {
first = false;
serviceClass << services[s];
} else {
serviceClass << ", " << services[s];
}
}
}
} else
serviceClass << B_TRANSLATE("Unspecified");
}
void
DeviceClass::GetMajorDeviceClass(BString& majorClass)
{
CALLED();
static const char *major_devices[] = {
B_TRANSLATE_MARK("Miscellaneous"),
B_TRANSLATE_MARK("Computer"),
B_TRANSLATE_MARK("Phone"),
B_TRANSLATE_MARK("LAN access"),
B_TRANSLATE_MARK("Audio/Video"),
B_TRANSLATE_MARK("Peripheral"),
B_TRANSLATE_MARK("Imaging"),
B_TRANSLATE_MARK("Uncategorized")
};
if (MajorDeviceClass() >= sizeof(major_devices) / sizeof(*major_devices))
majorClass << B_TRANSLATE("Invalid device class!\n");
else
majorClass << major_devices[MajorDeviceClass()];
}
void
DeviceClass::GetMinorDeviceClass(BString& minorClass)
{
CALLED();
uint major = MajorDeviceClass();
uint minor = MinorDeviceClass();
switch (major) {
case 0: /* misc */
minorClass << " -";
break;
case 1: /* computer */
switch(minor) {
case 0:
minorClass << B_TRANSLATE("Uncategorized");
break;
case 1:
minorClass << B_TRANSLATE("Desktop workstation");
break;
case 2:
minorClass << B_TRANSLATE("Server");
break;
case 3:
minorClass << B_TRANSLATE("Laptop");
break;
case 4:
minorClass << B_TRANSLATE("Handheld");
break;
case 5:
minorClass << B_TRANSLATE_COMMENT("Palm",
"A palm-held device");
break;
case 6:
minorClass << B_TRANSLATE_COMMENT("Wearable",
"A wearable computer");
break;
}
break;
case 2: /* phone */
switch(minor) {
case 0:
minorClass << B_TRANSLATE("Uncategorized");
break;
case 1:
minorClass << B_TRANSLATE("Cellular");
break;
case 2:
minorClass << B_TRANSLATE("Cordless");
break;
case 3:
minorClass << B_TRANSLATE("Smart phone");
break;
case 4:
minorClass << B_TRANSLATE("Wired modem or voice gateway");
break;
case 5:
minorClass << B_TRANSLATE("Common ISDN access");
break;
case 6:
minorClass << B_TRANSLATE("SIM card reader");
break;
}
break;
case 3: /* lan access */
if (minor == 0) {
minorClass << B_TRANSLATE("Uncategorized");
break;
}
switch(minor / 8) {
case 0:
minorClass << B_TRANSLATE("Fully available");
break;
case 1:
minorClass << B_TRANSLATE("1-17% utilized");
break;
case 2:
minorClass << B_TRANSLATE("17-33% utilized");
break;
case 3:
minorClass << B_TRANSLATE("33-50% utilized");
break;
case 4:
minorClass << B_TRANSLATE("50-67% utilized");
break;
case 5:
minorClass << B_TRANSLATE("67-83% utilized");
break;
case 6:
minorClass << B_TRANSLATE("83-99% utilized");
break;
case 7:
minorClass << B_TRANSLATE("No service available");
break;
}
break;
case 4: /* audio/video */
switch(minor) {
case 0:
minorClass << B_TRANSLATE("Uncategorized");
break;
case 1:
minorClass << B_TRANSLATE("Device conforms to the headset profile");
break;
case 2:
minorClass << B_TRANSLATE("Hands-free");
break;
/* 3 is reserved */
case 4:
minorClass << B_TRANSLATE("Microphone");
break;
case 5:
minorClass << B_TRANSLATE("Loudspeaker");
break;
case 6:
minorClass << B_TRANSLATE("Headphones");
break;
case 7:
minorClass << B_TRANSLATE("Portable audio");
break;
case 8:
minorClass << B_TRANSLATE("Car audio");
break;
case 9:
minorClass << B_TRANSLATE("Set-top box");
break;
case 10:
minorClass << B_TRANSLATE("HiFi audio device");
break;
case 11:
minorClass << B_TRANSLATE("VCR");
break;
case 12:
minorClass << B_TRANSLATE("Video camera");
break;
case 13:
minorClass << B_TRANSLATE("Camcorder");
break;
case 14:
minorClass << B_TRANSLATE("Video monitor");
break;
case 15:
minorClass << B_TRANSLATE("Video display and loudspeaker");
break;
case 16:
minorClass << B_TRANSLATE("Video conferencing");
break;
/* 17 is reserved */
case 18:
minorClass << B_TRANSLATE("Gaming/Toy");
break;
}
break;
case 5: /* peripheral */
{
switch(minor & 48) {
case 16:
minorClass << B_TRANSLATE("Keyboard");
if (minor & 15)
minorClass << "/";
break;
case 32:
minorClass << B_TRANSLATE("Pointing device");
if (minor & 15)
minorClass << "/";
break;
case 48:
minorClass << B_TRANSLATE("Combo keyboard/pointing device");
if (minor & 15)
minorClass << "/";
break;
}
switch(minor & 15) {
case 0:
break;
case 1:
minorClass << B_TRANSLATE("Joystick");
break;
case 2:
minorClass << B_TRANSLATE("Gamepad");
break;
case 3:
minorClass << B_TRANSLATE("Remote control");
break;
case 4:
minorClass << B_TRANSLATE("Sensing device");
break;
case 5:
minorClass << B_TRANSLATE("Digitizer tablet");
break;
case 6:
minorClass << B_TRANSLATE("Card reader");
break;
default:
minorClass << B_TRANSLATE("(reserved)");
break;
}
break;
}
case 6: /* imaging */
if (minor & 4)
minorClass << B_TRANSLATE("Display");
if (minor & 8)
minorClass << B_TRANSLATE("Camera");
if (minor & 16)
minorClass << B_TRANSLATE("Scanner");
if (minor & 32)
minorClass << B_TRANSLATE("Printer");
break;
case 7: /* wearable */
switch(minor) {
case 1:
minorClass << B_TRANSLATE("Wrist watch");
break;
case 2:
minorClass << B_TRANSLATE_COMMENT("Pager",
"A small radio device to receive short text messages");
break;
case 3:
minorClass << B_TRANSLATE("Jacket");
break;
case 4:
minorClass << B_TRANSLATE("Helmet");
break;
case 5:
minorClass << B_TRANSLATE("Glasses");
break;
}
break;
case 8: /* toy */
switch(minor) {
case 1:
minorClass << B_TRANSLATE("Robot");
break;
case 2:
minorClass << B_TRANSLATE("Vehicle");
break;
case 3:
minorClass << B_TRANSLATE("Doll/Action figure");
break;
case 4:
minorClass << B_TRANSLATE("Controller");
break;
case 5:
minorClass << B_TRANSLATE("Game");
break;
}
break;
case 63: /* uncategorised */
minorClass << "";
break;
default:
minorClass << B_TRANSLATE("Unknown (reserved) minor device class");
break;
}
}
void
DeviceClass::DumpDeviceClass(BString& string)
{
CALLED();
string << B_TRANSLATE("Service classes: ");
GetServiceClass(string);
string << " | ";
string << B_TRANSLATE("Major class: ");
GetMajorDeviceClass(string);
string << " | ";
string << B_TRANSLATE("Minor class: ");
GetMinorDeviceClass(string);
string << ".";
}
void
DeviceClass::Draw(BView* view, const BPoint& point)
{
CALLED();
rgb_color kBlack = { 0,0,0,0 };
rgb_color kBlue = { 28,110,157,0 };
rgb_color kWhite = { 255,255,255,0 };
view->SetHighColor(kBlue);
view->FillRoundRect(BRect(point.x + IconInsets, point.y + IconInsets,
point.x + IconInsets + PixelsForIcon, point.y + IconInsets + PixelsForIcon), 5, 5);
view->SetHighColor(kWhite);
switch (MajorDeviceClass()) {
case 2: // phone
view->StrokeRoundRect(BRect(point.x + IconInsets + uint(PixelsForIcon/4),
point.y + IconInsets + 6,
point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + PixelsForIcon - 2), 2, 2);
view->StrokeRect(BRect(point.x + IconInsets + uint(PixelsForIcon/4) + 4,
point.y + IconInsets + 10,
point.x + IconInsets + uint(PixelsForIcon*3/4) - 4,
point.y + IconInsets + uint(PixelsForIcon*3/4)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/4) + 4,
point.y + IconInsets + PixelsForIcon - 6),
BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4) - 4,
point.y + IconInsets + PixelsForIcon - 6));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/4) + 4,
point.y + IconInsets + PixelsForIcon - 4),
BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4) - 4,
point.y + IconInsets + PixelsForIcon - 4));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/4) + 4,
point.y + IconInsets + 2),
BPoint(point.x + IconInsets + uint(PixelsForIcon/4) + 4,
point.y + IconInsets + 6));
break;
case 3: // LAN
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/4),
point.y + IconInsets + uint(PixelsForIcon*3/8)),
BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + uint(PixelsForIcon*3/8)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*5/8),
point.y + IconInsets + uint(PixelsForIcon/8)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + uint(PixelsForIcon*5/8)),
BPoint(point.x + IconInsets + uint(PixelsForIcon/4),
point.y + IconInsets + uint(PixelsForIcon*5/8)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*3/8),
point.y + IconInsets + uint(PixelsForIcon*7/8)));
break;
case 4: // audio/video
view->StrokeRect(BRect(point.x + IconInsets + uint(PixelsForIcon/4),
point.y + IconInsets + uint(PixelsForIcon*3/8),
point.x + IconInsets + uint(PixelsForIcon*3/8),
point.y + IconInsets + uint(PixelsForIcon*5/8)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*3/8),
point.y + IconInsets + uint(PixelsForIcon*3/8)),
BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + uint(PixelsForIcon/8)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + uint(PixelsForIcon*7/8)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*3/8),
point.y + IconInsets + uint(PixelsForIcon*5/8)));
break;
default: // Bluetooth Logo
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/4),
point.y + IconInsets + uint(PixelsForIcon*3/4)),
BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + uint(PixelsForIcon/4)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/2),
point.y + IconInsets +2));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/2),
point.y + IconInsets + PixelsForIcon - 2));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon*3/4),
point.y + IconInsets + uint(PixelsForIcon*3/4)));
view->StrokeLine(BPoint(point.x + IconInsets + uint(PixelsForIcon/4),
point.y + IconInsets + uint(PixelsForIcon/4)));
break;
}
view->SetHighColor(kBlack);
}
}