1*e9cbe144SAndrew Rist /************************************************************** 2*e9cbe144SAndrew Rist * 3*e9cbe144SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*e9cbe144SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*e9cbe144SAndrew Rist * distributed with this work for additional information 6*e9cbe144SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*e9cbe144SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*e9cbe144SAndrew Rist * "License"); you may not use this file except in compliance 9*e9cbe144SAndrew Rist * with the License. You may obtain a copy of the License at 10*e9cbe144SAndrew Rist * 11*e9cbe144SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*e9cbe144SAndrew Rist * 13*e9cbe144SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*e9cbe144SAndrew Rist * software distributed under the License is distributed on an 15*e9cbe144SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*e9cbe144SAndrew Rist * KIND, either express or implied. See the License for the 17*e9cbe144SAndrew Rist * specific language governing permissions and limitations 18*e9cbe144SAndrew Rist * under the License. 19*e9cbe144SAndrew Rist * 20*e9cbe144SAndrew Rist *************************************************************/ 21*e9cbe144SAndrew Rist 22*e9cbe144SAndrew Rist 23cdf0e10cSrcweir #if defined(_MSC_VER) && (_MSC_VER > 1310) 24cdf0e10cSrcweir #pragma warning(disable : 4701) 25cdf0e10cSrcweir #endif 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "saxbuilder.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <com/sun/star/xml/dom/XDocumentBuilder.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir 32cdf0e10cSrcweir namespace DOM 33cdf0e10cSrcweir { _getInstance(const Reference<XMultiServiceFactory> & rSMgr)34cdf0e10cSrcweir Reference< XInterface > CSAXDocumentBuilder::_getInstance(const Reference< XMultiServiceFactory >& rSMgr) 35cdf0e10cSrcweir { 36cdf0e10cSrcweir return static_cast< XSAXDocumentBuilder* >(new CSAXDocumentBuilder(rSMgr)); 37cdf0e10cSrcweir } 38cdf0e10cSrcweir 39cdf0e10cSrcweir const char* CSAXDocumentBuilder::aImplementationName = "com.sun.star.comp.xml.dom.SAXDocumentBuilder"; 40cdf0e10cSrcweir const char* CSAXDocumentBuilder::aSupportedServiceNames[] = { 41cdf0e10cSrcweir "com.sun.star.xml.dom.SAXDocumentBuilder", 42cdf0e10cSrcweir NULL 43cdf0e10cSrcweir }; 44cdf0e10cSrcweir CSAXDocumentBuilder(const Reference<XMultiServiceFactory> & mgr)45cdf0e10cSrcweir CSAXDocumentBuilder::CSAXDocumentBuilder(const Reference< XMultiServiceFactory >& mgr) 46cdf0e10cSrcweir : m_aServiceManager(mgr) 47cdf0e10cSrcweir , m_aState( SAXDocumentBuilderState_READY) 48cdf0e10cSrcweir {} 49cdf0e10cSrcweir _getImplementationName()50cdf0e10cSrcweir OUString CSAXDocumentBuilder::_getImplementationName() 51cdf0e10cSrcweir { 52cdf0e10cSrcweir return OUString::createFromAscii(aImplementationName); 53cdf0e10cSrcweir } _getSupportedServiceNames()54cdf0e10cSrcweir Sequence<OUString> CSAXDocumentBuilder::_getSupportedServiceNames() 55cdf0e10cSrcweir { 56cdf0e10cSrcweir Sequence<OUString> aSequence; 57cdf0e10cSrcweir for (int i=0; aSupportedServiceNames[i]!=NULL; i++) { 58cdf0e10cSrcweir aSequence.realloc(i+1); 59cdf0e10cSrcweir aSequence[i]=(OUString::createFromAscii(aSupportedServiceNames[i])); 60cdf0e10cSrcweir } 61cdf0e10cSrcweir return aSequence; 62cdf0e10cSrcweir } 63cdf0e10cSrcweir getSupportedServiceNames()64cdf0e10cSrcweir Sequence< OUString > SAL_CALL CSAXDocumentBuilder::getSupportedServiceNames() 65cdf0e10cSrcweir throw (RuntimeException) 66cdf0e10cSrcweir { 67cdf0e10cSrcweir return CSAXDocumentBuilder::_getSupportedServiceNames(); 68cdf0e10cSrcweir } 69cdf0e10cSrcweir getImplementationName()70cdf0e10cSrcweir OUString SAL_CALL CSAXDocumentBuilder::getImplementationName() 71cdf0e10cSrcweir throw (RuntimeException) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir return CSAXDocumentBuilder::_getImplementationName(); 74cdf0e10cSrcweir } 75cdf0e10cSrcweir supportsService(const OUString & aServiceName)76cdf0e10cSrcweir sal_Bool SAL_CALL CSAXDocumentBuilder::supportsService(const OUString& aServiceName) 77cdf0e10cSrcweir throw (RuntimeException) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir Sequence< OUString > supported = CSAXDocumentBuilder::_getSupportedServiceNames(); 80cdf0e10cSrcweir for (sal_Int32 i=0; i<supported.getLength(); i++) 81cdf0e10cSrcweir { 82cdf0e10cSrcweir if (supported[i] == aServiceName) return sal_True; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir return sal_False; 85cdf0e10cSrcweir } 86cdf0e10cSrcweir 87cdf0e10cSrcweir getState()88cdf0e10cSrcweir SAXDocumentBuilderState SAL_CALL CSAXDocumentBuilder::getState() 89cdf0e10cSrcweir throw (RuntimeException) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 92cdf0e10cSrcweir 93cdf0e10cSrcweir return m_aState; 94cdf0e10cSrcweir } 95cdf0e10cSrcweir reset()96cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::reset() 97cdf0e10cSrcweir throw (RuntimeException) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 100cdf0e10cSrcweir 101cdf0e10cSrcweir m_aDocument = Reference< XDocument >(); 102cdf0e10cSrcweir m_aFragment = Reference< XDocumentFragment >(); 103cdf0e10cSrcweir while (!m_aNodeStack.empty()) m_aNodeStack.pop(); 104cdf0e10cSrcweir while (!m_aNSStack.empty()) m_aNSStack.pop(); 105cdf0e10cSrcweir m_aState = SAXDocumentBuilderState_READY; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir getDocument()108cdf0e10cSrcweir Reference< XDocument > SAL_CALL CSAXDocumentBuilder::getDocument() 109cdf0e10cSrcweir throw (RuntimeException) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 112cdf0e10cSrcweir 113cdf0e10cSrcweir if (m_aState != SAXDocumentBuilderState_DOCUMENT_FINISHED) 114cdf0e10cSrcweir throw RuntimeException(); 115cdf0e10cSrcweir 116cdf0e10cSrcweir return m_aDocument; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir getDocumentFragment()119cdf0e10cSrcweir Reference< XDocumentFragment > SAL_CALL CSAXDocumentBuilder::getDocumentFragment() 120cdf0e10cSrcweir throw (RuntimeException) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 123cdf0e10cSrcweir 124cdf0e10cSrcweir if (m_aState != SAXDocumentBuilderState_FRAGMENT_FINISHED) 125cdf0e10cSrcweir throw RuntimeException(); 126cdf0e10cSrcweir return m_aFragment; 127cdf0e10cSrcweir } 128cdf0e10cSrcweir startDocumentFragment(const Reference<XDocument> & ownerDoc)129cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::startDocumentFragment(const Reference< XDocument >& ownerDoc) 130cdf0e10cSrcweir throw (RuntimeException) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 133cdf0e10cSrcweir 134cdf0e10cSrcweir // start a new document fragment and push it onto the stack 135cdf0e10cSrcweir // we have to be in a clean state to do this 136cdf0e10cSrcweir if (!m_aState == SAXDocumentBuilderState_READY) 137cdf0e10cSrcweir throw RuntimeException(); 138cdf0e10cSrcweir 139cdf0e10cSrcweir m_aDocument = ownerDoc; 140cdf0e10cSrcweir Reference< XDocumentFragment > aFragment = m_aDocument->createDocumentFragment(); 141cdf0e10cSrcweir m_aNodeStack.push(Reference< XNode >(aFragment, UNO_QUERY)); 142cdf0e10cSrcweir m_aFragment = aFragment; 143cdf0e10cSrcweir m_aState = SAXDocumentBuilderState_BUILDING_FRAGMENT; 144cdf0e10cSrcweir } 145cdf0e10cSrcweir endDocumentFragment()146cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::endDocumentFragment() 147cdf0e10cSrcweir throw (RuntimeException) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 150cdf0e10cSrcweir 151cdf0e10cSrcweir // there should only be the document left on the node stack 152cdf0e10cSrcweir if (m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT) 153cdf0e10cSrcweir throw RuntimeException(); 154cdf0e10cSrcweir 155cdf0e10cSrcweir Reference< XNode > aNode = m_aNodeStack.top(); 156cdf0e10cSrcweir if ( aNode->getNodeType() != NodeType_DOCUMENT_FRAGMENT_NODE) 157cdf0e10cSrcweir throw RuntimeException(); 158cdf0e10cSrcweir m_aNodeStack.pop(); 159cdf0e10cSrcweir m_aState = SAXDocumentBuilderState_FRAGMENT_FINISHED; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir 162cdf0e10cSrcweir // document handler 163cdf0e10cSrcweir startDocument()164cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::startDocument() throw (RuntimeException, SAXException) 165cdf0e10cSrcweir { 166cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 167cdf0e10cSrcweir 168cdf0e10cSrcweir // start a new document and push it onto the stack 169cdf0e10cSrcweir // we have to be in a clean state to do this 170cdf0e10cSrcweir if (!m_aState == SAXDocumentBuilderState_READY) 171cdf0e10cSrcweir throw SAXException(); 172cdf0e10cSrcweir 173cdf0e10cSrcweir Reference< XDocumentBuilder > aBuilder(m_aServiceManager->createInstance( 174cdf0e10cSrcweir OUString::createFromAscii("com.sun.star.xml.dom.DocumentBuilder")), UNO_QUERY_THROW); 175cdf0e10cSrcweir Reference< XDocument > aDocument = aBuilder->newDocument(); 176cdf0e10cSrcweir m_aNodeStack.push(Reference< XNode >(aDocument, UNO_QUERY)); 177cdf0e10cSrcweir m_aDocument = aDocument; 178cdf0e10cSrcweir m_aState = SAXDocumentBuilderState_BUILDING_DOCUMENT; 179cdf0e10cSrcweir } 180cdf0e10cSrcweir endDocument()181cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::endDocument() throw (RuntimeException, SAXException) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 184cdf0e10cSrcweir 185cdf0e10cSrcweir // there should only be the document left on the node stack 186cdf0e10cSrcweir if (!m_aState == SAXDocumentBuilderState_BUILDING_DOCUMENT) 187cdf0e10cSrcweir throw SAXException(); 188cdf0e10cSrcweir 189cdf0e10cSrcweir Reference< XNode > aNode = m_aNodeStack.top(); 190cdf0e10cSrcweir if ( aNode->getNodeType() != NodeType_DOCUMENT_NODE) 191cdf0e10cSrcweir throw SAXException(); 192cdf0e10cSrcweir m_aNodeStack.pop(); 193cdf0e10cSrcweir m_aState = SAXDocumentBuilderState_DOCUMENT_FINISHED; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir startElement(const OUString & aName,const Reference<XAttributeList> & attribs)196cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::startElement(const OUString& aName, const Reference< XAttributeList>& attribs) 197cdf0e10cSrcweir throw (RuntimeException, SAXException) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 200cdf0e10cSrcweir 201cdf0e10cSrcweir if ( m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT && 202cdf0e10cSrcweir m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir throw SAXException(); 205cdf0e10cSrcweir } 206cdf0e10cSrcweir 207cdf0e10cSrcweir // start with mappings in effect for last level 208cdf0e10cSrcweir NSMap aNSMap; 209cdf0e10cSrcweir if (!m_aNSStack.empty()) 210cdf0e10cSrcweir aNSMap = NSMap(m_aNSStack.top()); 211cdf0e10cSrcweir 212cdf0e10cSrcweir // handle xmlns: attributes and add to mappings 213cdf0e10cSrcweir OUString attr_qname; 214cdf0e10cSrcweir OUString attr_value; 215cdf0e10cSrcweir OUString newprefix; 216cdf0e10cSrcweir AttrMap aAttrMap; 217cdf0e10cSrcweir sal_Int32 idx=-1; 218cdf0e10cSrcweir sal_Int16 nAttributes = attribs->getLength(); 219cdf0e10cSrcweir for (sal_Int16 i=0; i<nAttributes; i++) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir attr_qname = attribs->getNameByIndex(i); 222cdf0e10cSrcweir attr_value = attribs->getValueByIndex(i); 223cdf0e10cSrcweir // new prefix mapping 224cdf0e10cSrcweir if (attr_qname.indexOf(OUString::createFromAscii("xmlns:")) == 0) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir newprefix = attr_qname.copy(attr_qname.indexOf(':')+1); 227cdf0e10cSrcweir aNSMap.insert(NSMap::value_type(newprefix, attr_value)); 228cdf0e10cSrcweir } 229cdf0e10cSrcweir else if (attr_qname == OUString::createFromAscii("xmlns")) 230cdf0e10cSrcweir { 231cdf0e10cSrcweir // new default prefix 232cdf0e10cSrcweir aNSMap.insert(NSMap::value_type(OUString(), attr_value)); 233cdf0e10cSrcweir } 234cdf0e10cSrcweir else 235cdf0e10cSrcweir { 236cdf0e10cSrcweir aAttrMap.insert(AttrMap::value_type(attr_qname, attr_value)); 237cdf0e10cSrcweir } 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir // does the element have a prefix? 241cdf0e10cSrcweir OUString aPrefix; 242cdf0e10cSrcweir OUString aURI; 243cdf0e10cSrcweir Reference< XElement > aElement; 244cdf0e10cSrcweir idx = aName.indexOf(':'); 245cdf0e10cSrcweir if (idx != -1) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir aPrefix = aName.copy(0, idx); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir else 250cdf0e10cSrcweir aPrefix = OUString(); 251cdf0e10cSrcweir 252cdf0e10cSrcweir NSMap::const_iterator result = aNSMap.find(aPrefix); 253cdf0e10cSrcweir if ( result != aNSMap.end()) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir // found a URI for prefix 256cdf0e10cSrcweir // qualified name 257cdf0e10cSrcweir aElement = m_aDocument->createElementNS( result->second, aName); 258cdf0e10cSrcweir } 259cdf0e10cSrcweir else 260cdf0e10cSrcweir { 261cdf0e10cSrcweir // no URI for prefix 262cdf0e10cSrcweir aElement = m_aDocument->createElement(aName); 263cdf0e10cSrcweir } 264cdf0e10cSrcweir aElement = Reference< XElement > ( 265cdf0e10cSrcweir m_aNodeStack.top()->appendChild(Reference< XNode >(aElement, UNO_QUERY)), 266cdf0e10cSrcweir UNO_QUERY); 267cdf0e10cSrcweir m_aNodeStack.push(Reference< XNode >(aElement, UNO_QUERY)); 268cdf0e10cSrcweir 269cdf0e10cSrcweir // set non xmlns attributes 270cdf0e10cSrcweir aPrefix = OUString(); 271cdf0e10cSrcweir aURI = OUString(); 272cdf0e10cSrcweir AttrMap::const_iterator a = aAttrMap.begin(); 273cdf0e10cSrcweir while (a != aAttrMap.end()) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir attr_qname = a->first; 276cdf0e10cSrcweir attr_value = a->second; 277cdf0e10cSrcweir idx = attr_qname.indexOf(':'); 278cdf0e10cSrcweir if(idx != -1) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir aPrefix = attr_qname.copy(0, idx); 281cdf0e10cSrcweir } 282cdf0e10cSrcweir else 283cdf0e10cSrcweir aPrefix = OUString(); 284cdf0e10cSrcweir 285cdf0e10cSrcweir result = aNSMap.find(aPrefix); 286cdf0e10cSrcweir if (result != aNSMap.end()) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir // set attribute with namespace 289cdf0e10cSrcweir aElement->setAttributeNS(result->second, attr_qname, attr_value); 290cdf0e10cSrcweir } else { 291cdf0e10cSrcweir // set attribute without namespace 292cdf0e10cSrcweir aElement->setAttribute(attr_qname, attr_value); 293cdf0e10cSrcweir } 294cdf0e10cSrcweir a++; 295cdf0e10cSrcweir } 296cdf0e10cSrcweir m_aNSStack.push(aNSMap); 297cdf0e10cSrcweir } 298cdf0e10cSrcweir endElement(const OUString & aName)299cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::endElement(const OUString& aName) 300cdf0e10cSrcweir throw (RuntimeException, SAXException) 301cdf0e10cSrcweir { 302cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 303cdf0e10cSrcweir 304cdf0e10cSrcweir // pop the current element from the stack 305cdf0e10cSrcweir if ( m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT && 306cdf0e10cSrcweir m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT) 307cdf0e10cSrcweir throw SAXException(); 308cdf0e10cSrcweir 309cdf0e10cSrcweir Reference< XNode > aNode(m_aNodeStack.top()); 310cdf0e10cSrcweir if (aNode->getNodeType() != NodeType_ELEMENT_NODE) 311cdf0e10cSrcweir throw SAXException(); 312cdf0e10cSrcweir 313cdf0e10cSrcweir Reference< XElement > aElement(aNode, UNO_QUERY); 314cdf0e10cSrcweir OUString aRefName; 315cdf0e10cSrcweir OUString aPrefix = aElement->getPrefix(); 316cdf0e10cSrcweir if (aPrefix.getLength() > 0) 317cdf0e10cSrcweir aRefName = aPrefix + OUString::createFromAscii(":") + aElement->getTagName(); 318cdf0e10cSrcweir else 319cdf0e10cSrcweir aRefName = aElement->getTagName(); 320cdf0e10cSrcweir if (aRefName != aName) // consistency check 321cdf0e10cSrcweir throw SAXException(); 322cdf0e10cSrcweir 323cdf0e10cSrcweir // pop it 324cdf0e10cSrcweir m_aNodeStack.pop(); 325cdf0e10cSrcweir m_aNSStack.pop(); 326cdf0e10cSrcweir } 327cdf0e10cSrcweir characters(const OUString & aChars)328cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::characters(const OUString& aChars) 329cdf0e10cSrcweir throw (RuntimeException, SAXException) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 332cdf0e10cSrcweir 333cdf0e10cSrcweir // append text node to the current top element 334cdf0e10cSrcweir if (m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT && 335cdf0e10cSrcweir m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT) 336cdf0e10cSrcweir throw SAXException(); 337cdf0e10cSrcweir 338cdf0e10cSrcweir Reference< XText > aText = m_aDocument->createTextNode(aChars); 339cdf0e10cSrcweir m_aNodeStack.top()->appendChild(Reference< XNode >(aText, UNO_QUERY)); 340cdf0e10cSrcweir } 341cdf0e10cSrcweir ignorableWhitespace(const OUString &)342cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::ignorableWhitespace(const OUString& ) 343cdf0e10cSrcweir throw (RuntimeException, SAXException) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 346cdf0e10cSrcweir 347cdf0e10cSrcweir // ignore ignorable whitespace 348cdf0e10cSrcweir if ( m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT && 349cdf0e10cSrcweir m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT) 350cdf0e10cSrcweir throw SAXException(); 351cdf0e10cSrcweir } 352cdf0e10cSrcweir processingInstruction(const OUString & aTarget,const OUString & aData)353cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::processingInstruction(const OUString& aTarget, const OUString& aData) 354cdf0e10cSrcweir throw (RuntimeException, SAXException) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 357cdf0e10cSrcweir 358cdf0e10cSrcweir // append PI node to the current top 359cdf0e10cSrcweir if ( m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT && 360cdf0e10cSrcweir m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT) 361cdf0e10cSrcweir throw SAXException(); 362cdf0e10cSrcweir 363cdf0e10cSrcweir Reference< XProcessingInstruction > aInstruction = m_aDocument->createProcessingInstruction( 364cdf0e10cSrcweir aTarget, aData); 365cdf0e10cSrcweir m_aNodeStack.top()->appendChild(Reference< XNode >(aInstruction, UNO_QUERY)); 366cdf0e10cSrcweir } 367cdf0e10cSrcweir setDocumentLocator(const Reference<XLocator> & aLocator)368cdf0e10cSrcweir void SAL_CALL CSAXDocumentBuilder::setDocumentLocator(const Reference< XLocator >& aLocator) 369cdf0e10cSrcweir throw (RuntimeException, SAXException) 370cdf0e10cSrcweir { 371cdf0e10cSrcweir ::osl::MutexGuard g(m_Mutex); 372cdf0e10cSrcweir 373cdf0e10cSrcweir // set the document locator... 374cdf0e10cSrcweir m_aLocator = aLocator; 375cdf0e10cSrcweir } 376cdf0e10cSrcweir } 377