2015-02-24 06:12:45 +00:00
/**
2020-08-17 10:48:10 +01:00
* SPDX - FileCopyrightText : 2014 Yuri Samoilenko < kinnalru @ gmail . com >
2015-02-24 06:12:45 +00:00
*
2020-08-17 10:48:10 +01:00
* SPDX - License - Identifier : GPL - 2.0 - only OR GPL - 3.0 - only OR LicenseRef - KDE - Accepted - GPL
2015-02-24 06:12:45 +00:00
*/
# include <QApplication>
2015-05-04 23:41:39 +01:00
# include <QNetworkAccessManager>
2017-01-03 21:13:02 +00:00
# include <QTimer>
2019-04-27 22:03:24 +01:00
# include <QCommandLineOption>
# include <QCommandLineParser>
# include <QDBusMessage>
2019-06-02 15:01:42 +01:00
# include <QSessionManager>
2019-08-19 19:57:45 +01:00
# include <QStandardPaths>
# include <QIcon>
2020-01-17 00:33:03 +00:00
# include <QProcess>
2015-02-24 06:12:45 +00:00
2019-01-25 21:32:34 +00:00
# include <KAboutData>
2015-02-24 06:12:45 +00:00
# include <KDBusService>
2015-03-24 11:26:37 +00:00
# include <KNotification>
# include <KLocalizedString>
2015-05-04 23:41:39 +01:00
# include <KIO/AccessManager>
2015-02-24 06:12:45 +00:00
2019-06-09 16:28:49 +01:00
# include <dbushelper.h>
2015-02-24 06:12:45 +00:00
# include "core/daemon.h"
2015-03-24 11:26:37 +00:00
# include "core/device.h"
2015-12-01 18:45:14 +00:00
# include "core/backends/pairinghandler.h"
2015-03-10 04:59:36 +00:00
# include "kdeconnect-version.h"
2020-05-26 17:55:47 +01:00
# include "kdeconnectd_debug.h"
2019-03-11 12:37:15 +00:00
2015-03-24 11:26:37 +00:00
class DesktopDaemon : public Daemon
{
Q_OBJECT
2015-04-29 01:25:49 +01:00
Q_CLASSINFO ( " D-Bus Interface " , " org.kde.kdeconnect.daemon " )
2015-03-24 11:26:37 +00:00
public :
2019-05-05 14:45:50 +01:00
DesktopDaemon ( QObject * parent = nullptr )
2015-03-24 11:26:37 +00:00
: Daemon ( parent )
2019-05-05 14:45:50 +01:00
, m_nam ( nullptr )
2019-08-19 19:57:45 +01:00
{
2021-06-13 01:00:15 +01:00
qApp - > setWindowIcon ( QIcon ( QStringLiteral ( " :/icons/kdeconnect/kdeconnect.svg " ) ) ) ;
2019-08-19 19:57:45 +01:00
}
2015-03-24 11:26:37 +00:00
2017-01-24 23:22:22 +00:00
void askPairingConfirmation ( Device * device ) override
2015-03-24 11:26:37 +00:00
{
2019-11-27 20:39:44 +00:00
KNotification * notification = new KNotification ( QStringLiteral ( " pairingRequest " ) , KNotification : : NotificationFlag : : Persistent ) ;
2020-01-05 15:31:06 +00:00
QTimer : : singleShot ( PairingHandler : : pairingTimeoutMsec ( ) , notification , & KNotification : : close ) ;
2015-03-24 11:26:37 +00:00
notification - > setIconName ( QStringLiteral ( " dialog-information " ) ) ;
2016-11-26 14:38:08 +00:00
notification - > setComponentName ( QStringLiteral ( " kdeconnect " ) ) ;
2019-09-30 21:53:46 +01:00
notification - > setTitle ( QStringLiteral ( " KDE Connect " ) ) ;
2021-03-18 21:03:47 +00:00
notification - > setText ( i18n ( " Pairing request from %1 \n Key: %2... " , device - > name ( ) . toHtmlEscaped ( ) , QString : : fromUtf8 ( device - > verificationKey ( ) . left ( 8 ) ) ) ) ;
2020-01-17 00:33:03 +00:00
notification - > setDefaultAction ( i18n ( " Open " ) ) ;
2020-11-26 10:28:32 +00:00
notification - > setActions ( QStringList ( ) < < i18n ( " Accept " ) < < i18n ( " Reject " ) < < i18n ( " View key " ) ) ;
2017-01-24 23:22:22 +00:00
connect ( notification , & KNotification : : action1Activated , device , & Device : : acceptPairing ) ;
connect ( notification , & KNotification : : action2Activated , device , & Device : : rejectPairing ) ;
2020-11-26 10:28:32 +00:00
QString deviceId = device - > id ( ) ;
auto openSettings = [ this , deviceId ] {
openConfiguration ( deviceId ) ;
} ;
connect ( notification , & KNotification : : action3Activated , openSettings ) ;
connect ( notification , QOverload < > : : of ( & KNotification : : activated ) , openSettings ) ;
2015-03-24 11:26:37 +00:00
notification - > sendEvent ( ) ;
}
2016-06-20 08:05:02 +01:00
void reportError ( const QString & title , const QString & description ) override
2015-03-24 11:26:37 +00:00
{
2019-05-08 22:05:38 +01:00
qCWarning ( KDECONNECT_DAEMON ) < < title < < " : " < < description ;
2015-03-24 11:26:37 +00:00
KNotification : : event ( KNotification : : Error , title , description ) ;
}
2015-05-04 23:41:39 +01:00
2016-06-20 08:05:02 +01:00
QNetworkAccessManager * networkAccessManager ( ) override
2015-05-04 23:41:39 +01:00
{
if ( ! m_nam ) {
m_nam = new KIO : : AccessManager ( this ) ;
}
return m_nam ;
}
2019-10-27 19:35:18 +00:00
KJobTrackerInterface * jobTracker ( ) override
{
return KIO : : getJobTracker ( ) ;
}
2018-03-18 11:42:15 +00:00
Q_SCRIPTABLE void sendSimpleNotification ( const QString & eventId , const QString & title , const QString & text , const QString & iconName ) override
{
KNotification * notification = new KNotification ( eventId ) ; //KNotification::Persistent
notification - > setIconName ( iconName ) ;
notification - > setComponentName ( QStringLiteral ( " kdeconnect " ) ) ;
notification - > setTitle ( title ) ;
notification - > setText ( text ) ;
notification - > sendEvent ( ) ;
}
2019-03-11 12:37:15 +00:00
void quit ( ) override {
QApplication : : quit ( ) ;
}
2018-03-18 11:42:15 +00:00
2015-05-04 23:41:39 +01:00
private :
QNetworkAccessManager * m_nam ;
2015-03-24 11:26:37 +00:00
} ;
2019-07-19 16:12:49 +01:00
// Copied from plasma-workspace/libkworkspace/kworkspace.cpp
static void detectPlatform ( int argc , char * * argv )
{
if ( qEnvironmentVariableIsSet ( " QT_QPA_PLATFORM " ) ) {
return ;
}
for ( int i = 0 ; i < argc ; i + + ) {
if ( qstrcmp ( argv [ i ] , " -platform " ) = = 0 | |
qstrcmp ( argv [ i ] , " --platform " ) = = 0 | |
QByteArray ( argv [ i ] ) . startsWith ( " -platform= " ) | |
QByteArray ( argv [ i ] ) . startsWith ( " --platform= " ) ) {
return ;
}
}
const QByteArray sessionType = qgetenv ( " XDG_SESSION_TYPE " ) ;
if ( sessionType . isEmpty ( ) ) {
return ;
}
if ( qstrcmp ( sessionType , " wayland " ) = = 0 ) {
qputenv ( " QT_QPA_PLATFORM " , " wayland " ) ;
} else if ( qstrcmp ( sessionType , " x11 " ) = = 0 ) {
qputenv ( " QT_QPA_PLATFORM " , " xcb " ) ;
}
}
2015-02-24 06:12:45 +00:00
int main ( int argc , char * argv [ ] )
{
2019-08-18 16:26:16 +01:00
detectPlatform ( argc , argv ) ;
2019-07-19 16:12:49 +01:00
2015-02-24 06:12:45 +00:00
QApplication app ( argc , argv ) ;
2021-01-29 15:04:51 +00:00
app . setAttribute ( Qt : : AA_UseHighDpiPixmaps , true ) ;
2019-01-25 21:32:34 +00:00
KAboutData aboutData (
2019-06-20 15:48:35 +01:00
QStringLiteral ( " kdeconnect.daemon " ) ,
2019-01-25 21:32:34 +00:00
i18n ( " KDE Connect Daemon " ) ,
QStringLiteral ( KDECONNECT_VERSION_STRING ) ,
i18n ( " KDE Connect Daemon " ) ,
KAboutLicense : : GPL
) ;
KAboutData : : setApplicationData ( aboutData ) ;
2015-02-24 06:12:45 +00:00
app . setQuitOnLastWindowClosed ( false ) ;
2019-06-18 02:21:31 +01:00
# ifdef USE_PRIVATE_DBUS
2019-08-14 16:36:19 +01:00
DBusHelper : : launchDBusDaemon ( ) ;
2019-06-18 02:21:31 +01:00
# endif
2019-04-27 22:03:24 +01:00
QCommandLineParser parser ;
QCommandLineOption replaceOption ( { QStringLiteral ( " replace " ) } , i18n ( " Replace an existing instance " ) ) ;
parser . addOption ( replaceOption ) ;
aboutData . setupCommandLine ( & parser ) ;
parser . process ( app ) ;
aboutData . processCommandLine ( & parser ) ;
if ( parser . isSet ( replaceOption ) ) {
2019-07-20 18:53:17 +01:00
auto message = QDBusMessage : : createMethodCall ( QStringLiteral ( " org.kde.kdeconnect " ) ,
2019-04-27 22:03:24 +01:00
QStringLiteral ( " /MainApplication " ) ,
QStringLiteral ( " org.qtproject.Qt.QCoreApplication " ) ,
QStringLiteral ( " quit " ) ) ;
2019-08-14 16:36:19 +01:00
DBusHelper : : sessionBus ( ) . call ( message ) ; //deliberately block until it's done, so we register the name after the app quits
2019-04-27 22:03:24 +01:00
}
2015-02-24 06:12:45 +00:00
KDBusService dbusService ( KDBusService : : Unique ) ;
2019-05-05 13:58:11 +01:00
DesktopDaemon daemon ;
2016-06-15 19:37:42 +01:00
2021-06-15 09:05:00 +01:00
# ifdef Q_OS_WIN
// make sure indicator shows up in the tray whenever daemon is spawned
QProcess : : startDetached ( QStringLiteral ( " kdeconnect-indicator.exe " ) ) ;
# endif
2019-06-02 15:01:42 +01:00
// kdeconnectd is autostarted, so disable session management to speed up startup
auto disableSessionManagement = [ ] ( QSessionManager & sm ) {
sm . setRestartHint ( QSessionManager : : RestartNever ) ;
} ;
QObject : : connect ( & app , & QGuiApplication : : commitDataRequest , disableSessionManagement ) ;
QObject : : connect ( & app , & QGuiApplication : : saveStateRequest , disableSessionManagement ) ;
2015-02-24 06:12:45 +00:00
return app . exec ( ) ;
}
2015-03-24 11:26:37 +00:00
# include "kdeconnectd.moc"