xref: /aoo41x/main/unoxml/source/dom/saxbuilder.cxx (revision e9cbe144)
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