/*
* Copyright 2013 Canonical Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
* Authors:
* Charles Kerr
*/
/**
* Base class for the bluetooth backend.
*/
public class Bluetooth: Object
{
/* whether or not our system can be seen by other bluetooth devices */
public bool discoverable { get; protected set; default = false; }
public virtual void try_set_discoverable (bool b) {}
/* whether or not there are any bluetooth adapters powered up on the system */
public bool powered { get; protected set; default = false; }
/* whether or not bluetooth's been disabled,
either by a software setting or physical hardware switch */
public bool blocked { get; protected set; default = true; }
public virtual void try_set_blocked (bool b) {
killswitch.try_set_blocked (b);
}
public class Device: Object {
public string name { get; construct; }
public bool supports_browsing { get; construct; }
public bool supports_file_transfer { get; construct; }
public Device (string name,
bool supports_browsing,
bool supports_file_transfer) {
Object (name: name,
supports_browsing: supports_browsing,
supports_file_transfer: supports_file_transfer);
}
}
private static uint16 get_uuid16_from_uuid (string uuid)
{
uint16 uuid16;
string[] tokens = uuid.split ("-", 1);
if (tokens.length > 0)
uuid16 = (uint16) uint64.parse ("0x"+tokens[0]);
else
uuid16 = 0;
return uuid16;
}
protected static bool uuid_supports_file_transfer (string uuid)
{
return get_uuid16_from_uuid (uuid) == 0x1105; // OBEXObjectPush
}
protected static bool uuid_supports_browsing (string uuid)
{
return get_uuid16_from_uuid (uuid) == 0x1106; // OBEXFileTransfer
}
public enum DeviceType
{
COMPUTER,
PHONE,
MODEM,
NETWORK,
HEADSET,
HEADPHONES,
VIDEO,
OTHER_AUDIO,
JOYPAD,
KEYPAD,
KEYBOARD,
TABLET,
MOUSE,
PRINTER,
CAMERA
}
protected static DeviceType class_to_device_type (uint32 c)
{
switch ((c & 0x1f00) >> 8)
{
case 0x01:
return DeviceType.COMPUTER;
case 0x02:
switch ((c & 0xfc) >> 2)
{
case 0x01:
case 0x02:
case 0x03:
case 0x05:
return DeviceType.PHONE;
case 0x04:
return DeviceType.MODEM;
}
break;
case 0x03:
return DeviceType.NETWORK;
case 0x04:
switch ((c & 0xfc) >> 2)
{
case 0x01:
case 0x02:
return DeviceType.HEADSET;
case 0x06:
return DeviceType.HEADPHONES;
case 0x0b: // vcr
case 0x0c: // video camera
case 0x0d: // camcorder
return DeviceType.VIDEO;
default:
return DeviceType.OTHER_AUDIO;
}
//break;
case 0x05:
switch ((c & 0xc0) >> 6)
{
case 0x00:
switch ((c & 0x1e) >> 2)
{
case 0x01:
case 0x02:
return DeviceType.JOYPAD;
}
break;
case 0x01:
return DeviceType.KEYBOARD;
case 0x02:
switch ((c & 0x1e) >> 2)
{
case 0x05:
return DeviceType.TABLET;
default:
return DeviceType.MOUSE;
}
}
break;
case 0x06:
if ((c & 0x80) != 0)
return DeviceType.PRINTER;
if ((c & 0x20) != 0)
return DeviceType.CAMERA;
break;
}
return 0;
}
/***
**** Killswitch Implementation
***/
private KillSwitch killswitch;
public Bluetooth (KillSwitch killswitch)
{
this.killswitch = killswitch;
blocked = killswitch.blocked;
killswitch.notify["blocked"].connect (() => blocked = killswitch.blocked );
}
}