File indexing completed on 2024-05-12 17:07:25

0001 /*
0002     SPDX-FileCopyrightText: 2009 Ben Cooksley <ben@eclipse.endoftheinternet.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "ActionItem.h"
0008 #include "SolidActionData.h"
0009 
0010 #include <QString>
0011 
0012 #include <KConfigGroup>
0013 #include <KDesktopFile>
0014 #include <KDesktopFileActions>
0015 
0016 #include <Solid/DeviceInterface>
0017 
0018 ActionItem::ActionItem(const QString &pathToDesktop, const QString &action, QObject *parent)
0019     : desktopMasterPath(pathToDesktop)
0020     , actionName(action)
0021 {
0022     Q_UNUSED(parent);
0023 
0024     // Create the desktop file
0025     desktopFileMaster = new KDesktopFile(desktopMasterPath);
0026     desktopWritePath = desktopFileMaster->locateLocal(desktopMasterPath);
0027     desktopFileWrite = new KDesktopFile(desktopWritePath);
0028     // Now we can fill the action groups list
0029     configGroups.append(desktopFileMaster->desktopGroup());
0030     actionGroups.insert(ActionItem::GroupDesktop, &configGroups.last());
0031     configGroups.append(desktopFileMaster->actionGroup(actionName));
0032     actionGroups.insert(ActionItem::GroupAction, &configGroups.last());
0033     configGroups.append(desktopFileWrite->desktopGroup());
0034     actionGroups.insert(ActionItem::GroupDesktop, &configGroups.last());
0035     configGroups.append(desktopFileWrite->actionGroup(actionName));
0036     actionGroups.insert(ActionItem::GroupAction, &configGroups.last());
0037 
0038     const QString predicateString = readKey(ActionItem::GroupDesktop, QStringLiteral("X-KDE-Solid-Predicate"), QString());
0039     predicateItem = Solid::Predicate::fromString(predicateString);
0040 }
0041 
0042 ActionItem::~ActionItem()
0043 {
0044     delete desktopFileWrite;
0045     delete desktopFileMaster;
0046 }
0047 
0048 /// Public functions below
0049 
0050 bool ActionItem::isUserSupplied() const
0051 {
0052     return hasKey(ActionItem::GroupDesktop, QStringLiteral("X-KDE-Action-Custom"));
0053 }
0054 
0055 QString ActionItem::icon() const
0056 {
0057     return readKey(ActionItem::GroupAction, QStringLiteral("Icon"), QString());
0058 }
0059 
0060 QString ActionItem::exec() const
0061 {
0062     return readKey(ActionItem::GroupAction, QStringLiteral("Exec"), QString());
0063 }
0064 
0065 QString ActionItem::name() const
0066 {
0067     return readKey(ActionItem::GroupAction, QStringLiteral("Name"), QString());
0068 }
0069 
0070 Solid::Predicate ActionItem::predicate() const
0071 {
0072     return predicateItem;
0073 }
0074 
0075 QString ActionItem::involvedTypes() const
0076 {
0077     SolidActionData *actData = SolidActionData::instance();
0078     const QSet<Solid::DeviceInterface::Type> devTypeList = predicateItem.usedTypes();
0079     QStringList deviceTypes;
0080     for (Solid::DeviceInterface::Type devType : devTypeList) {
0081         deviceTypes << actData->nameFromInterface(devType);
0082     }
0083 
0084     return deviceTypes.join(QLatin1String(", "));
0085 }
0086 
0087 void ActionItem::setIcon(const QString &nameOfIcon)
0088 {
0089     setKey(ActionItem::GroupAction, QStringLiteral("Icon"), nameOfIcon);
0090 }
0091 
0092 void ActionItem::setName(const QString &nameOfAction)
0093 {
0094     setKey(ActionItem::GroupAction, QStringLiteral("Name"), nameOfAction);
0095 }
0096 
0097 void ActionItem::setExec(const QString &execUrl)
0098 {
0099     setKey(ActionItem::GroupAction, QStringLiteral("Exec"), execUrl);
0100 }
0101 
0102 void ActionItem::setPredicate(const QString &newPredicate)
0103 {
0104     setKey(ActionItem::GroupDesktop, QStringLiteral("X-KDE-Solid-Predicate"), newPredicate);
0105     predicateItem = Solid::Predicate::fromString(newPredicate);
0106 }
0107 
0108 /// Private functions below
0109 
0110 QString ActionItem::readKey(GroupType keyGroup, const QString &keyName, const QString &defaultValue) const
0111 {
0112     return configItem(ActionItem::DesktopRead, keyGroup, keyName)->readEntry(keyName, defaultValue);
0113 }
0114 
0115 void ActionItem::setKey(GroupType keyGroup, const QString &keyName, const QString &keyContents)
0116 {
0117     configItem(ActionItem::DesktopWrite, keyGroup)->writeEntry(keyName, keyContents);
0118 }
0119 
0120 bool ActionItem::hasKey(GroupType keyGroup, const QString &keyName) const
0121 {
0122     return configItem(ActionItem::DesktopRead, keyGroup, keyName)->hasKey(keyName);
0123 }
0124 
0125 KConfigGroup *ActionItem::configItem(DesktopAction actionType, GroupType keyGroup, const QString &keyName) const
0126 {
0127     int countAccess = 0;
0128 
0129     if (actionType == ActionItem::DesktopRead) {
0130         const auto values = actionGroups.values(keyGroup);
0131         for (KConfigGroup *possibleGroup : values) {
0132             if (possibleGroup->hasKey(keyName)) {
0133                 return possibleGroup;
0134             }
0135         }
0136     } else if (actionType == ActionItem::DesktopWrite) {
0137         if (isUserSupplied()) {
0138             countAccess = 1;
0139         }
0140         return actionGroups.values(keyGroup).at(countAccess);
0141     }
0142     return actionGroups.values(keyGroup).at(0); // Implement a backstop so a valid value is always returned
0143 }