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