blob: ae57b7efd209ef873b43d806cefb0794295234b6 [file] [log] [blame]
/**
* 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;
}