MatN work for versatile appimage creation for all types of os
[goodguy/cinelerra.git] / cinelerra-5.1 / tools / makeappimagetool / includes / desktopfile.h
diff --git a/cinelerra-5.1/tools/makeappimagetool/includes/desktopfile.h b/cinelerra-5.1/tools/makeappimagetool/includes/desktopfile.h
new file mode 100644 (file)
index 0000000..455dfed
--- /dev/null
@@ -0,0 +1,117 @@
+// system includes
+#include <unordered_map>
+
+// local includes
+#include "desktopfileentry.h"
+
+#pragma once
+
+namespace linuxdeploy {
+    namespace desktopfile {
+        /*
+         * Parse and read desktop files.
+         */
+        class DesktopFile {
+        public:
+            // describes a single section
+            typedef std::unordered_map<std::string, DesktopFileEntry> section_t;
+
+            // describes all sections in the desktop file
+            typedef std::unordered_map<std::string, section_t> sections_t;
+
+        private:
+                // private data class pattern
+                class PrivateData;
+                std::shared_ptr<PrivateData> d;
+
+                // (in)equality operators are implemented outside this class
+                friend bool operator==(const DesktopFile& first, const DesktopFile& second);
+                friend bool operator!=(const DesktopFile& first, const DesktopFile& second);
+
+            public:
+                // default constructor
+                DesktopFile();
+
+                // construct from existing desktop file
+                // if the file exists, it will be read using DesktopFileReader
+                // if reading fails, exceptions will be thrown (see DesktopFileReader for more information)
+                explicit DesktopFile(const std::string& path);
+
+                // construct by reading an existing stream
+                // file must exist, otherwise std::runtime_error is thrown
+                explicit DesktopFile(std::istream& is);
+
+                // copy constructor
+                DesktopFile(const DesktopFile& other);
+
+                // copy assignment constructor
+                DesktopFile& operator=(const DesktopFile& other);
+
+                // move assignment operator
+                DesktopFile& operator=(DesktopFile&& other) noexcept;
+
+        public:
+                // returns true if a file has been loaded, false otherwise
+                bool isEmpty() const;
+
+                // read desktop file
+                // sets path associated with this file
+                // throws exceptions in case of issues, see DesktopFileReader for more information
+                void read(const std::string& path);
+
+                // read desktop file from existing stream
+                // throws exceptions in case of issues, see DesktopFileReader for more information
+                void read(std::istream& is);
+
+                // get path associated with this file
+                std::string path() const;
+
+                // sets the path associated with this desktop file
+                // used to e.g., save the desktop file
+                void setPath(const std::string& path);
+
+                // clear contents of desktop file
+                void clear();
+
+                // save desktop file
+                bool save() const;
+
+                // save desktop file to path
+                // does not change path associated with desktop file
+                // throws exceptions in case of errors, see DesktopFileWriter::save(...) for more information
+                bool save(const std::string& path) const;
+
+                // save desktop file to ostream
+                // does not change path associated with desktop file
+                // throws exceptions in case of errors, see DesktopFileWriter::save(...) for more information
+                bool save(std::ostream& os) const;
+
+                // check if entry exists in given section and key
+                bool entryExists(const std::string& section, const std::string& key) const;
+
+                // get key from desktop file
+                // an std::string passed as value parameter will be populated with the contents
+                // returns true (and populates value) if the key exists, false otherwise
+                bool getEntry(const std::string& section, const std::string& key, DesktopFileEntry& value) const;
+
+                // add key to section in desktop file
+                // the section will be created if it doesn't exist already
+                // returns true if an existing key was overwritten, false otherwise
+                bool setEntry(const std::string& section, const DesktopFileEntry& entry);
+
+                // add key to section in desktop file
+                // the section will be created if it doesn't exist already
+                // returns true if an existing key was overwritten, false otherwise
+                bool setEntry(const std::string& section, DesktopFileEntry&& entry);
+
+                // validate desktop file
+                bool validate() const;
+        };
+
+        // DesktopFile equality operator
+        bool operator==(const DesktopFile& first, const DesktopFile& second);
+
+        // DesktopFile inequality operator
+        bool operator!=(const DesktopFile& first, const DesktopFile& second);
+    }
+}
\ No newline at end of file