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;