| /* |
| * 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. |
| */ |
| |
| /* |
| * $Id: XSAnnotation.cpp 568078 2007-08-21 11:43:25Z amassari $ |
| */ |
| |
| #include <xercesc/framework/psvi/XSAnnotation.hpp> |
| #include <xercesc/util/XMLString.hpp> |
| |
| #include <xercesc/framework/MemBufInputSource.hpp> |
| |
| #include <xercesc/sax2/SAX2XMLReader.hpp> |
| #include <xercesc/sax2/XMLReaderFactory.hpp> |
| #include <xercesc/parsers/XercesDOMParser.hpp> |
| #include <xercesc/dom/DOMElement.hpp> |
| |
| XERCES_CPP_NAMESPACE_BEGIN |
| |
| XSAnnotation::XSAnnotation(const XMLCh* const content, |
| MemoryManager * const manager) |
| :XSObject(XSConstants::ANNOTATION, 0, manager) |
| ,fContents(XMLString::replicate(content, manager)) |
| ,fNext(0) |
| ,fSystemId(0) |
| ,fLine(0) |
| ,fCol(0) |
| { |
| } |
| |
| XSAnnotation::XSAnnotation(MemoryManager * const manager) |
| :XSObject(XSConstants::ANNOTATION, 0, manager) |
| ,fContents(0) |
| ,fNext(0) |
| ,fSystemId(0) |
| ,fLine(0) |
| ,fCol(0) |
| { |
| } |
| |
| XSAnnotation::~XSAnnotation() |
| { |
| fMemoryManager->deallocate(fContents); |
| |
| if (fNext) |
| delete fNext; |
| |
| fMemoryManager->deallocate(fSystemId); |
| } |
| |
| // XSAnnotation methods |
| void XSAnnotation::writeAnnotation(DOMNode* node, ANNOTATION_TARGET targetType) |
| { |
| XercesDOMParser *parser = new (fMemoryManager) XercesDOMParser(0, fMemoryManager); |
| parser->setDoNamespaces(true); |
| parser->setValidationScheme(XercesDOMParser::Val_Never); |
| |
| DOMDocument* futureOwner = (targetType == W3C_DOM_ELEMENT) ? |
| ((DOMElement*)node)->getOwnerDocument() : |
| (DOMDocument*)node; |
| |
| MemBufInputSource* memBufIS = new (fMemoryManager) MemBufInputSource |
| ( |
| (const XMLByte*)fContents |
| , XMLString::stringLen(fContents)*sizeof(XMLCh) |
| , "" |
| , false |
| , fMemoryManager |
| ); |
| memBufIS->setEncoding(XMLUni::fgXMLChEncodingString); |
| memBufIS->setCopyBufToStream(false); |
| |
| try |
| { |
| parser->parse(*memBufIS); |
| } |
| catch (const XMLException&) |
| { |
| // REVISIT: should we really eat this? |
| } |
| |
| DOMNode* newElem = futureOwner->importNode((parser->getDocument())->getDocumentElement(), true); |
| node->insertBefore(newElem, node->getFirstChild()); |
| |
| delete parser; |
| delete memBufIS; |
| } |
| |
| |
| void XSAnnotation::writeAnnotation(ContentHandler* handler) |
| { |
| SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(fMemoryManager); |
| parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); |
| parser->setFeature(XMLUni::fgSAX2CoreValidation, false); |
| parser->setContentHandler(handler); |
| |
| MemBufInputSource* memBufIS = new (fMemoryManager) MemBufInputSource |
| ( |
| (const XMLByte*)fContents |
| , XMLString::stringLen(fContents)*sizeof(XMLCh) |
| , "" |
| , false |
| , fMemoryManager |
| ); |
| memBufIS->setEncoding(XMLUni::fgXMLChEncodingString); |
| memBufIS->setCopyBufToStream(false); |
| |
| try |
| { |
| parser->parse(*memBufIS); |
| } |
| catch (const XMLException&) |
| { |
| } |
| |
| delete parser; |
| delete memBufIS; |
| } |
| |
| |
| void XSAnnotation::setNext(XSAnnotation* const nextAnnotation) |
| { |
| if (fNext) |
| fNext->setNext(nextAnnotation); |
| else |
| fNext = nextAnnotation; |
| } |
| |
| XSAnnotation* XSAnnotation::getNext() |
| { |
| return fNext; |
| } |
| |
| void XSAnnotation::setSystemId(const XMLCh* const systemId) |
| { |
| if (fSystemId) |
| { |
| fMemoryManager->deallocate(fSystemId); |
| fSystemId = 0; |
| } |
| |
| if (systemId) |
| fSystemId = XMLString::replicate(systemId, fMemoryManager); |
| |
| } |
| |
| /*** |
| * Support for Serialization/De-serialization |
| ***/ |
| |
| IMPL_XSERIALIZABLE_TOCREATE(XSAnnotation) |
| |
| void XSAnnotation::serialize(XSerializeEngine& serEng) |
| { |
| |
| if (serEng.isStoring()) |
| { |
| serEng.writeString(fContents); |
| serEng<<fNext; |
| serEng.writeString(fSystemId); |
| serEng<<fLine; |
| serEng<<fCol; |
| } |
| else |
| { |
| serEng.readString(fContents); |
| serEng>>fNext; |
| serEng.readString(fSystemId); |
| serEng>>fLine; |
| serEng>>fCol; |
| } |
| } |
| |
| XERCES_CPP_NAMESPACE_END |
| |
| |