changes from main repository

This commit is contained in:
Guenter Obiltschnig
2008-01-29 09:06:52 +00:00
parent ab8d8e38e3
commit b526dd81f2
47 changed files with 611 additions and 557 deletions

View File

@@ -1,7 +1,7 @@
//
// AttributesImpl.cpp
//
// $Id: //poco/svn/XML/src/AttributesImpl.cpp#2 $
// $Id: //poco/svn/XML/src/AttributesImpl.cpp#3 $
//
// Library: XML
// Package: SAX
@@ -43,18 +43,23 @@ namespace XML {
AttributesImpl::AttributesImpl()
{
_empty.specified = false;
_empty.type = "CDATA";
}
AttributesImpl::AttributesImpl(const Attributes& attributes)
{
_empty.specified = false;
_empty.type = "CDATA";
setAttributes(attributes);
}
AttributesImpl::AttributesImpl(const AttributesImpl& attributes)
AttributesImpl::AttributesImpl(const AttributesImpl& attributes):
_attributes(attributes._attributes),
_empty(attributes._empty)
{
setAttributes(attributes);
}
@@ -99,114 +104,6 @@ int AttributesImpl::getIndex(const XMLString& namespaceURI, const XMLString& loc
}
int AttributesImpl::getLength() const
{
return (int) _attributes.size();
}
XMLString AttributesImpl::getLocalName(int i) const
{
poco_assert (i < _attributes.size());
return _attributes[i].localName;
}
XMLString AttributesImpl::getQName(int i) const
{
poco_assert (i < _attributes.size());
return _attributes[i].qname;
}
XMLString AttributesImpl::getType(int i) const
{
poco_assert (i < _attributes.size());
return _attributes[i].type;
}
XMLString AttributesImpl::getType(const XMLString& qname) const
{
Attribute* pAttr = find(qname);
if (pAttr)
return pAttr->type;
else
return XMLString();
}
XMLString AttributesImpl::getType(const XMLString& namespaceURI, const XMLString& localName) const
{
Attribute* pAttr = find(namespaceURI, localName);
if (pAttr)
return pAttr->type;
else
return XMLString();
}
XMLString AttributesImpl::getValue(int i) const
{
poco_assert (i < _attributes.size());
return _attributes[i].value;
}
XMLString AttributesImpl::getValue(const XMLString& qname) const
{
Attribute* pAttr = find(qname);
if (pAttr)
return pAttr->value;
else
return XMLString();
}
XMLString AttributesImpl::getValue(const XMLString& namespaceURI, const XMLString& localName) const
{
Attribute* pAttr = find(namespaceURI, localName);
if (pAttr)
return pAttr->value;
else
return XMLString();
}
XMLString AttributesImpl::getURI(int i) const
{
poco_assert (i < _attributes.size());
return _attributes[i].namespaceURI;
}
bool AttributesImpl::isSpecified(int i) const
{
poco_assert (i < _attributes.size());
return _attributes[i].specified;
}
bool AttributesImpl::isSpecified(const XMLString& qname) const
{
Attribute* pAttr = find(qname);
if (pAttr)
return pAttr->specified;
else
return false;
}
bool AttributesImpl::isSpecified(const XMLString& namespaceURI, const XMLString& localName) const
{
Attribute* pAttr = find(namespaceURI, localName);
if (pAttr)
return pAttr->specified;
else
return false;
}
void AttributesImpl::setValue(int i, const XMLString& value)
{
poco_assert (i < _attributes.size());
@@ -346,6 +243,12 @@ void AttributesImpl::clear()
}
void AttributesImpl::reserve(std::size_t capacity)
{
_attributes.reserve(capacity);
}
void AttributesImpl::setLocalName(int i, const XMLString& localName)
{
poco_assert (i < _attributes.size());

View File

@@ -1,7 +1,7 @@
//
// DOMBuilder.cpp
//
// $Id: //poco/svn/XML/src/DOMBuilder.cpp#2 $
// $Id: //poco/svn/XML/src/DOMBuilder.cpp#3 $
//
// Library: XML
// Package: DOM
@@ -126,6 +126,28 @@ Document* DOMBuilder::parse(InputSource* pInputSource)
}
Document* DOMBuilder::parseMemoryNP(const char* xml, std::size_t size)
{
setupParse();
_pDocument->suspendEvents();
try
{
_xmlReader.parseMemoryNP(xml, size);
}
catch (...)
{
_pDocument->release();
_pDocument = 0;
_pParent = 0;
_pPrevious = 0;
throw;
}
_pDocument->resumeEvents();
_pDocument->collectGarbage();
return _pDocument;
}
void DOMBuilder::setupParse()
{
_pDocument = new Document(_pNamePool);
@@ -191,13 +213,11 @@ void DOMBuilder::startElement(const XMLString& uri, const XMLString& localName,
AutoPtr<Element> pElem = _namespaces ? _pDocument->createElementNS(uri, qname.empty() ? localName : qname) : _pDocument->createElement(qname);
const AttributesImpl& attrs = dynamic_cast<const AttributesImpl&>(attributes);
Attr* pPrevAttr = 0;
for (AttributesImpl::iterator it = attrs.begin(); it != attrs.end(); ++it)
{
AutoPtr<Attr> pAttr = new Attr(_pDocument, 0, it->namespaceURI, it->localName, it->qname, it->value, it->specified);
if (_namespaces)
pElem->setAttributeNodeNS(pAttr);
else
pElem->setAttributeNode(pAttr);
pPrevAttr = pElem->addAttributeNodeNP(pPrevAttr, pAttr);
}
appendNode(pElem);
_pParent = pElem;

View File

@@ -1,7 +1,7 @@
//
// DOMParser.cpp
//
// $Id: //poco/svn/XML/src/DOMParser.cpp#2 $
// $Id: //poco/svn/XML/src/DOMParser.cpp#3 $
//
// Library: XML
// Package: DOM
@@ -135,9 +135,23 @@ Document* DOMParser::parse(InputSource* pInputSource)
Document* DOMParser::parseString(const std::string& xml)
{
std::istringstream istr(xml);
InputSource src(istr);
return parse(&src);
return parseMemory(xml.data(), xml.size());
}
Document* DOMParser::parseMemory(const char* xml, std::size_t size)
{
if (_whitespace)
{
DOMBuilder builder(_saxParser, _pNamePool);
return builder.parseMemoryNP(xml, size);
}
else
{
WhitespaceFilter filter(&_saxParser);
DOMBuilder builder(filter, _pNamePool);
return builder.parseMemoryNP(xml, size);
}
}

View File

@@ -1,7 +1,7 @@
//
// DOMSerializer.cpp
//
// $Id: //poco/svn/XML/src/DOMSerializer.cpp#2 $
// $Id: //poco/svn/XML/src/DOMSerializer.cpp#3 $
//
// Library: XML
// Package: DOM
@@ -199,6 +199,12 @@ void DOMSerializer::parse(const XMLString& systemId)
}
void DOMSerializer::parseMemoryNP(const char* xml, std::size_t size)
{
throw XMLException("The DOMSerializer cannot parse from memory");
}
void DOMSerializer::iterate(const Node* pNode) const
{
while (pNode)

View File

@@ -1,7 +1,7 @@
//
// Element.cpp
//
// $Id: //poco/svn/XML/src/Element.cpp#2 $
// $Id: //poco/svn/XML/src/Element.cpp#3 $
//
// Library: XML
// Package: DOM
@@ -173,6 +173,27 @@ Attr* Element::removeAttributeNode(Attr* oldAttr)
}
Attr* Element::addAttributeNodeNP(Attr* oldAttr, Attr* newAttr)
{
newAttr->_pParent = this;
if (oldAttr)
{
oldAttr->_pNext = newAttr;
}
else if (_pFirstAttr)
{
newAttr->_pNext = _pFirstAttr;
_pFirstAttr = newAttr;
}
else
{
_pFirstAttr = newAttr;
}
newAttr->duplicate();
return newAttr;
}
NodeList* Element::getElementsByTagName(const XMLString& name) const
{
return new ElementsByTagNameList(this, name);

View File

@@ -1,7 +1,7 @@
//
// NamespaceStrategy.cpp
//
// $Id: //poco/svn/XML/src/NamespaceStrategy.cpp#2 $
// $Id: //poco/svn/XML/src/NamespaceStrategy.cpp#3 $
//
// Library: XML
// Package: XML
@@ -46,8 +46,6 @@ namespace XML {
const XMLString NamespaceStrategy::NOTHING;
const XMLString NamespaceStrategy::CDATA = toXMLString("CDATA");
const XMLString NamespaceStrategy::COLON = toXMLString(":");
NamespaceStrategy::~NamespaceStrategy()
@@ -83,13 +81,21 @@ void NamespaceStrategy::splitName(const XMLChar* qname, XMLString& uri, XMLStrin
localName.assign(loc, p - loc);
if (*p)
prefix.assign(++p);
else
prefix.assign("");
}
else localName = qname;
else
{
uri.assign("");
localName = qname;
prefix.assign("");
}
}
NoNamespacesStrategy::NoNamespacesStrategy()
{
_attrs.reserve(32);
}
@@ -102,14 +108,16 @@ void NoNamespacesStrategy::startElement(const XMLChar* name, const XMLChar** att
{
poco_assert_dbg (name && atts && pContentHandler);
AttributesImpl attributes;
_attrs.clear();
for (int i = 0; *atts; ++i)
{
const XMLChar* attrName = *atts++;
const XMLChar* attrValue = *atts++;
attributes.addAttribute(NOTHING, NOTHING, attrName, CDATA, attrValue, i < specifiedCount);
AttributesImpl::Attribute& attr = _attrs.addAttribute();
attr.qname.assign(*atts++);
attr.value.assign(*atts++);
attr.specified = i < specifiedCount;
}
pContentHandler->startElement(NOTHING, NOTHING, name, attributes);
_name.assign(name);
pContentHandler->startElement(NOTHING, NOTHING, _name, _attrs);
}
@@ -117,12 +125,14 @@ void NoNamespacesStrategy::endElement(const XMLChar* name, ContentHandler* pCont
{
poco_assert_dbg (name && pContentHandler);
pContentHandler->endElement(NOTHING, NOTHING, name);
_name.assign(name);
pContentHandler->endElement(NOTHING, NOTHING, _name);
}
NoNamespacePrefixesStrategy::NoNamespacePrefixesStrategy()
{
_attrs.reserve(32);
}
@@ -135,20 +145,18 @@ void NoNamespacePrefixesStrategy::startElement(const XMLChar* name, const XMLCha
{
poco_assert_dbg (name && atts && pContentHandler);
AttributesImpl attributes;
_attrs.clear();
for (int i = 0; *atts; ++i)
{
const XMLChar* attrName = *atts++;
const XMLChar* attrValue = *atts++;
XMLString attrURI;
XMLString attrLocal;
splitName(attrName, attrURI, attrLocal);
attributes.addAttribute(attrURI, attrLocal, NOTHING, CDATA, attrValue, i < specifiedCount);
AttributesImpl::Attribute& attr = _attrs.addAttribute();
splitName(attrName, attr.namespaceURI, attr.localName);
attr.value.assign(attrValue);
attr.specified = i < specifiedCount;
}
XMLString uri;
XMLString local;
splitName(name, uri, local);
pContentHandler->startElement(uri, local, NOTHING, attributes);
splitName(name, _uri, _local);
pContentHandler->startElement(_uri, _local, NOTHING, _attrs);
}
@@ -156,15 +164,14 @@ void NoNamespacePrefixesStrategy::endElement(const XMLChar* name, ContentHandler
{
poco_assert_dbg (name && pContentHandler);
XMLString uri;
XMLString local;
splitName(name, uri, local);
pContentHandler->endElement(uri, local, NOTHING);
splitName(name, _uri, _local);
pContentHandler->endElement(_uri, _local, NOTHING);
}
NamespacePrefixesStrategy::NamespacePrefixesStrategy()
{
_attrs.reserve(32);
}
@@ -177,26 +184,22 @@ void NamespacePrefixesStrategy::startElement(const XMLChar* name, const XMLChar*
{
poco_assert_dbg (name && atts && pContentHandler);
AttributesImpl attributes;
_attrs.clear();
for (int i = 0; *atts; ++i)
{
const XMLChar* attrName = *atts++;
const XMLChar* attrValue = *atts++;
XMLString attrURI;
XMLString attrLocal;
XMLString attrQName;
splitName(attrName, attrURI, attrLocal, attrQName);
if (!attrQName.empty()) attrQName += ':';
attrQName.append(attrLocal);
attributes.addAttribute(attrURI, attrLocal, attrQName, CDATA, attrValue, i < specifiedCount);
AttributesImpl::Attribute& attr = _attrs.addAttribute();
splitName(attrName, attr.namespaceURI, attr.localName, attr.qname);
if (!attr.qname.empty()) attr.qname += ':';
attr.qname.append(attr.localName);
attr.value.assign(attrValue);
attr.specified = i < specifiedCount;
}
XMLString uri;
XMLString local;
XMLString qname;
splitName(name, uri, local, qname);
if (!qname.empty()) qname += ':';
qname.append(local);
pContentHandler->startElement(uri, local, qname, attributes);
splitName(name, _uri, _local, _qname);
if (!_qname.empty()) _qname += ':';
_qname.append(_local);
pContentHandler->startElement(_uri, _local, _qname, _attrs);
}
@@ -204,13 +207,10 @@ void NamespacePrefixesStrategy::endElement(const XMLChar* name, ContentHandler*
{
poco_assert_dbg (name && pContentHandler);
XMLString uri;
XMLString local;
XMLString qname;
splitName(name, uri, local, qname);
if (!qname.empty()) qname += ':';
qname.append(local);
pContentHandler->endElement(uri, local, qname);
splitName(name, _uri, _local, _qname);
if (!_qname.empty()) _qname += ':';
_qname.append(_local);
pContentHandler->endElement(_uri, _local, _qname);
}

View File

@@ -1,7 +1,7 @@
//
// ParserEngine.cpp
//
// $Id: //poco/svn/XML/src/ParserEngine.cpp#2 $
// $Id: //poco/svn/XML/src/ParserEngine.cpp#3 $
//
// Library: XML
// Package: XML
@@ -249,6 +249,21 @@ void ParserEngine::parse(InputSource* pInputSource)
}
void ParserEngine::parse(const char* pBuffer, std::size_t size)
{
init();
resetContext();
InputSource src;
pushContext(_parser, &src);
if (_pContentHandler) _pContentHandler->setDocumentLocator(this);
if (_pContentHandler) _pContentHandler->startDocument();
if (!XML_Parse(_parser, pBuffer, static_cast<int>(size), 1))
handleError(XML_GetErrorCode(_parser));
if (_pContentHandler) _pContentHandler->endDocument();
popContext();
}
void ParserEngine::parseByteInputStream(XMLByteInputStream& istr)
{
istr.read(_pBuffer, PARSE_BUFFER_SIZE);

View File

@@ -1,7 +1,7 @@
//
// SAXParser.cpp
//
// $Id: //poco/svn/XML/src/SAXParser.cpp#2 $
// $Id: //poco/svn/XML/src/SAXParser.cpp#3 $
//
// Library: XML
// Package: SAX
@@ -228,9 +228,14 @@ void SAXParser::parse(const XMLString& systemId)
void SAXParser::parseString(const std::string& xml)
{
std::istringstream istr(xml);
InputSource src(istr);
parse(&src);
parseMemoryNP(xml.data(), xml.size());
}
void SAXParser::parseMemoryNP(const char* xml, std::size_t size)
{
setupParse();
_engine.parse(xml, size);
}

View File

@@ -1,7 +1,7 @@
//
// XMLFilterImpl.cpp
//
// $Id: //poco/svn/XML/src/XMLFilterImpl.cpp#2 $
// $Id: //poco/svn/XML/src/XMLFilterImpl.cpp#3 $
//
// Library: XML
// Package: SAX
@@ -186,6 +186,13 @@ void XMLFilterImpl::parse(const XMLString& systemId)
}
void XMLFilterImpl::parseMemoryNP(const char* xml, std::size_t size)
{
setupParse();
_pParent->parseMemoryNP(xml, size);
}
InputSource* XMLFilterImpl::resolveEntity(const XMLString* publicId, const XMLString& systemId)
{
if (_pEntityResolver)