File indexing completed on 2024-05-12 04:50:47
0001 /* 0002 This file is part of KDSingleApplication. 0003 0004 SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com> 0005 0006 SPDX-License-Identifier: MIT 0007 0008 Contact KDAB at <info@kdab.com> for commercial licensing options. 0009 */ 0010 0011 #include "kdsingleapplication.h" 0012 0013 #include <QtCore/QCoreApplication> 0014 #include <QtCore/QFileInfo> 0015 0016 // TODO: make this pluggable. 0017 #include "kdsingleapplication_localsocket_p.h" 0018 0019 // Avoiding dragging in Qt private APIs for now, so this does not inherit 0020 // from QObjectPrivate. 0021 class KDSingleApplicationPrivate 0022 { 0023 public: 0024 explicit KDSingleApplicationPrivate(const QString &name, KDSingleApplication *q); 0025 0026 QString name() const 0027 { 0028 return m_name; 0029 } 0030 0031 bool isPrimaryInstance() const 0032 { 0033 return m_impl.isPrimaryInstance(); 0034 } 0035 0036 bool sendMessage(const QByteArray &message, int timeout) 0037 { 0038 return m_impl.sendMessage(message, timeout); 0039 } 0040 0041 private: 0042 Q_DECLARE_PUBLIC(KDSingleApplication) 0043 0044 KDSingleApplication *q_ptr; 0045 QString m_name; 0046 0047 KDSingleApplicationLocalSocket m_impl; 0048 }; 0049 0050 KDSingleApplicationPrivate::KDSingleApplicationPrivate(const QString &name, KDSingleApplication *q) 0051 : q_ptr(q) 0052 , m_name(name) 0053 , m_impl(name) 0054 { 0055 if (Q_UNLIKELY(name.isEmpty())) 0056 qFatal("KDSingleApplication requires a non-empty application name"); 0057 0058 if (isPrimaryInstance()) { 0059 QObject::connect(&m_impl, &KDSingleApplicationLocalSocket::messageReceived, 0060 q, &KDSingleApplication::messageReceived); 0061 } 0062 } 0063 0064 static QString extractExecutableName(const QString &applicationFilePath) 0065 { 0066 return QFileInfo(applicationFilePath).fileName(); 0067 } 0068 0069 KDSingleApplication::KDSingleApplication(QObject *parent) 0070 : KDSingleApplication(extractExecutableName(QCoreApplication::applicationFilePath()), parent) 0071 { 0072 } 0073 0074 KDSingleApplication::KDSingleApplication(const QString &name, QObject *parent) 0075 : QObject(parent) 0076 , d_ptr(new KDSingleApplicationPrivate(name, this)) 0077 { 0078 } 0079 0080 QString KDSingleApplication::name() const 0081 { 0082 Q_D(const KDSingleApplication); 0083 return d->name(); 0084 } 0085 0086 bool KDSingleApplication::isPrimaryInstance() const 0087 { 0088 Q_D(const KDSingleApplication); 0089 return d->isPrimaryInstance(); 0090 } 0091 0092 bool KDSingleApplication::sendMessage(const QByteArray &message) 0093 { 0094 return sendMessageWithTimeout(message, 5000); 0095 } 0096 0097 bool KDSingleApplication::sendMessageWithTimeout(const QByteArray &message, int timeout) 0098 { 0099 Q_ASSERT(!isPrimaryInstance()); 0100 0101 Q_D(KDSingleApplication); 0102 return d->sendMessage(message, timeout); 0103 } 0104 0105 0106 KDSingleApplication::~KDSingleApplication() = default;