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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 
27 
28 #include <com/sun/star/util/XStringSubstitution.hpp>
29 #include <xmloff/DocumentSettingsContext.hxx>
30 #include <xmloff/xmlimp.hxx>
31 #include <xmloff/xmltoken.hxx>
32 #include "xmloff/xmlnmspe.hxx"
33 #include <xmloff/nmspmap.hxx>
34 #include <xmloff/xmluconv.hxx>
35 #include <tools/debug.hxx>
36 
37 #ifndef __SGI_STL_LIST
38 #include <list>
39 #endif
40 #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
41 #include <com/sun/star/container/XIndexContainer.hpp>
42 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43 #include <com/sun/star/formula/SymbolDescriptor.hpp>
44 #include <comphelper/processfactory.hxx>
45 #include <com/sun/star/util/DateTime.hpp>
46 #include <com/sun/star/document/XViewDataSupplier.hpp>
47 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
48 #include <comphelper/configurationhelper.hxx>
49 #include <rtl/ustrbuf.hxx>
50 #include <xmlenums.hxx>
51 
52 using namespace com::sun::star;
53 using namespace ::xmloff::token;
54 
55 #define C2U(cChar) ::rtl::OUString::createFromAscii(cChar)
56 
57 //------------------------------------------------------------------
58 
59 class XMLMyList
60 {
61 	std::list<beans::PropertyValue>	aProps;
62 	sal_uInt32						nCount;
63 
64 	// #110680#
65 	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory;
66 
67 public:
68 	// #110680#
69 	XMLMyList(const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory);
70 	~XMLMyList();
71 
push_back(beans::PropertyValue & aProp)72 	void push_back(beans::PropertyValue& aProp) { aProps.push_back(aProp); nCount++; }
73 	uno::Sequence<beans::PropertyValue> GetSequence();
74 	uno::Reference<container::XNameContainer> GetNameContainer();
75 	uno::Reference<container::XIndexContainer> GetIndexContainer();
76 };
77 
78 // #110680#
XMLMyList(const uno::Reference<lang::XMultiServiceFactory> & xServiceFactory)79 XMLMyList::XMLMyList(const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory)
80 :	nCount(0),
81 	mxServiceFactory(xServiceFactory)
82 {
83 	DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
84 }
85 
86 // #110680#
~XMLMyList()87 XMLMyList::~XMLMyList()
88 {
89 }
90 
GetSequence()91 uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
92 {
93 	uno::Sequence<beans::PropertyValue> aSeq;
94 	if(nCount)
95 	{
96 		DBG_ASSERT(nCount == aProps.size(), "wrong count of PropertyValue");
97 		aSeq.realloc(nCount);
98 		beans::PropertyValue* pProps = aSeq.getArray();
99 		std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
100 		while (aItr != aProps.end())
101 		{
102 			*pProps = *aItr;
103 			pProps++;
104 			aItr++;
105 		}
106 	}
107 	return aSeq;
108 }
109 
GetNameContainer()110 uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
111 {
112 	uno::Reference<container::XNameContainer> xNameContainer;
113 
114 	// #110680#
115 	// uno::Reference<lang::XMultiServiceFactory> xServiceFactory = comphelper::getProcessServiceFactory();
116 	// DBG_ASSERT( xServiceFactory.is(), "got no service manager" );
117 
118 	if( mxServiceFactory.is() )
119 	{
120 		rtl::OUString sName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.NamedPropertyValues"));
121 		xNameContainer = uno::Reference<container::XNameContainer>(mxServiceFactory->createInstance(sName), uno::UNO_QUERY);
122 		if (xNameContainer.is())
123 		{
124 			std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
125 			while (aItr != aProps.end())
126 			{
127 				xNameContainer->insertByName(aItr->Name, aItr->Value);
128 				aItr++;
129 			}
130 		}
131 	}
132 	return xNameContainer;
133 }
134 
GetIndexContainer()135 uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
136 {
137 	uno::Reference<container::XIndexContainer> xIndexContainer;
138 	// #110680#
139 	// uno::Reference<lang::XMultiServiceFactory> xServiceFactory = comphelper::getProcessServiceFactory();
140 	// DBG_ASSERT( xServiceFactory.is(), "got no service manager" );
141 
142 	if( mxServiceFactory.is() )
143 	{
144 		rtl::OUString sName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.IndexedPropertyValues"));
145 		xIndexContainer = uno::Reference<container::XIndexContainer>(mxServiceFactory->createInstance(sName), uno::UNO_QUERY);
146 		if (xIndexContainer.is())
147 		{
148 			std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
149 			sal_uInt32 i(0);
150 			while (aItr != aProps.end())
151 			{
152 				xIndexContainer->insertByIndex(i, aItr->Value);
153 				aItr++;
154 				i++;
155 			}
156 		}
157 	}
158 	return xIndexContainer;
159 }
160 
161 //=============================================================================
162 
163 class XMLConfigBaseContext : public SvXMLImportContext
164 {
165 protected:
166 	XMLMyList					maProps;
167 	beans::PropertyValue		maProp;
168 	com::sun::star::uno::Any&	mrAny;
169 	XMLConfigBaseContext*		mpBaseContext;
170 public:
171 	XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
172 									com::sun::star::uno::Any& rAny,
173 									XMLConfigBaseContext* pBaseContext);
174 	virtual ~XMLConfigBaseContext();
175 
AddPropertyValue()176 	void AddPropertyValue() { maProps.push_back(maProp); }
177 };
178 
179 //=============================================================================
180 
181 class XMLConfigItemContext : public SvXMLImportContext
182 {
183 	rtl::OUString				msType;
184 	rtl::OUString				msValue;
185 	uno::Sequence<sal_Int8>		maDecoded;
186 	com::sun::star::uno::Any&	mrAny;
187     const rtl::OUString         mrItemName;
188 	XMLConfigBaseContext*		mpBaseContext;
189 
190 public:
191 	XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
192 									const ::com::sun::star::uno::Reference<
193 									::com::sun::star::xml::sax::XAttributeList>& xAttrList,
194 									com::sun::star::uno::Any& rAny,
195                                     const rtl::OUString& rItemName,
196 									XMLConfigBaseContext* pBaseContext);
197 	virtual ~XMLConfigItemContext();
198 
199 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
200 													const rtl::OUString& rLocalName,
201 													const ::com::sun::star::uno::Reference<
202 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
203 	virtual void Characters( const ::rtl::OUString& rChars );
204 
205 	virtual void EndElement();
206 
207     virtual void ManipulateConfigItem();
208 };
209 
210 //=============================================================================
211 
212 class XMLConfigItemSetContext : public XMLConfigBaseContext
213 {
214 public:
215 	XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
216 									const ::com::sun::star::uno::Reference<
217 									::com::sun::star::xml::sax::XAttributeList>& xAttrList,
218 									com::sun::star::uno::Any& rAny,
219 									XMLConfigBaseContext* pBaseContext);
220 	virtual ~XMLConfigItemSetContext();
221 
222 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
223 													const rtl::OUString& rLocalName,
224 													const ::com::sun::star::uno::Reference<
225 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
226 
227 	virtual void EndElement();
228 };
229 
230 //=============================================================================
231 
232 class XMLConfigItemMapNamedContext : public XMLConfigBaseContext
233 {
234 public:
235 	XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
236 									const ::com::sun::star::uno::Reference<
237 									::com::sun::star::xml::sax::XAttributeList>& xAttrList,
238 									com::sun::star::uno::Any& rAny,
239 									XMLConfigBaseContext* pBaseContext);
240 	virtual ~XMLConfigItemMapNamedContext();
241 
242 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
243 													const rtl::OUString& rLocalName,
244 													const ::com::sun::star::uno::Reference<
245 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList );
246 
247 	virtual void EndElement();
248 };
249 
250 //=============================================================================
251 
252 class XMLConfigItemMapIndexedContext : public XMLConfigBaseContext
253 {
254 private:
255 	rtl::OUString maConfigItemName;
256 
257 public:
258 	XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
259 									const rtl::OUString& rLName,
260 									const ::com::sun::star::uno::Reference<
261 									::com::sun::star::xml::sax::XAttributeList>& xAttrList,
262 									com::sun::star::uno::Any& rAny,
263 									const rtl::OUString& rConfigItemName,
264 									XMLConfigBaseContext* pBaseContext);
265 	virtual ~XMLConfigItemMapIndexedContext();
266 
267 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
268 													const rtl::OUString& rLocalName,
269 													const ::com::sun::star::uno::Reference<
270 										::com::sun::star::xml::sax::XAttributeList>& xAttrList );
271 
272 	virtual void EndElement();
273 };
274 
275 //=============================================================================
276 
CreateSettingsContext(SvXMLImport & rImport,sal_uInt16 p_nPrefix,const rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,beans::PropertyValue & rProp,XMLConfigBaseContext * pBaseContext)277 SvXMLImportContext *CreateSettingsContext(SvXMLImport& rImport, sal_uInt16 p_nPrefix,
278 						const rtl::OUString& rLocalName,
279 						const uno::Reference<xml::sax::XAttributeList>& xAttrList,
280 						beans::PropertyValue& rProp, XMLConfigBaseContext* pBaseContext)
281 {
282 	SvXMLImportContext *pContext = 0;
283 
284 	rProp.Name = rtl::OUString();
285 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
286 	for( sal_Int16 i=0; i < nAttrCount; i++ )
287 	{
288 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
289 		rtl::OUString aLocalName;
290 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(
291 											sAttrName, &aLocalName );
292 		rtl::OUString sValue = xAttrList->getValueByIndex( i );
293 
294 		if (nPrefix == XML_NAMESPACE_CONFIG)
295 		{
296 			if (IsXMLToken(aLocalName, XML_NAME))
297 				rProp.Name = sValue;
298 		}
299 	}
300 
301 	if (p_nPrefix == XML_NAMESPACE_CONFIG)
302 	{
303 		if (IsXMLToken(rLocalName, XML_CONFIG_ITEM))
304 			pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
305 		else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) ||
306 				(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) )
307 			pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
308 		else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED))
309 			pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
310 		else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED))
311 			pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
312 	}
313 
314 	if( !pContext )
315 		pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName );
316 
317 	return pContext;
318 }
319 
320 //=============================================================================
321 namespace
322 {
323     struct SettingsGroup
324     {
325         ::rtl::OUString sGroupName;
326         uno::Any        aSettings;
327 
SettingsGroup__anon707af0b70111::SettingsGroup328         SettingsGroup()
329             :sGroupName()
330             ,aSettings()
331         {
332         }
333 
SettingsGroup__anon707af0b70111::SettingsGroup334         SettingsGroup( const ::rtl::OUString& _rGroupName, const uno::Any& _rSettings )
335             :sGroupName( _rGroupName )
336             ,aSettings( _rSettings )
337         {
338         }
339     };
340 }
341 
342 struct XMLDocumentSettingsContext_Data
343 {
344 	com::sun::star::uno::Any	    aViewProps;
345 	com::sun::star::uno::Any	    aConfigProps;
346     ::std::list< SettingsGroup >    aDocSpecificSettings;
347 };
348 
349 //=============================================================================
350 
XMLDocumentSettingsContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &)351 XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
352 					const uno::Reference<xml::sax::XAttributeList>& )
353 	: SvXMLImportContext( rImport, nPrfx, rLName )
354     , m_pData( new XMLDocumentSettingsContext_Data )
355 {
356 	// here are no attributes
357 }
358 
~XMLDocumentSettingsContext()359 XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
360 {
361 }
362 
CreateChildContext(sal_uInt16 p_nPrefix,const rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)363 SvXMLImportContext *XMLDocumentSettingsContext::CreateChildContext( sal_uInt16 p_nPrefix,
364 									 const rtl::OUString& rLocalName,
365 									 const ::com::sun::star::uno::Reference<
366 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList )
367 {
368 	SvXMLImportContext *pContext = 0;
369 	rtl::OUString sName;
370 
371 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
372 	for( sal_Int16 i=0; i < nAttrCount; i++ )
373 	{
374 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
375 		rtl::OUString aLocalName;
376 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
377 											sAttrName, &aLocalName );
378 		rtl::OUString sValue = xAttrList->getValueByIndex( i );
379 
380 		if (nPrefix == XML_NAMESPACE_CONFIG)
381 		{
382 			if (IsXMLToken(aLocalName, XML_NAME))
383 				sName = sValue;
384 		}
385 	}
386 
387 	if (p_nPrefix == XML_NAMESPACE_CONFIG)
388 	{
389 		if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET))
390 		{
391 			::rtl::OUString aLocalConfigName;
392 			sal_uInt16 nConfigPrefix =
393 				GetImport().GetNamespaceMap().GetKeyByAttrName(
394 											sName, &aLocalConfigName );
395 
396 			if( XML_NAMESPACE_OOO == nConfigPrefix )
397 			{
398 				if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
399 					pContext = new XMLConfigItemSetContext(GetImport(),
400 										p_nPrefix, rLocalName, xAttrList,
401 										m_pData->aViewProps, NULL);
402 				else if (IsXMLToken(aLocalConfigName,
403 												XML_CONFIGURATION_SETTINGS))
404 					pContext = new XMLConfigItemSetContext(GetImport(),
405 										p_nPrefix, rLocalName, xAttrList,
406 										m_pData->aConfigProps, NULL);
407                 else
408                 {
409                     m_pData->aDocSpecificSettings.push_back( SettingsGroup( aLocalConfigName, uno::Any() ) );
410 
411                     ::std::list< SettingsGroup >::reverse_iterator settingsPos =
412                         m_pData->aDocSpecificSettings.rbegin();
413 
414                     pContext = new XMLConfigItemSetContext(GetImport(),
415 										p_nPrefix, rLocalName, xAttrList,
416 										settingsPos->aSettings, NULL);
417                 }
418 			}
419 		}
420 	}
421 
422 	if( !pContext )
423 		pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
424 
425 	return pContext;
426 }
427 
EndElement()428 void XMLDocumentSettingsContext::EndElement()
429 {
430 	uno::Sequence<beans::PropertyValue> aSeqViewProps;
431 	if (m_pData->aViewProps >>= aSeqViewProps)
432 	{
433 		GetImport().SetViewSettings(aSeqViewProps);
434 		sal_Int32 i(aSeqViewProps.getLength() - 1);
435 		sal_Bool bFound(sal_False);
436 		while((i >= 0) && !bFound)
437 		{
438 			if (aSeqViewProps[i].Name.compareToAscii("Views") == 0)
439 			{
440 				bFound = sal_True;
441 				uno::Reference<container::XIndexAccess> xIndexAccess;
442 				if (aSeqViewProps[i].Value >>= xIndexAccess)
443 				{
444 					uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
445 					if (xViewDataSupplier.is())
446 						xViewDataSupplier->setViewData(xIndexAccess);
447 				}
448 			}
449 			else
450 				i--;
451 		}
452 	}
453 
454     sal_Bool bLoadDocPrinter( sal_True );
455     ::comphelper::ConfigurationHelper::readDirectKey(
456         ::comphelper::getProcessServiceFactory(),
457         C2U("org.openoffice.Office.Common/"), C2U("Save/Document"), C2U("LoadPrinter"),
458         ::comphelper::ConfigurationHelper::E_READONLY ) >>= bLoadDocPrinter;
459     uno::Sequence<beans::PropertyValue> aSeqConfigProps;
460     if ( m_pData->aConfigProps >>= aSeqConfigProps )
461     {
462         if ( !bLoadDocPrinter )
463         {
464             sal_Int32 i = aSeqConfigProps.getLength() - 1;
465             int nFound = 0;
466 
467             while ( ( i >= 0 ) && nFound < 2 )
468             {
469                 rtl::OUString sProp( aSeqConfigProps[i].Name );
470 
471                 if ( sProp.compareToAscii("PrinterName") == 0 )
472                 {
473                     rtl::OUString sEmpty;
474                     aSeqConfigProps[i].Value = uno::makeAny( sEmpty );
475                     nFound++;
476                 }
477                 else if ( sProp.compareToAscii("PrinterSetup") == 0 )
478                 {
479                     uno::Sequence< sal_Int8 > aEmpty;
480                     aSeqConfigProps[i].Value = uno::makeAny( aEmpty );
481                     nFound++;
482                 }
483 
484                 i--;
485             }
486         }
487 
488         GetImport().SetConfigurationSettings( aSeqConfigProps );
489     }
490 
491     for (   ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin();
492             settings != m_pData->aDocSpecificSettings.end();
493             ++settings
494         )
495     {
496         uno::Sequence< beans::PropertyValue > aDocSettings;
497         OSL_VERIFY( settings->aSettings >>= aDocSettings );
498         GetImport().SetDocumentSpecificSettings( settings->sGroupName, aDocSettings );
499     }
500 }
501 
502 //=============================================================================
503 
XMLConfigBaseContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,com::sun::star::uno::Any & rTempAny,XMLConfigBaseContext * pTempBaseContext)504 XMLConfigBaseContext::XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
505 		const rtl::OUString& rLName, com::sun::star::uno::Any& rTempAny,
506 		XMLConfigBaseContext* pTempBaseContext)
507 	: SvXMLImportContext( rImport, nPrfx, rLName ),
508 	// #110680#
509 	maProps(rImport.getServiceFactory()),
510 	maProp(),
511 	mrAny(rTempAny),
512 	mpBaseContext(pTempBaseContext)
513 {
514 }
515 
~XMLConfigBaseContext()516 XMLConfigBaseContext::~XMLConfigBaseContext()
517 {
518 }
519 
520 //=============================================================================
521 
XMLConfigItemSetContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &,com::sun::star::uno::Any & rAny,XMLConfigBaseContext * pBaseContext)522 XMLConfigItemSetContext::XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
523 									const rtl::OUString& rLName,
524 									const ::com::sun::star::uno::Reference<
525 									::com::sun::star::xml::sax::XAttributeList>&,
526 									com::sun::star::uno::Any& rAny,
527 									XMLConfigBaseContext* pBaseContext)
528 	: XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext )
529 {
530 	// here are no attributes
531 }
532 
~XMLConfigItemSetContext()533 XMLConfigItemSetContext::~XMLConfigItemSetContext()
534 {
535 }
536 
CreateChildContext(sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)537 SvXMLImportContext *XMLConfigItemSetContext::CreateChildContext( sal_uInt16 nPrefix,
538 									 const rtl::OUString& rLocalName,
539 									 const ::com::sun::star::uno::Reference<
540 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList )
541 {
542 	return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
543 }
544 
EndElement()545 void XMLConfigItemSetContext::EndElement()
546 {
547 	mrAny <<= maProps.GetSequence();
548 	if (mpBaseContext)
549 		mpBaseContext->AddPropertyValue();
550 }
551 
552 //=============================================================================
553 
XMLConfigItemContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,com::sun::star::uno::Any & rTempAny,const rtl::OUString & rTempItemName,XMLConfigBaseContext * pTempBaseContext)554 XMLConfigItemContext::XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
555 									const ::com::sun::star::uno::Reference<
556 									::com::sun::star::xml::sax::XAttributeList>& xAttrList,
557 									com::sun::star::uno::Any& rTempAny,
558                                     const rtl::OUString& rTempItemName,
559 									XMLConfigBaseContext* pTempBaseContext)
560 	: SvXMLImportContext(rImport, nPrfx, rLName),
561 	mrAny(rTempAny),
562     mrItemName(rTempItemName),
563 	mpBaseContext(pTempBaseContext)
564 {
565 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
566 	for( sal_Int16 i=0; i < nAttrCount; i++ )
567 	{
568 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
569 		rtl::OUString aLocalName;
570 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
571 											sAttrName, &aLocalName );
572 		rtl::OUString sValue = xAttrList->getValueByIndex( i );
573 
574 		if (nPrefix == XML_NAMESPACE_CONFIG)
575 		{
576 			if (IsXMLToken(aLocalName, XML_TYPE))
577 				msType = sValue;
578 		}
579 	}
580 }
581 
~XMLConfigItemContext()582 XMLConfigItemContext::~XMLConfigItemContext()
583 {
584 }
585 
CreateChildContext(sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)586 SvXMLImportContext *XMLConfigItemContext::CreateChildContext( sal_uInt16 nPrefix,
587 													const rtl::OUString& rLocalName,
588 													const ::com::sun::star::uno::Reference<
589 									  	::com::sun::star::xml::sax::XAttributeList>& )
590 {
591 	SvXMLImportContext* pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
592 	return pContext;
593 }
594 
Characters(const::rtl::OUString & rChars)595 void XMLConfigItemContext::Characters( const ::rtl::OUString& rChars )
596 {
597 	if (IsXMLToken(msType, XML_BASE64BINARY))
598 	{
599 		rtl::OUString sTrimmedChars( rChars.trim() );
600 		if( sTrimmedChars.getLength() )
601 		{
602 			rtl::OUString sChars;
603 			if( !msValue.isEmpty() )
604 			{
605 				sChars = msValue;
606 				sChars += sTrimmedChars;
607 				msValue = rtl::OUString();
608 			}
609 			else
610 			{
611 				sChars = sTrimmedChars;
612 			}
613 			uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
614 			sal_Int32 nCharsDecoded =
615 				GetImport().GetMM100UnitConverter().
616 					decodeBase64SomeChars( aBuffer, sChars );
617 			sal_uInt32 nStartPos(maDecoded.getLength());
618 			sal_uInt32 nCount(aBuffer.getLength());
619 			maDecoded.realloc(nStartPos + nCount);
620 			sal_Int8* pDecoded = maDecoded.getArray();
621 			sal_Int8* pBuffer = aBuffer.getArray();
622 			for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++)
623 				pDecoded[nStartPos + i] = *pBuffer;
624 			if( nCharsDecoded != sChars.getLength() )
625 				msValue = sChars.copy( nCharsDecoded );
626 		}
627 	}
628 	else
629 		msValue += rChars;
630 }
631 
632 
EndElement()633 void XMLConfigItemContext::EndElement()
634 {
635 	if (mpBaseContext)
636 	{
637 		if (IsXMLToken(msType, XML_BOOLEAN))
638 		{
639 			sal_Bool bValue(sal_False);
640 			if (IsXMLToken(msValue, XML_TRUE))
641 				bValue = sal_True;
642 			mrAny <<= bValue;
643 		}
644 		else if (IsXMLToken(msType, XML_BYTE))
645 		{
646 			sal_Int32 nValue(0);
647 			SvXMLUnitConverter::convertNumber(nValue, msValue);
648 			mrAny <<= static_cast<sal_Int8>(nValue);
649 		}
650 		else if (IsXMLToken(msType, XML_SHORT))
651 		{
652 			sal_Int32 nValue(0);
653 			SvXMLUnitConverter::convertNumber(nValue, msValue);
654 			mrAny <<= static_cast<sal_Int16>(nValue);
655 		}
656 		else if (IsXMLToken(msType, XML_INT))
657 		{
658 			sal_Int32 nValue(0);
659 			SvXMLUnitConverter::convertNumber(nValue, msValue);
660 			mrAny <<= nValue;
661 		}
662 		else if (IsXMLToken(msType, XML_LONG))
663 		{
664 			sal_Int64 nValue(msValue.toInt64());
665 			mrAny <<= nValue;
666 		}
667 		else if (IsXMLToken(msType, XML_DOUBLE))
668 		{
669 			double fValue(0.0);
670 			SvXMLUnitConverter::convertDouble(fValue, msValue);
671 			mrAny <<= fValue;
672 		}
673 		else if (IsXMLToken(msType, XML_STRING))
674 		{
675 			mrAny <<= msValue;
676 		}
677 		else if (IsXMLToken(msType, XML_DATETIME))
678 		{
679 			util::DateTime aDateTime;
680 			SvXMLUnitConverter::convertDateTime(aDateTime, msValue);
681 			mrAny <<= aDateTime;
682 		}
683 		else if (IsXMLToken(msType, XML_BASE64BINARY))
684 		{
685 			mrAny <<= maDecoded;
686 		}
687 		else {
688 			DBG_ERROR("wrong type");
689         }
690 
691         ManipulateConfigItem();
692 
693 		mpBaseContext->AddPropertyValue();
694 	}
695 	else {
696 		DBG_ERROR("no BaseContext");
697     }
698 }
699 
700 /** There are some instances where there is a mismatch between API and
701  * XML mapping of a setting. In this case, this method allows us to
702  * manipulate the values accordingly. */
ManipulateConfigItem()703 void XMLConfigItemContext::ManipulateConfigItem()
704 {
705     if( mrItemName.equalsAsciiL(
706             RTL_CONSTASCII_STRINGPARAM( "PrinterIndependentLayout" ) ) )
707     {
708         rtl::OUString sValue;
709         mrAny >>= sValue;
710 
711         sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
712 
713         if( sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("enabled")) ||
714             sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("low-resolution")) )
715         {
716             nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
717         }
718         else if( sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("disabled")) )
719         {
720             nTmp = document::PrinterIndependentLayout::DISABLED;
721         }
722         // else: default to high_resolution
723 
724         mrAny <<= nTmp;
725     }
726 	else if( (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ColorTableURL" ) ) ) ||
727 			 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LineEndTableURL" ) ) ) ||
728 			 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HatchTableURL" ) ) ) ||
729 			 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DashTableURL" ) ) ) ||
730 			 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GradientTableURL") ) ) ||
731 			 (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BitmapTableURL" ) ) ) )
732 	{
733 		if( GetImport().getServiceFactory().is() ) try
734 		{
735 			uno::Reference< util::XStringSubstitution > xStringSubsitution(
736 				GetImport().getServiceFactory()->
737 					createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.PathSubstitution" ) ) ), uno::UNO_QUERY );
738 
739 			if( xStringSubsitution.is() )
740 			{
741 				rtl::OUString aURL;
742 				mrAny >>= aURL;
743 				aURL = xStringSubsitution->substituteVariables( aURL, sal_False );
744 				mrAny <<= aURL;
745 			}
746 		}
747 		catch( uno::Exception& )
748 		{
749 		}
750 	}
751 }
752 
753 
754 //=============================================================================
755 
XMLConfigItemMapNamedContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &,com::sun::star::uno::Any & rAny,XMLConfigBaseContext * pBaseContext)756 XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
757 									const ::com::sun::star::uno::Reference<
758 									::com::sun::star::xml::sax::XAttributeList>&,
759 									com::sun::star::uno::Any& rAny,
760 									XMLConfigBaseContext* pBaseContext)
761 	: XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext)
762 {
763 }
764 
~XMLConfigItemMapNamedContext()765 XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext()
766 {
767 }
768 
CreateChildContext(sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)769 SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix,
770 													const rtl::OUString& rLocalName,
771 													const ::com::sun::star::uno::Reference<
772 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList )
773 {
774 	return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
775 }
776 
EndElement()777 void XMLConfigItemMapNamedContext::EndElement()
778 {
779 	if (mpBaseContext)
780 	{
781 		mrAny <<= maProps.GetNameContainer();
782 		mpBaseContext->AddPropertyValue();
783 	}
784 	else {
785 		DBG_ERROR("no BaseContext");
786     }
787 }
788 
789 //=============================================================================
790 
XMLConfigItemMapIndexedContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &,com::sun::star::uno::Any & rAny,const::rtl::OUString & rConfigItemName,XMLConfigBaseContext * pBaseContext)791 XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
792 									const rtl::OUString& rLName,
793 									const ::com::sun::star::uno::Reference<
794 									::com::sun::star::xml::sax::XAttributeList>&,
795 									com::sun::star::uno::Any& rAny,
796 									const ::rtl::OUString& rConfigItemName,
797 									XMLConfigBaseContext* pBaseContext)
798 	: XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext),
799 	  maConfigItemName( rConfigItemName )
800 {
801 }
802 
~XMLConfigItemMapIndexedContext()803 XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext()
804 {
805 }
806 
CreateChildContext(sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)807 SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix,
808 													const rtl::OUString& rLocalName,
809 													const ::com::sun::star::uno::Reference<
810 										::com::sun::star::xml::sax::XAttributeList>& xAttrList )
811 {
812 	return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
813 }
814 
EndElement()815 void XMLConfigItemMapIndexedContext::EndElement()
816 {
817 	if (mpBaseContext)
818 	{
819 		if( maConfigItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ForbiddenCharacters" ) ) )
820 		{
821 			uno::Reference< i18n::XForbiddenCharacters > xForbChars;
822 
823 			// get the forbidden characters from the document
824 			uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
825 			if( xFac.is() )
826 			{
827 				uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.Settings" ) ) ), uno::UNO_QUERY );
828 				if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
829 				{
830 					xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
831 				}
832 			}
833 
834 			if( xForbChars.is() )
835 			{
836 
837 				uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
838 
839 				const sal_Int32 nCount = xIndex->getCount();
840 				uno::Sequence < beans::PropertyValue > aProps;
841 				for (sal_Int32 i = 0; i < nCount; i++)
842 				{
843 					if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) )
844 					{
845 						beans::PropertyValue *pForChar = aProps.getArray();
846 						i18n::ForbiddenCharacters aForbid;
847 						lang::Locale aLocale;
848 						const rtl::OUString sLanguage  ( RTL_CONSTASCII_USTRINGPARAM ( "Language" ) );
849 						const rtl::OUString sCountry   ( RTL_CONSTASCII_USTRINGPARAM ( "Country" ) );
850 						const rtl::OUString sVariant   ( RTL_CONSTASCII_USTRINGPARAM ( "Variant" ) );
851 						const rtl::OUString sBeginLine ( RTL_CONSTASCII_USTRINGPARAM ( "BeginLine" ) );
852 						const rtl::OUString sEndLine   ( RTL_CONSTASCII_USTRINGPARAM ( "EndLine" ) );
853 						sal_Bool bHaveLanguage = sal_False, bHaveCountry = sal_False, bHaveVariant = sal_False,
854 								 bHaveBegin = sal_False, bHaveEnd = sal_False;
855 
856 						for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
857 						{
858 							if (pForChar->Name.equals (sLanguage ) )
859 							{
860 								pForChar->Value >>= aLocale.Language;
861 								bHaveLanguage = sal_True;
862 							}
863 							else if (pForChar->Name.equals (sCountry ) )
864 							{
865 								pForChar->Value >>= aLocale.Country;
866 								bHaveCountry = sal_True;
867 							}
868 							else if (pForChar->Name.equals (sVariant ) )
869 							{
870 								pForChar->Value >>= aLocale.Variant;
871 								bHaveVariant = sal_True;
872 							}
873 							else if (pForChar->Name.equals (sBeginLine ) )
874 							{
875 								pForChar->Value >>= aForbid.beginLine;
876 								bHaveBegin = sal_True;
877 							}
878 							else if (pForChar->Name.equals (sEndLine ) )
879 							{
880 								pForChar->Value >>= aForbid.endLine;
881 								bHaveEnd = sal_True;
882 							}
883 							pForChar++;
884 						}
885 
886 						if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
887 						{
888 							try
889 							{
890 								xForbChars->setForbiddenCharacters( aLocale, aForbid );
891 							}
892 							catch( uno::Exception& )
893 							{
894 								DBG_ERROR( "Exception while importing forbidden characters" );
895 							}
896 						}
897 					}
898 				}
899 			}
900 			else
901 			{
902 				DBG_ERROR( "could not get the XForbiddenCharacters from document!" );
903 				mrAny <<= maProps.GetIndexContainer();
904 			}
905 		}
906 		else if( maConfigItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Symbols" ) ) )
907 		{
908 			uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
909 
910 			const sal_Int32 nCount = xIndex->getCount();
911 			uno::Sequence < beans::PropertyValue > aProps;
912 			uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
913 
914 			formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
915 
916 			const rtl::OUString sName     ( RTL_CONSTASCII_USTRINGPARAM ( "Name" ) );
917 			const rtl::OUString sExportName ( RTL_CONSTASCII_USTRINGPARAM ( "ExportName" ) );
918 			const rtl::OUString sFontName ( RTL_CONSTASCII_USTRINGPARAM ( "FontName" ) );
919 			const rtl::OUString sSymbolSet ( RTL_CONSTASCII_USTRINGPARAM ( "SymbolSet" ) );
920 			const rtl::OUString sCharacter ( RTL_CONSTASCII_USTRINGPARAM ( "Character" ) );
921 			const rtl::OUString sCharSet  ( RTL_CONSTASCII_USTRINGPARAM ( "CharSet" ) );
922 			const rtl::OUString sFamily   ( RTL_CONSTASCII_USTRINGPARAM ( "Family" ) );
923 			const rtl::OUString sPitch    ( RTL_CONSTASCII_USTRINGPARAM ( "Pitch" ) );
924 			const rtl::OUString sWeight   ( RTL_CONSTASCII_USTRINGPARAM ( "Weight" ) );
925 			const rtl::OUString sItalic   ( RTL_CONSTASCII_USTRINGPARAM ( "Italic" ) );
926 			sal_Int16 nNumFullEntries = 0;
927 
928 			for ( sal_Int32 i = 0; i < nCount; i++ )
929 			{
930 				if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
931 				{
932 					sal_Bool bHaveName = sal_False, bHaveExportName = sal_False, bHaveCharSet = sal_False,
933 					 		 bHaveFontName = sal_False, bHaveFamily = sal_False, bHavePitch = sal_False,
934 					 		 bHaveWeight = sal_False, bHaveItalic = sal_False, bHaveSymbolSet = sal_False,
935 							 bHaveCharacter = sal_False;
936 					beans::PropertyValue *pSymbol = aProps.getArray();
937 
938 					for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
939 					{
940 						if (pSymbol->Name.equals ( sName ) )
941 						{
942 							pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
943 							bHaveName = sal_True;
944 						}
945 						else if (pSymbol->Name.equals (sExportName ) )
946 						{
947 							pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
948 							bHaveExportName = sal_True;
949 						}
950 						else if (pSymbol->Name.equals (sFontName ) )
951 						{
952 							pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
953 							bHaveFontName = sal_True;
954 						}
955 						else if (pSymbol->Name.equals (sCharSet ) )
956 						{
957 							pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
958 							bHaveCharSet = sal_True;
959 						}
960 						else if (pSymbol->Name.equals (sFamily ) )
961 						{
962 							pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
963 							bHaveFamily = sal_True;
964 						}
965 						else if (pSymbol->Name.equals (sPitch ) )
966 						{
967 							pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
968 							bHavePitch = sal_True;
969 						}
970 						else if (pSymbol->Name.equals (sWeight ) )
971 						{
972 							pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
973 							bHaveWeight = sal_True;
974 						}
975 						else if (pSymbol->Name.equals (sItalic ) )
976 						{
977 							pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
978 							bHaveItalic = sal_True;
979 						}
980 						else if (pSymbol->Name.equals (sSymbolSet ) )
981 						{
982 							pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
983 							bHaveSymbolSet = sal_True;
984 						}
985 						else if (pSymbol->Name.equals (sCharacter ) )
986 						{
987 							pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
988 							bHaveCharacter = sal_True;
989 						}
990 						pSymbol++;
991 					}
992 					if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
993 						 && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
994 						nNumFullEntries++;
995 				}
996 			}
997 			aSymbolList.realloc (nNumFullEntries);
998 			mrAny <<= aSymbolList;
999 		}
1000 		else
1001 		{
1002 			mrAny <<= maProps.GetIndexContainer();
1003 		}
1004 		mpBaseContext->AddPropertyValue();
1005 	}
1006 	else {
1007 		DBG_ERROR("no BaseContext");
1008     }
1009 }
1010 
1011