xref: /trunk/main/reportdesign/source/filter/xml/xmlfilter.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include "precompiled_rptxml.hxx"
24 #include <com/sun/star/packages/zip/ZipIOException.hpp>
25 #include <com/sun/star/embed/ElementModes.hpp>
26 #include <com/sun/star/beans/NamedValue.hpp>
27 #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
28 #include "xmlfilter.hxx"
29 #include "xmlGroup.hxx"
30 #include "xmlReport.hxx"
31 #include "xmlHelper.hxx"
32 #include <vcl/svapp.hxx>
33 #include <vcl/window.hxx>
34 #include <connectivity/dbtools.hxx>
35 #include <xmloff/xmlnmspe.hxx>
36 #include <xmloff/xmltoken.hxx>
37 #include <xmloff/txtimp.hxx>
38 #include <xmloff/nmspmap.hxx>
39 #include <xmloff/XMLFontStylesContext.hxx>
40 #include <rtl/logfile.hxx>
41 #include <com/sun/star/xml/sax/InputSource.hpp>
42 #include <com/sun/star/xml/sax/XParser.hpp>
43 #include <com/sun/star/beans/PropertyAttribute.hpp>
44 
45 #include <comphelper/genericpropertyset.hxx>
46 #include <comphelper/mediadescriptor.hxx>
47 #include <xmloff/ProgressBarHelper.hxx>
48 #include <sfx2/docfile.hxx>
49 #include <com/sun/star/io/XInputStream.hpp>
50 #include <com/sun/star/uno/XNamingService.hpp>
51 #include <tools/urlobj.hxx>
52 #include <xmloff/DocumentSettingsContext.hxx>
53 #include <xmloff/xmluconv.hxx>
54 #include <xmloff/xmlmetai.hxx>
55 #include <com/sun/star/util/XModifiable.hpp>
56 #include <vcl/svapp.hxx>
57 #include <vos/mutex.hxx>
58 #include <svtools/sfxecode.hxx>
59 #include "xmlEnums.hxx"
60 #include "xmlStyleImport.hxx"
61 #include "xmlstrings.hrc"
62 #include "xmlPropertyHandler.hxx"
63 #include <xmloff/txtprmap.hxx>
64 #include "ReportDefinition.hxx"
65 
66 
67 #define MAP_LEN(x) x, sizeof(x) - 1
68 //--------------------------------------------------------------------------
69 namespace rptxml
70 {
71 using namespace ::com::sun::star::uno;
72 using ::com::sun::star::uno::Reference;
73 using namespace ::com::sun::star;
74 using namespace ::com::sun::star::container;
75 using namespace ::com::sun::star::lang;
76 using namespace ::com::sun::star::beans;
77 using namespace ::com::sun::star::document;
78 using namespace ::com::sun::star::text;
79 using namespace ::com::sun::star::io;
80 using namespace ::com::sun::star::report;
81 using namespace ::com::sun::star::xml::sax;
82 using namespace xmloff;
83     sal_Char __READONLY_DATA sXML_np__rpt[] = "_report";
84     sal_Char __READONLY_DATA sXML_np___rpt[] = "__report";
85 
86     using namespace ::com::sun::star::util;
87 
88 class RptMLMasterStylesContext_Impl : public XMLTextMasterStylesContext
89 {
90     ORptFilter& m_rImport;
91     RptMLMasterStylesContext_Impl(const RptMLMasterStylesContext_Impl&);
92     void operator =(const RptMLMasterStylesContext_Impl&);
93 public:
94 
95     TYPEINFO();
96 
97     RptMLMasterStylesContext_Impl(
98             ORptFilter& rImport, sal_uInt16 nPrfx,
99             const ::rtl::OUString& rLName ,
100             const uno::Reference< xml::sax::XAttributeList > & xAttrList );
101     virtual ~RptMLMasterStylesContext_Impl();
102     virtual void EndElement();
103 };
104 
105 TYPEINIT1( RptMLMasterStylesContext_Impl, XMLTextMasterStylesContext );
DBG_NAME(rpt_RptMLMasterStylesContext_Impl)106 DBG_NAME(rpt_RptMLMasterStylesContext_Impl)
107 RptMLMasterStylesContext_Impl::RptMLMasterStylesContext_Impl(
108         ORptFilter& rImport, sal_uInt16 nPrfx,
109         const ::rtl::OUString& rLName ,
110         const uno::Reference< xml::sax::XAttributeList > & xAttrList ) :
111     XMLTextMasterStylesContext( rImport, nPrfx, rLName, xAttrList )
112     ,m_rImport(rImport)
113 {
114     DBG_CTOR(rpt_RptMLMasterStylesContext_Impl,NULL);
115 }
116 
~RptMLMasterStylesContext_Impl()117 RptMLMasterStylesContext_Impl::~RptMLMasterStylesContext_Impl()
118 {
119     DBG_DTOR(rpt_RptMLMasterStylesContext_Impl,NULL);
120 }
121 
EndElement()122 void RptMLMasterStylesContext_Impl::EndElement()
123 {
124     FinishStyles( sal_True );
125     m_rImport.FinishStyles();
126 }
127     /// read a component (file + filter version)
ReadThroughComponent(const uno::Reference<XInputStream> & xInputStream,const uno::Reference<XComponent> & xModelComponent,const sal_Char *,const uno::Reference<XMultiServiceFactory> & rFactory,const uno::Reference<XDocumentHandler> & _xFilter,sal_Bool)128 sal_Int32 ReadThroughComponent(
129     const uno::Reference<XInputStream>& xInputStream,
130     const uno::Reference<XComponent>& xModelComponent,
131     const sal_Char* /*pStreamName*/,
132     const uno::Reference<XMultiServiceFactory> & rFactory,
133     const uno::Reference< XDocumentHandler >& _xFilter,
134     sal_Bool /*bEncrypted*/ )
135 {
136     DBG_ASSERT(xInputStream.is(), "input stream missing");
137     DBG_ASSERT(xModelComponent.is(), "document missing");
138     DBG_ASSERT(rFactory.is(), "factory missing");
139 
140     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "rptxml", "oj", "ReadThroughComponent" );
141 
142     // prepare ParserInputSrouce
143     InputSource aParserInput;
144     aParserInput.aInputStream = xInputStream;
145 
146     // get parser
147     uno::Reference< XParser > xParser(
148         rFactory->createInstance(
149             ::rtl::OUString::createFromAscii("com.sun.star.xml.sax.Parser") ),
150         UNO_QUERY );
151     DBG_ASSERT( xParser.is(), "Can't create parser" );
152     if( !xParser.is() )
153         return 1;
154     RTL_LOGFILE_CONTEXT_TRACE( aLog, "parser created" );
155 
156     // get filter
157     DBG_ASSERT( _xFilter.is(), "Can't instantiate filter component." );
158     if( !_xFilter.is() )
159         return 1;
160 
161     // connect parser and filter
162     xParser->setDocumentHandler( _xFilter );
163 
164     // connect model and filter
165     uno::Reference < XImporter > xImporter( _xFilter, UNO_QUERY );
166     xImporter->setTargetDocument( xModelComponent );
167 
168 
169 #ifdef TIMELOG
170     // if we do profiling, we want to know the stream
171     RTL_LOGFILE_TRACE_AUTHOR1( "rptxml", "oj",
172                                "ReadThroughComponent : parsing \"%s\"", pStreamName );
173 #endif
174 
175     // finally, parser the stream
176     try
177     {
178         xParser->parseStream( aParserInput );
179     }
180     catch( SAXParseException&
181 
182 #if OSL_DEBUG_LEVEL > 1
183 r
184 #endif
185 )
186     {
187 #if OSL_DEBUG_LEVEL > 1
188         ByteString aError( "SAX parse exception catched while importing:\n" );
189         aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
190         aError += ByteString::CreateFromInt32( r.LineNumber );
191         aError += ',';
192         aError += ByteString::CreateFromInt32( r.ColumnNumber );
193 
194         DBG_ERROR( aError.GetBuffer() );
195 #endif
196         return 1;
197     }
198     catch( SAXException& )
199     {
200         return 1;
201     }
202     catch( packages::zip::ZipIOException& )
203     {
204         return ERRCODE_IO_BROKENPACKAGE;
205     }
206     catch( IOException& )
207     {
208         return 1;
209     }
210     catch( Exception& )
211     {
212         return 1;
213     }
214 
215     // success!
216     return 0;
217 }
218 
219 /// read a component (storage version)
ReadThroughComponent(uno::Reference<embed::XStorage> xStorage,const uno::Reference<XComponent> & xModelComponent,const sal_Char * pStreamName,const sal_Char * pCompatibilityStreamName,const uno::Reference<XMultiServiceFactory> & rFactory,const Reference<document::XGraphicObjectResolver> & _xGraphicObjectResolver,const Reference<document::XEmbeddedObjectResolver> & _xEmbeddedObjectResolver,const::rtl::OUString & _sFilterName,const uno::Reference<beans::XPropertySet> & _xProp)220 sal_Int32 ReadThroughComponent(
221     uno::Reference< embed::XStorage > xStorage,
222     const uno::Reference<XComponent>& xModelComponent,
223     const sal_Char* pStreamName,
224     const sal_Char* pCompatibilityStreamName,
225     const uno::Reference<XMultiServiceFactory> & rFactory,
226     const Reference< document::XGraphicObjectResolver > & _xGraphicObjectResolver,
227     const Reference<document::XEmbeddedObjectResolver>& _xEmbeddedObjectResolver,
228     const ::rtl::OUString& _sFilterName
229     ,const uno::Reference<beans::XPropertySet>& _xProp)
230 {
231     DBG_ASSERT( xStorage.is(), "Need storage!");
232     DBG_ASSERT(NULL != pStreamName, "Please, please, give me a name!");
233 
234     if ( xStorage.is() )
235     {
236         uno::Reference< io::XStream > xDocStream;
237         sal_Bool bEncrypted = sal_False;
238 
239         try
240         {
241             // open stream (and set parser input)
242             ::rtl::OUString sStreamName = ::rtl::OUString::createFromAscii(pStreamName);
243             if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
244             {
245                 // stream name not found! Then try the compatibility name.
246                 // if no stream can be opened, return immediately with OK signal
247 
248                 // do we even have an alternative name?
249                 if ( NULL == pCompatibilityStreamName )
250                     return 0;
251 
252                 // if so, does the stream exist?
253                 sStreamName = ::rtl::OUString::createFromAscii(pCompatibilityStreamName);
254                 if ( !xStorage->hasByName( sStreamName ) || !xStorage->isStreamElement( sStreamName ) )
255                     return 0;
256             }
257 
258             // get input stream
259             xDocStream = xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
260 
261             uno::Reference< beans::XPropertySet > xProps( xDocStream, uno::UNO_QUERY_THROW );
262             xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Encrypted") ) ) >>= bEncrypted;
263         }
264         catch( packages::WrongPasswordException& )
265         {
266             return ERRCODE_SFX_WRONGPASSWORD;
267         }
268         catch ( uno::Exception& )
269         {
270             return 1; // TODO/LATER: error handling
271         }
272 
273         sal_Int32 nArgs = 0;
274         if( _xGraphicObjectResolver.is())
275             nArgs++;
276         if( _xEmbeddedObjectResolver.is())
277             nArgs++;
278         if ( _xProp.is() )
279             nArgs++;
280 
281         uno::Sequence< uno::Any > aFilterCompArgs( nArgs );
282 
283         nArgs = 0;
284         if( _xGraphicObjectResolver.is())
285             aFilterCompArgs[nArgs++] <<= _xGraphicObjectResolver;
286         if( _xEmbeddedObjectResolver.is())
287             aFilterCompArgs[ nArgs++ ] <<= _xEmbeddedObjectResolver;
288         if ( _xProp.is() )
289             aFilterCompArgs[ nArgs++ ] <<= _xProp;
290 
291         Reference< xml::sax::XDocumentHandler > xDocHandler(
292             rFactory->createInstanceWithArguments( _sFilterName, aFilterCompArgs ),
293             uno::UNO_QUERY_THROW );
294         uno::Reference< XInputStream > xInputStream = xDocStream->getInputStream();
295         // read from the stream
296         return ReadThroughComponent( xInputStream
297                                     ,xModelComponent
298                                     ,pStreamName
299                                     ,rFactory
300                                     ,xDocHandler
301                                     ,bEncrypted );
302     }
303 
304     // TODO/LATER: better error handling
305     return 1;
306 }
307 
308 //---------------------------------------------------------------------
create(uno::Reference<uno::XComponentContext> const & xContext)309 uno::Reference< uno::XInterface > ORptImportHelper::create(uno::Reference< uno::XComponentContext > const & xContext)
310 {
311     return static_cast< XServiceInfo* >(new ORptFilter(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),IMPORT_SETTINGS ));
312 }
313 //---------------------------------------------------------------------
getImplementationName_Static()314 ::rtl::OUString ORptImportHelper::getImplementationName_Static(  ) throw (RuntimeException)
315 {
316     return ::rtl::OUString(SERVICE_SETTINGSIMPORTER);
317 }
318 //---------------------------------------------------------------------
getSupportedServiceNames_Static()319 Sequence< ::rtl::OUString > ORptImportHelper::getSupportedServiceNames_Static(  ) throw(RuntimeException)
320 {
321     Sequence< ::rtl::OUString > aSupported(1);
322     aSupported[0] = SERVICE_IMPORTFILTER;
323     return aSupported;
324 }
325 //---------------------------------------------------------------------
create(const Reference<XComponentContext> & xContext)326 Reference< XInterface > ORptContentImportHelper::create(const Reference< XComponentContext > & xContext)
327 {
328     return static_cast< XServiceInfo* >(new ORptFilter(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),IMPORT_AUTOSTYLES |   IMPORT_CONTENT | IMPORT_SCRIPTS |
329         IMPORT_FONTDECLS ));
330 }
331 //---------------------------------------------------------------------
getImplementationName_Static()332 ::rtl::OUString ORptContentImportHelper::getImplementationName_Static(  ) throw (RuntimeException)
333 {
334     return ::rtl::OUString(SERVICE_CONTENTIMPORTER);
335 }
336 //---------------------------------------------------------------------
getSupportedServiceNames_Static()337 Sequence< ::rtl::OUString > ORptContentImportHelper::getSupportedServiceNames_Static(  ) throw(RuntimeException)
338 {
339     Sequence< ::rtl::OUString > aSupported(1);
340     aSupported[0] = SERVICE_IMPORTFILTER;
341     return aSupported;
342 }
343 
344 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)345 Reference< XInterface > ORptStylesImportHelper::create(Reference< XComponentContext > const & xContext)
346 {
347     return static_cast< XServiceInfo* >(new ORptFilter(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),
348         IMPORT_STYLES | IMPORT_MASTERSTYLES | IMPORT_AUTOSTYLES |
349         IMPORT_FONTDECLS ));
350 }
351 //---------------------------------------------------------------------
getImplementationName_Static()352 ::rtl::OUString ORptStylesImportHelper::getImplementationName_Static(  ) throw (RuntimeException)
353 {
354     return ::rtl::OUString(SERVICE_STYLESIMPORTER);
355 }
356 //---------------------------------------------------------------------
getSupportedServiceNames_Static()357 Sequence< ::rtl::OUString > ORptStylesImportHelper::getSupportedServiceNames_Static(  ) throw(RuntimeException)
358 {
359     Sequence< ::rtl::OUString > aSupported(1);
360     aSupported[0] = SERVICE_IMPORTFILTER;
361     return aSupported;
362 }
363 
364 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)365 Reference< XInterface > ORptMetaImportHelper::create(Reference< XComponentContext > const & xContext)
366 {
367     return static_cast< XServiceInfo* >(new ORptFilter(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),
368         IMPORT_META));
369 }
370 //---------------------------------------------------------------------
getImplementationName_Static()371 ::rtl::OUString ORptMetaImportHelper::getImplementationName_Static(  ) throw (RuntimeException)
372 {
373     return ::rtl::OUString(SERVICE_METAIMPORTER);
374 }
375 //---------------------------------------------------------------------
getSupportedServiceNames_Static()376 Sequence< ::rtl::OUString > ORptMetaImportHelper::getSupportedServiceNames_Static(  ) throw(RuntimeException)
377 {
378     Sequence< ::rtl::OUString > aSupported(1);
379     aSupported[0] = SERVICE_IMPORTFILTER;
380     return aSupported;
381 }
382 
383 // -------------
384 // - ORptFilter -
385 // -------------
DBG_NAME(rpt_ORptFilter)386 DBG_NAME(rpt_ORptFilter)
387 ORptFilter::ORptFilter( const uno::Reference< XMultiServiceFactory >& _rxMSF,sal_uInt16 nImportFlags )
388     :SvXMLImport(_rxMSF,nImportFlags)
389 {
390     DBG_CTOR(rpt_ORptFilter,NULL);
391     GetMM100UnitConverter().setCoreMeasureUnit(MAP_100TH_MM);
392     GetMM100UnitConverter().setXMLMeasureUnit(MAP_CM);
393     GetNamespaceMap().Add( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__rpt) ),
394                         GetXMLToken(XML_N_RPT),
395                         XML_NAMESPACE_REPORT );
396 
397     GetNamespaceMap().Add( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np___rpt) ),
398                         GetXMLToken(XML_N_RPT_OASIS),
399                         XML_NAMESPACE_REPORT );
400 
401     m_xPropHdlFactory = new OXMLRptPropHdlFactory;
402     m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap(true);
403     m_xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory);
404     m_xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory);
405     m_xTableStylesPropertySetMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_DEFAULTS );
406 }
407 
408 // -----------------------------------------------------------------------------
409 
~ORptFilter()410 ORptFilter::~ORptFilter() throw()
411 {
412     DBG_DTOR(rpt_ORptFilter,NULL);
413 }
414 //------------------------------------------------------------------------------
create(uno::Reference<XComponentContext> const & xContext)415 uno::Reference< XInterface > ORptFilter::create(uno::Reference< XComponentContext > const & xContext)
416 {
417     return *(new ORptFilter(uno::Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY)));
418 }
419 
420 // -----------------------------------------------------------------------------
getImplementationName_Static()421 ::rtl::OUString ORptFilter::getImplementationName_Static(  ) throw(uno::RuntimeException)
422 {
423     return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.report.OReportFilter"));
424 }
425 
426 //--------------------------------------------------------------------------
getImplementationName()427 ::rtl::OUString SAL_CALL ORptFilter::getImplementationName(  ) throw(uno::RuntimeException)
428 {
429     return getImplementationName_Static();
430 }
431 //--------------------------------------------------------------------------
getSupportedServiceNames_Static()432 uno::Sequence< ::rtl::OUString > ORptFilter::getSupportedServiceNames_Static(  ) throw(uno::RuntimeException)
433 {
434     uno::Sequence< ::rtl::OUString > aServices(1);
435     aServices.getArray()[0] = SERVICE_IMPORTFILTER;
436 
437     return aServices;
438 }
439 
440 //--------------------------------------------------------------------------
getSupportedServiceNames()441 uno::Sequence< ::rtl::OUString > SAL_CALL ORptFilter::getSupportedServiceNames(  ) throw(uno::RuntimeException)
442 {
443     return getSupportedServiceNames_Static();
444 }
445 //------------------------------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)446 sal_Bool SAL_CALL ORptFilter::supportsService(const ::rtl::OUString& ServiceName) throw( uno::RuntimeException )
447 {
448     return ::comphelper::existsValue(ServiceName,getSupportedServiceNames_Static());
449 }
450 // -----------------------------------------------------------------------------
filter(const Sequence<PropertyValue> & rDescriptor)451 sal_Bool SAL_CALL ORptFilter::filter( const Sequence< PropertyValue >& rDescriptor )
452     throw (RuntimeException)
453 {
454     Window*     pFocusWindow = Application::GetFocusWindow();
455     sal_Bool    bRet = sal_False;
456 
457     if( pFocusWindow )
458         pFocusWindow->EnterWait();
459 
460     if ( GetModel().is() )
461         bRet = implImport( rDescriptor );
462 
463     if ( pFocusWindow )
464         pFocusWindow->LeaveWait();
465 
466     return bRet;
467 }
468 // -----------------------------------------------------------------------------
implImport(const Sequence<PropertyValue> & rDescriptor)469 sal_Bool ORptFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
470     throw (RuntimeException)
471 {
472     ::rtl::OUString                     sFileName;
473     uno::Reference< embed::XStorage >   xStorage;
474     uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier;
475 
476     const PropertyValue* pIter = rDescriptor.getConstArray();
477     const PropertyValue* pEnd   = pIter + rDescriptor.getLength();
478     for(;pIter != pEnd;++pIter)
479     {
480         if( pIter->Name.equalsAscii( "FileName" ) )
481             pIter->Value >>= sFileName;
482         else if( pIter->Name.equalsAscii( "Storage" ) )
483             pIter->Value >>= xStorage;
484         else if( pIter->Name.equalsAscii( "ComponentData" ) )
485         {
486             Sequence< PropertyValue > aComponent;
487             pIter->Value >>= aComponent;
488             const PropertyValue* pComponentIter = aComponent.getConstArray();
489             const PropertyValue* pComponentEnd  = pComponentIter + aComponent.getLength();
490             for(;pComponentIter != pComponentEnd;++pComponentIter)
491             {
492                 if( pComponentIter->Name.equalsAscii( "ActiveConnection" ) )
493                 {
494                     uno::Reference<sdbc::XConnection> xCon(pComponentIter->Value,uno::UNO_QUERY);
495                     xNumberFormatsSupplier = ::dbtools::getNumberFormats(xCon);
496                     break;
497                 }
498             }
499         }
500     }
501 
502     if ( sFileName.getLength() != 0 )
503     {
504         uno::Reference<XComponent> xCom(GetModel(),UNO_QUERY);
505 
506         SfxMediumRef pMedium = new SfxMedium(
507                 sFileName, ( STREAM_READ | STREAM_NOCREATE ), sal_False, 0 );
508 
509         if( pMedium )
510         {
511             try
512             {
513                 xStorage = pMedium->GetStorage();
514                 //  nError = pMedium->GetError();
515             }
516             catch(const Exception&)
517             {
518             }
519         } // if( pMedium )
520     } // if ( bRet = (sFileName.getLength() != 0) )
521     sal_Bool bRet = xStorage.is();
522     if ( bRet )
523     {
524         m_xReportDefinition.set(GetModel(),UNO_QUERY_THROW);
525         OSL_ENSURE(m_xReportDefinition.is(),"ReportDefinition is NULL!");
526         if ( !m_xReportDefinition.is() )
527             return sal_False;
528 
529 #if OSL_DEBUG_LEVEL > 1
530         uno::Reference < container::XNameAccess > xAccess( xStorage, uno::UNO_QUERY );
531         uno::Sequence< ::rtl::OUString> aSeq = xAccess->getElementNames();
532         const ::rtl::OUString* pDebugIter = aSeq.getConstArray();
533         const ::rtl::OUString* pDebugEnd      = pDebugIter + aSeq.getLength();
534         for(;pDebugIter != pDebugEnd;++pDebugIter)
535         {
536             (void)*pDebugIter;
537         }
538 #endif
539 
540         Reference< document::XGraphicObjectResolver > xGraphicObjectResolver;
541         uno::Reference<document::XEmbeddedObjectResolver> xEmbeddedObjectResolver;
542         uno::Reference< lang::XMultiServiceFactory > xServiceFactory( getServiceFactory(), uno::UNO_QUERY);
543         if( xServiceFactory.is())
544         {
545             uno::Sequence< uno::Any > aArgs(1);
546             aArgs[0] <<= xStorage;
547             xGraphicObjectResolver.set(
548                 xServiceFactory->createInstanceWithArguments(
549                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Svx.GraphicImportHelper")), aArgs ), uno::UNO_QUERY );
550 
551             uno::Reference< lang::XMultiServiceFactory > xReportServiceFactory( m_xReportDefinition, uno::UNO_QUERY);
552             aArgs[0] <<= beans::NamedValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Storage")),uno::makeAny(xStorage));
553             xEmbeddedObjectResolver.set( xReportServiceFactory->createInstanceWithArguments(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ImportEmbeddedObjectResolver")),aArgs) , uno::UNO_QUERY);
554         }
555 
556         static const ::rtl::OUString s_sOld(RTL_CONSTASCII_USTRINGPARAM("OldFormat"));
557         static comphelper::PropertyMapEntry pMap[] =
558         {
559             { MAP_LEN( "OldFormat" ), 1,    &::getCppuType((const sal_Bool*)0),                 beans::PropertyAttribute::BOUND,     0 },
560             { MAP_LEN( "StreamName"), 0,    &::getCppuType( (::rtl::OUString *)0 ),             beans::PropertyAttribute::MAYBEVOID, 0 },
561             { MAP_LEN("PrivateData"), 0,    &::getCppuType( (uno::Reference<XInterface> *)0 ),  beans::PropertyAttribute::MAYBEVOID, 0 },
562             { MAP_LEN( "BaseURI"),    0,    &::getCppuType( (::rtl::OUString *)0 ),             beans::PropertyAttribute::MAYBEVOID, 0 },
563             { MAP_LEN( "StreamRelPath"), 0, &::getCppuType( (::rtl::OUString *)0 ),             beans::PropertyAttribute::MAYBEVOID, 0 },
564             { NULL, 0, 0, NULL, 0, 0 }
565         };
566         ::comphelper::MediaDescriptor aDescriptor(rDescriptor);
567         uno::Reference<beans::XPropertySet> xProp = comphelper::GenericPropertySet_CreateInstance(new comphelper::PropertySetInfo(pMap));
568         const ::rtl::OUString sVal( aDescriptor.getUnpackedValueOrDefault(aDescriptor.PROP_DOCUMENTBASEURL(),::rtl::OUString()) );
569         xProp->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BaseURI")), uno::makeAny(sVal));
570         const ::rtl::OUString sHierarchicalDocumentName( aDescriptor.getUnpackedValueOrDefault(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HierarchicalDocumentName")),::rtl::OUString()) );
571         xProp->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath")), uno::makeAny(sHierarchicalDocumentName));
572 
573         uno::Reference<XComponent> xModel(GetModel(),UNO_QUERY);
574         static const ::rtl::OUString s_sMeta(RTL_CONSTASCII_USTRINGPARAM("meta.xml"));
575         static const rtl::OUString s_sStreamName(RTL_CONSTASCII_USTRINGPARAM("StreamName"));
576         xProp->setPropertyValue(s_sStreamName, uno::makeAny(s_sMeta));
577         sal_Int32 nRet = ReadThroughComponent( xStorage
578                                     ,xModel
579                                     ,"meta.xml"
580                                     ,"Meta.xml"
581                                     ,getServiceFactory()
582                                     ,xGraphicObjectResolver
583                                     ,xEmbeddedObjectResolver
584                                     ,SERVICE_METAIMPORTER
585                                     ,xProp
586                                     );
587 
588 
589         try
590         {
591             xProp->setPropertyValue(s_sOld,uno::makeAny(!(xStorage->hasByName(s_sMeta) || xStorage->isStreamElement( s_sMeta ))));
592         }
593         catch(uno::Exception&)
594         {
595             xProp->setPropertyValue(s_sOld,uno::makeAny(sal_True));
596         }
597 
598         if ( nRet == 0 )
599         {
600             xProp->setPropertyValue(s_sStreamName, uno::makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("settings.xml"))));
601             nRet = ReadThroughComponent( xStorage
602                                     ,xModel
603                                     ,"settings.xml"
604                                     ,"Settings.xml"
605                                     ,getServiceFactory()
606                                     ,xGraphicObjectResolver
607                                     ,xEmbeddedObjectResolver
608                                     ,SERVICE_SETTINGSIMPORTER
609                                     ,xProp
610                                     );
611         }
612         if ( nRet == 0 )
613         {
614             xProp->setPropertyValue(s_sStreamName, uno::makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("styles.xml"))));
615             nRet = ReadThroughComponent(xStorage
616                                     ,xModel
617                                     ,"styles.xml"
618                                     ,"Styles.xml"
619                                     ,getServiceFactory()
620                                     ,xGraphicObjectResolver
621                                     ,xEmbeddedObjectResolver
622                                     ,SERVICE_STYLESIMPORTER
623                                     ,xProp);
624         }
625 
626         if ( nRet == 0 )
627         {
628             xProp->setPropertyValue(s_sStreamName, uno::makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("content.xml"))));
629             nRet = ReadThroughComponent( xStorage
630                                     ,xModel
631                                     ,"content.xml"
632                                     ,"Content.xml"
633                                     ,getServiceFactory()
634                                     ,xGraphicObjectResolver
635                                     ,xEmbeddedObjectResolver
636                                     ,SERVICE_CONTENTIMPORTER
637                                     ,xProp
638                                     );
639         }
640 
641 
642         bRet = nRet == 0;
643 
644         if ( bRet )
645         {
646             m_xReportDefinition->setModified(sal_False);
647         }
648         else
649         {
650             switch( nRet )
651             {
652                 case ERRCODE_IO_BROKENPACKAGE:
653                     if( xStorage.is() )
654                     {
655                         // TODO/LATER: no way to transport the error outside from the filter!
656                         break;
657                     }
658                     // fall through intended
659                 default:
660                     {
661                         // TODO/LATER: this is completely wrong! Filter code should never call ErrorHandler directly! But for now this is the only way!
662                         ErrorHandler::HandleError( nRet );
663                         if( nRet & ERRCODE_WARNING_MASK )
664                             bRet = sal_True;
665                     }
666             }
667         }
668     }
669 
670     return bRet;
671 }
672 // -----------------------------------------------------------------------------
CreateContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)673 SvXMLImportContext* ORptFilter::CreateContext( sal_uInt16 nPrefix,
674                                       const ::rtl::OUString& rLocalName,
675                                       const uno::Reference< xml::sax::XAttributeList >& xAttrList )
676 {
677     SvXMLImportContext *pContext = 0;
678 
679     const SvXMLTokenMap& rTokenMap = GetDocElemTokenMap();
680     switch( rTokenMap.Get( nPrefix, rLocalName ) )
681     {
682         case XML_TOK_DOC_SETTINGS:
683             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
684             pContext = new XMLDocumentSettingsContext( *this, nPrefix, rLocalName,xAttrList );
685             break;
686         case XML_TOK_DOC_REPORT:
687             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
688             {
689                 const SvXMLStylesContext* pAutoStyles = GetAutoStyles();
690                 if ( pAutoStyles )
691                 {
692                     XMLPropStyleContext* pAutoStyle = PTR_CAST(XMLPropStyleContext,pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_PAGE_MASTER,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("pm1"))));
693                     if ( pAutoStyle )
694                     {
695                         pAutoStyle->FillPropertySet(getReportDefinition().get());
696                     }
697                 }
698                 pContext = new OXMLReport( *this, nPrefix, rLocalName,xAttrList,getReportDefinition(),NULL );
699             }
700             break;
701         case XML_TOK_DOC_STYLES:
702             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
703             pContext = CreateStylesContext( rLocalName, xAttrList, sal_False);
704             break;
705         case XML_TOK_DOC_AUTOSTYLES:
706             // don't use the autostyles from the styles-document for the progress
707             if ( ! IsXMLToken( rLocalName, XML_DOCUMENT_STYLES ) )
708                 GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
709             pContext = CreateStylesContext( rLocalName, xAttrList, sal_True);
710             break;
711         case XML_TOK_DOC_FONTDECLS:
712             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
713             pContext = CreateFontDeclsContext( rLocalName,xAttrList );
714             break;
715         case XML_TOK_DOC_MASTERSTYLES:
716             {
717                 SvXMLStylesContext* pStyleContext = new RptMLMasterStylesContext_Impl(*this, nPrefix, rLocalName,xAttrList);//CreateMasterStylesContext( rLocalName,xAttrList );
718                 pContext = pStyleContext;
719                 SetMasterStyles( pStyleContext );
720             }
721             break;
722         case XML_TOK_DOC_META:
723             GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
724             pContext = CreateMetaContext( rLocalName,xAttrList );
725             break;
726         default:
727             break;
728     }
729 
730     if ( !pContext )
731         pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );
732 
733     return pContext;
734 }
735 // -----------------------------------------------------------------------------
GetDocElemTokenMap() const736 const SvXMLTokenMap& ORptFilter::GetDocElemTokenMap() const
737 {
738     if ( !m_pDocElemTokenMap.get() )
739     {
740         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
741         {
742             { XML_NAMESPACE_OFFICE, XML_SETTINGS,           XML_TOK_DOC_SETTINGS    },
743             //{ XML_NAMESPACE_OOO,    XML_SETTINGS,         XML_TOK_DOC_SETTINGS    },
744             { XML_NAMESPACE_OFFICE, XML_STYLES,             XML_TOK_DOC_STYLES      },
745             //{ XML_NAMESPACE_OOO,    XML_STYLES,               XML_TOK_DOC_STYLES      },
746             { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES,   XML_TOK_DOC_AUTOSTYLES  },
747             //{ XML_NAMESPACE_OOO,    XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES  },
748             { XML_NAMESPACE_OFFICE, XML_REPORT,             XML_TOK_DOC_REPORT      },
749             { XML_NAMESPACE_OOO,    XML_REPORT,             XML_TOK_DOC_REPORT      },
750             { XML_NAMESPACE_OFFICE, XML_FONT_FACE_DECLS,    XML_TOK_DOC_FONTDECLS   },
751             { XML_NAMESPACE_OFFICE, XML_MASTER_STYLES,      XML_TOK_DOC_MASTERSTYLES    },
752             { XML_NAMESPACE_OFFICE, XML_DOCUMENT_META,      XML_TOK_DOC_META        },
753             //{ XML_NAMESPACE_OOO,    XML_FONT_FACE_DECLS,  XML_TOK_DOC_FONTDECLS   },
754             XML_TOKEN_MAP_END
755         };
756         m_pDocElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
757     }
758     return *m_pDocElemTokenMap;
759 }
760 // -----------------------------------------------------------------------------
GetReportElemTokenMap() const761 const SvXMLTokenMap& ORptFilter::GetReportElemTokenMap() const
762 {
763     if ( !m_pReportElemTokenMap.get() )
764         m_pReportElemTokenMap.reset(OXMLHelper::GetReportElemTokenMap());
765     return *m_pReportElemTokenMap;
766 }
767 // -----------------------------------------------------------------------------
GetSubDocumentElemTokenMap() const768 const SvXMLTokenMap& ORptFilter::GetSubDocumentElemTokenMap() const
769 {
770     if ( !m_pSubDocumentElemTokenMap.get() )
771         m_pSubDocumentElemTokenMap.reset(OXMLHelper::GetSubDocumentElemTokenMap());
772     return *m_pSubDocumentElemTokenMap;
773 }
774 // -----------------------------------------------------------------------------
GetFunctionElemTokenMap() const775 const SvXMLTokenMap& ORptFilter::GetFunctionElemTokenMap() const
776 {
777     if ( !m_pFunctionElemTokenMap.get() )
778     {
779         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
780         {
781             { XML_NAMESPACE_REPORT, XML_NAME,           XML_TOK_FUNCTION_NAME   },
782             { XML_NAMESPACE_REPORT, XML_FORMULA,        XML_TOK_FUNCTION_FORMULA},
783             { XML_NAMESPACE_REPORT, XML_PRE_EVALUATED,  XML_TOK_PRE_EVALUATED   },
784             { XML_NAMESPACE_REPORT, XML_INITIAL_FORMULA,XML_TOK_INITIAL_FORMULA   },
785             { XML_NAMESPACE_REPORT, XML_DEEP_TRAVERSING,XML_TOK_DEEP_TRAVERSING   },
786             XML_TOKEN_MAP_END
787         };
788         m_pFunctionElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
789     }
790     return *m_pFunctionElemTokenMap;
791 }
792 // -----------------------------------------------------------------------------
GetFormatElemTokenMap() const793 const SvXMLTokenMap& ORptFilter::GetFormatElemTokenMap() const
794 {
795     if ( !m_pFormatElemTokenMap.get() )
796     {
797         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
798         {
799             { XML_NAMESPACE_REPORT, XML_ENABLED                     ,   XML_TOK_ENABLED                     },
800             { XML_NAMESPACE_REPORT, XML_FORMULA                     ,   XML_TOK_FORMULA                     },
801             { XML_NAMESPACE_REPORT, XML_STYLE_NAME                  ,   XML_TOK_FORMAT_STYLE_NAME           },
802             XML_TOKEN_MAP_END
803         };
804         m_pFormatElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
805     }
806     return *m_pFormatElemTokenMap;
807 }
808 // -----------------------------------------------------------------------------
GetGroupElemTokenMap() const809 const SvXMLTokenMap& ORptFilter::GetGroupElemTokenMap() const
810 {
811     if ( !m_pGroupElemTokenMap.get() )
812     {
813         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
814         {
815             { XML_NAMESPACE_REPORT, XML_START_NEW_COLUMN            ,   XML_TOK_START_NEW_COLUMN            },
816             { XML_NAMESPACE_REPORT, XML_RESET_PAGE_NUMBER           ,   XML_TOK_RESET_PAGE_NUMBER           },
817             { XML_NAMESPACE_REPORT, XML_PRINT_HEADER_ON_EACH_PAGE   ,   XML_TOK_PRINT_HEADER_ON_EACH_PAGE   },
818             { XML_NAMESPACE_REPORT, XML_RESET_PAGE_NUMBER           ,   XML_TOK_RESET_PAGE_NUMBER           },
819             { XML_NAMESPACE_REPORT, XML_GROUP_EXPRESSION            ,   XML_TOK_GROUP_EXPRESSION            },
820             { XML_NAMESPACE_REPORT, XML_GROUP_HEADER                ,   XML_TOK_GROUP_HEADER                },
821             { XML_NAMESPACE_REPORT, XML_GROUP                       ,   XML_TOK_GROUP_GROUP                 },
822             { XML_NAMESPACE_REPORT, XML_DETAIL                      ,   XML_TOK_GROUP_DETAIL                },
823             { XML_NAMESPACE_REPORT, XML_GROUP_FOOTER                ,   XML_TOK_GROUP_FOOTER                },
824             { XML_NAMESPACE_REPORT, XML_SORT_ASCENDING              ,   XML_TOK_SORT_ASCENDING              },
825             { XML_NAMESPACE_REPORT, XML_KEEP_TOGETHER               ,   XML_TOK_GROUP_KEEP_TOGETHER         },
826             { XML_NAMESPACE_REPORT, XML_FUNCTION                    ,   XML_TOK_GROUP_FUNCTION              },
827             //{ XML_NAMESPACE_REPORT,   XML_            ,   XML_TOK_            },
828             XML_TOKEN_MAP_END
829         };
830         m_pGroupElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
831     }
832     return *m_pGroupElemTokenMap;
833 }
834 // -----------------------------------------------------------------------------
GetReportElementElemTokenMap() const835 const SvXMLTokenMap& ORptFilter::GetReportElementElemTokenMap() const
836 {
837     if ( !m_pElemTokenMap.get() )
838     {
839         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
840         {
841             { XML_NAMESPACE_REPORT, XML_PRINT_REPEATED_VALUES       ,XML_TOK_PRINT_REPEATED_VALUES              },
842             { XML_NAMESPACE_REPORT, XML_PRINT_ONLY_WHEN_GROUP_CHANGE,XML_TOK_PRINT_ONLY_WHEN_GROUP_CHANGE       },
843             { XML_NAMESPACE_REPORT, XML_CONDITIONAL_PRINT_EXPRESSION,XML_TOK_REP_CONDITIONAL_PRINT_EXPRESSION   },
844             { XML_NAMESPACE_REPORT, XML_REPORT_COMPONENT            ,XML_TOK_COMPONENT                          },
845             { XML_NAMESPACE_REPORT, XML_FORMAT_CONDITION            ,XML_TOK_FORMATCONDITION                    },
846             XML_TOKEN_MAP_END
847         };
848         m_pElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
849     }
850     return *m_pElemTokenMap;
851 }
852 // -----------------------------------------------------------------------------
GetControlElemTokenMap() const853 const SvXMLTokenMap& ORptFilter::GetControlElemTokenMap() const
854 {
855     if ( !m_pControlElemTokenMap.get() )
856     {
857         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
858         {
859             { XML_NAMESPACE_FORM,   XML_LABEL               ,XML_TOK_LABEL              },
860             { XML_NAMESPACE_FORM,   XML_PROPERTIES          ,XML_TOK_PROPERTIES         },
861             { XML_NAMESPACE_FORM,   XML_SIZE                ,XML_TOK_SIZE               },
862             { XML_NAMESPACE_FORM,   XML_IMAGE_DATA          ,XML_TOK_IMAGE_DATA         },
863             { XML_NAMESPACE_REPORT, XML_SCALE               ,XML_TOK_SCALE              },
864             { XML_NAMESPACE_REPORT, XML_REPORT_ELEMENT      ,XML_TOK_REPORT_ELEMENT     },
865             { XML_NAMESPACE_REPORT, XML_FORMULA             ,XML_TOK_DATA_FORMULA       },
866             { XML_NAMESPACE_REPORT, XML_PRESERVE_IRI        ,XML_TOK_PRESERVE_IRI       },
867             { XML_NAMESPACE_REPORT, XML_SELECT_PAGE         ,XML_TOK_SELECT_PAGE        },
868             XML_TOKEN_MAP_END
869         };
870         m_pControlElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
871     }
872     return *m_pControlElemTokenMap;
873 }
874 // -----------------------------------------------------------------------------
GetControlPropertyElemTokenMap() const875 const SvXMLTokenMap& ORptFilter::GetControlPropertyElemTokenMap() const
876 {
877     if ( !m_pControlElemTokenMap.get() )
878     {
879         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
880         {
881             { XML_NAMESPACE_FORM,   XML_PROPERTY_NAME   ,XML_TOK_PROPERTY_NAME          },
882             { XML_NAMESPACE_OOO,    XML_VALUE_TYPE      ,XML_TOK_VALUE_TYPE             },
883             { XML_NAMESPACE_FORM,   XML_LIST_PROPERTY   ,XML_TOK_LIST_PROPERTY          },
884             { XML_NAMESPACE_OOO,    XML_VALUE           ,XML_TOK_VALUE                  },
885             { XML_NAMESPACE_OOO,    XML_CURRENCY        ,XML_TOK_CURRENCY               },
886             { XML_NAMESPACE_OOO,    XML_DATE_VALUE      ,XML_TOK_DATE_VALUE             },
887             { XML_NAMESPACE_OOO,    XML_TIME_VALUE      ,XML_TOK_TIME_VALUE             },
888             { XML_NAMESPACE_OOO,    XML_STRING_VALUE    ,XML_TOK_STRING_VALUE           },
889             { XML_NAMESPACE_OOO,    XML_BOOLEAN_VALUE   ,XML_TOK_BOOLEAN_VALUE          },
890             XML_TOKEN_MAP_END
891         };
892         m_pControlElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
893     }
894     return *m_pControlElemTokenMap;
895 }
896 // -----------------------------------------------------------------------------
GetComponentElemTokenMap() const897 const SvXMLTokenMap& ORptFilter::GetComponentElemTokenMap() const
898 {
899     if ( !m_pComponentElemTokenMap.get() )
900     {
901         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
902         {
903             { XML_NAMESPACE_DRAW,   XML_NAME                        ,   XML_TOK_NAME                        },
904             { XML_NAMESPACE_DRAW,   XML_TEXT_STYLE_NAME             ,   XML_TOK_TEXT_STYLE_NAME             },
905             { XML_NAMESPACE_REPORT, XML_TRANSFORM                   ,   XML_TOK_TRANSFORM                   },
906             XML_TOKEN_MAP_END
907         };
908         m_pComponentElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
909     }
910     return *m_pComponentElemTokenMap;
911 }
912 // -----------------------------------------------------------------------------
GetColumnTokenMap() const913 const SvXMLTokenMap& ORptFilter::GetColumnTokenMap() const
914 {
915     if ( !m_pColumnTokenMap.get() )
916     {
917         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
918         {
919             { XML_NAMESPACE_TABLE,  XML_NAME                        ,   XML_TOK_NAME                        },
920             { XML_NAMESPACE_TABLE,  XML_STYLE_NAME                  ,   XML_TOK_COLUMN_STYLE_NAME           },
921             { XML_NAMESPACE_TABLE,  XML_TABLE_COLUMN                ,   XML_TOK_COLUMN                      },
922             { XML_NAMESPACE_TABLE,  XML_TABLE_ROW                   ,   XML_TOK_ROW                         },
923             { XML_NAMESPACE_TABLE,  XML_TABLE_CELL                  ,   XML_TOK_CELL                        },
924             { XML_NAMESPACE_TABLE,  XML_TABLE_COLUMNS               ,   XML_TOK_TABLE_COLUMNS               },
925             { XML_NAMESPACE_TABLE,  XML_TABLE_ROWS                  ,   XML_TOK_TABLE_ROWS                  },
926             { XML_NAMESPACE_TABLE,  XML_COVERED_TABLE_CELL          ,   XML_TOK_COV_CELL                    },
927             { XML_NAMESPACE_TABLE,  XML_NUMBER_COLUMNS_SPANNED      ,   XML_TOK_NUMBER_COLUMNS_SPANNED      },
928             { XML_NAMESPACE_TABLE,  XML_NUMBER_ROWS_SPANNED         ,   XML_TOK_NUMBER_ROWS_SPANNED         },
929             { XML_NAMESPACE_REPORT, XML_CONDITIONAL_PRINT_EXPRESSION,   XML_TOK_CONDITIONAL_PRINT_EXPRESSION},
930             XML_TOKEN_MAP_END
931         };
932         m_pColumnTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
933     }
934     return *m_pColumnTokenMap;
935 }
936 // -----------------------------------------------------------------------------
GetSectionElemTokenMap() const937 const SvXMLTokenMap& ORptFilter::GetSectionElemTokenMap() const
938 {
939     if ( !m_pSectionElemTokenMap.get() )
940     {
941         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
942         {
943             { XML_NAMESPACE_TABLE,  XML_TABLE                       ,   XML_TOK_TABLE                       },
944             { XML_NAMESPACE_TABLE,  XML_NAME                        ,   XML_TOK_SECTION_NAME                },
945             { XML_NAMESPACE_REPORT, XML_VISIBLE                     ,   XML_TOK_VISIBLE                     },
946             { XML_NAMESPACE_REPORT, XML_FORCE_NEW_PAGE              ,   XML_TOK_FORCE_NEW_PAGE              },
947             { XML_NAMESPACE_REPORT, XML_FORCE_NEW_COLUMN            ,   XML_TOK_FORCE_NEW_COLUMN            },
948             { XML_NAMESPACE_REPORT, XML_KEEP_TOGETHER               ,   XML_TOK_KEEP_TOGETHER               },
949             { XML_NAMESPACE_REPORT, XML_REPEAT_SECTION              ,   XML_TOK_REPEAT_SECTION              },
950             { XML_NAMESPACE_TABLE,  XML_STYLE_NAME                  ,   XML_TOK_SECT_STYLE_NAME             },
951             { XML_NAMESPACE_REPORT, XML_PAGE_PRINT_OPTION           ,   XML_TOK_PAGE_PRINT_OPTION           },
952 
953             XML_TOKEN_MAP_END
954         };
955         m_pSectionElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
956     }
957     return *m_pSectionElemTokenMap;
958 }
959 // -----------------------------------------------------------------------------
GetCellElemTokenMap() const960 const SvXMLTokenMap& ORptFilter::GetCellElemTokenMap() const
961 {
962     if ( !m_pCellElemTokenMap.get() )
963     {
964         static __FAR_DATA SvXMLTokenMapEntry aElemTokenMap[]=
965         {
966             { XML_NAMESPACE_TEXT,   XML_P                           ,   XML_TOK_P                           },
967             { XML_NAMESPACE_REPORT, XML_FIXED_CONTENT               ,   XML_TOK_FIXED_CONTENT               },
968             { XML_NAMESPACE_REPORT, XML_FORMATTED_TEXT              ,   XML_TOK_FORMATTED_TEXT              },
969             { XML_NAMESPACE_REPORT, XML_IMAGE                       ,   XML_TOK_IMAGE                       },
970             { XML_NAMESPACE_REPORT, XML_SUB_DOCUMENT                ,   XML_TOK_SUB_DOCUMENT                },
971             { XML_NAMESPACE_DRAW,   XML_CUSTOM_SHAPE                ,   XML_TOK_CUSTOM_SHAPE                },
972             { XML_NAMESPACE_DRAW,   XML_FRAME                       ,   XML_TOK_FRAME                       },
973             { XML_NAMESPACE_TEXT,   XML_PAGE_NUMBER                 ,   XML_TOK_PAGE_NUMBER                 },
974             { XML_NAMESPACE_TEXT,   XML_PAGE_COUNT                  ,   XML_TOK_PAGE_COUNT                  },
975             { XML_NAMESPACE_TEXT,   XML_TAB                         ,   XML_TOK_TEXT_TAB_STOP               },
976             { XML_NAMESPACE_TEXT,   XML_LINE_BREAK                  ,   XML_TOK_TEXT_LINE_BREAK             },
977             { XML_NAMESPACE_TEXT,   XML_S                           ,   XML_TOK_TEXT_S                      },
978             XML_TOKEN_MAP_END
979         };
980         m_pCellElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
981     }
982     return *m_pCellElemTokenMap;
983 }
984 // -----------------------------------------------------------------------------
CreateStylesContext(const::rtl::OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,sal_Bool bIsAutoStyle)985 SvXMLImportContext* ORptFilter::CreateStylesContext(const ::rtl::OUString& rLocalName,
986                                      const uno::Reference< XAttributeList>& xAttrList, sal_Bool bIsAutoStyle )
987 {
988     SvXMLImportContext* pContext = bIsAutoStyle ? GetAutoStyles() : GetStyles();
989     if ( !pContext )
990     {
991         pContext = new OReportStylesContext(*this, XML_NAMESPACE_OFFICE, rLocalName, xAttrList, bIsAutoStyle);
992         if (bIsAutoStyle)
993             //xAutoStyles = pContext;
994             SetAutoStyles((SvXMLStylesContext*)pContext);
995         else
996             //xStyles = pContext;
997             SetStyles((SvXMLStylesContext*)pContext);
998     }
999     return pContext;
1000 }
1001 // -----------------------------------------------------------------------------
getGlobalContext()1002 SvXMLImport&         ORptFilter::getGlobalContext()
1003 {
1004     return *this;
1005 }
1006 // -----------------------------------------------------------------------------
enterEventContext()1007 void ORptFilter::enterEventContext()
1008 {
1009 }
1010 // -----------------------------------------------------------------------------
leaveEventContext()1011 void ORptFilter::leaveEventContext()
1012 {
1013 }
1014 // -----------------------------------------------------------------------------
CreateFontDeclsContext(const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)1015 SvXMLImportContext *ORptFilter::CreateFontDeclsContext(
1016         const ::rtl::OUString& rLocalName,
1017         const uno::Reference< xml::sax::XAttributeList > & xAttrList )
1018 {
1019     XMLFontStylesContext *pFSContext =
1020             new XMLFontStylesContext( *this, XML_NAMESPACE_OFFICE,
1021                                       rLocalName, xAttrList,
1022                                       gsl_getSystemTextEncoding() );
1023     SetFontDecls( pFSContext );
1024     return pFSContext;
1025 }
1026 // -----------------------------------------------------------------------------
CreateShapeImport()1027 XMLShapeImportHelper* ORptFilter::CreateShapeImport()
1028 {
1029     return new XMLShapeImportHelper( *this,GetModel() );
1030 }
1031 // -----------------------------------------------------------------------------
FinishStyles()1032 void ORptFilter::FinishStyles()
1033 {
1034     if( GetStyles() )
1035         GetStyles()->FinishStyles( sal_True );
1036 }
1037 // -----------------------------------------------------------------------------
convertFormula(const::rtl::OUString & _sFormula)1038 ::rtl::OUString ORptFilter::convertFormula(const ::rtl::OUString& _sFormula)
1039 {
1040     //sal_Int32 nLen = _sFormula.getLength();
1041     //if ( nLen )
1042     //{
1043     //    const static ::rtl::OUString s_sField(RTL_CONSTASCII_USTRINGPARAM("field:["));
1044     //    sal_Int32 nPos = _sFormula.indexOf(s_sField);
1045     //    if ( nPos == -1 )
1046     //        nPos = 4; // "rpt:"
1047     //    else
1048     //    {
1049     //        nPos = s_sField.getLength();
1050     //        --nLen; // eat "]"
1051     //    }
1052     //    return _sFormula.copy(nPos,nLen-nPos);
1053     //}
1054     return _sFormula;
1055 }
1056 // -----------------------------------------------------------------------------
startDocument(void)1057 void SAL_CALL ORptFilter::startDocument( void )
1058     throw( xml::sax::SAXException, uno::RuntimeException )
1059 {
1060     m_xReportDefinition.set(GetModel(),UNO_QUERY_THROW);
1061     OSL_ENSURE(m_xReportDefinition.is(),"ReportDefinition is NULL!");
1062     if ( m_xReportDefinition.is() )
1063     {
1064         m_pReportModel = reportdesign::OReportDefinition::getSdrModel(m_xReportDefinition);
1065         OSL_ENSURE(m_pReportModel,"Report model is NULL!");
1066 
1067         SvXMLImport::startDocument();
1068     }
1069 }
1070 // -----------------------------------------------------------------------------
endDocument(void)1071 void ORptFilter::endDocument( void )
1072     throw( xml::sax::SAXException, uno::RuntimeException )
1073 {
1074     DBG_ASSERT( GetModel().is(), "model missing; maybe startDocument wasn't called?" );
1075     if( !GetModel().is() )
1076         return;
1077 
1078     // this method will modify the document directly -> lock SolarMutex
1079     vos::OGuard aGuard(Application::GetSolarMutex());
1080     // Clear the shape import to sort the shapes  (and not in the
1081     // destructor that might be called after the import has finished
1082     // for Java filters.
1083     if( HasShapeImport() )
1084         ClearShapeImport();
1085 
1086     // delegate to parent: takes care of error handling
1087     SvXMLImport::endDocument();
1088 }
1089 // -----------------------------------------------------------------------------
removeFunction(const::rtl::OUString & _sFunctionName)1090 void ORptFilter::removeFunction(const ::rtl::OUString& _sFunctionName)
1091 {
1092     m_aFunctions.erase(_sFunctionName);
1093 }
1094 // -----------------------------------------------------------------------------
insertFunction(const::com::sun::star::uno::Reference<::com::sun::star::report::XFunction> & _xFunction)1095 void ORptFilter::insertFunction(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XFunction > & _xFunction)
1096 {
1097     m_aFunctions.insert(TGroupFunctionMap::value_type(_xFunction->getName(),_xFunction));
1098 }
1099 // -----------------------------------------------------------------------------
CreateMetaContext(const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> &)1100 SvXMLImportContext* ORptFilter::CreateMetaContext(const ::rtl::OUString& rLocalName,const uno::Reference<xml::sax::XAttributeList>&)
1101 {
1102     SvXMLImportContext* pContext = NULL;
1103 
1104     if ( (getImportFlags() & IMPORT_META) )
1105     {
1106         uno::Reference<xml::sax::XDocumentHandler> xDocBuilder(
1107             getServiceFactory()->createInstance(::rtl::OUString::createFromAscii(
1108                 "com.sun.star.xml.dom.SAXDocumentBuilder")),
1109                 uno::UNO_QUERY_THROW);
1110         uno::Reference<document::XDocumentPropertiesSupplier> xDPS(GetModel(), uno::UNO_QUERY_THROW);
1111         pContext = new SvXMLMetaDocumentContext(*this,XML_NAMESPACE_OFFICE, rLocalName,xDPS->getDocumentProperties(), xDocBuilder);
1112     }
1113     return pContext;
1114 }
1115 // -----------------------------------------------------------------------------
isOldFormat() const1116 sal_Bool ORptFilter::isOldFormat() const
1117 {
1118     sal_Bool bOldFormat = sal_True;
1119     uno::Reference<beans::XPropertySet> xProp = getImportInfo();
1120     if ( xProp.is() )
1121     {
1122         const static ::rtl::OUString s_sOld(RTL_CONSTASCII_USTRINGPARAM("OldFormat"));
1123         if ( xProp->getPropertySetInfo()->hasPropertyByName(s_sOld))
1124         {
1125             xProp->getPropertyValue(s_sOld) >>= bOldFormat;
1126         }
1127     } // if ( xProp.is() )
1128     return bOldFormat;
1129 }
1130 
1131 // -----------------------------------------------------------------------------
1132 }// rptxml
1133 // -----------------------------------------------------------------------------
1134