|
|
@@ -13,11 +13,13 @@
|
|
|
#include "cmCPackIFWInstaller.h"
|
|
|
|
|
|
#include "CPack/cmCPackGenerator.h"
|
|
|
+#include "CPack/cmCPackLog.h"
|
|
|
#include "cmCPackIFWGenerator.h"
|
|
|
#include "cmCPackIFWPackage.h"
|
|
|
#include "cmCPackIFWRepository.h"
|
|
|
#include "cmGeneratedFileStream.h"
|
|
|
#include "cmSystemTools.h"
|
|
|
+#include "cmXMLParser.h"
|
|
|
#include "cmXMLWriter.h"
|
|
|
|
|
|
#include <cmConfigure.h>
|
|
|
@@ -198,8 +200,70 @@ void cmCPackIFWInstaller::ConfigureFromOptions()
|
|
|
this->GetOption("CPACK_IFW_PACKAGE_CONTROL_SCRIPT")) {
|
|
|
ControlScript = optIFW_CONTROL_SCRIPT;
|
|
|
}
|
|
|
+
|
|
|
+ // Resources
|
|
|
+ if (const char* optIFW_PACKAGE_RESOURCES =
|
|
|
+ this->GetOption("CPACK_IFW_PACKAGE_RESOURCES")) {
|
|
|
+ Resources.clear();
|
|
|
+ cmSystemTools::ExpandListArgument(optIFW_PACKAGE_RESOURCES, Resources);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+/** \class cmCPackIFWResourcesParser
|
|
|
+ * \brief Helper class that parse resources form .qrc (Qt)
|
|
|
+ */
|
|
|
+class cmCPackIFWResourcesParser : public cmXMLParser
|
|
|
+{
|
|
|
+public:
|
|
|
+ cmCPackIFWResourcesParser(cmCPackIFWInstaller* i)
|
|
|
+ : installer(i)
|
|
|
+ , file(false)
|
|
|
+ {
|
|
|
+ path = i->Directory + "/resources";
|
|
|
+ }
|
|
|
+
|
|
|
+ bool ParseResource(size_t r)
|
|
|
+ {
|
|
|
+ hasFiles = false;
|
|
|
+ hasErrors = false;
|
|
|
+
|
|
|
+ basePath = cmSystemTools::GetFilenamePath(installer->Resources[r].data());
|
|
|
+
|
|
|
+ ParseFile(installer->Resources[r].data());
|
|
|
+
|
|
|
+ return hasFiles && !hasErrors;
|
|
|
+ }
|
|
|
+
|
|
|
+ cmCPackIFWInstaller* installer;
|
|
|
+ bool file, hasFiles, hasErrors;
|
|
|
+ std::string path, basePath;
|
|
|
+
|
|
|
+protected:
|
|
|
+ void StartElement(const std::string& name, const char** /*atts*/) CM_OVERRIDE
|
|
|
+ {
|
|
|
+ file = name == "file" ? true : false;
|
|
|
+ if (file) {
|
|
|
+ hasFiles = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void CharacterDataHandler(const char* data, int length) CM_OVERRIDE
|
|
|
+ {
|
|
|
+ if (file) {
|
|
|
+ std::string content(data, data + length);
|
|
|
+ content = cmSystemTools::TrimWhitespace(content);
|
|
|
+ std::string source = basePath + "/" + content;
|
|
|
+ std::string destination = path + "/" + content;
|
|
|
+ if (!cmSystemTools::CopyFileIfDifferent(source.data(),
|
|
|
+ destination.data())) {
|
|
|
+ hasErrors = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void EndElement(const std::string& /*name*/) CM_OVERRIDE {}
|
|
|
+};
|
|
|
+
|
|
|
void cmCPackIFWInstaller::GenerateInstallerFile()
|
|
|
{
|
|
|
// Lazy directory initialization
|
|
|
@@ -315,6 +379,26 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
|
|
|
xout.Element("ControlScript", name);
|
|
|
}
|
|
|
|
|
|
+ // Resources (copy to resources dir)
|
|
|
+ if (!Resources.empty()) {
|
|
|
+ std::vector<std::string> resources;
|
|
|
+ cmCPackIFWResourcesParser parser(this);
|
|
|
+ for (size_t i = 0; i < Resources.size(); i++) {
|
|
|
+ if (parser.ParseResource(i)) {
|
|
|
+ std::string name = cmSystemTools::GetFilenameName(Resources[i]);
|
|
|
+ std::string path = Directory + "/resources/" + name;
|
|
|
+ cmsys::SystemTools::CopyFileIfDifferent(Resources[i].data(),
|
|
|
+ path.data());
|
|
|
+ resources.push_back(name);
|
|
|
+ } else {
|
|
|
+ cmCPackLogger(cmCPackLog::LOG_WARNING, "Can't copy resources from \""
|
|
|
+ << Resources[i] << "\". Resource will be skipped."
|
|
|
+ << std::endl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Resources = resources;
|
|
|
+ }
|
|
|
+
|
|
|
xout.EndElement();
|
|
|
xout.EndDocument();
|
|
|
}
|