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 <tools/debug.hxx>
34 : #include <comphelper/processfactory.hxx>
35 :
36 : #include <list>
37 : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
38 : #include <com/sun/star/container/XIndexContainer.hpp>
39 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
40 : #include <com/sun/star/formula/SymbolDescriptor.hpp>
41 : #include <com/sun/star/util/DateTime.hpp>
42 : #include <com/sun/star/document/XViewDataSupplier.hpp>
43 : #include <com/sun/star/document/PrinterIndependentLayout.hpp>
44 : #include <com/sun/star/document/IndexedPropertyValues.hpp>
45 : #include <com/sun/star/document/NamedPropertyValues.hpp>
46 : #include <rtl/ustrbuf.hxx>
47 : #include <xmlenums.hxx>
48 :
49 : using namespace com::sun::star;
50 : using namespace ::xmloff::token;
51 :
52 3292 : 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 : XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext);
61 :
62 53360 : 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 3292 : XMLMyList::XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext)
69 : : nCount(0),
70 3292 : m_xContext(rxContext)
71 : {
72 : DBG_ASSERT( rxContext.is(), "got no service manager" );
73 3292 : }
74 :
75 2382 : uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
76 : {
77 2382 : uno::Sequence<beans::PropertyValue> aSeq;
78 2382 : if(nCount)
79 : {
80 : DBG_ASSERT(nCount == aProps.size(), "wrong count of PropertyValue");
81 2376 : aSeq.realloc(nCount);
82 2376 : beans::PropertyValue* pProps = aSeq.getArray();
83 2376 : std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
84 57050 : while (aItr != aProps.end())
85 : {
86 52298 : *pProps = *aItr;
87 52298 : ++pProps;
88 52298 : ++aItr;
89 : }
90 : }
91 2382 : return aSeq;
92 : }
93 :
94 234 : uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
95 : {
96 234 : uno::Reference<container::XNameContainer> xNameContainer = document::NamedPropertyValues::create(m_xContext);
97 234 : std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
98 846 : while (aItr != aProps.end())
99 : {
100 378 : xNameContainer->insertByName(aItr->Name, aItr->Value);
101 378 : ++aItr;
102 : }
103 :
104 234 : return xNameContainer;
105 : }
106 :
107 676 : uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
108 : {
109 676 : uno::Reference<container::XIndexContainer> xIndexContainer = document::IndexedPropertyValues::create(m_xContext);
110 676 : std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
111 676 : sal_uInt32 i(0);
112 2036 : while (aItr != aProps.end())
113 : {
114 684 : xIndexContainer->insertByIndex(i, aItr->Value);
115 684 : ++aItr;
116 684 : ++i;
117 : }
118 :
119 676 : 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 53360 : 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 : virtual 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 53360 : 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 53360 : SvXMLImportContext *pContext = 0;
232 :
233 53360 : rProp.Name = OUString();
234 53360 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
235 157418 : for( sal_Int16 i=0; i < nAttrCount; i++ )
236 : {
237 104058 : OUString sAttrName = xAttrList->getNameByIndex( i );
238 208116 : OUString aLocalName;
239 104058 : sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(
240 104058 : sAttrName, &aLocalName );
241 208116 : OUString sValue = xAttrList->getValueByIndex( i );
242 :
243 104058 : if (nPrefix == XML_NAMESPACE_CONFIG)
244 : {
245 104058 : if (IsXMLToken(aLocalName, XML_NAME))
246 52676 : rProp.Name = sValue;
247 : }
248 104058 : }
249 :
250 53360 : if (p_nPrefix == XML_NAMESPACE_CONFIG)
251 : {
252 53360 : if (IsXMLToken(rLocalName, XML_CONFIG_ITEM))
253 51382 : pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
254 3950 : else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) ||
255 1972 : (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) )
256 1068 : pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
257 910 : else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED))
258 234 : pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
259 676 : else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED))
260 676 : pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
261 : }
262 :
263 53360 : if( !pContext )
264 0 : pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName );
265 :
266 53360 : 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 1400 : 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 700 : XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
292 : const uno::Reference<xml::sax::XAttributeList>& )
293 : : SvXMLImportContext( rImport, nPrfx, rLName )
294 700 : , m_pData( new XMLDocumentSettingsContext_Data )
295 : {
296 : // here are no attributes
297 700 : }
298 :
299 1400 : XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
300 : {
301 1400 : }
302 :
303 1314 : 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 1314 : SvXMLImportContext *pContext = 0;
309 1314 : OUString sName;
310 :
311 1314 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
312 2628 : for( sal_Int16 i=0; i < nAttrCount; i++ )
313 : {
314 1314 : OUString sAttrName = xAttrList->getNameByIndex( i );
315 2628 : OUString aLocalName;
316 1314 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
317 1314 : sAttrName, &aLocalName );
318 2628 : OUString sValue = xAttrList->getValueByIndex( i );
319 :
320 1314 : if (nPrefix == XML_NAMESPACE_CONFIG)
321 : {
322 1314 : if (IsXMLToken(aLocalName, XML_NAME))
323 1314 : sName = sValue;
324 : }
325 1314 : }
326 :
327 1314 : if (p_nPrefix == XML_NAMESPACE_CONFIG)
328 : {
329 1314 : if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET))
330 : {
331 1314 : OUString aLocalConfigName;
332 : sal_uInt16 nConfigPrefix =
333 1314 : GetImport().GetNamespaceMap().GetKeyByAttrName(
334 1314 : sName, &aLocalConfigName );
335 :
336 1314 : if( XML_NAMESPACE_OOO == nConfigPrefix )
337 : {
338 1314 : if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
339 698 : pContext = new XMLConfigItemSetContext(GetImport(),
340 : p_nPrefix, rLocalName, xAttrList,
341 698 : m_pData->aViewProps, NULL);
342 616 : else if (IsXMLToken(aLocalConfigName,
343 : XML_CONFIGURATION_SETTINGS))
344 616 : pContext = new XMLConfigItemSetContext(GetImport(),
345 : p_nPrefix, rLocalName, xAttrList,
346 616 : 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 1314 : }
359 : }
360 : }
361 :
362 1314 : if( !pContext )
363 0 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
364 :
365 1314 : return pContext;
366 : }
367 :
368 700 : void XMLDocumentSettingsContext::EndElement()
369 : {
370 700 : uno::Sequence<beans::PropertyValue> aSeqViewProps;
371 700 : if (m_pData->aViewProps >>= aSeqViewProps)
372 : {
373 698 : GetImport().SetViewSettings(aSeqViewProps);
374 698 : sal_Int32 i(aSeqViewProps.getLength() - 1);
375 698 : bool bFound(false);
376 2418 : while((i >= 0) && !bFound)
377 : {
378 1022 : if (aSeqViewProps[i].Name.equalsAscii("Views"))
379 : {
380 592 : bFound = true;
381 592 : uno::Reference<container::XIndexAccess> xIndexAccess;
382 592 : if (aSeqViewProps[i].Value >>= xIndexAccess)
383 : {
384 592 : uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
385 592 : if (xViewDataSupplier.is())
386 592 : xViewDataSupplier->setViewData(xIndexAccess);
387 592 : }
388 : }
389 : else
390 430 : i--;
391 : }
392 : }
393 :
394 1400 : uno::Sequence<beans::PropertyValue> aSeqConfigProps;
395 700 : if ( m_pData->aConfigProps >>= aSeqConfigProps )
396 : {
397 616 : 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.equalsAscii("PrinterName") )
407 : {
408 0 : OUString sEmpty;
409 0 : aSeqConfigProps[i].Value = uno::makeAny( sEmpty );
410 0 : nFound++;
411 : }
412 0 : else if ( sProp.equalsAscii("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 616 : GetImport().SetConfigurationSettings( aSeqConfigProps );
424 : }
425 :
426 2100 : for ( ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin();
427 1400 : 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 700 : }
435 700 : }
436 :
437 3292 : 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 3292 : mpBaseContext(pTempBaseContext)
445 : {
446 3292 : }
447 :
448 3292 : XMLConfigBaseContext::~XMLConfigBaseContext()
449 : {
450 3292 : }
451 :
452 2382 : 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 2382 : : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext )
459 : {
460 : // here are no attributes
461 2382 : }
462 :
463 4764 : XMLConfigItemSetContext::~XMLConfigItemSetContext()
464 : {
465 4764 : }
466 :
467 52298 : 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 52298 : return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
473 : }
474 :
475 2382 : void XMLConfigItemSetContext::EndElement()
476 : {
477 2382 : mrAny <<= maProps.GetSequence();
478 2382 : if (mpBaseContext)
479 1068 : mpBaseContext->AddPropertyValue();
480 2382 : }
481 :
482 51382 : 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 51382 : mpBaseContext(pTempBaseContext)
492 : {
493 51382 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
494 154146 : for( sal_Int16 i=0; i < nAttrCount; i++ )
495 : {
496 102764 : OUString sAttrName = xAttrList->getNameByIndex( i );
497 205528 : OUString aLocalName;
498 102764 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
499 102764 : sAttrName, &aLocalName );
500 205528 : OUString sValue = xAttrList->getValueByIndex( i );
501 :
502 102764 : if (nPrefix == XML_NAMESPACE_CONFIG)
503 : {
504 102764 : if (IsXMLToken(aLocalName, XML_TYPE))
505 51382 : msType = sValue;
506 : }
507 102764 : }
508 51382 : }
509 :
510 102764 : XMLConfigItemContext::~XMLConfigItemContext()
511 : {
512 102764 : }
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 49094 : void XMLConfigItemContext::Characters( const OUString& rChars )
524 : {
525 49094 : if (IsXMLToken(msType, XML_BASE64BINARY))
526 : {
527 258 : OUString sTrimmedChars( rChars.trim() );
528 258 : if( !sTrimmedChars.isEmpty() )
529 : {
530 258 : OUString sChars;
531 258 : if( !msValue.isEmpty() )
532 : {
533 4 : sChars = msValue;
534 4 : sChars += sTrimmedChars;
535 4 : msValue = OUString();
536 : }
537 : else
538 : {
539 254 : sChars = sTrimmedChars;
540 : }
541 516 : uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
542 : sal_Int32 const nCharsDecoded =
543 258 : ::sax::Converter::decodeBase64SomeChars( aBuffer, sChars );
544 258 : sal_uInt32 nStartPos(maDecoded.getLength());
545 258 : sal_uInt32 nCount(aBuffer.getLength());
546 258 : maDecoded.realloc(nStartPos + nCount);
547 258 : sal_Int8* pDecoded = maDecoded.getArray();
548 258 : sal_Int8* pBuffer = aBuffer.getArray();
549 125440 : for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++)
550 125182 : pDecoded[nStartPos + i] = *pBuffer;
551 258 : if( nCharsDecoded != sChars.getLength() )
552 262 : msValue = sChars.copy( nCharsDecoded );
553 258 : }
554 : }
555 : else
556 48836 : msValue += rChars;
557 49094 : }
558 :
559 51382 : void XMLConfigItemContext::EndElement()
560 : {
561 51382 : if (mpBaseContext)
562 : {
563 51382 : if (IsXMLToken(msType, XML_BOOLEAN))
564 : {
565 29516 : bool bValue(false);
566 29516 : if (IsXMLToken(msValue, XML_TRUE))
567 13362 : bValue = true;
568 29516 : mrAny <<= bValue;
569 : }
570 21866 : 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 21866 : else if (IsXMLToken(msType, XML_SHORT))
577 : {
578 4382 : sal_Int32 nValue(0);
579 4382 : ::sax::Converter::convertNumber(nValue, msValue);
580 4382 : mrAny <<= static_cast<sal_Int16>(nValue);
581 : }
582 17484 : else if (IsXMLToken(msType, XML_INT))
583 : {
584 10208 : sal_Int32 nValue(0);
585 10208 : ::sax::Converter::convertNumber(nValue, msValue);
586 10208 : mrAny <<= nValue;
587 : }
588 7276 : else if (IsXMLToken(msType, XML_LONG))
589 : {
590 2844 : sal_Int64 nValue(msValue.toInt64());
591 2844 : mrAny <<= nValue;
592 : }
593 4432 : 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 4432 : else if (IsXMLToken(msType, XML_STRING))
600 : {
601 3412 : mrAny <<= msValue;
602 : }
603 1020 : else if (IsXMLToken(msType, XML_DATETIME))
604 : {
605 0 : util::DateTime aDateTime;
606 0 : ::sax::Converter::parseDateTime(aDateTime, 0, msValue);
607 0 : mrAny <<= aDateTime;
608 : }
609 1020 : else if (IsXMLToken(msType, XML_BASE64BINARY))
610 : {
611 1020 : mrAny <<= maDecoded;
612 : }
613 : else {
614 : OSL_FAIL("wrong type");
615 : }
616 :
617 51382 : ManipulateConfigItem();
618 :
619 51382 : mpBaseContext->AddPropertyValue();
620 : }
621 : else {
622 : OSL_FAIL("no BaseContext");
623 : }
624 51382 : }
625 :
626 : /** There are some instances where there is a mismatch between API and
627 : * XML mapping of a setting. In this case, this method allows us to
628 : * manipulate the values accordingly. */
629 51382 : void XMLConfigItemContext::ManipulateConfigItem()
630 : {
631 51382 : if( mrItemName == "PrinterIndependentLayout" )
632 : {
633 344 : OUString sValue;
634 344 : mrAny >>= sValue;
635 :
636 344 : sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
637 :
638 344 : if( sValue == "enabled" || sValue == "low-resolution" )
639 : {
640 36 : nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
641 : }
642 308 : else if ( sValue == "disabled" )
643 : {
644 14 : nTmp = document::PrinterIndependentLayout::DISABLED;
645 : }
646 : // else: default to high_resolution
647 :
648 344 : mrAny <<= nTmp;
649 : }
650 153078 : else if( (mrItemName == "ColorTableURL") || (mrItemName == "LineEndTableURL") || (mrItemName == "HatchTableURL")
651 101968 : || (mrItemName == "DashTableURL") || (mrItemName == "GradientTableURL") || (mrItemName == "BitmapTableURL") )
652 : {
653 : try
654 : {
655 216 : uno::Reference< uno::XComponentContext > xContext( GetImport().GetComponentContext() );
656 432 : uno::Reference< util::XStringSubstitution > xStringSubsitution( util::PathSubstitution::create(xContext) );
657 :
658 432 : OUString aURL;
659 216 : mrAny >>= aURL;
660 216 : aURL = xStringSubsitution->substituteVariables( aURL, sal_False );
661 432 : mrAny <<= aURL;
662 : }
663 0 : catch( uno::Exception& )
664 : {
665 : }
666 : }
667 51382 : }
668 :
669 234 : XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
670 : const ::com::sun::star::uno::Reference<
671 : ::com::sun::star::xml::sax::XAttributeList>&,
672 : com::sun::star::uno::Any& rAny,
673 : XMLConfigBaseContext* pBaseContext)
674 234 : : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext)
675 : {
676 234 : }
677 :
678 468 : XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext()
679 : {
680 468 : }
681 :
682 378 : SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix,
683 : const OUString& rLocalName,
684 : const ::com::sun::star::uno::Reference<
685 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
686 : {
687 378 : return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
688 : }
689 :
690 234 : void XMLConfigItemMapNamedContext::EndElement()
691 : {
692 234 : if (mpBaseContext)
693 : {
694 234 : mrAny <<= maProps.GetNameContainer();
695 234 : mpBaseContext->AddPropertyValue();
696 : }
697 : else {
698 : OSL_FAIL("no BaseContext");
699 : }
700 234 : }
701 :
702 676 : XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
703 : const OUString& rLName,
704 : const ::com::sun::star::uno::Reference<
705 : ::com::sun::star::xml::sax::XAttributeList>&,
706 : com::sun::star::uno::Any& rAny,
707 : const OUString& rConfigItemName,
708 : XMLConfigBaseContext* pBaseContext)
709 : : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext),
710 676 : maConfigItemName( rConfigItemName )
711 : {
712 676 : }
713 :
714 1352 : XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext()
715 : {
716 1352 : }
717 :
718 684 : SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix,
719 : const OUString& rLocalName,
720 : const ::com::sun::star::uno::Reference<
721 : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
722 : {
723 684 : return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
724 : }
725 :
726 676 : void XMLConfigItemMapIndexedContext::EndElement()
727 : {
728 676 : if (mpBaseContext)
729 : {
730 676 : if ( maConfigItemName == "ForbiddenCharacters" )
731 : {
732 84 : uno::Reference< i18n::XForbiddenCharacters > xForbChars;
733 :
734 : // get the forbidden characters from the document
735 168 : uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
736 84 : if( xFac.is() )
737 : {
738 84 : uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( "com.sun.star.document.Settings" ), uno::UNO_QUERY );
739 84 : if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
740 : {
741 84 : xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
742 84 : }
743 : }
744 :
745 84 : if( xForbChars.is() )
746 : {
747 :
748 84 : uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
749 :
750 84 : const sal_Int32 nCount = xIndex->getCount();
751 168 : uno::Sequence < beans::PropertyValue > aProps;
752 176 : for (sal_Int32 i = 0; i < nCount; i++)
753 : {
754 92 : if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) )
755 : {
756 : /* FIXME-BCP47: this stupid and counterpart in
757 : * xmloff/source/core/SettingsExportHelper.cxx
758 : * XMLSettingsExportHelper::exportForbiddenCharacters()
759 : * */
760 :
761 92 : beans::PropertyValue *pForChar = aProps.getArray();
762 92 : i18n::ForbiddenCharacters aForbid;
763 184 : lang::Locale aLocale;
764 92 : bool bHaveLanguage = false, bHaveCountry = false, bHaveVariant = false,
765 92 : bHaveBegin = false, bHaveEnd = false;
766 :
767 552 : for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
768 : {
769 460 : if (pForChar->Name.equals ( "Language" ) )
770 : {
771 92 : pForChar->Value >>= aLocale.Language;
772 92 : bHaveLanguage = true;
773 : }
774 368 : else if (pForChar->Name.equals ( "Country" ) )
775 : {
776 92 : pForChar->Value >>= aLocale.Country;
777 92 : bHaveCountry = true;
778 : }
779 276 : else if (pForChar->Name.equals ( "Variant" ) )
780 : {
781 92 : pForChar->Value >>= aLocale.Variant;
782 92 : bHaveVariant = true;
783 : }
784 184 : else if (pForChar->Name.equals ( "BeginLine" ) )
785 : {
786 92 : pForChar->Value >>= aForbid.beginLine;
787 92 : bHaveBegin = true;
788 : }
789 92 : else if (pForChar->Name.equals ( "EndLine" ) )
790 : {
791 92 : pForChar->Value >>= aForbid.endLine;
792 92 : bHaveEnd = true;
793 : }
794 460 : pForChar++;
795 : }
796 :
797 92 : if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
798 : {
799 : try
800 : {
801 92 : xForbChars->setForbiddenCharacters( aLocale, aForbid );
802 : }
803 0 : catch( uno::Exception& )
804 : {
805 : OSL_FAIL( "Exception while importing forbidden characters" );
806 : }
807 92 : }
808 : }
809 84 : }
810 : }
811 : else
812 : {
813 : OSL_FAIL( "could not get the XForbiddenCharacters from document!" );
814 0 : mrAny <<= maProps.GetIndexContainer();
815 84 : }
816 : }
817 592 : else if ( maConfigItemName == "Symbols" )
818 : {
819 0 : uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
820 :
821 0 : const sal_Int32 nCount = xIndex->getCount();
822 0 : uno::Sequence < beans::PropertyValue > aProps;
823 0 : uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
824 :
825 0 : formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
826 :
827 0 : sal_Int16 nNumFullEntries = 0;
828 :
829 0 : for ( sal_Int32 i = 0; i < nCount; i++ )
830 : {
831 0 : if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
832 : {
833 0 : bool bHaveName = false, bHaveExportName = false, bHaveCharSet = false,
834 0 : bHaveFontName = false, bHaveFamily = false, bHavePitch = false,
835 0 : bHaveWeight = false, bHaveItalic = false, bHaveSymbolSet = false,
836 0 : bHaveCharacter = false;
837 0 : beans::PropertyValue *pSymbol = aProps.getArray();
838 :
839 0 : for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
840 : {
841 0 : if (pSymbol->Name.equals ( "Name" ) )
842 : {
843 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
844 0 : bHaveName = true;
845 : }
846 0 : else if (pSymbol->Name.equals ( "ExportName" ) )
847 : {
848 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
849 0 : bHaveExportName = true;
850 : }
851 0 : else if (pSymbol->Name.equals ( "FontName" ) )
852 : {
853 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
854 0 : bHaveFontName = true;
855 : }
856 0 : else if (pSymbol->Name.equals ( "CharSet" ) )
857 : {
858 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
859 0 : bHaveCharSet = true;
860 : }
861 0 : else if (pSymbol->Name.equals ( "Family" ) )
862 : {
863 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
864 0 : bHaveFamily = true;
865 : }
866 0 : else if (pSymbol->Name.equals ( "Pitch" ) )
867 : {
868 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
869 0 : bHavePitch = true;
870 : }
871 0 : else if (pSymbol->Name.equals ( "Weight" ) )
872 : {
873 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
874 0 : bHaveWeight = true;
875 : }
876 0 : else if (pSymbol->Name.equals ( "Italic" ) )
877 : {
878 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
879 0 : bHaveItalic = true;
880 : }
881 0 : else if (pSymbol->Name.equals ( "SymbolSet" ) )
882 : {
883 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
884 0 : bHaveSymbolSet = true;
885 : }
886 0 : else if (pSymbol->Name.equals ( "Character" ) )
887 : {
888 0 : pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
889 0 : bHaveCharacter = true;
890 : }
891 0 : pSymbol++;
892 : }
893 0 : if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
894 0 : && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
895 0 : nNumFullEntries++;
896 : }
897 : }
898 0 : aSymbolList.realloc (nNumFullEntries);
899 0 : mrAny <<= aSymbolList;
900 : }
901 : else
902 : {
903 592 : mrAny <<= maProps.GetIndexContainer();
904 : }
905 676 : mpBaseContext->AddPropertyValue();
906 : }
907 : else {
908 : OSL_FAIL("no BaseContext");
909 : }
910 676 : }
911 :
912 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|