| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 |
- /*============================================================================
- CMake - Cross Platform Makefile Generator
- Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
- Distributed under the OSI-approved BSD License (the "License");
- see accompanying file Copyright.txt for details.
- This software is distributed WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the License for more information.
- ============================================================================*/
- #include "cmCPackIFWInstaller.h"
- #include "cmCPackIFWGenerator.h"
- #include <CPack/cmCPackLog.h>
- #include <cmGeneratedFileStream.h>
- #include <cmXMLWriter.h>
- #ifdef cmCPackLogger
- # undef cmCPackLogger
- #endif
- #define cmCPackLogger(logType, msg) \
- do { \
- std::ostringstream cmCPackLog_msg; \
- cmCPackLog_msg << msg; \
- if(Generator) { \
- Generator->Logger->Log(logType, __FILE__, __LINE__, \
- cmCPackLog_msg.str().c_str()); \
- } \
- } while ( 0 )
- //----------------------------------------------------------------------------
- cmCPackIFWInstaller::cmCPackIFWInstaller() :
- Generator(0)
- {
- }
- //----------------------------------------------------------------------------
- const char *cmCPackIFWInstaller::GetOption(const std::string &op) const
- {
- return Generator ? Generator->GetOption(op) : 0;
- }
- //----------------------------------------------------------------------------
- bool cmCPackIFWInstaller::IsOn(const std::string &op) const
- {
- return Generator ? Generator->IsOn(op) : false;
- }
- //----------------------------------------------------------------------------
- bool cmCPackIFWInstaller::IsVersionLess(const char *version)
- {
- return Generator ? Generator->IsVersionLess(version) : false;
- }
- //----------------------------------------------------------------------------
- bool cmCPackIFWInstaller::IsVersionGreater(const char *version)
- {
- return Generator ? Generator->IsVersionGreater(version) : false;
- }
- //----------------------------------------------------------------------------
- bool cmCPackIFWInstaller::IsVersionEqual(const char *version)
- {
- return Generator ? Generator->IsVersionEqual(version) : false;
- }
- //----------------------------------------------------------------------------
- void cmCPackIFWInstaller::ConfigureFromOptions()
- {
- // Name;
- if (const char* optIFW_PACKAGE_NAME =
- this->GetOption("CPACK_IFW_PACKAGE_NAME"))
- {
- Name = optIFW_PACKAGE_NAME;
- }
- else if (const char* optPACKAGE_NAME =
- this->GetOption("CPACK_PACKAGE_NAME"))
- {
- Name = optPACKAGE_NAME;
- }
- else
- {
- Name = "Your package";
- }
- // Title;
- if (const char* optIFW_PACKAGE_TITLE =
- GetOption("CPACK_IFW_PACKAGE_TITLE"))
- {
- Title = optIFW_PACKAGE_TITLE;
- }
- else if (const char* optPACKAGE_DESCRIPTION_SUMMARY =
- GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY"))
- {
- Title = optPACKAGE_DESCRIPTION_SUMMARY;
- }
- else
- {
- Title = "Your package description";
- }
- // Version;
- if (const char* option = GetOption("CPACK_PACKAGE_VERSION"))
- {
- Version = option;
- }
- else
- {
- Version = "1.0.0";
- }
- // Publisher
- if(const char* optIFW_PACKAGE_PUBLISHER =
- GetOption("CPACK_IFW_PACKAGE_PUBLISHER"))
- {
- Publisher = optIFW_PACKAGE_PUBLISHER;
- }
- else if(const char* optPACKAGE_VENDOR = GetOption("CPACK_PACKAGE_VENDOR"))
- {
- Publisher = optPACKAGE_VENDOR;
- }
- // ProductUrl
- if(const char* option = GetOption("CPACK_IFW_PRODUCT_URL"))
- {
- ProductUrl = option;
- }
- // ApplicationIcon
- if(const char* option = GetOption("CPACK_IFW_PACKAGE_ICON"))
- {
- if(cmSystemTools::FileExists(option))
- {
- InstallerApplicationIcon = option;
- }
- else
- {
- // TODO: implement warning
- }
- }
- // WindowIcon
- if(const char* option = GetOption("CPACK_IFW_PACKAGE_WINDOW_ICON"))
- {
- if(cmSystemTools::FileExists(option))
- {
- InstallerWindowIcon = option;
- }
- else
- {
- // TODO: implement warning
- }
- }
- // Logo
- if(const char* option = GetOption("CPACK_IFW_PACKAGE_LOGO"))
- {
- if(cmSystemTools::FileExists(option))
- {
- Logo = option;
- }
- else
- {
- // TODO: implement warning
- }
- }
- // Start menu
- if (const char* optIFW_START_MENU_DIR =
- this->GetOption("CPACK_IFW_PACKAGE_START_MENU_DIRECTORY"))
- {
- StartMenuDir = optIFW_START_MENU_DIR;
- }
- else
- {
- StartMenuDir = Name;
- }
- // Default target directory for installation
- if (const char* optIFW_TARGET_DIRECTORY =
- GetOption("CPACK_IFW_TARGET_DIRECTORY"))
- {
- TargetDir = optIFW_TARGET_DIRECTORY;
- }
- else if (const char *optPACKAGE_INSTALL_DIRECTORY =
- GetOption("CPACK_PACKAGE_INSTALL_DIRECTORY"))
- {
- TargetDir = "@ApplicationsDir@/";
- TargetDir += optPACKAGE_INSTALL_DIRECTORY;
- }
- else
- {
- TargetDir = "@RootDir@/usr/local";
- }
- // Default target directory for installation with administrator rights
- if (const char* option = GetOption("CPACK_IFW_ADMIN_TARGET_DIRECTORY"))
- {
- AdminTargetDir = option;
- }
- // Repositories
- Repositories.clear();
- RepositoryStruct Repo;
- if(const char *site = this->GetOption("CPACK_DOWNLOAD_SITE"))
- {
- Repo.Url = site;
- Repositories.push_back(Repo);
- }
- if(const char *RepoAllStr = this->GetOption("CPACK_IFW_REPOSITORIES_ALL"))
- {
- std::vector<std::string> RepoAllVector;
- cmSystemTools::ExpandListArgument(RepoAllStr,
- RepoAllVector);
- for(std::vector<std::string>::iterator
- rit = RepoAllVector.begin(); rit != RepoAllVector.end(); ++rit)
- {
- std::string prefix = "CPACK_IFW_REPOSITORY_"
- + cmsys::SystemTools::UpperCase(*rit)
- + "_";
- // Url
- if (const char* url = GetOption(prefix + "URL"))
- {
- Repo.Url = url;
- }
- else
- {
- Repo.Url = "";
- }
- // Enabled
- if (IsOn(prefix + "DISABLED"))
- {
- Repo.Enabled = "0";
- }
- else
- {
- Repo.Enabled = "";
- }
- // Username
- if (const char* username = GetOption(prefix + "USERNAME"))
- {
- Repo.Username = username;
- }
- else
- {
- Repo.Username = "";
- }
- // Password
- if (const char* password = GetOption(prefix + "PASSWORD"))
- {
- Repo.Password = password;
- }
- else
- {
- Repo.Password = "";
- }
- // DisplayName
- if (const char* displayName = GetOption(prefix + "DISPLAY_NAME"))
- {
- Repo.DisplayName = displayName;
- }
- else
- {
- Repo.DisplayName = "";
- }
- if(!Repo.Url.empty())
- {
- Repositories.push_back(Repo);
- }
- }
- }
- // Maintenance tool
- if(const char* optIFW_MAINTENANCE_TOOL =
- this->GetOption("CPACK_IFW_PACKAGE_MAINTENANCE_TOOL_NAME"))
- {
- MaintenanceToolName = optIFW_MAINTENANCE_TOOL;
- }
- // Maintenance tool ini file
- if(const char* optIFW_MAINTENANCE_TOOL_INI =
- this->GetOption("CPACK_IFW_PACKAGE_MAINTENANCE_TOOL_INI_FILE"))
- {
- MaintenanceToolIniFile = optIFW_MAINTENANCE_TOOL_INI;
- }
- // Allow non-ASCII characters
- if(this->GetOption("CPACK_IFW_PACKAGE_ALLOW_NON_ASCII_CHARACTERS"))
- {
- if(IsOn("CPACK_IFW_PACKAGE_ALLOW_NON_ASCII_CHARACTERS"))
- {
- AllowNonAsciiCharacters = "true";
- }
- else
- {
- AllowNonAsciiCharacters = "false";
- }
- }
- // Space in path
- if(this->GetOption("CPACK_IFW_PACKAGE_ALLOW_SPACE_IN_PATH"))
- {
- if(IsOn("CPACK_IFW_PACKAGE_ALLOW_SPACE_IN_PATH"))
- {
- AllowSpaceInPath = "true";
- }
- else
- {
- AllowSpaceInPath = "false";
- }
- }
- // Control script
- if(const char* optIFW_CONTROL_SCRIPT =
- this->GetOption("CPACK_IFW_PACKAGE_CONTROL_SCRIPT"))
- {
- ControlScript = optIFW_CONTROL_SCRIPT;
- }
- }
- //----------------------------------------------------------------------------
- void cmCPackIFWInstaller::GenerateInstallerFile()
- {
- // Lazy directory initialization
- if(Directory.empty() && Generator)
- {
- Directory = Generator->toplevel;
- }
- // Output stream
- cmGeneratedFileStream fout((Directory + "/config/config.xml").data());
- cmXMLWriter xout(fout);
- xout.StartDocument();
- WriteGeneratedByToStrim(xout);
- xout.StartElement("Installer");
- xout.Element("Name", Name);
- xout.Element("Version", Version);
- xout.Element("Title", Title);
- if(!Publisher.empty())
- {
- xout.Element("Publisher", Publisher);
- }
- if(!ProductUrl.empty())
- {
- xout.Element("ProductUrl", ProductUrl);
- }
- // ApplicationIcon
- if(!InstallerApplicationIcon.empty())
- {
- std::string name =
- cmSystemTools::GetFilenameName(InstallerApplicationIcon);
- std::string path = Directory + "/config/" + name;
- name = cmSystemTools::GetFilenameWithoutExtension(name);
- cmsys::SystemTools::CopyFileIfDifferent(
- InstallerApplicationIcon.data(), path.data());
- xout.Element("InstallerApplicationIcon", name);
- }
- // WindowIcon
- if(!InstallerWindowIcon.empty())
- {
- std::string name = cmSystemTools::GetFilenameName(InstallerWindowIcon);
- std::string path = Directory + "/config/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(
- InstallerWindowIcon.data(), path.data());
- xout.Element("InstallerWindowIcon", name);
- }
- // Logo
- if(!Logo.empty())
- {
- std::string name = cmSystemTools::GetFilenameName(Logo);
- std::string path = Directory + "/config/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(Logo.data(), path.data());
- xout.Element("Logo", name);
- }
- // Start menu
- if(!IsVersionLess("2.0"))
- {
- xout.Element("StartMenuDir", StartMenuDir);
- }
- // Target dir
- if(!TargetDir.empty())
- {
- xout.Element("TargetDir", TargetDir);
- }
- // Admin target dir
- if(!AdminTargetDir.empty())
- {
- xout.Element("AdminTargetDir", AdminTargetDir);
- }
- // Remote repositories
- if (!Repositories.empty())
- {
- xout.StartElement("RemoteRepositories");
- for(std::vector<RepositoryStruct>::iterator
- rit = Repositories.begin(); rit != Repositories.end(); ++rit)
- {
- xout.StartElement("Repository");
- // Url
- xout.Element("Url", rit->Url);
- // Enabled
- if(!rit->Enabled.empty())
- {
- xout.Element("Enabled", rit->Enabled);
- }
- // Username
- if(!rit->Username.empty())
- {
- xout.Element("Username", rit->Username);
- }
- // Password
- if(!rit->Password.empty())
- {
- xout.Element("Password", rit->Password);
- }
- // DisplayName
- if(!rit->DisplayName.empty())
- {
- xout.Element("DisplayName", rit->DisplayName);
- }
- xout.EndElement();
- }
- xout.EndElement();
- }
- // Maintenance tool
- if(!IsVersionLess("2.0") && !MaintenanceToolName.empty())
- {
- xout.Element("MaintenanceToolName", MaintenanceToolName);
- }
- // Maintenance tool ini file
- if(!IsVersionLess("2.0") && !MaintenanceToolIniFile.empty())
- {
- xout.Element("MaintenanceToolIniFile", MaintenanceToolIniFile);
- }
- // Different allows
- if(IsVersionLess("2.0"))
- {
- // CPack IFW default policy
- xout.Comment("CPack IFW default policy for QtIFW less 2.0");
- xout.Element("AllowNonAsciiCharacters", "true");
- xout.Element("AllowSpaceInPath", "true");
- }
- else
- {
- if(!AllowNonAsciiCharacters.empty())
- {
- xout.Element("AllowNonAsciiCharacters", AllowNonAsciiCharacters);
- }
- if(!AllowSpaceInPath.empty())
- {
- xout.Element("AllowSpaceInPath", AllowSpaceInPath);
- }
- }
- // Control script (copy to config dir)
- if(!IsVersionLess("2.0") && !ControlScript.empty())
- {
- std::string name = cmSystemTools::GetFilenameName(ControlScript);
- std::string path = Directory + "/config/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(ControlScript.data(), path.data());
- xout.Element("ControlScript", name);
- }
- xout.EndElement();
- xout.EndDocument();
- }
- //----------------------------------------------------------------------------
- void cmCPackIFWInstaller::GeneratePackageFiles()
- {
- if (Packages.empty() || Generator->IsOnePackage())
- {
- // Generate default package
- cmCPackIFWPackage package;
- package.Generator = Generator;
- package.Installer = this;
- // Check package group
- if (const char* option = GetOption("CPACK_IFW_PACKAGE_GROUP"))
- {
- package.ConfigureFromGroup(option);
- package.ForcedInstallation = "true";
- }
- else
- {
- package.ConfigureFromOptions();
- }
- package.GeneratePackageFile();
- return;
- }
- // Generate packages meta information
- for(PackagesMap::iterator pit = Packages.begin();
- pit != Packages.end(); ++pit)
- {
- cmCPackIFWPackage* package = pit->second;
- package->GeneratePackageFile();
- }
- }
- void cmCPackIFWInstaller::WriteGeneratedByToStrim(cmXMLWriter &xout)
- {
- if(Generator) Generator->WriteGeneratedByToStrim(xout);
- }
|