/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include "cmCPackGenerator.h" class cmGeneratedFileStream; class cmXMLWriter; /** \class cmCPackDragNDropGenerator * \brief A generator for OSX drag-n-drop installs */ class cmCPackDragNDropGenerator : public cmCPackGenerator { public: cmCPackTypeMacro(cmCPackDragNDropGenerator, cmCPackGenerator); cmCPackDragNDropGenerator(); ~cmCPackDragNDropGenerator() override; protected: int InitializeInternal() override; const char* GetOutputExtension() override; int PackageFiles() override; bool SupportsComponentInstallation() const override; bool CopyFile(std::ostringstream& source, std::ostringstream& target); bool CreateEmptyFile(std::ostringstream& target, size_t size); bool RunCommand(std::string const& command, std::string* output = nullptr); std::string GetComponentInstallSuffix( const std::string& componentName) override; std::string GetComponentInstallDirNameSuffix( const std::string& componentName) override; int CreateDMG(const std::string& src_dir, const std::string& output_file); private: std::string slaDirectory; bool singleLicense; struct RezDict { std::string Name; size_t ID; std::vector Data; }; struct RezArray { std::string Key; std::vector Entries; }; struct RezDoc { RezArray LPic = { "LPic", {} }; RezArray Menu = { "STR#", {} }; RezArray Text = { "TEXT", {} }; RezArray RTF = { "RTF ", {} }; }; void WriteRezXML(std::string const& file, RezDoc const& rez); void WriteRezArray(cmXMLWriter& xml, RezArray const& array); void WriteRezDict(cmXMLWriter& xml, RezDict const& dict); bool WriteLicense(RezDoc& rez, size_t licenseNumber, std::string licenseLanguage, const std::string& licenseFile, std::string* error); void EncodeLicense(RezDict& dict, std::vector const& lines); void EncodeMenu(RezDict& dict, std::vector const& lines); bool ReadFile(std::string const& file, std::vector& lines, std::string* error); bool BreakLongLine(const std::string& line, std::vector& lines, std::string* error); };