xsec/tools/c14n/c14n.cpp (124 lines of code) (raw):

/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* * XSEC * * c14n := tool to dump a XML file to the console after canonacalising it thru * c14n * * $Id$ * */ //XSEC includes //#include <Include/PlatformDefinitions.hpp> //#include <cassert> #include <memory.h> #include <string.h> #include <iostream> #include <stdlib.h> #include <xercesc/util/PlatformUtils.hpp> #include <xercesc/util/XMLString.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/util/XMLException.hpp> // XSEC #include <xsec/canon/XSECC14n20010315.hpp> #include <xsec/utils/XSECNameSpaceExpander.hpp> #include <xsec/utils/XSECPlatformUtils.hpp> XERCES_CPP_NAMESPACE_USE using std::endl; using std::cout; using std::cerr; void printUsage(void) { cerr << "\nUsage: c14n [-n] [-x] [-1.1] [-id ID] <input file name>\n"; cerr << " -n = No comments\n"; cerr << " -1.1 = Use c14n 1.1\n"; cerr << " -x = Use exclusive c14n\n"; cerr << " -id ID = References node to canonicalize by ID\n\n"; } int main(int argc, char **argv) { const char* id = NULL; bool printComments = true; bool exclusive = false; bool inclusive11 = false; // Check arguments if (argc < 2) { printUsage(); exit (1); } if (argc > 2) { for (int i = 1; i < argc - 1; ++i) { if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "-N")) printComments = false; else if (!strcmp(argv[i], "-x") || !strcmp(argv[i], "-X")) exclusive = true; else if (!strcmp(argv[i], "-1.1")) inclusive11 = true; else if (!strcmp(argv[i], "-id") && argc > i + 1) id = argv[++i]; else { cerr << "Unknown option %s\n\n"; printUsage(); exit (1); } } } // Initialise the XML system try { XMLPlatformUtils::Initialize(); XSECPlatformUtils::Initialise(); } catch (const XMLException &e) { cerr << "Error during initialisation of Xerces" << endl; cerr << "Error Message = : " << e.getMessage() << endl; } // Create and set up the parser XercesDOMParser * parser = new XercesDOMParser; parser->setDoNamespaces(true); parser->setValidationScheme(XercesDOMParser::Val_Never); parser->setDoSchema(false); parser->setCreateEntityReferenceNodes(false); // Now parse out file bool errorsOccured = false; XMLSize_t errorCount = 0; try { parser->parse(argv[argc-1]); errorCount = parser->getErrorCount(); if (errorCount > 0) errorsOccured = true; } catch (const XMLException& e) { cerr << "An error occurred during parsing\n Message: " << e.getMessage() << endl; errorsOccured = true; } catch (const DOMException& e) { cerr << "A DOM error occurred during parsing\n DOMException code: " << e.code << endl; errorsOccured = true; } if (errorsOccured) { cout << "Errors during parse" << endl; exit (1); } /* Now that we have the parsed file, get the DOM document and start looking at it */ DOMNode *subtree = NULL; DOMDocument *theDOM = parser->getDocument(); if (id) { XMLCh* temp = XMLString::transcode(id); subtree = theDOM->getElementById(temp); XSEC_RELEASE_XMLCH(temp); if (!subtree) { cerr << "ID reference did not resolve" << endl; exit(1); } } // Create the canonicalizer XSECC14n20010315* canon=NULL; if (subtree) canon = new XSECC14n20010315(theDOM, subtree); else canon = new XSECC14n20010315(theDOM); canon->setCommentsProcessing(printComments); canon->setUseNamespaceStack(true); if (inclusive11) canon->setInclusive11(); else if (exclusive) canon->setExclusive(); // canon->XPathSelectNodes("(/descendant-or-self::node() | /descendant-or-self::node()/attribute::* | /descendant-or-self::node()/namespace::*)[ self::ietf:e1 or (parent::ietf:e1 and not(self::text() or self::e2)) or count (id(\"E3\") | ancestor-or-self::node()) = count (ancestor-or-self::node())]"); char buffer[512]; XMLSize_t res = canon->outputBuffer((unsigned char *) buffer, 128); while (res != 0) { buffer[res] = '\0'; cout << buffer; res = canon->outputBuffer((unsigned char *) buffer, 128); } cout << endl; delete canon; delete parser; XSECPlatformUtils::Terminate(); XMLPlatformUtils::Terminate(); return 0; }