xref: /AOO41X/main/xmloff/source/core/SettingsExportHelper.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <xmloff/SettingsExportHelper.hxx>
27 #include "xmloff/xmlnmspe.hxx"
28 #include <xmloff/xmltoken.hxx>
29 #include <xmloff/xmluconv.hxx>
30 #include <tools/debug.hxx>
31 #include <tools/diagnose_ex.h>
32 #include <comphelper/extract.hxx>
33 
34 #include <com/sun/star/linguistic2/XSupportedLocales.hpp>
35 #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
36 #include <com/sun/star/container/XNameAccess.hpp>
37 #include <com/sun/star/container/XNameContainer.hpp>
38 #include <com/sun/star/container/XIndexContainer.hpp>
39 #include <com/sun/star/util/DateTime.hpp>
40 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
41 #include <com/sun/star/container/XIndexContainer.hpp>
42 #include <com/sun/star/formula/SymbolDescriptor.hpp>
43 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
44 #include <xmloff/XMLSettingsExportContext.hxx>
45 #include <xmlenums.hxx>
46 
47 using namespace ::com::sun::star;
48 using namespace ::xmloff::token;
49 
XMLSettingsExportHelper(::xmloff::XMLSettingsExportContext & i_rContext)50 XMLSettingsExportHelper::XMLSettingsExportHelper( ::xmloff::XMLSettingsExportContext& i_rContext )
51 : m_rContext( i_rContext )
52 , msPrinterIndependentLayout( RTL_CONSTASCII_USTRINGPARAM( "PrinterIndependentLayout" ) )
53 , msColorTableURL( RTL_CONSTASCII_USTRINGPARAM( "ColorTableURL" ) )
54 , msLineEndTableURL( RTL_CONSTASCII_USTRINGPARAM( "LineEndTableURL" ) )
55 , msHatchTableURL( RTL_CONSTASCII_USTRINGPARAM( "HatchTableURL" ) )
56 , msDashTableURL( RTL_CONSTASCII_USTRINGPARAM( "DashTableURL" ) )
57 , msGradientTableURL( RTL_CONSTASCII_USTRINGPARAM( "GradientTableURL" ) )
58 , msBitmapTableURL( RTL_CONSTASCII_USTRINGPARAM( "BitmapTableURL" ) )
59 {
60 }
61 
~XMLSettingsExportHelper()62 XMLSettingsExportHelper::~XMLSettingsExportHelper()
63 {
64 }
65 
CallTypeFunction(const uno::Any & rAny,const rtl::OUString & rName) const66 void XMLSettingsExportHelper::CallTypeFunction(const uno::Any& rAny,
67                                             const rtl::OUString& rName) const
68 {
69     uno::Any aAny( rAny );
70     ManipulateSetting( aAny, rName );
71 
72     uno::TypeClass eClass = aAny.getValueTypeClass();
73     switch (eClass)
74     {
75         case uno::TypeClass_VOID:
76         {
77             /*
78              * This assertion pops up when exporting values which are set to:
79              * PropertyAttribute::MAYBEVOID, and thus are _supposed_ to have
80              * a VOID value...so I'm removing it ...mtg
81              * DBG_ERROR("no type");
82              */
83         }
84         break;
85         case uno::TypeClass_BOOLEAN:
86         {
87             exportBool(::cppu::any2bool(aAny), rName);
88         }
89         break;
90         case uno::TypeClass_BYTE:
91         {
92             sal_Int8 nInt8 = 0;
93             aAny >>= nInt8;
94             exportByte(nInt8, rName);
95         }
96         break;
97         case uno::TypeClass_SHORT:
98         {
99             sal_Int16 nInt16 = 0;
100             aAny >>= nInt16;
101             exportShort(nInt16, rName);
102         }
103         break;
104         case uno::TypeClass_LONG:
105         {
106             sal_Int32 nInt32 = 0;
107             aAny >>= nInt32;
108             exportInt(nInt32, rName);
109         }
110         break;
111         case uno::TypeClass_HYPER:
112         {
113             sal_Int64 nInt64 = 0;
114             aAny >>= nInt64;
115             exportLong(nInt64, rName);
116         }
117         break;
118         case uno::TypeClass_DOUBLE:
119         {
120             double fDouble = 0.0;
121             aAny >>= fDouble;
122             exportDouble(fDouble, rName);
123         }
124         break;
125         case uno::TypeClass_STRING:
126         {
127             rtl::OUString sString;
128             aAny >>= sString;
129             exportString(sString, rName);
130         }
131         break;
132         default:
133         {
134             uno::Type aType = aAny.getValueType();
135             if (aType.equals(getCppuType( (uno::Sequence<beans::PropertyValue> *)0 ) ) )
136             {
137                 uno::Sequence< beans::PropertyValue> aProps;
138                 aAny >>= aProps;
139                 exportSequencePropertyValue(aProps, rName);
140             }
141             else if( aType.equals(getCppuType( (uno::Sequence<sal_Int8> *)0 ) ) )
142             {
143                 uno::Sequence< sal_Int8 > aProps;
144                 aAny >>= aProps;
145                 exportbase64Binary(aProps, rName);
146             }
147             else if (aType.equals(getCppuType( (uno::Reference<container::XNameContainer> *)0 ) ) ||
148                     aType.equals(getCppuType( (uno::Reference<container::XNameAccess> *)0 ) ))
149             {
150                 uno::Reference< container::XNameAccess> aNamed;
151                 aAny >>= aNamed;
152                 exportNameAccess(aNamed, rName);
153             }
154             else if (aType.equals(getCppuType( (uno::Reference<container::XIndexAccess> *)0 ) ) ||
155                     aType.equals(getCppuType( (uno::Reference<container::XIndexContainer> *)0 ) ) )
156             {
157                 uno::Reference<container::XIndexAccess> aIndexed;
158                 aAny >>= aIndexed;
159                 exportIndexAccess(aIndexed, rName);
160             }
161             else if (aType.equals(getCppuType( (util::DateTime *)0 ) ) )
162             {
163                 util::DateTime aDateTime;
164                 aAny >>= aDateTime;
165                 exportDateTime(aDateTime, rName);
166             }
167             else if( aType.equals(getCppuType( (uno::Reference<i18n::XForbiddenCharacters> *)0 ) ) )
168             {
169                 exportForbiddenCharacters( aAny, rName );
170             }
171             else if( aType.equals(getCppuType( (uno::Sequence<formula::SymbolDescriptor> *)0 ) ) )
172             {
173                 uno::Sequence< formula::SymbolDescriptor > aProps;
174                 aAny >>= aProps;
175                 exportSymbolDescriptors(aProps, rName);
176             }
177             else {
178                 DBG_ERROR("this type is not implemented now");
179             }
180         }
181         break;
182     }
183 }
184 
exportBool(const sal_Bool bValue,const rtl::OUString & rName) const185 void XMLSettingsExportHelper::exportBool(const sal_Bool bValue, const rtl::OUString& rName) const
186 {
187     DBG_ASSERT(rName.getLength(), "no name");
188     m_rContext.AddAttribute( XML_NAME, rName );
189     m_rContext.AddAttribute( XML_TYPE, XML_BOOLEAN );
190     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
191     rtl::OUString sValue;
192     if (bValue)
193         sValue = GetXMLToken(XML_TRUE);
194     else
195         sValue = GetXMLToken(XML_FALSE);
196     m_rContext.Characters( sValue );
197     m_rContext.EndElement( sal_False );
198 }
199 
exportByte(const sal_Int8 nValue,const rtl::OUString & rName) const200 void XMLSettingsExportHelper::exportByte(const sal_Int8 nValue, const rtl::OUString& rName) const
201 {
202 #if 0
203     DBG_ASSERT(rName.getLength(), "no name");
204     m_rContext.AddAttribute( XML_NAME, rName );
205     m_rContext.AddAttribute( XML_TYPE, XML_BYTE );
206     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
207     rtl::OUStringBuffer sBuffer;
208     SvXMLUnitConverter::convertNumber(sBuffer, sal_Int32(nValue));
209     m_rContext.Characters( sBuffer.makeStringAndClear() );
210     m_rContext.EndElement( sal_False );
211 #else
212     (void) nValue; (void) rName;
213     OSL_ENSURE(false, "XMLSettingsExportHelper::exportByte(): #i114162#:\n"
214         "config-items of type \"byte\" are not valid ODF, "
215         "so storing them is disabled!\n"
216         "Use a different type instead (e.g. \"short\").");
217 #endif
218 }
exportShort(const sal_Int16 nValue,const rtl::OUString & rName) const219 void XMLSettingsExportHelper::exportShort(const sal_Int16 nValue, const rtl::OUString& rName) const
220 {
221     DBG_ASSERT(rName.getLength(), "no name");
222     m_rContext.AddAttribute( XML_NAME, rName );
223     m_rContext.AddAttribute( XML_TYPE, XML_SHORT );
224     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
225     rtl::OUStringBuffer sBuffer;
226     SvXMLUnitConverter::convertNumber(sBuffer, sal_Int32(nValue));
227     m_rContext.Characters( sBuffer.makeStringAndClear() );
228     m_rContext.EndElement( sal_False );
229 }
230 
exportInt(const sal_Int32 nValue,const rtl::OUString & rName) const231 void XMLSettingsExportHelper::exportInt(const sal_Int32 nValue, const rtl::OUString& rName) const
232 {
233     DBG_ASSERT(rName.getLength(), "no name");
234     m_rContext.AddAttribute( XML_NAME, rName );
235     m_rContext.AddAttribute( XML_TYPE, XML_INT );
236     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
237     rtl::OUStringBuffer sBuffer;
238     SvXMLUnitConverter::convertNumber(sBuffer, nValue);
239     m_rContext.Characters( sBuffer.makeStringAndClear() );
240     m_rContext.EndElement( sal_False );
241 }
242 
exportLong(const sal_Int64 nValue,const rtl::OUString & rName) const243 void XMLSettingsExportHelper::exportLong(const sal_Int64 nValue, const rtl::OUString& rName) const
244 {
245     DBG_ASSERT(rName.getLength(), "no name");
246     m_rContext.AddAttribute( XML_NAME, rName );
247     m_rContext.AddAttribute( XML_TYPE, XML_LONG );
248     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
249     rtl::OUString sValue(rtl::OUString::valueOf(nValue));
250     m_rContext.Characters( sValue );
251     m_rContext.EndElement( sal_False );
252 }
253 
exportDouble(const double fValue,const rtl::OUString & rName) const254 void XMLSettingsExportHelper::exportDouble(const double fValue, const rtl::OUString& rName) const
255 {
256     DBG_ASSERT(rName.getLength(), "no name");
257     m_rContext.AddAttribute( XML_NAME, rName );
258     m_rContext.AddAttribute( XML_TYPE, XML_DOUBLE );
259     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
260     rtl::OUStringBuffer sBuffer;
261     SvXMLUnitConverter::convertDouble(sBuffer, fValue);
262     m_rContext.Characters( sBuffer.makeStringAndClear() );
263     m_rContext.EndElement( sal_False );
264 }
265 
exportString(const rtl::OUString & sValue,const rtl::OUString & rName) const266 void XMLSettingsExportHelper::exportString(const rtl::OUString& sValue, const rtl::OUString& rName) const
267 {
268     DBG_ASSERT(rName.getLength(), "no name");
269     m_rContext.AddAttribute( XML_NAME, rName );
270     m_rContext.AddAttribute( XML_TYPE, XML_STRING );
271     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
272     if (sValue.getLength())
273         m_rContext.Characters( sValue );
274     m_rContext.EndElement( sal_False );
275 }
276 
exportDateTime(const util::DateTime & aValue,const rtl::OUString & rName) const277 void XMLSettingsExportHelper::exportDateTime(const util::DateTime& aValue, const rtl::OUString& rName) const
278 {
279     DBG_ASSERT(rName.getLength(), "no name");
280     m_rContext.AddAttribute( XML_NAME, rName );
281     m_rContext.AddAttribute( XML_TYPE, XML_DATETIME );
282     rtl::OUStringBuffer sBuffer;
283     SvXMLUnitConverter::convertDateTime(sBuffer, aValue);
284     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
285     m_rContext.Characters( sBuffer.makeStringAndClear() );
286     m_rContext.EndElement( sal_False );
287 }
288 
exportSequencePropertyValue(const uno::Sequence<beans::PropertyValue> & aProps,const rtl::OUString & rName) const289 void XMLSettingsExportHelper::exportSequencePropertyValue(
290                     const uno::Sequence<beans::PropertyValue>& aProps,
291                     const rtl::OUString& rName) const
292 {
293     DBG_ASSERT(rName.getLength(), "no name");
294     sal_Int32 nLength(aProps.getLength());
295     if(nLength)
296     {
297         m_rContext.AddAttribute( XML_NAME, rName );
298         m_rContext.StartElement( XML_CONFIG_ITEM_SET, sal_True );
299         for (sal_Int32 i = 0; i < nLength; i++)
300             CallTypeFunction(aProps[i].Value, aProps[i].Name);
301         m_rContext.EndElement( sal_True );
302     }
303 }
exportSymbolDescriptors(const uno::Sequence<formula::SymbolDescriptor> & rProps,const rtl::OUString rName) const304 void XMLSettingsExportHelper::exportSymbolDescriptors(
305                     const uno::Sequence < formula::SymbolDescriptor > &rProps,
306                     const rtl::OUString rName) const
307 {
308     // #110680#
309     // uno::Reference< lang::XMultiServiceFactory > xServiceFactory( comphelper::getProcessServiceFactory() );
310     uno::Reference< lang::XMultiServiceFactory > xServiceFactory( m_rContext.GetServiceFactory() );
311     DBG_ASSERT( xServiceFactory.is(), "XMLSettingsExportHelper::exportSymbolDescriptors: got no service manager" );
312 
313     if( xServiceFactory.is() )
314     {
315         uno::Reference< container::XIndexContainer > xBox(xServiceFactory->createInstance(rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.document.IndexedPropertyValues") ) ), uno::UNO_QUERY);
316         DBG_ASSERT( xBox.is(), "could not create service com.sun.star.document.IndexedPropertyValues" );
317         if (xBox.is() )
318         {
319             const rtl::OUString sName     ( RTL_CONSTASCII_USTRINGPARAM ( "Name" ) );
320             const rtl::OUString sExportName ( RTL_CONSTASCII_USTRINGPARAM ( "ExportName" ) );
321             const rtl::OUString sSymbolSet ( RTL_CONSTASCII_USTRINGPARAM ( "SymbolSet" ) );
322             const rtl::OUString sCharacter ( RTL_CONSTASCII_USTRINGPARAM ( "Character" ) );
323             const rtl::OUString sFontName ( RTL_CONSTASCII_USTRINGPARAM ( "FontName" ) );
324             const rtl::OUString sCharSet  ( RTL_CONSTASCII_USTRINGPARAM ( "CharSet" ) );
325             const rtl::OUString sFamily   ( RTL_CONSTASCII_USTRINGPARAM ( "Family" ) );
326             const rtl::OUString sPitch    ( RTL_CONSTASCII_USTRINGPARAM ( "Pitch" ) );
327             const rtl::OUString sWeight   ( RTL_CONSTASCII_USTRINGPARAM ( "Weight" ) );
328             const rtl::OUString sItalic   ( RTL_CONSTASCII_USTRINGPARAM ( "Italic" ) );
329 
330             sal_Int32 nCount = rProps.getLength();
331             const formula::SymbolDescriptor *pDescriptor = rProps.getConstArray();
332 
333             for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++, pDescriptor++ )
334             {
335                 uno::Sequence < beans::PropertyValue > aSequence ( XML_SYMBOL_DESCRIPTOR_MAX );
336                 beans::PropertyValue *pSymbol = aSequence.getArray();
337 
338                 pSymbol[XML_SYMBOL_DESCRIPTOR_NAME].Name         = sName;
339                 pSymbol[XML_SYMBOL_DESCRIPTOR_NAME].Value       <<= pDescriptor->sName;
340                 pSymbol[XML_SYMBOL_DESCRIPTOR_EXPORT_NAME].Name  = sExportName;
341                 pSymbol[XML_SYMBOL_DESCRIPTOR_EXPORT_NAME].Value<<= pDescriptor->sExportName;
342                 pSymbol[XML_SYMBOL_DESCRIPTOR_FONT_NAME].Name    = sFontName;
343                 pSymbol[XML_SYMBOL_DESCRIPTOR_FONT_NAME].Value  <<= pDescriptor->sFontName;
344                 pSymbol[XML_SYMBOL_DESCRIPTOR_CHAR_SET].Name      = sCharSet;
345                 pSymbol[XML_SYMBOL_DESCRIPTOR_CHAR_SET].Value   <<= pDescriptor->nCharSet;
346                 pSymbol[XML_SYMBOL_DESCRIPTOR_FAMILY].Name       = sFamily;
347                 pSymbol[XML_SYMBOL_DESCRIPTOR_FAMILY].Value <<= pDescriptor->nFamily;
348                 pSymbol[XML_SYMBOL_DESCRIPTOR_PITCH].Name        = sPitch;
349                 pSymbol[XML_SYMBOL_DESCRIPTOR_PITCH].Value      <<= pDescriptor->nPitch;
350                 pSymbol[XML_SYMBOL_DESCRIPTOR_WEIGHT].Name       = sWeight;
351                 pSymbol[XML_SYMBOL_DESCRIPTOR_WEIGHT].Value <<= pDescriptor->nWeight;
352                 pSymbol[XML_SYMBOL_DESCRIPTOR_ITALIC].Name       = sItalic;
353                 pSymbol[XML_SYMBOL_DESCRIPTOR_ITALIC].Value <<= pDescriptor->nItalic;
354                 pSymbol[XML_SYMBOL_DESCRIPTOR_SYMBOL_SET].Name       = sSymbolSet;
355                 pSymbol[XML_SYMBOL_DESCRIPTOR_SYMBOL_SET].Value <<= pDescriptor->sSymbolSet;
356                 pSymbol[XML_SYMBOL_DESCRIPTOR_CHARACTER].Name       = sCharacter;
357                 pSymbol[XML_SYMBOL_DESCRIPTOR_CHARACTER].Value  <<= pDescriptor->nCharacter;
358 
359                 xBox->insertByIndex(nIndex, uno::makeAny( aSequence ));
360             }
361 
362             uno::Reference< container::XIndexAccess > xIA( xBox, uno::UNO_QUERY );
363             exportIndexAccess( xIA, rName );
364         }
365     }
366 }
exportbase64Binary(const uno::Sequence<sal_Int8> & aProps,const rtl::OUString & rName) const367 void XMLSettingsExportHelper::exportbase64Binary(
368                     const uno::Sequence<sal_Int8>& aProps,
369                     const rtl::OUString& rName) const
370 {
371     DBG_ASSERT(rName.getLength(), "no name");
372     sal_Int32 nLength(aProps.getLength());
373     m_rContext.AddAttribute( XML_NAME, rName );
374     m_rContext.AddAttribute( XML_TYPE, XML_BASE64BINARY );
375     m_rContext.StartElement( XML_CONFIG_ITEM, sal_True );
376     if(nLength)
377     {
378         rtl::OUStringBuffer sBuffer;
379         SvXMLUnitConverter::encodeBase64(sBuffer, aProps);
380         m_rContext.Characters( sBuffer.makeStringAndClear() );
381     }
382     m_rContext.EndElement( sal_False );
383 }
384 
exportMapEntry(const uno::Any & rAny,const rtl::OUString & rName,const sal_Bool bNameAccess) const385 void XMLSettingsExportHelper::exportMapEntry(const uno::Any& rAny,
386                                         const rtl::OUString& rName,
387                                         const sal_Bool bNameAccess) const
388 {
389     DBG_ASSERT((bNameAccess && rName.getLength()) || !bNameAccess, "no name");
390     uno::Sequence<beans::PropertyValue> aProps;
391     rAny >>= aProps;
392     sal_Int32 nLength = aProps.getLength();
393     if (nLength)
394     {
395         if (bNameAccess)
396             m_rContext.AddAttribute( XML_NAME, rName );
397         m_rContext.StartElement( XML_CONFIG_ITEM_MAP_ENTRY, sal_True );
398         for (sal_Int32 i = 0; i < nLength; i++)
399             CallTypeFunction(aProps[i].Value, aProps[i].Name);
400         m_rContext.EndElement( sal_True );
401     }
402 }
403 
exportNameAccess(const uno::Reference<container::XNameAccess> & aNamed,const rtl::OUString & rName) const404 void XMLSettingsExportHelper::exportNameAccess(
405                     const uno::Reference<container::XNameAccess>& aNamed,
406                     const rtl::OUString& rName) const
407 {
408     DBG_ASSERT(rName.getLength(), "no name");
409     DBG_ASSERT(aNamed->getElementType().equals(getCppuType( (uno::Sequence<beans::PropertyValue> *)0 ) ),
410                 "wrong NameAccess" );
411     if(aNamed->hasElements())
412     {
413         m_rContext.AddAttribute( XML_NAME, rName );
414         m_rContext.StartElement( XML_CONFIG_ITEM_MAP_NAMED, sal_True );
415         uno::Sequence< rtl::OUString > aNames(aNamed->getElementNames());
416         for (sal_Int32 i = 0; i < aNames.getLength(); i++)
417             exportMapEntry(aNamed->getByName(aNames[i]), aNames[i], sal_True);
418         m_rContext.EndElement( sal_True );
419     }
420 }
421 
exportIndexAccess(const uno::Reference<container::XIndexAccess> aIndexed,const rtl::OUString rName) const422 void XMLSettingsExportHelper::exportIndexAccess(
423                     const uno::Reference<container::XIndexAccess> aIndexed,
424                     const rtl::OUString rName) const
425 {
426     DBG_ASSERT(rName.getLength(), "no name");
427     DBG_ASSERT(aIndexed->getElementType().equals(getCppuType( (uno::Sequence<beans::PropertyValue> *)0 ) ),
428                 "wrong IndexAccess" );
429     rtl::OUString sEmpty;// ( RTLCONSTASCII_USTRINGPARAM( "View" ) );
430     if(aIndexed->hasElements())
431     {
432         m_rContext.AddAttribute( XML_NAME, rName );
433         m_rContext.StartElement( XML_CONFIG_ITEM_MAP_INDEXED, sal_True );
434         sal_Int32 nCount = aIndexed->getCount();
435         for (sal_Int32 i = 0; i < nCount; i++)
436         {
437             exportMapEntry(aIndexed->getByIndex(i), sEmpty, sal_False);
438         }
439         m_rContext.EndElement( sal_True );
440     }
441 }
442 
exportForbiddenCharacters(const uno::Any & rAny,const rtl::OUString rName) const443 void XMLSettingsExportHelper::exportForbiddenCharacters(
444                     const uno::Any &rAny,
445                     const rtl::OUString rName) const
446 {
447     uno::Reference<i18n::XForbiddenCharacters> xForbChars;
448     uno::Reference<linguistic2::XSupportedLocales> xLocales;
449 
450     rAny >>= xForbChars;
451     rAny >>= xLocales;
452 
453     DBG_ASSERT( xForbChars.is() && xLocales.is(),"XMLSettingsExportHelper::exportForbiddenCharacters: got illegal forbidden characters!" );
454 
455     if( !xForbChars.is() || !xLocales.is() )
456         return;
457 
458     // #110680#
459     // uno::Reference< lang::XMultiServiceFactory > xServiceFactory( comphelper::getProcessServiceFactory() );
460     uno::Reference< lang::XMultiServiceFactory > xServiceFactory( m_rContext.GetServiceFactory() );
461     DBG_ASSERT( xServiceFactory.is(), "XMLSettingsExportHelper::exportForbiddenCharacters: got no service manager" );
462 
463     if( xServiceFactory.is() )
464     {
465         uno::Reference< container::XIndexContainer > xBox(xServiceFactory->createInstance(rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.document.IndexedPropertyValues") ) ), uno::UNO_QUERY);
466         DBG_ASSERT( xBox.is(), "could not create service com.sun.star.document.IndexedPropertyValues" );
467         if (xBox.is() )
468         {
469             const uno::Sequence< lang::Locale > aLocales( xLocales->getLocales() );
470             const lang::Locale* pLocales = aLocales.getConstArray();
471 
472             const sal_Int32 nCount = aLocales.getLength();
473 
474             const rtl::OUString sLanguage  ( RTL_CONSTASCII_USTRINGPARAM ( "Language" ) );
475             const rtl::OUString sCountry   ( RTL_CONSTASCII_USTRINGPARAM ( "Country" ) );
476             const rtl::OUString sVariant   ( RTL_CONSTASCII_USTRINGPARAM ( "Variant" ) );
477             const rtl::OUString sBeginLine ( RTL_CONSTASCII_USTRINGPARAM ( "BeginLine" ) );
478             const rtl::OUString sEndLine   ( RTL_CONSTASCII_USTRINGPARAM ( "EndLine" ) );
479 
480             sal_Int32 nPos = 0;
481             for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++, pLocales++ )
482             {
483                 if( xForbChars->hasForbiddenCharacters( *pLocales ) )
484                 {
485                     const i18n::ForbiddenCharacters aChars( xForbChars->getForbiddenCharacters( *pLocales ) );
486 
487 
488                     uno::Sequence < beans::PropertyValue > aSequence ( XML_FORBIDDEN_CHARACTER_MAX );
489                     beans::PropertyValue *pForChar = aSequence.getArray();
490 
491                     pForChar[XML_FORBIDDEN_CHARACTER_LANGUAGE].Name    = sLanguage;
492                     pForChar[XML_FORBIDDEN_CHARACTER_LANGUAGE].Value <<= pLocales->Language;
493                     pForChar[XML_FORBIDDEN_CHARACTER_COUNTRY].Name    = sCountry;
494                     pForChar[XML_FORBIDDEN_CHARACTER_COUNTRY].Value <<= pLocales->Country;
495                     pForChar[XML_FORBIDDEN_CHARACTER_VARIANT].Name    = sVariant;
496                     pForChar[XML_FORBIDDEN_CHARACTER_VARIANT].Value <<= pLocales->Variant;
497                     pForChar[XML_FORBIDDEN_CHARACTER_BEGIN_LINE].Name    = sBeginLine;
498                     pForChar[XML_FORBIDDEN_CHARACTER_BEGIN_LINE].Value <<= aChars.beginLine;
499                     pForChar[XML_FORBIDDEN_CHARACTER_END_LINE].Name    = sEndLine;
500                     pForChar[XML_FORBIDDEN_CHARACTER_END_LINE].Value <<= aChars.endLine;
501                     xBox->insertByIndex(nPos++, uno::makeAny( aSequence ));
502                 }
503             }
504 
505             uno::Reference< container::XIndexAccess > xIA( xBox, uno::UNO_QUERY );
506             exportIndexAccess( xIA, rName );
507         }
508     }
509 }
510 
exportAllSettings(const uno::Sequence<beans::PropertyValue> & aProps,const rtl::OUString & rName) const511 void XMLSettingsExportHelper::exportAllSettings(
512                     const uno::Sequence<beans::PropertyValue>& aProps,
513                     const rtl::OUString& rName) const
514 {
515     DBG_ASSERT(rName.getLength(), "no name");
516     exportSequencePropertyValue(aProps, rName);
517 }
518 
519 
520 /** For some settings we may want to change their API representation
521  * from their XML settings representation. This is your chance to do
522  * so!
523  */
ManipulateSetting(uno::Any & rAny,const rtl::OUString & rName) const524 void XMLSettingsExportHelper::ManipulateSetting( uno::Any& rAny, const rtl::OUString& rName ) const
525 {
526     if( rName == msPrinterIndependentLayout )
527     {
528         sal_Int16 nTmp = sal_Int16();
529         if( rAny >>= nTmp )
530         {
531             if( nTmp == document::PrinterIndependentLayout::LOW_RESOLUTION )
532                 rAny <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("low-resolution"));
533             else if( nTmp == document::PrinterIndependentLayout::DISABLED )
534                 rAny <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("disabled"));
535             else if( nTmp == document::PrinterIndependentLayout::HIGH_RESOLUTION )
536                 rAny <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("high-resolution"));
537         }
538     }
539     else if( (rName == msColorTableURL) || (rName == msLineEndTableURL) || (rName == msHatchTableURL) ||
540              (rName == msDashTableURL) || (rName == msGradientTableURL) || (rName == msBitmapTableURL ) )
541     {
542         if( !mxStringSubsitution.is() )
543         {
544             if( m_rContext.GetServiceFactory().is() ) try
545             {
546                 const_cast< XMLSettingsExportHelper* >(this)->mxStringSubsitution =
547                     uno::Reference< util::XStringSubstitution >::query(
548                         m_rContext.GetServiceFactory()->
549                             createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.PathSubstitution" ) ) ) );
550             }
551             catch( uno::Exception& )
552             {
553                 DBG_UNHANDLED_EXCEPTION();
554             }
555         }
556 
557         if( mxStringSubsitution.is() )
558         {
559             ::rtl::OUString aURL;
560             rAny >>= aURL;
561             aURL = mxStringSubsitution->reSubstituteVariables( aURL );
562             rAny <<= aURL;
563         }
564     }
565 }
566