LCOV - code coverage report
Current view: top level - dbaccess/source/filter/xml - xmlfilter.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 208 262 79.4 %
Date: 2015-06-13 12:38:46 Functions: 29 31 93.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/config.h>
      21             : 
      22             : #include <boost/noncopyable.hpp>
      23             : #include <com/sun/star/util/MeasureUnit.hpp>
      24             : #include <com/sun/star/packages/zip/ZipIOException.hpp>
      25             : #include <com/sun/star/embed/ElementModes.hpp>
      26             : #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
      27             : #include "xmlfilter.hxx"
      28             : #include "xmlservices.hxx"
      29             : #include "flt_reghelper.hxx"
      30             : #include <vcl/svapp.hxx>
      31             : #include <vcl/window.hxx>
      32             : #include <xmloff/xmlnmspe.hxx>
      33             : #include <xmloff/xmlscripti.hxx>
      34             : #include <xmloff/xmltoken.hxx>
      35             : #include <xmloff/txtimp.hxx>
      36             : #include <xmloff/nmspmap.hxx>
      37             : #include <com/sun/star/xml/sax/InputSource.hpp>
      38             : #include <com/sun/star/xml/sax/Parser.hpp>
      39             : #include <xmloff/ProgressBarHelper.hxx>
      40             : #include <sfx2/docfile.hxx>
      41             : #include <com/sun/star/io/XInputStream.hpp>
      42             : #include <com/sun/star/uno/XNamingService.hpp>
      43             : #include "xmlDatabase.hxx"
      44             : #include "xmlEnums.hxx"
      45             : #include "xmlstrings.hrc"
      46             : #include <xmloff/DocumentSettingsContext.hxx>
      47             : #include "xmlStyleImport.hxx"
      48             : #include <xmloff/xmluconv.hxx>
      49             : #include "xmlHelper.hxx"
      50             : #include <com/sun/star/util/XModifiable.hpp>
      51             : #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
      52             : #include <osl/mutex.hxx>
      53             : #include <svtools/sfxecode.hxx>
      54             : #include <toolkit/helper/vclunohelper.hxx>
      55             : #include <tools/diagnose_ex.h>
      56             : #include <osl/diagnose.h>
      57             : #include <comphelper/processfactory.hxx>
      58             : #include <comphelper/namedvaluecollection.hxx>
      59             : #include <comphelper/uno3.hxx>
      60             : #include <cppuhelper/exc_hlp.hxx>
      61             : #include <connectivity/DriversConfig.hxx>
      62             : #include "dsntypes.hxx"
      63             : #include <rtl/strbuf.hxx>
      64             : 
      65             : using namespace ::com::sun::star;
      66             : 
      67          23 : extern "C" void SAL_CALL createRegistryInfo_ODBFilter( )
      68             : {
      69          23 :     static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBFilter > aAutoRegistration;
      70          23 : }
      71             : 
      72             : namespace dbaxml
      73             : {
      74             :     sal_Char const sXML_np__db[] = "_db";
      75             :     sal_Char const sXML_np___db[] = "__db";
      76             : 
      77             :     using namespace ::com::sun::star::util;
      78             :     /// read a component (file + filter version)
      79          32 : sal_Int32 ReadThroughComponent(
      80             :     const uno::Reference<XInputStream>& xInputStream,
      81             :     const uno::Reference<XComponent>& xModelComponent,
      82             :     const uno::Reference<XComponentContext> & rxContext,
      83             :     const uno::Reference< XDocumentHandler >& _xFilter )
      84             : {
      85             :     OSL_ENSURE(xInputStream.is(), "input stream missing");
      86             :     OSL_ENSURE(xModelComponent.is(), "document missing");
      87             :     OSL_ENSURE(rxContext.is(), "factory missing");
      88             : 
      89             :     // prepare ParserInputSrouce
      90          32 :     InputSource aParserInput;
      91          32 :     aParserInput.aInputStream = xInputStream;
      92             : 
      93             :     // get parser
      94          64 :     uno::Reference< XParser > xParser = Parser::create(rxContext);
      95             :     SAL_INFO("dbaccess", "parser created" );
      96             : 
      97             :     // get filter
      98             :     OSL_ENSURE( _xFilter.is(), "Can't instantiate filter component." );
      99          32 :     if( !_xFilter.is() )
     100           0 :         return 1;
     101             : 
     102             :     // connect parser and filter
     103          32 :     xParser->setDocumentHandler( _xFilter );
     104             : 
     105             :     // connect model and filter
     106          64 :     uno::Reference < XImporter > xImporter( _xFilter, UNO_QUERY );
     107          32 :     xImporter->setTargetDocument( xModelComponent );
     108             : 
     109             :     // finally, parser the stream
     110             :     try
     111             :     {
     112          32 :         xParser->parseStream( aParserInput );
     113             :     }
     114           0 :     catch (const SAXParseException& r)
     115             :     {
     116             : #if OSL_DEBUG_LEVEL > 1
     117             :         SAL_WARN("dbaccess", "SAX parse exception catched while importing:\n" << r.Message << r.LineNumber << "," << r.ColumnNumber);
     118             : #else
     119             :         (void)r;
     120             : #endif
     121           0 :         return 1;
     122             :     }
     123           0 :     catch (const SAXException&)
     124             :     {
     125           0 :         return 1;
     126             :     }
     127           0 :     catch (const packages::zip::ZipIOException&)
     128             :     {
     129           0 :         return ERRCODE_IO_BROKENPACKAGE;
     130             :     }
     131           0 :     catch (const Exception&)
     132             :     {
     133             :         DBG_UNHANDLED_EXCEPTION();
     134             :     }
     135             : 
     136             :     // success!
     137          64 :     return 0;
     138             : }
     139             : 
     140             : /// read a component (storage version)
     141          32 : sal_Int32 ReadThroughComponent(
     142             :     uno::Reference< embed::XStorage > xStorage,
     143             :     const uno::Reference<XComponent>& xModelComponent,
     144             :     const sal_Char* pStreamName,
     145             :     const sal_Char* pCompatibilityStreamName,
     146             :     const uno::Reference<XComponentContext> & rxContext,
     147             :     const uno::Reference< XDocumentHandler >& _xFilter)
     148             : {
     149             :     OSL_ENSURE( xStorage.is(), "Need storage!");
     150             :     OSL_ENSURE(NULL != pStreamName, "Please, please, give me a name!");
     151             : 
     152          32 :     if ( xStorage.is() )
     153             :     {
     154          32 :         uno::Reference< io::XStream > xDocStream;
     155             : 
     156             :         try
     157             :         {
     158          32 :             bool bEncrypted = false;
     159             :             // open stream (and set parser input)
     160          32 :         OUString sStreamName = OUString::createFromAscii(pStreamName);
     161          32 :             if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
     162             :             {
     163             :                 // stream name not found! Then try the compatibility name.
     164             :                 // if no stream can be opened, return immediately with OK signal
     165             : 
     166             :                 // do we even have an alternative name?
     167           0 :                 if ( NULL == pCompatibilityStreamName )
     168           0 :                     return 0;
     169             : 
     170             :                 // if so, does the stream exist?
     171           0 :                 sStreamName = OUString::createFromAscii(pCompatibilityStreamName);
     172           0 :                 if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
     173           0 :                     return 0;
     174             :             }
     175             : 
     176             :             // get input stream
     177          32 :             xDocStream = xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
     178             : 
     179          64 :             uno::Reference< beans::XPropertySet > xProps( xDocStream, uno::UNO_QUERY_THROW );
     180          64 :             uno::Any aAny = xProps->getPropertyValue("Encrypted");
     181          64 :             aAny >>= bEncrypted;
     182             :         }
     183           0 :         catch (const packages::WrongPasswordException&)
     184             :         {
     185           0 :             return ERRCODE_SFX_WRONGPASSWORD;
     186             :         }
     187           0 :         catch (const uno::Exception&)
     188             :         {
     189           0 :             return 1; // TODO/LATER: error handling
     190             :         }
     191             : 
     192          64 :         uno::Reference< XInputStream > xInputStream = xDocStream->getInputStream();
     193             :         // read from the stream
     194             :         return ReadThroughComponent( xInputStream
     195             :                                     ,xModelComponent
     196             :                                     ,rxContext
     197          64 :                                     ,_xFilter );
     198             :     }
     199             : 
     200             :     // TODO/LATER: better error handling
     201           0 :     return 1;
     202             : }
     203             : 
     204             : // - ODBFilter -
     205             : 
     206          17 : ODBFilter::ODBFilter( const uno::Reference< XComponentContext >& _rxContext )
     207             :     : SvXMLImport(_rxContext, getImplementationName_Static())
     208             :     , m_nPreviewMode(0)
     209          17 :     , m_bNewFormat(false)
     210             : {
     211             : 
     212          17 :     GetMM100UnitConverter().SetCoreMeasureUnit(util::MeasureUnit::MM_10TH);
     213          17 :     GetMM100UnitConverter().SetXMLMeasureUnit(util::MeasureUnit::CM);
     214          17 :     GetNamespaceMap().Add( OUString ( sXML_np__db ),
     215          17 :                         GetXMLToken(XML_N_DB),
     216          34 :                         XML_NAMESPACE_DB );
     217             : 
     218          17 :     GetNamespaceMap().Add( OUString ( sXML_np___db ),
     219          17 :                         GetXMLToken(XML_N_DB_OASIS),
     220          34 :                         XML_NAMESPACE_DB );
     221          17 : }
     222             : 
     223          34 : ODBFilter::~ODBFilter() throw()
     224             : {
     225             : 
     226          34 : }
     227             : 
     228          63 : OUString ODBFilter::getImplementationName_Static()
     229             :     throw (css::uno::RuntimeException)
     230             : {
     231          63 :     return OUString("com.sun.star.comp.sdb.DBFilter");
     232             : }
     233             : 
     234          23 : css::uno::Sequence<OUString> ODBFilter::getSupportedServiceNames_Static()
     235             :     throw (css::uno::RuntimeException)
     236             : {
     237          23 :     css::uno::Sequence<OUString> s(1);
     238          23 :     s[0] = "com.sun.star.document.ImportFilter";
     239          23 :     return s;
     240             : }
     241             : 
     242             : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
     243          17 :     SAL_CALL ODBFilter::Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB)
     244             : {
     245          17 :     return static_cast< XServiceInfo* >(new ODBFilter( comphelper::getComponentContext(_rxORB)));
     246             : }
     247             : 
     248          16 : sal_Bool SAL_CALL ODBFilter::filter( const Sequence< PropertyValue >& rDescriptor )
     249             :     throw (RuntimeException, std::exception)
     250             : {
     251          16 :     uno::Reference< ::com::sun::star::awt::XWindow > xWindow;
     252             :     {
     253          16 :         SolarMutexGuard aGuard;
     254          16 :         vcl::Window*     pFocusWindow = Application::GetFocusWindow();
     255          16 :         xWindow = VCLUnoHelper::GetInterface( pFocusWindow );
     256          16 :         if( pFocusWindow )
     257           5 :             pFocusWindow->EnterWait();
     258             :     }
     259          16 :     bool    bRet = false;
     260             : 
     261          16 :     if ( GetModel().is() )
     262          16 :         bRet = implImport( rDescriptor );
     263             : 
     264          16 :     if ( xWindow.is() )
     265             :     {
     266           5 :         SolarMutexGuard aGuard;
     267           5 :         vcl::Window* pFocusWindow = VCLUnoHelper::GetWindow( xWindow );
     268           5 :         if ( pFocusWindow )
     269           5 :             pFocusWindow->LeaveWait();
     270             :     }
     271             : 
     272          16 :     return bRet;
     273             : }
     274             : 
     275          16 : bool ODBFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
     276             :     throw (RuntimeException)
     277             : {
     278          16 :     OUString sFileName;
     279          32 :     ::comphelper::NamedValueCollection aMediaDescriptor( rDescriptor );
     280             : 
     281          32 :     uno::Reference<embed::XStorage> xStorage = GetSourceStorage();
     282             : 
     283          16 :     bool bRet = true;
     284          16 :     if (!xStorage.is())
     285             :     {
     286          16 :         if (aMediaDescriptor.has("URL"))
     287          16 :             sFileName = aMediaDescriptor.getOrDefault("URL", OUString());
     288          16 :         if (sFileName.isEmpty() && aMediaDescriptor.has("FileName"))
     289           0 :             sFileName = aMediaDescriptor.getOrDefault("FileName", sFileName);
     290             : 
     291             :         OSL_ENSURE(!sFileName.isEmpty(), "ODBFilter::implImport: no URL given!");
     292          16 :         bRet = !sFileName.isEmpty();
     293             :     }
     294             : 
     295          16 :     if ( bRet )
     296             :     {
     297          16 :         uno::Reference<XComponent> xCom(GetModel(),UNO_QUERY);
     298             : 
     299          32 :         SfxMediumRef pMedium(0);
     300          16 :         if (!xStorage.is())
     301             :         {
     302          16 :             OUString sStreamRelPath;
     303          16 :             if (sFileName.startsWithIgnoreAsciiCase("vnd.sun.star.pkg:"))
     304             :             {
     305             :                 // In this case the host contains the real path, and the path is the embedded stream name.
     306           1 :                 INetURLObject aURL(sFileName);
     307           1 :                 sFileName = aURL.GetHost(INetURLObject::DECODE_WITH_CHARSET);
     308           1 :                 sStreamRelPath = aURL.GetURLPath(INetURLObject::DECODE_WITH_CHARSET);
     309           1 :                 if (sStreamRelPath.startsWith("/"))
     310           1 :                     sStreamRelPath = sStreamRelPath.copy(1);
     311             :             }
     312             : 
     313          16 :             pMedium = new SfxMedium(sFileName, (StreamMode::READ | StreamMode::NOCREATE));
     314             :             try
     315             :             {
     316          16 :                 xStorage.set(pMedium->GetStorage(false), UNO_QUERY_THROW);
     317             : 
     318          16 :                 if (!sStreamRelPath.isEmpty())
     319           1 :                     xStorage = xStorage->openStorageElement(sStreamRelPath, embed::ElementModes::READ);
     320             :             }
     321           0 :             catch (const Exception&)
     322             :             {
     323           0 :                 Any aError = ::cppu::getCaughtException();
     324           0 :                 if  (aError.isExtractableTo(::cppu::UnoType<RuntimeException>::get()))
     325           0 :                     throw;
     326           0 :                 throw lang::WrappedTargetRuntimeException(OUString(), *this, aError);
     327          16 :             }
     328             :         }
     329             : 
     330          32 :         uno::Reference<sdb::XOfficeDatabaseDocument> xOfficeDoc(GetModel(),UNO_QUERY_THROW);
     331          16 :         m_xDataSource.set(xOfficeDoc->getDataSource(),UNO_QUERY_THROW);
     332          32 :         uno::Reference< XNumberFormatsSupplier > xNum(m_xDataSource->getPropertyValue(PROPERTY_NUMBERFORMATSSUPPLIER),UNO_QUERY);
     333          16 :         SetNumberFormatsSupplier(xNum);
     334             : 
     335          32 :         uno::Reference<XComponent> xModel(GetModel(),UNO_QUERY);
     336             :         sal_Int32 nRet = ReadThroughComponent( xStorage
     337             :                                     ,xModel
     338             :                                     ,"settings.xml"
     339             :                                     ,"Settings.xml"
     340             :                                     ,GetComponentContext()
     341             :                                     ,this
     342          16 :                                     );
     343             : 
     344          16 :         if ( nRet == 0 )
     345             :             nRet = ReadThroughComponent( xStorage
     346             :                                     ,xModel
     347             :                                     ,"content.xml"
     348             :                                     ,"Content.xml"
     349             :                                     ,GetComponentContext()
     350             :                                     ,this
     351          16 :                                     );
     352             : 
     353          16 :         bRet = nRet == 0;
     354             : 
     355          16 :         if ( bRet )
     356             :         {
     357          16 :             uno::Reference< XModifiable > xModi(GetModel(),UNO_QUERY);
     358          16 :             if ( xModi.is() )
     359          16 :                 xModi->setModified(sal_False);
     360             :         }
     361             :         else
     362             :         {
     363           0 :             switch( nRet )
     364             :             {
     365             :                 case ERRCODE_IO_BROKENPACKAGE:
     366             :                     // TODO/LATER: no way to transport the error outside from the filter!
     367           0 :                     break;
     368             :                 default:
     369             :                 {
     370             :                     // TODO/LATER: this is completely wrong! Filter code should never call ErrorHandler directly! But for now this is the only way!
     371           0 :                     ErrorHandler::HandleError( nRet );
     372           0 :                     if( nRet & ERRCODE_WARNING_MASK )
     373           0 :                         bRet = true;
     374             :                 }
     375             :             }
     376          16 :         }
     377             :     }
     378             : 
     379          32 :     return bRet;
     380             : }
     381             : 
     382         128 : SvXMLImportContext* ODBFilter::CreateContext( sal_uInt16 nPrefix,
     383             :                                       const OUString& rLocalName,
     384             :                                       const uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
     385             : {
     386         128 :     SvXMLImportContext *pContext = 0;
     387             : 
     388         128 :     const SvXMLTokenMap& rTokenMap = GetDocElemTokenMap();
     389         128 :     switch( rTokenMap.Get( nPrefix, rLocalName ) )
     390             :     {
     391             :         case XML_TOK_DOC_SETTINGS:
     392           4 :             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
     393           4 :             pContext = new XMLDocumentSettingsContext( *this, nPrefix, rLocalName,xAttrList );
     394           4 :             break;
     395             :         case XML_TOK_DOC_DATABASE:
     396          16 :             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
     397          16 :             pContext = new OXMLDatabase( *this, nPrefix, rLocalName );
     398          16 :             break;
     399             :         case XML_TOK_DOC_STYLES:
     400           0 :             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
     401           0 :             pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, false);
     402           0 :             break;
     403             :         case XML_TOK_DOC_AUTOSTYLES:
     404          16 :             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
     405          16 :             pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, true);
     406          16 :             break;
     407             :         case XML_TOK_DOC_SCRIPT:
     408          16 :             pContext = CreateScriptContext( rLocalName );
     409          16 :             break;
     410             :     }
     411             : 
     412         128 :     if ( !pContext )
     413          76 :         pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );
     414             : 
     415         128 :     return pContext;
     416             : }
     417             : 
     418           4 : void ODBFilter::SetViewSettings(const Sequence<PropertyValue>& aViewProps)
     419             : {
     420           4 :     const PropertyValue *pIter = aViewProps.getConstArray();
     421           4 :     const PropertyValue *pEnd = pIter + aViewProps.getLength();
     422           8 :     for (; pIter != pEnd; ++pIter)
     423             :     {
     424           4 :         if ( pIter->Name == "Queries" )
     425             :         {
     426           4 :             fillPropertyMap(pIter->Value,m_aQuerySettings);
     427             :         }
     428           0 :         else if ( pIter->Name == "Tables" )
     429             :         {
     430           0 :             fillPropertyMap(pIter->Value,m_aTablesSettings);
     431             :         }
     432             :     }
     433           4 : }
     434             : 
     435           0 : void ODBFilter::SetConfigurationSettings(const Sequence<PropertyValue>& aConfigProps)
     436             : {
     437           0 :     const PropertyValue *pIter = aConfigProps.getConstArray();
     438           0 :     const PropertyValue *pEnd = pIter + aConfigProps.getLength();
     439           0 :     for (; pIter != pEnd; ++pIter)
     440             :     {
     441           0 :         if ( pIter->Name == "layout-settings" )
     442             :         {
     443           0 :             Sequence<PropertyValue> aWindows;
     444           0 :             pIter->Value >>= aWindows;
     445           0 :             uno::Reference<XPropertySet> xProp(getDataSource());
     446           0 :             if ( xProp.is() )
     447           0 :                 xProp->setPropertyValue(PROPERTY_LAYOUTINFORMATION,makeAny(aWindows));
     448             :         }
     449             :     }
     450           0 : }
     451             : 
     452           4 : void ODBFilter::fillPropertyMap(const Any& _rValue,TPropertyNameMap& _rMap)
     453             : {
     454           4 :     Sequence<PropertyValue> aWindows;
     455           4 :     _rValue >>= aWindows;
     456           4 :     const PropertyValue *pIter = aWindows.getConstArray();
     457           4 :     const PropertyValue *pEnd = pIter + aWindows.getLength();
     458           4 :     for (; pIter != pEnd; ++pIter)
     459             :     {
     460           0 :         Sequence<PropertyValue> aValue;
     461           0 :         pIter->Value >>= aValue;
     462           0 :         _rMap.insert(TPropertyNameMap::value_type(pIter->Name,aValue));
     463           4 :     }
     464             : 
     465           4 : }
     466             : 
     467         128 : const SvXMLTokenMap& ODBFilter::GetDocElemTokenMap() const
     468             : {
     469         128 :     if ( !m_pDocElemTokenMap.get() )
     470             :     {
     471             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     472             :         {
     473             :             { XML_NAMESPACE_OFFICE, XML_SETTINGS,           XML_TOK_DOC_SETTINGS    },
     474             :             { XML_NAMESPACE_OOO,    XML_SETTINGS,           XML_TOK_DOC_SETTINGS    },
     475             :             { XML_NAMESPACE_OFFICE, XML_STYLES,             XML_TOK_DOC_STYLES      },
     476             :             { XML_NAMESPACE_OOO,    XML_STYLES,             XML_TOK_DOC_STYLES      },
     477             :             { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES,   XML_TOK_DOC_AUTOSTYLES  },
     478             :             { XML_NAMESPACE_OOO,    XML_AUTOMATIC_STYLES,   XML_TOK_DOC_AUTOSTYLES  },
     479             :             { XML_NAMESPACE_OFFICE, XML_DATABASE,           XML_TOK_DOC_DATABASE    },
     480             :             { XML_NAMESPACE_OOO,    XML_DATABASE,           XML_TOK_DOC_DATABASE    },
     481             :             { XML_NAMESPACE_OFFICE, XML_SCRIPTS,            XML_TOK_DOC_SCRIPT      },
     482             :             XML_TOKEN_MAP_END
     483             :         };
     484          16 :         m_pDocElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     485             :     }
     486         128 :     return *m_pDocElemTokenMap;
     487             : }
     488             : 
     489          36 : const SvXMLTokenMap& ODBFilter::GetDatabaseElemTokenMap() const
     490             : {
     491          36 :     if ( !m_pDatabaseElemTokenMap.get() )
     492             :     {
     493             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     494             :         {
     495             :             { XML_NAMESPACE_DB, XML_DATASOURCE,             XML_TOK_DATASOURCE  },
     496             :             { XML_NAMESPACE_DB, XML_FORMS,                  XML_TOK_FORMS},
     497             :             { XML_NAMESPACE_DB, XML_REPORTS,                XML_TOK_REPORTS},
     498             :             { XML_NAMESPACE_DB, XML_QUERIES,                XML_TOK_QUERIES},
     499             :             { XML_NAMESPACE_DB, XML_TABLES,                 XML_TOK_TABLES},
     500             :             { XML_NAMESPACE_DB, XML_TABLE_REPRESENTATIONS,  XML_TOK_TABLES},
     501             :             { XML_NAMESPACE_DB, XML_SCHEMA_DEFINITION,      XML_TOK_SCHEMA_DEFINITION},
     502             :             XML_TOKEN_MAP_END
     503             :         };
     504          16 :         m_pDatabaseElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     505             :     }
     506          36 :     return *m_pDatabaseElemTokenMap;
     507             : }
     508             : 
     509         160 : const SvXMLTokenMap& ODBFilter::GetDataSourceElemTokenMap() const
     510             : {
     511         160 :     if ( !m_pDataSourceElemTokenMap.get() )
     512             :     {
     513             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     514             :         {
     515             :             { XML_NAMESPACE_DB,     XML_CONNECTION_RESOURCE,            XML_TOK_CONNECTION_RESOURCE},
     516             :             { XML_NAMESPACE_DB,     XML_SUPPRESS_VERSION_COLUMNS,       XML_TOK_SUPPRESS_VERSION_COLUMNS},
     517             :             { XML_NAMESPACE_DB,     XML_JAVA_DRIVER_CLASS,              XML_TOK_JAVA_DRIVER_CLASS},
     518             :             { XML_NAMESPACE_DB,     XML_EXTENSION,                      XML_TOK_EXTENSION},
     519             :             { XML_NAMESPACE_DB,     XML_IS_FIRST_ROW_HEADER_LINE,       XML_TOK_IS_FIRST_ROW_HEADER_LINE},
     520             :             { XML_NAMESPACE_DB,     XML_SHOW_DELETED,                   XML_TOK_SHOW_DELETED},
     521             :             { XML_NAMESPACE_DB,     XML_IS_TABLE_NAME_LENGTH_LIMITED,   XML_TOK_IS_TABLE_NAME_LENGTH_LIMITED},
     522             :             { XML_NAMESPACE_DB,     XML_SYSTEM_DRIVER_SETTINGS,         XML_TOK_SYSTEM_DRIVER_SETTINGS},
     523             :             { XML_NAMESPACE_DB,     XML_ENABLE_SQL92_CHECK,             XML_TOK_ENABLE_SQL92_CHECK},
     524             :             { XML_NAMESPACE_DB,     XML_APPEND_TABLE_ALIAS_NAME,        XML_TOK_APPEND_TABLE_ALIAS_NAME},
     525             :             { XML_NAMESPACE_DB,     XML_PARAMETER_NAME_SUBSTITUTION,    XML_TOK_PARAMETER_NAME_SUBSTITUTION},
     526             :             { XML_NAMESPACE_DB,     XML_IGNORE_DRIVER_PRIVILEGES,       XML_TOK_IGNORE_DRIVER_PRIVILEGES},
     527             :             { XML_NAMESPACE_DB,     XML_BOOLEAN_COMPARISON_MODE,        XML_TOK_BOOLEAN_COMPARISON_MODE},
     528             :             { XML_NAMESPACE_DB,     XML_USE_CATALOG,                    XML_TOK_USE_CATALOG},
     529             :             { XML_NAMESPACE_DB,     XML_BASE_DN,                        XML_TOK_BASE_DN},
     530             :             { XML_NAMESPACE_DB,     XML_MAX_ROW_COUNT,                  XML_TOK_MAX_ROW_COUNT},
     531             :             { XML_NAMESPACE_DB,     XML_LOGIN,                          XML_TOK_LOGIN},
     532             :             { XML_NAMESPACE_DB,     XML_TABLE_FILTER,                   XML_TOK_TABLE_FILTER},
     533             :             { XML_NAMESPACE_DB,     XML_TABLE_TYPE_FILTER,              XML_TOK_TABLE_TYPE_FILTER},
     534             :             { XML_NAMESPACE_DB,     XML_AUTO_INCREMENT,                 XML_TOK_AUTO_INCREMENT},
     535             :             { XML_NAMESPACE_DB,     XML_DELIMITER,                      XML_TOK_DELIMITER},
     536             :             { XML_NAMESPACE_DB,     XML_DATA_SOURCE_SETTINGS,           XML_TOK_DATA_SOURCE_SETTINGS},
     537             :             { XML_NAMESPACE_DB,     XML_FONT_CHARSET,                   XML_TOK_FONT_CHARSET},
     538             :             // db odf 12
     539             :             { XML_NAMESPACE_DB,     XML_CONNECTION_DATA,                XML_TOK_CONNECTION_DATA},
     540             :             { XML_NAMESPACE_DB,     XML_DATABASE_DESCRIPTION,           XML_TOK_DATABASE_DESCRIPTION},
     541             :             { XML_NAMESPACE_DB,     XML_COMPOUND_DATABASE,              XML_TOK_COMPOUND_DATABASE},
     542             :             { XML_NAMESPACE_XLINK,  XML_HREF,                           XML_TOK_DB_HREF},
     543             :             { XML_NAMESPACE_DB,     XML_MEDIA_TYPE,                     XML_TOK_MEDIA_TYPE},
     544             :             { XML_NAMESPACE_DB,     XML_TYPE,                           XML_TOK_DB_TYPE},
     545             :             { XML_NAMESPACE_DB,     XML_HOSTNAME,                       XML_TOK_HOSTNAME},
     546             :             { XML_NAMESPACE_DB,     XML_PORT,                           XML_TOK_PORT},
     547             :             { XML_NAMESPACE_DB,     XML_LOCAL_SOCKET,                   XML_TOK_LOCAL_SOCKET},
     548             :             { XML_NAMESPACE_DB,     XML_DATABASE_NAME,                  XML_TOK_DATABASE_NAME},
     549             :             { XML_NAMESPACE_DB,     XML_DRIVER_SETTINGS,                XML_TOK_DRIVER_SETTINGS},
     550             :             { XML_NAMESPACE_DB,     XML_JAVA_CLASSPATH,                 XML_TOK_JAVA_CLASSPATH},
     551             :             { XML_NAMESPACE_DB,     XML_CHARACTER_SET,                  XML_TOK_CHARACTER_SET},
     552             :             { XML_NAMESPACE_DB,     XML_APPLICATION_CONNECTION_SETTINGS,XML_TOK_APPLICATION_CONNECTION_SETTINGS},
     553             :             XML_TOKEN_MAP_END
     554             :         };
     555          16 :         m_pDataSourceElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     556             :     }
     557         160 :     return *m_pDataSourceElemTokenMap;
     558             : }
     559             : 
     560          16 : const SvXMLTokenMap& ODBFilter::GetLoginElemTokenMap() const
     561             : {
     562          16 :     if ( !m_pLoginElemTokenMap.get() )
     563             :     {
     564             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     565             :         {
     566             :             { XML_NAMESPACE_DB, XML_USER_NAME,              XML_TOK_USER_NAME},
     567             :             { XML_NAMESPACE_DB, XML_IS_PASSWORD_REQUIRED,   XML_TOK_IS_PASSWORD_REQUIRED},
     568             :             { XML_NAMESPACE_DB, XML_USE_SYSTEM_USER,        XML_TOK_USE_SYSTEM_USER},
     569             :             { XML_NAMESPACE_DB, XML_LOGIN_TIMEOUT,          XML_TOK_LOGIN_TIMEOUT},
     570             :             XML_TOKEN_MAP_END
     571             :         };
     572          16 :         m_pLoginElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     573             :     }
     574          16 :     return *m_pLoginElemTokenMap;
     575             : }
     576             : 
     577           9 : const SvXMLTokenMap& ODBFilter::GetDatabaseDescriptionElemTokenMap() const
     578             : {
     579           9 :     if ( !m_pDatabaseDescriptionElemTokenMap.get() )
     580             :     {
     581             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     582             :         {
     583             :             { XML_NAMESPACE_DB, XML_FILE_BASED_DATABASE,    XML_TOK_FILE_BASED_DATABASE},
     584             :             { XML_NAMESPACE_DB, XML_SERVER_DATABASE,        XML_TOK_SERVER_DATABASE},
     585             :             XML_TOKEN_MAP_END
     586             :         };
     587           9 :         m_pDatabaseDescriptionElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     588             :     }
     589           9 :     return *m_pDatabaseDescriptionElemTokenMap;
     590             : }
     591             : 
     592           7 : const SvXMLTokenMap& ODBFilter::GetDataSourceInfoElemTokenMap() const
     593             : {
     594           7 :     if ( !m_pDataSourceInfoElemTokenMap.get() )
     595             :     {
     596             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     597             :         {
     598             :             { XML_NAMESPACE_DB, XML_ADDITIONAL_COLUMN_STATEMENT,XML_TOK_ADDITIONAL_COLUMN_STATEMENT},
     599             :             { XML_NAMESPACE_DB, XML_ROW_RETRIEVING_STATEMENT,   XML_TOK_ROW_RETRIEVING_STATEMENT},
     600             :             { XML_NAMESPACE_DB, XML_STRING,                     XML_TOK_STRING},
     601             :             { XML_NAMESPACE_DB, XML_FIELD,                      XML_TOK_FIELD},
     602             :             { XML_NAMESPACE_DB, XML_DECIMAL,                    XML_TOK_DECIMAL},
     603             :             { XML_NAMESPACE_DB, XML_THOUSAND,                   XML_TOK_THOUSAND},
     604             :             { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING,        XML_TOK_DATA_SOURCE_SETTING},
     605             :             { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE,  XML_TOK_DATA_SOURCE_SETTING_VALUE},
     606             :             { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_IS_LIST,XML_TOK_DATA_SOURCE_SETTING_IS_LIST},
     607             :             { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_TYPE,   XML_TOK_DATA_SOURCE_SETTING_TYPE},
     608             :             { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_NAME,   XML_TOK_DATA_SOURCE_SETTING_NAME},
     609             :             { XML_NAMESPACE_DB, XML_FONT_CHARSET,               XML_TOK_FONT_CHARSET},
     610             :             { XML_NAMESPACE_DB, XML_ENCODING,                   XML_TOK_ENCODING},
     611             :             XML_TOKEN_MAP_END
     612             :         };
     613           7 :         m_pDataSourceInfoElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     614             :     }
     615           7 :     return *m_pDataSourceInfoElemTokenMap;
     616             : }
     617             : 
     618         244 : const SvXMLTokenMap& ODBFilter::GetDocumentsElemTokenMap() const
     619             : {
     620         244 :     if ( !m_pDocumentsElemTokenMap.get() )
     621             :     {
     622             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     623             :         {
     624             :             { XML_NAMESPACE_DB, XML_COMPONENT,              XML_TOK_COMPONENT},
     625             :             { XML_NAMESPACE_DB, XML_COMPONENT_COLLECTION,   XML_TOK_COMPONENT_COLLECTION},
     626             :             { XML_NAMESPACE_DB, XML_QUERY_COLLECTION,       XML_TOK_QUERY_COLLECTION},
     627             :             { XML_NAMESPACE_DB, XML_QUERY,                  XML_TOK_QUERY},
     628             :             { XML_NAMESPACE_DB, XML_TABLE,                  XML_TOK_TABLE},
     629             :             { XML_NAMESPACE_DB, XML_TABLE_REPRESENTATION,   XML_TOK_TABLE},
     630             :             { XML_NAMESPACE_DB, XML_COLUMN,                 XML_TOK_COLUMN},
     631             :             XML_TOKEN_MAP_END
     632             :         };
     633          12 :         m_pDocumentsElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     634             :     }
     635         244 :     return *m_pDocumentsElemTokenMap;
     636             : }
     637             : 
     638          15 : const SvXMLTokenMap& ODBFilter::GetComponentElemTokenMap() const
     639             : {
     640          15 :     if ( !m_pComponentElemTokenMap.get() )
     641             :     {
     642             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     643             :         {
     644             :             { XML_NAMESPACE_XLINK,  XML_HREF,           XML_TOK_HREF    },
     645             :             { XML_NAMESPACE_XLINK,  XML_TYPE,           XML_TOK_TYPE    },
     646             :             { XML_NAMESPACE_XLINK,  XML_SHOW,           XML_TOK_SHOW    },
     647             :             { XML_NAMESPACE_XLINK,  XML_ACTUATE,        XML_TOK_ACTUATE},
     648             :             { XML_NAMESPACE_DB, XML_AS_TEMPLATE,    XML_TOK_AS_TEMPLATE },
     649             :             { XML_NAMESPACE_DB, XML_NAME,           XML_TOK_COMPONENT_NAME  },
     650             :             XML_TOKEN_MAP_END
     651             :         };
     652           7 :         m_pComponentElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     653             :     }
     654          15 :     return *m_pComponentElemTokenMap;
     655             : }
     656             : 
     657          49 : const SvXMLTokenMap& ODBFilter::GetQueryElemTokenMap() const
     658             : {
     659          49 :     if ( !m_pQueryElemTokenMap.get() )
     660             :     {
     661             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     662             :         {
     663             :             { XML_NAMESPACE_DB, XML_COMMAND,            XML_TOK_COMMAND },
     664             :             { XML_NAMESPACE_DB, XML_ESCAPE_PROCESSING,  XML_TOK_ESCAPE_PROCESSING   },
     665             :             { XML_NAMESPACE_DB, XML_NAME,               XML_TOK_QUERY_NAME  },
     666             :             { XML_NAMESPACE_DB, XML_FILTER_STATEMENT,   XML_TOK_FILTER_STATEMENT    },
     667             :             { XML_NAMESPACE_DB, XML_ORDER_STATEMENT,    XML_TOK_ORDER_STATEMENT },
     668             :             { XML_NAMESPACE_DB, XML_CATALOG_NAME,       XML_TOK_CATALOG_NAME    },
     669             :             { XML_NAMESPACE_DB, XML_SCHEMA_NAME,        XML_TOK_SCHEMA_NAME },
     670             :             { XML_NAMESPACE_DB, XML_STYLE_NAME,         XML_TOK_STYLE_NAME},
     671             :             { XML_NAMESPACE_DB, XML_APPLY_FILTER,       XML_TOK_APPLY_FILTER},
     672             :             { XML_NAMESPACE_DB, XML_APPLY_ORDER,        XML_TOK_APPLY_ORDER},
     673             :             { XML_NAMESPACE_DB, XML_COLUMNS,            XML_TOK_COLUMNS},
     674             :             XML_TOKEN_MAP_END
     675             :         };
     676          12 :         m_pQueryElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     677             :     }
     678          49 :     return *m_pQueryElemTokenMap;
     679             : }
     680             : 
     681         213 : const SvXMLTokenMap& ODBFilter::GetColumnElemTokenMap() const
     682             : {
     683         213 :     if ( !m_pColumnElemTokenMap.get() )
     684             :     {
     685             :         static const SvXMLTokenMapEntry aElemTokenMap[]=
     686             :         {
     687             :             { XML_NAMESPACE_DB, XML_NAME,                       XML_TOK_COLUMN_NAME             },
     688             :             { XML_NAMESPACE_DB, XML_STYLE_NAME,                 XML_TOK_COLUMN_STYLE_NAME       },
     689             :             { XML_NAMESPACE_DB, XML_HELP_MESSAGE,               XML_TOK_COLUMN_HELP_MESSAGE     },
     690             :             { XML_NAMESPACE_DB, XML_VISIBILITY,                 XML_TOK_COLUMN_VISIBILITY       },
     691             :             { XML_NAMESPACE_DB, XML_DEFAULT_VALUE,              XML_TOK_COLUMN_DEFAULT_VALUE    },
     692             :             { XML_NAMESPACE_DB, XML_TYPE_NAME,                  XML_TOK_COLUMN_TYPE_NAME        },
     693             :             { XML_NAMESPACE_DB, XML_VISIBLE,                    XML_TOK_COLUMN_VISIBLE          },
     694             :             { XML_NAMESPACE_DB, XML_DEFAULT_CELL_STYLE_NAME,    XML_TOK_DEFAULT_CELL_STYLE_NAME },
     695             :             XML_TOKEN_MAP_END
     696             :         };
     697           8 :         m_pColumnElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
     698             :     }
     699         213 :     return *m_pColumnElemTokenMap;
     700             : }
     701             : 
     702          16 : SvXMLImportContext* ODBFilter::CreateStylesContext(sal_uInt16 _nPrefix,const OUString& rLocalName,
     703             :                                      const uno::Reference< XAttributeList>& xAttrList, bool bIsAutoStyle )
     704             : {
     705          16 :     SvXMLImportContext *pContext = NULL;
     706          16 :     if (!pContext)
     707             :     {
     708          16 :         pContext = new OTableStylesContext(*this, _nPrefix, rLocalName, xAttrList, bIsAutoStyle);
     709          16 :         if (bIsAutoStyle)
     710          16 :             SetAutoStyles(static_cast<SvXMLStylesContext*>(pContext));
     711             :         else
     712           0 :             SetStyles(static_cast<SvXMLStylesContext*>(pContext));
     713             :     }
     714          16 :     return pContext;
     715             : }
     716             : 
     717          16 : SvXMLImportContext* ODBFilter::CreateScriptContext( const OUString& _rLocalName )
     718             : {
     719          16 :     return new XMLScriptContext( *this, XML_NAMESPACE_OFFICE, _rLocalName, GetModel() );
     720             : }
     721             : 
     722           0 : rtl::Reference < XMLPropertySetMapper > ODBFilter::GetTableStylesPropertySetMapper() const
     723             : {
     724           0 :     if ( !m_xTableStylesPropertySetMapper.is() )
     725             :     {
     726           0 :         m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper( false);
     727             :     }
     728           0 :     return m_xTableStylesPropertySetMapper;
     729             : }
     730             : 
     731           8 : rtl::Reference < XMLPropertySetMapper > ODBFilter::GetColumnStylesPropertySetMapper() const
     732             : {
     733           8 :     if ( !m_xColumnStylesPropertySetMapper.is() )
     734             :     {
     735           8 :         m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper( false);
     736             :     }
     737           8 :     return m_xColumnStylesPropertySetMapper;
     738             : }
     739             : 
     740           8 : rtl::Reference < XMLPropertySetMapper > ODBFilter::GetCellStylesPropertySetMapper() const
     741             : {
     742           8 :     if ( !m_xCellStylesPropertySetMapper.is() )
     743             :     {
     744           8 :         m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper( false);
     745             :     }
     746           8 :     return m_xCellStylesPropertySetMapper;
     747             : }
     748             : 
     749          16 : void ODBFilter::setPropertyInfo()
     750             : {
     751          16 :     Reference<XPropertySet> xDataSource(getDataSource());
     752          16 :     if ( !xDataSource.is() )
     753          16 :         return;
     754             : 
     755          32 :     ::connectivity::DriversConfig aDriverConfig(GetComponentContext());
     756          32 :     const OUString sURL = ::comphelper::getString(xDataSource->getPropertyValue(PROPERTY_URL));
     757          32 :     ::comphelper::NamedValueCollection aDataSourceSettings = aDriverConfig.getProperties( sURL );
     758             : 
     759          32 :     Sequence<PropertyValue> aInfo;
     760          16 :     if ( !m_aInfoSequence.empty() )
     761          16 :         aInfo = Sequence<PropertyValue>(&(*m_aInfoSequence.begin()),m_aInfoSequence.size());
     762          16 :     aDataSourceSettings.merge( ::comphelper::NamedValueCollection( aInfo ), true );
     763             : 
     764          16 :     aDataSourceSettings >>= aInfo;
     765          16 :     if ( aInfo.getLength() )
     766             :     {
     767             :         try
     768             :         {
     769          16 :             xDataSource->setPropertyValue(PROPERTY_INFO,makeAny(aInfo));
     770             :         }
     771           0 :         catch (const Exception&)
     772             :         {
     773             :             DBG_UNHANDLED_EXCEPTION();
     774             :         }
     775          16 :     }
     776             : }
     777             : 
     778             : }// dbaxml
     779             : 
     780             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11