/* * Copyright (C) 2013-2015 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef USS_BLUETOOTH_DEVICE_H #define USS_BLUETOOTH_DEVICE_H #include #include #include #include #include #include "freedesktop_properties.h" #include "bluez_device1.h" struct Device: QObject { Q_OBJECT Q_PROPERTY(QString path READ getPath NOTIFY pathChanged) Q_PROPERTY(QString name READ getName NOTIFY nameChanged) Q_PROPERTY(QString iconName READ getIconName NOTIFY iconNameChanged) Q_PROPERTY(QString address READ getAddress NOTIFY addressChanged) Q_PROPERTY(Type type READ getType NOTIFY typeChanged) Q_PROPERTY(bool paired READ isPaired NOTIFY pairedChanged) Q_PROPERTY(bool trusted READ isTrusted WRITE makeTrusted NOTIFY trustedChanged) Q_PROPERTY(Connection connection READ getConnection NOTIFY connectionChanged) Q_PROPERTY(Strength strength READ getStrength NOTIFY strengthChanged) public: enum Type { Other, Computer, Cellular, Smartphone, Phone, Modem, Network, Headset, Speakers, Headphones, Video, OtherAudio, Joypad, Keypad, Keyboard, Tablet, Mouse, Printer, Camera, Carkit, Watch }; enum Strength { None, Poor, Fair, Good, Excellent }; enum Connection { Disconnected=1, Connecting=2, Connected=4, Disconnecting=8 }; Q_ENUMS(Type Strength Connection) Q_DECLARE_FLAGS(Connections, Connection) Q_SIGNALS: void pathChanged(); void nameChanged(); void iconNameChanged(); void addressChanged(); void typeChanged(); void pairedChanged(); void trustedChanged(); void connectionChanged(); void strengthChanged(); void deviceChanged(); // catchall for any change void pairingDone(bool success); public: const QString& getName() const { return m_name; } const QString& getAddress() const { return m_address; } const QString& getIconName() const { return m_iconName; } Type getType() const { return m_type; } bool isPaired() const { return m_paired; } bool isTrusted() const { return m_trusted; } Connection getConnection() const { return m_connection; } Strength getStrength() const { return m_strength; } QString getPath() const { return m_bluezDevice ? m_bluezDevice->path() : QString(); } private: QString m_name; QString m_state; QString m_address; QString m_iconName; QString m_fallbackIconName; Type m_type = Type::Other; bool m_paired = false; bool m_trusted = false; Connection m_connection = Connection::Disconnected; Strength m_strength = Strength::None; bool m_isConnected = false; bool m_connectAfterPairing = false; QScopedPointer m_bluezDevice; QScopedPointer m_bluezDeviceProperties; bool m_isPairing = false; protected: void setName(const QString &name); void setIconName(const QString &name); void setAddress(const QString &address); void setType(Type type); void setPaired(bool paired); void setTrusted(bool trusted); void setConnection(Connection connection); void setStrength(Strength strength); void updateIcon(); void updateConnection(); public: Device() {} Device(const QString &path, QDBusConnection &bus); ~Device() {} bool isValid() const { return getType() != Type::Other; } void pair(); Q_INVOKABLE void cancelPairing(); void connect(); void makeTrusted(bool trusted); void disconnect(); void setProperties(const QMap &properties); void setConnectAfterPairing(bool value); private Q_SLOTS: void slotPropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &invalidatedProperties); void slotMakeTrustedDone(QDBusPendingCallWatcher *call); private: void initDevice(const QString &path, QDBusConnection &bus); void updateProperties(QSharedPointer); void updateProperty(const QString &key, const QVariant &value); static Type getTypeFromClass(quint32 bluetoothClass); Device::Strength getStrengthFromRssi(int rssi); void connectAfterPairing(); }; Q_DECLARE_METATYPE(Device*) Q_DECLARE_OPERATORS_FOR_FLAGS(Device::Connections) #endif // USS_BLUETOOTH_DEVICE_H