| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmCPackIFWRepository.h" |
| |
| #include <cstddef> |
| |
| #include "cmCPackIFWGenerator.h" |
| #include "cmGeneratedFileStream.h" |
| #include "cmSystemTools.h" |
| #include "cmValue.h" |
| #include "cmXMLParser.h" |
| #include "cmXMLWriter.h" |
| |
| cmCPackIFWRepository::cmCPackIFWRepository() |
| : Update(cmCPackIFWRepository::None) |
| { |
| } |
| |
| bool cmCPackIFWRepository::IsValid() const |
| { |
| bool valid = true; |
| |
| switch (this->Update) { |
| case cmCPackIFWRepository::None: |
| case cmCPackIFWRepository::Add: |
| case cmCPackIFWRepository::Remove: |
| valid = !this->Url.empty(); |
| break; |
| case cmCPackIFWRepository::Replace: |
| valid = !this->OldUrl.empty() && !this->NewUrl.empty(); |
| break; |
| } |
| |
| return valid; |
| } |
| |
| bool cmCPackIFWRepository::ConfigureFromOptions() |
| { |
| // Name; |
| if (this->Name.empty()) { |
| return false; |
| } |
| |
| std::string prefix = |
| "CPACK_IFW_REPOSITORY_" + cmsys::SystemTools::UpperCase(this->Name) + "_"; |
| |
| // Update |
| if (this->IsOn(prefix + "ADD")) { |
| this->Update = cmCPackIFWRepository::Add; |
| } else if (this->IsOn(prefix + "REMOVE")) { |
| this->Update = cmCPackIFWRepository::Remove; |
| } else if (this->IsOn(prefix + "REPLACE")) { |
| this->Update = cmCPackIFWRepository::Replace; |
| } else { |
| this->Update = cmCPackIFWRepository::None; |
| } |
| |
| // Url |
| if (cmValue url = this->GetOption(prefix + "URL")) { |
| this->Url = *url; |
| } else { |
| this->Url.clear(); |
| } |
| |
| // Old url |
| if (cmValue oldUrl = this->GetOption(prefix + "OLD_URL")) { |
| this->OldUrl = *oldUrl; |
| } else { |
| this->OldUrl.clear(); |
| } |
| |
| // New url |
| if (cmValue newUrl = this->GetOption(prefix + "NEW_URL")) { |
| this->NewUrl = *newUrl; |
| } else { |
| this->NewUrl.clear(); |
| } |
| |
| // Enabled |
| if (this->IsOn(prefix + "DISABLED")) { |
| this->Enabled = "0"; |
| } else { |
| this->Enabled.clear(); |
| } |
| |
| // Username |
| if (cmValue username = this->GetOption(prefix + "USERNAME")) { |
| this->Username = *username; |
| } else { |
| this->Username.clear(); |
| } |
| |
| // Password |
| if (cmValue password = this->GetOption(prefix + "PASSWORD")) { |
| this->Password = *password; |
| } else { |
| this->Password.clear(); |
| } |
| |
| // DisplayName |
| if (cmValue displayName = this->GetOption(prefix + "DISPLAY_NAME")) { |
| this->DisplayName = *displayName; |
| } else { |
| this->DisplayName.clear(); |
| } |
| |
| return this->IsValid(); |
| } |
| |
| /** \class cmCPackeIFWUpdatesPatcher |
| * \brief Helper class that parses and patch Updates.xml file (QtIFW) |
| */ |
| class cmCPackeIFWUpdatesPatcher : public cmXMLParser |
| { |
| public: |
| cmCPackeIFWUpdatesPatcher(cmCPackIFWRepository* r, cmXMLWriter& x) |
| : repository(r) |
| , xout(x) |
| , patched(false) |
| { |
| } |
| |
| cmCPackIFWRepository* repository; |
| cmXMLWriter& xout; |
| bool patched; |
| |
| protected: |
| void StartElement(const std::string& name, const char** atts) override |
| { |
| this->xout.StartElement(name); |
| this->StartFragment(atts); |
| } |
| |
| void StartFragment(const char** atts) |
| { |
| for (size_t i = 0; atts[i]; i += 2) { |
| const char* key = atts[i]; |
| const char* value = atts[i + 1]; |
| this->xout.Attribute(key, value); |
| } |
| } |
| |
| void EndElement(const std::string& name) override |
| { |
| if (name == "Updates" && !this->patched) { |
| this->repository->WriteRepositoryUpdates(this->xout); |
| this->patched = true; |
| } |
| this->xout.EndElement(); |
| if (this->patched) { |
| return; |
| } |
| if (name == "Checksum") { |
| this->repository->WriteRepositoryUpdates(this->xout); |
| this->patched = true; |
| } |
| } |
| |
| void CharacterDataHandler(const char* data, int length) override |
| { |
| std::string content(data, data + length); |
| if (content.empty() || content == " " || content == " " || |
| content == "\n") { |
| return; |
| } |
| this->xout.Content(content); |
| } |
| }; |
| |
| bool cmCPackIFWRepository::PatchUpdatesXml() |
| { |
| // Lazy directory initialization |
| if (this->Directory.empty() && this->Generator) { |
| this->Directory = this->Generator->toplevel; |
| } |
| |
| // Filenames |
| std::string updatesXml = this->Directory + "/repository/Updates.xml"; |
| std::string updatesPatchXml = |
| this->Directory + "/repository/UpdatesPatch.xml"; |
| |
| // Output stream |
| cmGeneratedFileStream fout(updatesPatchXml); |
| cmXMLWriter xout(fout); |
| |
| xout.StartDocument(); |
| |
| this->WriteGeneratedByToStrim(xout); |
| |
| // Patch |
| { |
| cmCPackeIFWUpdatesPatcher patcher(this, xout); |
| patcher.ParseFile(updatesXml.data()); |
| } |
| |
| xout.EndDocument(); |
| |
| fout.Close(); |
| |
| return cmSystemTools::RenameFile(updatesPatchXml, updatesXml); |
| } |
| |
| void cmCPackIFWRepository::WriteRepositoryConfig(cmXMLWriter& xout) const |
| { |
| xout.StartElement("Repository"); |
| |
| // Url |
| xout.Element("Url", this->Url); |
| // Enabled |
| if (!this->Enabled.empty()) { |
| xout.Element("Enabled", this->Enabled); |
| } |
| // Username |
| if (!this->Username.empty()) { |
| xout.Element("Username", this->Username); |
| } |
| // Password |
| if (!this->Password.empty()) { |
| xout.Element("Password", this->Password); |
| } |
| // DisplayName |
| if (!this->DisplayName.empty()) { |
| xout.Element("DisplayName", this->DisplayName); |
| } |
| |
| xout.EndElement(); |
| } |
| |
| void cmCPackIFWRepository::WriteRepositoryUpdate(cmXMLWriter& xout) const |
| { |
| xout.StartElement("Repository"); |
| |
| switch (this->Update) { |
| case cmCPackIFWRepository::None: |
| break; |
| case cmCPackIFWRepository::Add: |
| xout.Attribute("action", "add"); |
| break; |
| case cmCPackIFWRepository::Remove: |
| xout.Attribute("action", "remove"); |
| break; |
| case cmCPackIFWRepository::Replace: |
| xout.Attribute("action", "replace"); |
| break; |
| } |
| |
| // Url |
| if (this->Update == cmCPackIFWRepository::Add || |
| this->Update == cmCPackIFWRepository::Remove) { |
| xout.Attribute("url", this->Url); |
| } else if (this->Update == cmCPackIFWRepository::Replace) { |
| xout.Attribute("oldUrl", this->OldUrl); |
| xout.Attribute("newUrl", this->NewUrl); |
| } |
| // Enabled |
| if (!this->Enabled.empty()) { |
| xout.Attribute("enabled", this->Enabled); |
| } |
| // Username |
| if (!this->Username.empty()) { |
| xout.Attribute("username", this->Username); |
| } |
| // Password |
| if (!this->Password.empty()) { |
| xout.Attribute("password", this->Password); |
| } |
| // DisplayName |
| if (!this->DisplayName.empty()) { |
| xout.Attribute("displayname", this->DisplayName); |
| } |
| |
| xout.EndElement(); |
| } |
| |
| void cmCPackIFWRepository::WriteRepositoryUpdates(cmXMLWriter& xout) |
| { |
| if (!this->RepositoryUpdate.empty()) { |
| xout.StartElement("RepositoryUpdate"); |
| for (cmCPackIFWRepository* r : this->RepositoryUpdate) { |
| r->WriteRepositoryUpdate(xout); |
| } |
| xout.EndElement(); |
| } |
| } |