Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sal/config.h>
21 :
22 : #include <officecfg/Office/Common.hxx>
23 : #include <sax/tools/converter.hxx>
24 :
25 : #include <com/sun/star/util/PathSubstitution.hpp>
26 : #include <com/sun/star/util/XStringSubstitution.hpp>
27 : #include <xmloff/DocumentSettingsContext.hxx>
28 : #include <xmloff/xmlimp.hxx>
29 : #include <xmloff/xmltoken.hxx>
30 : #include <xmloff/xmlnmspe.hxx>
31 : #include <xmloff/nmspmap.hxx>
32 : #include <xmloff/xmluconv.hxx>
33 : #include <comphelper/processfactory.hxx>
34 :
35 : #include <list>
36 : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
37 : #include <com/sun/star/container/XIndexContainer.hpp>
38 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
39 : #include <com/sun/star/formula/SymbolDescriptor.hpp>
40 : #include <com/sun/star/util/DateTime.hpp>
41 : #include <com/sun/star/document/XViewDataSupplier.hpp>
42 : #include <com/sun/star/document/PrinterIndependentLayout.hpp>
43 : #include <com/sun/star/document/IndexedPropertyValues.hpp>
44 : #include <com/sun/star/document/NamedPropertyValues.hpp>
45 : #include <rtl/ustrbuf.hxx>
46 : #include <osl/diagnose.h>
47 : #include <xmlenums.hxx>
48 :
49 : using namespace com::sun::star;
50 : using namespace ::xmloff::token;
51 :
52 2527 : class XMLMyList
53 : {
54 : std::list<beans::PropertyValue> aProps;
55 : sal_uInt32 nCount;
56 :
57 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext;
58 :
59 : public:
60 : explicit XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext);
61 :
62 44070 : void push_back(beans::PropertyValue& aProp) { aProps.push_back(aProp); nCount++; }
63 : uno::Sequence<beans::PropertyValue> GetSequence();
64 : uno::Reference<container::XNameContainer> GetNameContainer();
65 : uno::Reference<container::XIndexContainer> GetIndexContainer();
66 : };
67 :
68 2527 : XMLMyList::XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext)
69 : : nCount(0),
70 2527 : m_xContext(rxContext)
71 : {
72 : assert(m_xContext.is());
73 2527 : }
74 :
75 1836 : uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
76 : {
77 1836 : uno::Sequence<beans::PropertyValue> aSeq;
78 1836 : if(nCount)
79 : {
80 : assert(nCount == aProps.size());
81 1832 : aSeq.realloc(nCount);
82 1832 : beans::PropertyValue* pProps = aSeq.getArray();
83 1832 : std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
84 46947 : while (aItr != aProps.end())
85 : {
86 43283 : *pProps = *aItr;
87 43283 : ++pProps;
88 43283 : ++aItr;
89 : }
90 : }
91 1836 : return aSeq;
92 : }
93 :
94 147 : uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
95 : {
96 147 : uno::Reference<container::XNameContainer> xNameContainer = document::NamedPropertyValues::create(m_xContext);
97 147 : std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
98 519 : while (aItr != aProps.end())
99 : {
100 225 : xNameContainer->insertByName(aItr->Name, aItr->Value);
101 225 : ++aItr;
102 : }
103 :
104 147 : return xNameContainer;
105 : }
106 :
107 544 : uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
108 : {
109 544 : uno::Reference<container::XIndexContainer> xIndexContainer = document::IndexedPropertyValues::create(m_xContext);
110 544 : std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
111 544 : sal_uInt32 i(0);
112 1650 : while (aItr != aProps.end())
113 : {
114 562 : xIndexContainer->insertByIndex(i, aItr->Value);
115 562 : ++aItr;
116 562 : ++i;
117 : }
118 :
119 544 : return xIndexContainer;
120 : }
121 :
122 : class XMLConfigBaseContext : public SvXMLImportContext
123 : {
124 : protected:
125 : XMLMyList maProps;
126 : beans::PropertyValue maProp;
127 : com::sun::star::uno::Any& mrAny;
128 : XMLConfigBaseContext* mpBaseContext;
129 : public:
130 : XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
131 : com::sun::star::uno::Any& rAny,
132 : XMLConfigBaseContext* pBaseContext);
133 : virtual ~XMLConfigBaseContext();
134 :
135 44070 : void AddPropertyValue() { maProps.push_back(maProp); }
136 : };
137 :
138 : class XMLConfigItemContext : public SvXMLImportContext
139 : {
140 : OUString msType;
141 : OUString msValue;
142 : uno::Sequence<sal_Int8> maDecoded;
143 : com::sun::star::uno::Any& mrAny;
144 : const OUString mrItemName;
145 : XMLConfigBaseContext* mpBaseContext;
146 :
147 : public:
148 : XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
149 : const ::com::sun::star::uno::Reference<
150 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
151 : com::sun::star::uno::Any& rAny,
152 : const OUString& rItemName,
153 : XMLConfigBaseContext* pBaseContext);
154 : virtual ~XMLConfigItemContext();
155 :
156 : virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
157 : const OUString& rLocalName,
158 : const ::com::sun::star::uno::Reference<
159 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) SAL_OVERRIDE;
160 : virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
161 :
162 : virtual void EndElement() SAL_OVERRIDE;
163 :
164 : void ManipulateConfigItem();
165 : };
166 :
167 : class XMLConfigItemSetContext : public XMLConfigBaseContext
168 : {
169 : public:
170 : XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
171 : const ::com::sun::star::uno::Reference<
172 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
173 : com::sun::star::uno::Any& rAny,
174 : XMLConfigBaseContext* pBaseContext);
175 : virtual ~XMLConfigItemSetContext();
176 :
177 : virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
178 : const OUString& rLocalName,
179 : const ::com::sun::star::uno::Reference<
180 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) SAL_OVERRIDE;
181 :
182 : virtual void EndElement() SAL_OVERRIDE;
183 : };
184 :
185 : class XMLConfigItemMapNamedContext : public XMLConfigBaseContext
186 : {
187 : public:
188 : XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
189 : const ::com::sun::star::uno::Reference<
190 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
191 : com::sun::star::uno::Any& rAny,
192 : XMLConfigBaseContext* pBaseContext);
193 : virtual ~XMLConfigItemMapNamedContext();
194 :
195 : virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
196 : const OUString& rLocalName,
197 : const ::com::sun::star::uno::Reference<
198 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) SAL_OVERRIDE;
199 :
200 : virtual void EndElement() SAL_OVERRIDE;
201 : };
202 :
203 : class XMLConfigItemMapIndexedContext : public XMLConfigBaseContext
204 : {
205 : private:
206 : OUString maConfigItemName;
207 :
208 : public:
209 : XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
210 : const OUString& rLName,
211 : const ::com::sun::star::uno::Reference<
212 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
213 : com::sun::star::uno::Any& rAny,
214 : const OUString& rConfigItemName,
215 : XMLConfigBaseContext* pBaseContext);
216 : virtual ~XMLConfigItemMapIndexedContext();
217 :
218 : virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
219 : const OUString& rLocalName,
220 : const ::com::sun::star::uno::Reference<
221 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) SAL_OVERRIDE;
222 :
223 : virtual void EndElement() SAL_OVERRIDE;
224 : };
225 :
226 44070 : SvXMLImportContext *CreateSettingsContext(SvXMLImport& rImport, sal_uInt16 p_nPrefix,
227 : const OUString& rLocalName,
228 : const uno::Reference<xml::sax::XAttributeList>& xAttrList,
229 : beans::PropertyValue& rProp, XMLConfigBaseContext* pBaseContext)
230 : {
231 44070 : SvXMLImportContext *pContext = 0;
232 :
233 44070 : rProp.Name.clear();
234 44070 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
235 130165 : for( sal_Int16 i=0; i < nAttrCount; i++ )
236 : {
237 86095 : OUString sAttrName = xAttrList->getNameByIndex( i );
238 172190 : OUString aLocalName;
239 86095 : sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(
240 86095 : sAttrName, &aLocalName );
241 172190 : OUString sValue = xAttrList->getValueByIndex( i );
242 :
243 86095 : if (nPrefix == XML_NAMESPACE_CONFIG)
244 : {
245 86095 : if (IsXMLToken(aLocalName, XML_NAME))
246 43508 : rProp.Name = sValue;
247 : }
248 86095 : }
249 :
250 44070 : if (p_nPrefix == XML_NAMESPACE_CONFIG)
251 : {
252 44070 : if (IsXMLToken(rLocalName, XML_CONFIG_ITEM))
253 42587 : pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
254 2961 : else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) ||
255 1478 : (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) )
256 792 : pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
257 691 : else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED))
258 147 : pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
259 544 : else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED))
260 544 : pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
261 : }
262 :
263 44070 : if( !pContext )
264 0 : pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName );
265 :
266 44070 : return pContext;
267 : }
268 :
269 : namespace
270 : {
271 0 : struct SettingsGroup
272 : {
273 : OUString sGroupName;
274 : uno::Any aSettings;
275 :
276 0 : SettingsGroup( const OUString& _rGroupName, const uno::Any& _rSettings )
277 : :sGroupName( _rGroupName )
278 0 : ,aSettings( _rSettings )
279 : {
280 0 : }
281 : };
282 : }
283 :
284 1092 : struct XMLDocumentSettingsContext_Data
285 : {
286 : com::sun::star::uno::Any aViewProps;
287 : com::sun::star::uno::Any aConfigProps;
288 : ::std::list< SettingsGroup > aDocSpecificSettings;
289 : };
290 :
291 546 : XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
292 : const uno::Reference<xml::sax::XAttributeList>& )
293 : : SvXMLImportContext( rImport, nPrfx, rLName )
294 546 : , m_pData( new XMLDocumentSettingsContext_Data )
295 : {
296 : // here are no attributes
297 546 : }
298 :
299 1092 : XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
300 : {
301 1092 : }
302 :
303 1044 : SvXMLImportContext *XMLDocumentSettingsContext::CreateChildContext( sal_uInt16 p_nPrefix,
304 : const OUString& rLocalName,
305 : const ::com::sun::star::uno::Reference<
306 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
307 : {
308 1044 : SvXMLImportContext *pContext = 0;
309 1044 : OUString sName;
310 :
311 1044 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
312 2088 : for( sal_Int16 i=0; i < nAttrCount; i++ )
313 : {
314 1044 : OUString sAttrName = xAttrList->getNameByIndex( i );
315 2088 : OUString aLocalName;
316 1044 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
317 1044 : sAttrName, &aLocalName );
318 2088 : OUString sValue = xAttrList->getValueByIndex( i );
319 :
320 1044 : if (nPrefix == XML_NAMESPACE_CONFIG)
321 : {
322 1044 : if (IsXMLToken(aLocalName, XML_NAME))
323 1044 : sName = sValue;
324 : }
325 1044 : }
326 :
327 1044 : if (p_nPrefix == XML_NAMESPACE_CONFIG)
328 : {
329 1044 : if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET))
330 : {
331 1044 : OUString aLocalConfigName;
332 : sal_uInt16 nConfigPrefix =
333 1044 : GetImport().GetNamespaceMap().GetKeyByAttrName(
334 1044 : sName, &aLocalConfigName );
335 :
336 1044 : if( XML_NAMESPACE_OOO == nConfigPrefix )
337 : {
338 1044 : if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
339 545 : pContext = new XMLConfigItemSetContext(GetImport(),
340 : p_nPrefix, rLocalName, xAttrList,
341 545 : m_pData->aViewProps, NULL);
342 499 : else if (IsXMLToken(aLocalConfigName,
343 : XML_CONFIGURATION_SETTINGS))
344 499 : pContext = new XMLConfigItemSetContext(GetImport(),
345 : p_nPrefix, rLocalName, xAttrList,
346 499 : m_pData->aConfigProps, NULL);
347 : else
348 : {
349 0 : m_pData->aDocSpecificSettings.push_back( SettingsGroup( aLocalConfigName, uno::Any() ) );
350 :
351 : ::std::list< SettingsGroup >::reverse_iterator settingsPos =
352 0 : m_pData->aDocSpecificSettings.rbegin();
353 :
354 0 : pContext = new XMLConfigItemSetContext(GetImport(),
355 : p_nPrefix, rLocalName, xAttrList,
356 0 : settingsPos->aSettings, NULL);
357 : }
358 1044 : }
359 : }
360 : }
361 :
362 1044 : if( !pContext )
363 0 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
364 :
365 1044 : return pContext;
366 : }
367 :
368 546 : void XMLDocumentSettingsContext::EndElement()
369 : {
370 546 : uno::Sequence<beans::PropertyValue> aSeqViewProps;
371 546 : if (m_pData->aViewProps >>= aSeqViewProps)
372 : {
373 545 : GetImport().SetViewSettings(aSeqViewProps);
374 545 : sal_Int32 i(aSeqViewProps.getLength() - 1);
375 545 : bool bFound(false);
376 1931 : while((i >= 0) && !bFound)
377 : {
378 841 : if (aSeqViewProps[i].Name == "Views")
379 : {
380 463 : bFound = true;
381 463 : uno::Reference<container::XIndexAccess> xIndexAccess;
382 463 : if (aSeqViewProps[i].Value >>= xIndexAccess)
383 : {
384 463 : uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
385 463 : if (xViewDataSupplier.is())
386 463 : xViewDataSupplier->setViewData(xIndexAccess);
387 463 : }
388 : }
389 : else
390 378 : i--;
391 : }
392 : }
393 :
394 1092 : uno::Sequence<beans::PropertyValue> aSeqConfigProps;
395 546 : if ( m_pData->aConfigProps >>= aSeqConfigProps )
396 : {
397 499 : if (!officecfg::Office::Common::Save::Document::LoadPrinter::get())
398 : {
399 0 : sal_Int32 i = aSeqConfigProps.getLength() - 1;
400 0 : int nFound = 0;
401 :
402 0 : while ( ( i >= 0 ) && nFound < 2 )
403 : {
404 0 : OUString sProp( aSeqConfigProps[i].Name );
405 :
406 0 : if ( sProp == "PrinterName" )
407 : {
408 0 : OUString sEmpty;
409 0 : aSeqConfigProps[i].Value = uno::makeAny( sEmpty );
410 0 : nFound++;
411 : }
412 0 : else if ( sProp == "PrinterSetup" )
413 : {
414 0 : uno::Sequence< sal_Int8 > aEmpty;
415 0 : aSeqConfigProps[i].Value = uno::makeAny( aEmpty );
416 0 : nFound++;
417 : }
418 :
419 0 : i--;
420 0 : }
421 : }
422 :
423 499 : GetImport().SetConfigurationSettings( aSeqConfigProps );
424 : }
425 :
426 1638 : for ( ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin();
427 1092 : settings != m_pData->aDocSpecificSettings.end();
428 : ++settings
429 : )
430 : {
431 0 : uno::Sequence< beans::PropertyValue > aDocSettings;
432 0 : OSL_VERIFY( settings->aSettings >>= aDocSettings );
433 0 : GetImport().SetDocumentSpecificSettings( settings->sGroupName, aDocSettings );
434 546 : }
435 546 : }
436 :
437 2527 : XMLConfigBaseContext::XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
438 : const OUString& rLName, com::sun::star::uno::Any& rTempAny,
439 : XMLConfigBaseContext* pTempBaseContext)
440 : : SvXMLImportContext( rImport, nPrfx, rLName ),
441 : maProps( rImport.GetComponentContext() ),
442 : maProp(),
443 : mrAny(rTempAny),
444 2527 : mpBaseContext(pTempBaseContext)
445 : {
446 2527 : }
447 :
448 2527 : XMLConfigBaseContext::~XMLConfigBaseContext()
449 : {
450 2527 : }
451 :
452 1836 : XMLConfigItemSetContext::XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
453 : const OUString& rLName,
454 : const ::com::sun::star::uno::Reference<
455 : ::com::sun::star::xml::sax::XAttributeList>&,
456 : com::sun::star::uno::Any& rAny,
457 : XMLConfigBaseContext* pBaseContext)
458 1836 : : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext )
459 : {
460 : // here are no attributes
461 1836 : }
462 :
463 3672 : XMLConfigItemSetContext::~XMLConfigItemSetContext()
464 : {
465 3672 : }
466 :
467 43283 : SvXMLImportContext *XMLConfigItemSetContext::CreateChildContext( sal_uInt16 nPrefix,
468 : const OUString& rLocalName,
469 : const ::com::sun::star::uno::Reference<
470 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
471 : {
472 43283 : return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
473 : }
474 :
475 1836 : void XMLConfigItemSetContext::EndElement()
476 : {
477 1836 : mrAny <<= maProps.GetSequence();
478 1836 : if (mpBaseContext)
479 792 : mpBaseContext->AddPropertyValue();
480 1836 : }
481 :
482 42587 : XMLConfigItemContext::XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
483 : const ::com::sun::star::uno::Reference<
484 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
485 : com::sun::star::uno::Any& rTempAny,
486 : const OUString& rTempItemName,
487 : XMLConfigBaseContext* pTempBaseContext)
488 : : SvXMLImportContext(rImport, nPrfx, rLName),
489 : mrAny(rTempAny),
490 : mrItemName(rTempItemName),
491 42587 : mpBaseContext(pTempBaseContext)
492 : {
493 42587 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
494 127761 : for( sal_Int16 i=0; i < nAttrCount; i++ )
495 : {
496 85174 : OUString sAttrName = xAttrList->getNameByIndex( i );
497 170348 : OUString aLocalName;
498 85174 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
499 85174 : sAttrName, &aLocalName );
500 170348 : OUString sValue = xAttrList->getValueByIndex( i );
501 :
502 85174 : if (nPrefix == XML_NAMESPACE_CONFIG)
503 : {
504 85174 : if (IsXMLToken(aLocalName, XML_TYPE))
505 42587 : msType = sValue;
506 : }
507 85174 : }
508 42587 : }
509 :
510 85174 : XMLConfigItemContext::~XMLConfigItemContext()
511 : {
512 85174 : }
513 :
514 0 : SvXMLImportContext *XMLConfigItemContext::CreateChildContext( sal_uInt16 nPrefix,
515 : const OUString& rLocalName,
516 : const ::com::sun::star::uno::Reference<
517 : ::com::sun::star::xml::sax::XAttributeList>& )
518 : {
519 0 : SvXMLImportContext* pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
520 0 : return pContext;
521 : }
522 :
523 40486 : void XMLConfigItemContext::Characters( const OUString& rChars )
524 : {
525 40486 : if (IsXMLToken(msType, XML_BASE64BINARY))
526 : {
527 230 : OUString sTrimmedChars( rChars.trim() );
528 230 : if( !sTrimmedChars.isEmpty() )
529 : {
530 230 : OUString sChars;
531 230 : if( !msValue.isEmpty() )
532 : {
533 0 : sChars = msValue;
534 0 : sChars += sTrimmedChars;
535 0 : msValue.clear();
536 : }
537 : else
538 : {
539 230 : sChars = sTrimmedChars;
540 : }
541 460 : uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
542 : sal_Int32 const nCharsDecoded =
543 230 : ::sax::Converter::decodeBase64SomeChars( aBuffer, sChars );
544 230 : sal_uInt32 nStartPos(maDecoded.getLength());
545 230 : sal_uInt32 nCount(aBuffer.getLength());
546 230 : maDecoded.realloc(nStartPos + nCount);
547 230 : sal_Int8* pDecoded = maDecoded.getArray();
548 230 : sal_Int8* pBuffer = aBuffer.getArray();
549 81183 : for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++)
550 80953 : pDecoded[nStartPos + i] = *pBuffer;
551 230 : if( nCharsDecoded != sChars.getLength() )
552 230 : msValue = sChars.copy( nCharsDecoded );
553 230 : }
554 : }
555 : else
556 40256 : msValue += rChars;
557 40486 : }
558 :
559 42587 : void XMLConfigItemContext::EndElement()
560 : {
561 42587 : if (mpBaseContext)
562 : {
563 42587 : if (IsXMLToken(msType, XML_BOOLEAN))
564 : {
565 25698 : bool bValue(false);
566 25698 : if (IsXMLToken(msValue, XML_TRUE))
567 10830 : bValue = true;
568 25698 : mrAny <<= bValue;
569 : }
570 16889 : else if (IsXMLToken(msType, XML_BYTE))
571 : {
572 0 : sal_Int32 nValue(0);
573 0 : ::sax::Converter::convertNumber(nValue, msValue);
574 0 : mrAny <<= static_cast<sal_Int8>(nValue);
575 : }
576 16889 : else if (IsXMLToken(msType, XML_SHORT))
577 : {
578 3263 : sal_Int32 nValue(0);
579 3263 : ::sax::Converter::convertNumber(nValue, msValue);
580 3263 : mrAny <<= static_cast<sal_Int16>(nValue);
581 : }
582 13626 : else if (IsXMLToken(msType, XML_INT))
583 : {
584 7095 : sal_Int32 nValue(0);
585 7095 : ::sax::Converter::convertNumber(nValue, msValue);
586 7095 : mrAny <<= nValue;
587 : }
588 6531 : else if (IsXMLToken(msType, XML_LONG))
589 : {
590 2497 : sal_Int64 nValue(msValue.toInt64());
591 2497 : mrAny <<= nValue;
592 : }
593 4034 : else if (IsXMLToken(msType, XML_DOUBLE))
594 : {
595 0 : double fValue(0.0);
596 0 : ::sax::Converter::convertDouble(fValue, msValue);
597 0 : mrAny <<= fValue;
598 : }
599 4034 : else if (IsXMLToken(msType, XML_STRING))
600 : {
601 3128 : mrAny <<= msValue;
602 : }
603 906 : else if (IsXMLToken(msType, XML_DATETIME))
604 : {
605 2 : util::DateTime aDateTime;
606 2 : ::sax::Converter::parseDateTime(aDateTime, 0, msValue);
607 2 : mrAny <<= aDateTime;
608 : }
609 904 : else if (IsXMLToken(msType, XML_BASE64BINARY))
610 : {
611 904 : mrAny <<= maDecoded;
612 : }
613 : else {
614 : SAL_INFO("xmloff.core",
615 : "XMLConfigItemContext: unknown type: " << msType);
616 : }
617 :
618 42587 : ManipulateConfigItem();
619 :
620 42587 : mpBaseContext->AddPropertyValue();
621 : }
622 : else {
623 : assert(false && "no BaseContext");
624 : }
625 42587 : }
626 :
627 : /** There are some instances where there is a mismatch between API and
628 : * XML mapping of a setting. In this case, this method allows us to
629 : * manipulate the values accordingly. */
630 42587 : void XMLConfigItemContext::ManipulateConfigItem()
631 : {
632 42587 : if( mrItemName == "PrinterIndependentLayout" )
633 : {
634 328 : OUString sValue;
635 328 : mrAny >>= sValue;
636 :
637 328 : sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
638 :
639 328 : if( sValue == "enabled" || sValue == "low-resolution" )
640 : {
641 46 : nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
642 : }
643 282 : else if ( sValue == "disabled" )
644 : {
645 15 : nTmp = document::PrinterIndependentLayout::DISABLED;
646 : }
647 : // else: default to high_resolution
648 :
649 328 : mrAny <<= nTmp;
650 : }
651 126733 : else if( (mrItemName == "ColorTableURL") || (mrItemName == "LineEndTableURL") || (mrItemName == "HatchTableURL")
652 84386 : || (mrItemName == "DashTableURL") || (mrItemName == "GradientTableURL") || (mrItemName == "BitmapTableURL") )
653 : {
654 : try
655 : {
656 264 : uno::Reference< uno::XComponentContext > xContext( GetImport().GetComponentContext() );
657 528 : uno::Reference< util::XStringSubstitution > xStringSubsitution( util::PathSubstitution::create(xContext) );
658 :
659 528 : OUString aURL;
660 264 : mrAny >>= aURL;
661 264 : aURL = xStringSubsitution->substituteVariables( aURL, sal_False );
662 528 : mrAny <<= aURL;
663 : }
664 0 : catch( uno::Exception& )
665 : {
666 : }
667 : }
668 42587 : }
669 :
670 147 : XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
671 : const ::com::sun::star::uno::Reference<
672 : ::com::sun::star::xml::sax::XAttributeList>&,
673 : com::sun::star::uno::Any& rAny,
674 : XMLConfigBaseContext* pBaseContext)
675 147 : : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext)
676 : {
677 147 : }
678 :
679 294 : XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext()
680 : {
681 294 : }
682 :
683 225 : SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix,
684 : const OUString& rLocalName,
685 : const ::com::sun::star::uno::Reference<
686 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
687 : {
688 225 : return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
689 : }
690 :
691 147 : void XMLConfigItemMapNamedContext::EndElement()
692 : {
693 147 : if (mpBaseContext)
694 : {
695 147 : mrAny <<= maProps.GetNameContainer();
696 147 : mpBaseContext->AddPropertyValue();
697 : }
698 : else {
699 : assert(false && "no BaseContext");
700 : }
701 147 : }
702 :
703 544 : XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
704 : const OUString& rLName,
705 : const ::com::sun::star::uno::Reference<
706 : ::com::sun::star::xml::sax::XAttributeList>&,
707 : com::sun::star::uno::Any& rAny,
708 : const OUString& rConfigItemName,
709 : XMLConfigBaseContext* pBaseContext)
710 : : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext),
711 544 : maConfigItemName( rConfigItemName )
712 : {
713 544 : }
714 :
715 1088 : XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext()
716 : {
717 1088 : }
718 :
719 562 : SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix,
720 : const OUString& rLocalName,
721 : const ::com::sun::star::uno::Reference<
722 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
723 : {
724 562 : return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
725 : }
726 :
727 544 : void XMLConfigItemMapIndexedContext::EndElement()
728 : {
729 544 : if (mpBaseContext)
730 : {
731 544 : if ( maConfigItemName == "ForbiddenCharacters" )
732 : {
733 81 : uno::Reference< i18n::XForbiddenCharacters > xForbChars;
734 :
735 : // get the forbidden characters from the document
736 162 : uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
737 81 : if( xFac.is() )
738 : {
739 81 : uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( "com.sun.star.document.Settings" ), uno::UNO_QUERY );
740 81 : if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
741 : {
742 81 : xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
743 81 : }
744 : }
745 :
746 81 : if( xForbChars.is() )
747 : {
748 :
749 81 : uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
750 :
751 81 : const sal_Int32 nCount = xIndex->getCount();
752 162 : uno::Sequence < beans::PropertyValue > aProps;
753 180 : for (sal_Int32 i = 0; i < nCount; i++)
754 : {
755 99 : if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) )
756 : {
757 : /* FIXME-BCP47: this stupid and counterpart in
758 : * xmloff/source/core/SettingsExportHelper.cxx
759 : * XMLSettingsExportHelper::exportForbiddenCharacters()
760 : * */
761 :
762 99 : beans::PropertyValue *pForChar = aProps.getArray();
763 99 : i18n::ForbiddenCharacters aForbid;
764 198 : lang::Locale aLocale;
765 99 : bool bHaveLanguage = false, bHaveCountry = false, bHaveVariant = false,
766 99 : bHaveBegin = false, bHaveEnd = false;
767 :
768 594 : for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
769 : {
770 495 : if (pForChar->Name == "Language")
771 : {
772 99 : pForChar->Value >>= aLocale.Language;
773 99 : bHaveLanguage = true;
774 : }
775 396 : else if (pForChar->Name == "Country")
776 : {
777 99 : pForChar->Value >>= aLocale.Country;
778 99 : bHaveCountry = true;
779 : }
780 297 : else if (pForChar->Name == "Variant")
781 : {
782 99 : pForChar->Value >>= aLocale.Variant;
783 99 : bHaveVariant = true;
784 : }
785 198 : else if (pForChar->Name == "BeginLine")
786 : {
787 99 : pForChar->Value >>= aForbid.beginLine;
788 99 : bHaveBegin = true;
789 : }
790 99 : else if (pForChar->Name == "EndLine")
791 : {
792 99 : pForChar->Value >>= aForbid.endLine;
793 99 : bHaveEnd = true;
794 : }
795 495 : pForChar++;
796 : }
797 :
798 99 : if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
799 : {
800 : try
801 : {
802 99 : xForbChars->setForbiddenCharacters( aLocale, aForbid );
803 : }
804 0 : catch (uno::Exception const& e)
805 : {
806 : SAL_WARN("xmloff.core",
807 : "Exception while importing forbidden characters: " << e.Message);
808 : }
809 99 : }
810 : }
811 81 : }
812 : }
813 : else
814 : {
815 : SAL_WARN("xmloff.core", "could not get the XForbiddenCharacters from document!");
816 0 : mrAny <<= maProps.GetIndexContainer();
817 81 : }
818 : }
819 463 : else if ( maConfigItemName == "Symbols" )
820 : {
821 0 : uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
822 :
823 0 : const sal_Int32 nCount = xIndex->getCount();
824 0 : uno::Sequence < beans::PropertyValue > aProps;
825 0 : uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
826 :
827 0 : formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
828 :
829 0 : sal_Int16 nNumFullEntries = 0;
830 :
831 0 : for ( sal_Int32 i = 0; i < nCount; i++ )
832 : {
833 0 : if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
834 : {
835 0 : bool bHaveName = false, bHaveExportName = false, bHaveCharSet = false,
836 0 : bHaveFontName = false, bHaveFamily = false, bHavePitch = false,
837 0 : bHaveWeight = false, bHaveItalic = false, bHaveSymbolSet = false,
838 0 : bHaveCharacter = false;
839 0 : beans::PropertyValue *pSymbol = aProps.getArray();
840 :
841 0 : for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
842 : {
843 0 : if (pSymbol->Name == "Name")
844 : {
845 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
846 0 : bHaveName = true;
847 : }
848 0 : else if (pSymbol->Name == "ExportName")
849 : {
850 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
851 0 : bHaveExportName = true;
852 : }
853 0 : else if (pSymbol->Name == "FontName")
854 : {
855 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
856 0 : bHaveFontName = true;
857 : }
858 0 : else if (pSymbol->Name == "CharSet")
859 : {
860 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
861 0 : bHaveCharSet = true;
862 : }
863 0 : else if (pSymbol->Name == "Family")
864 : {
865 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
866 0 : bHaveFamily = true;
867 : }
868 0 : else if (pSymbol->Name == "Pitch")
869 : {
870 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
871 0 : bHavePitch = true;
872 : }
873 0 : else if (pSymbol->Name == "Weight")
874 : {
875 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
876 0 : bHaveWeight = true;
877 : }
878 0 : else if (pSymbol->Name == "Italic")
879 : {
880 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
881 0 : bHaveItalic = true;
882 : }
883 0 : else if (pSymbol->Name == "SymbolSet")
884 : {
885 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
886 0 : bHaveSymbolSet = true;
887 : }
888 0 : else if (pSymbol->Name == "Character")
889 : {
890 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
891 0 : bHaveCharacter = true;
892 : }
893 0 : pSymbol++;
894 : }
895 0 : if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
896 0 : && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
897 0 : nNumFullEntries++;
898 : }
899 : }
900 0 : aSymbolList.realloc (nNumFullEntries);
901 0 : mrAny <<= aSymbolList;
902 : }
903 : else
904 : {
905 463 : mrAny <<= maProps.GetIndexContainer();
906 : }
907 544 : mpBaseContext->AddPropertyValue();
908 : }
909 : else {
910 : assert(false && "no BaseContext");
911 : }
912 544 : }
913 :
914 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|