File indexing completed on 2025-04-27 03:58:22

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2009-12-23
0007  * Description : Autodetect binary program and version
0008  *
0009  * SPDX-FileCopyrightText: 2009-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0010  * SPDX-FileCopyrightText: 2012-2016 by Benjamin Girault <benjamin dot girault at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #ifndef DIGIKAM_DBINARY_IFACE_H
0017 #define DIGIKAM_DBINARY_IFACE_H
0018 
0019 // Qt includes
0020 
0021 #include <QString>
0022 #include <QStringList>
0023 #include <QPushButton>
0024 #include <QLabel>
0025 #include <QLineEdit>
0026 #include <QSet>
0027 #include <QGridLayout>
0028 #include <QUrl>
0029 
0030 // Local includes
0031 
0032 #include "digikam_export.h"
0033 
0034 namespace Digikam
0035 {
0036 
0037 class DIGIKAM_EXPORT DBinaryIface : public QObject
0038 {
0039     Q_OBJECT
0040 
0041 public:
0042 
0043     DBinaryIface(const QString& binaryName,
0044                  const QString& projectName,
0045                  const QString& url,
0046                  const QString& pluginName,
0047                  const QStringList& args = QStringList(),
0048                  const QString& desc = QString()
0049                 );
0050     DBinaryIface(const QString& binaryName,
0051                  const QString& minimalVersion,
0052                  const QString& header,
0053                  const int headerLine,
0054                  const QString& projectName,
0055                  const QString& url,
0056                  const QString& pluginName,
0057                  const QStringList& args = QStringList(),
0058                  const QString& desc = QString()
0059                 );
0060     ~DBinaryIface() override;
0061 
0062 public:
0063 
0064     bool                isFound()                   const { return m_isFound;                       }
0065     const QString&      version()                   const;
0066     bool                versionIsRight()            const;
0067     bool                versionIsRight(const float) const;
0068     inline bool         isValid()                   const { return (m_isFound && versionIsRight()); }
0069     inline bool         hasError()                  const { return m_hasError;                      }
0070     inline bool         developmentVersion()        const { return m_developmentVersion;            }
0071     const QString&      description()               const { return m_description;                   }
0072 
0073     virtual void        setup(const QString& prev = QString());
0074     virtual bool        checkDir()                        { return checkDirForPath(m_pathDir);      }
0075     virtual bool        checkDirForPath(const QString& path);
0076     virtual bool        recheckDirectories();
0077 
0078     virtual QString     path(const QString& dir)    const;
0079     virtual QString     path()                      const { return path(m_pathDir);                 }
0080     virtual QString     directory()                 const { return m_pathDir;                       }
0081     virtual QString     baseName()                  const { return m_binaryBaseName;                }
0082     virtual QString     minimalVersion()            const { return m_minimalVersion;                }
0083 
0084 
0085     virtual QUrl        url()                       const { return m_url;                           }
0086     virtual QString     projectName()               const { return m_projectName;                   }
0087 
0088     static QString      goodBaseName(const QString& b);
0089 
0090 public Q_SLOTS:
0091 
0092     virtual void        slotNavigateAndCheck();
0093     virtual void        slotAddPossibleSearchDirectory(const QString& dir);
0094     virtual void        slotAddSearchDirectory(const QString& dir);
0095 
0096 Q_SIGNALS:
0097 
0098     void                signalSearchDirectoryAdded(const QString& dir);
0099     void                signalBinaryValid();
0100 
0101 protected:
0102 
0103     QString             findHeader(const QStringList& output, const QString& header) const;
0104     virtual bool        parseHeader(const QString& output);
0105     void                setVersion(QString& version);
0106 
0107     virtual QString     readConfig();
0108     virtual void        writeConfig();
0109 
0110 protected:
0111 
0112     const bool          m_checkVersion;
0113     const QString       m_headerStarts;
0114     const int           m_headerLine;
0115     const QString       m_minimalVersion;
0116     const QString       m_configGroup;
0117     const QString       m_binaryBaseName;
0118     const QStringList   m_binaryArguments;
0119     const QString       m_projectName;
0120     const QUrl          m_url;
0121 
0122     bool                m_isFound;
0123     bool                m_hasError;
0124     bool                m_developmentVersion;
0125 
0126     QString             m_version;
0127     QString             m_pathDir;
0128     QString             m_description;
0129 
0130     QFrame*             m_pathWidget;
0131     QLabel*             m_binaryLabel;
0132     QLabel*             m_versionLabel;
0133     QPushButton*        m_pathButton;
0134     QLabel*             m_downloadButton;
0135     QLineEdit*          m_lineEdit;
0136     QLabel*             m_statusIcon;
0137 
0138     QSet<QString>       m_searchPaths;
0139 
0140 private:
0141 
0142     // Disabled
0143     explicit DBinaryIface(QObject*);
0144 };
0145 
0146 } // namespace Digikam
0147 
0148 #endif // DIGIKAM_DBINARY_IFACE_H