// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include constexpr static auto defaultKeyStr = "default"; enum class ParseError { NoError, NotFound, MismatchedFile, InvalidLocation, OpenFailed, GroupHeaderInvalid, EntryKeyInvalid }; struct DesktopFile { DesktopFile(const DesktopFile &) = default; DesktopFile(DesktopFile &&) = default; DesktopFile &operator=(const DesktopFile &) = default; DesktopFile &operator=(DesktopFile &&) = default; ~DesktopFile() = default; const QString &filePath() const { return m_filePath; } const QString &desktopId() const { return m_desktopId; } static std::optional searchDesktopFile(const QString &desktopFilePath, ParseError &err) noexcept; private: DesktopFile(QString &&path, QString &&fileId) : m_filePath(std::move(path)) , m_desktopId(std::move(fileId)) { } QString m_filePath{""}; QString m_desktopId{""}; }; class DesktopEntry { public: class Value : public QMap { public: using QMap::QMap; QString toString(bool &ok) const noexcept; bool toBoolean(bool &ok) const noexcept; QString toIconString(bool &ok) const noexcept; float toNumeric(bool &ok) const noexcept; QString toLocaleString(const QLocale &locale, bool &ok) const noexcept; friend QDebug operator<<(QDebug debug, const DesktopEntry::Value &v); private: [[nodiscard]] QString unescape(const QString &str) const noexcept; }; DesktopEntry() = default; ~DesktopEntry() = default; [[nodiscard]] ParseError parse(const DesktopFile &file) noexcept; [[nodiscard]] ParseError parse(QTextStream &stream) noexcept; [[nodiscard]] std::optional> group(const QString &key) const noexcept; [[nodiscard]] std::optional value(const QString &key, const QString &valueKey) const noexcept; private: QMap> m_entryMap; auto parserGroupHeader(const QString &str) noexcept; ParseError parseEntry(const QString &str, decltype(m_entryMap)::iterator ¤tGroup) noexcept; }; QDebug operator<<(QDebug debug, const DesktopEntry::Value &v); QDebug operator<<(QDebug debug, const ParseError &v);