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 :
21 : #include <com/sun/star/util/MeasureUnit.hpp>
22 : #include <com/sun/star/packages/zip/ZipIOException.hpp>
23 : #include <com/sun/star/embed/ElementModes.hpp>
24 : #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
25 : #include "xmlfilter.hxx"
26 : #include "flt_reghelper.hxx"
27 : #include <vcl/svapp.hxx>
28 : #include <vcl/window.hxx>
29 : #include <xmloff/xmlnmspe.hxx>
30 : #include <xmloff/xmlscripti.hxx>
31 : #include <xmloff/xmltoken.hxx>
32 : #include <xmloff/txtimp.hxx>
33 : #include <xmloff/nmspmap.hxx>
34 : #include <rtl/logfile.hxx>
35 : #include <com/sun/star/xml/sax/InputSource.hpp>
36 : #include <com/sun/star/xml/sax/Parser.hpp>
37 : #include <xmloff/ProgressBarHelper.hxx>
38 : #include <sfx2/docfile.hxx>
39 : #include <com/sun/star/io/XInputStream.hpp>
40 : #include <com/sun/star/uno/XNamingService.hpp>
41 : #include "xmlDatabase.hxx"
42 : #include "xmlEnums.hxx"
43 : #include "xmlstrings.hrc"
44 : #include <xmloff/DocumentSettingsContext.hxx>
45 : #include "xmlStyleImport.hxx"
46 : #include <xmloff/xmluconv.hxx>
47 : #include "xmlHelper.hxx"
48 : #include <com/sun/star/util/XModifiable.hpp>
49 : #include <com/sun/star/frame/Desktop.hpp>
50 : #include <com/sun/star/frame/XComponentLoader.hpp>
51 : #include <com/sun/star/frame/FrameSearchFlag.hpp>
52 : #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
53 : #include <osl/mutex.hxx>
54 : #include <svtools/sfxecode.hxx>
55 : #include <unotools/moduleoptions.hxx>
56 : #include <toolkit/helper/vclunohelper.hxx>
57 : #include <tools/diagnose_ex.h>
58 : #include <osl/diagnose.h>
59 : #include <comphelper/processfactory.hxx>
60 : #include <comphelper/namedvaluecollection.hxx>
61 : #include <comphelper/mimeconfighelper.hxx>
62 : #include <comphelper/documentconstants.hxx>
63 : #include <comphelper/uno3.hxx>
64 : #include <cppuhelper/exc_hlp.hxx>
65 : #include <osl/thread.hxx>
66 : #include <connectivity/CommonTools.hxx>
67 : #include <connectivity/DriversConfig.hxx>
68 : #include "dsntypes.hxx"
69 : #include <rtl/strbuf.hxx>
70 :
71 : using namespace ::com::sun::star;
72 :
73 0 : extern "C" void SAL_CALL createRegistryInfo_ODBFilter( )
74 : {
75 0 : static ::dbaxml::OMultiInstanceAutoRegistration< ::dbaxml::ODBFilter > aAutoRegistration;
76 0 : }
77 : //--------------------------------------------------------------------------
78 : namespace dbaxml
79 : {
80 : namespace
81 : {
82 : class FastLoader : public ::osl::Thread
83 : {
84 : public:
85 : typedef enum { E_JAVA, E_CALC } StartType;
86 0 : FastLoader(uno::Reference< lang::XMultiServiceFactory > const & _xFactory,StartType _eType)
87 : :m_xFactory(_xFactory)
88 0 : ,m_eWhat(_eType)
89 0 : {}
90 :
91 : protected:
92 0 : virtual ~FastLoader(){}
93 :
94 : /// Working method which should be overridden.
95 : virtual void SAL_CALL run();
96 : virtual void SAL_CALL onTerminated();
97 : private:
98 : uno::Reference< lang::XMultiServiceFactory > m_xFactory;
99 : StartType m_eWhat;
100 : };
101 :
102 0 : void SAL_CALL FastLoader::run()
103 : {
104 0 : if ( m_eWhat == E_JAVA )
105 : {
106 : static bool s_bFirstTime = true;
107 0 : if ( s_bFirstTime )
108 : {
109 0 : s_bFirstTime = false;
110 : try
111 : {
112 0 : ::rtl::Reference< jvmaccess::VirtualMachine > xJVM = ::connectivity::getJavaVM(m_xFactory);
113 : }
114 0 : catch (const uno::Exception&)
115 : {
116 : OSL_ASSERT(0);
117 : }
118 : }
119 : }
120 0 : else if ( m_eWhat == E_CALC )
121 : {
122 : static bool s_bFirstTime = true;
123 0 : if ( s_bFirstTime )
124 : {
125 0 : s_bFirstTime = false;
126 : try
127 : {
128 0 : uno::Reference<frame::XDesktop2> xDesktop = frame::Desktop::create( comphelper::getComponentContext(m_xFactory) );
129 0 : const ::rtl::OUString sTarget(RTL_CONSTASCII_USTRINGPARAM("_blank"));
130 0 : sal_Int32 nFrameSearchFlag = frame::FrameSearchFlag::TASKS | frame::FrameSearchFlag::CREATE;
131 0 : uno::Reference< frame::XFrame> xFrame = xDesktop->findFrame(sTarget,nFrameSearchFlag);
132 0 : uno::Reference<frame::XComponentLoader> xFrameLoad(xFrame,uno::UNO_QUERY);
133 :
134 0 : if ( xFrameLoad.is() )
135 : {
136 0 : uno::Sequence < beans::PropertyValue > aArgs( 3);
137 0 : sal_Int32 nLen = 0;
138 0 : aArgs[nLen].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AsTemplate"));
139 0 : aArgs[nLen++].Value <<= sal_False;
140 :
141 0 : aArgs[nLen].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReadOnly"));
142 0 : aArgs[nLen++].Value <<= sal_True;
143 :
144 0 : aArgs[nLen].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Hidden"));
145 0 : aArgs[nLen++].Value <<= sal_True;
146 :
147 0 : ::comphelper::MimeConfigurationHelper aHelper(m_xFactory);
148 0 : SvtModuleOptions aModuleOptions;
149 0 : uno::Reference< frame::XModel > xModel(xFrameLoad->loadComponentFromURL(
150 : aModuleOptions.GetFactoryEmptyDocumentURL( aModuleOptions.ClassifyFactoryByServiceName( aHelper.GetDocServiceNameFromMediaType(MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET) )),
151 : ::rtl::OUString(), // empty frame name
152 : 0,
153 : aArgs
154 0 : ),uno::UNO_QUERY);
155 0 : ::comphelper::disposeComponent(xModel);
156 0 : }
157 : }
158 0 : catch (const uno::Exception&)
159 : {
160 : OSL_ASSERT(0);
161 : }
162 : }
163 : }
164 0 : }
165 0 : void SAL_CALL FastLoader::onTerminated()
166 : {
167 0 : delete this;
168 0 : }
169 :
170 : class DatasourceURLListener : public ::cppu::WeakImplHelper1< beans::XPropertyChangeListener >
171 : {
172 : uno::Reference< lang::XMultiServiceFactory > m_xFactory;
173 : ::dbaccess::ODsnTypeCollection m_aTypeCollection;
174 : DatasourceURLListener(const DatasourceURLListener&);
175 : void operator =(const DatasourceURLListener&);
176 : protected:
177 0 : virtual ~DatasourceURLListener(){}
178 : public:
179 0 : DatasourceURLListener(uno::Reference< lang::XMultiServiceFactory > const & _xFactory) : m_xFactory(_xFactory),m_aTypeCollection(_xFactory){}
180 : // XPropertyChangeListener
181 0 : virtual void SAL_CALL propertyChange( const beans::PropertyChangeEvent& _rEvent ) throw (uno::RuntimeException)
182 : {
183 0 : ::rtl::OUString sURL;
184 0 : _rEvent.NewValue >>= sURL;
185 0 : FastLoader* pCreatorThread = NULL;
186 :
187 0 : if ( m_aTypeCollection.needsJVM(sURL) )
188 : {
189 0 : pCreatorThread = new FastLoader(m_xFactory,FastLoader::E_JAVA);
190 : }
191 0 : else if ( sURL.matchIgnoreAsciiCaseAsciiL("sdbc:calc:",10,0) )
192 : {
193 0 : pCreatorThread = new FastLoader(m_xFactory,FastLoader::E_CALC);
194 : }
195 0 : if ( pCreatorThread )
196 : {
197 0 : pCreatorThread->createSuspended();
198 0 : pCreatorThread->setPriority(osl_Thread_PriorityBelowNormal);
199 0 : pCreatorThread->resume();
200 0 : }
201 0 : }
202 : // XEventListener
203 0 : virtual void SAL_CALL disposing( const lang::EventObject& /*_rSource*/ ) throw (uno::RuntimeException)
204 : {
205 0 : }
206 : };
207 : }
208 : sal_Char const sXML_np__db[] = "_db";
209 : sal_Char const sXML_np___db[] = "__db";
210 :
211 : using namespace ::com::sun::star::util;
212 : /// read a component (file + filter version)
213 0 : sal_Int32 ReadThroughComponent(
214 : const uno::Reference<XInputStream>& xInputStream,
215 : const uno::Reference<XComponent>& xModelComponent,
216 : const uno::Reference<XComponentContext> & rxContext,
217 : const uno::Reference< XDocumentHandler >& _xFilter )
218 : {
219 : OSL_ENSURE(xInputStream.is(), "input stream missing");
220 : OSL_ENSURE(xModelComponent.is(), "document missing");
221 : OSL_ENSURE(rxContext.is(), "factory missing");
222 :
223 : RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "dbaxml", "oj", "ReadThroughComponent" );
224 :
225 : // prepare ParserInputSrouce
226 0 : InputSource aParserInput;
227 0 : aParserInput.aInputStream = xInputStream;
228 :
229 : // get parser
230 0 : uno::Reference< XParser > xParser = Parser::create(rxContext);
231 : RTL_LOGFILE_CONTEXT_TRACE( aLog, "parser created" );
232 :
233 : // get filter
234 : OSL_ENSURE( _xFilter.is(), "Can't instantiate filter component." );
235 0 : if( !_xFilter.is() )
236 0 : return 1;
237 :
238 : // connect parser and filter
239 0 : xParser->setDocumentHandler( _xFilter );
240 :
241 : // connect model and filter
242 0 : uno::Reference < XImporter > xImporter( _xFilter, UNO_QUERY );
243 0 : xImporter->setTargetDocument( xModelComponent );
244 :
245 :
246 :
247 : // finally, parser the stream
248 : try
249 : {
250 0 : xParser->parseStream( aParserInput );
251 : }
252 0 : catch (const SAXParseException& r)
253 : {
254 : #if OSL_DEBUG_LEVEL > 1
255 : ::rtl::OStringBuffer aError(RTL_CONSTASCII_STRINGPARAM(
256 : "SAX parse exception catched while importing:\n"));
257 : aError.append(rtl::OUStringToOString(r.Message,
258 : RTL_TEXTENCODING_ASCII_US));
259 : aError.append(r.LineNumber);
260 : aError.append(',');
261 : aError.append(r.ColumnNumber);
262 : OSL_FAIL(aError.getStr());
263 : #else
264 : (void)r;
265 : #endif
266 0 : return 1;
267 : }
268 0 : catch (const SAXException&)
269 : {
270 0 : return 1;
271 : }
272 0 : catch (const packages::zip::ZipIOException&)
273 : {
274 0 : return ERRCODE_IO_BROKENPACKAGE;
275 : }
276 0 : catch (const Exception&)
277 : {
278 : DBG_UNHANDLED_EXCEPTION();
279 : }
280 :
281 : // success!
282 0 : return 0;
283 : }
284 :
285 : /// read a component (storage version)
286 0 : sal_Int32 ReadThroughComponent(
287 : uno::Reference< embed::XStorage > xStorage,
288 : const uno::Reference<XComponent>& xModelComponent,
289 : const sal_Char* pStreamName,
290 : const sal_Char* pCompatibilityStreamName,
291 : const uno::Reference<XComponentContext> & rxContext,
292 : const uno::Reference< XDocumentHandler >& _xFilter)
293 : {
294 : OSL_ENSURE( xStorage.is(), "Need storage!");
295 : OSL_ENSURE(NULL != pStreamName, "Please, please, give me a name!");
296 :
297 0 : if ( xStorage.is() )
298 : {
299 0 : uno::Reference< io::XStream > xDocStream;
300 0 : sal_Bool bEncrypted = sal_False;
301 :
302 : try
303 : {
304 : // open stream (and set parser input)
305 0 : ::rtl::OUString sStreamName = ::rtl::OUString::createFromAscii(pStreamName);
306 0 : if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
307 : {
308 : // stream name not found! Then try the compatibility name.
309 : // if no stream can be opened, return immediatly with OK signal
310 :
311 : // do we even have an alternative name?
312 0 : if ( NULL == pCompatibilityStreamName )
313 0 : return 0;
314 :
315 : // if so, does the stream exist?
316 0 : sStreamName = ::rtl::OUString::createFromAscii(pCompatibilityStreamName);
317 0 : if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
318 0 : return 0;
319 : }
320 :
321 : // get input stream
322 0 : xDocStream = xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
323 :
324 0 : uno::Reference< beans::XPropertySet > xProps( xDocStream, uno::UNO_QUERY_THROW );
325 0 : uno::Any aAny = xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Encrypted") ) );
326 0 : aAny >>= bEncrypted;
327 : }
328 0 : catch (const packages::WrongPasswordException&)
329 : {
330 0 : return ERRCODE_SFX_WRONGPASSWORD;
331 : }
332 0 : catch (const uno::Exception&)
333 : {
334 0 : return 1; // TODO/LATER: error handling
335 : }
336 :
337 : #ifdef TIMELOG
338 : // if we do profiling, we want to know the stream
339 : RTL_LOGFILE_TRACE_AUTHOR1( "dbaxml", "oj",
340 : "ReadThroughComponent : parsing \"%s\"", pStreamName );
341 : #endif
342 :
343 0 : uno::Reference< XInputStream > xInputStream = xDocStream->getInputStream();
344 : // read from the stream
345 : return ReadThroughComponent( xInputStream
346 : ,xModelComponent
347 : ,rxContext
348 0 : ,_xFilter );
349 : }
350 :
351 : // TODO/LATER: better error handling
352 0 : return 1;
353 : }
354 :
355 : // -------------
356 : // - ODBFilter -
357 : // -------------
358 : DBG_NAME(ODBFilter)
359 :
360 0 : ODBFilter::ODBFilter( const uno::Reference< XMultiServiceFactory >& _rxMSF )
361 : :SvXMLImport(_rxMSF)
362 0 : ,m_bNewFormat(false)
363 : {
364 : DBG_CTOR(ODBFilter,NULL);
365 :
366 0 : GetMM100UnitConverter().SetCoreMeasureUnit(util::MeasureUnit::MM_10TH);
367 0 : GetMM100UnitConverter().SetXMLMeasureUnit(util::MeasureUnit::CM);
368 0 : GetNamespaceMap().Add( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__db) ),
369 0 : GetXMLToken(XML_N_DB),
370 0 : XML_NAMESPACE_DB );
371 :
372 0 : GetNamespaceMap().Add( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np___db) ),
373 0 : GetXMLToken(XML_N_DB_OASIS),
374 0 : XML_NAMESPACE_DB );
375 0 : }
376 :
377 : // -----------------------------------------------------------------------------
378 :
379 0 : ODBFilter::~ODBFilter() throw()
380 : {
381 :
382 : DBG_DTOR(ODBFilter,NULL);
383 0 : }
384 : // -----------------------------------------------------------------------------
385 0 : IMPLEMENT_SERVICE_INFO1_STATIC( ODBFilter, "com.sun.star.comp.sdb.DBFilter", "com.sun.star.document.ImportFilter")
386 : // -----------------------------------------------------------------------------
387 0 : sal_Bool SAL_CALL ODBFilter::filter( const Sequence< PropertyValue >& rDescriptor )
388 : throw (RuntimeException)
389 : {
390 0 : uno::Reference< ::com::sun::star::awt::XWindow > xWindow;
391 : {
392 0 : SolarMutexGuard aGuard;
393 0 : Window* pFocusWindow = Application::GetFocusWindow();
394 0 : xWindow = VCLUnoHelper::GetInterface( pFocusWindow );
395 0 : if( pFocusWindow )
396 0 : pFocusWindow->EnterWait();
397 : }
398 0 : sal_Bool bRet = sal_False;
399 :
400 0 : if ( GetModel().is() )
401 0 : bRet = implImport( rDescriptor );
402 :
403 0 : if ( xWindow.is() )
404 : {
405 0 : SolarMutexGuard aGuard;
406 0 : Window* pFocusWindow = VCLUnoHelper::GetWindow( xWindow );
407 0 : if ( pFocusWindow )
408 0 : pFocusWindow->LeaveWait();
409 : }
410 :
411 :
412 0 : return bRet;
413 : }
414 : // -----------------------------------------------------------------------------
415 0 : sal_Bool ODBFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
416 : throw (RuntimeException)
417 : {
418 0 : ::rtl::OUString sFileName;
419 0 : ::comphelper::NamedValueCollection aMediaDescriptor( rDescriptor );
420 0 : if ( aMediaDescriptor.has( "URL" ) )
421 0 : sFileName = aMediaDescriptor.getOrDefault( "URL", ::rtl::OUString() );
422 0 : if ( sFileName.isEmpty() && aMediaDescriptor.has( "FileName" ) )
423 0 : sFileName = aMediaDescriptor.getOrDefault( "FileName", sFileName );
424 :
425 : OSL_ENSURE( !sFileName.isEmpty(), "ODBFilter::implImport: no URL given!" );
426 0 : sal_Bool bRet = !sFileName.isEmpty();
427 :
428 0 : if ( bRet )
429 : {
430 0 : uno::Reference<XComponent> xCom(GetModel(),UNO_QUERY);
431 :
432 : SfxMediumRef pMedium = new SfxMedium(
433 0 : sFileName, ( STREAM_READ | STREAM_NOCREATE ) );
434 0 : uno::Reference< embed::XStorage > xStorage;
435 : try
436 : {
437 0 : xStorage.set( pMedium->GetStorage( sal_False ), UNO_QUERY_THROW );
438 : }
439 0 : catch (const Exception&)
440 : {
441 0 : Any aError = ::cppu::getCaughtException();
442 0 : if ( aError.isExtractableTo( ::cppu::UnoType< RuntimeException >::get() ) )
443 0 : throw;
444 0 : throw lang::WrappedTargetRuntimeException( ::rtl::OUString(), *this, aError );
445 : }
446 :
447 0 : uno::Reference<sdb::XOfficeDatabaseDocument> xOfficeDoc(GetModel(),UNO_QUERY_THROW);
448 0 : m_xDataSource.set(xOfficeDoc->getDataSource(),UNO_QUERY_THROW);
449 0 : uno::Reference<beans::XPropertyChangeListener> xListener = new DatasourceURLListener(getServiceFactory());
450 0 : m_xDataSource->addPropertyChangeListener(PROPERTY_URL,xListener);
451 0 : uno::Reference< XNumberFormatsSupplier > xNum(m_xDataSource->getPropertyValue(PROPERTY_NUMBERFORMATSSUPPLIER),UNO_QUERY);
452 0 : SetNumberFormatsSupplier(xNum);
453 :
454 0 : uno::Reference<XComponent> xModel(GetModel(),UNO_QUERY);
455 : sal_Int32 nRet = ReadThroughComponent( xStorage
456 : ,xModel
457 : ,"settings.xml"
458 : ,"Settings.xml"
459 : ,comphelper::getComponentContext(getServiceFactory())
460 : ,this
461 0 : );
462 :
463 0 : if ( nRet == 0 )
464 : nRet = ReadThroughComponent( xStorage
465 : ,xModel
466 : ,"content.xml"
467 : ,"Content.xml"
468 : ,comphelper::getComponentContext(getServiceFactory())
469 : ,this
470 0 : );
471 :
472 0 : bRet = nRet == 0;
473 :
474 0 : if ( bRet )
475 : {
476 0 : uno::Reference< XModifiable > xModi(GetModel(),UNO_QUERY);
477 0 : if ( xModi.is() )
478 0 : xModi->setModified(sal_False);
479 : }
480 : else
481 : {
482 0 : switch( nRet )
483 : {
484 : case ERRCODE_IO_BROKENPACKAGE:
485 : // TODO/LATER: no way to transport the error outside from the filter!
486 0 : break;
487 : default:
488 : {
489 : // TODO/LATER: this is completely wrong! Filter code should never call ErrorHandler directly! But for now this is the only way!
490 0 : ErrorHandler::HandleError( nRet );
491 0 : if( nRet & ERRCODE_WARNING_MASK )
492 0 : bRet = sal_True;
493 : }
494 : }
495 0 : }
496 : }
497 :
498 0 : return bRet;
499 : }
500 : // -----------------------------------------------------------------------------
501 0 : SvXMLImportContext* ODBFilter::CreateContext( sal_uInt16 nPrefix,
502 : const ::rtl::OUString& rLocalName,
503 : const uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
504 : {
505 0 : SvXMLImportContext *pContext = 0;
506 :
507 0 : const SvXMLTokenMap& rTokenMap = GetDocElemTokenMap();
508 0 : switch( rTokenMap.Get( nPrefix, rLocalName ) )
509 : {
510 : case XML_TOK_DOC_SETTINGS:
511 0 : GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
512 0 : pContext = new XMLDocumentSettingsContext( *this, nPrefix, rLocalName,xAttrList );
513 0 : break;
514 : case XML_TOK_DOC_DATABASE:
515 0 : GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
516 0 : pContext = new OXMLDatabase( *this, nPrefix, rLocalName );
517 0 : break;
518 : case XML_TOK_DOC_STYLES:
519 0 : GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
520 0 : pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, sal_False);
521 0 : break;
522 : case XML_TOK_DOC_AUTOSTYLES:
523 0 : GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
524 0 : pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, sal_True);
525 0 : break;
526 : case XML_TOK_DOC_SCRIPT:
527 0 : pContext = CreateScriptContext( rLocalName );
528 0 : break;
529 : }
530 :
531 0 : if ( !pContext )
532 0 : pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );
533 :
534 0 : return pContext;
535 : }
536 : // -----------------------------------------------------------------------------
537 0 : void ODBFilter::SetViewSettings(const Sequence<PropertyValue>& aViewProps)
538 : {
539 0 : const PropertyValue *pIter = aViewProps.getConstArray();
540 0 : const PropertyValue *pEnd = pIter + aViewProps.getLength();
541 0 : for (; pIter != pEnd; ++pIter)
542 : {
543 0 : if ( pIter->Name == "Queries" )
544 : {
545 0 : fillPropertyMap(pIter->Value,m_aQuerySettings);
546 : }
547 0 : else if ( pIter->Name == "Tables" )
548 : {
549 0 : fillPropertyMap(pIter->Value,m_aTablesSettings);
550 : }
551 : }
552 0 : }
553 : // -----------------------------------------------------------------------------
554 0 : void ODBFilter::SetConfigurationSettings(const Sequence<PropertyValue>& aConfigProps)
555 : {
556 0 : const PropertyValue *pIter = aConfigProps.getConstArray();
557 0 : const PropertyValue *pEnd = pIter + aConfigProps.getLength();
558 0 : for (; pIter != pEnd; ++pIter)
559 : {
560 0 : if ( pIter->Name == "layout-settings" )
561 : {
562 0 : Sequence<PropertyValue> aWindows;
563 0 : pIter->Value >>= aWindows;
564 0 : uno::Reference<XPropertySet> xProp(getDataSource());
565 0 : if ( xProp.is() )
566 0 : xProp->setPropertyValue(PROPERTY_LAYOUTINFORMATION,makeAny(aWindows));
567 : }
568 : }
569 0 : }
570 : // -----------------------------------------------------------------------------
571 0 : void ODBFilter::fillPropertyMap(const Any& _rValue,TPropertyNameMap& _rMap)
572 : {
573 0 : Sequence<PropertyValue> aWindows;
574 0 : _rValue >>= aWindows;
575 0 : const PropertyValue *pIter = aWindows.getConstArray();
576 0 : const PropertyValue *pEnd = pIter + aWindows.getLength();
577 0 : for (; pIter != pEnd; ++pIter)
578 : {
579 0 : Sequence<PropertyValue> aValue;
580 0 : pIter->Value >>= aValue;
581 0 : _rMap.insert(TPropertyNameMap::value_type(pIter->Name,aValue));
582 0 : }
583 :
584 0 : }
585 : // -----------------------------------------------------------------------------
586 0 : const SvXMLTokenMap& ODBFilter::GetDocElemTokenMap() const
587 : {
588 0 : if ( !m_pDocElemTokenMap.get() )
589 : {
590 : static SvXMLTokenMapEntry aElemTokenMap[]=
591 : {
592 : { XML_NAMESPACE_OFFICE, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
593 : { XML_NAMESPACE_OOO, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
594 : { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_DOC_STYLES },
595 : { XML_NAMESPACE_OOO, XML_STYLES, XML_TOK_DOC_STYLES },
596 : { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
597 : { XML_NAMESPACE_OOO, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
598 : { XML_NAMESPACE_OFFICE, XML_DATABASE, XML_TOK_DOC_DATABASE },
599 : { XML_NAMESPACE_OOO, XML_DATABASE, XML_TOK_DOC_DATABASE },
600 : { XML_NAMESPACE_OFFICE, XML_SCRIPTS, XML_TOK_DOC_SCRIPT },
601 : XML_TOKEN_MAP_END
602 : };
603 0 : m_pDocElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
604 : }
605 0 : return *m_pDocElemTokenMap;
606 : }
607 : // -----------------------------------------------------------------------------
608 0 : const SvXMLTokenMap& ODBFilter::GetDatabaseElemTokenMap() const
609 : {
610 0 : if ( !m_pDatabaseElemTokenMap.get() )
611 : {
612 : static SvXMLTokenMapEntry aElemTokenMap[]=
613 : {
614 : { XML_NAMESPACE_DB, XML_DATASOURCE, XML_TOK_DATASOURCE },
615 : { XML_NAMESPACE_DB, XML_FORMS, XML_TOK_FORMS},
616 : { XML_NAMESPACE_DB, XML_REPORTS, XML_TOK_REPORTS},
617 : { XML_NAMESPACE_DB, XML_QUERIES, XML_TOK_QUERIES},
618 : { XML_NAMESPACE_DB, XML_TABLES, XML_TOK_TABLES},
619 : { XML_NAMESPACE_DB, XML_TABLE_REPRESENTATIONS, XML_TOK_TABLES},
620 : { XML_NAMESPACE_DB, XML_SCHEMA_DEFINITION, XML_TOK_SCHEMA_DEFINITION},
621 : XML_TOKEN_MAP_END
622 : };
623 0 : m_pDatabaseElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
624 : }
625 0 : return *m_pDatabaseElemTokenMap;
626 : }
627 : // -----------------------------------------------------------------------------
628 0 : const SvXMLTokenMap& ODBFilter::GetDataSourceElemTokenMap() const
629 : {
630 0 : if ( !m_pDataSourceElemTokenMap.get() )
631 : {
632 : static SvXMLTokenMapEntry aElemTokenMap[]=
633 : {
634 : { XML_NAMESPACE_DB, XML_CONNECTION_RESOURCE, XML_TOK_CONNECTION_RESOURCE},
635 : { XML_NAMESPACE_DB, XML_SUPPRESS_VERSION_COLUMNS, XML_TOK_SUPPRESS_VERSION_COLUMNS},
636 : { XML_NAMESPACE_DB, XML_JAVA_DRIVER_CLASS, XML_TOK_JAVA_DRIVER_CLASS},
637 : { XML_NAMESPACE_DB, XML_EXTENSION, XML_TOK_EXTENSION},
638 : { XML_NAMESPACE_DB, XML_IS_FIRST_ROW_HEADER_LINE, XML_TOK_IS_FIRST_ROW_HEADER_LINE},
639 : { XML_NAMESPACE_DB, XML_SHOW_DELETED, XML_TOK_SHOW_DELETED},
640 : { XML_NAMESPACE_DB, XML_IS_TABLE_NAME_LENGTH_LIMITED, XML_TOK_IS_TABLE_NAME_LENGTH_LIMITED},
641 : { XML_NAMESPACE_DB, XML_SYSTEM_DRIVER_SETTINGS, XML_TOK_SYSTEM_DRIVER_SETTINGS},
642 : { XML_NAMESPACE_DB, XML_ENABLE_SQL92_CHECK, XML_TOK_ENABLE_SQL92_CHECK},
643 : { XML_NAMESPACE_DB, XML_APPEND_TABLE_ALIAS_NAME, XML_TOK_APPEND_TABLE_ALIAS_NAME},
644 : { XML_NAMESPACE_DB, XML_PARAMETER_NAME_SUBSTITUTION, XML_TOK_PARAMETER_NAME_SUBSTITUTION},
645 : { XML_NAMESPACE_DB, XML_IGNORE_DRIVER_PRIVILEGES, XML_TOK_IGNORE_DRIVER_PRIVILEGES},
646 : { XML_NAMESPACE_DB, XML_BOOLEAN_COMPARISON_MODE, XML_TOK_BOOLEAN_COMPARISON_MODE},
647 : { XML_NAMESPACE_DB, XML_USE_CATALOG, XML_TOK_USE_CATALOG},
648 : { XML_NAMESPACE_DB, XML_BASE_DN, XML_TOK_BASE_DN},
649 : { XML_NAMESPACE_DB, XML_MAX_ROW_COUNT, XML_TOK_MAX_ROW_COUNT},
650 : { XML_NAMESPACE_DB, XML_LOGIN, XML_TOK_LOGIN},
651 : { XML_NAMESPACE_DB, XML_TABLE_FILTER, XML_TOK_TABLE_FILTER},
652 : { XML_NAMESPACE_DB, XML_TABLE_TYPE_FILTER, XML_TOK_TABLE_TYPE_FILTER},
653 : { XML_NAMESPACE_DB, XML_AUTO_INCREMENT, XML_TOK_AUTO_INCREMENT},
654 : { XML_NAMESPACE_DB, XML_DELIMITER, XML_TOK_DELIMITER},
655 : { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTINGS, XML_TOK_DATA_SOURCE_SETTINGS},
656 : { XML_NAMESPACE_DB, XML_FONT_CHARSET, XML_TOK_FONT_CHARSET},
657 : // db odf 12
658 : { XML_NAMESPACE_DB, XML_CONNECTION_DATA, XML_TOK_CONNECTION_DATA},
659 : { XML_NAMESPACE_DB, XML_DATABASE_DESCRIPTION, XML_TOK_DATABASE_DESCRIPTION},
660 : { XML_NAMESPACE_DB, XML_COMPOUND_DATABASE, XML_TOK_COMPOUND_DATABASE},
661 : { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_DB_HREF},
662 : { XML_NAMESPACE_DB, XML_MEDIA_TYPE, XML_TOK_MEDIA_TYPE},
663 : { XML_NAMESPACE_DB, XML_TYPE, XML_TOK_DB_TYPE},
664 : { XML_NAMESPACE_DB, XML_HOSTNAME, XML_TOK_HOSTNAME},
665 : { XML_NAMESPACE_DB, XML_PORT, XML_TOK_PORT},
666 : { XML_NAMESPACE_DB, XML_LOCAL_SOCKET, XML_TOK_LOCAL_SOCKET},
667 : { XML_NAMESPACE_DB, XML_DATABASE_NAME, XML_TOK_DATABASE_NAME},
668 : { XML_NAMESPACE_DB, XML_DRIVER_SETTINGS, XML_TOK_DRIVER_SETTINGS},
669 : { XML_NAMESPACE_DB, XML_JAVA_CLASSPATH, XML_TOK_JAVA_CLASSPATH},
670 : { XML_NAMESPACE_DB, XML_CHARACTER_SET, XML_TOK_CHARACTER_SET},
671 : { XML_NAMESPACE_DB, XML_APPLICATION_CONNECTION_SETTINGS,XML_TOK_APPLICATION_CONNECTION_SETTINGS},
672 : XML_TOKEN_MAP_END
673 : };
674 0 : m_pDataSourceElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
675 : }
676 0 : return *m_pDataSourceElemTokenMap;
677 : }
678 : // -----------------------------------------------------------------------------
679 0 : const SvXMLTokenMap& ODBFilter::GetLoginElemTokenMap() const
680 : {
681 0 : if ( !m_pLoginElemTokenMap.get() )
682 : {
683 : static SvXMLTokenMapEntry aElemTokenMap[]=
684 : {
685 : { XML_NAMESPACE_DB, XML_USER_NAME, XML_TOK_USER_NAME},
686 : { XML_NAMESPACE_DB, XML_IS_PASSWORD_REQUIRED, XML_TOK_IS_PASSWORD_REQUIRED},
687 : { XML_NAMESPACE_DB, XML_USE_SYSTEM_USER, XML_TOK_USE_SYSTEM_USER},
688 : { XML_NAMESPACE_DB, XML_LOGIN_TIMEOUT, XML_TOK_LOGIN_TIMEOUT},
689 : XML_TOKEN_MAP_END
690 : };
691 0 : m_pLoginElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
692 : }
693 0 : return *m_pLoginElemTokenMap;
694 : }
695 : // -----------------------------------------------------------------------------
696 0 : const SvXMLTokenMap& ODBFilter::GetDatabaseDescriptionElemTokenMap() const
697 : {
698 0 : if ( !m_pDatabaseDescriptionElemTokenMap.get() )
699 : {
700 : static SvXMLTokenMapEntry aElemTokenMap[]=
701 : {
702 : { XML_NAMESPACE_DB, XML_FILE_BASED_DATABASE, XML_TOK_FILE_BASED_DATABASE},
703 : { XML_NAMESPACE_DB, XML_SERVER_DATABASE, XML_TOK_SERVER_DATABASE},
704 : XML_TOKEN_MAP_END
705 : };
706 0 : m_pDatabaseDescriptionElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
707 : }
708 0 : return *m_pDatabaseDescriptionElemTokenMap;
709 : }
710 : // -----------------------------------------------------------------------------
711 0 : const SvXMLTokenMap& ODBFilter::GetDataSourceInfoElemTokenMap() const
712 : {
713 0 : if ( !m_pDataSourceInfoElemTokenMap.get() )
714 : {
715 : static SvXMLTokenMapEntry aElemTokenMap[]=
716 : {
717 : { XML_NAMESPACE_DB, XML_ADDITIONAL_COLUMN_STATEMENT,XML_TOK_ADDITIONAL_COLUMN_STATEMENT},
718 : { XML_NAMESPACE_DB, XML_ROW_RETRIEVING_STATEMENT, XML_TOK_ROW_RETRIEVING_STATEMENT},
719 : { XML_NAMESPACE_DB, XML_STRING, XML_TOK_STRING},
720 : { XML_NAMESPACE_DB, XML_FIELD, XML_TOK_FIELD},
721 : { XML_NAMESPACE_DB, XML_DECIMAL, XML_TOK_DECIMAL},
722 : { XML_NAMESPACE_DB, XML_THOUSAND, XML_TOK_THOUSAND},
723 : { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING, XML_TOK_DATA_SOURCE_SETTING},
724 : { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_VALUE, XML_TOK_DATA_SOURCE_SETTING_VALUE},
725 : { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_IS_LIST,XML_TOK_DATA_SOURCE_SETTING_IS_LIST},
726 : { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_TYPE, XML_TOK_DATA_SOURCE_SETTING_TYPE},
727 : { XML_NAMESPACE_DB, XML_DATA_SOURCE_SETTING_NAME, XML_TOK_DATA_SOURCE_SETTING_NAME},
728 : { XML_NAMESPACE_DB, XML_FONT_CHARSET, XML_TOK_FONT_CHARSET},
729 : { XML_NAMESPACE_DB, XML_ENCODING, XML_TOK_ENCODING},
730 : XML_TOKEN_MAP_END
731 : };
732 0 : m_pDataSourceInfoElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
733 : }
734 0 : return *m_pDataSourceInfoElemTokenMap;
735 : }
736 : // -----------------------------------------------------------------------------
737 0 : const SvXMLTokenMap& ODBFilter::GetDocumentsElemTokenMap() const
738 : {
739 0 : if ( !m_pDocumentsElemTokenMap.get() )
740 : {
741 : static SvXMLTokenMapEntry aElemTokenMap[]=
742 : {
743 : { XML_NAMESPACE_DB, XML_COMPONENT, XML_TOK_COMPONENT},
744 : { XML_NAMESPACE_DB, XML_COMPONENT_COLLECTION, XML_TOK_COMPONENT_COLLECTION},
745 : { XML_NAMESPACE_DB, XML_QUERY_COLLECTION, XML_TOK_QUERY_COLLECTION},
746 : { XML_NAMESPACE_DB, XML_QUERY, XML_TOK_QUERY},
747 : { XML_NAMESPACE_DB, XML_TABLE, XML_TOK_TABLE},
748 : { XML_NAMESPACE_DB, XML_TABLE_REPRESENTATION, XML_TOK_TABLE},
749 : { XML_NAMESPACE_DB, XML_COLUMN, XML_TOK_COLUMN},
750 : XML_TOKEN_MAP_END
751 : };
752 0 : m_pDocumentsElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
753 : }
754 0 : return *m_pDocumentsElemTokenMap;
755 : }
756 : // -----------------------------------------------------------------------------
757 0 : const SvXMLTokenMap& ODBFilter::GetComponentElemTokenMap() const
758 : {
759 0 : if ( !m_pComponentElemTokenMap.get() )
760 : {
761 : static SvXMLTokenMapEntry aElemTokenMap[]=
762 : {
763 : { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_HREF },
764 : { XML_NAMESPACE_XLINK, XML_TYPE, XML_TOK_TYPE },
765 : { XML_NAMESPACE_XLINK, XML_SHOW, XML_TOK_SHOW },
766 : { XML_NAMESPACE_XLINK, XML_ACTUATE, XML_TOK_ACTUATE},
767 : { XML_NAMESPACE_DB, XML_AS_TEMPLATE, XML_TOK_AS_TEMPLATE },
768 : { XML_NAMESPACE_DB, XML_NAME, XML_TOK_COMPONENT_NAME },
769 : XML_TOKEN_MAP_END
770 : };
771 0 : m_pComponentElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
772 : }
773 0 : return *m_pComponentElemTokenMap;
774 : }
775 : // -----------------------------------------------------------------------------
776 0 : const SvXMLTokenMap& ODBFilter::GetQueryElemTokenMap() const
777 : {
778 0 : if ( !m_pQueryElemTokenMap.get() )
779 : {
780 : static SvXMLTokenMapEntry aElemTokenMap[]=
781 : {
782 : { XML_NAMESPACE_DB, XML_COMMAND, XML_TOK_COMMAND },
783 : { XML_NAMESPACE_DB, XML_ESCAPE_PROCESSING, XML_TOK_ESCAPE_PROCESSING },
784 : { XML_NAMESPACE_DB, XML_NAME, XML_TOK_QUERY_NAME },
785 : { XML_NAMESPACE_DB, XML_FILTER_STATEMENT, XML_TOK_FILTER_STATEMENT },
786 : { XML_NAMESPACE_DB, XML_ORDER_STATEMENT, XML_TOK_ORDER_STATEMENT },
787 : { XML_NAMESPACE_DB, XML_CATALOG_NAME, XML_TOK_CATALOG_NAME },
788 : { XML_NAMESPACE_DB, XML_SCHEMA_NAME, XML_TOK_SCHEMA_NAME },
789 : { XML_NAMESPACE_DB, XML_STYLE_NAME, XML_TOK_STYLE_NAME},
790 : { XML_NAMESPACE_DB, XML_APPLY_FILTER, XML_TOK_APPLY_FILTER},
791 : { XML_NAMESPACE_DB, XML_APPLY_ORDER, XML_TOK_APPLY_ORDER},
792 : { XML_NAMESPACE_DB, XML_COLUMNS, XML_TOK_COLUMNS},
793 : XML_TOKEN_MAP_END
794 : };
795 0 : m_pQueryElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
796 : }
797 0 : return *m_pQueryElemTokenMap;
798 : }
799 : // -----------------------------------------------------------------------------
800 0 : const SvXMLTokenMap& ODBFilter::GetColumnElemTokenMap() const
801 : {
802 0 : if ( !m_pColumnElemTokenMap.get() )
803 : {
804 : static SvXMLTokenMapEntry aElemTokenMap[]=
805 : {
806 : { XML_NAMESPACE_DB, XML_NAME, XML_TOK_COLUMN_NAME },
807 : { XML_NAMESPACE_DB, XML_STYLE_NAME, XML_TOK_COLUMN_STYLE_NAME },
808 : { XML_NAMESPACE_DB, XML_HELP_MESSAGE, XML_TOK_COLUMN_HELP_MESSAGE },
809 : { XML_NAMESPACE_DB, XML_VISIBILITY, XML_TOK_COLUMN_VISIBILITY },
810 : { XML_NAMESPACE_DB, XML_DEFAULT_VALUE, XML_TOK_COLUMN_DEFAULT_VALUE },
811 : { XML_NAMESPACE_DB, XML_TYPE_NAME, XML_TOK_COLUMN_TYPE_NAME },
812 : { XML_NAMESPACE_DB, XML_VISIBLE, XML_TOK_COLUMN_VISIBLE },
813 : { XML_NAMESPACE_DB, XML_DEFAULT_CELL_STYLE_NAME, XML_TOK_DEFAULT_CELL_STYLE_NAME },
814 : XML_TOKEN_MAP_END
815 : };
816 0 : m_pColumnElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
817 : }
818 0 : return *m_pColumnElemTokenMap;
819 : }
820 : // -----------------------------------------------------------------------------
821 0 : SvXMLImportContext* ODBFilter::CreateStylesContext(sal_uInt16 _nPrefix,const ::rtl::OUString& rLocalName,
822 : const uno::Reference< XAttributeList>& xAttrList, sal_Bool bIsAutoStyle )
823 : {
824 0 : SvXMLImportContext *pContext = NULL;
825 0 : if (!pContext)
826 : {
827 0 : pContext = new OTableStylesContext(*this, _nPrefix, rLocalName, xAttrList, bIsAutoStyle);
828 0 : if (bIsAutoStyle)
829 0 : SetAutoStyles((SvXMLStylesContext*)pContext);
830 : else
831 0 : SetStyles((SvXMLStylesContext*)pContext);
832 : }
833 0 : return pContext;
834 : }
835 : // -----------------------------------------------------------------------------
836 0 : SvXMLImportContext* ODBFilter::CreateScriptContext( const ::rtl::OUString& _rLocalName )
837 : {
838 0 : return new XMLScriptContext( *this, XML_NAMESPACE_OFFICE, _rLocalName, GetModel() );
839 : }
840 : // -----------------------------------------------------------------------------
841 0 : UniReference < XMLPropertySetMapper > ODBFilter::GetTableStylesPropertySetMapper() const
842 : {
843 0 : if ( !m_xTableStylesPropertySetMapper.is() )
844 : {
845 0 : m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper();
846 : }
847 0 : return m_xTableStylesPropertySetMapper;
848 : }
849 : // -----------------------------------------------------------------------------
850 0 : UniReference < XMLPropertySetMapper > ODBFilter::GetColumnStylesPropertySetMapper() const
851 : {
852 0 : if ( !m_xColumnStylesPropertySetMapper.is() )
853 : {
854 0 : m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper();
855 : }
856 0 : return m_xColumnStylesPropertySetMapper;
857 : }
858 : // -----------------------------------------------------------------------------
859 0 : UniReference < XMLPropertySetMapper > ODBFilter::GetCellStylesPropertySetMapper() const
860 : {
861 0 : if ( !m_xCellStylesPropertySetMapper.is() )
862 : {
863 0 : m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper();
864 : }
865 0 : return m_xCellStylesPropertySetMapper;
866 : }
867 : // -----------------------------------------------------------------------------
868 0 : void ODBFilter::setPropertyInfo()
869 : {
870 0 : Reference<XPropertySet> xDataSource(getDataSource());
871 0 : if ( !xDataSource.is() )
872 0 : return;
873 :
874 0 : ::connectivity::DriversConfig aDriverConfig(getServiceFactory());
875 0 : const ::rtl::OUString sURL = ::comphelper::getString(xDataSource->getPropertyValue(PROPERTY_URL));
876 0 : ::comphelper::NamedValueCollection aDataSourceSettings = aDriverConfig.getProperties( sURL );
877 :
878 0 : Sequence<PropertyValue> aInfo;
879 0 : if ( !m_aInfoSequence.empty() )
880 0 : aInfo = Sequence<PropertyValue>(&(*m_aInfoSequence.begin()),m_aInfoSequence.size());
881 0 : aDataSourceSettings.merge( ::comphelper::NamedValueCollection( aInfo ), true );
882 :
883 0 : aDataSourceSettings >>= aInfo;
884 0 : if ( aInfo.getLength() )
885 : {
886 : try
887 : {
888 0 : xDataSource->setPropertyValue(PROPERTY_INFO,makeAny(aInfo));
889 : }
890 0 : catch (const Exception&)
891 : {
892 : DBG_UNHANDLED_EXCEPTION();
893 : }
894 0 : }
895 : }
896 : // -----------------------------------------------------------------------------
897 : }// dbaxml
898 : // -----------------------------------------------------------------------------
899 :
900 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|