1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_forms.hxx"
26*b1cdbd2cSJim Jagielski #include "submission.hxx"
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include "model.hxx"
29*b1cdbd2cSJim Jagielski #include "binding.hxx"
30*b1cdbd2cSJim Jagielski #include "mip.hxx"
31*b1cdbd2cSJim Jagielski #include "evaluationcontext.hxx"
32*b1cdbd2cSJim Jagielski #include "unohelper.hxx"
33*b1cdbd2cSJim Jagielski #include "submission/submission_put.hxx"
34*b1cdbd2cSJim Jagielski #include "submission/submission_post.hxx"
35*b1cdbd2cSJim Jagielski #include "submission/submission_get.hxx"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
38*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Sequence.hxx>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/xforms/XModel.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/RuntimeException.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/xpath/XXPathObject.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/xpath/XPathObjectType.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/dom/XNodeList.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/dom/XDocument.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/dom/XDocumentBuilder.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/dom/XDocumentFragment.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/dom/NodeType.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionHandler.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionRequest.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionContinuation.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/xforms/InvalidDataOnSubmitException.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp>
57*b1cdbd2cSJim Jagielski #include <cppuhelper/typeprovider.hxx>
58*b1cdbd2cSJim Jagielski #include <comphelper/propertysetinfo.hxx>
59*b1cdbd2cSJim Jagielski #include <comphelper/interaction.hxx>
60*b1cdbd2cSJim Jagielski #include <unotools/processfactory.hxx>
61*b1cdbd2cSJim Jagielski #include <memory>
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski using rtl::OUString;
67*b1cdbd2cSJim Jagielski using rtl::OUStringBuffer;
68*b1cdbd2cSJim Jagielski using com::sun::star::beans::UnknownPropertyException;
69*b1cdbd2cSJim Jagielski using com::sun::star::beans::PropertyVetoException;
70*b1cdbd2cSJim Jagielski using com::sun::star::lang::IllegalArgumentException;
71*b1cdbd2cSJim Jagielski using com::sun::star::util::VetoException;
72*b1cdbd2cSJim Jagielski using com::sun::star::form::submission::XSubmissionVetoListener;
73*b1cdbd2cSJim Jagielski using com::sun::star::lang::WrappedTargetException;
74*b1cdbd2cSJim Jagielski using com::sun::star::lang::NoSupportException;
75*b1cdbd2cSJim Jagielski using com::sun::star::task::XInteractionHandler;
76*b1cdbd2cSJim Jagielski using com::sun::star::task::XInteractionRequest;
77*b1cdbd2cSJim Jagielski using com::sun::star::task::XInteractionContinuation;
78*b1cdbd2cSJim Jagielski using com::sun::star::xforms::XModel;
79*b1cdbd2cSJim Jagielski using com::sun::star::xforms::InvalidDataOnSubmitException;
80*b1cdbd2cSJim Jagielski using com::sun::star::container::XNameAccess;
81*b1cdbd2cSJim Jagielski using com::sun::star::xml::xpath::XXPathObject;
82*b1cdbd2cSJim Jagielski using com::sun::star::xml::xpath::XPathObjectType;
83*b1cdbd2cSJim Jagielski using com::sun::star::frame::XFrame;
84*b1cdbd2cSJim Jagielski using xforms::Submission;
85*b1cdbd2cSJim Jagielski using xforms::Model;
86*b1cdbd2cSJim Jagielski using xforms::MIP;
87*b1cdbd2cSJim Jagielski using std::auto_ptr;
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
90*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
91*b1cdbd2cSJim Jagielski using namespace com::sun::star::xml::dom;
92*b1cdbd2cSJim Jagielski 
Submission()93*b1cdbd2cSJim Jagielski Submission::Submission() :
94*b1cdbd2cSJim Jagielski     msID(),
95*b1cdbd2cSJim Jagielski     msBind(),
96*b1cdbd2cSJim Jagielski     maRef(),
97*b1cdbd2cSJim Jagielski     msAction(),
98*b1cdbd2cSJim Jagielski     msMethod(),
99*b1cdbd2cSJim Jagielski     msVersion(),
100*b1cdbd2cSJim Jagielski     mbIndent(),
101*b1cdbd2cSJim Jagielski     msMediaType(),
102*b1cdbd2cSJim Jagielski     msEncoding(),
103*b1cdbd2cSJim Jagielski     mbOmitXmlDeclaration(),
104*b1cdbd2cSJim Jagielski     mbStandalone(),
105*b1cdbd2cSJim Jagielski     msCDataSectionElement(),
106*b1cdbd2cSJim Jagielski     msReplace( OUSTRING("none") ),
107*b1cdbd2cSJim Jagielski     msSeparator(),
108*b1cdbd2cSJim Jagielski     msIncludeNamespacePrefixes(),
109*b1cdbd2cSJim Jagielski     m_aFactory(utl::getProcessServiceFactory())
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski     initializePropertySet();
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
~Submission()114*b1cdbd2cSJim Jagielski Submission::~Submission() throw()
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
getModel() const118*b1cdbd2cSJim Jagielski Reference<XModel> Submission::getModel() const
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski     return mxModel;
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
setModel(const Reference<XModel> & xModel)123*b1cdbd2cSJim Jagielski void Submission::setModel( const Reference<XModel>& xModel )
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski     mxModel = xModel;
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
getID() const128*b1cdbd2cSJim Jagielski OUString Submission::getID() const
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     return msID;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
setID(const OUString & sID)133*b1cdbd2cSJim Jagielski void Submission::setID( const OUString& sID )
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski     msID = sID;
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
getBind() const138*b1cdbd2cSJim Jagielski OUString Submission::getBind() const
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski     return msBind;
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski 
setBind(const OUString & sBind)143*b1cdbd2cSJim Jagielski void Submission::setBind( const OUString& sBind )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski     msBind = sBind;
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
getRef() const148*b1cdbd2cSJim Jagielski OUString Submission::getRef() const
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski     return maRef.getExpression();
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
setRef(const OUString & sRef)153*b1cdbd2cSJim Jagielski void Submission::setRef( const OUString& sRef )
154*b1cdbd2cSJim Jagielski {
155*b1cdbd2cSJim Jagielski     maRef.setExpression( sRef );
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
getAction() const158*b1cdbd2cSJim Jagielski OUString Submission::getAction() const
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     return msAction;
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski 
setAction(const OUString & sAction)163*b1cdbd2cSJim Jagielski void Submission::setAction( const OUString& sAction )
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski     msAction = sAction;
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
getMethod() const168*b1cdbd2cSJim Jagielski OUString Submission::getMethod() const
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski     return msMethod;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
setMethod(const OUString & sMethod)173*b1cdbd2cSJim Jagielski void Submission::setMethod( const OUString& sMethod )
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski     msMethod = sMethod;
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
getVersion() const178*b1cdbd2cSJim Jagielski OUString Submission::getVersion() const
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     return msVersion;
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
setVersion(const OUString & sVersion)183*b1cdbd2cSJim Jagielski void Submission::setVersion( const OUString& sVersion )
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski     msVersion = sVersion;
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski 
getIndent() const188*b1cdbd2cSJim Jagielski bool Submission::getIndent() const
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski     return mbIndent;
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
setIndent(bool bIndent)193*b1cdbd2cSJim Jagielski void Submission::setIndent( bool bIndent )
194*b1cdbd2cSJim Jagielski {
195*b1cdbd2cSJim Jagielski     mbIndent = bIndent;
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
getMediaType() const198*b1cdbd2cSJim Jagielski OUString Submission::getMediaType() const
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     return msMediaType;
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
setMediaType(const OUString & sMediaType)203*b1cdbd2cSJim Jagielski void Submission::setMediaType( const OUString& sMediaType )
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski     msMediaType = sMediaType;
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
getEncoding() const208*b1cdbd2cSJim Jagielski OUString Submission::getEncoding() const
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski     return msEncoding;
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski 
setEncoding(const OUString & sEncoding)213*b1cdbd2cSJim Jagielski void Submission::setEncoding( const OUString& sEncoding )
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski     msEncoding = sEncoding;
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski 
getOmitXmlDeclaration() const218*b1cdbd2cSJim Jagielski bool Submission::getOmitXmlDeclaration() const
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski     return mbOmitXmlDeclaration;
221*b1cdbd2cSJim Jagielski }
222*b1cdbd2cSJim Jagielski 
setOmitXmlDeclaration(bool bOmitXmlDeclaration)223*b1cdbd2cSJim Jagielski void Submission::setOmitXmlDeclaration( bool bOmitXmlDeclaration )
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski     mbOmitXmlDeclaration = bOmitXmlDeclaration;
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
getStandalone() const228*b1cdbd2cSJim Jagielski bool Submission::getStandalone() const
229*b1cdbd2cSJim Jagielski {
230*b1cdbd2cSJim Jagielski     return mbStandalone;
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
setStandalone(bool bStandalone)233*b1cdbd2cSJim Jagielski void Submission::setStandalone( bool bStandalone )
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski     mbStandalone = bStandalone;
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
getCDataSectionElement() const238*b1cdbd2cSJim Jagielski OUString Submission::getCDataSectionElement() const
239*b1cdbd2cSJim Jagielski {
240*b1cdbd2cSJim Jagielski     return msCDataSectionElement;
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
setCDataSectionElement(const OUString & sCDataSectionElement)243*b1cdbd2cSJim Jagielski void Submission::setCDataSectionElement( const OUString& sCDataSectionElement )
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski     msCDataSectionElement = sCDataSectionElement;
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski 
getReplace() const248*b1cdbd2cSJim Jagielski OUString Submission::getReplace() const
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski     return msReplace;
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski 
setReplace(const OUString & sReplace)253*b1cdbd2cSJim Jagielski void Submission::setReplace( const OUString& sReplace )
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski     msReplace = sReplace;
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
getSeparator() const258*b1cdbd2cSJim Jagielski OUString Submission::getSeparator() const
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski     return msSeparator;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
setSeparator(const OUString & sSeparator)263*b1cdbd2cSJim Jagielski void Submission::setSeparator( const OUString& sSeparator )
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski     msSeparator = sSeparator;
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski 
getIncludeNamespacePrefixes() const268*b1cdbd2cSJim Jagielski Sequence< OUString > Submission::getIncludeNamespacePrefixes() const
269*b1cdbd2cSJim Jagielski {
270*b1cdbd2cSJim Jagielski     return msIncludeNamespacePrefixes;
271*b1cdbd2cSJim Jagielski }
272*b1cdbd2cSJim Jagielski 
setIncludeNamespacePrefixes(const Sequence<OUString> & rIncludeNamespacePrefixes)273*b1cdbd2cSJim Jagielski void Submission::setIncludeNamespacePrefixes( const Sequence< OUString >& rIncludeNamespacePrefixes )
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski     msIncludeNamespacePrefixes = rIncludeNamespacePrefixes;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
doSubmit(const Reference<XInteractionHandler> & xHandler)278*b1cdbd2cSJim Jagielski bool Submission::doSubmit( const Reference< XInteractionHandler >& xHandler )
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski     liveCheck();
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski     // construct XXPathObject for submission doc; use bind in preference of ref
283*b1cdbd2cSJim Jagielski     EvaluationContext aEvalContext;
284*b1cdbd2cSJim Jagielski     ComputedExpression aExpression;
285*b1cdbd2cSJim Jagielski     if( msBind.getLength() != 0 )
286*b1cdbd2cSJim Jagielski     {
287*b1cdbd2cSJim Jagielski         Binding* pBinding = Binding::getBinding( mxModel->getBinding(msBind) );
288*b1cdbd2cSJim Jagielski         if( pBinding != NULL )
289*b1cdbd2cSJim Jagielski         {
290*b1cdbd2cSJim Jagielski             aExpression.setExpression( pBinding->getBindingExpression() );
291*b1cdbd2cSJim Jagielski             aEvalContext = pBinding->getEvaluationContext();
292*b1cdbd2cSJim Jagielski         }
293*b1cdbd2cSJim Jagielski         // TODO: else: illegal binding name -> raise error
294*b1cdbd2cSJim Jagielski     }
295*b1cdbd2cSJim Jagielski     else if( maRef.getExpression().getLength() != 0 )
296*b1cdbd2cSJim Jagielski     {
297*b1cdbd2cSJim Jagielski         aExpression.setExpression( maRef.getExpression() );
298*b1cdbd2cSJim Jagielski         aEvalContext = Model::getModel( mxModel )->getEvaluationContext();
299*b1cdbd2cSJim Jagielski     }
300*b1cdbd2cSJim Jagielski     else
301*b1cdbd2cSJim Jagielski     {
302*b1cdbd2cSJim Jagielski         aExpression.setExpression( OUSTRING( "/" ) );
303*b1cdbd2cSJim Jagielski         aEvalContext = Model::getModel( mxModel )->getEvaluationContext();
304*b1cdbd2cSJim Jagielski     }
305*b1cdbd2cSJim Jagielski     aExpression.evaluate( aEvalContext );
306*b1cdbd2cSJim Jagielski     Reference<XXPathObject> xResult = aExpression.getXPath();
307*b1cdbd2cSJim Jagielski     OSL_ENSURE( xResult.is(), "no result?" );
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     // early out if we have not obtained any result
310*b1cdbd2cSJim Jagielski     if( ! xResult.is() )
311*b1cdbd2cSJim Jagielski         return false;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     // Reference< XNodeList > aList = xResult->getNodeList();
315*b1cdbd2cSJim Jagielski     OUString aMethod = getMethod();
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski     // strip whitespace-only text node for get submission
318*b1cdbd2cSJim Jagielski     Reference< XDocumentFragment > aFragment = createSubmissionDocument(
319*b1cdbd2cSJim Jagielski         xResult, aMethod.equalsIgnoreAsciiCaseAscii("get"));
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski     // submit result; set encoding, etc.
322*b1cdbd2cSJim Jagielski     auto_ptr<CSubmission> xSubmission;
323*b1cdbd2cSJim Jagielski     if (aMethod.equalsIgnoreAsciiCaseAscii("PUT"))
324*b1cdbd2cSJim Jagielski         xSubmission = auto_ptr<CSubmission>(
325*b1cdbd2cSJim Jagielski             new CSubmissionPut( getAction(), aFragment));
326*b1cdbd2cSJim Jagielski     else if (aMethod.equalsIgnoreAsciiCaseAscii("post"))
327*b1cdbd2cSJim Jagielski         xSubmission = auto_ptr<CSubmission>(
328*b1cdbd2cSJim Jagielski             new CSubmissionPost( getAction(), aFragment));
329*b1cdbd2cSJim Jagielski     else if (aMethod.equalsIgnoreAsciiCaseAscii("get"))
330*b1cdbd2cSJim Jagielski         xSubmission = auto_ptr<CSubmission>(
331*b1cdbd2cSJim Jagielski             new CSubmissionGet( getAction(), aFragment));
332*b1cdbd2cSJim Jagielski     else
333*b1cdbd2cSJim Jagielski     {
334*b1cdbd2cSJim Jagielski         OSL_ENSURE(sal_False, "Unsupported xforms submission method");
335*b1cdbd2cSJim Jagielski         return false;
336*b1cdbd2cSJim Jagielski     }
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski     xSubmission->setEncoding(getEncoding());
339*b1cdbd2cSJim Jagielski     CSubmission::SubmissionResult aResult = xSubmission->submit( xHandler );
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski     if (aResult == CSubmission::SUCCESS)
342*b1cdbd2cSJim Jagielski     {
343*b1cdbd2cSJim Jagielski         Reference< XDocument > aInstanceDoc = getInstanceDocument(xResult);
344*b1cdbd2cSJim Jagielski         aResult = xSubmission->replace(getReplace(), aInstanceDoc, Reference< XFrame >());
345*b1cdbd2cSJim Jagielski     }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski     return ( aResult == CSubmission::SUCCESS );
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
getUnoTunnelID()350*b1cdbd2cSJim Jagielski Sequence<sal_Int8> Submission::getUnoTunnelID()
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski     static cppu::OImplementationId aImplementationId;
353*b1cdbd2cSJim Jagielski     return aImplementationId.getImplementationId();
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski 
getSubmission(const Reference<XPropertySet> & xPropertySet)356*b1cdbd2cSJim Jagielski Submission* Submission::getSubmission(
357*b1cdbd2cSJim Jagielski     const Reference<XPropertySet>& xPropertySet )
358*b1cdbd2cSJim Jagielski {
359*b1cdbd2cSJim Jagielski     Reference<XUnoTunnel> xTunnel( xPropertySet, UNO_QUERY );
360*b1cdbd2cSJim Jagielski     return xTunnel.is()
361*b1cdbd2cSJim Jagielski         ? reinterpret_cast<Submission*>(
362*b1cdbd2cSJim Jagielski             xTunnel->getSomething( getUnoTunnelID() ) )
363*b1cdbd2cSJim Jagielski         : NULL;
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 
liveCheck()371*b1cdbd2cSJim Jagielski void Submission::liveCheck()
372*b1cdbd2cSJim Jagielski     throw( RuntimeException )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski     bool bValid = mxModel.is();
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski     if( ! bValid )
377*b1cdbd2cSJim Jagielski         throw RuntimeException();
378*b1cdbd2cSJim Jagielski }
379*b1cdbd2cSJim Jagielski 
getModelImpl() const380*b1cdbd2cSJim Jagielski Model* Submission::getModelImpl() const
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski     Model* pModel = NULL;
383*b1cdbd2cSJim Jagielski     if( mxModel.is() )
384*b1cdbd2cSJim Jagielski         pModel = Model::getModel( mxModel );
385*b1cdbd2cSJim Jagielski     return pModel;
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski //
390*b1cdbd2cSJim Jagielski // Property-Set implementation
391*b1cdbd2cSJim Jagielski //
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski #define HANDLE_ID 0
394*b1cdbd2cSJim Jagielski #define HANDLE_Bind 1
395*b1cdbd2cSJim Jagielski #define HANDLE_Ref 2
396*b1cdbd2cSJim Jagielski #define HANDLE_Action 3
397*b1cdbd2cSJim Jagielski #define HANDLE_Method 4
398*b1cdbd2cSJim Jagielski #define HANDLE_Version 5
399*b1cdbd2cSJim Jagielski #define HANDLE_Indent 6
400*b1cdbd2cSJim Jagielski #define HANDLE_MediaType 7
401*b1cdbd2cSJim Jagielski #define HANDLE_Encoding 8
402*b1cdbd2cSJim Jagielski #define HANDLE_OmitXmlDeclaration 9
403*b1cdbd2cSJim Jagielski #define HANDLE_Standalone 10
404*b1cdbd2cSJim Jagielski #define HANDLE_CDataSectionElement 11
405*b1cdbd2cSJim Jagielski #define HANDLE_Replace 12
406*b1cdbd2cSJim Jagielski #define HANDLE_Separator 13
407*b1cdbd2cSJim Jagielski #define HANDLE_IncludeNamespacePrefixes 14
408*b1cdbd2cSJim Jagielski #define HANDLE_Model 15
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski #define REGISTER_PROPERTY( property, type )   \
411*b1cdbd2cSJim Jagielski     registerProperty( PROPERTY( property, type ), \
412*b1cdbd2cSJim Jagielski     new DirectPropertyAccessor< Submission, type >( this, &Submission::set##property, &Submission::get##property ) );
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski #define REGISTER_PROPERTY_BOOL( property )   \
415*b1cdbd2cSJim Jagielski     registerProperty( PROPERTY( property, bool ), \
416*b1cdbd2cSJim Jagielski     new BooleanPropertyAccessor< Submission, bool >( this, &Submission::set##property, &Submission::get##property ) );
417*b1cdbd2cSJim Jagielski 
initializePropertySet()418*b1cdbd2cSJim Jagielski void Submission::initializePropertySet()
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( ID,                         OUString );
421*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Bind,                       OUString );
422*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Ref,                        OUString );
423*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Action,                     OUString );
424*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Method,                     OUString );
425*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Version,                    OUString );
426*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY_BOOL( Indent );
427*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( MediaType,                  OUString );
428*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Encoding,                   OUString );
429*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY_BOOL( OmitXmlDeclaration );
430*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY_BOOL( Standalone );
431*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( CDataSectionElement,        OUString );
432*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Replace,                    OUString );
433*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Separator,                  OUString );
434*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( IncludeNamespacePrefixes,   Sequence< OUString > );
435*b1cdbd2cSJim Jagielski     REGISTER_PROPERTY     ( Model,                      Reference<XModel> );
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski     initializePropertyValueCache( HANDLE_Indent );
438*b1cdbd2cSJim Jagielski     initializePropertyValueCache( HANDLE_OmitXmlDeclaration );
439*b1cdbd2cSJim Jagielski     initializePropertyValueCache( HANDLE_Standalone );
440*b1cdbd2cSJim Jagielski }
441*b1cdbd2cSJim Jagielski 
convertFastPropertyValue(Any & rConvertedValue,Any & rOldValue,sal_Int32 nHandle,const Any & rValue)442*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL Submission::convertFastPropertyValue(
443*b1cdbd2cSJim Jagielski     Any& rConvertedValue, Any& rOldValue, sal_Int32 nHandle, const Any& rValue )
444*b1cdbd2cSJim Jagielski 	throw ( IllegalArgumentException )
445*b1cdbd2cSJim Jagielski {
446*b1cdbd2cSJim Jagielski     if ( nHandle == HANDLE_IncludeNamespacePrefixes )
447*b1cdbd2cSJim Jagielski     {
448*b1cdbd2cSJim Jagielski         // for convinience reasons (????), we accept a string which contains
449*b1cdbd2cSJim Jagielski         // a comma-separated list of namespace prefixes
450*b1cdbd2cSJim Jagielski         ::rtl::OUString sTokenList;
451*b1cdbd2cSJim Jagielski         if ( rValue >>= sTokenList )
452*b1cdbd2cSJim Jagielski         {
453*b1cdbd2cSJim Jagielski             std::vector< OUString > aPrefixes;
454*b1cdbd2cSJim Jagielski             sal_Int32 p = 0;
455*b1cdbd2cSJim Jagielski             while ( p >= 0 )
456*b1cdbd2cSJim Jagielski                 aPrefixes.push_back( sTokenList.getToken( 0, ',', p ) );
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski             Sequence< ::rtl::OUString > aConvertedPrefixes( &aPrefixes[0], aPrefixes.size() );
459*b1cdbd2cSJim Jagielski             return PropertySetBase::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, makeAny( aConvertedPrefixes ) );
460*b1cdbd2cSJim Jagielski         }
461*b1cdbd2cSJim Jagielski     }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski     return PropertySetBase::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue );
464*b1cdbd2cSJim Jagielski }
465*b1cdbd2cSJim Jagielski 
getName()466*b1cdbd2cSJim Jagielski OUString SAL_CALL Submission::getName()
467*b1cdbd2cSJim Jagielski     throw( RuntimeException )
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski     return getID();
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski 
setName(const OUString & sID)472*b1cdbd2cSJim Jagielski void SAL_CALL Submission::setName( const OUString& sID )
473*b1cdbd2cSJim Jagielski     throw( RuntimeException )
474*b1cdbd2cSJim Jagielski {
475*b1cdbd2cSJim Jagielski     setID( sID );
476*b1cdbd2cSJim Jagielski }
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 
getSomething(const Sequence<sal_Int8> & aId)480*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL Submission::getSomething(
481*b1cdbd2cSJim Jagielski     const Sequence<sal_Int8>& aId )
482*b1cdbd2cSJim Jagielski     throw( RuntimeException )
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski     return ( aId == getUnoTunnelID() ) ? reinterpret_cast<sal_Int64>(this) : 0;
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 
lcl_message(const OUString & rID,const OUString & rText)488*b1cdbd2cSJim Jagielski OUString lcl_message( const OUString& rID, const OUString& rText )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski     OUStringBuffer aMessage;
491*b1cdbd2cSJim Jagielski     aMessage.append( OUSTRING("XForms submission '") );
492*b1cdbd2cSJim Jagielski     aMessage.append( rID );
493*b1cdbd2cSJim Jagielski     aMessage.append( OUSTRING("' failed") );
494*b1cdbd2cSJim Jagielski     aMessage.append( rText );
495*b1cdbd2cSJim Jagielski     aMessage.append( OUSTRING(".") );
496*b1cdbd2cSJim Jagielski     return aMessage.makeStringAndClear();
497*b1cdbd2cSJim Jagielski }
498*b1cdbd2cSJim Jagielski 
submitWithInteraction(const Reference<XInteractionHandler> & _rxHandler)499*b1cdbd2cSJim Jagielski void SAL_CALL Submission::submitWithInteraction(
500*b1cdbd2cSJim Jagielski     const Reference<XInteractionHandler>& _rxHandler )
501*b1cdbd2cSJim Jagielski     throw ( VetoException,
502*b1cdbd2cSJim Jagielski             WrappedTargetException,
503*b1cdbd2cSJim Jagielski             RuntimeException )
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski     // as long as this class is not really threadsafe, we need to copy
506*b1cdbd2cSJim Jagielski     // the members we're interested in
507*b1cdbd2cSJim Jagielski     Reference< XModel > xModel( mxModel );
508*b1cdbd2cSJim Jagielski     ::rtl::OUString sID( msID );
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski     if ( !xModel.is() || !msID.getLength() )
511*b1cdbd2cSJim Jagielski         throw RuntimeException(
512*b1cdbd2cSJim Jagielski                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "This is not a valid submission object." ) ),
513*b1cdbd2cSJim Jagielski                 *this
514*b1cdbd2cSJim Jagielski               );
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski     Model* pModel = Model::getModel( xModel );
517*b1cdbd2cSJim Jagielski     OSL_ENSURE( pModel != NULL, "illegal model?" );
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski     // #i36765# #i47248# warning on submission of illegal data
520*b1cdbd2cSJim Jagielski     // check for validity (and query user if invalid)
521*b1cdbd2cSJim Jagielski     bool bValid = pModel->isValid();
522*b1cdbd2cSJim Jagielski     if( ! bValid )
523*b1cdbd2cSJim Jagielski     {
524*b1cdbd2cSJim Jagielski         InvalidDataOnSubmitException aInvalidDataException(
525*b1cdbd2cSJim Jagielski             lcl_message(sID, OUSTRING(" due to invalid data") ), *this );
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski         if( _rxHandler.is() )
528*b1cdbd2cSJim Jagielski         {
529*b1cdbd2cSJim Jagielski             // labouriously create interaction request
530*b1cdbd2cSJim Jagielski             comphelper::OInteractionRequest* pRequest
531*b1cdbd2cSJim Jagielski                 = new comphelper::OInteractionRequest(
532*b1cdbd2cSJim Jagielski                     makeAny( aInvalidDataException ) );
533*b1cdbd2cSJim Jagielski             Reference<XInteractionRequest> xRequest = pRequest;
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski             comphelper::OInteractionApprove* pContinue
536*b1cdbd2cSJim Jagielski                 = new comphelper::OInteractionApprove();
537*b1cdbd2cSJim Jagielski             Reference<XInteractionContinuation> xContinue = pContinue;
538*b1cdbd2cSJim Jagielski             pRequest->addContinuation( xContinue );
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski             comphelper::OInteractionDisapprove* pCancel
541*b1cdbd2cSJim Jagielski                 = new comphelper::OInteractionDisapprove();
542*b1cdbd2cSJim Jagielski             Reference<XInteractionContinuation> xCancel = pCancel;
543*b1cdbd2cSJim Jagielski             pRequest->addContinuation( xCancel );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski             // ask the handler...
546*b1cdbd2cSJim Jagielski             _rxHandler->handle( xRequest );
547*b1cdbd2cSJim Jagielski             OSL_ENSURE( pContinue->wasSelected() || pCancel->wasSelected(),
548*b1cdbd2cSJim Jagielski                         "handler didn't select" );
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski             // and continue, if user chose 'continue'
551*b1cdbd2cSJim Jagielski             if( pContinue->wasSelected() )
552*b1cdbd2cSJim Jagielski                 bValid = true;
553*b1cdbd2cSJim Jagielski         }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski         // abort if invalid (and user didn't tell us to continue)
556*b1cdbd2cSJim Jagielski         if( ! bValid )
557*b1cdbd2cSJim Jagielski             throw aInvalidDataException;
558*b1cdbd2cSJim Jagielski     }
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski     // attempt submission
561*b1cdbd2cSJim Jagielski     bool bResult = false;
562*b1cdbd2cSJim Jagielski     try
563*b1cdbd2cSJim Jagielski     {
564*b1cdbd2cSJim Jagielski         bResult = doSubmit( _rxHandler );
565*b1cdbd2cSJim Jagielski     }
566*b1cdbd2cSJim Jagielski     catch( const VetoException& )
567*b1cdbd2cSJim Jagielski     {
568*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "Model::submit: Hmm. How can a single submission have a veto right?" );
569*b1cdbd2cSJim Jagielski         // allowed to leave
570*b1cdbd2cSJim Jagielski         throw;
571*b1cdbd2cSJim Jagielski     }
572*b1cdbd2cSJim Jagielski     catch( const Exception& e )
573*b1cdbd2cSJim Jagielski     {
574*b1cdbd2cSJim Jagielski         // exception caught: re-throw as wrapped target exception
575*b1cdbd2cSJim Jagielski         throw WrappedTargetException(
576*b1cdbd2cSJim Jagielski             lcl_message( sID, OUSTRING(" due to exception being thrown") ),
577*b1cdbd2cSJim Jagielski             *this, makeAny( e ) );
578*b1cdbd2cSJim Jagielski     }
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski     if( bResult )
581*b1cdbd2cSJim Jagielski     {
582*b1cdbd2cSJim Jagielski         mxModel->rebuild();
583*b1cdbd2cSJim Jagielski     }
584*b1cdbd2cSJim Jagielski     else
585*b1cdbd2cSJim Jagielski     {
586*b1cdbd2cSJim Jagielski         // other failure: throw wrapped target exception, too.
587*b1cdbd2cSJim Jagielski         throw WrappedTargetException(
588*b1cdbd2cSJim Jagielski             lcl_message( sID, OUString() ), *this, Any() );
589*b1cdbd2cSJim Jagielski     }
590*b1cdbd2cSJim Jagielski }
591*b1cdbd2cSJim Jagielski 
submit()592*b1cdbd2cSJim Jagielski void SAL_CALL Submission::submit( ) throw ( VetoException, WrappedTargetException, RuntimeException )
593*b1cdbd2cSJim Jagielski {
594*b1cdbd2cSJim Jagielski     submitWithInteraction( NULL );
595*b1cdbd2cSJim Jagielski }
596*b1cdbd2cSJim Jagielski 
addSubmissionVetoListener(const Reference<XSubmissionVetoListener> &)597*b1cdbd2cSJim Jagielski void SAL_CALL Submission::addSubmissionVetoListener( const Reference< XSubmissionVetoListener >& /*listener*/ ) throw (NoSupportException, RuntimeException)
598*b1cdbd2cSJim Jagielski {
599*b1cdbd2cSJim Jagielski     // TODO
600*b1cdbd2cSJim Jagielski     throw NoSupportException();
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
removeSubmissionVetoListener(const Reference<XSubmissionVetoListener> &)603*b1cdbd2cSJim Jagielski void SAL_CALL Submission::removeSubmissionVetoListener( const Reference< XSubmissionVetoListener >& /*listener*/ ) throw (NoSupportException, RuntimeException)
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski     // TODO
606*b1cdbd2cSJim Jagielski     throw NoSupportException();
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski 
_isIgnorable(const Reference<XNode> & aNode)609*b1cdbd2cSJim Jagielski static sal_Bool _isIgnorable(const Reference< XNode >& aNode)
610*b1cdbd2cSJim Jagielski {
611*b1cdbd2cSJim Jagielski     // ignore whitespace-only textnodes
612*b1cdbd2cSJim Jagielski     if (aNode->getNodeType() == NodeType_TEXT_NODE)
613*b1cdbd2cSJim Jagielski     {
614*b1cdbd2cSJim Jagielski         OUString aTrimmedValue = aNode->getNodeValue().trim();
615*b1cdbd2cSJim Jagielski         if (aTrimmedValue.getLength() == 0) return sal_True;
616*b1cdbd2cSJim Jagielski     }
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski     return sal_False;
619*b1cdbd2cSJim Jagielski }
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski // recursively copy relevant nodes from A to B
_cloneNodes(Model & aModel,const Reference<XNode> & dstParent,const Reference<XNode> & source,sal_Bool bRemoveWSNodes)622*b1cdbd2cSJim Jagielski static void _cloneNodes(Model& aModel, const Reference< XNode >& dstParent, const Reference< XNode >& source, sal_Bool bRemoveWSNodes)
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski     if (!source.is()) return;
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski     Reference< XNode > cur = source;
627*b1cdbd2cSJim Jagielski     Reference< XDocument > dstDoc = dstParent->getOwnerDocument();
628*b1cdbd2cSJim Jagielski     Reference< XNode > imported;
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski     if (cur.is())
631*b1cdbd2cSJim Jagielski     {
632*b1cdbd2cSJim Jagielski         //  is this node relevant?
633*b1cdbd2cSJim Jagielski         MIP mip = aModel.queryMIP(cur);
634*b1cdbd2cSJim Jagielski         if(mip.isRelevant() && !(bRemoveWSNodes && _isIgnorable(cur)))
635*b1cdbd2cSJim Jagielski         {
636*b1cdbd2cSJim Jagielski             imported = dstDoc->importNode(cur, sal_False);
637*b1cdbd2cSJim Jagielski             imported = dstParent->appendChild(imported);
638*b1cdbd2cSJim Jagielski             // append source children to new imported parent
639*b1cdbd2cSJim Jagielski             for( cur = cur->getFirstChild(); cur.is(); cur = cur->getNextSibling() )
640*b1cdbd2cSJim Jagielski                 _cloneNodes(aModel, imported, cur, bRemoveWSNodes);
641*b1cdbd2cSJim Jagielski         }
642*b1cdbd2cSJim Jagielski     }
643*b1cdbd2cSJim Jagielski }
getInstanceDocument(const Reference<XXPathObject> & aObj)644*b1cdbd2cSJim Jagielski Reference< XDocument > Submission::getInstanceDocument(const Reference< XXPathObject >& aObj)
645*b1cdbd2cSJim Jagielski {
646*b1cdbd2cSJim Jagielski     using namespace com::sun::star::xml::xpath;
647*b1cdbd2cSJim Jagielski     // result
648*b1cdbd2cSJim Jagielski     Reference< XDocument > aDocument;
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski     if (aObj->getObjectType() == XPathObjectType_XPATH_NODESET)
651*b1cdbd2cSJim Jagielski     {
652*b1cdbd2cSJim Jagielski         Reference< XNodeList > aList = aObj->getNodeList();
653*b1cdbd2cSJim Jagielski         if (aList->getLength() > 0)
654*b1cdbd2cSJim Jagielski             aDocument = aList->item(0)->getOwnerDocument();
655*b1cdbd2cSJim Jagielski     }
656*b1cdbd2cSJim Jagielski     return aDocument;
657*b1cdbd2cSJim Jagielski }
658*b1cdbd2cSJim Jagielski 
createSubmissionDocument(const Reference<XXPathObject> & aObj,sal_Bool bRemoveWSNodes)659*b1cdbd2cSJim Jagielski Reference< XDocumentFragment > Submission::createSubmissionDocument(const Reference< XXPathObject >& aObj, sal_Bool bRemoveWSNodes)
660*b1cdbd2cSJim Jagielski {
661*b1cdbd2cSJim Jagielski     using namespace com::sun::star::xml::xpath;
662*b1cdbd2cSJim Jagielski     Reference< XDocumentBuilder > aDocBuilder(m_aFactory->createInstance(
663*b1cdbd2cSJim Jagielski         OUString::createFromAscii("com.sun.star.xml.dom.DocumentBuilder")), UNO_QUERY);
664*b1cdbd2cSJim Jagielski     Reference< XDocument > aDocument = aDocBuilder->newDocument();
665*b1cdbd2cSJim Jagielski     Reference< XDocumentFragment > aFragment = aDocument->createDocumentFragment();
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski     //
668*b1cdbd2cSJim Jagielski     if (aObj->getObjectType() == XPathObjectType_XPATH_NODESET)
669*b1cdbd2cSJim Jagielski     {
670*b1cdbd2cSJim Jagielski         Reference< XNodeList > aList = aObj->getNodeList();
671*b1cdbd2cSJim Jagielski         Reference< XNode > aListItem;
672*b1cdbd2cSJim Jagielski         for (sal_Int32 i=0; i < aList->getLength(); i++)
673*b1cdbd2cSJim Jagielski         {
674*b1cdbd2cSJim Jagielski             aListItem = aList->item(i);
675*b1cdbd2cSJim Jagielski             if (aListItem->getNodeType()==NodeType_DOCUMENT_NODE)
676*b1cdbd2cSJim Jagielski                 aListItem = Reference< XNode >(
677*b1cdbd2cSJim Jagielski                     (Reference< XDocument >(aListItem, UNO_QUERY))->getDocumentElement(), UNO_QUERY);
678*b1cdbd2cSJim Jagielski             // copy relevant nodes from instance into fragment
679*b1cdbd2cSJim Jagielski             _cloneNodes(*getModelImpl(), Reference< XNode >(aFragment, UNO_QUERY), aListItem, bRemoveWSNodes);
680*b1cdbd2cSJim Jagielski         }
681*b1cdbd2cSJim Jagielski     }
682*b1cdbd2cSJim Jagielski     return aFragment;
683*b1cdbd2cSJim Jagielski }
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski // some forwarding: XPropertySet is implemented in our base class,
686*b1cdbd2cSJim Jagielski // but also available as base of XSubmission
getPropertySetInfo()687*b1cdbd2cSJim Jagielski Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL Submission::getPropertySetInfo(  ) throw(RuntimeException)
688*b1cdbd2cSJim Jagielski {
689*b1cdbd2cSJim Jagielski     return PropertySetBase::getPropertySetInfo();
690*b1cdbd2cSJim Jagielski }
setPropertyValue(const::rtl::OUString & aPropertyName,const Any & aValue)691*b1cdbd2cSJim Jagielski void SAL_CALL Submission::setPropertyValue( const ::rtl::OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
692*b1cdbd2cSJim Jagielski {
693*b1cdbd2cSJim Jagielski     PropertySetBase::setPropertyValue( aPropertyName, aValue );
694*b1cdbd2cSJim Jagielski }
getPropertyValue(const::rtl::OUString & PropertyName)695*b1cdbd2cSJim Jagielski Any SAL_CALL Submission::getPropertyValue( const ::rtl::OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
696*b1cdbd2cSJim Jagielski {
697*b1cdbd2cSJim Jagielski     return PropertySetBase::getPropertyValue( PropertyName );
698*b1cdbd2cSJim Jagielski }
addPropertyChangeListener(const::rtl::OUString & aPropertyName,const Reference<::com::sun::star::beans::XPropertyChangeListener> & xListener)699*b1cdbd2cSJim Jagielski void SAL_CALL Submission::addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski     PropertySetBase::addPropertyChangeListener( aPropertyName, xListener );
702*b1cdbd2cSJim Jagielski }
removePropertyChangeListener(const::rtl::OUString & aPropertyName,const Reference<::com::sun::star::beans::XPropertyChangeListener> & aListener)703*b1cdbd2cSJim Jagielski void SAL_CALL Submission::removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
704*b1cdbd2cSJim Jagielski {
705*b1cdbd2cSJim Jagielski     PropertySetBase::removePropertyChangeListener( aPropertyName, aListener );
706*b1cdbd2cSJim Jagielski }
addVetoableChangeListener(const::rtl::OUString & PropertyName,const Reference<::com::sun::star::beans::XVetoableChangeListener> & aListener)707*b1cdbd2cSJim Jagielski void SAL_CALL Submission::addVetoableChangeListener( const ::rtl::OUString& PropertyName, const Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
708*b1cdbd2cSJim Jagielski {
709*b1cdbd2cSJim Jagielski     PropertySetBase::addVetoableChangeListener( PropertyName, aListener );
710*b1cdbd2cSJim Jagielski }
removeVetoableChangeListener(const::rtl::OUString & PropertyName,const Reference<::com::sun::star::beans::XVetoableChangeListener> & aListener)711*b1cdbd2cSJim Jagielski void SAL_CALL Submission::removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
712*b1cdbd2cSJim Jagielski {
713*b1cdbd2cSJim Jagielski     PropertySetBase::removeVetoableChangeListener( PropertyName, aListener );
714*b1cdbd2cSJim Jagielski }
715*b1cdbd2cSJim Jagielski 
716