2014-06-09 10:52:16 +01:00
/**
* Copyright 2013 Albert Vaca < albertvaka @ gmail . com >
*
* 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 ; either version 2 of
* the License or ( at your option ) version 3 or any later version
* accepted by the membership of KDE e . V . ( or its successor approved
* by the membership of KDE e . V . ) , which shall act as a proxy
* defined in Section 14 of version 3 of the license .
*
* 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 < http : //www.gnu.org/licenses/>.
*/
2013-06-25 17:06:51 +01:00
# include "device.h"
2013-08-12 15:09:52 +01:00
2014-06-09 10:52:16 +01:00
# ifdef interface // MSVC language extension, QDBusConnection uses this as a variable name
# undef interface
# endif
# include <QDBusConnection>
# include <QFile>
2014-09-22 00:23:27 +01:00
# include <QStandardPaths>
2014-06-09 10:52:16 +01:00
2013-08-12 15:09:52 +01:00
# include <KSharedConfig>
2013-07-03 02:52:44 +01:00
# include <KConfigGroup>
2014-09-22 01:37:10 +01:00
# include <KLocalizedString>
2014-09-13 00:04:48 +01:00
# include <QIcon>
2015-03-02 04:16:07 +00:00
# include <QDir>
2015-03-19 15:36:53 +00:00
# include <QJsonArray>
2015-12-01 15:25:34 +00:00
# include <qstringbuilder.h>
2013-08-13 04:07:32 +01:00
2014-09-21 23:59:34 +01:00
# include "core_debug.h"
2014-06-14 15:34:00 +01:00
# include "kdeconnectplugin.h"
# include "pluginloader.h"
2013-09-09 17:35:56 +01:00
# include "backends/devicelink.h"
# include "backends/linkprovider.h"
2013-08-12 15:09:52 +01:00
# include "networkpackage.h"
2015-03-02 04:16:07 +00:00
# include "kdeconnectconfig.h"
2015-03-24 11:26:37 +00:00
# include "daemon.h"
2013-08-12 15:09:52 +01:00
2016-06-21 17:42:53 +01:00
# define MIN_VERSION_WITH_CAPPABILITIES_SUPPORT 6
2014-09-21 22:54:27 +01:00
Q_LOGGING_CATEGORY ( KDECONNECT_CORE , " kdeconnect.core " )
2015-12-17 14:53:29 +00:00
static void warn ( const QString & info )
{
qWarning ( ) < < " Device pairing error " < < info ;
}
2014-01-22 22:31:27 +00:00
Device : : Device ( QObject * parent , const QString & id )
: QObject ( parent )
, m_deviceId ( id )
2013-10-11 14:19:23 +01:00
, m_protocolVersion ( NetworkPackage : : ProtocolVersion ) //We don't know it yet
2013-07-03 02:52:44 +01:00
{
2015-03-02 04:16:07 +00:00
KdeConnectConfig : : DeviceInfo info = KdeConnectConfig : : instance ( ) - > getTrustedDevice ( id ) ;
2013-07-26 15:21:19 +01:00
2015-03-02 04:16:07 +00:00
m_deviceName = info . deviceName ;
m_deviceType = str2type ( info . deviceType ) ;
2015-03-13 23:39:13 +00:00
2013-07-26 15:21:19 +01:00
//Register in bus
2013-08-20 12:52:25 +01:00
QDBusConnection : : sessionBus ( ) . registerObject ( dbusPath ( ) , this , QDBusConnection : : ExportScriptableContents | QDBusConnection : : ExportAdaptors ) ;
2015-12-17 14:53:29 +00:00
connect ( this , & Device : : pairingError , this , & warn ) ;
2013-06-25 17:06:51 +01:00
}
2013-07-03 02:52:44 +01:00
2014-01-22 22:31:27 +00:00
Device : : Device ( QObject * parent , const NetworkPackage & identityPackage , DeviceLink * dl )
: QObject ( parent )
, m_deviceId ( identityPackage . get < QString > ( " deviceId " ) )
2013-10-11 14:19:23 +01:00
, m_deviceName ( identityPackage . get < QString > ( " deviceName " ) )
2013-11-06 20:31:37 +00:00
, m_deviceType ( str2type ( identityPackage . get < QString > ( " deviceType " ) ) )
2015-09-11 11:34:52 +01:00
, m_protocolVersion ( identityPackage . get < int > ( " protocolVersion " , - 1 ) )
2013-07-03 02:52:44 +01:00
{
2014-01-17 22:07:30 +00:00
addLink ( identityPackage , dl ) ;
2015-09-08 16:28:47 +01:00
2013-08-16 05:26:40 +01:00
//Register in bus
2013-08-20 12:52:25 +01:00
QDBusConnection : : sessionBus ( ) . registerObject ( dbusPath ( ) , this , QDBusConnection : : ExportScriptableContents | QDBusConnection : : ExportAdaptors ) ;
2015-12-17 14:53:29 +00:00
connect ( this , & Device : : pairingError , this , & warn ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-16 08:27:32 +01:00
Device : : ~ Device ( )
{
2016-07-05 11:42:57 +01:00
qDeleteAll ( m_deviceLinks ) ;
m_deviceLinks . clear ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-13 04:07:32 +01:00
2013-09-01 21:13:03 +01:00
bool Device : : hasPlugin ( const QString & name ) const
2013-08-13 22:23:32 +01:00
{
return m_plugins . contains ( name ) ;
}
2013-09-01 21:13:03 +01:00
QStringList Device : : loadedPlugins ( ) const
2013-08-18 19:27:25 +01:00
{
return m_plugins . keys ( ) ;
}
2013-08-13 04:07:32 +01:00
void Device : : reloadPlugins ( )
{
2015-03-14 03:07:55 +00:00
QHash < QString , KdeConnectPlugin * > newPluginMap ;
2014-06-14 19:35:00 +01:00
QMultiMap < QString , KdeConnectPlugin * > newPluginsByIncomingInterface ;
QMultiMap < QString , KdeConnectPlugin * > newPluginsByOutgoingInterface ;
2015-09-08 16:28:47 +01:00
QSet < QString > supportedIncomingInterfaces ;
2015-09-12 16:48:24 +01:00
QSet < QString > supportedOutgoingInterfaces ;
2015-09-08 16:38:33 +01:00
QStringList unsupportedPlugins ;
2013-08-13 04:07:32 +01:00
2015-12-01 18:45:14 +00:00
if ( isTrusted ( ) & & isReachable ( ) ) { //Do not load any plugin for unpaired devices, nor useless loading them for unreachable devices
2013-08-13 04:07:32 +01:00
2015-03-02 04:16:07 +00:00
KConfigGroup pluginStates = KSharedConfig : : openConfig ( pluginsConfigFile ( ) ) - > group ( " Plugins " ) ;
2013-08-13 04:07:32 +01:00
2013-08-14 00:35:12 +01:00
PluginLoader * loader = PluginLoader : : instance ( ) ;
2016-06-21 17:42:53 +01:00
const bool capabilitiesSupported = ( m_protocolVersion > = MIN_VERSION_WITH_CAPPABILITIES_SUPPORT ) ;
2013-08-13 04:07:32 +01:00
2016-06-21 13:50:17 +01:00
Q_FOREACH ( const QString & pluginName , loader - > getPluginList ( ) ) {
2015-09-08 19:03:44 +01:00
const KPluginMetaData service = loader - > getPluginInfo ( pluginName ) ;
const QSet < QString > incomingInterfaces = KPluginMetaData : : readStringList ( service . rawData ( ) , " X-KdeConnect-SupportedPackageType " ) . toSet ( ) ;
const QSet < QString > outgoingInterfaces = KPluginMetaData : : readStringList ( service . rawData ( ) , " X-KdeConnect-OutgoingPackageType " ) . toSet ( ) ;
2013-08-13 04:07:32 +01:00
2015-09-08 19:03:44 +01:00
const bool pluginEnabled = isPluginEnabled ( pluginName ) ;
2013-08-13 04:07:32 +01:00
2015-09-09 09:14:30 +01:00
if ( pluginEnabled ) {
2015-09-08 16:34:48 +01:00
supportedIncomingInterfaces + = incomingInterfaces ;
2015-09-12 16:48:24 +01:00
supportedOutgoingInterfaces + = outgoingInterfaces ;
2015-09-09 09:14:30 +01:00
}
2014-07-11 00:54:19 +01:00
2016-05-31 19:46:48 +01:00
const bool pluginNeedsCapabilities = ! incomingInterfaces . isEmpty ( ) | | ! outgoingInterfaces . isEmpty ( ) ;
2016-05-31 19:16:25 +01:00
2015-09-08 19:03:44 +01:00
//If we don't find intersection with the received on one end and the sent on the other, we don't
//let the plugin stay
2016-05-31 19:16:25 +01:00
if ( capabilitiesSupported & & pluginNeedsCapabilities
2015-09-08 19:03:44 +01:00
& & ( m_incomingCapabilities & outgoingInterfaces ) . isEmpty ( )
& & ( m_outgoingCapabilities & incomingInterfaces ) . isEmpty ( )
) {
2016-06-01 00:14:30 +01:00
if ( ! m_incomingCapabilities . isEmpty ( ) | | ! m_outgoingCapabilities . isEmpty ( ) ) {
qCWarning ( KDECONNECT_CORE ) < < " not loading " < < pluginName < < " because of unmatched capabilities " < <
outgoingInterfaces < < incomingInterfaces ;
}
2015-09-08 19:03:44 +01:00
unsupportedPlugins . append ( pluginName ) ;
continue ;
}
if ( pluginEnabled ) {
KdeConnectPlugin * plugin = m_plugins . take ( pluginName ) ;
2014-07-11 00:54:19 +01:00
if ( ! plugin ) {
plugin = loader - > instantiatePluginForDevice ( pluginName , this ) ;
}
2016-06-21 13:50:17 +01:00
Q_FOREACH ( const QString & interface , incomingInterfaces ) {
2014-06-14 19:35:00 +01:00
newPluginsByIncomingInterface . insert ( interface , plugin ) ;
}
2016-06-21 13:50:17 +01:00
Q_FOREACH ( const QString & interface , outgoingInterfaces ) {
2014-06-14 19:35:00 +01:00
newPluginsByOutgoingInterface . insert ( interface , plugin ) ;
2013-08-14 00:35:12 +01:00
}
2015-09-12 16:48:24 +01:00
2013-10-29 16:29:31 +00:00
newPluginMap [ pluginName ] = plugin ;
2013-08-14 00:35:12 +01:00
}
2013-08-13 04:07:32 +01:00
}
}
2013-10-11 14:19:23 +01:00
//Erase all left plugins in the original map (meaning that we don't want
//them anymore, otherwise they would have been moved to the newPluginMap)
2015-09-08 16:28:47 +01:00
const QStringList newSupportedIncomingInterfaces = supportedIncomingInterfaces . toList ( ) ;
2015-09-12 16:48:24 +01:00
const QStringList newSupportedOutgoingInterfaces = supportedOutgoingInterfaces . toList ( ) ;
2015-09-08 16:28:47 +01:00
const bool capabilitiesChanged = ( m_pluginsByOutgoingInterface ! = newPluginsByOutgoingInterface
| | m_supportedIncomingInterfaces ! = newSupportedIncomingInterfaces ) ;
2013-08-14 00:35:12 +01:00
qDeleteAll ( m_plugins ) ;
m_plugins = newPluginMap ;
2015-09-08 16:28:47 +01:00
m_supportedIncomingInterfaces = newSupportedIncomingInterfaces ;
2015-09-12 16:48:24 +01:00
m_supportedOutgoingInterfaces = newSupportedOutgoingInterfaces ;
m_pluginsByOutgoingInterface = newPluginsByOutgoingInterface ;
2015-09-08 16:28:47 +01:00
m_pluginsByIncomingInterface = newPluginsByIncomingInterface ;
2015-09-08 16:38:33 +01:00
m_unsupportedPlugins = unsupportedPlugins ;
2013-08-14 00:35:12 +01:00
2013-08-22 02:21:08 +01:00
Q_FOREACH ( KdeConnectPlugin * plugin , m_plugins ) {
2013-10-11 14:19:23 +01:00
plugin - > connected ( ) ;
2013-08-22 02:21:08 +01:00
}
2013-08-13 22:23:32 +01:00
Q_EMIT pluginsChanged ( ) ;
2013-08-13 04:07:32 +01:00
2015-12-01 18:45:14 +00:00
if ( capabilitiesChanged & & isReachable ( ) & & isTrusted ( ) )
2015-09-08 16:28:47 +01:00
{
NetworkPackage np ( PACKAGE_TYPE_CAPABILITIES ) ;
2015-09-11 13:20:46 +01:00
np . set < QStringList > ( " IncomingCapabilities " , newSupportedIncomingInterfaces ) ;
2015-09-12 16:48:24 +01:00
np . set < QStringList > ( " OutgoingCapabilities " , newSupportedOutgoingInterfaces ) ;
2015-09-08 16:28:47 +01:00
sendPackage ( np ) ;
}
2013-08-13 04:07:32 +01:00
}
2015-03-02 04:16:07 +00:00
QString Device : : pluginsConfigFile ( ) const
{
return KdeConnectConfig : : instance ( ) - > deviceConfigDir ( id ( ) ) . absoluteFilePath ( " config " ) ;
}
2013-08-30 18:10:43 +01:00
void Device : : requestPair ( )
2013-07-03 02:52:44 +01:00
{
2015-12-01 18:45:14 +00:00
if ( isTrusted ( ) ) {
Q_EMIT pairingError ( i18n ( " Already paired " ) ) ;
2015-11-30 18:36:01 +00:00
return ;
2015-06-15 03:22:13 +01:00
}
if ( ! isReachable ( ) ) {
2015-12-01 18:45:14 +00:00
Q_EMIT pairingError ( i18n ( " Device not reachable " ) ) ;
2015-06-15 03:22:13 +01:00
return ;
2013-08-30 18:10:43 +01:00
}
2015-12-01 18:45:14 +00:00
Q_FOREACH ( DeviceLink * dl , m_deviceLinks ) {
2015-12-02 19:04:35 +00:00
dl - > userRequestsPair ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-30 18:10:43 +01:00
}
void Device : : unpair ( )
{
2015-12-01 18:45:14 +00:00
Q_FOREACH ( DeviceLink * dl , m_deviceLinks ) {
2015-12-02 19:04:35 +00:00
dl - > userRequestsUnpair ( ) ;
2015-07-09 22:51:08 +01:00
}
2015-12-01 18:45:14 +00:00
KdeConnectConfig : : instance ( ) - > removeTrustedDevice ( id ( ) ) ;
2015-03-16 02:13:54 +00:00
}
2013-08-30 18:10:43 +01:00
2015-12-01 18:45:14 +00:00
void Device : : pairStatusChanged ( DeviceLink : : PairStatus status )
2015-03-16 02:13:54 +00:00
{
2015-12-01 18:45:14 +00:00
if ( status = = DeviceLink : : NotPaired ) {
KdeConnectConfig : : instance ( ) - > removeTrustedDevice ( id ( ) ) ;
2013-08-30 18:10:43 +01:00
2015-12-01 18:45:14 +00:00
Q_FOREACH ( DeviceLink * dl , m_deviceLinks ) {
if ( dl ! = sender ( ) ) {
2015-12-02 19:04:35 +00:00
dl - > setPairStatus ( DeviceLink : : NotPaired ) ;
2015-12-01 18:45:14 +00:00
}
}
} else {
KdeConnectConfig : : instance ( ) - > addTrustedDevice ( id ( ) , name ( ) , type ( ) ) ;
2015-11-30 18:36:01 +00:00
}
2015-12-01 18:45:14 +00:00
reloadPlugins ( ) ; //Will load/unload plugins
2015-11-30 18:36:01 +00:00
2015-12-01 18:45:14 +00:00
bool isTrusted = ( status = = DeviceLink : : Paired ) ;
Q_EMIT trustedChanged ( isTrusted ? Trusted : NotTrusted ) ;
Q_ASSERT ( isTrusted = = this - > isTrusted ( ) ) ;
2013-07-03 02:52:44 +01:00
}
static bool lessThan ( DeviceLink * p1 , DeviceLink * p2 )
{
2013-07-24 17:42:33 +01:00
return p1 - > provider ( ) - > priority ( ) > p2 - > provider ( ) - > priority ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-10-01 02:11:22 +01:00
void Device : : addLink ( const NetworkPackage & identityPackage , DeviceLink * link )
2013-07-03 02:52:44 +01:00
{
2014-09-21 22:54:27 +01:00
//qCDebug(KDECONNECT_CORE) << "Adding link to" << id() << "via" << link->provider();
2013-07-23 15:11:54 +01:00
2015-12-17 15:44:29 +00:00
Q_ASSERT ( ! m_deviceLinks . contains ( link ) ) ;
2015-09-11 11:34:52 +01:00
m_protocolVersion = identityPackage . get < int > ( " protocolVersion " , - 1 ) ;
2013-10-01 02:11:22 +01:00
if ( m_protocolVersion ! = NetworkPackage : : ProtocolVersion ) {
2015-09-07 17:54:11 +01:00
qCWarning ( KDECONNECT_CORE ) < < m_deviceName < < " - warning, device uses a different protocol version " < < m_protocolVersion < < " expected " < < NetworkPackage : : ProtocolVersion ;
2013-10-01 02:11:22 +01:00
}
2013-08-16 05:26:40 +01:00
connect ( link , SIGNAL ( destroyed ( QObject * ) ) ,
this , SLOT ( linkDestroyed ( QObject * ) ) ) ;
2013-07-04 18:17:22 +01:00
2013-07-03 02:52:44 +01:00
m_deviceLinks . append ( link ) ;
2013-08-10 04:21:55 +01:00
2013-10-14 17:25:44 +01:00
//re-read the device name from the identityPackage because it could have changed
2015-03-14 03:28:54 +00:00
setName ( identityPackage . get < QString > ( " deviceName " ) ) ;
2013-11-06 20:31:37 +00:00
m_deviceType = str2type ( identityPackage . get < QString > ( " deviceType " ) ) ;
2013-10-14 17:25:44 +01:00
2013-08-13 22:23:32 +01:00
//Theoretically we will never add two links from the same provider (the provider should destroy
//the old one before this is called), so we do not have to worry about destroying old links.
2015-03-02 04:16:07 +00:00
//-- Actually, we should not destroy them or the provider will store an invalid ref!
2013-08-10 04:21:55 +01:00
2013-09-01 21:13:03 +01:00
connect ( link , SIGNAL ( receivedPackage ( NetworkPackage ) ) ,
this , SLOT ( privateReceivedPackage ( NetworkPackage ) ) ) ;
2013-07-04 18:17:22 +01:00
2013-09-01 21:13:03 +01:00
qSort ( m_deviceLinks . begin ( ) , m_deviceLinks . end ( ) , lessThan ) ;
2013-07-28 21:00:45 +01:00
if ( m_deviceLinks . size ( ) = = 1 ) {
2013-08-22 02:21:08 +01:00
reloadPlugins ( ) ; //Will load the plugins
2013-08-13 22:23:32 +01:00
Q_EMIT reachableStatusChanged ( ) ;
2013-08-22 02:21:08 +01:00
} else {
Q_FOREACH ( KdeConnectPlugin * plugin , m_plugins ) {
plugin - > connected ( ) ;
}
2013-07-28 21:00:45 +01:00
}
2015-07-25 12:45:19 +01:00
2015-12-06 00:51:53 +00:00
connect ( link , & DeviceLink : : pairStatusChanged , this , & Device : : pairStatusChanged ) ;
connect ( link , & DeviceLink : : pairingError , this , & Device : : pairingError ) ;
2013-07-03 02:52:44 +01:00
}
2013-07-04 18:17:22 +01:00
void Device : : linkDestroyed ( QObject * o )
{
removeLink ( static_cast < DeviceLink * > ( o ) ) ;
}
2013-07-03 02:52:44 +01:00
void Device : : removeLink ( DeviceLink * link )
{
2015-12-01 18:45:14 +00:00
m_deviceLinks . removeAll ( link ) ;
2013-07-28 21:00:45 +01:00
2014-09-21 22:54:27 +01:00
//qCDebug(KDECONNECT_CORE) << "RemoveLink" << m_deviceLinks.size() << "links remaining";
2013-07-28 21:00:45 +01:00
2013-10-11 14:19:23 +01:00
if ( m_deviceLinks . isEmpty ( ) ) {
2013-08-16 00:01:58 +01:00
reloadPlugins ( ) ;
2013-08-13 22:23:32 +01:00
Q_EMIT reachableStatusChanged ( ) ;
2013-07-28 21:00:45 +01:00
}
2013-07-03 02:52:44 +01:00
}
2013-09-01 21:13:03 +01:00
bool Device : : sendPackage ( NetworkPackage & np )
2013-07-03 02:52:44 +01:00
{
2015-12-02 19:04:35 +00:00
Q_ASSERT ( np . type ( ) ! = PACKAGE_TYPE_PAIR ) ;
Q_ASSERT ( isTrusted ( ) ) ;
//Maybe we could block here any package that is not an identity or a pairing package to prevent sending non encrypted data
Q_FOREACH ( DeviceLink * dl , m_deviceLinks ) {
if ( dl - > sendPackage ( np ) ) return true ;
2013-08-13 04:40:39 +01:00
}
2013-07-23 15:11:54 +01:00
return false ;
2013-07-03 02:52:44 +01:00
}
void Device : : privateReceivedPackage ( const NetworkPackage & np )
{
2015-12-01 18:45:14 +00:00
Q_ASSERT ( np . type ( ) ! = PACKAGE_TYPE_PAIR ) ;
if ( np . type ( ) = = PACKAGE_TYPE_CAPABILITIES ) {
2015-09-11 13:20:46 +01:00
QSet < QString > newIncomingCapabilities = np . get < QStringList > ( " IncomingCapabilities " , QStringList ( ) ) . toSet ( ) ;
QSet < QString > newOutgoingCapabilities = np . get < QStringList > ( " OutgoingCapabilities " , QStringList ( ) ) . toSet ( ) ;
2015-09-07 19:03:05 +01:00
if ( newOutgoingCapabilities ! = m_outgoingCapabilities | | newIncomingCapabilities ! = m_incomingCapabilities ) {
m_incomingCapabilities = newIncomingCapabilities ;
m_outgoingCapabilities = newOutgoingCapabilities ;
reloadPlugins ( ) ;
}
2015-12-01 18:45:14 +00:00
} else if ( isTrusted ( ) ) {
2016-06-03 14:51:05 +01:00
const QList < KdeConnectPlugin * > plugins = m_pluginsByIncomingInterface . values ( np . type ( ) ) ;
if ( plugins . isEmpty ( ) ) {
2016-06-12 19:16:19 +01:00
qWarning ( ) < < " discarding unsupported package " < < np . type ( ) < < " for " < < name ( ) ;
2016-06-03 14:51:05 +01:00
}
2016-06-21 13:50:17 +01:00
Q_FOREACH ( KdeConnectPlugin * plugin , plugins ) {
2013-10-29 16:29:31 +00:00
plugin - > receivePackage ( np ) ;
}
} else {
2014-09-21 22:54:27 +01:00
qCDebug ( KDECONNECT_CORE ) < < " device " < < name ( ) < < " not paired, ignoring package " < < np . type ( ) ;
2015-07-27 16:28:58 +01:00
unpair ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-30 18:10:43 +01:00
}
2015-12-01 18:45:14 +00:00
bool Device : : isTrusted ( ) const
2015-12-01 15:25:34 +00:00
{
2015-12-01 18:45:14 +00:00
return KdeConnectConfig : : instance ( ) - > trustedDevices ( ) . contains ( id ( ) ) ;
2013-11-06 20:34:06 +00:00
}
2013-07-23 15:11:54 +01:00
QStringList Device : : availableLinks ( ) const
{
QStringList sl ;
Q_FOREACH ( DeviceLink * dl , m_deviceLinks ) {
2013-07-24 17:42:33 +01:00
sl . append ( dl - > provider ( ) - > name ( ) ) ;
2013-07-23 15:11:54 +01:00
}
return sl ;
}
2016-01-10 15:12:13 +00:00
void Device : : cleanUnneededLinks ( ) {
if ( isTrusted ( ) ) {
return ;
}
for ( int i = 0 ; i < m_deviceLinks . size ( ) ; ) {
DeviceLink * dl = m_deviceLinks [ i ] ;
if ( ! dl - > linkShouldBeKeptAlive ( ) ) {
dl - > deleteLater ( ) ;
m_deviceLinks . remove ( i ) ;
} else {
i + + ;
}
}
}
2015-09-12 08:45:59 +01:00
Device : : DeviceType Device : : str2type ( const QString & deviceType ) {
2013-11-06 20:31:37 +00:00
if ( deviceType = = " desktop " ) return Desktop ;
if ( deviceType = = " laptop " ) return Laptop ;
2015-05-18 07:28:58 +01:00
if ( deviceType = = " smartphone " | | deviceType = = " phone " ) return Phone ;
2013-11-06 20:31:37 +00:00
if ( deviceType = = " tablet " ) return Tablet ;
return Unknown ;
}
2013-11-06 20:34:06 +00:00
QString Device : : type2str ( Device : : DeviceType deviceType ) {
2013-11-06 20:31:37 +00:00
if ( deviceType = = Desktop ) return " desktop " ;
if ( deviceType = = Laptop ) return " laptop " ;
2015-05-18 07:28:58 +01:00
if ( deviceType = = Phone ) return " smartphone " ;
2013-11-06 20:31:37 +00:00
if ( deviceType = = Tablet ) return " tablet " ;
return " unknown " ;
2014-06-14 15:34:00 +01:00
}
2014-06-14 18:09:31 +01:00
2015-05-18 07:28:58 +01:00
QString Device : : statusIconName ( ) const
{
2015-12-01 18:45:14 +00:00
return iconForStatus ( isReachable ( ) , isTrusted ( ) ) ;
2015-05-18 07:28:58 +01:00
}
2014-06-14 18:09:31 +01:00
QString Device : : iconName ( ) const
{
2015-05-18 07:28:58 +01:00
return iconForStatus ( true , false ) ;
}
2015-12-01 18:45:14 +00:00
QString Device : : iconForStatus ( bool reachable , bool trusted ) const
2015-05-18 07:28:58 +01:00
{
Device : : DeviceType deviceType = m_deviceType ;
if ( deviceType = = Device : : Unknown ) {
deviceType = Device : : Phone ; //Assume phone if we don't know the type
} else if ( deviceType = = Device : : Desktop ) {
deviceType = Device : : Device : : Laptop ; // We don't have desktop icon yet
2014-06-14 18:09:31 +01:00
}
2015-05-18 07:28:58 +01:00
2015-12-01 18:45:14 +00:00
QString status = ( reachable ? ( trusted ? QStringLiteral ( " connected " ) : QStringLiteral ( " disconnected " ) ) : QStringLiteral ( " trusted " ) ) ;
2015-05-18 07:28:58 +01:00
QString type = type2str ( deviceType ) ;
2015-08-21 17:38:54 +01:00
return type + ' - ' + status ;
2014-06-14 18:09:31 +01:00
}
2015-03-14 03:28:54 +00:00
void Device : : setName ( const QString & name )
{
if ( m_deviceName ! = name ) {
m_deviceName = name ;
Q_EMIT nameChanged ( name ) ;
}
}
2015-09-07 13:54:33 +01:00
KdeConnectPlugin * Device : : plugin ( const QString & pluginName ) const
{
return m_plugins [ pluginName ] ;
}
2015-09-08 16:28:47 +01:00
void Device : : setPluginEnabled ( const QString & pluginName , bool enabled )
{
KConfigGroup pluginStates = KSharedConfig : : openConfig ( pluginsConfigFile ( ) ) - > group ( " Plugins " ) ;
const QString enabledKey = pluginName + QStringLiteral ( " Enabled " ) ;
pluginStates . writeEntry ( enabledKey , enabled ) ;
reloadPlugins ( ) ;
}
bool Device : : isPluginEnabled ( const QString & pluginName ) const
{
const QString enabledKey = pluginName + QStringLiteral ( " Enabled " ) ;
KConfigGroup pluginStates = KSharedConfig : : openConfig ( pluginsConfigFile ( ) ) - > group ( " Plugins " ) ;
return ( pluginStates . hasKey ( enabledKey ) ? pluginStates . readEntry ( enabledKey , false )
: PluginLoader : : instance ( ) - > getPluginInfo ( pluginName ) . isEnabledByDefault ( ) ) ;
}
2015-11-30 18:36:01 +00:00
QString Device : : encryptionInfo ( ) const
{
QString result ;
2015-12-01 15:25:34 +00:00
QString myCertificate = QString : : fromLatin1 ( KdeConnectConfig : : instance ( ) - > certificate ( ) . toDer ( ) ) ;
2015-11-30 18:36:01 +00:00
for ( int i = 2 ; i < myCertificate . size ( ) ; i + = 3 ) {
myCertificate . insert ( i , ' : ' ) ; // Improve readability
}
2015-12-01 15:25:34 +00:00
result + = i18n ( " SHA1 fingerprint of your device certificate is: " ) + myCertificate + " \n " ;
2015-11-30 18:36:01 +00:00
QString remoteCertificate = KdeConnectConfig : : instance ( ) - > getDeviceProperty ( id ( ) , " certificate " ) ;
for ( int i = 2 ; i < remoteCertificate . size ( ) ; i + = 3 ) {
remoteCertificate . insert ( i , ' : ' ) ; // Improve readability
}
2015-12-01 15:25:34 +00:00
result + = i18n ( " SHA1 fingerprint of remote device certificate is: " ) + remoteCertificate + " \n " ;
2015-11-30 18:36:01 +00:00
return result ;
}