blob: c6ae68840e31fb29fae2b39562fa2e958acc1654 [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"
#ifndef _COM_SUN_STAR_PACKAGES_ZIP_ZIPIOEXCEPTION_HPP_
#include <com/sun/star/packages/zip/ZipIOException.hpp>
#endif
#ifndef _COM_SUN_STAR_EMBED_ELEMENTMODES_HPP_
#include <com/sun/star/embed/ElementModes.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XOFFICEDATABASEDOCUMENT_HPP_
#include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
#endif
#ifndef DBA_XMLFILTER_HXX
#include "xmlfilter.hxx"
#endif
#ifndef _FLT_REGHELPER_HXX_
#include "flt_reghelper.hxx"
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_WINDOW_HXX
#include <vcl/window.hxx>
#endif
#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif
#ifndef _XMLOFF_XMLSCRIPTI_HXX
#include <xmloff/xmlscripti.hxx>
#endif
#ifndef _XMLOFF_XMLTOKEN_HXX
#include <xmloff/xmltoken.hxx>
#endif
#ifndef _XMLOFF_TEXTIMP_HXX_
#include <xmloff/txtimp.hxx>
#endif
#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif
#ifndef _RTL_LOGFILE_HXX_
#include <rtl/logfile.hxx>
#endif
#ifndef _COM_SUN_STAR_XML_SAX_INPUTSOURCE_HPP_
#include <com/sun/star/xml/sax/InputSource.hpp>
#endif
#ifndef _COM_SUN_STAR_XML_SAX_XPARSER_HPP_
#include <com/sun/star/xml/sax/XParser.hpp>
#endif
#ifndef _XMLOFF_PROGRESSBARHELPER_HXX
#include <xmloff/ProgressBarHelper.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen wg. SfxMedium
#include <sfx2/docfile.hxx>
#endif
#ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_HPP_
#include <com/sun/star/io/XInputStream.hpp>
#endif
#ifndef _COM_SUN_STAR_UNO_XNAMINGSERVICE_HPP_
#include <com/sun/star/uno/XNamingService.hpp>
#endif
#ifndef DBA_XMLDATABASE_HXX
#include "xmlDatabase.hxx"
#endif
#ifndef DBA_XMLENUMS_HXX
#include "xmlEnums.hxx"
#endif
#ifndef _URLOBJ_HXX //autogen wg. INetURLObject
#include <tools/urlobj.hxx>
#endif
#ifndef DBACCESS_SHARED_XMLSTRINGS_HRC
#include "xmlstrings.hrc"
#endif
#ifndef _XMLOFF_DOCUMENTSETTINGSCONTEXT_HXX
#include <xmloff/DocumentSettingsContext.hxx>
#endif
#ifndef DBA_XMLSTYLEIMPORT_HXX
#include "xmlStyleImport.hxx"
#endif
#ifndef _XMLOFF_XMLUCONV_HXX
#include <xmloff/xmluconv.hxx>
#endif
#ifndef DBA_XMLHELPER_HXX
#include "xmlHelper.hxx"
#endif
#ifndef _COM_SUN_STAR_UTIL_XMODIFIABLE_HPP_
#include <com/sun/star/util/XModifiable.hpp>
#endif
#include <com/sun/star/frame/XComponentLoader.hpp>
#include <com/sun/star/frame/FrameSearchFlag.hpp>
#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _VOS_MUTEX_HXX_
#include <vos/mutex.hxx>
#endif
#include <svtools/sfxecode.hxx>
#include <unotools/moduleoptions.hxx>
#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
#include <toolkit/helper/vclunohelper.hxx>
#endif
#include <tools/diagnose_ex.h>
#include <comphelper/namedvaluecollection.hxx>
#include <comphelper/mimeconfighelper.hxx>
#include <comphelper/documentconstants.hxx>
#include <comphelper/uno3.hxx>
#include <cppuhelper/exc_hlp.hxx>
#include <osl/thread.hxx>
#include <connectivity/CommonTools.hxx>
#include <connectivity/DriversConfig.hxx>
#include "dsntypes.hxx"
using namespace ::com::sun::star;
extern "C" void SAL_CALL createRegistryInfo_ODBFilter( )
{
static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBFilter > aAutoRegistration;
}
//--------------------------------------------------------------------------
namespace dbaxml
{
namespace
{
class FastLoader : public ::osl::Thread
{
public:
typedef enum { E_JAVA, E_CALC } StartType;
FastLoader(uno::Reference< lang::XMultiServiceFactory > const & _xFactory,StartType _eType)
:m_xFactory(_xFactory)
,m_eWhat(_eType)
{}
protected:
virtual ~FastLoader(){}
/// Working method which should be overridden.
virtual void SAL_CALL run();
virtual void SAL_CALL onTerminated();
private:
uno::Reference< lang::XMultiServiceFactory > m_xFactory;
StartType m_eWhat;
};
void SAL_CALL FastLoader::run()
{
if ( m_eWhat == E_JAVA )
{
static bool s_bFirstTime = true;
if ( s_bFirstTime )
{
s_bFirstTime = false;
try
{
::rtl::Reference< jvmaccess::VirtualMachine > xJVM = ::connectivity::getJavaVM(m_xFactory);
}
catch(uno::Exception& ex)
{
(void)ex;
OSL_ASSERT(0);
}
} // if ( s_bFirstTime )
} // if ( m_eWhat == E_JAVA )
else if ( m_eWhat == E_CALC )
{
static bool s_bFirstTime = true;
if ( s_bFirstTime )
{
s_bFirstTime = false;
try
{
uno::Reference<frame::XComponentLoader> xFrameLoad( m_xFactory->createInstance(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")))
,uno::UNO_QUERY);
const ::rtl::OUString sTarget(RTL_CONSTASCII_USTRINGPARAM("_blank"));
sal_Int32 nFrameSearchFlag = frame::FrameSearchFlag::TASKS | frame::FrameSearchFlag::CREATE;
uno::Reference< frame::XFrame> xFrame = uno::Reference< frame::XFrame>(xFrameLoad,uno::UNO_QUERY_THROW)->findFrame(sTarget,nFrameSearchFlag);
xFrameLoad.set( xFrame,uno::UNO_QUERY);
if ( xFrameLoad.is() )
{
uno::Sequence < beans::PropertyValue > aArgs( 3);
sal_Int32 nLen = 0;
aArgs[nLen].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AsTemplate"));
aArgs[nLen++].Value <<= sal_False;
aArgs[nLen].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReadOnly"));
aArgs[nLen++].Value <<= sal_True;
aArgs[nLen].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Hidden"));
aArgs[nLen++].Value <<= sal_True;
::comphelper::MimeConfigurationHelper aHelper(m_xFactory);
SvtModuleOptions aModuleOptions;
uno::Reference< frame::XModel > xModel(xFrameLoad->loadComponentFromURL(
aModuleOptions.GetFactoryEmptyDocumentURL( aModuleOptions.ClassifyFactoryByServiceName( aHelper.GetDocServiceNameFromMediaType(MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET) )),
::rtl::OUString(), // empty frame name
0,
aArgs
),uno::UNO_QUERY);
::comphelper::disposeComponent(xModel);
}
}
catch(uno::Exception& ex)
{
(void)ex;
OSL_ASSERT(0);
}
}
}
}
void SAL_CALL FastLoader::onTerminated()
{
delete this;
}
class DatasourceURLListener : public ::cppu::WeakImplHelper1< beans::XPropertyChangeListener >
{
uno::Reference< lang::XMultiServiceFactory > m_xFactory;
::dbaccess::ODsnTypeCollection m_aTypeCollection;
DatasourceURLListener(const DatasourceURLListener&);
void operator =(const DatasourceURLListener&);
protected:
virtual ~DatasourceURLListener(){}
public:
DatasourceURLListener(uno::Reference< lang::XMultiServiceFactory > const & _xFactory) : m_xFactory(_xFactory),m_aTypeCollection(_xFactory){}
// XPropertyChangeListener
virtual void SAL_CALL propertyChange( const beans::PropertyChangeEvent& _rEvent ) throw (uno::RuntimeException)
{
::rtl::OUString sURL;
_rEvent.NewValue >>= sURL;
FastLoader* pCreatorThread = NULL;
if ( m_aTypeCollection.needsJVM(sURL) )
{
pCreatorThread = new FastLoader(m_xFactory,FastLoader::E_JAVA);
} // if ( m_aTypeCollection.needsJVM(sURL) )
else if ( sURL.matchIgnoreAsciiCaseAsciiL("sdbc:calc:",10,0) )
{
pCreatorThread = new FastLoader(m_xFactory,FastLoader::E_CALC);
}
if ( pCreatorThread )
{
pCreatorThread->createSuspended();
pCreatorThread->setPriority(osl_Thread_PriorityBelowNormal);
pCreatorThread->resume();
}
}
// XEventListener
virtual void SAL_CALL disposing( const lang::EventObject& /*_rSource*/ ) throw (uno::RuntimeException)
{
}
};
}
sal_Char __READONLY_DATA sXML_np__db[] = "_db";
sal_Char __READONLY_DATA sXML_np___db[] = "__db";
using namespace ::com::sun::star::util;
/// read a component (file + filter version)
sal_Int32 ReadThroughComponent(
const uno::Reference<XInputStream>& xInputStream,
const uno::Reference<XComponent>& xModelComponent,
const uno::Reference<XMultiServiceFactory> & rFactory,
const uno::Reference< XDocumentHandler >& _xFilter )
{
DBG_ASSERT(xInputStream.is(), "input stream missing");
DBG_ASSERT(xModelComponent.is(), "document missing");
DBG_ASSERT(rFactory.is(), "factory missing");
RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "dbaxml", "oj", "ReadThroughComponent" );
// prepare ParserInputSrouce
InputSource aParserInput;
aParserInput.aInputStream = xInputStream;
// get parser
uno::Reference< XParser > xParser(
rFactory->createInstance(
::rtl::OUString::createFromAscii("com.sun.star.xml.sax.Parser") ),
UNO_QUERY );
DBG_ASSERT( xParser.is(), "Can't create parser" );
if( !xParser.is() )
return 1;
RTL_LOGFILE_CONTEXT_TRACE( aLog, "parser created" );
// get filter
DBG_ASSERT( _xFilter.is(), "Can't instantiate filter component." );
if( !_xFilter.is() )
return 1;
// connect parser and filter
xParser->setDocumentHandler( _xFilter );
// connect model and filter
uno::Reference < XImporter > xImporter( _xFilter, UNO_QUERY );
xImporter->setTargetDocument( xModelComponent );
// finally, parser the stream
try
{
xParser->parseStream( aParserInput );
}
#if OSL_DEBUG_LEVEL > 1
catch( SAXParseException& r )
{
ByteString aError( "SAX parse exception catched while importing:\n" );
aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
aError += ByteString::CreateFromInt32( r.LineNumber );
aError += ',';
aError += ByteString::CreateFromInt32( r.ColumnNumber );
DBG_ERROR( aError.GetBuffer() );
return 1;
}
#else
catch( SAXParseException& )
{
return 1;
}
#endif
catch( SAXException& )
{
return 1;
}
catch( packages::zip::ZipIOException& )
{
return ERRCODE_IO_BROKENPACKAGE;
}
catch( Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
// success!
return 0;
}
/// read a component (storage version)
sal_Int32 ReadThroughComponent(
uno::Reference< embed::XStorage > xStorage,
const uno::Reference<XComponent>& xModelComponent,
const sal_Char* pStreamName,
const sal_Char* pCompatibilityStreamName,
const uno::Reference<XMultiServiceFactory> & rFactory,
const uno::Reference< XDocumentHandler >& _xFilter)
{
DBG_ASSERT( xStorage.is(), "Need storage!");
DBG_ASSERT(NULL != pStreamName, "Please, please, give me a name!");
if ( xStorage.is() )
{
uno::Reference< io::XStream > xDocStream;
sal_Bool bEncrypted = sal_False;
try
{
// open stream (and set parser input)
::rtl::OUString sStreamName = ::rtl::OUString::createFromAscii(pStreamName);
if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
{
// stream name not found! Then try the compatibility name.
// if no stream can be opened, return immediatly with OK signal
// do we even have an alternative name?
if ( NULL == pCompatibilityStreamName )
return 0;
// if so, does the stream exist?
sStreamName = ::rtl::OUString::createFromAscii(pCompatibilityStreamName);
if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
return 0;
}
// get input stream
xDocStream = xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
uno::Reference< beans::XPropertySet > xProps( xDocStream, uno::UNO_QUERY_THROW );
uno::Any aAny = xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Encrypted") ) );
aAny >>= bEncrypted;
}
catch( packages::WrongPasswordException& )
{
return ERRCODE_SFX_WRONGPASSWORD;
}
catch ( uno::Exception& )
{
return 1; // TODO/LATER: error handling
}
#ifdef TIMELOG
// if we do profiling, we want to know the stream
RTL_LOGFILE_TRACE_AUTHOR1( "dbaxml", "oj",
"ReadThroughComponent : parsing \"%s\"", pStreamName );
#endif
uno::Reference< XInputStream > xInputStream = xDocStream->getInputStream();
// read from the stream
return ReadThroughComponent( xInputStream
,xModelComponent
,rFactory
,_xFilter );
}
// TODO/LATER: better error handling
return 1;
}
// -------------
// - ODBFilter -
// -------------
DBG_NAME(ODBFilter)
ODBFilter::ODBFilter( const uno::Reference< XMultiServiceFactory >& _rxMSF )
:SvXMLImport(_rxMSF)
,m_bNewFormat(false)
{
DBG_CTOR(ODBFilter,NULL);
GetMM100UnitConverter().setCoreMeasureUnit(MAP_10TH_MM);
GetMM100UnitConverter().setXMLMeasureUnit(MAP_CM);
GetNamespaceMap().Add( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__db) ),
GetXMLToken(XML_N_DB),
XML_NAMESPACE_DB );
GetNamespaceMap().Add( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np___db) ),
GetXMLToken(XML_N_DB_OASIS),
XML_NAMESPACE_DB );
}
// -----------------------------------------------------------------------------
ODBFilter::~ODBFilter() throw()
{
DBG_DTOR(ODBFilter,NULL);
}
// -----------------------------------------------------------------------------
IMPLEMENT_SERVICE_INFO1_STATIC( ODBFilter, "com.sun.star.comp.sdb.DBFilter", "com.sun.star.document.ImportFilter")
// -----------------------------------------------------------------------------
sal_Bool SAL_CALL ODBFilter::filter( const Sequence< PropertyValue >& rDescriptor )
throw (RuntimeException)
{
uno::Reference< ::com::sun::star::awt::XWindow > xWindow;
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Window* pFocusWindow = Application::GetFocusWindow();
xWindow = VCLUnoHelper::GetInterface( pFocusWindow );
if( pFocusWindow )
pFocusWindow->EnterWait();
}
sal_Bool bRet = sal_False;
if ( GetModel().is() )
bRet = implImport( rDescriptor );
if ( xWindow.is() )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Window* pFocusWindow = VCLUnoHelper::GetWindow( xWindow );
if ( pFocusWindow )
pFocusWindow->LeaveWait();
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool ODBFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
throw (RuntimeException)
{
::rtl::OUString sFileName;
::comphelper::NamedValueCollection aMediaDescriptor( rDescriptor );
if ( aMediaDescriptor.has( "URL" ) )
sFileName = aMediaDescriptor.getOrDefault( "URL", ::rtl::OUString() );
if ( !sFileName.getLength() && aMediaDescriptor.has( "FileName" ) )
sFileName = aMediaDescriptor.getOrDefault( "FileName", sFileName );
OSL_ENSURE( sFileName.getLength(), "ODBFilter::implImport: no URL given!" );
sal_Bool bRet = ( sFileName.getLength() != 0 );
if ( bRet )
{
uno::Reference<XComponent> xCom(GetModel(),UNO_QUERY);
SfxMediumRef pMedium = new SfxMedium(
sFileName, ( STREAM_READ | STREAM_NOCREATE ), sal_False, 0 );
uno::Reference< embed::XStorage > xStorage;
try
{
xStorage.set( pMedium->GetStorage( sal_False ), UNO_QUERY_THROW );
}
catch( const Exception& )
{
Any aError = ::cppu::getCaughtException();
if ( aError.isExtractableTo( ::cppu::UnoType< RuntimeException >::get() ) )
throw;
throw lang::WrappedTargetRuntimeException( ::rtl::OUString(), *this, aError );
}
uno::Reference<sdb::XOfficeDatabaseDocument> xOfficeDoc(GetModel(),UNO_QUERY_THROW);
m_xDataSource.set(xOfficeDoc->getDataSource(),UNO_QUERY_THROW);
uno::Reference<beans::XPropertyChangeListener> xListener = new DatasourceURLListener(getServiceFactory());
m_xDataSource->addPropertyChangeListener(PROPERTY_URL,xListener);
uno::Reference< XNumberFormatsSupplier > xNum(m_xDataSource->getPropertyValue(PROPERTY_NUMBERFORMATSSUPPLIER),UNO_QUERY);
SetNumberFormatsSupplier(xNum);
uno::Reference<XComponent> xModel(GetModel(),UNO_QUERY);
sal_Int32 nRet = ReadThroughComponent( xStorage
,xModel
,"settings.xml"
,"Settings.xml"
,getServiceFactory()
,this
);
if ( nRet == 0 )
nRet = ReadThroughComponent( xStorage
,xModel
,"content.xml"
,"Content.xml"
,getServiceFactory()
,this
);
bRet = nRet == 0;
if ( bRet )
{
uno::Reference< XModifiable > xModi(GetModel(),UNO_QUERY);
if ( xModi.is() )
xModi->setModified(sal_False);
}
else
{
switch( nRet )
{
case ERRCODE_IO_BROKENPACKAGE:
// TODO/LATER: no way to transport the error outside from the filter!
break;
default:
{
// TODO/LATER: this is completely wrong! Filter code should never call ErrorHandler directly! But for now this is the only way!
ErrorHandler::HandleError( nRet );
if( nRet & ERRCODE_WARNING_MASK )
bRet = sal_True;
}
}
}
}
return bRet;
}
// -----------------------------------------------------------------------------
SvXMLImportContext* ODBFilter::CreateContext( sal_uInt16 nPrefix,
const ::rtl::OUString& rLocalName,
const uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
{
SvXMLImportContext *pContext = 0;
const SvXMLTokenMap& rTokenMap = GetDocElemTokenMap();
switch( rTokenMap.Get( nPrefix, rLocalName ) )
{
case XML_TOK_DOC_SETTINGS:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
pContext = new XMLDocumentSettingsContext( *this, nPrefix, rLocalName,xAttrList );
break;
case XML_TOK_DOC_DATABASE:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
pContext = new OXMLDatabase( *this, nPrefix, rLocalName );
break;
case XML_TOK_DOC_STYLES:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, sal_False);
break;
case XML_TOK_DOC_AUTOSTYLES:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, sal_True);
break;
case XML_TOK_DOC_SCRIPT:
pContext = CreateScriptContext( rLocalName );
break;
}
if ( !pContext )
pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );
return pContext;
}
// -----------------------------------------------------------------------------
void ODBFilter::SetViewSettings(const Sequence<PropertyValue>& aViewProps)
{
const PropertyValue *pIter = aViewProps.getConstArray();
const PropertyValue *pEnd = pIter + aViewProps.getLength();
for (; pIter != pEnd; ++pIter)
{
if ( pIter->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Queries" ) ) )
{
fillPropertyMap(pIter->Value,m_aQuerySettings);
}
else if ( pIter->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Tables" ) ) )
{
fillPropertyMap(pIter->Value,m_aTablesSettings);
}
}
}
// -----------------------------------------------------------------------------
void ODBFilter::SetConfigurationSettings(const Sequence<PropertyValue>& aConfigProps)
{
const PropertyValue *pIter = aConfigProps.getConstArray();
const PropertyValue *pEnd = pIter + aConfigProps.getLength();
for (; pIter != pEnd; ++pIter)
{
if ( pIter->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "layout-settings" ) ) )
{
Sequence<PropertyValue> aWindows;
pIter->Value >>= aWindows;
uno::Reference<XPropertySet> xProp(getDataSource());
if ( xProp.is() )
xProp->setPropertyValue(PROPERTY_LAYOUTINFORMATION,makeAny(aWindows));
}
}
}
// -----------------------------------------------------------------------------
void ODBFilter::fillPropertyMap(const Any& _rValue,TPropertyNameMap& _rMap)
{
Sequence<PropertyValue> aWindows;
_rValue >>= aWindows;
const PropertyValue *pIter = aWindows.getConstArray();
const PropertyValue *pEnd = pIter + aWindows.getLength();
for (; pIter != pEnd; ++pIter)
{
Sequence<PropertyValue> aValue;
pIter->Value >>= aValue;
_rMap.insert(TPropertyNameMap::value_type(pIter->Name,aValue));
}
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetDocElemTokenMap() const
{
if ( !m_pDocElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_OFFICE, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
{ XML_NAMESPACE_OOO, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
{ XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_DOC_STYLES },
{ XML_NAMESPACE_OOO, XML_STYLES, XML_TOK_DOC_STYLES },
{ XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
{ XML_NAMESPACE_OOO, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
{ XML_NAMESPACE_OFFICE, XML_DATABASE, XML_TOK_DOC_DATABASE },
{ XML_NAMESPACE_OOO, XML_DATABASE, XML_TOK_DOC_DATABASE },
{ XML_NAMESPACE_OFFICE, XML_SCRIPTS, XML_TOK_DOC_SCRIPT },
XML_TOKEN_MAP_END
};
m_pDocElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pDocElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetDatabaseElemTokenMap() const
{
if ( !m_pDatabaseElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_DATASOURCE, XML_TOK_DATASOURCE },
{ XML_NAMESPACE_DB, XML_FORMS, XML_TOK_FORMS},
{ XML_NAMESPACE_DB, XML_REPORTS, XML_TOK_REPORTS},
{ XML_NAMESPACE_DB, XML_QUERIES, XML_TOK_QUERIES},
{ XML_NAMESPACE_DB, XML_TABLES, XML_TOK_TABLES},
{ XML_NAMESPACE_DB, XML_TABLE_REPRESENTATIONS, XML_TOK_TABLES},
{ XML_NAMESPACE_DB, XML_SCHEMA_DEFINITION, XML_TOK_SCHEMA_DEFINITION},
XML_TOKEN_MAP_END
};
m_pDatabaseElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pDatabaseElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetDataSourceElemTokenMap() const
{
if ( !m_pDataSourceElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_CONNECTION_RESOURCE, XML_TOK_CONNECTION_RESOURCE},
{ XML_NAMESPACE_DB, XML_SUPPRESS_VERSION_COLUMNS, XML_TOK_SUPPRESS_VERSION_COLUMNS},
{ XML_NAMESPACE_DB, XML_JAVA_DRIVER_CLASS, XML_TOK_JAVA_DRIVER_CLASS},
{ XML_NAMESPACE_DB, XML_EXTENSION, XML_TOK_EXTENSION},
{ XML_NAMESPACE_DB, XML_IS_FIRST_ROW_HEADER_LINE, XML_TOK_IS_FIRST_ROW_HEADER_LINE},
{ XML_NAMESPACE_DB, XML_SHOW_DELETED, XML_TOK_SHOW_DELETED},
{ XML_NAMESPACE_DB, XML_IS_TABLE_NAME_LENGTH_LIMITED, XML_TOK_IS_TABLE_NAME_LENGTH_LIMITED},
{ XML_NAMESPACE_DB, XML_SYSTEM_DRIVER_SETTINGS, XML_TOK_SYSTEM_DRIVER_SETTINGS},
{ XML_NAMESPACE_DB, XML_ENABLE_SQL92_CHECK, XML_TOK_ENABLE_SQL92_CHECK},
{ XML_NAMESPACE_DB, XML_APPEND_TABLE_ALIAS_NAME, XML_TOK_APPEND_TABLE_ALIAS_NAME},
{ XML_NAMESPACE_DB, XML_PARAMETER_NAME_SUBSTITUTION, XML_TOK_PARAMETER_NAME_SUBSTITUTION},
{ XML_NAMESPACE_DB, XML_IGNORE_DRIVER_PRIVILEGES, XML_TOK_IGNORE_DRIVER_PRIVILEGES},
{ XML_NAMESPACE_DB, XML_BOOLEAN_COMPARISON_MODE, XML_TOK_BOOLEAN_COMPARISON_MODE},
{ XML_NAMESPACE_DB, XML_USE_CATALOG, XML_TOK_USE_CATALOG},
{ XML_NAMESPACE_DB, XML_BASE_DN, XML_TOK_BASE_DN},
{ XML_NAMESPACE_DB, XML_MAX_ROW_COUNT, XML_TOK_MAX_ROW_COUNT},
{ XML_NAMESPACE_DB, XML_LOGIN, XML_TOK_LOGIN},
{ XML_NAMESPACE_DB, XML_TABLE_FILTER, XML_TOK_TABLE_FILTER},
{ XML_NAMESPACE_DB, XML_TABLE_TYPE_FILTER, XML_TOK_TABLE_TYPE_FILTER},
{ XML_NAMESPACE_DB, XML_AUTO_INCREMENT, XML_TOK_AUTO_INCREMENT},
{ XML_NAMESPACE_DB, XML_DELIMITER, XML_TOK_DELIMITER},
{ XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTINGS, XML_TOK_DATA_SOURCE_SETTINGS},
{ XML_NAMESPACE_DB, XML_FONT_CHARSET, XML_TOK_FONT_CHARSET},
// db odf 12
{ XML_NAMESPACE_DB, XML_CONNECTION_DATA, XML_TOK_CONNECTION_DATA},
{ XML_NAMESPACE_DB, XML_DATABASE_DESCRIPTION, XML_TOK_DATABASE_DESCRIPTION},
{ XML_NAMESPACE_DB, XML_COMPOUND_DATABASE, XML_TOK_COMPOUND_DATABASE},
{ XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_DB_HREF},
{ XML_NAMESPACE_DB, XML_MEDIA_TYPE, XML_TOK_MEDIA_TYPE},
{ XML_NAMESPACE_DB, XML_TYPE, XML_TOK_DB_TYPE},
{ XML_NAMESPACE_DB, XML_HOSTNAME, XML_TOK_HOSTNAME},
{ XML_NAMESPACE_DB, XML_PORT, XML_TOK_PORT},
{ XML_NAMESPACE_DB, XML_LOCAL_SOCKET, XML_TOK_LOCAL_SOCKET},
{ XML_NAMESPACE_DB, XML_DATABASE_NAME, XML_TOK_DATABASE_NAME},
{ XML_NAMESPACE_DB, XML_DRIVER_SETTINGS, XML_TOK_DRIVER_SETTINGS},
{ XML_NAMESPACE_DB, XML_JAVA_CLASSPATH, XML_TOK_JAVA_CLASSPATH},
{ XML_NAMESPACE_DB, XML_CHARACTER_SET, XML_TOK_CHARACTER_SET},
{ XML_NAMESPACE_DB, XML_APPLICATION_CONNECTION_SETTINGS,XML_TOK_APPLICATION_CONNECTION_SETTINGS},
XML_TOKEN_MAP_END
};
m_pDataSourceElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pDataSourceElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetLoginElemTokenMap() const
{
if ( !m_pLoginElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_USER_NAME, XML_TOK_USER_NAME},
{ XML_NAMESPACE_DB, XML_IS_PASSWORD_REQUIRED, XML_TOK_IS_PASSWORD_REQUIRED},
{ XML_NAMESPACE_DB, XML_USE_SYSTEM_USER, XML_TOK_USE_SYSTEM_USER},
{ XML_NAMESPACE_DB, XML_LOGIN_TIMEOUT, XML_TOK_LOGIN_TIMEOUT},
XML_TOKEN_MAP_END
};
m_pLoginElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pLoginElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetDatabaseDescriptionElemTokenMap() const
{
if ( !m_pDatabaseDescriptionElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_FILE_BASED_DATABASE, XML_TOK_FILE_BASED_DATABASE},
{ XML_NAMESPACE_DB, XML_SERVER_DATABASE, XML_TOK_SERVER_DATABASE},
XML_TOKEN_MAP_END
};
m_pDatabaseDescriptionElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pDatabaseDescriptionElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetDataSourceInfoElemTokenMap() const
{
if ( !m_pDataSourceInfoElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_ADDITIONAL_COLUMN_STATEMENT,XML_TOK_ADDITIONAL_COLUMN_STATEMENT},
{ XML_NAMESPACE_DB, XML_ROW_RETRIEVING_STATEMENT, XML_TOK_ROW_RETRIEVING_STATEMENT},
{ XML_NAMESPACE_DB, XML_STRING, XML_TOK_STRING},
{ XML_NAMESPACE_DB, XML_FIELD, XML_TOK_FIELD},
{ XML_NAMESPACE_DB, XML_DECIMAL, XML_TOK_DECIMAL},
{ XML_NAMESPACE_DB, XML_THOUSAND, XML_TOK_THOUSAND},
{ XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING, XML_TOK_DATA_SOURCE_SETTING},
{ XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE, XML_TOK_DATA_SOURCE_SETTING_VALUE},
{ XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_IS_LIST,XML_TOK_DATA_SOURCE_SETTING_IS_LIST},
{ XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_TYPE, XML_TOK_DATA_SOURCE_SETTING_TYPE},
{ XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_NAME, XML_TOK_DATA_SOURCE_SETTING_NAME},
{ XML_NAMESPACE_DB, XML_FONT_CHARSET, XML_TOK_FONT_CHARSET},
{ XML_NAMESPACE_DB, XML_ENCODING, XML_TOK_ENCODING},
XML_TOKEN_MAP_END
};
m_pDataSourceInfoElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pDataSourceInfoElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetDocumentsElemTokenMap() const
{
if ( !m_pDocumentsElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_COMPONENT, XML_TOK_COMPONENT},
{ XML_NAMESPACE_DB, XML_COMPONENT_COLLECTION, XML_TOK_COMPONENT_COLLECTION},
{ XML_NAMESPACE_DB, XML_QUERY_COLLECTION, XML_TOK_QUERY_COLLECTION},
{ XML_NAMESPACE_DB, XML_QUERY, XML_TOK_QUERY},
{ XML_NAMESPACE_DB, XML_TABLE, XML_TOK_TABLE},
{ XML_NAMESPACE_DB, XML_TABLE_REPRESENTATION, XML_TOK_TABLE},
{ XML_NAMESPACE_DB, XML_COLUMN, XML_TOK_COLUMN},
XML_TOKEN_MAP_END
};
m_pDocumentsElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pDocumentsElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetComponentElemTokenMap() const
{
if ( !m_pComponentElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_HREF },
{ XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_TYPE },
{ XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_SHOW },
{ XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_ACTUATE},
{ XML_NAMESPACE_DB, XML_AS_TEMPLATE, XML_TOK_AS_TEMPLATE },
{ XML_NAMESPACE_DB, XML_NAME, XML_TOK_COMPONENT_NAME },
XML_TOKEN_MAP_END
};
m_pComponentElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pComponentElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetQueryElemTokenMap() const
{
if ( !m_pQueryElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_COMMAND, XML_TOK_COMMAND },
{ XML_NAMESPACE_DB, XML_ESCAPE_PROCESSING, XML_TOK_ESCAPE_PROCESSING },
{ XML_NAMESPACE_DB, XML_NAME, XML_TOK_QUERY_NAME },
{ XML_NAMESPACE_DB, XML_FILTER_STATEMENT, XML_TOK_FILTER_STATEMENT },
{ XML_NAMESPACE_DB, XML_ORDER_STATEMENT, XML_TOK_ORDER_STATEMENT },
{ XML_NAMESPACE_DB, XML_CATALOG_NAME, XML_TOK_CATALOG_NAME },
{ XML_NAMESPACE_DB, XML_SCHEMA_NAME, XML_TOK_SCHEMA_NAME },
{ XML_NAMESPACE_DB, XML_STYLE_NAME, XML_TOK_STYLE_NAME},
{ XML_NAMESPACE_DB, XML_APPLY_FILTER, XML_TOK_APPLY_FILTER},
{ XML_NAMESPACE_DB, XML_APPLY_ORDER, XML_TOK_APPLY_ORDER},
{ XML_NAMESPACE_DB, XML_COLUMNS, XML_TOK_COLUMNS},
XML_TOKEN_MAP_END
};
m_pQueryElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pQueryElemTokenMap;
}
// -----------------------------------------------------------------------------
const SvXMLTokenMap& ODBFilter::GetColumnElemTokenMap() const
{
if ( !m_pColumnElemTokenMap.get() )
{
static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
{
{ XML_NAMESPACE_DB, XML_NAME, XML_TOK_COLUMN_NAME },
{ XML_NAMESPACE_DB, XML_STYLE_NAME, XML_TOK_COLUMN_STYLE_NAME },
{ XML_NAMESPACE_DB, XML_HELP_MESSAGE, XML_TOK_COLUMN_HELP_MESSAGE },
{ XML_NAMESPACE_DB, XML_VISIBILITY, XML_TOK_COLUMN_VISIBILITY },
{ XML_NAMESPACE_DB, XML_DEFAULT_VALUE, XML_TOK_COLUMN_DEFAULT_VALUE },
{ XML_NAMESPACE_DB, XML_TYPE_NAME, XML_TOK_COLUMN_TYPE_NAME },
{ XML_NAMESPACE_DB, XML_VISIBLE, XML_TOK_COLUMN_VISIBLE },
{ XML_NAMESPACE_DB, XML_DEFAULT_CELL_STYLE_NAME, XML_TOK_DEFAULT_CELL_STYLE_NAME },
XML_TOKEN_MAP_END
};
m_pColumnElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
}
return *m_pColumnElemTokenMap;
}
// -----------------------------------------------------------------------------
SvXMLImportContext* ODBFilter::CreateStylesContext(sal_uInt16 _nPrefix,const ::rtl::OUString& rLocalName,
const uno::Reference< XAttributeList>& xAttrList, sal_Bool bIsAutoStyle )
{
SvXMLImportContext *pContext = NULL;
if (!pContext)
{
pContext = new OTableStylesContext(*this, _nPrefix, rLocalName, xAttrList, bIsAutoStyle);
if (bIsAutoStyle)
//xAutoStyles = pContext;
SetAutoStyles((SvXMLStylesContext*)pContext);
else
//xStyles = pContext;
SetStyles((SvXMLStylesContext*)pContext);
}
return pContext;
}
// -----------------------------------------------------------------------------
SvXMLImportContext* ODBFilter::CreateScriptContext( const ::rtl::OUString& _rLocalName )
{
return new XMLScriptContext( *this, XML_NAMESPACE_OFFICE, _rLocalName, GetModel() );
}
// -----------------------------------------------------------------------------
UniReference < XMLPropertySetMapper > ODBFilter::GetTableStylesPropertySetMapper() const
{
if ( !m_xTableStylesPropertySetMapper.is() )
{
m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper();
}
return m_xTableStylesPropertySetMapper;
}
// -----------------------------------------------------------------------------
UniReference < XMLPropertySetMapper > ODBFilter::GetColumnStylesPropertySetMapper() const
{
if ( !m_xColumnStylesPropertySetMapper.is() )
{
m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper();
}
return m_xColumnStylesPropertySetMapper;
}
// -----------------------------------------------------------------------------
UniReference < XMLPropertySetMapper > ODBFilter::GetCellStylesPropertySetMapper() const
{
if ( !m_xCellStylesPropertySetMapper.is() )
{
m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper();
}
return m_xCellStylesPropertySetMapper;
}
// -----------------------------------------------------------------------------
void ODBFilter::setPropertyInfo()
{
Reference<XPropertySet> xDataSource(getDataSource());
if ( !xDataSource.is() )
return;
::connectivity::DriversConfig aDriverConfig(getServiceFactory());
const ::rtl::OUString sURL = ::comphelper::getString(xDataSource->getPropertyValue(PROPERTY_URL));
::comphelper::NamedValueCollection aDataSourceSettings = aDriverConfig.getProperties( sURL );
Sequence<PropertyValue> aInfo;
if ( !m_aInfoSequence.empty() )
aInfo = Sequence<PropertyValue>(&(*m_aInfoSequence.begin()),m_aInfoSequence.size());
aDataSourceSettings.merge( ::comphelper::NamedValueCollection( aInfo ), true );
aDataSourceSettings >>= aInfo;
if ( aInfo.getLength() )
{
try
{
xDataSource->setPropertyValue(PROPERTY_INFO,makeAny(aInfo));
}
catch(Exception)
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
// -----------------------------------------------------------------------------
}// dbaxml
// -----------------------------------------------------------------------------