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