diff options
Diffstat (limited to 'forms')
-rw-r--r-- | forms/qa/integration/forms/XMLFormSettings.java | 11 | ||||
-rw-r--r-- | forms/qa/org/openoffice/xforms/Instance.java | 17 | ||||
-rw-r--r-- | forms/source/xforms/submission/serialization_app_xml.cxx | 126 | ||||
-rw-r--r-- | forms/source/xforms/submission/serialization_app_xml.hxx | 5 | ||||
-rw-r--r-- | forms/source/xforms/submission/submission_put.cxx | 10 |
5 files changed, 89 insertions, 80 deletions
diff --git a/forms/qa/integration/forms/XMLFormSettings.java b/forms/qa/integration/forms/XMLFormSettings.java index e3881bfa861d..d7c98fdf17ce 100644 --- a/forms/qa/integration/forms/XMLFormSettings.java +++ b/forms/qa/integration/forms/XMLFormSettings.java @@ -85,17 +85,14 @@ public class XMLFormSettings extends complexlib.ComplexTestCase // create a simple structure in the DOM tree: an element with two attributes String[] modelNames = m_document.getXFormModelNames(); m_defaultModel = m_document.getXFormModel( modelNames[0] ); - Instance defaultInstance = m_defaultModel.getDefaultInstance(); + final Instance defaultInstance = m_defaultModel.getDefaultInstance(); + // remove the default root node + defaultInstance.removeNode( "instanceData" ); + // create test structures XNode stringElement = defaultInstance.createElement( "stringElement" ); XNode booleanAttrib = defaultInstance.createAttribute( stringElement, "booleanAttribute", "true" ); XNode dateAttrib = defaultInstance.createAttribute( stringElement, "dateAttribute" ); - // when it comes to saving and loading, only one child of the root element of the instance - // is handled (is this a bug? see xmloff/source/xforms/XFormsInstanceContext.cxx, method - // CreateChildContext). - // So, we remove the default node of the instance which it has all the time - defaultInstance.removeNode( "instanceData" ); - assure( "booleanAttrib's parent is wrong", UnoRuntime.areSame( stringElement, booleanAttrib.getParentNode() ) ); assure( "dateAttrib's parent is wrong", diff --git a/forms/qa/org/openoffice/xforms/Instance.java b/forms/qa/org/openoffice/xforms/Instance.java index 5e4e04741995..954ca6157f83 100644 --- a/forms/qa/org/openoffice/xforms/Instance.java +++ b/forms/qa/org/openoffice/xforms/Instance.java @@ -43,23 +43,6 @@ public class Instance /** creates a new element in the instance * - * The element will be inserted immediately below the root node of the instance. - * - * @param _elementName - * the name of the to-be-created element - * @param _initialNodeValue - * the initial value to set at the node. Might be null, in this case no value is set. - * @return - * the node of the newly created element - * @throws com.sun.star.xml.dom.DOMException - */ - public XNode createElement( String _elementName, String _initialNodeValue ) throws DOMException - { - return createElement( m_domInstance, _elementName, _initialNodeValue ); - } - - /** creates a new element in the instance - * * The element will be inserted immediately below a given XNode. * * @param _parentElement diff --git a/forms/source/xforms/submission/serialization_app_xml.cxx b/forms/source/xforms/submission/serialization_app_xml.cxx index 85cf066d6343..63ef50cdc454 100644 --- a/forms/source/xforms/submission/serialization_app_xml.cxx +++ b/forms/source/xforms/submission/serialization_app_xml.cxx @@ -31,91 +31,117 @@ #include "serialization.hxx" #include "serialization_app_xml.hxx" -#include <unotools/processfactory.hxx> +/** === begin UNO includes === **/ #include <com/sun/star/xml/dom/XNode.hpp> #include <com/sun/star/xml/dom/XDocument.hpp> #include <com/sun/star/xml/dom/XNodeList.hpp> #include <com/sun/star/xml/dom/NodeType.hpp> #include <com/sun/star/lang/XUnoTunnel.hpp> #include <com/sun/star/xml/xpath/XPathObjectType.hpp> +#include <com/sun/star/xml/sax/XSAXSerializable.hpp> +#include <com/sun/star/beans/StringPair.hpp> +#include <com/sun/star/io/XActiveDataSource.hpp> +#include <com/sun/star/xml/dom/XDocumentBuilder.hpp> +/** === end UNO includes === **/ -#include <libxml/tree.h> +#include <tools/diagnose_ex.h> +#include <comphelper/processfactory.hxx> + +#include <boost/scoped_ptr.hpp> +#include <limits> + +/** === begin UNO using === **/ +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::RuntimeException; +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::UNO_SET_THROW; +using ::com::sun::star::xml::dom::XNode; +using ::com::sun::star::xml::dom::XDocument; +using ::com::sun::star::xml::sax::XSAXSerializable; +using ::com::sun::star::beans::StringPair; +using ::com::sun::star::io::XActiveDataSource; +using ::com::sun::star::xml::dom::NodeType_DOCUMENT_NODE; +using ::com::sun::star::xml::dom::NodeType_ELEMENT_NODE; +using ::com::sun::star::xml::dom::XDocumentBuilder; +using ::com::sun::star::xml::sax::XDocumentHandler; +/** === end UNO using === **/ CSerializationAppXML::CSerializationAppXML() - : m_aFactory(utl::getProcessServiceFactory()) - , m_aPipe(CSS::uno::Reference< CSS::io::XOutputStream > (m_aFactory->createInstance( - rtl::OUString::createFromAscii("com.sun.star.io.Pipe")), CSS::uno::UNO_QUERY)) + :m_aContext( ::comphelper::getProcessServiceFactory() ) { - OSL_ENSURE(m_aPipe.is(), "cannot create Pipe"); + m_aContext.createComponent( "com.sun.star.io.Pipe", m_xBuffer ); } -CSS::uno::Reference< CSS::io::XInputStream > +Reference< CSS::io::XInputStream > CSerializationAppXML::getInputStream() { // The pipes output is provided through it's // XOutputStream interface aspect - return CSS::uno::Reference< CSS::io::XInputStream >(m_aPipe, CSS::uno::UNO_QUERY); + return Reference< CSS::io::XInputStream >(m_xBuffer, UNO_QUERY); } void -CSerializationAppXML::serialize_node(const CSS::uno::Reference< CSS::xml::dom::XNode >& rNode) +CSerializationAppXML::serialize_node(const Reference< XNode >& rNode) { - CSS::uno::Reference< CSS::xml::dom::XNode > aNode = rNode; - if (aNode->getNodeType() == CSS::xml::dom::NodeType_DOCUMENT_NODE) + try { - CSS::uno::Reference< CSS::xml::dom::XDocument > aDoc(rNode, CSS::uno::UNO_QUERY_THROW); - aNode = CSS::uno::Reference< CSS::xml::dom::XNode >(aDoc->getDocumentElement(), CSS::uno::UNO_QUERY_THROW); - } - if (aNode->getNodeType() != CSS::xml::dom::NodeType_ELEMENT_NODE) - return; + Reference< XSAXSerializable > xSerializer( rNode, UNO_QUERY ); + if ( !xSerializer.is() ) + { + // ensure we have a "real" node + Reference< XNode > xNode = rNode; + if ( xNode->getNodeType() == NodeType_DOCUMENT_NODE ) + { + Reference< XDocument > const xDoc( xNode, UNO_QUERY_THROW ); + xNode.set( xDoc->getDocumentElement(), UNO_QUERY_THROW ); + } + ENSURE_OR_RETURN_VOID( xNode->getNodeType() == NodeType_ELEMENT_NODE, + "CSerializationAppXML::serialize_node: invalid node type!" ); - // clone the node to a new document and serialize that document - CSS::uno::Reference< CSS::lang::XUnoTunnel > aTunnel(aNode, CSS::uno::UNO_QUERY); - if (aTunnel.is()) - { - xmlNodePtr aNodePtr = reinterpret_cast< xmlNodePtr >( aTunnel->getSomething(CSS::uno::Sequence< sal_Int8 >()) ); - xmlDocPtr aDocPtr = xmlNewDoc((xmlChar*)"1.0"); - xmlNodePtr aDocNodePtr = xmlDocCopyNode(aNodePtr, aDocPtr, 1); - if (aDocNodePtr != NULL) { - xmlAddChild((xmlNodePtr)aDocPtr, aDocNodePtr); - xmlChar *buffer = NULL; - sal_Int32 size = 0; - xmlDocDumpMemory(aDocPtr, &buffer, (int*)&size); - - // write the xml into the pipe through it's XOutputStream interface - m_aPipe->writeBytes(CSS::uno::Sequence< sal_Int8 >((sal_Int8*)buffer, size)); - xmlFree(buffer); + // create a new document + Reference< XDocumentBuilder > const xDocBuilder( + m_aContext.createComponent( "com.sun.star.xml.dom.DocumentBuilder" ), UNO_QUERY_THROW ); + Reference< XDocument > const xDocument( xDocBuilder->newDocument(), UNO_SET_THROW ); + + // copy the to-be-serialized node + Reference< XNode > const xImportedNode( xDocument->importNode( xNode, true ), UNO_SET_THROW ); + xDocument->appendChild( xImportedNode ); + + // ask the doc for the serializer + xSerializer.set( xDocument, UNO_QUERY ); } - } else { - // can't get tunnel to native backend - // logic for generic implementation could be implemented here... - OSL_ENSURE(sal_False, "unkown dom implementation, cannot serialize"); - return; - } -} + ENSURE_OR_RETURN_VOID( xSerializer.is(), + "CSerializationAppXML::serialize_node: no serialization access to the node/document!" ); -/* -void -CSerializationAppXML::serialize_nodeset() -{ - CSS::uno::Reference< CSS::xml::dom::XNodeList > aNodeList = m_aXPathObject->getNodeList(); - for (sal_Int32 i=0; i<aNodeList->getLength(); i++) - serialize_node(aNodeList->item(i)); - m_aPipe->closeOutput(); + // create a SAXWriter to take the serialization events, and connect it to our pipe + Reference< XDocumentHandler > const xSaxWriter( + m_aContext.createComponent( "com.sun.star.xml.sax.Writer" ), UNO_QUERY_THROW ); + Reference< XActiveDataSource > const xDataSource( xSaxWriter, UNO_QUERY_THROW ); + xDataSource->setOutputStream( m_xBuffer ); + + // do the serialization + xSerializer->serialize( xSaxWriter, Sequence< StringPair >() ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } } -*/ void CSerializationAppXML::serialize() { if (!m_aFragment.is()) return; - CSS::uno::Reference< CSS::xml::dom::XNode > cur = m_aFragment->getFirstChild(); + Reference< XNode > cur = m_aFragment->getFirstChild(); while (cur.is()) { serialize_node(cur); cur = cur->getNextSibling(); } - m_aPipe->closeOutput(); + m_xBuffer->closeOutput(); } diff --git a/forms/source/xforms/submission/serialization_app_xml.hxx b/forms/source/xforms/submission/serialization_app_xml.hxx index 338df6aea083..7380b5834ed1 100644 --- a/forms/source/xforms/submission/serialization_app_xml.hxx +++ b/forms/source/xforms/submission/serialization_app_xml.hxx @@ -33,12 +33,13 @@ #include "serialization.hxx" +#include <comphelper/componentcontext.hxx> class CSerializationAppXML : public CSerialization { private: - CSS::uno::Reference< CSS::lang::XMultiServiceFactory > m_aFactory; - CSS::uno::Reference< CSS::io::XOutputStream > m_aPipe; + ::comphelper::ComponentContext m_aContext; + CSS::uno::Reference< CSS::io::XOutputStream > m_xBuffer; void serialize_node(const CSS::uno::Reference< CSS::xml::dom::XNode >& aNode); void serialize_nodeset(); diff --git a/forms/source/xforms/submission/submission_put.cxx b/forms/source/xforms/submission/submission_put.cxx index 9ed37470ba93..02bd1f485091 100644 --- a/forms/source/xforms/submission/submission_put.cxx +++ b/forms/source/xforms/submission/submission_put.cxx @@ -35,6 +35,7 @@ #include "serialization_urlencoded.hxx" #include <osl/file.hxx> +#include <tools/diagnose_ex.h> #include <unotools/processfactory.hxx> #include <ucbhelper/content.hxx> @@ -58,7 +59,8 @@ CSubmission::SubmissionResult CSubmissionPut::submit(const CSS::uno::Reference< CSS::uno::Reference< XCommandEnvironment > aEnvironment; auto_ptr< CSerialization > apSerialization(createSerialization(aInteractionHandler,aEnvironment)); - try { + try + { ucbhelper::Content aContent(m_aURLObj.GetMainURL(INetURLObject::NO_DECODE), aEnvironment); // insert serialized data to content -> PUT @@ -68,10 +70,10 @@ CSubmission::SubmissionResult CSubmissionPut::submit(const CSS::uno::Reference< // no content as a result of put... - } catch (Exception&) + } + catch ( const Exception& ) { - // XXX - OSL_ENSURE(sal_False, "Exception during UCB operatration."); + DBG_UNHANDLED_EXCEPTION(); return UNKNOWN_ERROR; } |