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