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