File indexing completed on 2024-04-14 04:31:19

0001 /* This file is part of KDevelop
0002    Copyright 2017 Anton Anikin <anton@anikin.xyz>
0003 
0004    This program is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU General Public
0006    License as published by the Free Software Foundation; either
0007    version 2 of the License, or (at your option) any later version.
0008 
0009    This program is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0012    General Public License for more details.
0013 
0014    You should have received a copy of the GNU General Public License
0015    along with this program; see the file COPYING. If not, write to
0016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017    Boston, MA 02110-1301, USA.
0018 */
0019 
0020 #include "config.h"
0021 
0022 #include "debug.h"
0023 
0024 #include <qtcompat_p.h>
0025 
0026 #include <KShell>
0027 
0028 namespace Valgrind
0029 {
0030 
0031 class Config::CmdItem
0032 {
0033 public:
0034     CmdItem(ItemInt* item, const QString& cmdName)
0035         : CmdItem(static_cast<KConfigSkeletonItem*>(item), cmdName)
0036     {
0037         m_type = Int;
0038     }
0039 
0040     CmdItem(ItemBool* item, const QString& cmdName)
0041         : CmdItem(static_cast<KConfigSkeletonItem*>(item), cmdName)
0042     {
0043         m_type = Bool;
0044     }
0045 
0046     CmdItem(ItemDouble* item, const QString& cmdName)
0047         : CmdItem(static_cast<KConfigSkeletonItem*>(item), cmdName)
0048     {
0049         m_type = Double;
0050     }
0051 
0052     CmdItem(ItemString* item, const QString& cmdName)
0053         : CmdItem(static_cast<KConfigSkeletonItem*>(item), cmdName)
0054     {
0055         m_type = String;
0056     }
0057 
0058     ~CmdItem() = default;
0059 
0060     QString cmdArg()
0061     {
0062         QString value;
0063 
0064         switch (m_type) {
0065             case Int:
0066                 value = QString::number(m_item->property().toInt());
0067                 break;
0068 
0069             case Bool:
0070                 value = m_item->property().toBool() ? QStringLiteral("yes") : QStringLiteral("no");
0071                 break;
0072 
0073             case Double:
0074                 value = QString::number(m_item->property().toDouble(), 'f', 1);
0075                 break;
0076 
0077             case String:
0078                 value = m_item->property().toString();
0079                 break;
0080         }
0081 
0082         return QStringLiteral("--%1=%2").arg(m_cmdName, value);
0083     }
0084 
0085 private:
0086     CmdItem(KConfigSkeletonItem* item, const QString& cmdName)
0087         : m_item(item)
0088         , m_cmdName(cmdName)
0089     {
0090         Q_ASSERT(item);
0091         Q_ASSERT(!cmdName.isEmpty());
0092     }
0093 
0094     enum Type
0095     {
0096         Int,
0097         Bool,
0098         Double,
0099         String
0100     };
0101 
0102     KConfigSkeletonItem* m_item;
0103     QString m_cmdName;
0104     Type m_type;
0105 };
0106 
0107 Config::Config(const QString& group)
0108     : m_group(group)
0109 {
0110     setCurrentGroup(group);
0111 
0112     addItemString(QStringLiteral("extraArgs"), m_extraArgs);
0113 }
0114 
0115 Config::~Config()
0116 {
0117     qDeleteAll(m_cmdItems);
0118 }
0119 
0120 inline void addParent(QString& fullName, const KConfigGroup& parent)
0121 {
0122     fullName = parent.name() + QLatin1Char('\x1d') + fullName;
0123 }
0124 
0125 // TODO create patch for KCoreConfigSkeleton::setCurrentGroup(const KConfigGroup& group) overload ?
0126 void Config::setConfigGroup(const KConfigGroup& group)
0127 {
0128     setSharedConfig(KSharedConfig::openConfig(group.config()->name(), group.config()->openFlags()));
0129 
0130     QString fullName(m_group);
0131     addParent(fullName, group);
0132 
0133     KConfigGroup parentGroup = group.parent();
0134     while (parentGroup.isValid() && parentGroup.name() != QStringLiteral("<default>")) {
0135         addParent(fullName, parentGroup);
0136         parentGroup = parentGroup.parent();
0137     }
0138 
0139     setCurrentGroup(fullName);
0140 
0141     const auto allItems = items();
0142     for (auto item : allItems) {
0143         item->setGroup(fullName);
0144     }
0145 }
0146 
0147 QStringList Config::cmdArgs()
0148 {
0149     QStringList args;
0150     for (auto cmdItem : qAsConst(m_cmdItems)) {
0151         args += cmdItem->cmdArg();
0152     }
0153     args += KShell::splitArgs(m_extraArgs);
0154     args.removeAll(QStringLiteral(""));
0155 
0156     return args;
0157 }
0158 
0159 Config::ItemInt* Config::addCmdItemInt(const QString& name, int& reference, int defaultValue, const QString& cmdName)
0160 {
0161     auto item = addItemInt(name, reference, defaultValue);
0162     m_cmdItems += new CmdItem(item, cmdName);
0163     return item;
0164 }
0165 
0166 Config::ItemBool* Config::addCmdItemBool(const QString& name, bool& reference, bool defaultValue, const QString& cmdName)
0167 {
0168     auto item = addItemBool(name, reference, defaultValue);
0169     m_cmdItems += new CmdItem(item, cmdName);
0170     return item;
0171 }
0172 
0173 Config::ItemDouble* Config::addCmdItemDouble(const QString& name, double& reference, double defaultValue, const QString& cmdName)
0174 {
0175     auto item = addItemDouble(name, reference, defaultValue);
0176     m_cmdItems += new CmdItem(item, cmdName);
0177     return item;
0178 }
0179 
0180 Config::ItemString* Config::addCmdItemString(const QString& name, QString& reference, const QString& defaultValue, const QString& cmdName)
0181 {
0182     auto item = addItemString(name, reference, defaultValue);
0183     m_cmdItems += new CmdItem(item, cmdName);
0184     return item;
0185 }
0186 
0187 }