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