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