1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*63bba73cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*63bba73cSAndrew Rist * distributed with this work for additional information
6*63bba73cSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*63bba73cSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist * with the License. You may obtain a copy of the License at
10*63bba73cSAndrew Rist *
11*63bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist *
13*63bba73cSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist * KIND, either express or implied. See the License for the
17*63bba73cSAndrew Rist * specific language governing permissions and limitations
18*63bba73cSAndrew Rist * under the License.
19*63bba73cSAndrew Rist *
20*63bba73cSAndrew Rist *************************************************************/
21*63bba73cSAndrew Rist
22*63bba73cSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "xmloff/xformsexport.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include "XFormsModelExport.hxx"
30cdf0e10cSrcweir #include "xformsapi.hxx"
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <xmloff/xmlexp.hxx>
33cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
34cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
35cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
36cdf0e10cSrcweir #include "DomExport.hxx"
37cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
38cdf0e10cSrcweir #include <comphelper/componentcontext.hxx>
39cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
40cdf0e10cSrcweir
41cdf0e10cSrcweir #include "tools/debug.hxx"
42cdf0e10cSrcweir #include <tools/diagnose_ex.h>
43cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp>
44cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
45cdf0e10cSrcweir #include <com/sun/star/xml/dom/XDocument.hpp>
46cdf0e10cSrcweir #include <com/sun/star/form/binding/XValueBinding.hpp>
47cdf0e10cSrcweir #include <com/sun/star/form/binding/XBindableValue.hpp>
48cdf0e10cSrcweir #include <com/sun/star/form/binding/XListEntrySink.hpp>
49cdf0e10cSrcweir #include <com/sun/star/form/binding/XListEntrySource.hpp>
50cdf0e10cSrcweir #include <com/sun/star/form/submission/XSubmissionSupplier.hpp>
51cdf0e10cSrcweir #include <com/sun/star/xforms/XModel.hpp>
52cdf0e10cSrcweir #include <com/sun/star/xforms/XDataTypeRepository.hpp>
53cdf0e10cSrcweir #include <com/sun/star/xforms/XFormsSupplier.hpp>
54cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
55cdf0e10cSrcweir #include <com/sun/star/container/XEnumerationAccess.hpp>
56cdf0e10cSrcweir #include <com/sun/star/container/XEnumeration.hpp>
57cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
58cdf0e10cSrcweir #include <com/sun/star/xsd/WhiteSpaceTreatment.hpp>
59cdf0e10cSrcweir #include <com/sun/star/xsd/DataTypeClass.hpp>
60cdf0e10cSrcweir #include <com/sun/star/xsd/XDataType.hpp>
61cdf0e10cSrcweir #include <com/sun/star/util/Date.hpp>
62cdf0e10cSrcweir #include <com/sun/star/util/Time.hpp>
63cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp>
64cdf0e10cSrcweir
65cdf0e10cSrcweir using namespace com::sun::star;
66cdf0e10cSrcweir using namespace com::sun::star::uno;
67cdf0e10cSrcweir using namespace xmloff::token;
68cdf0e10cSrcweir
69cdf0e10cSrcweir using rtl::OUString;
70cdf0e10cSrcweir using rtl::OUStringBuffer;
71cdf0e10cSrcweir using com::sun::star::beans::XPropertySet;
72cdf0e10cSrcweir using com::sun::star::beans::XPropertySetInfo;
73cdf0e10cSrcweir using com::sun::star::container::XIndexAccess;
74cdf0e10cSrcweir using com::sun::star::container::XNameAccess;
75cdf0e10cSrcweir using com::sun::star::container::XNameContainer;
76cdf0e10cSrcweir using com::sun::star::container::XEnumerationAccess;
77cdf0e10cSrcweir using com::sun::star::container::XEnumeration;
78cdf0e10cSrcweir using com::sun::star::xml::dom::XDocument;
79cdf0e10cSrcweir using com::sun::star::form::binding::XValueBinding;
80cdf0e10cSrcweir using com::sun::star::form::binding::XBindableValue;
81cdf0e10cSrcweir using com::sun::star::form::binding::XListEntrySink;
82cdf0e10cSrcweir using com::sun::star::form::submission::XSubmissionSupplier;
83cdf0e10cSrcweir using com::sun::star::beans::PropertyValue;
84cdf0e10cSrcweir using com::sun::star::xsd::XDataType;
85cdf0e10cSrcweir using com::sun::star::xforms::XDataTypeRepository;
86cdf0e10cSrcweir using com::sun::star::xforms::XFormsSupplier;
87cdf0e10cSrcweir using com::sun::star::util::Date;
88cdf0e10cSrcweir using com::sun::star::util::DateTime;
89cdf0e10cSrcweir
exportXForms(SvXMLExport & rExport)90cdf0e10cSrcweir void exportXForms( SvXMLExport& rExport )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir Reference<XFormsSupplier> xSupplier( rExport.GetModel(), UNO_QUERY );
93cdf0e10cSrcweir if( xSupplier.is() )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir Reference<XNameContainer> xForms = xSupplier->getXForms();
96cdf0e10cSrcweir if( xForms.is() )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir Sequence<OUString> aNames = xForms->getElementNames();
99cdf0e10cSrcweir const OUString* pNames = aNames.getConstArray();
100cdf0e10cSrcweir sal_Int32 nNames = aNames.getLength();
101cdf0e10cSrcweir
102cdf0e10cSrcweir for( sal_Int32 n = 0; n < nNames; n++ )
103cdf0e10cSrcweir {
104cdf0e10cSrcweir Reference<XPropertySet> xModel( xForms->getByName( pNames[n] ),
105cdf0e10cSrcweir UNO_QUERY );
106cdf0e10cSrcweir exportXFormsModel( rExport, xModel );
107cdf0e10cSrcweir }
108cdf0e10cSrcweir }
109cdf0e10cSrcweir }
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
112cdf0e10cSrcweir
113cdf0e10cSrcweir void exportXFormsInstance( SvXMLExport&, const Sequence<PropertyValue>& );
114cdf0e10cSrcweir void exportXFormsBinding( SvXMLExport&, const Reference<XPropertySet>& );
115cdf0e10cSrcweir void exportXFormsSubmission( SvXMLExport&, const Reference<XPropertySet>& );
116cdf0e10cSrcweir void exportXFormsSchemas( SvXMLExport&, const Reference<com::sun::star::xforms::XModel>& );
117cdf0e10cSrcweir
118cdf0e10cSrcweir
119cdf0e10cSrcweir typedef OUString (*convert_t)( const Any& );
120cdf0e10cSrcweir typedef struct
121cdf0e10cSrcweir {
122cdf0e10cSrcweir const sal_Char* pPropertyName;
123cdf0e10cSrcweir sal_uInt16 nPropertyNameLength;
124cdf0e10cSrcweir sal_uInt16 nNamespace;
125cdf0e10cSrcweir sal_uInt16 nToken;
126cdf0e10cSrcweir convert_t aConverter;
127cdf0e10cSrcweir } ExportTable;
128cdf0e10cSrcweir void lcl_export( const Reference<XPropertySet>& rPropertySet,
129cdf0e10cSrcweir SvXMLExport& rExport,
130cdf0e10cSrcweir const ExportTable* pTable );
131cdf0e10cSrcweir
132cdf0e10cSrcweir #define TABLE_ENTRY(NAME,NAMESPACE,TOKEN,CONVERTER) { NAME,sizeof(NAME)-1,XML_NAMESPACE_##NAMESPACE,xmloff::token::XML_##TOKEN, CONVERTER }
133cdf0e10cSrcweir #define TABLE_END { NULL, 0, 0, 0, NULL }
134cdf0e10cSrcweir
135cdf0e10cSrcweir
136cdf0e10cSrcweir // any conversion functions
137cdf0e10cSrcweir OUString lcl_string( const Any& );
138cdf0e10cSrcweir OUString lcl_bool( const Any& );
139cdf0e10cSrcweir OUString lcl_whitespace( const Any& );
140cdf0e10cSrcweir template<typename T, void (*FUNC)( OUStringBuffer&, T )> OUString lcl_convert( const Any& );
141cdf0e10cSrcweir template<typename T, void (*FUNC)( OUStringBuffer&, const T& )> OUString lcl_convertRef( const Any& );
142cdf0e10cSrcweir
143cdf0e10cSrcweir void lcl_formatDate( OUStringBuffer& aBuffer, const Date& aDate );
144cdf0e10cSrcweir void lcl_formatTime( OUStringBuffer& aBuffer, const com::sun::star::util::Time& aTime );
145cdf0e10cSrcweir void lcl_formatDateTime( OUStringBuffer& aBuffer, const DateTime& aDateTime );
146cdf0e10cSrcweir
147cdf0e10cSrcweir convert_t lcl_int32 = &lcl_convert<sal_Int32,&SvXMLUnitConverter::convertNumber>;
148cdf0e10cSrcweir convert_t lcl_double = &lcl_convert<double,&SvXMLUnitConverter::convertDouble>;
149cdf0e10cSrcweir convert_t lcl_dateTime = &lcl_convertRef<DateTime,&lcl_formatDateTime>;
150cdf0e10cSrcweir convert_t lcl_date = &lcl_convertRef<Date,&lcl_formatDate>;
151cdf0e10cSrcweir convert_t lcl_time = &lcl_convertRef<com::sun::star::util::Time,&lcl_formatTime>;
152cdf0e10cSrcweir
153cdf0e10cSrcweir // other functions
154cdf0e10cSrcweir OUString lcl_getXSDType( SvXMLExport& rExport,
155cdf0e10cSrcweir const Reference<XPropertySet>& xType );
156cdf0e10cSrcweir
157cdf0e10cSrcweir
158cdf0e10cSrcweir //
159cdf0e10cSrcweir // the model
160cdf0e10cSrcweir //
161cdf0e10cSrcweir
162cdf0e10cSrcweir static const ExportTable aXFormsModelTable[] =
163cdf0e10cSrcweir {
164cdf0e10cSrcweir TABLE_ENTRY( "ID", NONE, ID, lcl_string ),
165cdf0e10cSrcweir TABLE_ENTRY( "SchemaRef", NONE, SCHEMA, lcl_string ),
166cdf0e10cSrcweir TABLE_END
167cdf0e10cSrcweir };
168cdf0e10cSrcweir
exportXFormsModel(SvXMLExport & rExport,const Reference<XPropertySet> & xModelPropSet)169cdf0e10cSrcweir void exportXFormsModel( SvXMLExport& rExport,
170cdf0e10cSrcweir const Reference<XPropertySet>& xModelPropSet )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir // no model -> don't do anything!
173cdf0e10cSrcweir Reference<com::sun::star::xforms::XModel> xModel( xModelPropSet, UNO_QUERY );
174cdf0e10cSrcweir if( ! xModel.is() || ! xModelPropSet.is() )
175cdf0e10cSrcweir return;
176cdf0e10cSrcweir
177cdf0e10cSrcweir lcl_export( xModelPropSet, rExport, aXFormsModelTable );
178cdf0e10cSrcweir SvXMLElementExport aModelElement( rExport, XML_NAMESPACE_XFORMS, XML_MODEL,
179cdf0e10cSrcweir sal_True, sal_True );
180cdf0e10cSrcweir
181cdf0e10cSrcweir // instances
182cdf0e10cSrcweir Reference<XIndexAccess> xInstances( xModel->getInstances(),
183cdf0e10cSrcweir UNO_QUERY_THROW);
184cdf0e10cSrcweir sal_Int32 nCount = xInstances->getCount();
185cdf0e10cSrcweir sal_Int32 i = 0;
186cdf0e10cSrcweir for( i = 0; i < nCount; i++ )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir Sequence<PropertyValue> aInstance;
189cdf0e10cSrcweir xInstances->getByIndex( i ) >>= aInstance;
190cdf0e10cSrcweir exportXFormsInstance( rExport, aInstance );
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
193cdf0e10cSrcweir
194cdf0e10cSrcweir // bindings
195cdf0e10cSrcweir Reference<XIndexAccess> xBindings( xModel->getBindings(), UNO_QUERY_THROW);
196cdf0e10cSrcweir nCount = xBindings->getCount();
197cdf0e10cSrcweir for( i = 0; i < nCount; i++ )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir Reference<XPropertySet> aBinding( xBindings->getByIndex( i ),
200cdf0e10cSrcweir UNO_QUERY_THROW );
201cdf0e10cSrcweir exportXFormsBinding( rExport, aBinding );
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir // submissions
205cdf0e10cSrcweir Reference<XIndexAccess> xSubmissions( xModel->getSubmissions(),
206cdf0e10cSrcweir UNO_QUERY_THROW );
207cdf0e10cSrcweir nCount = xSubmissions->getCount();
208cdf0e10cSrcweir for( i = 0; i < nCount; i++ )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir Reference<XPropertySet> xSubmission( xSubmissions->getByIndex( i ),
211cdf0e10cSrcweir UNO_QUERY_THROW );
212cdf0e10cSrcweir exportXFormsSubmission( rExport, xSubmission );
213cdf0e10cSrcweir }
214cdf0e10cSrcweir
215cdf0e10cSrcweir // schemas
216cdf0e10cSrcweir exportXFormsSchemas( rExport, xModel );
217cdf0e10cSrcweir }
218cdf0e10cSrcweir
219cdf0e10cSrcweir //
220cdf0e10cSrcweir // the instance
221cdf0e10cSrcweir //
222cdf0e10cSrcweir
223cdf0e10cSrcweir static const ExportTable aXFormsInstanceTable[] =
224cdf0e10cSrcweir {
225cdf0e10cSrcweir TABLE_ENTRY( "InstanceURL", NONE, SRC, lcl_string ),
226cdf0e10cSrcweir TABLE_END
227cdf0e10cSrcweir };
228cdf0e10cSrcweir
exportXFormsInstance(SvXMLExport & rExport,const Sequence<PropertyValue> & xInstance)229cdf0e10cSrcweir void exportXFormsInstance( SvXMLExport& rExport,
230cdf0e10cSrcweir const Sequence<PropertyValue>& xInstance )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir OUString sId;
233cdf0e10cSrcweir OUString sURL;
234cdf0e10cSrcweir Reference<XDocument> xDoc;
235cdf0e10cSrcweir
236cdf0e10cSrcweir const PropertyValue* pInstance = xInstance.getConstArray();
237cdf0e10cSrcweir sal_Int32 nCount = xInstance.getLength();
238cdf0e10cSrcweir for( sal_Int32 i = 0; i < nCount; i++ )
239cdf0e10cSrcweir {
240cdf0e10cSrcweir OUString sName = pInstance[i].Name;
241cdf0e10cSrcweir const Any& rAny = pInstance[i].Value;
242cdf0e10cSrcweir if( sName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ID") ) )
243cdf0e10cSrcweir rAny >>= sId;
244cdf0e10cSrcweir else if( sName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("URL") ) )
245cdf0e10cSrcweir rAny >>= sURL;
246cdf0e10cSrcweir else if( sName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Instance") ))
247cdf0e10cSrcweir rAny >>= xDoc;
248cdf0e10cSrcweir }
249cdf0e10cSrcweir
250cdf0e10cSrcweir if( sId.getLength() > 0 )
251cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NONE, XML_ID, sId );
252cdf0e10cSrcweir
253cdf0e10cSrcweir if( sURL.getLength() > 0 )
254cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NONE, XML_SRC, sURL );
255cdf0e10cSrcweir
256cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_XFORMS, XML_INSTANCE,
257cdf0e10cSrcweir sal_True, sal_True );
258cdf0e10cSrcweir rExport.IgnorableWhitespace();
259cdf0e10cSrcweir if( xDoc.is() )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir exportDom( rExport, xDoc );
262cdf0e10cSrcweir }
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir
266cdf0e10cSrcweir //
267cdf0e10cSrcweir // the binding
268cdf0e10cSrcweir //
269cdf0e10cSrcweir
270cdf0e10cSrcweir static const ExportTable aXFormsBindingTable[] =
271cdf0e10cSrcweir {
272cdf0e10cSrcweir TABLE_ENTRY( "BindingID", NONE, ID, lcl_string ),
273cdf0e10cSrcweir TABLE_ENTRY( "BindingExpression", NONE, NODESET, lcl_string ),
274cdf0e10cSrcweir TABLE_ENTRY( "ReadonlyExpression", NONE, READONLY, lcl_string ),
275cdf0e10cSrcweir TABLE_ENTRY( "RelevantExpression", NONE, RELEVANT, lcl_string ),
276cdf0e10cSrcweir TABLE_ENTRY( "RequiredExpression", NONE, REQUIRED, lcl_string ),
277cdf0e10cSrcweir TABLE_ENTRY( "ConstraintExpression", NONE, CONSTRAINT, lcl_string ),
278cdf0e10cSrcweir TABLE_ENTRY( "CalculateExpression", NONE, CALCULATE, lcl_string ),
279cdf0e10cSrcweir // type handled separatly, for type name <-> XSD type conversion
280cdf0e10cSrcweir // TABLE_ENTRY( "Type", NONE, TYPE, lcl_string ),
281cdf0e10cSrcweir TABLE_END
282cdf0e10cSrcweir };
283cdf0e10cSrcweir
exportXFormsBinding(SvXMLExport & rExport,const Reference<XPropertySet> & xBinding)284cdf0e10cSrcweir void exportXFormsBinding( SvXMLExport& rExport,
285cdf0e10cSrcweir const Reference<XPropertySet>& xBinding )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir // name check; generate binding ID if necessary
288cdf0e10cSrcweir {
289cdf0e10cSrcweir OUString sName;
290cdf0e10cSrcweir xBinding->getPropertyValue( OUSTRING("BindingID") ) >>= sName;
291cdf0e10cSrcweir if( sName.getLength() == 0 )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir // if we don't have a name yet, generate one on the fly
294cdf0e10cSrcweir OUStringBuffer aBuffer;
295cdf0e10cSrcweir aBuffer.append( OUSTRING("bind_" ) );
296cdf0e10cSrcweir sal_Int64 nId = reinterpret_cast<sal_uInt64>( xBinding.get() );
297cdf0e10cSrcweir aBuffer.append( nId , 16 );
298cdf0e10cSrcweir sName = aBuffer.makeStringAndClear();
299cdf0e10cSrcweir xBinding->setPropertyValue( OUSTRING("BindingID"), makeAny(sName));
300cdf0e10cSrcweir }
301cdf0e10cSrcweir }
302cdf0e10cSrcweir
303cdf0e10cSrcweir lcl_export( xBinding, rExport, aXFormsBindingTable );
304cdf0e10cSrcweir
305cdf0e10cSrcweir // handle type attribute
306cdf0e10cSrcweir {
307cdf0e10cSrcweir OUString sTypeName;
308cdf0e10cSrcweir xBinding->getPropertyValue( OUSTRING("Type") ) >>= sTypeName;
309cdf0e10cSrcweir
310cdf0e10cSrcweir try
311cdf0e10cSrcweir {
312cdf0e10cSrcweir // now get type, and determine whether its a standard type. If
313cdf0e10cSrcweir // so, export the XSD name
314cdf0e10cSrcweir Reference<com::sun::star::xforms::XModel> xModel(
315cdf0e10cSrcweir xBinding->getPropertyValue( OUSTRING("Model") ),
316cdf0e10cSrcweir UNO_QUERY );
317cdf0e10cSrcweir Reference<XDataTypeRepository> xRepository(
318cdf0e10cSrcweir xModel.is() ? xModel->getDataTypeRepository() : Reference<XDataTypeRepository>() );
319cdf0e10cSrcweir if( xRepository.is() )
320cdf0e10cSrcweir {
321cdf0e10cSrcweir Reference<XPropertySet> xDataType(
322cdf0e10cSrcweir xRepository->getDataType( sTypeName ),
323cdf0e10cSrcweir UNO_QUERY );
324cdf0e10cSrcweir
325cdf0e10cSrcweir // if it's a basic data type, write out the XSD name
326cdf0e10cSrcweir // for the XSD type class
327cdf0e10cSrcweir bool bIsBasic = false;
328cdf0e10cSrcweir xDataType->getPropertyValue( OUSTRING("IsBasic") ) >>= bIsBasic;
329cdf0e10cSrcweir if( bIsBasic )
330cdf0e10cSrcweir sTypeName = lcl_getXSDType( rExport, xDataType );
331cdf0e10cSrcweir }
332cdf0e10cSrcweir }
333cdf0e10cSrcweir catch( Exception& )
334cdf0e10cSrcweir {
335cdf0e10cSrcweir ; // ignore; just use typename
336cdf0e10cSrcweir }
337cdf0e10cSrcweir
338cdf0e10cSrcweir // now that we have the proper type name, write out the attribute
339cdf0e10cSrcweir if( sTypeName.getLength() > 0 )
340cdf0e10cSrcweir {
341cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NONE, XML_TYPE,
342cdf0e10cSrcweir sTypeName );
343cdf0e10cSrcweir }
344cdf0e10cSrcweir }
345cdf0e10cSrcweir
346cdf0e10cSrcweir // we need to ensure all the namespaces in the binding will work correctly.
347cdf0e10cSrcweir // to do so, we will write out all missing namespace declaractions.
348cdf0e10cSrcweir const SvXMLNamespaceMap& rMap = rExport.GetNamespaceMap();
349cdf0e10cSrcweir Reference<XNameAccess> xNamespaces(
350cdf0e10cSrcweir xBinding->getPropertyValue( OUSTRING("ModelNamespaces") ), UNO_QUERY);
351cdf0e10cSrcweir if( xNamespaces.is() )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir // iterate over Prefixes for this binding
354cdf0e10cSrcweir Sequence<OUString> aPrefixes = xNamespaces->getElementNames();
355cdf0e10cSrcweir const OUString* pPrefixes = aPrefixes.getConstArray();
356cdf0e10cSrcweir sal_Int32 nPrefixes = aPrefixes.getLength();
357cdf0e10cSrcweir for( sal_Int32 i = 0; i < nPrefixes; i++ )
358cdf0e10cSrcweir {
359cdf0e10cSrcweir const OUString& rPrefix = pPrefixes[i];
360cdf0e10cSrcweir OUString sURI;
361cdf0e10cSrcweir xNamespaces->getByName( rPrefix ) >>= sURI;
362cdf0e10cSrcweir
363cdf0e10cSrcweir // check whether prefix/URI pair is in map; else write declaration
364cdf0e10cSrcweir // (we don't need to change the map, since this element has no
365cdf0e10cSrcweir // other content)
366cdf0e10cSrcweir sal_uInt16 nKey = rMap.GetKeyByPrefix( rPrefix );
367cdf0e10cSrcweir if( nKey == XML_NAMESPACE_UNKNOWN ||
368cdf0e10cSrcweir rMap.GetNameByKey( nKey ) != sURI )
369cdf0e10cSrcweir {
370cdf0e10cSrcweir rExport.AddAttribute( OUSTRING("xmlns:") + rPrefix, sURI );
371cdf0e10cSrcweir }
372cdf0e10cSrcweir }
373cdf0e10cSrcweir }
374cdf0e10cSrcweir
375cdf0e10cSrcweir SvXMLElementExport aElement( rExport, XML_NAMESPACE_XFORMS, XML_BIND,
376cdf0e10cSrcweir sal_True, sal_True );
377cdf0e10cSrcweir }
378cdf0e10cSrcweir
379cdf0e10cSrcweir
380cdf0e10cSrcweir //
381cdf0e10cSrcweir // the submission
382cdf0e10cSrcweir //
383cdf0e10cSrcweir
384cdf0e10cSrcweir static const ExportTable aXFormsSubmissionTable[] =
385cdf0e10cSrcweir {
386cdf0e10cSrcweir TABLE_ENTRY( "ID", NONE, ID, lcl_string ),
387cdf0e10cSrcweir TABLE_ENTRY( "Bind", NONE, BIND, lcl_string ),
388cdf0e10cSrcweir TABLE_ENTRY( "Ref", NONE, REF, lcl_string ),
389cdf0e10cSrcweir TABLE_ENTRY( "Action", NONE, ACTION, lcl_string ),
390cdf0e10cSrcweir TABLE_ENTRY( "Method", NONE, METHOD, lcl_string ),
391cdf0e10cSrcweir TABLE_ENTRY( "Version", NONE, VERSION, lcl_string ),
392cdf0e10cSrcweir TABLE_ENTRY( "Indent", NONE, INDENT, lcl_bool ),
393cdf0e10cSrcweir TABLE_ENTRY( "MediaType", NONE, MEDIATYPE, lcl_string ),
394cdf0e10cSrcweir TABLE_ENTRY( "Encoding", NONE, ENCODING, lcl_string ),
395cdf0e10cSrcweir TABLE_ENTRY( "OmitXmlDeclaration", NONE, OMIT_XML_DECLARATION, lcl_bool ),
396cdf0e10cSrcweir TABLE_ENTRY( "Standalone", NONE, STANDALONE, lcl_bool ),
397cdf0e10cSrcweir TABLE_ENTRY( "CDataSectionElement", NONE, CDATA_SECTION_ELEMENTS, lcl_string ),
398cdf0e10cSrcweir TABLE_ENTRY( "Replace", NONE, REPLACE, lcl_string ),
399cdf0e10cSrcweir TABLE_ENTRY( "Separator", NONE, SEPARATOR, lcl_string ),
400cdf0e10cSrcweir TABLE_ENTRY( "IncludeNamespacePrefixes", NONE, INCLUDENAMESPACEPREFIXES, lcl_string ),
401cdf0e10cSrcweir TABLE_END
402cdf0e10cSrcweir };
403cdf0e10cSrcweir
exportXFormsSubmission(SvXMLExport & rExport,const Reference<XPropertySet> & xSubmission)404cdf0e10cSrcweir void exportXFormsSubmission( SvXMLExport& rExport,
405cdf0e10cSrcweir const Reference<XPropertySet>& xSubmission )
406cdf0e10cSrcweir {
407cdf0e10cSrcweir lcl_export( xSubmission, rExport, aXFormsSubmissionTable );
408cdf0e10cSrcweir SvXMLElementExport aElement( rExport, XML_NAMESPACE_XFORMS, XML_SUBMISSION,
409cdf0e10cSrcweir sal_True, sal_True );
410cdf0e10cSrcweir }
411cdf0e10cSrcweir
412cdf0e10cSrcweir
413cdf0e10cSrcweir
414cdf0e10cSrcweir //
415cdf0e10cSrcweir // export data types as XSD schema
416cdf0e10cSrcweir //
417cdf0e10cSrcweir
418cdf0e10cSrcweir static const ExportTable aDataTypeFacetTable[] =
419cdf0e10cSrcweir {
420cdf0e10cSrcweir TABLE_ENTRY( "Length", XSD, LENGTH, lcl_int32 ),
421cdf0e10cSrcweir TABLE_ENTRY( "MinLength", XSD, MINLENGTH, lcl_int32 ),
422cdf0e10cSrcweir TABLE_ENTRY( "MaxLength", XSD, MAXLENGTH, lcl_int32 ),
423cdf0e10cSrcweir TABLE_ENTRY( "MinInclusiveInt", XSD, MININCLUSIVE, lcl_int32 ),
424cdf0e10cSrcweir TABLE_ENTRY( "MinExclusiveInt", XSD, MINEXCLUSIVE, lcl_int32 ),
425cdf0e10cSrcweir TABLE_ENTRY( "MaxInclusiveInt", XSD, MAXINCLUSIVE, lcl_int32 ),
426cdf0e10cSrcweir TABLE_ENTRY( "MaxExclusiveInt", XSD, MAXEXCLUSIVE, lcl_int32 ),
427cdf0e10cSrcweir TABLE_ENTRY( "MinInclusiveDouble", XSD, MININCLUSIVE, lcl_double ),
428cdf0e10cSrcweir TABLE_ENTRY( "MinExclusiveDouble", XSD, MINEXCLUSIVE, lcl_double ),
429cdf0e10cSrcweir TABLE_ENTRY( "MaxInclusiveDouble", XSD, MAXINCLUSIVE, lcl_double ),
430cdf0e10cSrcweir TABLE_ENTRY( "MaxExclusiveDouble", XSD, MAXEXCLUSIVE, lcl_double ),
431cdf0e10cSrcweir TABLE_ENTRY( "MinInclusiveDate", XSD, MININCLUSIVE, lcl_date ),
432cdf0e10cSrcweir TABLE_ENTRY( "MinExclusiveDate", XSD, MINEXCLUSIVE, lcl_date ),
433cdf0e10cSrcweir TABLE_ENTRY( "MaxInclusiveDate", XSD, MAXINCLUSIVE, lcl_date ),
434cdf0e10cSrcweir TABLE_ENTRY( "MaxExclusiveDate", XSD, MAXEXCLUSIVE, lcl_date ),
435cdf0e10cSrcweir TABLE_ENTRY( "MinInclusiveTime", XSD, MININCLUSIVE, lcl_time ),
436cdf0e10cSrcweir TABLE_ENTRY( "MinExclusiveTime", XSD, MINEXCLUSIVE, lcl_time ),
437cdf0e10cSrcweir TABLE_ENTRY( "MaxInclusiveTime", XSD, MAXINCLUSIVE, lcl_time ),
438cdf0e10cSrcweir TABLE_ENTRY( "MaxExclusiveTime", XSD, MAXEXCLUSIVE, lcl_time ),
439cdf0e10cSrcweir TABLE_ENTRY( "MinInclusiveDateTime", XSD, MININCLUSIVE, lcl_dateTime ),
440cdf0e10cSrcweir TABLE_ENTRY( "MinExclusiveDateTime", XSD, MINEXCLUSIVE, lcl_dateTime ),
441cdf0e10cSrcweir TABLE_ENTRY( "MaxInclusiveDateTime", XSD, MAXINCLUSIVE, lcl_dateTime ),
442cdf0e10cSrcweir TABLE_ENTRY( "MaxExclusiveDateTime", XSD, MAXEXCLUSIVE, lcl_dateTime ),
443cdf0e10cSrcweir TABLE_ENTRY( "Pattern", XSD, PATTERN, lcl_string ),
444cdf0e10cSrcweir // ??? XML_ENUMERATION,
445cdf0e10cSrcweir TABLE_ENTRY( "WhiteSpace", XSD, WHITESPACE, lcl_whitespace ),
446cdf0e10cSrcweir TABLE_ENTRY( "TotalDigits", XSD, TOTALDIGITS, lcl_int32 ),
447cdf0e10cSrcweir TABLE_ENTRY( "FractionDigits", XSD, FRACTIONDIGITS, lcl_int32 ),
448cdf0e10cSrcweir TABLE_END
449cdf0e10cSrcweir };
450cdf0e10cSrcweir
451cdf0e10cSrcweir // export facets through table; use the same table as lcl_export does
lcl_exportDataTypeFacets(SvXMLExport & rExport,const Reference<XPropertySet> & rPropertySet,const ExportTable * pTable)452cdf0e10cSrcweir void lcl_exportDataTypeFacets( SvXMLExport& rExport,
453cdf0e10cSrcweir const Reference<XPropertySet>& rPropertySet,
454cdf0e10cSrcweir const ExportTable* pTable )
455cdf0e10cSrcweir {
456cdf0e10cSrcweir Reference<XPropertySetInfo> xInfo = rPropertySet->getPropertySetInfo();
457cdf0e10cSrcweir for( const ExportTable* pCurrent = pTable;
458cdf0e10cSrcweir pCurrent->pPropertyName != NULL;
459cdf0e10cSrcweir pCurrent++ )
460cdf0e10cSrcweir {
461cdf0e10cSrcweir OUString sName( OUString::createFromAscii( pCurrent->pPropertyName ) );
462cdf0e10cSrcweir if( xInfo->hasPropertyByName( sName ) )
463cdf0e10cSrcweir {
464cdf0e10cSrcweir OUString sValue = (*pCurrent->aConverter)(
465cdf0e10cSrcweir rPropertySet->getPropertyValue( sName ) );
466cdf0e10cSrcweir
467cdf0e10cSrcweir if( sValue.getLength() > 0 )
468cdf0e10cSrcweir {
469cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NONE, XML_VALUE, sValue );
470cdf0e10cSrcweir SvXMLElementExport aFacet(
471cdf0e10cSrcweir rExport,
472cdf0e10cSrcweir pCurrent->nNamespace,
473cdf0e10cSrcweir static_cast<XMLTokenEnum>( pCurrent->nToken ),
474cdf0e10cSrcweir sal_True, sal_True );
475cdf0e10cSrcweir }
476cdf0e10cSrcweir }
477cdf0e10cSrcweir }
478cdf0e10cSrcweir }
479cdf0e10cSrcweir
lcl_getXSDType(SvXMLExport & rExport,const Reference<XPropertySet> & xType)480cdf0e10cSrcweir OUString lcl_getXSDType( SvXMLExport& rExport,
481cdf0e10cSrcweir const Reference<XPropertySet>& xType )
482cdf0e10cSrcweir {
483cdf0e10cSrcweir // we use string as default...
484cdf0e10cSrcweir XMLTokenEnum eToken = XML_STRING;
485cdf0e10cSrcweir
486cdf0e10cSrcweir sal_uInt16 nDataTypeClass = 0;
487cdf0e10cSrcweir xType->getPropertyValue( OUSTRING("TypeClass") ) >>= nDataTypeClass;
488cdf0e10cSrcweir switch( nDataTypeClass )
489cdf0e10cSrcweir {
490cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::STRING:
491cdf0e10cSrcweir eToken = XML_STRING;
492cdf0e10cSrcweir break;
493cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::anyURI:
494cdf0e10cSrcweir eToken = XML_ANYURI;
495cdf0e10cSrcweir break;
496cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::DECIMAL:
497cdf0e10cSrcweir eToken = XML_DECIMAL;
498cdf0e10cSrcweir break;
499cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::DOUBLE:
500cdf0e10cSrcweir eToken = XML_DOUBLE;
501cdf0e10cSrcweir break;
502cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::FLOAT:
503cdf0e10cSrcweir eToken = XML_FLOAT;
504cdf0e10cSrcweir break;
505cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::BOOLEAN:
506cdf0e10cSrcweir eToken = XML_BOOLEAN;
507cdf0e10cSrcweir break;
508cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::DATETIME:
509cdf0e10cSrcweir eToken = XML_DATETIME_XSD;
510cdf0e10cSrcweir break;
511cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::TIME:
512cdf0e10cSrcweir eToken = XML_TIME;
513cdf0e10cSrcweir break;
514cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::DATE:
515cdf0e10cSrcweir eToken = XML_DATE;
516cdf0e10cSrcweir break;
517cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::gYear:
518cdf0e10cSrcweir eToken = XML_YEAR;
519cdf0e10cSrcweir break;
520cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::gDay:
521cdf0e10cSrcweir eToken = XML_DAY;
522cdf0e10cSrcweir break;
523cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::gMonth:
524cdf0e10cSrcweir eToken = XML_MONTH;
525cdf0e10cSrcweir break;
526cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::DURATION:
527cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::gYearMonth:
528cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::gMonthDay:
529cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::hexBinary:
530cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::base64Binary:
531cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::QName:
532cdf0e10cSrcweir case com::sun::star::xsd::DataTypeClass::NOTATION:
533cdf0e10cSrcweir default:
534cdf0e10cSrcweir DBG_ERROR( "unknown data type" );
535cdf0e10cSrcweir }
536cdf0e10cSrcweir
537cdf0e10cSrcweir return rExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_XSD,
538cdf0e10cSrcweir GetXMLToken( eToken ) );
539cdf0e10cSrcweir }
540cdf0e10cSrcweir
lcl_exportDataType(SvXMLExport & rExport,const Reference<XPropertySet> & xType)541cdf0e10cSrcweir void lcl_exportDataType( SvXMLExport& rExport,
542cdf0e10cSrcweir const Reference<XPropertySet>& xType )
543cdf0e10cSrcweir {
544cdf0e10cSrcweir // we do not need to export basic types; exit if we have one
545cdf0e10cSrcweir bool bIsBasic = false;
546cdf0e10cSrcweir xType->getPropertyValue( OUSTRING("IsBasic") ) >>= bIsBasic;
547cdf0e10cSrcweir if( bIsBasic )
548cdf0e10cSrcweir return;
549cdf0e10cSrcweir
550cdf0e10cSrcweir // no basic type -> export
551cdf0e10cSrcweir
552cdf0e10cSrcweir // <xsd:simpleType name="...">
553cdf0e10cSrcweir OUString sName;
554cdf0e10cSrcweir xType->getPropertyValue( OUSTRING("Name") ) >>= sName;
555cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NONE, XML_NAME, sName );
556cdf0e10cSrcweir SvXMLElementExport aSimpleType( rExport,
557cdf0e10cSrcweir XML_NAMESPACE_XSD, XML_SIMPLETYPE,
558cdf0e10cSrcweir sal_True, sal_True );
559cdf0e10cSrcweir
560cdf0e10cSrcweir // <xsd:restriction base="xsd:...">
561cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NONE, XML_BASE,
562cdf0e10cSrcweir lcl_getXSDType( rExport, xType ) );
563cdf0e10cSrcweir SvXMLElementExport aRestriction( rExport,
564cdf0e10cSrcweir XML_NAMESPACE_XSD,
565cdf0e10cSrcweir XML_RESTRICTION,
566cdf0e10cSrcweir sal_True, sal_True );
567cdf0e10cSrcweir
568cdf0e10cSrcweir // export facets
569cdf0e10cSrcweir lcl_exportDataTypeFacets( rExport,
570cdf0e10cSrcweir Reference<XPropertySet>( xType, UNO_QUERY ),
571cdf0e10cSrcweir aDataTypeFacetTable );
572cdf0e10cSrcweir }
573cdf0e10cSrcweir
exportXFormsSchemas(SvXMLExport & rExport,const Reference<com::sun::star::xforms::XModel> & xModel)574cdf0e10cSrcweir void exportXFormsSchemas( SvXMLExport& rExport,
575cdf0e10cSrcweir const Reference<com::sun::star::xforms::XModel>& xModel )
576cdf0e10cSrcweir {
577cdf0e10cSrcweir // TODO: for now, we'll fake this...
578cdf0e10cSrcweir {
579cdf0e10cSrcweir SvXMLElementExport aSchemaElem( rExport, XML_NAMESPACE_XSD, XML_SCHEMA,
580cdf0e10cSrcweir sal_True, sal_True );
581cdf0e10cSrcweir
582cdf0e10cSrcweir // now get data type repositry, and export
583cdf0e10cSrcweir Reference<XEnumerationAccess> xTypes( xModel->getDataTypeRepository(),
584cdf0e10cSrcweir UNO_QUERY );
585cdf0e10cSrcweir if( xTypes.is() )
586cdf0e10cSrcweir {
587cdf0e10cSrcweir Reference<XEnumeration> xEnum = xTypes->createEnumeration();
588cdf0e10cSrcweir DBG_ASSERT( xEnum.is(), "no enum?" );
589cdf0e10cSrcweir while( xEnum->hasMoreElements() )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir Reference<XPropertySet> xType( xEnum->nextElement(), UNO_QUERY );
592cdf0e10cSrcweir lcl_exportDataType( rExport, xType );
593cdf0e10cSrcweir }
594cdf0e10cSrcweir }
595cdf0e10cSrcweir }
596cdf0e10cSrcweir
597cdf0e10cSrcweir // export other, 'foreign' schemas
598cdf0e10cSrcweir Reference<XPropertySet> xPropSet( xModel, UNO_QUERY );
599cdf0e10cSrcweir if( xPropSet.is() )
600cdf0e10cSrcweir {
601cdf0e10cSrcweir Reference<XDocument> xDocument(
602cdf0e10cSrcweir xPropSet->getPropertyValue( OUSTRING("ForeignSchema") ),
603cdf0e10cSrcweir UNO_QUERY );
604cdf0e10cSrcweir
605cdf0e10cSrcweir if( xDocument.is() )
606cdf0e10cSrcweir exportDom( rExport, xDocument );
607cdf0e10cSrcweir }
608cdf0e10cSrcweir }
609cdf0e10cSrcweir
610cdf0e10cSrcweir
611cdf0e10cSrcweir
612cdf0e10cSrcweir //
613cdf0e10cSrcweir // helper functions
614cdf0e10cSrcweir //
615cdf0e10cSrcweir
lcl_export(const Reference<XPropertySet> & rPropertySet,SvXMLExport & rExport,const ExportTable * pTable)616cdf0e10cSrcweir void lcl_export( const Reference<XPropertySet>& rPropertySet,
617cdf0e10cSrcweir SvXMLExport& rExport,
618cdf0e10cSrcweir const ExportTable* pTable )
619cdf0e10cSrcweir {
620cdf0e10cSrcweir for( const ExportTable* pCurrent = pTable;
621cdf0e10cSrcweir pCurrent->pPropertyName != NULL;
622cdf0e10cSrcweir pCurrent++ )
623cdf0e10cSrcweir {
624cdf0e10cSrcweir Any aAny = rPropertySet->getPropertyValue(
625cdf0e10cSrcweir OUString::createFromAscii( pCurrent->pPropertyName ) );
626cdf0e10cSrcweir OUString sValue = (*pCurrent->aConverter)( aAny );
627cdf0e10cSrcweir
628cdf0e10cSrcweir if( sValue.getLength() > 0 )
629cdf0e10cSrcweir rExport.AddAttribute(
630cdf0e10cSrcweir pCurrent->nNamespace,
631cdf0e10cSrcweir static_cast<XMLTokenEnum>( pCurrent->nToken ),
632cdf0e10cSrcweir sValue );
633cdf0e10cSrcweir }
634cdf0e10cSrcweir }
635cdf0e10cSrcweir
636cdf0e10cSrcweir
637cdf0e10cSrcweir
638cdf0e10cSrcweir //
639cdf0e10cSrcweir // any conversion functions
640cdf0e10cSrcweir //
641cdf0e10cSrcweir
642cdf0e10cSrcweir template<typename T, void (*FUNC)( OUStringBuffer&, T )>
lcl_convert(const Any & rAny)643cdf0e10cSrcweir OUString lcl_convert( const Any& rAny )
644cdf0e10cSrcweir {
645cdf0e10cSrcweir OUStringBuffer aBuffer;
646cdf0e10cSrcweir T aData = T();
647cdf0e10cSrcweir if( rAny >>= aData )
648cdf0e10cSrcweir {
649cdf0e10cSrcweir FUNC( aBuffer, aData );
650cdf0e10cSrcweir }
651cdf0e10cSrcweir return aBuffer.makeStringAndClear();
652cdf0e10cSrcweir }
653cdf0e10cSrcweir
654cdf0e10cSrcweir template<typename T, void (*FUNC)( OUStringBuffer&, const T& )>
lcl_convertRef(const Any & rAny)655cdf0e10cSrcweir OUString lcl_convertRef( const Any& rAny )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir OUStringBuffer aBuffer;
658cdf0e10cSrcweir T aData;
659cdf0e10cSrcweir if( rAny >>= aData )
660cdf0e10cSrcweir {
661cdf0e10cSrcweir FUNC( aBuffer, aData );
662cdf0e10cSrcweir }
663cdf0e10cSrcweir return aBuffer.makeStringAndClear();
664cdf0e10cSrcweir }
665cdf0e10cSrcweir
lcl_string(const Any & rAny)666cdf0e10cSrcweir OUString lcl_string( const Any& rAny )
667cdf0e10cSrcweir {
668cdf0e10cSrcweir OUString aResult;
669cdf0e10cSrcweir rAny >>= aResult;
670cdf0e10cSrcweir return aResult;
671cdf0e10cSrcweir }
672cdf0e10cSrcweir
lcl_bool(const Any & rAny)673cdf0e10cSrcweir OUString lcl_bool( const Any& rAny )
674cdf0e10cSrcweir {
675cdf0e10cSrcweir bool bResult = bool();
676cdf0e10cSrcweir if( rAny >>= bResult )
677cdf0e10cSrcweir return GetXMLToken( bResult ? XML_TRUE : XML_FALSE );
678cdf0e10cSrcweir DBG_ERROR( "expected boolean value" );
679cdf0e10cSrcweir return OUString();
680cdf0e10cSrcweir }
681cdf0e10cSrcweir
lcl_formatDate(OUStringBuffer & aBuffer,const Date & rDate)682cdf0e10cSrcweir void lcl_formatDate( OUStringBuffer& aBuffer, const Date& rDate )
683cdf0e10cSrcweir {
684cdf0e10cSrcweir aBuffer.append( static_cast<sal_Int32>( rDate.Year ) );
685cdf0e10cSrcweir aBuffer.append( sal_Unicode('-') );
686cdf0e10cSrcweir aBuffer.append( static_cast<sal_Int32>( rDate.Month ) );
687cdf0e10cSrcweir aBuffer.append( sal_Unicode('-') );
688cdf0e10cSrcweir aBuffer.append( static_cast<sal_Int32>( rDate.Day ) );
689cdf0e10cSrcweir }
690cdf0e10cSrcweir
lcl_formatTime(OUStringBuffer & aBuffer,const com::sun::star::util::Time & rTime)691cdf0e10cSrcweir void lcl_formatTime( OUStringBuffer& aBuffer, const com::sun::star::util::Time& rTime )
692cdf0e10cSrcweir {
693cdf0e10cSrcweir DateTime aDateTime;
694cdf0e10cSrcweir aDateTime.Hours = rTime.Hours;
695cdf0e10cSrcweir aDateTime.Minutes = rTime.Minutes;
696cdf0e10cSrcweir aDateTime.Seconds = rTime.Seconds;
697cdf0e10cSrcweir aDateTime.HundredthSeconds = rTime.HundredthSeconds;
698cdf0e10cSrcweir SvXMLUnitConverter::convertTime( aBuffer, aDateTime );
699cdf0e10cSrcweir }
700cdf0e10cSrcweir
lcl_formatDateTime(OUStringBuffer & aBuffer,const DateTime & aDateTime)701cdf0e10cSrcweir void lcl_formatDateTime( OUStringBuffer& aBuffer, const DateTime& aDateTime )
702cdf0e10cSrcweir {
703cdf0e10cSrcweir SvXMLUnitConverter::convertDateTime( aBuffer, aDateTime );
704cdf0e10cSrcweir }
705cdf0e10cSrcweir
lcl_whitespace(const Any & rAny)706cdf0e10cSrcweir OUString lcl_whitespace( const Any& rAny )
707cdf0e10cSrcweir {
708cdf0e10cSrcweir OUString sResult;
709cdf0e10cSrcweir sal_uInt16 n = sal_uInt16();
710cdf0e10cSrcweir if( rAny >>= n )
711cdf0e10cSrcweir {
712cdf0e10cSrcweir switch( n )
713cdf0e10cSrcweir {
714cdf0e10cSrcweir case com::sun::star::xsd::WhiteSpaceTreatment::Preserve:
715cdf0e10cSrcweir sResult = GetXMLToken( XML_PRESERVE );
716cdf0e10cSrcweir break;
717cdf0e10cSrcweir case com::sun::star::xsd::WhiteSpaceTreatment::Replace:
718cdf0e10cSrcweir sResult = GetXMLToken( XML_REPLACE );
719cdf0e10cSrcweir break;
720cdf0e10cSrcweir case com::sun::star::xsd::WhiteSpaceTreatment::Collapse:
721cdf0e10cSrcweir sResult = GetXMLToken( XML_COLLAPSE );
722cdf0e10cSrcweir break;
723cdf0e10cSrcweir }
724cdf0e10cSrcweir }
725cdf0e10cSrcweir return sResult;
726cdf0e10cSrcweir }
727cdf0e10cSrcweir
728cdf0e10cSrcweir
729cdf0e10cSrcweir /// return name of Binding
lcl_getXFormsBindName(const Reference<XPropertySet> & xBinding)730cdf0e10cSrcweir OUString lcl_getXFormsBindName( const Reference<XPropertySet>& xBinding )
731cdf0e10cSrcweir {
732cdf0e10cSrcweir OUString sProp( OUSTRING( "BindingID" ) );
733cdf0e10cSrcweir
734cdf0e10cSrcweir OUString sReturn;
735cdf0e10cSrcweir if( xBinding.is() &&
736cdf0e10cSrcweir xBinding->getPropertySetInfo()->hasPropertyByName( sProp ) )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir xBinding->getPropertyValue( sProp ) >>= sReturn;
739cdf0e10cSrcweir }
740cdf0e10cSrcweir return sReturn;
741cdf0e10cSrcweir }
742cdf0e10cSrcweir
743cdf0e10cSrcweir // return name of binding
getXFormsBindName(const Reference<XPropertySet> & xControl)744cdf0e10cSrcweir OUString getXFormsBindName( const Reference<XPropertySet>& xControl )
745cdf0e10cSrcweir {
746cdf0e10cSrcweir Reference<XBindableValue> xBindable( xControl, UNO_QUERY );
747cdf0e10cSrcweir return xBindable.is()
748cdf0e10cSrcweir ? lcl_getXFormsBindName(
749cdf0e10cSrcweir Reference<XPropertySet>( xBindable->getValueBinding(), UNO_QUERY ))
750cdf0e10cSrcweir : OUString();
751cdf0e10cSrcweir }
752cdf0e10cSrcweir
753cdf0e10cSrcweir // return name of list binding
getXFormsListBindName(const Reference<XPropertySet> & xControl)754cdf0e10cSrcweir OUString getXFormsListBindName( const Reference<XPropertySet>& xControl )
755cdf0e10cSrcweir {
756cdf0e10cSrcweir Reference<XListEntrySink> xListEntrySink( xControl, UNO_QUERY );
757cdf0e10cSrcweir return xListEntrySink.is()
758cdf0e10cSrcweir ? lcl_getXFormsBindName(
759cdf0e10cSrcweir Reference<XPropertySet>( xListEntrySink->getListEntrySource(),
760cdf0e10cSrcweir UNO_QUERY ) )
761cdf0e10cSrcweir : OUString();
762cdf0e10cSrcweir }
763cdf0e10cSrcweir
getXFormsSubmissionName(const Reference<XPropertySet> & xBinding)764cdf0e10cSrcweir OUString getXFormsSubmissionName( const Reference<XPropertySet>& xBinding )
765cdf0e10cSrcweir {
766cdf0e10cSrcweir OUString sReturn;
767cdf0e10cSrcweir
768cdf0e10cSrcweir Reference<XSubmissionSupplier> xSubmissionSupplier( xBinding, UNO_QUERY );
769cdf0e10cSrcweir if( xSubmissionSupplier.is() )
770cdf0e10cSrcweir {
771cdf0e10cSrcweir Reference<XPropertySet> xPropertySet(
772cdf0e10cSrcweir xSubmissionSupplier->getSubmission(), UNO_QUERY );
773cdf0e10cSrcweir OUString sProp( OUSTRING("ID") );
774cdf0e10cSrcweir if( xPropertySet.is() &&
775cdf0e10cSrcweir xPropertySet->getPropertySetInfo()->hasPropertyByName( sProp ) )
776cdf0e10cSrcweir {
777cdf0e10cSrcweir xPropertySet->getPropertyValue( sProp ) >>= sReturn;
778cdf0e10cSrcweir }
779cdf0e10cSrcweir }
780cdf0e10cSrcweir
781cdf0e10cSrcweir return sReturn;
782cdf0e10cSrcweir }
783cdf0e10cSrcweir
getXFormsSettings(const Reference<XNameAccess> & _rXForms,Sequence<PropertyValue> & _out_rSettings)784cdf0e10cSrcweir void getXFormsSettings( const Reference< XNameAccess >& _rXForms, Sequence< PropertyValue >& _out_rSettings )
785cdf0e10cSrcweir {
786cdf0e10cSrcweir _out_rSettings = Sequence< PropertyValue >();
787cdf0e10cSrcweir
788cdf0e10cSrcweir OSL_PRECOND( _rXForms.is(), "getXFormsSettings: invalid XForms container!" );
789cdf0e10cSrcweir if ( !_rXForms.is() )
790cdf0e10cSrcweir return;
791cdf0e10cSrcweir
792cdf0e10cSrcweir try
793cdf0e10cSrcweir {
794cdf0e10cSrcweir // we want to export some special properties of our XForms models as config-item-map-named,
795cdf0e10cSrcweir // which implies we need a PropertyValue whose value is an XNameAccess, whose keys
796cdf0e10cSrcweir // are the names of the XForm models, and which in turn provides named sequences of
797cdf0e10cSrcweir // PropertyValues - which denote the actual property values of the given named model.
798cdf0e10cSrcweir
799cdf0e10cSrcweir Sequence< ::rtl::OUString > aModelNames( _rXForms->getElementNames() );
800cdf0e10cSrcweir
801cdf0e10cSrcweir ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
802cdf0e10cSrcweir Reference< XNameContainer > xModelSettings(
803cdf0e10cSrcweir aContext.createComponent( "com.sun.star.document.NamedPropertyValues" ),
804cdf0e10cSrcweir UNO_QUERY_THROW );
805cdf0e10cSrcweir
806cdf0e10cSrcweir for ( const ::rtl::OUString* pModelName = aModelNames.getConstArray();
807cdf0e10cSrcweir pModelName != aModelNames.getConstArray() + aModelNames.getLength();
808cdf0e10cSrcweir ++pModelName
809cdf0e10cSrcweir )
810cdf0e10cSrcweir {
811cdf0e10cSrcweir Reference< XPropertySet > xModelProps( _rXForms->getByName( *pModelName ), UNO_QUERY_THROW );
812cdf0e10cSrcweir
813cdf0e10cSrcweir Sequence< PropertyValue > aModelSettings( 1 );
814cdf0e10cSrcweir aModelSettings[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ExternalData" ) );
815cdf0e10cSrcweir aModelSettings[0].Value = xModelProps->getPropertyValue( aModelSettings[0].Name );
816cdf0e10cSrcweir
817cdf0e10cSrcweir xModelSettings->insertByName( *pModelName, makeAny( aModelSettings ) );
818cdf0e10cSrcweir }
819cdf0e10cSrcweir
820cdf0e10cSrcweir if ( xModelSettings->hasElements() )
821cdf0e10cSrcweir {
822cdf0e10cSrcweir _out_rSettings.realloc( 1 );
823cdf0e10cSrcweir _out_rSettings[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XFormModels" ) );
824cdf0e10cSrcweir _out_rSettings[0].Value <<= xModelSettings;
825cdf0e10cSrcweir }
826cdf0e10cSrcweir }
827cdf0e10cSrcweir catch( const Exception& )
828cdf0e10cSrcweir {
829cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
830cdf0e10cSrcweir }
831cdf0e10cSrcweir }
832