| [906] | 1 | #include "main.h"
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | int main(int argc, char *argv[])
 | 
|---|
 | 4 | {
 | 
|---|
 | 5 | 
 | 
|---|
 | 6 |     QCoreApplication app(argc, argv);
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 |     QCoreApplication::setApplicationName(GlobalVars::AppName);
 | 
|---|
 | 9 |     QCoreApplication::setApplicationVersion(GlobalVars::AppVersion);
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 |     QCommandLineParser parser;
 | 
|---|
 | 12 |     parser.setApplicationDescription("Additional documentation can be found at: http://wiki.oni2.net/XmlTools");
 | 
|---|
 | 13 | 
 | 
|---|
| [920] | 14 |     XmlTools *myXmlTools;
 | 
|---|
| [906] | 15 |     QString filesWildCard, patchFilesWildCard, forceTargetFilesWildcard;
 | 
|---|
 | 16 |     QString currentVal, newVal, diffOldNewVal, positions;
 | 
|---|
| [920] | 17 |     QString xPathExpression;
 | 
|---|
| [906] | 18 |     XmlFilter filters; // Filters
 | 
|---|
| [920] | 19 | 
 | 
|---|
| [906] | 20 |     bool noBackups=false;
 | 
|---|
| [923] | 21 |     bool noVerbose=false;
 | 
|---|
| [906] | 22 | 
 | 
|---|
 | 23 |     QCommandLineOption addValuesOption(QStringList() << "a" << "add-values", "Add values to a set of XML elements.");
 | 
|---|
 | 24 |     QCommandLineOption removeValuesOption(QStringList() << "remove-values", "Removes values from a set of XML elements.");
 | 
|---|
 | 25 |     QCommandLineOption replaceValueOption(QStringList() << "replace-value", "Replaces 1 value in a set of XML elements.");
 | 
|---|
 | 26 |     QCommandLineOption replaceAllValuesOption(QStringList() << "replace-all-values", "Replaces all values in a set of XML elements.");
 | 
|---|
 | 27 |     QCommandLineOption updateElementsOption(QStringList() << "u" << "update-elements", "Updates all values in a set of XML elements.");
 | 
|---|
 | 28 |     QCommandLineOption invertElementsOption(QStringList() << "i" << "invert-elements", "Inverts a set of XML elements.");
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 |     QCommandLineOption currentValOption(QStringList() << "c" << "current-val", "Current value(s) [use space as separator].","current-val");
 | 
|---|
| [920] | 31 |     QCommandLineOption newValOption(QStringList() << "n" << "new-val", "New value(s) [use space as separator].","new-val");
 | 
|---|
| [906] | 32 |     QCommandLineOption diffOldNewValueOption(QStringList() << "d" << "diff-old-new-val", "Difference between old and new value.","diff-old-new-val");
 | 
|---|
 | 33 |     QCommandLineOption positionsValueOption(QStringList() << "positions", "Positions [use space as separator] [0-index based].","positions");
 | 
|---|
 | 34 | 
 | 
|---|
 | 35 |     QCommandLineOption filesOption(QStringList() << "f" << "files", "XML files to process [wildcards supported].", "files");
 | 
|---|
 | 36 |     QCommandLineOption patchFilesOption(QStringList() << "p" << "patch-files" , "Patch files to process [wildcards supported].", "patch-files");
 | 
|---|
 | 37 |     QCommandLineOption forceTargetFilesOption(QStringList() << "force-target-files" , "Force the patch-files operation in the specified XML files. [wildcards supported].", "force-target-files");
 | 
|---|
 | 38 |     QCommandLineOption elementNameOption(QStringList() << "e" << "element-name", "Name of the XML element(s) where processing will occur.", "element-name");
 | 
|---|
 | 39 |     QCommandLineOption parentElementNameOption(QStringList() << "parent-element-name", "Name of the XML parent element of <element-name> [used as filter].", "parent-element-name");
 | 
|---|
 | 40 |     QCommandLineOption attributeNameOption("attribute-name", "Attribute name of <element-name>  [used as filter].", "attribute-name");
 | 
|---|
 | 41 |     QCommandLineOption attributeValueOption("attribute-value", "Attribute value of <attribute-name>  [used as filter].", "attribute-value");
 | 
|---|
| [920] | 42 |     QCommandLineOption xPathExpressionOption(QStringList() << "x" << "xpath-expression", "XPath 1.0 expression to select elements where processing will occur.", "xpath-expression");
 | 
|---|
| [906] | 43 |     QCommandLineOption noBackupsOption(QStringList()  << "no-backups", "No backups [faster processing].");
 | 
|---|
| [923] | 44 |     QCommandLineOption noVerboseOption(QStringList()  << "no-verbose", "Reduce the number of text messages output [faster processing].");
 | 
|---|
| [906] | 45 | 
 | 
|---|
 | 46 |     parser.addOption(addValuesOption);
 | 
|---|
 | 47 |     parser.addOption(removeValuesOption);
 | 
|---|
 | 48 |     parser.addOption(replaceValueOption);
 | 
|---|
 | 49 |     parser.addOption(replaceAllValuesOption);
 | 
|---|
 | 50 |     parser.addOption(updateElementsOption);
 | 
|---|
 | 51 |     parser.addOption(invertElementsOption);
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 |     parser.addOption(currentValOption);
 | 
|---|
 | 54 |     parser.addOption(newValOption);
 | 
|---|
 | 55 |     parser.addOption(diffOldNewValueOption);
 | 
|---|
 | 56 |     parser.addOption(positionsValueOption);
 | 
|---|
 | 57 | 
 | 
|---|
 | 58 |     parser.addOption(filesOption);
 | 
|---|
 | 59 |     parser.addOption(patchFilesOption);
 | 
|---|
 | 60 |     parser.addOption(forceTargetFilesOption);
 | 
|---|
 | 61 |     parser.addOption(elementNameOption);
 | 
|---|
 | 62 |     parser.addOption(parentElementNameOption);
 | 
|---|
 | 63 |     parser.addOption(attributeNameOption);
 | 
|---|
 | 64 |     parser.addOption(attributeValueOption);
 | 
|---|
| [920] | 65 |     parser.addOption(xPathExpressionOption);
 | 
|---|
| [906] | 66 |     parser.addOption(noBackupsOption);
 | 
|---|
| [923] | 67 |     parser.addOption(noVerboseOption);
 | 
|---|
| [906] | 68 | 
 | 
|---|
 | 69 |     parser.addVersionOption();
 | 
|---|
 | 70 |     parser.addHelpOption();
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 |     // Process the actual command line arguments given by the user
 | 
|---|
 | 73 |     parser.process(app);
 | 
|---|
 | 74 | 
 | 
|---|
 | 75 |     // If no arguments show help option
 | 
|---|
 | 76 |     if(app.arguments().size()==1){
 | 
|---|
 | 77 |         parser.showHelp();
 | 
|---|
 | 78 |     }
 | 
|---|
 | 79 | 
 | 
|---|
| [920] | 80 |     // Check if the user doesn't want backups (it boosts XmlTools peformance, lower disk output)
 | 
|---|
| [906] | 81 |     if(parser.isSet(noBackupsOption)){
 | 
|---|
 | 82 |         noBackups=true;
 | 
|---|
 | 83 |     }
 | 
|---|
 | 84 | 
 | 
|---|
| [923] | 85 |     // Check if the user doesn't want verbose mode (it boosts XmlTools peformance, lower std output)
 | 
|---|
 | 86 |     if(parser.isSet(noVerboseOption)){
 | 
|---|
 | 87 |         noVerbose=true;
 | 
|---|
 | 88 |     }
 | 
|---|
 | 89 | 
 | 
|---|
| [906] | 90 |     // Get patch files wildcard if available
 | 
|---|
 | 91 |     if(parser.isSet(patchFilesOption)){
 | 
|---|
 | 92 |         patchFilesWildCard=parser.value(patchFilesOption);
 | 
|---|
 | 93 | 
 | 
|---|
 | 94 |         // Never reached
 | 
|---|
 | 95 |         //        if(patchFilesWildCard==""){
 | 
|---|
 | 96 |         //            UtilXmlTools::displayErrorMessage("Parameter Parsing", "patch-files option requires 1 value: <patch-files> the patch files to process (wildcards supported).");
 | 
|---|
 | 97 |         //        }
 | 
|---|
 | 98 | 
 | 
|---|
 | 99 |         forceTargetFilesWildcard=parser.value(forceTargetFilesOption);
 | 
|---|
 | 100 | 
 | 
|---|
 | 101 | 
 | 
|---|
| [923] | 102 |         XmlPatch myXmlPatch(patchFilesWildCard,forceTargetFilesWildcard,noBackups,noVerbose);
 | 
|---|
| [906] | 103 |         myXmlPatch.readAndProcessPatchFile(); // beging file patch processing
 | 
|---|
 | 104 | 
 | 
|---|
 | 105 |         return 0;
 | 
|---|
 | 106 |     }
 | 
|---|
 | 107 | 
 | 
|---|
| [920] | 108 |     if(!parser.isSet(elementNameOption) && !parser.isSet(xPathExpressionOption)){
 | 
|---|
 | 109 |         UtilXmlTools::displayErrorMessage("Parameter Parsing","element-name option or xpath-expression option is required if not using patch-files option.");
 | 
|---|
 | 110 |     }
 | 
|---|
 | 111 |     else if(parser.isSet(elementNameOption) && parser.isSet(xPathExpressionOption)){
 | 
|---|
 | 112 |         UtilXmlTools::displayErrorMessage("Parameter Parsing","element-name option and xpath-expression options cannot be used simultaneously.");
 | 
|---|
 | 113 |     }
 | 
|---|
 | 114 | 
 | 
|---|
| [906] | 115 |     // Get element name if available
 | 
|---|
 | 116 |     if(parser.isSet(elementNameOption)){
 | 
|---|
 | 117 |         filters.setElementName(parser.value(elementNameOption));
 | 
|---|
 | 118 |     }
 | 
|---|
 | 119 | 
 | 
|---|
| [920] | 120 |     // Get xpath expression if available
 | 
|---|
 | 121 |     if(parser.isSet(xPathExpressionOption)){
 | 
|---|
 | 122 |         xPathExpression=parser.value(xPathExpressionOption);
 | 
|---|
| [906] | 123 |     }
 | 
|---|
 | 124 | 
 | 
|---|
 | 125 |     // Get current value(s) if avaialabe
 | 
|---|
 | 126 |     if(parser.isSet(currentValOption)){
 | 
|---|
 | 127 |         currentVal=parser.value(currentValOption);
 | 
|---|
 | 128 |     }
 | 
|---|
 | 129 | 
 | 
|---|
 | 130 |     // Get new value(s) if avaialabe
 | 
|---|
 | 131 |     if(parser.isSet(newValOption)){
 | 
|---|
 | 132 |         newVal=parser.value(newValOption);
 | 
|---|
 | 133 |     }
 | 
|---|
 | 134 | 
 | 
|---|
 | 135 |     // Get difference between old and new value if avaialabe
 | 
|---|
 | 136 |     if(parser.isSet(diffOldNewValueOption)){
 | 
|---|
 | 137 |         diffOldNewVal=parser.value(diffOldNewValueOption);
 | 
|---|
 | 138 |     }
 | 
|---|
 | 139 | 
 | 
|---|
 | 140 |     // Get positions if avaialabe
 | 
|---|
 | 141 |     if(parser.isSet(positionsValueOption)){
 | 
|---|
 | 142 |         positions=parser.value(positionsValueOption);
 | 
|---|
 | 143 |     }
 | 
|---|
 | 144 | 
 | 
|---|
 | 145 |     // Get parent element name if available
 | 
|---|
 | 146 |     if(parser.isSet(parentElementNameOption)){
 | 
|---|
 | 147 |         filters.setParentElementName(parser.value(parentElementNameOption));
 | 
|---|
 | 148 |     }
 | 
|---|
 | 149 | 
 | 
|---|
 | 150 |     // Get attribute name if available
 | 
|---|
 | 151 |     if(parser.isSet(attributeNameOption)){
 | 
|---|
 | 152 |         filters.setAttributeName(parser.value(attributeNameOption));
 | 
|---|
 | 153 |     }
 | 
|---|
 | 154 | 
 | 
|---|
 | 155 |     // Get attribute value if available
 | 
|---|
 | 156 |     if(parser.isSet(attributeValueOption)){
 | 
|---|
 | 157 |         filters.setAttributeValue(parser.value(attributeValueOption));
 | 
|---|
 | 158 |     }
 | 
|---|
 | 159 | 
 | 
|---|
 | 160 |     // Check attribute filters
 | 
|---|
 | 161 |     if(filters.getAttributeName()!="" && filters.getAttributeValue()==""){
 | 
|---|
 | 162 |         UtilXmlTools::displayErrorMessage("Parameter Parsing","attribute-value option is required if using attribute-name option.");
 | 
|---|
 | 163 |     }
 | 
|---|
 | 164 | 
 | 
|---|
 | 165 |     if(filters.getAttributeValue()!="" && filters.getAttributeName()==""){
 | 
|---|
 | 166 |         UtilXmlTools::displayErrorMessage("Parameter Parsing","attribute-name option is required if using attribute-value option.");
 | 
|---|
 | 167 |     }
 | 
|---|
 | 168 | 
 | 
|---|
 | 169 |     // Get files wildcard if available
 | 
|---|
 | 170 |     if(parser.isSet(filesOption)){
 | 
|---|
 | 171 |         filesWildCard=parser.value(filesOption);
 | 
|---|
 | 172 |     }
 | 
|---|
 | 173 |     else{
 | 
|---|
 | 174 |         UtilXmlTools::displayErrorMessage("Parameter Parsing", "files option requires 1 value: <files> the XML files to process (wildcards supported).");
 | 
|---|
 | 175 |     }
 | 
|---|
 | 176 | 
 | 
|---|
| [920] | 177 |     if(parser.isSet(elementNameOption)){
 | 
|---|
| [923] | 178 |         myXmlTools=new XmlTools(filesWildCard,filters,noBackups,noVerbose);
 | 
|---|
| [920] | 179 |     }
 | 
|---|
 | 180 |     else{
 | 
|---|
| [923] | 181 |         myXmlTools=new XmlTools(filesWildCard,xPathExpression,noBackups,noVerbose);
 | 
|---|
| [920] | 182 |     }
 | 
|---|
| [906] | 183 | 
 | 
|---|
 | 184 | 
 | 
|---|
 | 185 |     // Users wants an add-option?
 | 
|---|
 | 186 |     if(parser.isSet(addValuesOption)){
 | 
|---|
 | 187 | 
 | 
|---|
 | 188 |         if(newVal==""){
 | 
|---|
 | 189 |             UtilXmlTools::displayErrorMessage("Parameter Parsing", "add-value option requires 1 value: <new-val> the new values to add (space separated).");
 | 
|---|
 | 190 |         }
 | 
|---|
 | 191 | 
 | 
|---|
| [920] | 192 |         myXmlTools->addValues(newVal);
 | 
|---|
| [906] | 193 |     }
 | 
|---|
 | 194 |     else if(parser.isSet(removeValuesOption)){ // Or remove-values option?
 | 
|---|
 | 195 | 
 | 
|---|
 | 196 |         if(currentVal==""){
 | 
|---|
 | 197 |             UtilXmlTools::displayErrorMessage("Parameter Parsing","remove-values option requires 1 value: <current-val> the current values to remove (space separated).");
 | 
|---|
 | 198 |         }
 | 
|---|
 | 199 | 
 | 
|---|
| [920] | 200 |         myXmlTools->removeValues(currentVal);
 | 
|---|
| [906] | 201 |     }
 | 
|---|
 | 202 |     else if(parser.isSet(replaceValueOption)){ // Or replace-value option?
 | 
|---|
 | 203 | 
 | 
|---|
 | 204 |         if(currentVal=="" || newVal==""){
 | 
|---|
 | 205 |             UtilXmlTools::displayErrorMessage("Parameter Parsing","replace-value option requires 2 values: <current-val> the current value and <new-val> the new value.");
 | 
|---|
 | 206 |         }
 | 
|---|
 | 207 | 
 | 
|---|
| [920] | 208 |         myXmlTools->replaceValue(currentVal,newVal);
 | 
|---|
| [906] | 209 |     }
 | 
|---|
 | 210 |     else if(parser.isSet(replaceAllValuesOption)){ // Or replace-all-values option?
 | 
|---|
 | 211 | 
 | 
|---|
 | 212 |         if(newVal=="" && positions==""){
 | 
|---|
 | 213 |             UtilXmlTools::displayErrorMessage("Parameter Parsing","replace-all-values option requires 1 value: <new-val> the new value.\n" +
 | 
|---|
 | 214 |                                               Util::toQString("It has also 1 optional value: <positions> the positions to replace (space separated and 0-index based)."));
 | 
|---|
 | 215 |         }
 | 
|---|
 | 216 | 
 | 
|---|
| [920] | 217 |         myXmlTools->replaceAll(newVal,positions);
 | 
|---|
| [906] | 218 |     }
 | 
|---|
 | 219 |     else if(parser.isSet(updateElementsOption)){ // Or update-elements option?
 | 
|---|
 | 220 | 
 | 
|---|
 | 221 |         if(diffOldNewVal==""){
 | 
|---|
 | 222 |             UtilXmlTools::displayErrorMessage("Parameter Parsing","update-elements option requires 1 value: <diff-old-new-val> the difference between one current element "+
 | 
|---|
 | 223 |                                               Util::toQString("value and one new element value (current value and new value must have the same position)."));
 | 
|---|
 | 224 |         }
 | 
|---|
 | 225 | 
 | 
|---|
| [920] | 226 |         myXmlTools->updateElements(diffOldNewVal);
 | 
|---|
| [906] | 227 |     }
 | 
|---|
 | 228 |     else if(parser.isSet(invertElementsOption)){ // Or invert-elements option?
 | 
|---|
| [920] | 229 |         myXmlTools->invertElements();
 | 
|---|
| [906] | 230 |     }
 | 
|---|
 | 231 |     else{
 | 
|---|
 | 232 |         UtilXmlTools::displayErrorMessage("Parameter Parsing","One operation is required to XmlTools continue. Possible operations are:\n"+
 | 
|---|
 | 233 |                                           Util::toQString("--patch-files\n--add-values\n--remove-values\n--replace-value\n--replace-all-values\n--update-elements\n--invert-elements"));
 | 
|---|
 | 234 |     }
 | 
|---|
 | 235 | 
 | 
|---|
| [920] | 236 |     //delete myXmlTools;
 | 
|---|
| [906] | 237 |     //std::cout << "Started" << std::endl;
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 |     //app.exec();
 | 
|---|
 | 240 |     return 0;
 | 
|---|
 | 241 | }
 | 
|---|