1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbaccess.hxx"
26
27 #include "xmlExport.hxx"
28 #include "xmlAutoStyle.hxx"
29 #include "flt_reghelper.hxx"
30 #include <xmloff/ProgressBarHelper.hxx>
31 #include <xmloff/xmltoken.hxx>
32 #include <xmloff/txtimp.hxx>
33 #include <xmloff/xmlnmspe.hxx>
34 #include <xmloff/xmluconv.hxx>
35 #include <xmloff/nmspmap.hxx>
36 #include <comphelper/types.hxx>
37 #include "xmlstrings.hrc"
38 #include "xmlEnums.hxx"
39 #include <xmloff/nmspmap.hxx>
40 #include <com/sun/star/beans/XPropertyState.hpp>
41 #include <com/sun/star/beans/PropertyAttribute.hpp>
42 #include <com/sun/star/sdb/XFormDocumentsSupplier.hpp>
43 #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
44 #include <com/sun/star/sdb/XReportDocumentsSupplier.hpp>
45 #include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
46 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
47 #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
48
49 #include <com/sun/star/awt/TextAlign.hpp>
50 #include <xmloff/xmluconv.hxx>
51 #include "xmlHelper.hxx"
52 #include <com/sun/star/awt/FontDescriptor.hpp>
53 #include <svl/filenotation.hxx>
54 #include <unotools/pathoptions.hxx>
55 #include <tools/diagnose_ex.h>
56 #include <connectivity/DriversConfig.hxx>
57 #include <connectivity/dbtools.hxx>
58
59 #include <boost/optional.hpp>
60
61 namespace dbaxml
62 {
63 using namespace comphelper;
64 using namespace ::com::sun::star::sdb;
65 using namespace ::com::sun::star::sdbcx;
66 using namespace ::com::sun::star::util;
67 using namespace ::com::sun::star;
68
69 class ODBExportHelper
70 {
71 public:
72 static ::rtl::OUString SAL_CALL getImplementationName_Static( ) throw (RuntimeException);
73 static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_Static( ) throw(RuntimeException);
74 static Reference< XInterface > SAL_CALL Create(const Reference< ::com::sun::star::lang::XMultiServiceFactory >&);
75 };
76 class ODBFullExportHelper
77 {
78 public:
79 static ::rtl::OUString SAL_CALL getImplementationName_Static( ) throw (RuntimeException);
80 static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_Static( ) throw(RuntimeException);
81 static Reference< XInterface > SAL_CALL Create(const Reference< ::com::sun::star::lang::XMultiServiceFactory >&);
82 };
83 }
84 // -----------------------------------------------------------------------------
createRegistryInfo_ODBFilterExport()85 extern "C" void SAL_CALL createRegistryInfo_ODBFilterExport( )
86 {
87 static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBExport > aAutoRegistration;
88 }
89 //--------------------------------------------------------------------------
createRegistryInfo_OSettingsExport()90 extern "C" void SAL_CALL createRegistryInfo_OSettingsExport( )
91 {
92 static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBExportHelper > aAutoRegistration;
93 }
94 //--------------------------------------------------------------------------
createRegistryInfo_OFullExport()95 extern "C" void SAL_CALL createRegistryInfo_OFullExport( )
96 {
97 static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBFullExportHelper > aAutoRegistration;
98 }
99 //--------------------------------------------------------------------------
100 namespace dbaxml
101 {
102 using namespace comphelper;
103 using namespace ::com::sun::star::sdb;
104 using namespace ::com::sun::star::sdbcx;
105 using namespace ::com::sun::star::util;
106
107 //---------------------------------------------------------------------
Create(const Reference<XMultiServiceFactory> & _rxORB)108 Reference< XInterface > SAL_CALL ODBExportHelper::Create(const Reference< XMultiServiceFactory >& _rxORB)
109 {
110 return static_cast< XServiceInfo* >(new ODBExport(_rxORB,EXPORT_SETTINGS | EXPORT_PRETTY ));
111 }
112 //---------------------------------------------------------------------
getImplementationName_Static()113 ::rtl::OUString SAL_CALL ODBExportHelper::getImplementationName_Static( ) throw (RuntimeException)
114 {
115 return ::rtl::OUString::createFromAscii("com.sun.star.comp.sdb.XMLSettingsExporter");
116 }
117 //---------------------------------------------------------------------
getSupportedServiceNames_Static()118 Sequence< ::rtl::OUString > SAL_CALL ODBExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
119 {
120 Sequence< ::rtl::OUString > aSupported(1);
121 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
122 return aSupported;
123 }
124
125
126 //---------------------------------------------------------------------
Create(const Reference<XMultiServiceFactory> & _rxORB)127 Reference< XInterface > SAL_CALL ODBFullExportHelper::Create(const Reference< XMultiServiceFactory >& _rxORB)
128 {
129 return static_cast< XServiceInfo* >(new ODBExport(_rxORB,EXPORT_ALL));
130 }
131 //---------------------------------------------------------------------
getImplementationName_Static()132 ::rtl::OUString SAL_CALL ODBFullExportHelper::getImplementationName_Static( ) throw (RuntimeException)
133 {
134 return ::rtl::OUString::createFromAscii("com.sun.star.comp.sdb.XMLFullExporter");
135 }
136 //---------------------------------------------------------------------
getSupportedServiceNames_Static()137 Sequence< ::rtl::OUString > SAL_CALL ODBFullExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
138 {
139 Sequence< ::rtl::OUString > aSupported(1);
140 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
141 return aSupported;
142 }
143
144 //---------------------------------------------------------------------
lcl_implGetPropertyXMLType(const Type & _rType)145 ::rtl::OUString lcl_implGetPropertyXMLType(const Type& _rType)
146 {
147 // possible types we can write (either because we recognize them directly or because we convert _rValue
148 // into one of these types)
149 static const ::rtl::OUString s_sTypeBoolean (RTL_CONSTASCII_USTRINGPARAM("boolean"));
150 static const ::rtl::OUString s_sTypeShort (RTL_CONSTASCII_USTRINGPARAM("short"));
151 static const ::rtl::OUString s_sTypeInteger (RTL_CONSTASCII_USTRINGPARAM("int"));
152 static const ::rtl::OUString s_sTypeLong (RTL_CONSTASCII_USTRINGPARAM("long"));
153 static const ::rtl::OUString s_sTypeDouble (RTL_CONSTASCII_USTRINGPARAM("double"));
154 static const ::rtl::OUString s_sTypeString (RTL_CONSTASCII_USTRINGPARAM("string"));
155
156 // handle the type description
157 switch (_rType.getTypeClass())
158 {
159 case TypeClass_STRING:
160 return s_sTypeString;
161 case TypeClass_DOUBLE:
162 return s_sTypeDouble;
163 case TypeClass_BOOLEAN:
164 return s_sTypeBoolean;
165 case TypeClass_BYTE:
166 case TypeClass_SHORT:
167 return s_sTypeShort;
168 case TypeClass_LONG:
169 return s_sTypeInteger;
170 case TypeClass_HYPER:
171 return s_sTypeLong;
172 case TypeClass_ENUM:
173 return s_sTypeInteger;
174
175 default:
176 OSL_ENSURE( false, "lcl_implGetPropertyXMLType: unsupported value type!" );
177 return s_sTypeDouble;
178 }
179 }
180
181 class OSpecialHanldeXMLExportPropertyMapper : public SvXMLExportPropertyMapper
182 {
183 public:
OSpecialHanldeXMLExportPropertyMapper(const UniReference<XMLPropertySetMapper> & rMapper)184 OSpecialHanldeXMLExportPropertyMapper(const UniReference< XMLPropertySetMapper >& rMapper) : SvXMLExportPropertyMapper(rMapper )
185 {
186 }
187 /** this method is called for every item that has the
188 MID_FLAG_SPECIAL_ITEM_EXPORT flag set */
handleSpecialItem(SvXMLAttributeList &,const XMLPropertyState &,const SvXMLUnitConverter &,const SvXMLNamespaceMap &,const::std::vector<XMLPropertyState> *,sal_uInt32) const189 virtual void handleSpecialItem(
190 SvXMLAttributeList& /*rAttrList*/,
191 const XMLPropertyState& /*rProperty*/,
192 const SvXMLUnitConverter& /*rUnitConverter*/,
193 const SvXMLNamespaceMap& /*rNamespaceMap*/,
194 const ::std::vector< XMLPropertyState > * /*pProperties*/ ,
195 sal_uInt32 /*nIdx*/ ) const
196 {
197 // nothing to do here
198 }
199 };
200 // -----------------------------------------------------------------------------
ODBExport(const Reference<XMultiServiceFactory> & _rxMSF,sal_uInt16 nExportFlag)201 ODBExport::ODBExport(const Reference< XMultiServiceFactory >& _rxMSF,sal_uInt16 nExportFlag)
202 : SvXMLExport( _rxMSF,MAP_10TH_MM,XML_DATABASE, EXPORT_OASIS | nExportFlag)
203 ,m_aTypeCollection(_rxMSF)
204 ,m_bAllreadyFilled(sal_False)
205 {
206 GetMM100UnitConverter().setCoreMeasureUnit(MAP_10TH_MM);
207 GetMM100UnitConverter().setXMLMeasureUnit(MAP_CM);
208
209 _GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE );
210 _GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
211 _GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG), XML_NAMESPACE_SVG );
212
213 _GetNamespaceMap().Add( GetXMLToken(XML_NP_DB), GetXMLToken(XML_N_DB_OASIS), XML_NAMESPACE_DB );
214
215 if( (nExportFlag & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS) ) != 0 )
216 _GetNamespaceMap().Add( GetXMLToken(XML_NP_FO), GetXMLToken(XML_N_FO_COMPAT), XML_NAMESPACE_FO );
217
218 if( (nExportFlag & (EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS) ) != 0 )
219 {
220 _GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
221 }
222 if( (nExportFlag & EXPORT_SETTINGS) != 0 )
223 {
224 _GetNamespaceMap().Add( GetXMLToken(XML_NP_CONFIG), GetXMLToken(XML_N_CONFIG), XML_NAMESPACE_CONFIG );
225 }
226
227 if( (nExportFlag & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS) ) != 0 )
228 {
229 _GetNamespaceMap().Add( GetXMLToken(XML_NP_STYLE), GetXMLToken(XML_N_STYLE), XML_NAMESPACE_STYLE );
230 }
231
232 _GetNamespaceMap().Add( GetXMLToken(XML_NP_TABLE), GetXMLToken(XML_N_TABLE), XML_NAMESPACE_TABLE );
233 _GetNamespaceMap().Add( GetXMLToken(XML_NP_NUMBER), GetXMLToken(XML_N_NUMBER), XML_NAMESPACE_NUMBER );
234
235 m_xExportHelper = new SvXMLExportPropertyMapper(GetTableStylesPropertySetMapper());
236 m_xColumnExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetColumnStylesPropertySetMapper());
237
238 //UniReference < XMLPropertySetMapper > xCellStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetCellStylesPropertySetMapper(),m_xPropHdlFactory);
239 //m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(xCellStylesPropertySetMapper);
240 //m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetCellStylesPropertySetMapper());
241 //m_xCellExportHelper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this));
242 m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetCellStylesPropertySetMapper());
243 m_xRowExportHelper = new OSpecialHanldeXMLExportPropertyMapper(OXMLHelper::GetRowStylesPropertySetMapper());
244
245 GetAutoStylePool()->AddFamily(
246 XML_STYLE_FAMILY_TABLE_TABLE,
247 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_TABLE_STYLES_NAME ),
248 m_xExportHelper.get(),
249 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_TABLE_STYLES_PREFIX ));
250
251 GetAutoStylePool()->AddFamily(
252 XML_STYLE_FAMILY_TABLE_COLUMN,
253 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_NAME ),
254 m_xColumnExportHelper.get(),
255 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX ));
256
257 GetAutoStylePool()->AddFamily(
258 XML_STYLE_FAMILY_TABLE_CELL,
259 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME ),
260 m_xCellExportHelper.get(),
261 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX ));
262
263 GetAutoStylePool()->AddFamily(
264 XML_STYLE_FAMILY_TABLE_ROW,
265 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_ROW_STYLES_NAME ),
266 m_xRowExportHelper.get(),
267 rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX ));
268 }
269 // -----------------------------------------------------------------------------
270 IMPLEMENT_SERVICE_INFO1_STATIC( ODBExport, "com.sun.star.comp.sdb.DBExportFilter", "com.sun.star.document.ExportFilter")
271 // -----------------------------------------------------------------------------
exportDataSource()272 void ODBExport::exportDataSource()
273 {
274 try
275 {
276 Reference<XPropertySet> xProp( getDataSource(), UNO_SET_THROW );
277
278 sal_Bool bAutoIncrementEnabled = sal_True;
279 TStringPair aAutoIncrement;
280
281 Reference< XPropertySet > xDataSourceSettings;
282 OSL_VERIFY( xProp->getPropertyValue( PROPERTY_SETTINGS ) >>= xDataSourceSettings );
283 Reference< XPropertyState > xSettingsState( xDataSourceSettings, UNO_QUERY_THROW );
284 Reference< XPropertySetInfo > xSettingsInfo( xDataSourceSettings->getPropertySetInfo(), UNO_SET_THROW );
285
286 TDelimiter aDelimiter;
287 xSettingsState->getPropertyDefault( INFO_TEXTDELIMITER ) >>= aDelimiter.sText;
288 xSettingsState->getPropertyDefault( INFO_FIELDDELIMITER ) >>= aDelimiter.sField;
289 xSettingsState->getPropertyDefault( INFO_DECIMALDELIMITER ) >>= aDelimiter.sDecimal;
290 xSettingsState->getPropertyDefault( INFO_THOUSANDSDELIMITER ) >>= aDelimiter.sThousand;
291
292 ::connectivity::DriversConfig aDriverConfig(getServiceFactory());
293 const ::rtl::OUString sURL = ::comphelper::getString(xProp->getPropertyValue(PROPERTY_URL));
294 ::comphelper::NamedValueCollection aDriverSupportedProperties( aDriverConfig.getProperties( sURL ) );
295
296 static ::rtl::OUString s_sTrue(::xmloff::token::GetXMLToken( XML_TRUE ));
297 static ::rtl::OUString s_sFalse(::xmloff::token::GetXMLToken( XML_FALSE ));
298 // loop through the properties, and export only those which are not defaulted
299 TSettingsMap aSettingsMap;
300 Sequence< Property > aProperties = xSettingsInfo->getProperties();
301 const Property* pProperties = aProperties.getConstArray();
302 const Property* pPropertiesEnd = pProperties + aProperties.getLength();
303 for ( ; pProperties != pPropertiesEnd; ++pProperties )
304 {
305 ::rtl::OUString sValue;
306 Any aValue = xDataSourceSettings->getPropertyValue( pProperties->Name );
307 switch ( aValue.getValueTypeClass() )
308 {
309 case TypeClass_STRING:
310 aValue >>= sValue;
311 break;
312 case TypeClass_DOUBLE:
313 // let the unit converter format is as string
314 sValue = ::rtl::OUString::valueOf( getDouble( aValue ) );
315 break;
316 case TypeClass_BOOLEAN:
317 sValue = ::xmloff::token::GetXMLToken( getBOOL( aValue ) ? XML_TRUE : XML_FALSE );
318 break;
319 case TypeClass_BYTE:
320 case TypeClass_SHORT:
321 case TypeClass_LONG:
322 // let the unit converter format is as string
323 sValue = ::rtl::OUString::valueOf( getINT32( aValue ) );
324 break;
325 default:
326 break;
327 }
328
329 ::xmloff::token::XMLTokenEnum eToken = XML_TOKEN_INVALID;
330
331 struct PropertyMap
332 {
333 const ::rtl::OUString sPropertyName;
334 const XMLTokenEnum eAttributeToken;
335 const ::boost::optional< ::rtl::OUString > aXMLDefault;
336
337 PropertyMap( const ::rtl::OUString& _rPropertyName, const XMLTokenEnum _eToken )
338 :sPropertyName( _rPropertyName )
339 ,eAttributeToken( _eToken )
340 ,aXMLDefault()
341 {
342 }
343
344 PropertyMap( const ::rtl::OUString& _rPropertyName, const XMLTokenEnum _eToken, const ::rtl::OUString& _rDefault )
345 :sPropertyName( _rPropertyName )
346 ,eAttributeToken( _eToken )
347 ,aXMLDefault( _rDefault )
348 {
349 }
350 };
351
352 PropertyMap aTokens[] =
353 {
354 PropertyMap( INFO_TEXTFILEHEADER, XML_IS_FIRST_ROW_HEADER_LINE, s_sTrue ),
355 PropertyMap( INFO_SHOWDELETEDROWS, XML_SHOW_DELETED, s_sFalse ),
356 PropertyMap( INFO_ALLOWLONGTABLENAMES, XML_IS_TABLE_NAME_LENGTH_LIMITED, s_sTrue ),
357 PropertyMap( INFO_ADDITIONALOPTIONS, XML_SYSTEM_DRIVER_SETTINGS ),
358 PropertyMap( PROPERTY_ENABLESQL92CHECK, XML_ENABLE_SQL92_CHECK, s_sFalse ),
359 PropertyMap( INFO_APPEND_TABLE_ALIAS, XML_APPEND_TABLE_ALIAS_NAME, s_sTrue ),
360 PropertyMap( INFO_PARAMETERNAMESUBST, XML_PARAMETER_NAME_SUBSTITUTION, s_sTrue ),
361 PropertyMap( INFO_IGNOREDRIVER_PRIV, XML_IGNORE_DRIVER_PRIVILEGES, s_sTrue ),
362 PropertyMap( INFO_USECATALOG, XML_USE_CATALOG, s_sFalse ),
363 PropertyMap( PROPERTY_SUPPRESSVERSIONCL,XML_SUPPRESS_VERSION_COLUMNS, s_sTrue ),
364 PropertyMap( INFO_CONN_LDAP_BASEDN, XML_BASE_DN ),
365 PropertyMap( INFO_CONN_LDAP_ROWCOUNT, XML_MAX_ROW_COUNT )
366 };
367
368 bool bIsXMLDefault = false;
369 for ( size_t i=0; i < sizeof( aTokens ) / sizeof( aTokens[0] ); ++i )
370 {
371 if ( pProperties->Name == aTokens[i].sPropertyName )
372 {
373 eToken = aTokens[i].eAttributeToken;
374
375 if ( !!aTokens[i].aXMLDefault
376 && ( sValue == *aTokens[i].aXMLDefault )
377 )
378 {
379 bIsXMLDefault = true;
380 }
381 break;
382 }
383 }
384
385 if ( bIsXMLDefault )
386 // the property has the value which is specified as default in the XML schema -> no need to write it
387 continue;
388
389 if ( eToken == XML_TOKEN_INVALID )
390 {
391 // for properties which are not REMOVEABLE, we care for their state, and
392 // only export them if they're not DEFAULTed
393 if ( ( pProperties->Attributes & PropertyAttribute::REMOVEABLE ) == 0 )
394 {
395 PropertyState ePropertyState = xSettingsState->getPropertyState( pProperties->Name );
396 if ( PropertyState_DEFAULT_VALUE == ePropertyState )
397 continue;
398 }
399
400 // special handlings
401 if ( pProperties->Name == PROPERTY_BOOLEANCOMPARISONMODE )
402 {
403 sal_Int32 nValue = 0;
404 aValue >>= nValue;
405 if ( sValue.equalsAscii("0") )
406 sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("equal-integer"));
407 else if ( sValue.equalsAscii("1") )
408 sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("is-boolean"));
409 else if ( sValue.equalsAscii("2") )
410 sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("equal-boolean"));
411 else if ( sValue.equalsAscii("3") )
412 sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("equal-use-only-zero"));
413 if ( sValue.equalsAscii("equal-integer") )
414 continue;
415 eToken = XML_BOOLEAN_COMPARISON_MODE;
416 }
417 else if ( pProperties->Name == INFO_AUTORETRIEVEENABLED )
418 {
419 aValue >>= bAutoIncrementEnabled;
420 continue;
421 }
422 else if ( pProperties->Name == INFO_AUTORETRIEVEVALUE )
423 {
424 aAutoIncrement.first = sValue;
425 continue;
426 }
427 else if ( pProperties->Name == PROPERTY_AUTOINCREMENTCREATION )
428 {
429 aAutoIncrement.second = sValue;
430 continue;
431 }
432 else if ( pProperties->Name == INFO_TEXTDELIMITER )
433 {
434 aDelimiter.sText = sValue;
435 aDelimiter.bUsed = true;
436 continue;
437 }
438 else if ( pProperties->Name == INFO_FIELDDELIMITER )
439 {
440 aDelimiter.sField = sValue;
441 aDelimiter.bUsed = true;
442 continue;
443 }
444 else if ( pProperties->Name == INFO_DECIMALDELIMITER )
445 {
446 aDelimiter.sDecimal = sValue;
447 aDelimiter.bUsed = true;
448 continue;
449 }
450 else if ( pProperties->Name == INFO_THOUSANDSDELIMITER )
451 {
452 aDelimiter.sThousand = sValue;
453 aDelimiter.bUsed = true;
454 continue;
455 }
456 else if ( pProperties->Name == INFO_CHARSET )
457 {
458 m_sCharSet = sValue;
459 continue;
460 }
461 else
462 {
463 if ( !aDriverSupportedProperties.has(pProperties->Name) || aDriverSupportedProperties.get(pProperties->Name) != aValue )
464 {
465 m_aDataSourceSettings.push_back( TypedPropertyValue(
466 pProperties->Name, pProperties->Type, aValue ) );
467 }
468 continue;
469 }
470 }
471
472 aSettingsMap.insert(TSettingsMap::value_type(eToken,sValue));
473 }
474 if ( bAutoIncrementEnabled && (aAutoIncrement.first.getLength() || aAutoIncrement.second.getLength()) )
475 m_aAutoIncrement.reset( new TStringPair(aAutoIncrement));
476 if ( aDelimiter.bUsed )
477 m_aDelimiter.reset( new TDelimiter( aDelimiter ) );
478
479 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DATASOURCE, sal_True, sal_True);
480
481 exportConnectionData();
482 exportDriverSettings(aSettingsMap);
483 exportApplicationConnectionSettings(aSettingsMap);
484 }
485 catch( const Exception& )
486 {
487 DBG_UNHANDLED_EXCEPTION();
488 }
489 }
490 // -----------------------------------------------------------------------------
exportApplicationConnectionSettings(const TSettingsMap & _aSettings)491 void ODBExport::exportApplicationConnectionSettings(const TSettingsMap& _aSettings)
492 {
493 const ::xmloff::token::XMLTokenEnum pSettings[] = {
494 XML_IS_TABLE_NAME_LENGTH_LIMITED
495 ,XML_ENABLE_SQL92_CHECK
496 ,XML_APPEND_TABLE_ALIAS_NAME
497 ,XML_IGNORE_DRIVER_PRIVILEGES
498 ,XML_BOOLEAN_COMPARISON_MODE
499 ,XML_USE_CATALOG
500 ,XML_MAX_ROW_COUNT
501 ,XML_SUPPRESS_VERSION_COLUMNS
502 };
503 for (size_t i = 0; i< sizeof(pSettings)/sizeof(pSettings[0]); ++i)
504 {
505 TSettingsMap::const_iterator aFind = _aSettings.find(pSettings[i]);
506 if ( aFind != _aSettings.end() )
507 AddAttribute(XML_NAMESPACE_DB, aFind->first,aFind->second);
508 }
509 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_APPLICATION_CONNECTION_SETTINGS, sal_True, sal_True);
510
511 Reference<XPropertySet> xProp(getDataSource());
512 Sequence< ::rtl::OUString> aValue;
513 xProp->getPropertyValue(PROPERTY_TABLEFILTER) >>= aValue;
514 if ( aValue.getLength() )
515 {
516 SvXMLElementExport aElem2(*this,XML_NAMESPACE_DB, XML_TABLE_FILTER, sal_True, sal_True);
517 exportSequence(aValue,XML_TABLE_INCLUDE_FILTER,XML_TABLE_FILTER_PATTERN);
518 }
519
520 xProp->getPropertyValue(PROPERTY_TABLETYPEFILTER) >>= aValue;
521 if ( aValue.getLength() )
522 exportSequence(aValue,XML_TABLE_TYPE_FILTER,XML_TABLE_TYPE);
523
524 exportDataSourceSettings();
525 }
526 // -----------------------------------------------------------------------------
exportDriverSettings(const TSettingsMap & _aSettings)527 void ODBExport::exportDriverSettings(const TSettingsMap& _aSettings)
528 {
529 const ::xmloff::token::XMLTokenEnum pSettings[] = {
530 XML_SHOW_DELETED
531 ,XML_SYSTEM_DRIVER_SETTINGS
532 ,XML_BASE_DN
533 ,XML_IS_FIRST_ROW_HEADER_LINE
534 ,XML_PARAMETER_NAME_SUBSTITUTION
535 };
536 for (size_t i = 0; i< sizeof(pSettings)/sizeof(pSettings[0]); ++i)
537 {
538 TSettingsMap::const_iterator aFind = _aSettings.find(pSettings[i]);
539 if ( aFind != _aSettings.end() )
540 AddAttribute(XML_NAMESPACE_DB, aFind->first,aFind->second);
541 }
542 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DRIVER_SETTINGS, sal_True, sal_True);
543 exportAutoIncrement();
544 exportDelimiter();
545 exportCharSet();
546 }
547 // -----------------------------------------------------------------------------
exportConnectionData()548 void ODBExport::exportConnectionData()
549 {
550 SvXMLElementExport aConnData(*this,XML_NAMESPACE_DB, XML_CONNECTION_DATA, sal_True, sal_True);
551
552 {
553 ::rtl::OUString sValue;
554 Reference<XPropertySet> xProp(getDataSource());
555 xProp->getPropertyValue(PROPERTY_URL) >>= sValue;
556 if ( m_aTypeCollection.isFileSystemBased(sValue) )
557 {
558 SvXMLElementExport aDatabaseDescription(*this,XML_NAMESPACE_DB, XML_DATABASE_DESCRIPTION, sal_True, sal_True);
559 {
560 SvtPathOptions aPathOptions;
561 const String sOrigUrl = m_aTypeCollection.cutPrefix(sValue);
562 String sFileName = aPathOptions.SubstituteVariable(sOrigUrl);
563 if ( sOrigUrl == sFileName )
564 {
565 ::svt::OFileNotation aTransformer( sFileName );
566 ::rtl::OUStringBuffer sURL( aTransformer.get( ::svt::OFileNotation::N_URL ) );
567 if ( sURL.charAt(sURL.getLength()-1) != '/' )
568 sURL.append(sal_Unicode('/'));
569
570 AddAttribute(XML_NAMESPACE_XLINK,XML_HREF,GetRelativeReference(sURL.makeStringAndClear()));
571 } // if ( sOrigUrl == sFileName )
572 else
573 AddAttribute(XML_NAMESPACE_XLINK,XML_HREF,sOrigUrl);
574 AddAttribute(XML_NAMESPACE_DB,XML_MEDIA_TYPE,m_aTypeCollection.getMediaType(sValue));
575 const ::dbaccess::DATASOURCE_TYPE eType = m_aTypeCollection.determineType(sValue);
576 try
577 {
578 ::rtl::OUString sExtension;
579 if ( eType == dbaccess::DST_MSACCESS )
580 sExtension = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("mdb"));
581 else
582 {
583 Reference< XPropertySet > xDataSourceSettings;
584 OSL_VERIFY( xProp->getPropertyValue( PROPERTY_SETTINGS ) >>= xDataSourceSettings );
585 xDataSourceSettings->getPropertyValue( INFO_TEXTFILEEXTENSION ) >>= sExtension;
586 }
587 if ( sExtension.getLength() )
588 AddAttribute(XML_NAMESPACE_DB,XML_EXTENSION,sExtension);
589 }
590 catch(const Exception&)
591 {
592 // nii
593 }
594 SvXMLElementExport aFileBasedDB(*this,XML_NAMESPACE_DB, XML_FILE_BASED_DATABASE, sal_True, sal_True);
595 }
596 }
597 else
598 {
599 String sDatabaseName,sHostName;
600 sal_Int32 nPort = -1;
601 m_aTypeCollection.extractHostNamePort(sValue,sDatabaseName,sHostName,nPort);
602 if ( sHostName.Len() )
603 {
604 SvXMLElementExport aDatabaseDescription(*this,XML_NAMESPACE_DB, XML_DATABASE_DESCRIPTION, sal_True, sal_True);
605 {
606 String sType = m_aTypeCollection.getPrefix(sValue);
607 sType.EraseTrailingChars(':');
608 AddAttribute(XML_NAMESPACE_DB,XML_TYPE,sType);
609 AddAttribute(XML_NAMESPACE_DB,XML_HOSTNAME,sHostName);
610 if ( nPort != -1 )
611 AddAttribute(XML_NAMESPACE_DB,XML_PORT,::rtl::OUString::valueOf(nPort));
612 if ( sDatabaseName.Len() )
613 AddAttribute(XML_NAMESPACE_DB,XML_DATABASE_NAME,sDatabaseName);
614
615 try
616 {
617 Reference< XPropertySet > xDataSourceSettings( xProp->getPropertyValue( PROPERTY_SETTINGS ), UNO_QUERY_THROW );
618 Reference< XPropertySetInfo > xSettingsInfo( xDataSourceSettings->getPropertySetInfo(), UNO_SET_THROW );
619
620 struct PropertyMap
621 {
622 const sal_Char* pAsciiPropertyName;
623 sal_uInt16 nAttributeId;
624
625 PropertyMap() :pAsciiPropertyName( NULL ), nAttributeId(0) { }
626 PropertyMap( const sal_Char* _pAsciiPropertyName, const sal_uInt16 _nAttributeId )
627 :pAsciiPropertyName( _pAsciiPropertyName )
628 ,nAttributeId( _nAttributeId )
629 {
630 }
631 };
632 PropertyMap aProperties[] =
633 {
634 PropertyMap( "LocalSocket", XML_LOCAL_SOCKET )
635 //PropertyMap( "NamedPipe", 0 /* TODO */ )
636 };
637
638 for ( size_t i=0;
639 i < sizeof( aProperties ) / sizeof( aProperties[0] );
640 ++i
641 )
642 {
643 const ::rtl::OUString sPropertyName = ::rtl::OUString::createFromAscii( aProperties[i].pAsciiPropertyName );
644 if ( xSettingsInfo->hasPropertyByName( sPropertyName ) )
645 {
646 ::rtl::OUString sPropertyValue;
647 if ( ( xDataSourceSettings->getPropertyValue( sPropertyName ) >>= sPropertyValue ) && sPropertyValue.getLength() )
648 AddAttribute( XML_NAMESPACE_DB, XML_LOCAL_SOCKET, sPropertyValue );
649
650 }
651 }
652 }
653 catch( const Exception& )
654 {
655 DBG_UNHANDLED_EXCEPTION();
656 }
657
658 SvXMLElementExport aServerDB(*this,XML_NAMESPACE_DB, XML_SERVER_DATABASE, sal_True, sal_True);
659 }
660 }
661 else
662 {
663 AddAttribute(XML_NAMESPACE_XLINK, XML_HREF,sValue);
664 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_CONNECTION_RESOURCE, sal_True, sal_True);
665 }
666 }
667
668 }
669
670 exportLogin();
671 }
672 // -----------------------------------------------------------------------------
exportDataSourceSettings()673 void ODBExport::exportDataSourceSettings()
674 {
675 if ( m_aDataSourceSettings.empty() )
676 return;
677
678 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTINGS, sal_True, sal_True);
679 ::std::vector< TypedPropertyValue >::iterator aIter = m_aDataSourceSettings.begin();
680 ::std::vector< TypedPropertyValue >::iterator aEnd = m_aDataSourceSettings.end();
681 for ( ; aIter != aEnd; ++aIter )
682 {
683 sal_Bool bIsSequence = TypeClass_SEQUENCE == aIter->Type.getTypeClass();
684
685 Type aSimpleType;
686 if ( bIsSequence )
687 aSimpleType = ::comphelper::getSequenceElementType( aIter->Value.getValueType() );
688 else
689 aSimpleType = aIter->Type;
690
691 AddAttribute( XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_IS_LIST,bIsSequence ? XML_TRUE : XML_FALSE );
692 AddAttribute( XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_NAME, aIter->Name );
693
694 ::rtl::OUString sTypeName = lcl_implGetPropertyXMLType( aSimpleType );
695 if ( bIsSequence && aSimpleType.getTypeClass() == TypeClass_ANY )
696 {
697 Sequence<Any> aSeq;
698 aIter->Value >>= aSeq;
699 if ( aSeq.getLength() )
700 sTypeName = lcl_implGetPropertyXMLType(aSeq[0].getValueType());
701 }
702
703 AddAttribute( XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_TYPE, sTypeName );
704
705 SvXMLElementExport aDataSourceSetting( *this, XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING, sal_True, sal_True );
706
707 if ( !bIsSequence )
708 {
709 SvXMLElementExport aDataValue( *this, XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE, sal_True, sal_False );
710 // (no whitespace inside the tag)
711 Characters( implConvertAny( aIter->Value ) );
712 }
713 else
714 {
715 // the not-that-simple case, we need to iterate through the sequence elements
716 ::std::auto_ptr<IIterator> pSequenceIterator;
717 switch (aSimpleType.getTypeClass())
718 {
719 case TypeClass_STRING:
720 pSequenceIterator.reset( new OSequenceIterator< ::rtl::OUString >( aIter->Value ) );
721 break;
722 case TypeClass_DOUBLE:
723 pSequenceIterator.reset( new OSequenceIterator< double >( aIter->Value ) );
724 break;
725 case TypeClass_BOOLEAN:
726 pSequenceIterator.reset( new OSequenceIterator< sal_Bool >( aIter->Value ) );
727 break;
728 case TypeClass_BYTE:
729 pSequenceIterator.reset( new OSequenceIterator< sal_Int8 >( aIter->Value ) );
730 break;
731 case TypeClass_SHORT:
732 pSequenceIterator.reset( new OSequenceIterator< sal_Int16 >( aIter->Value ) );
733 break;
734 case TypeClass_LONG:
735 pSequenceIterator.reset( new OSequenceIterator< sal_Int32 >( aIter->Value ) );
736 break;
737 case TypeClass_ANY:
738 pSequenceIterator.reset( new OSequenceIterator< Any >( aIter->Value ) );
739 break;
740 default:
741 OSL_ENSURE(sal_False, "unsupported sequence type !");
742 break;
743 }
744 if ( pSequenceIterator.get() )
745 {
746 ::rtl::OUString sCurrent;
747 while (pSequenceIterator->hasMoreElements())
748 {
749 SvXMLElementExport aDataValue(*this,XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE, sal_True, sal_False);
750 // (no whitespace inside the tag)
751 Characters(implConvertAny(pSequenceIterator->nextElement()));
752 }
753 }
754 }
755 }
756 }
757 // -----------------------------------------------------------------------------
exportCharSet()758 void ODBExport::exportCharSet()
759 {
760 if ( m_sCharSet.getLength() )
761 {
762 AddAttribute(XML_NAMESPACE_DB, XML_ENCODING,m_sCharSet);
763
764 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_FONT_CHARSET, sal_True, sal_True);
765 }
766 }
767 // -----------------------------------------------------------------------------
exportDelimiter()768 void ODBExport::exportDelimiter()
769 {
770 if ( m_aDelimiter.get() && m_aDelimiter->bUsed )
771 {
772 AddAttribute(XML_NAMESPACE_DB, XML_FIELD,m_aDelimiter->sField);
773 AddAttribute(XML_NAMESPACE_DB, XML_STRING,m_aDelimiter->sText);
774 AddAttribute(XML_NAMESPACE_DB, XML_DECIMAL,m_aDelimiter->sDecimal);
775 AddAttribute(XML_NAMESPACE_DB, XML_THOUSAND,m_aDelimiter->sThousand);
776 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DELIMITER, sal_True, sal_True);
777 }
778 }
779 // -----------------------------------------------------------------------------
exportAutoIncrement()780 void ODBExport::exportAutoIncrement()
781 {
782 if ( m_aAutoIncrement.get() )
783 {
784 AddAttribute(XML_NAMESPACE_DB, XML_ADDITIONAL_COLUMN_STATEMENT,m_aAutoIncrement->second);
785 AddAttribute(XML_NAMESPACE_DB, XML_ROW_RETRIEVING_STATEMENT,m_aAutoIncrement->first);
786 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_AUTO_INCREMENT, sal_True, sal_True);
787 }
788 }
789 // -----------------------------------------------------------------------------
exportSequence(const Sequence<::rtl::OUString> & _aValue,::xmloff::token::XMLTokenEnum _eTokenFilter,::xmloff::token::XMLTokenEnum _eTokenType)790 void ODBExport::exportSequence(const Sequence< ::rtl::OUString>& _aValue
791 ,::xmloff::token::XMLTokenEnum _eTokenFilter
792 ,::xmloff::token::XMLTokenEnum _eTokenType)
793 {
794 Reference<XPropertySet> xProp(getDataSource());
795 Sequence< ::rtl::OUString> aValue;
796 if ( _aValue.getLength() )
797 {
798 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, _eTokenFilter, sal_True, sal_True);
799
800 const ::rtl::OUString* pIter = _aValue.getConstArray();
801 const ::rtl::OUString* pEnd = pIter + _aValue.getLength();
802 for(;pIter != pEnd;++pIter)
803 {
804 SvXMLElementExport aDataSource(*this,XML_NAMESPACE_DB, _eTokenType, sal_True, sal_False);
805 Characters(*pIter);
806 }
807 }
808 }
809 // -----------------------------------------------------------------------------
exportLogin()810 void ODBExport::exportLogin()
811 {
812 Reference<XPropertySet> xProp(getDataSource());
813 ::rtl::OUString sValue;
814 xProp->getPropertyValue(PROPERTY_USER) >>= sValue;
815 sal_Bool bAddLogin = sValue.getLength() > 0;
816 if ( bAddLogin )
817 AddAttribute(XML_NAMESPACE_DB, XML_USER_NAME,sValue);
818 sal_Bool bValue = sal_False;
819 if ( xProp->getPropertyValue(PROPERTY_ISPASSWORDREQUIRED) >>= bValue )
820 {
821 bAddLogin = sal_True;
822 AddAttribute(XML_NAMESPACE_DB, XML_IS_PASSWORD_REQUIRED,bValue ? XML_TRUE : XML_FALSE);
823 }
824 if ( bAddLogin )
825 SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_LOGIN, sal_True, sal_True);
826 }
827 // -----------------------------------------------------------------------------
exportCollection(const Reference<XNameAccess> & _xCollection,enum::xmloff::token::XMLTokenEnum _eComponents,enum::xmloff::token::XMLTokenEnum _eSubComponents,sal_Bool _bExportContext,const::comphelper::mem_fun1_t<ODBExport,XPropertySet * > & _aMemFunc)828 void ODBExport::exportCollection(const Reference< XNameAccess >& _xCollection
829 ,enum ::xmloff::token::XMLTokenEnum _eComponents
830 ,enum ::xmloff::token::XMLTokenEnum _eSubComponents
831 ,sal_Bool _bExportContext
832 ,const ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >& _aMemFunc
833 )
834 {
835 if ( _xCollection.is() )
836 {
837 ::std::auto_ptr<SvXMLElementExport> pComponents;
838 if ( _bExportContext )
839 pComponents.reset( new SvXMLElementExport(*this,XML_NAMESPACE_DB, _eComponents, sal_True, sal_True));
840 Sequence< ::rtl::OUString> aSeq = _xCollection->getElementNames();
841 const ::rtl::OUString* pIter = aSeq.getConstArray();
842 const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
843 for(;pIter != pEnd;++pIter)
844 {
845 Reference<XPropertySet> xProp(_xCollection->getByName(*pIter),UNO_QUERY);
846 if ( _bExportContext && XML_TABLE_REPRESENTATIONS != _eComponents )
847 AddAttribute(XML_NAMESPACE_DB, XML_NAME,*pIter);
848 Reference< XNameAccess > xSub(xProp,UNO_QUERY);
849 if ( xSub.is() )
850 {
851 exportCollection(xSub,_eSubComponents,_eSubComponents,_bExportContext,_aMemFunc);
852 }
853 else if ( xProp.is() )
854 _aMemFunc(this,xProp.get());
855 }
856 }
857 }
858 // -----------------------------------------------------------------------------
exportComponent(XPropertySet * _xProp)859 void ODBExport::exportComponent(XPropertySet* _xProp)
860 {
861 ::rtl::OUString sValue;
862 _xProp->getPropertyValue(PROPERTY_PERSISTENT_NAME) >>= sValue;
863 sal_Bool bIsForm = sal_True;
864 _xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsForm"))) >>= bIsForm;
865 if ( bIsForm )
866 sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("forms/")) + sValue;
867 else
868 sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("reports/")) + sValue;
869
870 AddAttribute(XML_NAMESPACE_XLINK, XML_HREF,sValue);
871 sal_Bool bAsTemplate = sal_False;
872 _xProp->getPropertyValue(PROPERTY_AS_TEMPLATE) >>= bAsTemplate;
873 AddAttribute(XML_NAMESPACE_DB, XML_AS_TEMPLATE,bAsTemplate ? XML_TRUE : XML_FALSE);
874 SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_COMPONENT, sal_True, sal_True);
875 }
876 // -----------------------------------------------------------------------------
exportQuery(XPropertySet * _xProp)877 void ODBExport::exportQuery(XPropertySet* _xProp)
878 {
879 AddAttribute(XML_NAMESPACE_DB, XML_COMMAND,getString(_xProp->getPropertyValue(PROPERTY_COMMAND)));
880
881 if ( getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYFILTER)) )
882 AddAttribute(XML_NAMESPACE_DB, XML_APPLY_FILTER,XML_TRUE);
883
884 if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_APPLYORDER)
885 && getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYORDER)) )
886 AddAttribute(XML_NAMESPACE_DB, XML_APPLY_ORDER,XML_TRUE);
887
888 if ( ! getBOOL(_xProp->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) )
889 AddAttribute(XML_NAMESPACE_DB, XML_ESCAPE_PROCESSING,XML_FALSE);
890
891 exportStyleName(_xProp,GetAttrList());
892
893 SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_QUERY, sal_True, sal_True);
894 Reference<XColumnsSupplier> xCol(_xProp,UNO_QUERY);
895 exportColumns(xCol);
896 exportFilter(_xProp,PROPERTY_FILTER,XML_FILTER_STATEMENT);
897 exportFilter(_xProp,PROPERTY_ORDER,XML_ORDER_STATEMENT);
898 exportTableName(_xProp,sal_True);
899 }
900 // -----------------------------------------------------------------------------
exportTable(XPropertySet * _xProp)901 void ODBExport::exportTable(XPropertySet* _xProp)
902 {
903 exportTableName(_xProp,sal_False);
904
905 if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_DESCRIPTION) )
906 AddAttribute(XML_NAMESPACE_DB, XML_DESCRIPTION,getString(_xProp->getPropertyValue(PROPERTY_DESCRIPTION)));
907
908 if ( getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYFILTER)) )
909 AddAttribute(XML_NAMESPACE_DB, XML_APPLY_FILTER,XML_TRUE);
910
911 if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_APPLYORDER)
912 && getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYORDER)) )
913 AddAttribute(XML_NAMESPACE_DB, XML_APPLY_ORDER,XML_TRUE);
914
915 exportStyleName(_xProp,GetAttrList());
916
917 SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_TABLE_REPRESENTATION, sal_True, sal_True);
918 Reference<XColumnsSupplier> xCol(_xProp,UNO_QUERY);
919 exportColumns(xCol);
920 exportFilter(_xProp,PROPERTY_FILTER,XML_FILTER_STATEMENT);
921 exportFilter(_xProp,PROPERTY_ORDER,XML_ORDER_STATEMENT);
922 }
923 // -----------------------------------------------------------------------------
exportStyleName(XPropertySet * _xProp,SvXMLAttributeList & _rAtt)924 void ODBExport::exportStyleName(XPropertySet* _xProp,SvXMLAttributeList& _rAtt)
925 {
926 Reference<XPropertySet> xFind(_xProp);
927 exportStyleName(XML_STYLE_NAME,xFind,_rAtt,m_aAutoStyleNames);
928 exportStyleName(XML_DEFAULT_CELL_STYLE_NAME,xFind,_rAtt,m_aCellAutoStyleNames);
929 exportStyleName(XML_DEFAULT_ROW_STYLE_NAME,xFind,_rAtt,m_aRowAutoStyleNames);
930 }
931 // -----------------------------------------------------------------------------
exportStyleName(const::xmloff::token::XMLTokenEnum _eToken,const uno::Reference<beans::XPropertySet> & _xProp,SvXMLAttributeList & _rAtt,TPropertyStyleMap & _rMap)932 void ODBExport::exportStyleName(const ::xmloff::token::XMLTokenEnum _eToken,const uno::Reference<beans::XPropertySet>& _xProp,SvXMLAttributeList& _rAtt,TPropertyStyleMap& _rMap)
933 {
934 TPropertyStyleMap::iterator aFind = _rMap.find(_xProp);
935 if ( aFind != _rMap.end() )
936 {
937 _rAtt.AddAttribute( GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DB, GetXMLToken(_eToken) ),
938 aFind->second );
939 _rMap.erase(aFind);
940 }
941 }
942 // -----------------------------------------------------------------------------
exportTableName(XPropertySet * _xProp,sal_Bool _bUpdate)943 void ODBExport::exportTableName(XPropertySet* _xProp,sal_Bool _bUpdate)
944 {
945 ::rtl::OUString sValue;
946 _xProp->getPropertyValue(_bUpdate ? PROPERTY_UPDATE_TABLENAME : PROPERTY_NAME) >>= sValue;
947 if ( sValue.getLength() )
948 {
949 AddAttribute(XML_NAMESPACE_DB, XML_NAME,sValue);
950 _xProp->getPropertyValue(_bUpdate ? PROPERTY_UPDATE_SCHEMANAME : PROPERTY_SCHEMANAME) >>= sValue;
951 if ( sValue.getLength() )
952 AddAttribute(XML_NAMESPACE_DB, XML_SCHEMA_NAME,sValue);
953 _xProp->getPropertyValue(_bUpdate ? PROPERTY_UPDATE_CATALOGNAME : PROPERTY_CATALOGNAME) >>= sValue;
954 if ( sValue.getLength() )
955 AddAttribute(XML_NAMESPACE_DB, XML_CATALOG_NAME,sValue);
956
957 if ( _bUpdate )
958 {
959 SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_UPDATE_TABLE, sal_True, sal_True);
960 }
961 }
962 }
963 // -----------------------------------------------------------------------------
exportFilter(XPropertySet * _xProp,const::rtl::OUString & _sProp,enum::xmloff::token::XMLTokenEnum _eStatementType)964 void ODBExport::exportFilter(XPropertySet* _xProp
965 ,const ::rtl::OUString& _sProp
966 ,enum ::xmloff::token::XMLTokenEnum _eStatementType)
967 {
968 OSL_PRECOND(!GetAttrList().getLength(),"Invalid attribute length!");
969 ::rtl::OUString sCommand;
970 _xProp->getPropertyValue(_sProp) >>= sCommand;
971 if ( sCommand.getLength() )
972 {
973 AddAttribute(XML_NAMESPACE_DB, XML_COMMAND,sCommand);
974 SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, _eStatementType, sal_True, sal_True);
975 }
976 OSL_POSTCOND(!GetAttrList().getLength(),"Invalid attribute length!");
977 }
978 // -----------------------------------------------------------------------------
exportColumns(const Reference<XColumnsSupplier> & _xColSup)979 void ODBExport::exportColumns(const Reference<XColumnsSupplier>& _xColSup)
980 {
981 OSL_PRECOND( _xColSup.is(), "ODBExport::exportColumns: invalid columns supplier!" );
982 if ( !_xColSup.is() )
983 return;
984
985 try
986 {
987 Reference<XNameAccess> xNameAccess( _xColSup->getColumns(), UNO_SET_THROW );
988 if ( !xNameAccess->hasElements() )
989 {
990 Reference< XPropertySet > xComponent(_xColSup,UNO_QUERY);
991 TTableColumnMap::iterator aFind = m_aTableDummyColumns.find(xComponent);
992 if ( aFind != m_aTableDummyColumns.end() )
993 {
994 SvXMLElementExport aColumns(*this,XML_NAMESPACE_DB, XML_COLUMNS, sal_True, sal_True);
995 SvXMLAttributeList* pAtt = new SvXMLAttributeList;
996 Reference<XAttributeList> xAtt = pAtt;
997 exportStyleName(aFind->second.get(),*pAtt);
998 AddAttributeList(xAtt);
999 SvXMLElementExport aColumn(*this,XML_NAMESPACE_DB, XML_COLUMN, sal_True, sal_True);
1000
1001 }
1002 return;
1003 }
1004
1005 SvXMLElementExport aColumns(*this,XML_NAMESPACE_DB, XML_COLUMNS, sal_True, sal_True);
1006 Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
1007 const ::rtl::OUString* pIter = aSeq.getConstArray();
1008 const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
1009 for( ; pIter != pEnd ; ++pIter)
1010 {
1011 Reference<XPropertySet> xProp(xNameAccess->getByName(*pIter),UNO_QUERY);
1012 if ( xProp.is() )
1013 {
1014 SvXMLAttributeList* pAtt = new SvXMLAttributeList;
1015 Reference<XAttributeList> xAtt = pAtt;
1016 exportStyleName(xProp.get(),*pAtt);
1017
1018 sal_Bool bHidden = getBOOL(xProp->getPropertyValue(PROPERTY_HIDDEN));
1019
1020 ::rtl::OUString sValue;
1021 xProp->getPropertyValue(PROPERTY_HELPTEXT) >>= sValue;
1022 Any aColumnDefault;
1023 aColumnDefault = xProp->getPropertyValue(PROPERTY_CONTROLDEFAULT);
1024
1025 if ( bHidden || sValue.getLength() || aColumnDefault.hasValue() || pAtt->getLength() )
1026 {
1027 AddAttribute(XML_NAMESPACE_DB, XML_NAME,*pIter);
1028 if ( bHidden )
1029 AddAttribute(XML_NAMESPACE_DB, XML_VISIBLE,XML_FALSE);
1030
1031 if ( sValue.getLength() )
1032 AddAttribute(XML_NAMESPACE_DB, XML_HELP_MESSAGE,sValue);
1033
1034 if ( aColumnDefault.hasValue() )
1035 {
1036 ::rtl::OUStringBuffer sColumnDefaultString,sType;
1037 SvXMLUnitConverter::convertAny( sColumnDefaultString, sType, aColumnDefault );
1038 AddAttribute(XML_NAMESPACE_DB, XML_TYPE_NAME,sType.makeStringAndClear());
1039 AddAttribute(XML_NAMESPACE_DB, XML_DEFAULT_VALUE,sColumnDefaultString.makeStringAndClear());
1040 }
1041
1042 if ( pAtt->getLength() )
1043 AddAttributeList(xAtt);
1044 }
1045
1046 if ( GetAttrList().getLength() )
1047 {
1048 SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_COLUMN, sal_True, sal_True);
1049 }
1050 }
1051 }
1052 }
1053 catch( const Exception& )
1054 {
1055 DBG_UNHANDLED_EXCEPTION();
1056 }
1057 }
1058 // -----------------------------------------------------------------------------
exportForms()1059 void ODBExport::exportForms()
1060 {
1061 Any aValue;
1062 ::rtl::OUString sService;
1063 dbtools::getDataSourceSetting(getDataSource(),"Forms",aValue);
1064 aValue >>= sService;
1065 if ( !sService.getLength() )
1066 {
1067 Reference<XFormDocumentsSupplier> xSup(GetModel(),UNO_QUERY);
1068 if ( xSup.is() )
1069 {
1070 Reference< XNameAccess > xCollection = xSup->getFormDocuments();
1071 if ( xCollection.is() && xCollection->hasElements() )
1072 {
1073 ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > aMemFunc(&ODBExport::exportComponent);
1074 exportCollection(xCollection,XML_FORMS,XML_COMPONENT_COLLECTION,sal_True,aMemFunc);
1075 }
1076 }
1077 }
1078 }
1079 // -----------------------------------------------------------------------------
exportReports()1080 void ODBExport::exportReports()
1081 {
1082 Any aValue;
1083 ::rtl::OUString sService;
1084 dbtools::getDataSourceSetting(getDataSource(),"Reports",aValue);
1085 aValue >>= sService;
1086 if ( !sService.getLength() )
1087 {
1088 Reference<XReportDocumentsSupplier> xSup(GetModel(),UNO_QUERY);
1089 if ( xSup.is() )
1090 {
1091 Reference< XNameAccess > xCollection = xSup->getReportDocuments();
1092 if ( xCollection.is() && xCollection->hasElements() )
1093 {
1094 ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > aMemFunc(&ODBExport::exportComponent);
1095 exportCollection(xCollection,XML_REPORTS,XML_COMPONENT_COLLECTION,sal_True,aMemFunc);
1096 }
1097 }
1098 }
1099 }
1100 // -----------------------------------------------------------------------------
exportQueries(sal_Bool _bExportContext)1101 void ODBExport::exportQueries(sal_Bool _bExportContext)
1102 {
1103 Any aValue;
1104 ::rtl::OUString sService;
1105 dbtools::getDataSourceSetting(getDataSource(),"CommandDefinitions",aValue);
1106 aValue >>= sService;
1107 if ( !sService.getLength() )
1108 {
1109 Reference<XQueryDefinitionsSupplier> xSup(getDataSource(),UNO_QUERY);
1110 if ( xSup.is() )
1111 {
1112 Reference< XNameAccess > xCollection = xSup->getQueryDefinitions();
1113 if ( xCollection.is() && xCollection->hasElements() )
1114 {
1115 ::std::auto_ptr< ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > > pMemFunc;
1116 if ( _bExportContext )
1117 pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportQuery) );
1118 else
1119 pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportAutoStyle) );
1120
1121 exportCollection(xCollection,XML_QUERIES,XML_QUERY_COLLECTION,_bExportContext,*pMemFunc);
1122 }
1123 }
1124 }
1125 }
1126 // -----------------------------------------------------------------------------
exportTables(sal_Bool _bExportContext)1127 void ODBExport::exportTables(sal_Bool _bExportContext)
1128 {
1129 Reference<XTablesSupplier> xSup(getDataSource(),UNO_QUERY);
1130 if ( xSup.is() )
1131 {
1132 Reference< XNameAccess > xCollection = xSup->getTables();
1133 if ( xCollection.is() && xCollection->hasElements() )
1134 {
1135 ::std::auto_ptr< ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > > pMemFunc;
1136 if ( _bExportContext )
1137 pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportTable) );
1138 else
1139 pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportAutoStyle) );
1140 exportCollection(xCollection,XML_TABLE_REPRESENTATIONS,XML_TOKEN_INVALID,_bExportContext,*pMemFunc);
1141 }
1142 }
1143 }
1144 // -----------------------------------------------------------------------------
exportAutoStyle(XPropertySet * _xProp)1145 void ODBExport::exportAutoStyle(XPropertySet* _xProp)
1146 {
1147 typedef ::std::pair<TPropertyStyleMap*,sal_uInt16> TEnumMapperPair;
1148 typedef ::std::pair< UniReference < SvXMLExportPropertyMapper> , TEnumMapperPair> TExportPropMapperPair;
1149 Reference<XColumnsSupplier> xSup(_xProp,UNO_QUERY);
1150 if ( xSup.is() )
1151 {
1152 const TExportPropMapperPair pExportHelper[] = {
1153 TExportPropMapperPair(m_xExportHelper,TEnumMapperPair(&m_aAutoStyleNames,XML_STYLE_FAMILY_TABLE_TABLE ))
1154 // ,TExportPropMapperPair(m_xCellExportHelper,TEnumMapperPair(&m_aCellAutoStyleNames,XML_STYLE_FAMILY_TABLE_CELL))
1155 ,TExportPropMapperPair(m_xRowExportHelper,TEnumMapperPair(&m_aRowAutoStyleNames,XML_STYLE_FAMILY_TABLE_ROW))
1156 };
1157
1158 ::std::vector< XMLPropertyState > aPropertyStates;
1159 for (size_t i = 0 ; i < sizeof(pExportHelper)/sizeof(pExportHelper[0]); ++i)
1160 {
1161 aPropertyStates = pExportHelper[i].first->Filter(_xProp);
1162 if ( !aPropertyStates.empty() )
1163 pExportHelper[i].second.first->insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( pExportHelper[i].second.second, aPropertyStates )));
1164 }
1165
1166 Reference< XNameAccess > xCollection;
1167 try
1168 {
1169 xCollection.set( xSup->getColumns(), UNO_SET_THROW );
1170 awt::FontDescriptor aFont;
1171 _xProp->getPropertyValue(PROPERTY_FONT) >>= aFont;
1172 GetFontAutoStylePool()->Add(aFont.Name,aFont.StyleName,aFont.Family,aFont.Pitch,aFont.CharSet );
1173
1174 m_aCurrentPropertyStates = m_xCellExportHelper->Filter(_xProp);
1175 if ( !m_aCurrentPropertyStates.empty() && !xCollection->hasElements() )
1176 {
1177 Reference< XDataDescriptorFactory> xFac(xCollection,UNO_QUERY);
1178 if ( xFac.is() )
1179 {
1180 Reference< XPropertySet> xColumn = xFac->createDataDescriptor();
1181 m_aTableDummyColumns.insert(TTableColumnMap::value_type(Reference< XPropertySet>(_xProp),xColumn));
1182 exportAutoStyle(xColumn.get());
1183 }
1184 }
1185 else
1186 {
1187 ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > aMemFunc(&ODBExport::exportAutoStyle);
1188 exportCollection(xCollection,XML_TOKEN_INVALID,XML_TOKEN_INVALID,sal_False,aMemFunc);
1189 }
1190 }
1191 catch(Exception&)
1192 {
1193 DBG_UNHANDLED_EXCEPTION();
1194 }
1195 m_aCurrentPropertyStates.clear();
1196 }
1197 else
1198 { // here I know I have a column
1199 TExportPropMapperPair pExportHelper[] = {
1200 TExportPropMapperPair(m_xColumnExportHelper,TEnumMapperPair(&m_aAutoStyleNames,XML_STYLE_FAMILY_TABLE_COLUMN ))
1201 ,TExportPropMapperPair(m_xCellExportHelper,TEnumMapperPair(&m_aCellAutoStyleNames,XML_STYLE_FAMILY_TABLE_CELL))
1202 };
1203 for (size_t i = 0 ; i < sizeof(pExportHelper)/sizeof(pExportHelper[0]); ++i)
1204 {
1205 ::std::vector< XMLPropertyState > aPropStates = pExportHelper[i].first->Filter( _xProp );
1206 if ( !aPropStates.empty() )
1207 {
1208 ::std::vector< XMLPropertyState >::iterator aItr = aPropStates.begin();
1209 ::std::vector< XMLPropertyState >::iterator aEnd = aPropStates.end();
1210 const UniReference < XMLPropertySetMapper >& pStyle = pExportHelper[i].first->getPropertySetMapper();
1211 while ( aItr != aEnd )
1212 {
1213 if ( aItr->mnIndex != -1 )
1214 {
1215 switch ( pStyle->GetEntryContextId(aItr->mnIndex) )
1216 {
1217 case CTF_DB_NUMBERFORMAT:
1218 {
1219 sal_Int32 nNumberFormat = -1;
1220 if ( aItr->maValue >>= nNumberFormat )
1221 addDataStyle(nNumberFormat);
1222 }
1223 break;
1224 case CTF_DB_COLUMN_TEXT_ALIGN:
1225 if ( !aItr->maValue.hasValue() )
1226 aItr->maValue <<= ::com::sun::star::awt::TextAlign::LEFT;
1227 break;
1228 }
1229 }
1230 ++aItr;
1231 } // while ( aItr != aEnd )
1232
1233 } // if ( !aPropStates.empty() )
1234 if ( XML_STYLE_FAMILY_TABLE_CELL == pExportHelper[i].second.second )
1235 ::std::copy( m_aCurrentPropertyStates.begin(), m_aCurrentPropertyStates.end(), ::std::back_inserter( aPropStates ));
1236 if ( !aPropStates.empty() )
1237 pExportHelper[i].second.first->insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( pExportHelper[i].second.second, aPropStates )));
1238 }
1239 }
1240 }
1241 // -----------------------------------------------------------------------------
_ExportContent()1242 void ODBExport::_ExportContent()
1243 {
1244 exportDataSource();
1245 exportForms();
1246 exportReports();
1247 exportQueries(sal_True);
1248 exportTables(sal_True);
1249 }
1250 // -----------------------------------------------------------------------------
_ExportMasterStyles()1251 void ODBExport::_ExportMasterStyles()
1252 {
1253 GetPageExport()->exportMasterStyles( sal_True );
1254 }
1255 // -----------------------------------------------------------------------------
_ExportAutoStyles()1256 void ODBExport::_ExportAutoStyles()
1257 {
1258 // there are no styles that require their own autostyles
1259 if ( getExportFlags() & EXPORT_CONTENT )
1260 {
1261 collectComponentStyles();
1262 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_TABLE
1263 ,GetDocHandler()
1264 ,GetMM100UnitConverter()
1265 ,GetNamespaceMap()
1266 );
1267 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_COLUMN
1268 ,GetDocHandler()
1269 ,GetMM100UnitConverter()
1270 ,GetNamespaceMap()
1271 );
1272 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_CELL
1273 ,GetDocHandler()
1274 ,GetMM100UnitConverter()
1275 ,GetNamespaceMap()
1276 );
1277 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_ROW
1278 ,GetDocHandler()
1279 ,GetMM100UnitConverter()
1280 ,GetNamespaceMap()
1281 );
1282 exportDataStyles();
1283 }
1284 }
1285 // -----------------------------------------------------------------------------
_ExportStyles(sal_Bool bUsed)1286 void ODBExport::_ExportStyles(sal_Bool bUsed)
1287 {
1288 SvXMLExport::_ExportStyles(bUsed);
1289 }
1290 // -----------------------------------------------------------------------------
exportDoc(enum::xmloff::token::XMLTokenEnum eClass)1291 sal_uInt32 ODBExport::exportDoc(enum ::xmloff::token::XMLTokenEnum eClass)
1292 {
1293 return SvXMLExport::exportDoc( eClass );
1294 }
1295 // -----------------------------------------------------------------------------
GetViewSettings(Sequence<PropertyValue> & aProps)1296 void ODBExport::GetViewSettings(Sequence<PropertyValue>& aProps)
1297 {
1298 Reference<XQueryDefinitionsSupplier> xSup(getDataSource(),UNO_QUERY);
1299 if ( xSup.is() )
1300 {
1301 Reference< XNameAccess > xCollection = xSup->getQueryDefinitions();
1302 if ( xCollection.is() && xCollection->hasElements() )
1303 {
1304 try
1305 {
1306 sal_Int32 nLength = aProps.getLength();
1307 aProps.realloc(nLength + 1);
1308 aProps[nLength].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Queries"));
1309 Sequence< ::rtl::OUString> aSeq = xCollection->getElementNames();
1310 const ::rtl::OUString* pIter = aSeq.getConstArray();
1311 const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
1312
1313 Sequence<PropertyValue> aQueries(aSeq.getLength());
1314 for(sal_Int32 i = 0;pIter != pEnd;++pIter,++i)
1315 {
1316 Reference<XPropertySet> xProp(xCollection->getByName(*pIter),UNO_QUERY);
1317 if ( xProp.is() )
1318 {
1319 aQueries[i].Name = *pIter;
1320 aQueries[i].Value = xProp->getPropertyValue(PROPERTY_LAYOUTINFORMATION);
1321 }
1322 }
1323 aProps[nLength].Value <<= aQueries;
1324 }
1325 catch(Exception)
1326 {
1327 OSL_ENSURE(0,"ODBExport::GetViewSettings: Exception catched!");
1328 }
1329 }
1330 }
1331
1332 }
1333 // -----------------------------------------------------------------------------
GetConfigurationSettings(Sequence<PropertyValue> & aProps)1334 void ODBExport::GetConfigurationSettings(Sequence<PropertyValue>& aProps)
1335 {
1336 Reference<XPropertySet> xProp(getDataSource());
1337 if ( xProp.is() )
1338 {
1339 sal_Int32 nLength = aProps.getLength();
1340 try
1341 {
1342 Any aValue = xProp->getPropertyValue(PROPERTY_LAYOUTINFORMATION);
1343 Sequence< PropertyValue > aPropValues;
1344 aValue >>= aPropValues;
1345 if ( aPropValues.getLength() )
1346 {
1347 aProps.realloc(nLength + 1);
1348 aProps[nLength].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("layout-settings"));
1349 aProps[nLength].Value = aValue;
1350 }
1351 }
1352 catch(Exception)
1353 {
1354 OSL_ENSURE(0,"Could not access layout information from the data source!");
1355 }
1356 }
1357 }
1358 // -----------------------------------------------------------------------------
implConvertAny(const Any & _rValue)1359 ::rtl::OUString ODBExport::implConvertAny(const Any& _rValue)
1360 {
1361 ::rtl::OUStringBuffer aBuffer;
1362 switch (_rValue.getValueTypeClass())
1363 {
1364 case TypeClass_STRING:
1365 { // extract the string
1366 ::rtl::OUString sCurrentValue;
1367 _rValue >>= sCurrentValue;
1368 aBuffer.append(sCurrentValue);
1369 }
1370 break;
1371 case TypeClass_DOUBLE:
1372 // let the unit converter format is as string
1373 GetMM100UnitConverter().convertDouble(aBuffer, getDouble(_rValue));
1374 break;
1375 case TypeClass_BOOLEAN:
1376 aBuffer = getBOOL(_rValue) ? ::xmloff::token::GetXMLToken(XML_TRUE) : ::xmloff::token::GetXMLToken(XML_FALSE);
1377 break;
1378 case TypeClass_BYTE:
1379 case TypeClass_SHORT:
1380 case TypeClass_LONG:
1381 // let the unit converter format is as string
1382 GetMM100UnitConverter().convertNumber(aBuffer, getINT32(_rValue));
1383 break;
1384 default:
1385 OSL_ENSURE(0,"ODBExport::implConvertAny: Invalid type");
1386 }
1387
1388 return aBuffer.makeStringAndClear();
1389 }
1390 // -----------------------------------------------------------------------------
GetTableStylesPropertySetMapper() const1391 UniReference < XMLPropertySetMapper > ODBExport::GetTableStylesPropertySetMapper() const
1392 {
1393 if ( !m_xTableStylesPropertySetMapper.is() )
1394 {
1395 m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper();
1396 }
1397 return m_xTableStylesPropertySetMapper;
1398 }
1399 // -----------------------------------------------------------------------------
GetCellStylesPropertySetMapper() const1400 UniReference < XMLPropertySetMapper > ODBExport::GetCellStylesPropertySetMapper() const
1401 {
1402 if ( !m_xCellStylesPropertySetMapper.is() )
1403 {
1404 m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper();
1405 }
1406 return m_xCellStylesPropertySetMapper;
1407 }
1408 // -----------------------------------------------------------------------------
GetColumnStylesPropertySetMapper() const1409 UniReference < XMLPropertySetMapper > ODBExport::GetColumnStylesPropertySetMapper() const
1410 {
1411 if ( !m_xColumnStylesPropertySetMapper.is() )
1412 {
1413 m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper();
1414 }
1415 return m_xColumnStylesPropertySetMapper;
1416 }
1417 // -----------------------------------------------------------------------------
CreateAutoStylePool()1418 SvXMLAutoStylePoolP* ODBExport::CreateAutoStylePool()
1419 {
1420 return new OXMLAutoStylePoolP(*this);
1421 }
1422 // -----------------------------------------------------------------------------
setSourceDocument(const Reference<XComponent> & xDoc)1423 void SAL_CALL ODBExport::setSourceDocument( const Reference< XComponent >& xDoc ) throw(IllegalArgumentException, RuntimeException)
1424 {
1425 Reference<XOfficeDatabaseDocument> xOfficeDoc(xDoc,UNO_QUERY_THROW);
1426 m_xDataSource.set(xOfficeDoc->getDataSource(),UNO_QUERY_THROW);
1427 OSL_ENSURE(m_xDataSource.is(),"DataSource is NULL!");
1428 Reference< XNumberFormatsSupplier > xNum(m_xDataSource->getPropertyValue(PROPERTY_NUMBERFORMATSSUPPLIER),UNO_QUERY);
1429 SetNumberFormatsSupplier(xNum);
1430 SvXMLExport::setSourceDocument(xDoc);
1431 }
1432 // -----------------------------------------------------------------------------
_ExportFontDecls()1433 void ODBExport::_ExportFontDecls()
1434 {
1435 GetFontAutoStylePool(); // make sure the pool is created
1436 collectComponentStyles();
1437 SvXMLExport::_ExportFontDecls();
1438 }
1439 // -----------------------------------------------------------------------------
collectComponentStyles()1440 void ODBExport::collectComponentStyles()
1441 {
1442 if ( m_bAllreadyFilled )
1443 return;
1444
1445 m_bAllreadyFilled = sal_True;
1446 exportQueries(sal_False);
1447 exportTables(sal_False);
1448 }
1449 // -----------------------------------------------------------------------------
1450 }// dbaxml
1451 // -----------------------------------------------------------------------------
1452