blob: 94a54b7782c611c02546074ed983de50fcd4495e [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbaccess.hxx"
#include "xmlExport.hxx"
#include "xmlAutoStyle.hxx"
#include "flt_reghelper.hxx"
#include <xmloff/ProgressBarHelper.hxx>
#include <xmloff/xmltoken.hxx>
#include <xmloff/txtimp.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/xmluconv.hxx>
#include <xmloff/nmspmap.hxx>
#include <comphelper/types.hxx>
#include "xmlstrings.hrc"
#include "xmlEnums.hxx"
#include <xmloff/nmspmap.hxx>
#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/sdb/XFormDocumentsSupplier.hpp>
#include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
#include <com/sun/star/sdb/XReportDocumentsSupplier.hpp>
#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
#include <com/sun/star/awt/TextAlign.hpp>
#include <xmloff/xmluconv.hxx>
#include "xmlHelper.hxx"
#include <com/sun/star/awt/FontDescriptor.hpp>
#include <svl/filenotation.hxx>
#include <unotools/pathoptions.hxx>
#include <tools/diagnose_ex.h>
#include <connectivity/DriversConfig.hxx>
#include <connectivity/dbtools.hxx>
#include <boost/optional.hpp>
namespace dbaxml
{
using namespace comphelper;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star;
class ODBExportHelper
{
public:
static ::rtl::OUString SAL_CALL getImplementationName_Static( ) throw (RuntimeException);
static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_Static( ) throw(RuntimeException);
static Reference< XInterface > SAL_CALL Create(const Reference< ::com::sun::star::lang::XMultiServiceFactory >&);
};
class ODBFullExportHelper
{
public:
static ::rtl::OUString SAL_CALL getImplementationName_Static( ) throw (RuntimeException);
static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_Static( ) throw(RuntimeException);
static Reference< XInterface > SAL_CALL Create(const Reference< ::com::sun::star::lang::XMultiServiceFactory >&);
};
}
// -----------------------------------------------------------------------------
extern "C" void SAL_CALL createRegistryInfo_ODBFilterExport( )
{
static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBExport > aAutoRegistration;
}
//--------------------------------------------------------------------------
extern "C" void SAL_CALL createRegistryInfo_OSettingsExport( )
{
static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBExportHelper > aAutoRegistration;
}
//--------------------------------------------------------------------------
extern "C" void SAL_CALL createRegistryInfo_OFullExport( )
{
static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBFullExportHelper > aAutoRegistration;
}
//--------------------------------------------------------------------------
namespace dbaxml
{
using namespace comphelper;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::util;
//---------------------------------------------------------------------
Reference< XInterface > SAL_CALL ODBExportHelper::Create(const Reference< XMultiServiceFactory >& _rxORB)
{
return static_cast< XServiceInfo* >(new ODBExport(_rxORB,EXPORT_SETTINGS | EXPORT_PRETTY ));
}
//---------------------------------------------------------------------
::rtl::OUString SAL_CALL ODBExportHelper::getImplementationName_Static( ) throw (RuntimeException)
{
return ::rtl::OUString::createFromAscii("com.sun.star.comp.sdb.XMLSettingsExporter");
}
//---------------------------------------------------------------------
Sequence< ::rtl::OUString > SAL_CALL ODBExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
{
Sequence< ::rtl::OUString > aSupported(1);
aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
return aSupported;
}
//---------------------------------------------------------------------
Reference< XInterface > SAL_CALL ODBFullExportHelper::Create(const Reference< XMultiServiceFactory >& _rxORB)
{
return static_cast< XServiceInfo* >(new ODBExport(_rxORB,EXPORT_ALL));
}
//---------------------------------------------------------------------
::rtl::OUString SAL_CALL ODBFullExportHelper::getImplementationName_Static( ) throw (RuntimeException)
{
return ::rtl::OUString::createFromAscii("com.sun.star.comp.sdb.XMLFullExporter");
}
//---------------------------------------------------------------------
Sequence< ::rtl::OUString > SAL_CALL ODBFullExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
{
Sequence< ::rtl::OUString > aSupported(1);
aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
return aSupported;
}
//---------------------------------------------------------------------
::rtl::OUString lcl_implGetPropertyXMLType(const Type& _rType)
{
// possible types we can write (either because we recognize them directly or because we convert _rValue
// into one of these types)
static const ::rtl::OUString s_sTypeBoolean (RTL_CONSTASCII_USTRINGPARAM("boolean"));
static const ::rtl::OUString s_sTypeShort (RTL_CONSTASCII_USTRINGPARAM("short"));
static const ::rtl::OUString s_sTypeInteger (RTL_CONSTASCII_USTRINGPARAM("int"));
static const ::rtl::OUString s_sTypeLong (RTL_CONSTASCII_USTRINGPARAM("long"));
static const ::rtl::OUString s_sTypeDouble (RTL_CONSTASCII_USTRINGPARAM("double"));
static const ::rtl::OUString s_sTypeString (RTL_CONSTASCII_USTRINGPARAM("string"));
// handle the type description
switch (_rType.getTypeClass())
{
case TypeClass_STRING:
return s_sTypeString;
case TypeClass_DOUBLE:
return s_sTypeDouble;
case TypeClass_BOOLEAN:
return s_sTypeBoolean;
case TypeClass_BYTE:
case TypeClass_SHORT:
return s_sTypeShort;
case TypeClass_LONG:
return s_sTypeInteger;
case TypeClass_HYPER:
return s_sTypeLong;
case TypeClass_ENUM:
return s_sTypeInteger;
default:
OSL_ENSURE( false, "lcl_implGetPropertyXMLType: unsupported value type!" );
return s_sTypeDouble;
}
}
class OSpecialHanldeXMLExportPropertyMapper : public SvXMLExportPropertyMapper
{
public:
OSpecialHanldeXMLExportPropertyMapper(const UniReference< XMLPropertySetMapper >& rMapper) : SvXMLExportPropertyMapper(rMapper )
{
}
/** this method is called for every item that has the
MID_FLAG_SPECIAL_ITEM_EXPORT flag set */
virtual void handleSpecialItem(
SvXMLAttributeList& /*rAttrList*/,
const XMLPropertyState& /*rProperty*/,
const SvXMLUnitConverter& /*rUnitConverter*/,
const SvXMLNamespaceMap& /*rNamespaceMap*/,
const ::std::vector< XMLPropertyState > * /*pProperties*/ ,
sal_uInt32 /*nIdx*/ ) const
{
// nothing to do here
}
};
// -----------------------------------------------------------------------------
ODBExport::ODBExport(const Reference< XMultiServiceFactory >& _rxMSF,sal_uInt16 nExportFlag)
: SvXMLExport( _rxMSF,MAP_10TH_MM,XML_DATABASE, EXPORT_OASIS | nExportFlag)
,m_aTypeCollection(_rxMSF)
,m_bAllreadyFilled(sal_False)
{
GetMM100UnitConverter().setCoreMeasureUnit(MAP_10TH_MM);
GetMM100UnitConverter().setXMLMeasureUnit(MAP_CM);
_GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE );
_GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
_GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG), XML_NAMESPACE_SVG );
_GetNamespaceMap().Add( GetXMLToken(XML_NP_DB), GetXMLToken(XML_N_DB_OASIS), XML_NAMESPACE_DB );
if( (nExportFlag & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS) ) != 0 )
_GetNamespaceMap().Add( GetXMLToken(XML_NP_FO), GetXMLToken(XML_N_FO_COMPAT), XML_NAMESPACE_FO );
if( (nExportFlag & (EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS) ) != 0 )
{
_GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
}
if( (nExportFlag & EXPORT_SETTINGS) != 0 )
{
_GetNamespaceMap().Add( GetXMLToken(XML_NP_CONFIG), GetXMLToken(XML_N_CONFIG), XML_NAMESPACE_CONFIG );
}
if( (nExportFlag & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS) ) != 0 )
{
_GetNamespaceMap().Add( GetXMLToken(XML_NP_STYLE), GetXMLToken(XML_N_STYLE), XML_NAMESPACE_STYLE );
}
_GetNamespaceMap().Add( GetXMLToken(XML_NP_TABLE), GetXMLToken(XML_N_TABLE), XML_NAMESPACE_TABLE );
_GetNamespaceMap().Add( GetXMLToken(XML_NP_NUMBER), GetXMLToken(XML_N_NUMBER), XML_NAMESPACE_NUMBER );
m_xExportHelper = new SvXMLExportPropertyMapper(GetTableStylesPropertySetMapper());
m_xColumnExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetColumnStylesPropertySetMapper());
//UniReference < XMLPropertySetMapper > xCellStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetCellStylesPropertySetMapper(),m_xPropHdlFactory);
//m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(xCellStylesPropertySetMapper);
//m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetCellStylesPropertySetMapper());
//m_xCellExportHelper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this));
m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetCellStylesPropertySetMapper());
m_xRowExportHelper = new OSpecialHanldeXMLExportPropertyMapper(OXMLHelper::GetRowStylesPropertySetMapper());
GetAutoStylePool()->AddFamily(
XML_STYLE_FAMILY_TABLE_TABLE,
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_TABLE_STYLES_NAME ),
m_xExportHelper.get(),
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_TABLE_STYLES_PREFIX ));
GetAutoStylePool()->AddFamily(
XML_STYLE_FAMILY_TABLE_COLUMN,
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_NAME ),
m_xColumnExportHelper.get(),
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX ));
GetAutoStylePool()->AddFamily(
XML_STYLE_FAMILY_TABLE_CELL,
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME ),
m_xCellExportHelper.get(),
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX ));
GetAutoStylePool()->AddFamily(
XML_STYLE_FAMILY_TABLE_ROW,
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_ROW_STYLES_NAME ),
m_xRowExportHelper.get(),
rtl::OUString::createFromAscii( XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX ));
}
// -----------------------------------------------------------------------------
IMPLEMENT_SERVICE_INFO1_STATIC( ODBExport, "com.sun.star.comp.sdb.DBExportFilter", "com.sun.star.document.ExportFilter")
// -----------------------------------------------------------------------------
void ODBExport::exportDataSource()
{
try
{
Reference<XPropertySet> xProp( getDataSource(), UNO_SET_THROW );
sal_Bool bAutoIncrementEnabled = sal_True;
TStringPair aAutoIncrement;
Reference< XPropertySet > xDataSourceSettings;
OSL_VERIFY( xProp->getPropertyValue( PROPERTY_SETTINGS ) >>= xDataSourceSettings );
Reference< XPropertyState > xSettingsState( xDataSourceSettings, UNO_QUERY_THROW );
Reference< XPropertySetInfo > xSettingsInfo( xDataSourceSettings->getPropertySetInfo(), UNO_SET_THROW );
TDelimiter aDelimiter;
xSettingsState->getPropertyDefault( INFO_TEXTDELIMITER ) >>= aDelimiter.sText;
xSettingsState->getPropertyDefault( INFO_FIELDDELIMITER ) >>= aDelimiter.sField;
xSettingsState->getPropertyDefault( INFO_DECIMALDELIMITER ) >>= aDelimiter.sDecimal;
xSettingsState->getPropertyDefault( INFO_THOUSANDSDELIMITER ) >>= aDelimiter.sThousand;
::connectivity::DriversConfig aDriverConfig(getServiceFactory());
const ::rtl::OUString sURL = ::comphelper::getString(xProp->getPropertyValue(PROPERTY_URL));
::comphelper::NamedValueCollection aDriverSupportedProperties( aDriverConfig.getProperties( sURL ) );
static ::rtl::OUString s_sTrue(::xmloff::token::GetXMLToken( XML_TRUE ));
static ::rtl::OUString s_sFalse(::xmloff::token::GetXMLToken( XML_FALSE ));
// loop through the properties, and export only those which are not defaulted
TSettingsMap aSettingsMap;
Sequence< Property > aProperties = xSettingsInfo->getProperties();
const Property* pProperties = aProperties.getConstArray();
const Property* pPropertiesEnd = pProperties + aProperties.getLength();
for ( ; pProperties != pPropertiesEnd; ++pProperties )
{
::rtl::OUString sValue;
Any aValue = xDataSourceSettings->getPropertyValue( pProperties->Name );
switch ( aValue.getValueTypeClass() )
{
case TypeClass_STRING:
aValue >>= sValue;
break;
case TypeClass_DOUBLE:
// let the unit converter format is as string
sValue = ::rtl::OUString::valueOf( getDouble( aValue ) );
break;
case TypeClass_BOOLEAN:
sValue = ::xmloff::token::GetXMLToken( getBOOL( aValue ) ? XML_TRUE : XML_FALSE );
break;
case TypeClass_BYTE:
case TypeClass_SHORT:
case TypeClass_LONG:
// let the unit converter format is as string
sValue = ::rtl::OUString::valueOf( getINT32( aValue ) );
break;
default:
break;
}
::xmloff::token::XMLTokenEnum eToken = XML_TOKEN_INVALID;
struct PropertyMap
{
const ::rtl::OUString sPropertyName;
const XMLTokenEnum eAttributeToken;
const ::boost::optional< ::rtl::OUString > aXMLDefault;
PropertyMap( const ::rtl::OUString& _rPropertyName, const XMLTokenEnum _eToken )
:sPropertyName( _rPropertyName )
,eAttributeToken( _eToken )
,aXMLDefault()
{
}
PropertyMap( const ::rtl::OUString& _rPropertyName, const XMLTokenEnum _eToken, const ::rtl::OUString& _rDefault )
:sPropertyName( _rPropertyName )
,eAttributeToken( _eToken )
,aXMLDefault( _rDefault )
{
}
};
PropertyMap aTokens[] =
{
PropertyMap( INFO_TEXTFILEHEADER, XML_IS_FIRST_ROW_HEADER_LINE, s_sTrue ),
PropertyMap( INFO_SHOWDELETEDROWS, XML_SHOW_DELETED, s_sFalse ),
PropertyMap( INFO_ALLOWLONGTABLENAMES, XML_IS_TABLE_NAME_LENGTH_LIMITED, s_sTrue ),
PropertyMap( INFO_ADDITIONALOPTIONS, XML_SYSTEM_DRIVER_SETTINGS ),
PropertyMap( PROPERTY_ENABLESQL92CHECK, XML_ENABLE_SQL92_CHECK, s_sFalse ),
PropertyMap( INFO_APPEND_TABLE_ALIAS, XML_APPEND_TABLE_ALIAS_NAME, s_sTrue ),
PropertyMap( INFO_PARAMETERNAMESUBST, XML_PARAMETER_NAME_SUBSTITUTION, s_sTrue ),
PropertyMap( INFO_IGNOREDRIVER_PRIV, XML_IGNORE_DRIVER_PRIVILEGES, s_sTrue ),
PropertyMap( INFO_USECATALOG, XML_USE_CATALOG, s_sFalse ),
PropertyMap( PROPERTY_SUPPRESSVERSIONCL,XML_SUPPRESS_VERSION_COLUMNS, s_sTrue ),
PropertyMap( INFO_CONN_LDAP_BASEDN, XML_BASE_DN ),
PropertyMap( INFO_CONN_LDAP_ROWCOUNT, XML_MAX_ROW_COUNT )
};
bool bIsXMLDefault = false;
for ( size_t i=0; i < sizeof( aTokens ) / sizeof( aTokens[0] ); ++i )
{
if ( pProperties->Name == aTokens[i].sPropertyName )
{
eToken = aTokens[i].eAttributeToken;
if ( !!aTokens[i].aXMLDefault
&& ( sValue == *aTokens[i].aXMLDefault )
)
{
bIsXMLDefault = true;
}
break;
}
}
if ( bIsXMLDefault )
// the property has the value which is specified as default in the XML schema -> no need to write it
continue;
if ( eToken == XML_TOKEN_INVALID )
{
// for properties which are not REMOVEABLE, we care for their state, and
// only export them if they're not DEFAULTed
if ( ( pProperties->Attributes & PropertyAttribute::REMOVEABLE ) == 0 )
{
PropertyState ePropertyState = xSettingsState->getPropertyState( pProperties->Name );
if ( PropertyState_DEFAULT_VALUE == ePropertyState )
continue;
}
// special handlings
if ( pProperties->Name == PROPERTY_BOOLEANCOMPARISONMODE )
{
sal_Int32 nValue = 0;
aValue >>= nValue;
if ( sValue.equalsAscii("0") )
sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("equal-integer"));
else if ( sValue.equalsAscii("1") )
sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("is-boolean"));
else if ( sValue.equalsAscii("2") )
sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("equal-boolean"));
else if ( sValue.equalsAscii("3") )
sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("equal-use-only-zero"));
if ( sValue.equalsAscii("equal-integer") )
continue;
eToken = XML_BOOLEAN_COMPARISON_MODE;
}
else if ( pProperties->Name == INFO_AUTORETRIEVEENABLED )
{
aValue >>= bAutoIncrementEnabled;
continue;
}
else if ( pProperties->Name == INFO_AUTORETRIEVEVALUE )
{
aAutoIncrement.first = sValue;
continue;
}
else if ( pProperties->Name == PROPERTY_AUTOINCREMENTCREATION )
{
aAutoIncrement.second = sValue;
continue;
}
else if ( pProperties->Name == INFO_TEXTDELIMITER )
{
aDelimiter.sText = sValue;
aDelimiter.bUsed = true;
continue;
}
else if ( pProperties->Name == INFO_FIELDDELIMITER )
{
aDelimiter.sField = sValue;
aDelimiter.bUsed = true;
continue;
}
else if ( pProperties->Name == INFO_DECIMALDELIMITER )
{
aDelimiter.sDecimal = sValue;
aDelimiter.bUsed = true;
continue;
}
else if ( pProperties->Name == INFO_THOUSANDSDELIMITER )
{
aDelimiter.sThousand = sValue;
aDelimiter.bUsed = true;
continue;
}
else if ( pProperties->Name == INFO_CHARSET )
{
m_sCharSet = sValue;
continue;
}
else
{
if ( !aDriverSupportedProperties.has(pProperties->Name) || aDriverSupportedProperties.get(pProperties->Name) != aValue )
{
m_aDataSourceSettings.push_back( TypedPropertyValue(
pProperties->Name, pProperties->Type, aValue ) );
}
continue;
}
}
aSettingsMap.insert(TSettingsMap::value_type(eToken,sValue));
}
if ( bAutoIncrementEnabled && (aAutoIncrement.first.getLength() || aAutoIncrement.second.getLength()) )
m_aAutoIncrement.reset( new TStringPair(aAutoIncrement));
if ( aDelimiter.bUsed )
m_aDelimiter.reset( new TDelimiter( aDelimiter ) );
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DATASOURCE, sal_True, sal_True);
exportConnectionData();
exportDriverSettings(aSettingsMap);
exportApplicationConnectionSettings(aSettingsMap);
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportApplicationConnectionSettings(const TSettingsMap& _aSettings)
{
const ::xmloff::token::XMLTokenEnum pSettings[] = {
XML_IS_TABLE_NAME_LENGTH_LIMITED
,XML_ENABLE_SQL92_CHECK
,XML_APPEND_TABLE_ALIAS_NAME
,XML_IGNORE_DRIVER_PRIVILEGES
,XML_BOOLEAN_COMPARISON_MODE
,XML_USE_CATALOG
,XML_MAX_ROW_COUNT
,XML_SUPPRESS_VERSION_COLUMNS
};
for (size_t i = 0; i< sizeof(pSettings)/sizeof(pSettings[0]); ++i)
{
TSettingsMap::const_iterator aFind = _aSettings.find(pSettings[i]);
if ( aFind != _aSettings.end() )
AddAttribute(XML_NAMESPACE_DB, aFind->first,aFind->second);
}
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_APPLICATION_CONNECTION_SETTINGS, sal_True, sal_True);
Reference<XPropertySet> xProp(getDataSource());
Sequence< ::rtl::OUString> aValue;
xProp->getPropertyValue(PROPERTY_TABLEFILTER) >>= aValue;
if ( aValue.getLength() )
{
SvXMLElementExport aElem2(*this,XML_NAMESPACE_DB, XML_TABLE_FILTER, sal_True, sal_True);
exportSequence(aValue,XML_TABLE_INCLUDE_FILTER,XML_TABLE_FILTER_PATTERN);
}
xProp->getPropertyValue(PROPERTY_TABLETYPEFILTER) >>= aValue;
if ( aValue.getLength() )
exportSequence(aValue,XML_TABLE_TYPE_FILTER,XML_TABLE_TYPE);
exportDataSourceSettings();
}
// -----------------------------------------------------------------------------
void ODBExport::exportDriverSettings(const TSettingsMap& _aSettings)
{
const ::xmloff::token::XMLTokenEnum pSettings[] = {
XML_SHOW_DELETED
,XML_SYSTEM_DRIVER_SETTINGS
,XML_BASE_DN
,XML_IS_FIRST_ROW_HEADER_LINE
,XML_PARAMETER_NAME_SUBSTITUTION
};
for (size_t i = 0; i< sizeof(pSettings)/sizeof(pSettings[0]); ++i)
{
TSettingsMap::const_iterator aFind = _aSettings.find(pSettings[i]);
if ( aFind != _aSettings.end() )
AddAttribute(XML_NAMESPACE_DB, aFind->first,aFind->second);
}
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DRIVER_SETTINGS, sal_True, sal_True);
exportAutoIncrement();
exportDelimiter();
exportCharSet();
}
// -----------------------------------------------------------------------------
void ODBExport::exportConnectionData()
{
SvXMLElementExport aConnData(*this,XML_NAMESPACE_DB, XML_CONNECTION_DATA, sal_True, sal_True);
{
::rtl::OUString sValue;
Reference<XPropertySet> xProp(getDataSource());
xProp->getPropertyValue(PROPERTY_URL) >>= sValue;
if ( m_aTypeCollection.isFileSystemBased(sValue) )
{
SvXMLElementExport aDatabaseDescription(*this,XML_NAMESPACE_DB, XML_DATABASE_DESCRIPTION, sal_True, sal_True);
{
SvtPathOptions aPathOptions;
const String sOrigUrl = m_aTypeCollection.cutPrefix(sValue);
String sFileName = aPathOptions.SubstituteVariable(sOrigUrl);
if ( sOrigUrl == sFileName )
{
::svt::OFileNotation aTransformer( sFileName );
::rtl::OUStringBuffer sURL( aTransformer.get( ::svt::OFileNotation::N_URL ) );
if ( sURL.charAt(sURL.getLength()-1) != '/' )
sURL.append(sal_Unicode('/'));
AddAttribute(XML_NAMESPACE_XLINK,XML_HREF,GetRelativeReference(sURL.makeStringAndClear()));
} // if ( sOrigUrl == sFileName )
else
AddAttribute(XML_NAMESPACE_XLINK,XML_HREF,sOrigUrl);
AddAttribute(XML_NAMESPACE_DB,XML_MEDIA_TYPE,m_aTypeCollection.getMediaType(sValue));
const ::dbaccess::DATASOURCE_TYPE eType = m_aTypeCollection.determineType(sValue);
try
{
::rtl::OUString sExtension;
if ( eType == dbaccess::DST_MSACCESS )
sExtension = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("mdb"));
else
{
Reference< XPropertySet > xDataSourceSettings;
OSL_VERIFY( xProp->getPropertyValue( PROPERTY_SETTINGS ) >>= xDataSourceSettings );
xDataSourceSettings->getPropertyValue( INFO_TEXTFILEEXTENSION ) >>= sExtension;
}
if ( sExtension.getLength() )
AddAttribute(XML_NAMESPACE_DB,XML_EXTENSION,sExtension);
}
catch(const Exception&)
{
// nii
}
SvXMLElementExport aFileBasedDB(*this,XML_NAMESPACE_DB, XML_FILE_BASED_DATABASE, sal_True, sal_True);
}
}
else
{
String sDatabaseName,sHostName;
sal_Int32 nPort = -1;
m_aTypeCollection.extractHostNamePort(sValue,sDatabaseName,sHostName,nPort);
if ( sHostName.Len() )
{
SvXMLElementExport aDatabaseDescription(*this,XML_NAMESPACE_DB, XML_DATABASE_DESCRIPTION, sal_True, sal_True);
{
String sType = m_aTypeCollection.getPrefix(sValue);
sType.EraseTrailingChars(':');
AddAttribute(XML_NAMESPACE_DB,XML_TYPE,sType);
AddAttribute(XML_NAMESPACE_DB,XML_HOSTNAME,sHostName);
if ( nPort != -1 )
AddAttribute(XML_NAMESPACE_DB,XML_PORT,::rtl::OUString::valueOf(nPort));
if ( sDatabaseName.Len() )
AddAttribute(XML_NAMESPACE_DB,XML_DATABASE_NAME,sDatabaseName);
try
{
Reference< XPropertySet > xDataSourceSettings( xProp->getPropertyValue( PROPERTY_SETTINGS ), UNO_QUERY_THROW );
Reference< XPropertySetInfo > xSettingsInfo( xDataSourceSettings->getPropertySetInfo(), UNO_SET_THROW );
struct PropertyMap
{
const sal_Char* pAsciiPropertyName;
sal_uInt16 nAttributeId;
PropertyMap() :pAsciiPropertyName( NULL ), nAttributeId(0) { }
PropertyMap( const sal_Char* _pAsciiPropertyName, const sal_uInt16 _nAttributeId )
:pAsciiPropertyName( _pAsciiPropertyName )
,nAttributeId( _nAttributeId )
{
}
};
PropertyMap aProperties[] =
{
PropertyMap( "LocalSocket", XML_LOCAL_SOCKET )
//PropertyMap( "NamedPipe", 0 /* TODO */ )
};
for ( size_t i=0;
i < sizeof( aProperties ) / sizeof( aProperties[0] );
++i
)
{
const ::rtl::OUString sPropertyName = ::rtl::OUString::createFromAscii( aProperties[i].pAsciiPropertyName );
if ( xSettingsInfo->hasPropertyByName( sPropertyName ) )
{
::rtl::OUString sPropertyValue;
if ( ( xDataSourceSettings->getPropertyValue( sPropertyName ) >>= sPropertyValue ) && sPropertyValue.getLength() )
AddAttribute( XML_NAMESPACE_DB, XML_LOCAL_SOCKET, sPropertyValue );
}
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
SvXMLElementExport aServerDB(*this,XML_NAMESPACE_DB, XML_SERVER_DATABASE, sal_True, sal_True);
}
}
else
{
AddAttribute(XML_NAMESPACE_XLINK, XML_HREF,sValue);
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_CONNECTION_RESOURCE, sal_True, sal_True);
}
}
}
exportLogin();
}
// -----------------------------------------------------------------------------
void ODBExport::exportDataSourceSettings()
{
if ( m_aDataSourceSettings.empty() )
return;
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTINGS, sal_True, sal_True);
::std::vector< TypedPropertyValue >::iterator aIter = m_aDataSourceSettings.begin();
::std::vector< TypedPropertyValue >::iterator aEnd = m_aDataSourceSettings.end();
for ( ; aIter != aEnd; ++aIter )
{
sal_Bool bIsSequence = TypeClass_SEQUENCE == aIter->Type.getTypeClass();
Type aSimpleType;
if ( bIsSequence )
aSimpleType = ::comphelper::getSequenceElementType( aIter->Value.getValueType() );
else
aSimpleType = aIter->Type;
AddAttribute( XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_IS_LIST,bIsSequence ? XML_TRUE : XML_FALSE );
AddAttribute( XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_NAME, aIter->Name );
::rtl::OUString sTypeName = lcl_implGetPropertyXMLType( aSimpleType );
if ( bIsSequence && aSimpleType.getTypeClass() == TypeClass_ANY )
{
Sequence<Any> aSeq;
aIter->Value >>= aSeq;
if ( aSeq.getLength() )
sTypeName = lcl_implGetPropertyXMLType(aSeq[0].getValueType());
}
AddAttribute( XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_TYPE, sTypeName );
SvXMLElementExport aDataSourceSetting( *this, XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING, sal_True, sal_True );
if ( !bIsSequence )
{
SvXMLElementExport aDataValue( *this, XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE, sal_True, sal_False );
// (no whitespace inside the tag)
Characters( implConvertAny( aIter->Value ) );
}
else
{
// the not-that-simple case, we need to iterate through the sequence elements
::std::auto_ptr<IIterator> pSequenceIterator;
switch (aSimpleType.getTypeClass())
{
case TypeClass_STRING:
pSequenceIterator.reset( new OSequenceIterator< ::rtl::OUString >( aIter->Value ) );
break;
case TypeClass_DOUBLE:
pSequenceIterator.reset( new OSequenceIterator< double >( aIter->Value ) );
break;
case TypeClass_BOOLEAN:
pSequenceIterator.reset( new OSequenceIterator< sal_Bool >( aIter->Value ) );
break;
case TypeClass_BYTE:
pSequenceIterator.reset( new OSequenceIterator< sal_Int8 >( aIter->Value ) );
break;
case TypeClass_SHORT:
pSequenceIterator.reset( new OSequenceIterator< sal_Int16 >( aIter->Value ) );
break;
case TypeClass_LONG:
pSequenceIterator.reset( new OSequenceIterator< sal_Int32 >( aIter->Value ) );
break;
case TypeClass_ANY:
pSequenceIterator.reset( new OSequenceIterator< Any >( aIter->Value ) );
break;
default:
OSL_ENSURE(sal_False, "unsupported sequence type !");
break;
}
if ( pSequenceIterator.get() )
{
::rtl::OUString sCurrent;
while (pSequenceIterator->hasMoreElements())
{
SvXMLElementExport aDataValue(*this,XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE, sal_True, sal_False);
// (no whitespace inside the tag)
Characters(implConvertAny(pSequenceIterator->nextElement()));
}
}
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportCharSet()
{
if ( m_sCharSet.getLength() )
{
AddAttribute(XML_NAMESPACE_DB, XML_ENCODING,m_sCharSet);
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_FONT_CHARSET, sal_True, sal_True);
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportDelimiter()
{
if ( m_aDelimiter.get() && m_aDelimiter->bUsed )
{
AddAttribute(XML_NAMESPACE_DB, XML_FIELD,m_aDelimiter->sField);
AddAttribute(XML_NAMESPACE_DB, XML_STRING,m_aDelimiter->sText);
AddAttribute(XML_NAMESPACE_DB, XML_DECIMAL,m_aDelimiter->sDecimal);
AddAttribute(XML_NAMESPACE_DB, XML_THOUSAND,m_aDelimiter->sThousand);
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_DELIMITER, sal_True, sal_True);
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportAutoIncrement()
{
if ( m_aAutoIncrement.get() )
{
AddAttribute(XML_NAMESPACE_DB, XML_ADDITIONAL_COLUMN_STATEMENT,m_aAutoIncrement->second);
AddAttribute(XML_NAMESPACE_DB, XML_ROW_RETRIEVING_STATEMENT,m_aAutoIncrement->first);
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_AUTO_INCREMENT, sal_True, sal_True);
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportSequence(const Sequence< ::rtl::OUString>& _aValue
,::xmloff::token::XMLTokenEnum _eTokenFilter
,::xmloff::token::XMLTokenEnum _eTokenType)
{
Reference<XPropertySet> xProp(getDataSource());
Sequence< ::rtl::OUString> aValue;
if ( _aValue.getLength() )
{
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, _eTokenFilter, sal_True, sal_True);
const ::rtl::OUString* pIter = _aValue.getConstArray();
const ::rtl::OUString* pEnd = pIter + _aValue.getLength();
for(;pIter != pEnd;++pIter)
{
SvXMLElementExport aDataSource(*this,XML_NAMESPACE_DB, _eTokenType, sal_True, sal_False);
Characters(*pIter);
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportLogin()
{
Reference<XPropertySet> xProp(getDataSource());
::rtl::OUString sValue;
xProp->getPropertyValue(PROPERTY_USER) >>= sValue;
sal_Bool bAddLogin = sValue.getLength() > 0;
if ( bAddLogin )
AddAttribute(XML_NAMESPACE_DB, XML_USER_NAME,sValue);
sal_Bool bValue = sal_False;
if ( xProp->getPropertyValue(PROPERTY_ISPASSWORDREQUIRED) >>= bValue )
{
bAddLogin = sal_True;
AddAttribute(XML_NAMESPACE_DB, XML_IS_PASSWORD_REQUIRED,bValue ? XML_TRUE : XML_FALSE);
}
if ( bAddLogin )
SvXMLElementExport aElem(*this,XML_NAMESPACE_DB, XML_LOGIN, sal_True, sal_True);
}
// -----------------------------------------------------------------------------
void ODBExport::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
)
{
if ( _xCollection.is() )
{
::std::auto_ptr<SvXMLElementExport> pComponents;
if ( _bExportContext )
pComponents.reset( new SvXMLElementExport(*this,XML_NAMESPACE_DB, _eComponents, sal_True, sal_True));
Sequence< ::rtl::OUString> aSeq = _xCollection->getElementNames();
const ::rtl::OUString* pIter = aSeq.getConstArray();
const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
for(;pIter != pEnd;++pIter)
{
Reference<XPropertySet> xProp(_xCollection->getByName(*pIter),UNO_QUERY);
if ( _bExportContext && XML_TABLE_REPRESENTATIONS != _eComponents )
AddAttribute(XML_NAMESPACE_DB, XML_NAME,*pIter);
Reference< XNameAccess > xSub(xProp,UNO_QUERY);
if ( xSub.is() )
{
exportCollection(xSub,_eSubComponents,_eSubComponents,_bExportContext,_aMemFunc);
}
else if ( xProp.is() )
_aMemFunc(this,xProp.get());
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportComponent(XPropertySet* _xProp)
{
::rtl::OUString sValue;
_xProp->getPropertyValue(PROPERTY_PERSISTENT_NAME) >>= sValue;
sal_Bool bIsForm = sal_True;
_xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsForm"))) >>= bIsForm;
if ( bIsForm )
sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("forms/")) + sValue;
else
sValue = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("reports/")) + sValue;
AddAttribute(XML_NAMESPACE_XLINK, XML_HREF,sValue);
sal_Bool bAsTemplate = sal_False;
_xProp->getPropertyValue(PROPERTY_AS_TEMPLATE) >>= bAsTemplate;
AddAttribute(XML_NAMESPACE_DB, XML_AS_TEMPLATE,bAsTemplate ? XML_TRUE : XML_FALSE);
SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_COMPONENT, sal_True, sal_True);
}
// -----------------------------------------------------------------------------
void ODBExport::exportQuery(XPropertySet* _xProp)
{
AddAttribute(XML_NAMESPACE_DB, XML_COMMAND,getString(_xProp->getPropertyValue(PROPERTY_COMMAND)));
if ( getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYFILTER)) )
AddAttribute(XML_NAMESPACE_DB, XML_APPLY_FILTER,XML_TRUE);
if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_APPLYORDER)
&& getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYORDER)) )
AddAttribute(XML_NAMESPACE_DB, XML_APPLY_ORDER,XML_TRUE);
if ( ! getBOOL(_xProp->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) )
AddAttribute(XML_NAMESPACE_DB, XML_ESCAPE_PROCESSING,XML_FALSE);
exportStyleName(_xProp,GetAttrList());
SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_QUERY, sal_True, sal_True);
Reference<XColumnsSupplier> xCol(_xProp,UNO_QUERY);
exportColumns(xCol);
exportFilter(_xProp,PROPERTY_FILTER,XML_FILTER_STATEMENT);
exportFilter(_xProp,PROPERTY_ORDER,XML_ORDER_STATEMENT);
exportTableName(_xProp,sal_True);
}
// -----------------------------------------------------------------------------
void ODBExport::exportTable(XPropertySet* _xProp)
{
exportTableName(_xProp,sal_False);
if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_DESCRIPTION) )
AddAttribute(XML_NAMESPACE_DB, XML_DESCRIPTION,getString(_xProp->getPropertyValue(PROPERTY_DESCRIPTION)));
if ( getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYFILTER)) )
AddAttribute(XML_NAMESPACE_DB, XML_APPLY_FILTER,XML_TRUE);
if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_APPLYORDER)
&& getBOOL(_xProp->getPropertyValue(PROPERTY_APPLYORDER)) )
AddAttribute(XML_NAMESPACE_DB, XML_APPLY_ORDER,XML_TRUE);
exportStyleName(_xProp,GetAttrList());
SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_TABLE_REPRESENTATION, sal_True, sal_True);
Reference<XColumnsSupplier> xCol(_xProp,UNO_QUERY);
exportColumns(xCol);
exportFilter(_xProp,PROPERTY_FILTER,XML_FILTER_STATEMENT);
exportFilter(_xProp,PROPERTY_ORDER,XML_ORDER_STATEMENT);
}
// -----------------------------------------------------------------------------
void ODBExport::exportStyleName(XPropertySet* _xProp,SvXMLAttributeList& _rAtt)
{
Reference<XPropertySet> xFind(_xProp);
exportStyleName(XML_STYLE_NAME,xFind,_rAtt,m_aAutoStyleNames);
exportStyleName(XML_DEFAULT_CELL_STYLE_NAME,xFind,_rAtt,m_aCellAutoStyleNames);
exportStyleName(XML_DEFAULT_ROW_STYLE_NAME,xFind,_rAtt,m_aRowAutoStyleNames);
}
// -----------------------------------------------------------------------------
void ODBExport::exportStyleName(const ::xmloff::token::XMLTokenEnum _eToken,const uno::Reference<beans::XPropertySet>& _xProp,SvXMLAttributeList& _rAtt,TPropertyStyleMap& _rMap)
{
TPropertyStyleMap::iterator aFind = _rMap.find(_xProp);
if ( aFind != _rMap.end() )
{
_rAtt.AddAttribute( GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DB, GetXMLToken(_eToken) ),
aFind->second );
_rMap.erase(aFind);
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportTableName(XPropertySet* _xProp,sal_Bool _bUpdate)
{
::rtl::OUString sValue;
_xProp->getPropertyValue(_bUpdate ? PROPERTY_UPDATE_TABLENAME : PROPERTY_NAME) >>= sValue;
if ( sValue.getLength() )
{
AddAttribute(XML_NAMESPACE_DB, XML_NAME,sValue);
_xProp->getPropertyValue(_bUpdate ? PROPERTY_UPDATE_SCHEMANAME : PROPERTY_SCHEMANAME) >>= sValue;
if ( sValue.getLength() )
AddAttribute(XML_NAMESPACE_DB, XML_SCHEMA_NAME,sValue);
_xProp->getPropertyValue(_bUpdate ? PROPERTY_UPDATE_CATALOGNAME : PROPERTY_CATALOGNAME) >>= sValue;
if ( sValue.getLength() )
AddAttribute(XML_NAMESPACE_DB, XML_CATALOG_NAME,sValue);
if ( _bUpdate )
{
SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_UPDATE_TABLE, sal_True, sal_True);
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportFilter(XPropertySet* _xProp
,const ::rtl::OUString& _sProp
,enum ::xmloff::token::XMLTokenEnum _eStatementType)
{
OSL_PRECOND(!GetAttrList().getLength(),"Invalid attribute length!");
::rtl::OUString sCommand;
_xProp->getPropertyValue(_sProp) >>= sCommand;
if ( sCommand.getLength() )
{
AddAttribute(XML_NAMESPACE_DB, XML_COMMAND,sCommand);
SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, _eStatementType, sal_True, sal_True);
}
OSL_POSTCOND(!GetAttrList().getLength(),"Invalid attribute length!");
}
// -----------------------------------------------------------------------------
void ODBExport::exportColumns(const Reference<XColumnsSupplier>& _xColSup)
{
OSL_PRECOND( _xColSup.is(), "ODBExport::exportColumns: invalid columns supplier!" );
if ( !_xColSup.is() )
return;
try
{
Reference<XNameAccess> xNameAccess( _xColSup->getColumns(), UNO_SET_THROW );
if ( !xNameAccess->hasElements() )
{
Reference< XPropertySet > xComponent(_xColSup,UNO_QUERY);
TTableColumnMap::iterator aFind = m_aTableDummyColumns.find(xComponent);
if ( aFind != m_aTableDummyColumns.end() )
{
SvXMLElementExport aColumns(*this,XML_NAMESPACE_DB, XML_COLUMNS, sal_True, sal_True);
SvXMLAttributeList* pAtt = new SvXMLAttributeList;
Reference<XAttributeList> xAtt = pAtt;
exportStyleName(aFind->second.get(),*pAtt);
AddAttributeList(xAtt);
SvXMLElementExport aColumn(*this,XML_NAMESPACE_DB, XML_COLUMN, sal_True, sal_True);
}
return;
}
SvXMLElementExport aColumns(*this,XML_NAMESPACE_DB, XML_COLUMNS, sal_True, sal_True);
Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
const ::rtl::OUString* pIter = aSeq.getConstArray();
const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
for( ; pIter != pEnd ; ++pIter)
{
Reference<XPropertySet> xProp(xNameAccess->getByName(*pIter),UNO_QUERY);
if ( xProp.is() )
{
SvXMLAttributeList* pAtt = new SvXMLAttributeList;
Reference<XAttributeList> xAtt = pAtt;
exportStyleName(xProp.get(),*pAtt);
sal_Bool bHidden = getBOOL(xProp->getPropertyValue(PROPERTY_HIDDEN));
::rtl::OUString sValue;
xProp->getPropertyValue(PROPERTY_HELPTEXT) >>= sValue;
Any aColumnDefault;
aColumnDefault = xProp->getPropertyValue(PROPERTY_CONTROLDEFAULT);
if ( bHidden || sValue.getLength() || aColumnDefault.hasValue() || pAtt->getLength() )
{
AddAttribute(XML_NAMESPACE_DB, XML_NAME,*pIter);
if ( bHidden )
AddAttribute(XML_NAMESPACE_DB, XML_VISIBLE,XML_FALSE);
if ( sValue.getLength() )
AddAttribute(XML_NAMESPACE_DB, XML_HELP_MESSAGE,sValue);
if ( aColumnDefault.hasValue() )
{
::rtl::OUStringBuffer sColumnDefaultString,sType;
SvXMLUnitConverter::convertAny( sColumnDefaultString, sType, aColumnDefault );
AddAttribute(XML_NAMESPACE_DB, XML_TYPE_NAME,sType.makeStringAndClear());
AddAttribute(XML_NAMESPACE_DB, XML_DEFAULT_VALUE,sColumnDefaultString.makeStringAndClear());
}
if ( pAtt->getLength() )
AddAttributeList(xAtt);
}
if ( GetAttrList().getLength() )
{
SvXMLElementExport aComponents(*this,XML_NAMESPACE_DB, XML_COLUMN, sal_True, sal_True);
}
}
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportForms()
{
Any aValue;
::rtl::OUString sService;
dbtools::getDataSourceSetting(getDataSource(),"Forms",aValue);
aValue >>= sService;
if ( !sService.getLength() )
{
Reference<XFormDocumentsSupplier> xSup(GetModel(),UNO_QUERY);
if ( xSup.is() )
{
Reference< XNameAccess > xCollection = xSup->getFormDocuments();
if ( xCollection.is() && xCollection->hasElements() )
{
::comphelper::mem_fun1_t<ODBExport,XPropertySet* > aMemFunc(&ODBExport::exportComponent);
exportCollection(xCollection,XML_FORMS,XML_COMPONENT_COLLECTION,sal_True,aMemFunc);
}
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportReports()
{
Any aValue;
::rtl::OUString sService;
dbtools::getDataSourceSetting(getDataSource(),"Reports",aValue);
aValue >>= sService;
if ( !sService.getLength() )
{
Reference<XReportDocumentsSupplier> xSup(GetModel(),UNO_QUERY);
if ( xSup.is() )
{
Reference< XNameAccess > xCollection = xSup->getReportDocuments();
if ( xCollection.is() && xCollection->hasElements() )
{
::comphelper::mem_fun1_t<ODBExport,XPropertySet* > aMemFunc(&ODBExport::exportComponent);
exportCollection(xCollection,XML_REPORTS,XML_COMPONENT_COLLECTION,sal_True,aMemFunc);
}
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportQueries(sal_Bool _bExportContext)
{
Any aValue;
::rtl::OUString sService;
dbtools::getDataSourceSetting(getDataSource(),"CommandDefinitions",aValue);
aValue >>= sService;
if ( !sService.getLength() )
{
Reference<XQueryDefinitionsSupplier> xSup(getDataSource(),UNO_QUERY);
if ( xSup.is() )
{
Reference< XNameAccess > xCollection = xSup->getQueryDefinitions();
if ( xCollection.is() && xCollection->hasElements() )
{
::std::auto_ptr< ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > > pMemFunc;
if ( _bExportContext )
pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportQuery) );
else
pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportAutoStyle) );
exportCollection(xCollection,XML_QUERIES,XML_QUERY_COLLECTION,_bExportContext,*pMemFunc);
}
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportTables(sal_Bool _bExportContext)
{
Reference<XTablesSupplier> xSup(getDataSource(),UNO_QUERY);
if ( xSup.is() )
{
Reference< XNameAccess > xCollection = xSup->getTables();
if ( xCollection.is() && xCollection->hasElements() )
{
::std::auto_ptr< ::comphelper::mem_fun1_t<ODBExport,XPropertySet* > > pMemFunc;
if ( _bExportContext )
pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportTable) );
else
pMemFunc.reset( new ::comphelper::mem_fun1_t<ODBExport,XPropertySet* >(&ODBExport::exportAutoStyle) );
exportCollection(xCollection,XML_TABLE_REPRESENTATIONS,XML_TOKEN_INVALID,_bExportContext,*pMemFunc);
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::exportAutoStyle(XPropertySet* _xProp)
{
typedef ::std::pair<TPropertyStyleMap*,sal_uInt16> TEnumMapperPair;
typedef ::std::pair< UniReference < SvXMLExportPropertyMapper> , TEnumMapperPair> TExportPropMapperPair;
Reference<XColumnsSupplier> xSup(_xProp,UNO_QUERY);
if ( xSup.is() )
{
const TExportPropMapperPair pExportHelper[] = {
TExportPropMapperPair(m_xExportHelper,TEnumMapperPair(&m_aAutoStyleNames,XML_STYLE_FAMILY_TABLE_TABLE ))
// ,TExportPropMapperPair(m_xCellExportHelper,TEnumMapperPair(&m_aCellAutoStyleNames,XML_STYLE_FAMILY_TABLE_CELL))
,TExportPropMapperPair(m_xRowExportHelper,TEnumMapperPair(&m_aRowAutoStyleNames,XML_STYLE_FAMILY_TABLE_ROW))
};
::std::vector< XMLPropertyState > aPropertyStates;
for (size_t i = 0 ; i < sizeof(pExportHelper)/sizeof(pExportHelper[0]); ++i)
{
aPropertyStates = pExportHelper[i].first->Filter(_xProp);
if ( !aPropertyStates.empty() )
pExportHelper[i].second.first->insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( pExportHelper[i].second.second, aPropertyStates )));
}
Reference< XNameAccess > xCollection;
try
{
xCollection.set( xSup->getColumns(), UNO_SET_THROW );
awt::FontDescriptor aFont;
_xProp->getPropertyValue(PROPERTY_FONT) >>= aFont;
GetFontAutoStylePool()->Add(aFont.Name,aFont.StyleName,aFont.Family,aFont.Pitch,aFont.CharSet );
m_aCurrentPropertyStates = m_xCellExportHelper->Filter(_xProp);
if ( !m_aCurrentPropertyStates.empty() && !xCollection->hasElements() )
{
Reference< XDataDescriptorFactory> xFac(xCollection,UNO_QUERY);
if ( xFac.is() )
{
Reference< XPropertySet> xColumn = xFac->createDataDescriptor();
m_aTableDummyColumns.insert(TTableColumnMap::value_type(Reference< XPropertySet>(_xProp),xColumn));
exportAutoStyle(xColumn.get());
}
}
else
{
::comphelper::mem_fun1_t<ODBExport,XPropertySet* > aMemFunc(&ODBExport::exportAutoStyle);
exportCollection(xCollection,XML_TOKEN_INVALID,XML_TOKEN_INVALID,sal_False,aMemFunc);
}
}
catch(Exception&)
{
DBG_UNHANDLED_EXCEPTION();
}
m_aCurrentPropertyStates.clear();
}
else
{ // here I know I have a column
TExportPropMapperPair pExportHelper[] = {
TExportPropMapperPair(m_xColumnExportHelper,TEnumMapperPair(&m_aAutoStyleNames,XML_STYLE_FAMILY_TABLE_COLUMN ))
,TExportPropMapperPair(m_xCellExportHelper,TEnumMapperPair(&m_aCellAutoStyleNames,XML_STYLE_FAMILY_TABLE_CELL))
};
for (size_t i = 0 ; i < sizeof(pExportHelper)/sizeof(pExportHelper[0]); ++i)
{
::std::vector< XMLPropertyState > aPropStates = pExportHelper[i].first->Filter( _xProp );
if ( !aPropStates.empty() )
{
::std::vector< XMLPropertyState >::iterator aItr = aPropStates.begin();
::std::vector< XMLPropertyState >::iterator aEnd = aPropStates.end();
const UniReference < XMLPropertySetMapper >& pStyle = pExportHelper[i].first->getPropertySetMapper();
while ( aItr != aEnd )
{
if ( aItr->mnIndex != -1 )
{
switch ( pStyle->GetEntryContextId(aItr->mnIndex) )
{
case CTF_DB_NUMBERFORMAT:
{
sal_Int32 nNumberFormat = -1;
if ( aItr->maValue >>= nNumberFormat )
addDataStyle(nNumberFormat);
}
break;
case CTF_DB_COLUMN_TEXT_ALIGN:
if ( !aItr->maValue.hasValue() )
aItr->maValue <<= ::com::sun::star::awt::TextAlign::LEFT;
break;
}
}
++aItr;
} // while ( aItr != aEnd )
} // if ( !aPropStates.empty() )
if ( XML_STYLE_FAMILY_TABLE_CELL == pExportHelper[i].second.second )
::std::copy( m_aCurrentPropertyStates.begin(), m_aCurrentPropertyStates.end(), ::std::back_inserter( aPropStates ));
if ( !aPropStates.empty() )
pExportHelper[i].second.first->insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( pExportHelper[i].second.second, aPropStates )));
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::_ExportContent()
{
exportDataSource();
exportForms();
exportReports();
exportQueries(sal_True);
exportTables(sal_True);
}
// -----------------------------------------------------------------------------
void ODBExport::_ExportMasterStyles()
{
GetPageExport()->exportMasterStyles( sal_True );
}
// -----------------------------------------------------------------------------
void ODBExport::_ExportAutoStyles()
{
// there are no styles that require their own autostyles
if ( getExportFlags() & EXPORT_CONTENT )
{
collectComponentStyles();
GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_TABLE
,GetDocHandler()
,GetMM100UnitConverter()
,GetNamespaceMap()
);
GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_COLUMN
,GetDocHandler()
,GetMM100UnitConverter()
,GetNamespaceMap()
);
GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_CELL
,GetDocHandler()
,GetMM100UnitConverter()
,GetNamespaceMap()
);
GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_ROW
,GetDocHandler()
,GetMM100UnitConverter()
,GetNamespaceMap()
);
exportDataStyles();
}
}
// -----------------------------------------------------------------------------
void ODBExport::_ExportStyles(sal_Bool bUsed)
{
SvXMLExport::_ExportStyles(bUsed);
}
// -----------------------------------------------------------------------------
sal_uInt32 ODBExport::exportDoc(enum ::xmloff::token::XMLTokenEnum eClass)
{
return SvXMLExport::exportDoc( eClass );
}
// -----------------------------------------------------------------------------
void ODBExport::GetViewSettings(Sequence<PropertyValue>& aProps)
{
Reference<XQueryDefinitionsSupplier> xSup(getDataSource(),UNO_QUERY);
if ( xSup.is() )
{
Reference< XNameAccess > xCollection = xSup->getQueryDefinitions();
if ( xCollection.is() && xCollection->hasElements() )
{
try
{
sal_Int32 nLength = aProps.getLength();
aProps.realloc(nLength + 1);
aProps[nLength].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Queries"));
Sequence< ::rtl::OUString> aSeq = xCollection->getElementNames();
const ::rtl::OUString* pIter = aSeq.getConstArray();
const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
Sequence<PropertyValue> aQueries(aSeq.getLength());
for(sal_Int32 i = 0;pIter != pEnd;++pIter,++i)
{
Reference<XPropertySet> xProp(xCollection->getByName(*pIter),UNO_QUERY);
if ( xProp.is() )
{
aQueries[i].Name = *pIter;
aQueries[i].Value = xProp->getPropertyValue(PROPERTY_LAYOUTINFORMATION);
}
}
aProps[nLength].Value <<= aQueries;
}
catch(Exception)
{
OSL_ENSURE(0,"ODBExport::GetViewSettings: Exception catched!");
}
}
}
}
// -----------------------------------------------------------------------------
void ODBExport::GetConfigurationSettings(Sequence<PropertyValue>& aProps)
{
Reference<XPropertySet> xProp(getDataSource());
if ( xProp.is() )
{
sal_Int32 nLength = aProps.getLength();
try
{
Any aValue = xProp->getPropertyValue(PROPERTY_LAYOUTINFORMATION);
Sequence< PropertyValue > aPropValues;
aValue >>= aPropValues;
if ( aPropValues.getLength() )
{
aProps.realloc(nLength + 1);
aProps[nLength].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("layout-settings"));
aProps[nLength].Value = aValue;
}
}
catch(Exception)
{
OSL_ENSURE(0,"Could not access layout information from the data source!");
}
}
}
// -----------------------------------------------------------------------------
::rtl::OUString ODBExport::implConvertAny(const Any& _rValue)
{
::rtl::OUStringBuffer aBuffer;
switch (_rValue.getValueTypeClass())
{
case TypeClass_STRING:
{ // extract the string
::rtl::OUString sCurrentValue;
_rValue >>= sCurrentValue;
aBuffer.append(sCurrentValue);
}
break;
case TypeClass_DOUBLE:
// let the unit converter format is as string
GetMM100UnitConverter().convertDouble(aBuffer, getDouble(_rValue));
break;
case TypeClass_BOOLEAN:
aBuffer = getBOOL(_rValue) ? ::xmloff::token::GetXMLToken(XML_TRUE) : ::xmloff::token::GetXMLToken(XML_FALSE);
break;
case TypeClass_BYTE:
case TypeClass_SHORT:
case TypeClass_LONG:
// let the unit converter format is as string
GetMM100UnitConverter().convertNumber(aBuffer, getINT32(_rValue));
break;
default:
OSL_ENSURE(0,"ODBExport::implConvertAny: Invalid type");
}
return aBuffer.makeStringAndClear();
}
// -----------------------------------------------------------------------------
UniReference < XMLPropertySetMapper > ODBExport::GetTableStylesPropertySetMapper() const
{
if ( !m_xTableStylesPropertySetMapper.is() )
{
m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper();
}
return m_xTableStylesPropertySetMapper;
}
// -----------------------------------------------------------------------------
UniReference < XMLPropertySetMapper > ODBExport::GetCellStylesPropertySetMapper() const
{
if ( !m_xCellStylesPropertySetMapper.is() )
{
m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper();
}
return m_xCellStylesPropertySetMapper;
}
// -----------------------------------------------------------------------------
UniReference < XMLPropertySetMapper > ODBExport::GetColumnStylesPropertySetMapper() const
{
if ( !m_xColumnStylesPropertySetMapper.is() )
{
m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper();
}
return m_xColumnStylesPropertySetMapper;
}
// -----------------------------------------------------------------------------
SvXMLAutoStylePoolP* ODBExport::CreateAutoStylePool()
{
return new OXMLAutoStylePoolP(*this);
}
// -----------------------------------------------------------------------------
void SAL_CALL ODBExport::setSourceDocument( const Reference< XComponent >& xDoc ) throw(IllegalArgumentException, RuntimeException)
{
Reference<XOfficeDatabaseDocument> xOfficeDoc(xDoc,UNO_QUERY_THROW);
m_xDataSource.set(xOfficeDoc->getDataSource(),UNO_QUERY_THROW);
OSL_ENSURE(m_xDataSource.is(),"DataSource is NULL!");
Reference< XNumberFormatsSupplier > xNum(m_xDataSource->getPropertyValue(PROPERTY_NUMBERFORMATSSUPPLIER),UNO_QUERY);
SetNumberFormatsSupplier(xNum);
SvXMLExport::setSourceDocument(xDoc);
}
// -----------------------------------------------------------------------------
void ODBExport::_ExportFontDecls()
{
GetFontAutoStylePool(); // make sure the pool is created
collectComponentStyles();
SvXMLExport::_ExportFontDecls();
}
// -----------------------------------------------------------------------------
void ODBExport::collectComponentStyles()
{
if ( m_bAllreadyFilled )
return;
m_bAllreadyFilled = sal_True;
exportQueries(sal_False);
exportTables(sal_False);
}
// -----------------------------------------------------------------------------
}// dbaxml
// -----------------------------------------------------------------------------