LCOV - code coverage report
Current view: top level - sd/source/ui/unoidl - UnoDocumentSettings.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 447 609 73.4 %
Date: 2014-11-03 Functions: 23 37 62.2 %
Legend: Lines: hit not hit

          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 <vector>
      21             : #include <com/sun/star/embed/XStorage.hpp>
      22             : #include <com/sun/star/embed/ElementModes.hpp>
      23             : #include <com/sun/star/embed/XTransactedObject.hpp>
      24             : #include <com/sun/star/lang/XServiceInfo.hpp>
      25             : #include <com/sun/star/beans/XPropertySet.hpp>
      26             : #include <com/sun/star/beans/XMultiPropertySet.hpp>
      27             : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
      28             : #include <cppuhelper/implbase3.hxx>
      29             : #include <cppuhelper/supportsservice.hxx>
      30             : #include <comphelper/propertysethelper.hxx>
      31             : #include <comphelper/propertysetinfo.hxx>
      32             : #include <tools/urlobj.hxx>
      33             : #include <svx/xtable.hxx>
      34             : #include <osl/diagnose.h>
      35             : #include <osl/mutex.hxx>
      36             : #include <vcl/svapp.hxx>
      37             : 
      38             : #include "drawdoc.hxx"
      39             : #include "DrawDocShell.hxx"
      40             : #include "UnoDocumentSettings.hxx"
      41             : #include "unomodel.hxx"
      42             : 
      43             : #include "optsitem.hxx"
      44             : #include <sfx2/printer.hxx>
      45             : #include "sdattr.hxx"
      46             : #include "../inc/ViewShell.hxx"
      47             : #include "../inc/FrameView.hxx"
      48             : #include "Outliner.hxx"
      49             : #include <xmloff/settingsstore.hxx>
      50             : #include <editeng/editstat.hxx>
      51             : #include <svx/unoapi.hxx>
      52             : 
      53             : using namespace ::comphelper;
      54             : using namespace ::osl;
      55             : using namespace ::cppu;
      56             : using namespace ::com::sun::star;
      57             : using namespace ::com::sun::star::uno;
      58             : using namespace ::com::sun::star::util;
      59             : using namespace ::com::sun::star::container;
      60             : using namespace ::com::sun::star::drawing;
      61             : using namespace ::com::sun::star::lang;
      62             : using namespace ::com::sun::star::document;
      63             : using namespace ::com::sun::star::frame;
      64             : using namespace ::com::sun::star::beans;
      65             : using namespace ::com::sun::star::i18n;
      66             : 
      67             : namespace sd
      68             : {
      69             :     class DocumentSettings : public WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >,
      70             :                              public comphelper::PropertySetHelper,
      71             :                              public DocumentSettingsSerializer
      72             :     {
      73             :     public:
      74             :         DocumentSettings( SdXImpressDocument* pModel );
      75             :         virtual ~DocumentSettings() throw();
      76             : 
      77             :         // XInterface
      78             :         virtual Any SAL_CALL queryInterface( const Type& aType ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
      79             :         virtual void SAL_CALL acquire(  ) throw () SAL_OVERRIDE;
      80             :         virtual void SAL_CALL release(  ) throw () SAL_OVERRIDE;
      81             : 
      82             :         // XPropertySet
      83             :         virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      84             :         virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      85             :         virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      86             :         virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      87             :         virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      88             :         virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      89             :         virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      90             : 
      91             :         // XMultiPropertySet
      92             :         virtual void SAL_CALL setPropertyValues( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues ) throw(::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      93             :         virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL getPropertyValues( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      94             :         virtual void SAL_CALL addPropertiesChangeListener( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      95             :         virtual void SAL_CALL removePropertiesChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      96             :         virtual void SAL_CALL firePropertiesChangeEvent( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      97             : 
      98             :         // XServiceInfo
      99             :         virtual OUString SAL_CALL getImplementationName(  ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
     100             :         virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
     101             :         virtual Sequence< OUString > SAL_CALL getSupportedServiceNames(  ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
     102             : 
     103             :         // DocumentSettingsSerializer cf. xmloff
     104             :         virtual uno::Sequence<beans::PropertyValue>
     105             :                 filterStreamsFromStorage(OUString const & referer,
     106             :                                          const uno::Reference< embed::XStorage > &xStorage,
     107             :                                          const uno::Sequence<beans::PropertyValue>& aConfigProps ) SAL_OVERRIDE;
     108             :         virtual uno::Sequence<beans::PropertyValue>
     109             :                 filterStreamsToStorage(const uno::Reference< embed::XStorage > &xStorage,
     110             :                                        const uno::Sequence<beans::PropertyValue>& aConfigProps ) SAL_OVERRIDE;
     111             : 
     112             :     protected:
     113             :         virtual void _setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const ::com::sun::star::uno::Any* pValues ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, RuntimeException, std::exception ) SAL_OVERRIDE;
     114             :         virtual void _getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, ::com::sun::star::uno::Any* pValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, RuntimeException, std::exception ) SAL_OVERRIDE;
     115             : 
     116             :     private:
     117             :         bool LoadList( XPropertyListType t, const OUString &rPath,
     118             :                        const OUString &rReferer,
     119             :                        const uno::Reference< embed::XStorage > &xStorage );
     120             :         void AssignURL( XPropertyListType t, const Any* pValue, bool *pOk, bool *pChanged );
     121             :         void ExtractURL( XPropertyListType t, Any* pValue );
     122             :         rtl::Reference<SdXImpressDocument> mxModel;
     123             :     };
     124             : 
     125         106 :     Reference< XInterface > SAL_CALL DocumentSettings_createInstance( SdXImpressDocument* pModel )
     126             :         throw ()
     127             :     {
     128             :         DBG_ASSERT( pModel, "I need a model for the DocumentSettings!" );
     129         106 :         return (XWeak*)new DocumentSettings( pModel );
     130             :     }
     131             : 
     132             : enum SdDocumentSettingsPropertyHandles
     133             : {
     134             :     HANDLE_PRINTDRAWING, HANDLE_PRINTNOTES, HANDLE_PRINTHANDOUT, HANDLE_PRINTOUTLINE, HANDLE_MEASUREUNIT, HANDLE_SCALE_NUM,
     135             :     HANDLE_SCALE_DOM, HANDLE_TABSTOP, HANDLE_PRINTPAGENAME, HANDLE_PRINTDATE, HANDLE_PRINTTIME,
     136             :     HANDLE_PRINTHIDENPAGES, HANDLE_PRINTFITPAGE, HANDLE_PRINTTILEPAGE, HANDLE_PRINTBOOKLET, HANDLE_PRINTBOOKLETFRONT,
     137             :     HANDLE_PRINTBOOKLETBACK, HANDLE_PRINTQUALITY, HANDLE_COLORTABLEURL, HANDLE_DASHTABLEURL, HANDLE_LINEENDTABLEURL, HANDLE_HATCHTABLEURL,
     138             :     HANDLE_GRADIENTTABLEURL, HANDLE_BITMAPTABLEURL, HANDLE_FORBIDDENCHARS, HANDLE_APPLYUSERDATA, HANDLE_PAGENUMFMT,
     139             :     HANDLE_PRINTERNAME, HANDLE_PRINTERJOB, HANDLE_PARAGRAPHSUMMATION, HANDLE_CHARCOMPRESS, HANDLE_ASIANPUNCT, HANDLE_UPDATEFROMTEMPLATE,
     140             :     HANDLE_PRINTER_INDEPENDENT_LAYOUT
     141             :     // #i33095#
     142             :     ,HANDLE_LOAD_READONLY, HANDLE_MODIFY_PASSWD, HANDLE_SAVE_VERSION
     143             :     ,HANDLE_SLIDESPERHANDOUT, HANDLE_HANDOUTHORIZONTAL, HANDLE_EMBED_FONTS
     144             : };
     145             : 
     146             : #define MID_PRINTER 1
     147             : 
     148         106 :     PropertySetInfo * createSettingsInfoImpl( bool bIsDraw )
     149             :     {
     150             :         static PropertyMapEntry const aImpressSettingsInfoMap[] =
     151             :         {
     152          16 :             { OUString("IsPrintDrawing"),        HANDLE_PRINTDRAWING,        ::getBooleanCppuType(),                0,  MID_PRINTER },
     153          16 :             { OUString("IsPrintNotes"),          HANDLE_PRINTNOTES,          ::getBooleanCppuType(),                0,  MID_PRINTER },
     154          16 :             { OUString("IsPrintHandout"),        HANDLE_PRINTHANDOUT,        ::getBooleanCppuType(),                0,  MID_PRINTER },
     155          16 :             { OUString("IsPrintOutline"),        HANDLE_PRINTOUTLINE,        ::getBooleanCppuType(),                0,  MID_PRINTER },
     156          16 :             { OUString("SlidesPerHandout"),      HANDLE_SLIDESPERHANDOUT,    ::cppu::UnoType<sal_Int16>::get(),    0,  MID_PRINTER },
     157          16 :             { OUString("HandoutsHorizontal"),    HANDLE_HANDOUTHORIZONTAL,   ::getBooleanCppuType(),                0,  MID_PRINTER },
     158             :             { OUString(), 0, css::uno::Type(), 0, 0 }
     159         218 :         };
     160             : 
     161             :         static PropertyMapEntry const aDrawSettingsInfoMap[] =
     162             :         {
     163          16 :             { OUString("MeasureUnit"),           HANDLE_MEASUREUNIT,         ::cppu::UnoType<sal_Int16>::get(),    0,  0 },
     164          16 :             { OUString("ScaleNumerator"),        HANDLE_SCALE_NUM,           ::cppu::UnoType<sal_Int32>::get(),    0,  0 },
     165          16 :             { OUString("ScaleDenominator"),      HANDLE_SCALE_DOM,           ::cppu::UnoType<sal_Int32>::get(),    0,  0 },
     166             :             { OUString(), 0, css::uno::Type(), 0, 0 }
     167         170 :         };
     168             : 
     169             :         static PropertyMapEntry const aCommonSettingsInfoMap[] =
     170             :         {
     171          16 :             { OUString("DefaultTabStop"),        HANDLE_TABSTOP,             ::cppu::UnoType<sal_Int32>::get(),    0,  0 },
     172          16 :             { OUString("PrinterName"),           HANDLE_PRINTERNAME,         ::cppu::UnoType<OUString>::get(),     0,  0 },
     173          16 :             { OUString("PrinterSetup"),          HANDLE_PRINTERJOB,          ::getCppuType((const uno::Sequence < sal_Int8 > *)0),  0, MID_PRINTER },
     174             : 
     175          16 :             { OUString("IsPrintPageName"),       HANDLE_PRINTPAGENAME,       ::getBooleanCppuType(),                0,  MID_PRINTER },
     176          16 :             { OUString("IsPrintDate"),           HANDLE_PRINTDATE,           ::getBooleanCppuType(),                0,  MID_PRINTER },
     177          16 :             { OUString("IsPrintTime"),           HANDLE_PRINTTIME,           ::getBooleanCppuType(),                0,  MID_PRINTER },
     178          16 :             { OUString("IsPrintHiddenPages"),    HANDLE_PRINTHIDENPAGES,     ::getBooleanCppuType(),                0,  MID_PRINTER },
     179          16 :             { OUString("IsPrintFitPage"),        HANDLE_PRINTFITPAGE,        ::getBooleanCppuType(),                0,  MID_PRINTER },
     180          16 :             { OUString("IsPrintTilePage"),       HANDLE_PRINTTILEPAGE,       ::getBooleanCppuType(),                0,  MID_PRINTER },
     181          16 :             { OUString("IsPrintBooklet"),        HANDLE_PRINTBOOKLET,        ::getBooleanCppuType(),                0,  MID_PRINTER },
     182          16 :             { OUString("IsPrintBookletFront"),   HANDLE_PRINTBOOKLETFRONT,   ::getBooleanCppuType(),                0,  MID_PRINTER },
     183          16 :             { OUString("IsPrintBookletBack"),    HANDLE_PRINTBOOKLETBACK,    ::getBooleanCppuType(),                0,  MID_PRINTER },
     184          16 :             { OUString("PrintQuality"),          HANDLE_PRINTQUALITY,        ::cppu::UnoType<sal_Int32>::get(),    0,  MID_PRINTER },
     185          16 :             { OUString("ColorTableURL"),         HANDLE_COLORTABLEURL,       ::cppu::UnoType<OUString>::get(),     0,  0 },
     186          16 :             { OUString("DashTableURL"),          HANDLE_DASHTABLEURL,        ::cppu::UnoType<OUString>::get(),     0,  0 },
     187          16 :             { OUString("LineEndTableURL"),       HANDLE_LINEENDTABLEURL,     ::cppu::UnoType<OUString>::get(),     0,  0 },
     188          16 :             { OUString("HatchTableURL"),         HANDLE_HATCHTABLEURL,       ::cppu::UnoType<OUString>::get(),     0,  0 },
     189          16 :             { OUString("GradientTableURL"),      HANDLE_GRADIENTTABLEURL,    ::cppu::UnoType<OUString>::get(),     0,  0 },
     190          16 :             { OUString("BitmapTableURL"),        HANDLE_BITMAPTABLEURL,      ::cppu::UnoType<OUString>::get(),     0,  0 },
     191             : 
     192          16 :             { OUString("ForbiddenCharacters"),   HANDLE_FORBIDDENCHARS,      cppu::UnoType<XForbiddenCharacters>::get(),    0, 0 },
     193          16 :             { OUString("ApplyUserData"),         HANDLE_APPLYUSERDATA,       ::getBooleanCppuType(),                0,  0 },
     194             : 
     195          16 :             { OUString("PageNumberFormat"),      HANDLE_PAGENUMFMT,          ::cppu::UnoType<sal_Int32>::get(),    0,  0 },
     196          16 :             { OUString("ParagraphSummation"),    HANDLE_PARAGRAPHSUMMATION,  ::getBooleanCppuType(),                0,  0 },
     197          16 :             { OUString("CharacterCompressionType"),HANDLE_CHARCOMPRESS,      ::cppu::UnoType<sal_Int16>::get(),          0,  0 },
     198          16 :             { OUString("IsKernAsianPunctuation"),HANDLE_ASIANPUNCT,          ::getBooleanCppuType(),                0,  0 },
     199          16 :             { OUString("UpdateFromTemplate"),    HANDLE_UPDATEFROMTEMPLATE,  ::getBooleanCppuType(),                0,  0 },
     200          16 :             { OUString("PrinterIndependentLayout"),HANDLE_PRINTER_INDEPENDENT_LAYOUT,::cppu::UnoType<sal_Int16>::get(), 0,  0 },
     201             :             // --> #i33095#
     202          16 :             { OUString("LoadReadonly"),          HANDLE_LOAD_READONLY,       ::getBooleanCppuType(),                0,  0 },
     203          16 :             { OUString("ModifyPasswordInfo"),    HANDLE_MODIFY_PASSWD,       ::getCppuType((uno::Sequence < beans::PropertyValue > *)0),  0,  0 },
     204          16 :             { OUString("SaveVersionOnClose"),    HANDLE_SAVE_VERSION,        ::getBooleanCppuType(),                0,  0 },
     205          16 :             { OUString("EmbedFonts"),            HANDLE_EMBED_FONTS,         ::getBooleanCppuType(),                0,  0 },
     206             :             { OUString(), 0, css::uno::Type(), 0, 0 }
     207         618 :         };
     208             : 
     209         106 :         PropertySetInfo* pInfo = new PropertySetInfo( aCommonSettingsInfoMap );
     210         106 :         pInfo->add( bIsDraw ? aDrawSettingsInfoMap : aImpressSettingsInfoMap );
     211             : 
     212         106 :         return pInfo;
     213             :     }
     214             : }
     215             : 
     216             : using namespace ::sd;
     217             : 
     218         106 : DocumentSettings::DocumentSettings( SdXImpressDocument* pModel )
     219         106 : :   PropertySetHelper( createSettingsInfoImpl( !pModel->IsImpressDocument() ) ),
     220         212 :     mxModel( pModel )
     221             : {
     222         106 : }
     223             : 
     224         212 : DocumentSettings::~DocumentSettings() throw()
     225             : {
     226         212 : }
     227             : 
     228         216 : bool DocumentSettings::LoadList( XPropertyListType t, const OUString &rInPath,
     229             :                                  const OUString &rReferer,
     230             :                                  const uno::Reference< embed::XStorage > &xStorage )
     231             : {
     232         216 :     SdDrawDocument* pDoc = mxModel->GetDoc();
     233             : 
     234         216 :     sal_Int32 nSlash = rInPath.lastIndexOf('/');
     235         432 :     OUString aPath, aName;
     236         216 :     if (nSlash < -1)
     237           0 :         aName = rInPath;
     238             :     else {
     239         216 :         aName = rInPath.copy( nSlash + 1 );
     240         216 :         aPath = rInPath.copy( 0, nSlash );
     241             :     }
     242             : 
     243             :     XPropertyListRef pList = XPropertyList::CreatePropertyList(
     244         432 :         t, aPath, rReferer );
     245         216 :     pList->SetName( aName );
     246             : 
     247         216 :     if( pList->LoadFrom( xStorage, rInPath, rReferer ) )
     248             :     {
     249          24 :         pDoc->SetPropertyList( pList );
     250          24 :         return true;
     251             :     }
     252             : 
     253         408 :     return false;
     254             : }
     255             : 
     256           0 : void DocumentSettings::AssignURL( XPropertyListType t, const Any* pValue,
     257             :                                   bool *pOk, bool *pChanged )
     258             : {
     259           0 :     OUString aURL;
     260           0 :     if( !(bool)( *pValue >>= aURL ) )
     261           0 :         return;
     262             : 
     263           0 :     if( LoadList( t, aURL, ""/*TODO?*/, uno::Reference< embed::XStorage >() ) )
     264           0 :         *pOk = *pChanged = true;
     265             : }
     266             : 
     267             : static struct {
     268             :     const char *pName;
     269             :     XPropertyListType t;
     270             : } aURLPropertyNames[] = {
     271             :     { "ColorTableURL", XCOLOR_LIST },
     272             :     { "DashTableURL", XDASH_LIST },
     273             :     { "LineEndTableURL", XLINE_END_LIST },
     274             :     { "HatchTableURL", XHATCH_LIST },
     275             :     { "GradientTableURL", XGRADIENT_LIST },
     276             :     { "BitmapTableURL", XBITMAP_LIST }
     277             : };
     278             : 
     279        1270 : static XPropertyListType getTypeOfName( const OUString &aName )
     280             : {
     281        8134 :     for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ ) {
     282        7080 :         if( aName.equalsAscii( aURLPropertyNames[i].pName ) )
     283         216 :             return aURLPropertyNames[i].t;
     284             :     }
     285        1054 :     return UNKNOWN_XPROPERTYLISTTYPE;
     286             : }
     287             : 
     288           0 : static OUString getNameOfType( XPropertyListType t )
     289             : {
     290           0 :     for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ ) {
     291           0 :         if( t == aURLPropertyNames[i].t )
     292             :             return OUString( aURLPropertyNames[i].pName,
     293           0 :                                   strlen( aURLPropertyNames[i].pName ) - 3,
     294           0 :                                   RTL_TEXTENCODING_UTF8 );
     295             :     }
     296           0 :     return OUString();
     297             : }
     298             : 
     299             : uno::Sequence<beans::PropertyValue>
     300          36 :         DocumentSettings::filterStreamsFromStorage(
     301             :                 OUString const & referer,
     302             :                 const uno::Reference< embed::XStorage > &xStorage,
     303             :                 const uno::Sequence<beans::PropertyValue>& aConfigProps )
     304             : {
     305          36 :     uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
     306          36 :     int nRet = 0;
     307        1306 :     for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ )
     308             :     {
     309        1270 :         XPropertyListType t = getTypeOfName( aConfigProps[i].Name );
     310        1270 :         if (t == UNKNOWN_XPROPERTYLISTTYPE)
     311        1054 :             aRet[nRet++] = aConfigProps[i];
     312             :         else
     313             :         {
     314         216 :             OUString aURL;
     315         216 :             aConfigProps[i].Value >>= aURL;
     316         216 :             LoadList( t, aURL, referer, xStorage );
     317             :         }
     318             :     }
     319          36 :     aRet.realloc( nRet );
     320          36 :     return aRet;
     321             : }
     322             : 
     323             : uno::Sequence<beans::PropertyValue>
     324          22 :         DocumentSettings::filterStreamsToStorage(
     325             :                 const uno::Reference< embed::XStorage > &xStorage,
     326             :                 const uno::Sequence<beans::PropertyValue>& aConfigProps )
     327             : {
     328          22 :     uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
     329             : 
     330          22 :     bool bHasEmbed = false;
     331          22 :     SdDrawDocument* pDoc = mxModel->GetDoc();
     332         154 :     for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ )
     333             :     {
     334         132 :         XPropertyListRef pList = pDoc->GetPropertyList( (XPropertyListType) i );
     335         132 :         if( ( bHasEmbed = pList.is() && pList->IsEmbedInDocument() ) )
     336           0 :             break;
     337         132 :     }
     338          22 :     if( !bHasEmbed )
     339          22 :         return aConfigProps;
     340             : 
     341             :     try {
     342             :         // create Settings/ sub storage.
     343           0 :         uno::Reference< embed::XStorage > xSubStorage;
     344           0 :         xSubStorage = xStorage->openStorageElement( "Settings" ,
     345           0 :             embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
     346           0 :         if( !xSubStorage.is() )
     347           0 :             return aRet;
     348             : 
     349             :         // now populate it
     350           0 :         for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ )
     351             :         {
     352           0 :             XPropertyListType t = getTypeOfName( aConfigProps[i].Name );
     353           0 :             aRet[i] = aConfigProps[i];
     354           0 :             if (t >= 0) {
     355           0 :                 XPropertyListRef pList = pDoc->GetPropertyList( t );
     356           0 :                 if( !pList.is() || !pList->IsEmbedInDocument() )
     357           0 :                     continue; // no change ...
     358             :                 else
     359             :                 {
     360             :                     // Such specific path construction is grim.
     361           0 :                     OUString aValue;
     362           0 :                     aRet[i].Value >>= aValue;
     363             : 
     364           0 :                     OUStringBuffer aName( getNameOfType( t ) );
     365           0 :                     OUString aResult;
     366           0 :                     if( pList->SaveTo( xSubStorage, aName.makeStringAndClear(), &aResult ) )
     367             :                     {
     368           0 :                         OUString aRealPath( "Settings/" );
     369           0 :                         aRealPath += aResult;
     370           0 :                         aRet[i].Value <<= aRealPath;
     371           0 :                     }
     372           0 :                 }
     373             :             }
     374             :         }
     375             : 
     376             :         // surprisingly difficult to make it really exist
     377           0 :         uno::Reference< embed::XTransactedObject > xTrans( xSubStorage, UNO_QUERY );
     378           0 :         if( xTrans.is() )
     379           0 :             xTrans->commit();
     380           0 :         uno::Reference< lang::XComponent > xComp( xSubStorage, UNO_QUERY );
     381           0 :         if( xComp.is() )
     382           0 :             xSubStorage->dispose();
     383           0 :     } catch (const uno::Exception &e) {
     384             :         (void)e;
     385             : //        fprintf (stderr, "saving etc. exception '%s'\n",
     386             : //                 OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
     387             :     }
     388             : 
     389           0 :     return aRet;
     390             : }
     391             : 
     392             : // Most of the code reading/writing UNO document settings is the same in
     393             : // sd, sc and sw and it is mostly copy-pasted back and forth.
     394             : // TODO: Move _setPropertyValues and _getPropertyValues to some shared
     395             : // place, at least for the settings that are common to sd, sc and sw
     396             : void
     397        1048 : DocumentSettings::_setPropertyValues(const PropertyMapEntry** ppEntries,
     398             :         const Any* pValues)
     399             : throw (UnknownPropertyException, PropertyVetoException,
     400             :     IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
     401             : {
     402        1048 :     ::SolarMutexGuard aGuard;
     403             : 
     404        1048 :     SdDrawDocument* pDoc = mxModel->GetDoc();
     405        1048 :     ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
     406        1048 :     if( NULL == pDoc || NULL == pDocSh )
     407             :     {
     408             :         throw RuntimeException("Document or Shell missing",
     409           0 :                 static_cast<OWeakObject *>(this));
     410             :     }
     411             : 
     412        1048 :     bool bValue = false;
     413        1048 :     bool bOk, bChanged = false, bOptionsChanged = false;
     414             : 
     415        2096 :     SdOptionsPrintItem aOptionsPrintItem( ATTR_OPTIONS_PRINT );
     416             : 
     417        1048 :     SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
     418        1048 :     if( pPrinter )
     419             :     {
     420          22 :         SdOptionsPrintItem* pPrinterOptions = NULL;
     421          22 :         if(pPrinter->GetOptions().GetItemState( ATTR_OPTIONS_PRINT, false, (const SfxPoolItem**) &pPrinterOptions) == SfxItemState::SET)
     422           0 :             aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
     423             :     }
     424             :     else
     425             :     {
     426        1026 :         aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
     427             :     }
     428        1048 :     SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
     429             : 
     430        2096 :     for( ; *ppEntries; ppEntries++, pValues++ )
     431             :     {
     432        1048 :         bOk = false;
     433             : 
     434        1048 :         switch( (*ppEntries)->mnHandle )
     435             :         {
     436             :             case HANDLE_COLORTABLEURL:
     437           0 :                 AssignURL( XCOLOR_LIST, pValues, &bOk, &bChanged );
     438           0 :                 break;
     439             : 
     440             :             case HANDLE_DASHTABLEURL:
     441           0 :                 AssignURL( XDASH_LIST, pValues, &bOk, &bChanged );
     442           0 :                 break;
     443             : 
     444             :             case HANDLE_LINEENDTABLEURL:
     445           0 :                 AssignURL( XLINE_END_LIST, pValues, &bOk, &bChanged );
     446           0 :                 break;
     447             : 
     448             :             case HANDLE_HATCHTABLEURL:
     449           0 :                 AssignURL( XHATCH_LIST, pValues, &bOk, &bChanged );
     450           0 :                 break;
     451             : 
     452             :             case HANDLE_GRADIENTTABLEURL:
     453           0 :                 AssignURL( XGRADIENT_LIST, pValues, &bOk, &bChanged );
     454           0 :                 break;
     455             : 
     456             :             case HANDLE_BITMAPTABLEURL:
     457           0 :                 AssignURL( XBITMAP_LIST, pValues, &bOk, &bChanged );
     458           0 :                 break;
     459             : 
     460             :             case HANDLE_FORBIDDENCHARS:
     461          28 :                 bOk = true;
     462          28 :                 break;
     463             : 
     464             :             case HANDLE_APPLYUSERDATA:
     465             :                 {
     466          36 :                     bool bApplyUserData = false;
     467          36 :                     if( *pValues >>= bApplyUserData )
     468             :                     {
     469          36 :                         bChanged = ( bApplyUserData != pDocSh->IsUseUserData() );
     470          36 :                         pDocSh->SetUseUserData( bApplyUserData );
     471          36 :                         bOk = true;
     472             :                     }
     473             :                 }
     474          36 :                 break;
     475             :             case HANDLE_PRINTDRAWING:
     476          32 :                 if( *pValues >>= bValue )
     477             :                 {
     478          32 :                     if( aPrintOpts.IsDraw() != bValue )
     479             :                     {
     480           0 :                         aPrintOpts.SetDraw( bValue );
     481           0 :                         bOptionsChanged = true;
     482             :                     }
     483             : 
     484          32 :                     bOk = true;
     485             :                 }
     486          32 :                 break;
     487             :             case HANDLE_PRINTNOTES:
     488          32 :                 if( *pValues >>= bValue )
     489             :                 {
     490          32 :                     if( aPrintOpts.IsNotes() != bValue )
     491             :                     {
     492           0 :                         aPrintOpts.SetNotes( bValue );
     493           0 :                         bOptionsChanged = true;
     494             :                     }
     495             : 
     496          32 :                     bOk = true;
     497             :                 }
     498          32 :                 break;
     499             :             case HANDLE_PRINTHANDOUT:
     500          32 :                 if( *pValues >>= bValue )
     501             :                 {
     502          32 :                     if( aPrintOpts.IsHandout() != bValue)
     503             :                     {
     504           0 :                         aPrintOpts.SetHandout( bValue );
     505           0 :                         bOptionsChanged = true;
     506             :                     }
     507             : 
     508          32 :                     bOk = true;
     509             :                 }
     510          32 :                 break;
     511             :             case HANDLE_PRINTOUTLINE:
     512          32 :                 if( *pValues >>= bValue )
     513             :                 {
     514          32 :                     if( aPrintOpts.IsOutline() != bValue)
     515             :                     {
     516           0 :                         aPrintOpts.SetOutline( bValue );
     517           0 :                         bOptionsChanged = true;
     518             :                     }
     519          32 :                     bOk = true;
     520             :                 }
     521          32 :                 break;
     522             :             case HANDLE_SLIDESPERHANDOUT:
     523             :                 {
     524          32 :                     sal_Int16 nValue = 0;
     525          32 :                     if( (*pValues >>= nValue) && (nValue >= 1) && (nValue <= 9) )
     526             :                     {
     527          32 :                         if( static_cast<sal_Int16>( aPrintOpts.GetHandoutPages() ) != nValue )
     528             :                         {
     529           0 :                             aPrintOpts.SetHandoutPages( static_cast< sal_uInt16 >( nValue ) );
     530           0 :                             bOptionsChanged = true;
     531             :                         }
     532          32 :                         bOk = true;
     533             :                     }
     534             :                 }
     535          32 :                 break;
     536             :             case HANDLE_HANDOUTHORIZONTAL:
     537          32 :                 if( *pValues >>= bValue )
     538             :                 {
     539          32 :                     if( aPrintOpts.IsHandoutHorizontal() != bValue )
     540             :                     {
     541           0 :                         aPrintOpts.SetHandoutHorizontal( bValue );
     542           0 :                         bOptionsChanged = true;
     543             :                     }
     544          32 :                     bOk = true;
     545             :                 }
     546          32 :                 break;
     547             : 
     548             :             case HANDLE_PRINTPAGENAME:
     549          36 :                 if( *pValues >>= bValue )
     550             :                 {
     551          36 :                     if( aPrintOpts.IsPagename() != bValue)
     552             :                     {
     553           0 :                         aPrintOpts.SetPagename( bValue );
     554           0 :                         bOptionsChanged = true;
     555             :                     }
     556          36 :                     bOk = true;
     557             :                 }
     558          36 :                 break;
     559             :             case HANDLE_PRINTDATE:
     560          36 :                 if( *pValues >>= bValue )
     561             :                 {
     562          36 :                     if( aPrintOpts.IsDate() != bValue)
     563             :                     {
     564           0 :                         aPrintOpts.SetDate( bValue );
     565           0 :                         bOptionsChanged = true;
     566             :                     }
     567          36 :                     bOk = true;
     568             :                 }
     569          36 :                 break;
     570             :             case HANDLE_PRINTTIME:
     571          36 :                 if( *pValues >>= bValue )
     572             :                 {
     573          36 :                     if( aPrintOpts.IsDate() != bValue)
     574             :                     {
     575           0 :                         aPrintOpts.SetTime( bValue );
     576           0 :                         bOptionsChanged = true;
     577             :                     }
     578          36 :                     bOk = true;
     579             :                 }
     580          36 :                 break;
     581             :             case HANDLE_PRINTHIDENPAGES:
     582          36 :                 if( *pValues >>= bValue )
     583             :                 {
     584          36 :                     if( aPrintOpts.IsHiddenPages() != bValue)
     585             :                     {
     586           0 :                         aPrintOpts.SetHiddenPages( bValue );
     587           0 :                         bOptionsChanged = true;
     588             :                     }
     589          36 :                     bOk = true;
     590             :                 }
     591          36 :                 break;
     592             :             case HANDLE_PRINTFITPAGE:
     593          36 :                 if( *pValues >>= bValue )
     594             :                 {
     595          36 :                     if( aPrintOpts.IsPagesize() != bValue)
     596             :                     {
     597           0 :                         aPrintOpts.SetPagesize( bValue );
     598           0 :                         bOptionsChanged = true;
     599             :                     }
     600          36 :                     bOk = true;
     601             :                 }
     602          36 :                 break;
     603             :             case HANDLE_PRINTTILEPAGE:
     604          36 :                 if( *pValues >>= bValue )
     605             :                 {
     606          36 :                     if( aPrintOpts.IsPagetile() != bValue)
     607             :                     {
     608           0 :                         aPrintOpts.SetPagetile( bValue );
     609           0 :                         bOptionsChanged = true;
     610             :                     }
     611          36 :                     bOk = true;
     612             :                 }
     613          36 :                 break;
     614             :             case HANDLE_PRINTBOOKLET:
     615          36 :                 if( *pValues >>= bValue )
     616             :                 {
     617          36 :                     if( aPrintOpts.IsBooklet() != bValue)
     618             :                     {
     619           0 :                         aPrintOpts.SetBooklet( bValue );
     620           0 :                         bOptionsChanged = true;
     621             :                     }
     622          36 :                     bOk = true;
     623             :                 }
     624          36 :                 break;
     625             :             case HANDLE_PRINTBOOKLETFRONT:
     626          36 :                 if( *pValues >>= bValue )
     627             :                 {
     628          36 :                     if( aPrintOpts.IsFrontPage() != bValue)
     629             :                     {
     630           0 :                         aPrintOpts.SetFrontPage( bValue );
     631           0 :                         bOptionsChanged = true;
     632             :                     }
     633          36 :                     bOk = true;
     634             :                 }
     635          36 :                 break;
     636             :             case HANDLE_PRINTBOOKLETBACK:
     637          36 :                 if( *pValues >>= bValue )
     638             :                 {
     639          36 :                     if( aPrintOpts.IsBackPage() != bValue)
     640             :                     {
     641           0 :                         aPrintOpts.SetBackPage( bValue );
     642           0 :                         bOptionsChanged = true;
     643             :                     }
     644          36 :                     bOk = true;
     645             :                 }
     646          36 :                 break;
     647             :             case HANDLE_PRINTQUALITY:
     648             :                 {
     649          36 :                     sal_Int32 nValue = 0;
     650          36 :                     if( *pValues >>= nValue )
     651             :                     {
     652          36 :                         if( aPrintOpts.GetOutputQuality() != nValue)
     653             :                         {
     654           0 :                             aPrintOpts.SetOutputQuality( (sal_uInt16)nValue );
     655           0 :                             bOptionsChanged = true;
     656             :                         }
     657          36 :                         bOk = true;
     658             :                     }
     659             :                 }
     660          36 :                 break;
     661             :             case HANDLE_MEASUREUNIT:
     662             :                 {
     663           2 :                     sal_Int16 nValue = 0;
     664           2 :                     if( *pValues >>= nValue )
     665             :                     {
     666             :                         FieldUnit nFieldUnit;
     667           2 :                         if( SvxMeasureUnitToFieldUnit( nValue, nFieldUnit ) )
     668             :                         {
     669           2 :                             pDoc->SetUIUnit( nFieldUnit );
     670           2 :                             bOk = true;
     671             :                         }
     672             :                     }
     673             :                 }
     674           2 :                 break;
     675             :             case HANDLE_SCALE_NUM:
     676             :                 {
     677           2 :                     sal_Int32 nValue = 0;
     678           2 :                     if( *pValues >>= nValue )
     679             :                     {
     680           2 :                         Fraction aFract( nValue, pDoc->GetUIScale().GetDenominator() );
     681           2 :                         pDoc->SetUIScale( aFract );
     682           2 :                         bOk = true;
     683           2 :                         bChanged = true;
     684             :                     }
     685             :                 }
     686           2 :                 break;
     687             :             case HANDLE_SCALE_DOM:
     688             :                 {
     689           2 :                     sal_Int32 nValue = 0;
     690           2 :                     if( *pValues >>= nValue )
     691             :                     {
     692           2 :                         Fraction aFract( pDoc->GetUIScale().GetNumerator(), nValue );
     693           2 :                         pDoc->SetUIScale( aFract );
     694           2 :                         bOk = true;
     695           2 :                         bChanged = true;
     696             :                     }
     697             :                 }
     698           2 :                 break;
     699             : 
     700             :             case HANDLE_TABSTOP:
     701             :                 {
     702          36 :                     sal_Int32 nValue = 0;
     703          36 :                     if( (*pValues >>= nValue) && (nValue >= 0) )
     704             :                     {
     705          36 :                         pDoc->SetDefaultTabulator((sal_uInt16)nValue);
     706          36 :                         bOk = true;
     707          36 :                         bChanged = true;
     708             :                     }
     709             :                 }
     710          36 :                 break;
     711             :             case HANDLE_PAGENUMFMT:
     712             :                 {
     713          36 :                     sal_Int32 nValue = 0;
     714          36 :                     if( (*pValues >>= nValue ) && (nValue >= SVX_CHARS_UPPER_LETTER ) && (nValue <= SVX_PAGEDESC) )
     715             :                     {
     716          36 :                         pDoc->SetPageNumType((SvxNumType)nValue);
     717          36 :                         bOk = true;
     718          36 :                         bChanged = true;
     719             :                     }
     720             :                 }
     721          36 :                 break;
     722             :             case HANDLE_PRINTERNAME:
     723             :                 {
     724          36 :                     OUString aPrinterName;
     725          36 :                     if( *pValues >>= aPrinterName )
     726             :                     {
     727          36 :                         bOk = true;
     728          36 :                         if( !aPrinterName.isEmpty() && pDocSh->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
     729             :                         {
     730           0 :                             SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true );
     731           0 :                             if (pTempPrinter)
     732             :                             {
     733           0 :                                 SfxPrinter *pNewPrinter = new SfxPrinter( pTempPrinter->GetOptions().Clone(), aPrinterName );
     734           0 :                                 pDocSh->SetPrinter( pNewPrinter );
     735             :                             }
     736             :                         }
     737          36 :                     }
     738             :                 }
     739          36 :                 break;
     740             :             case HANDLE_PRINTERJOB:
     741             :                 {
     742          36 :                     Sequence < sal_Int8 > aSequence;
     743          36 :                     if ( *pValues >>= aSequence )
     744             :                     {
     745          36 :                         bOk = true;
     746          36 :                         sal_uInt32 nSize = aSequence.getLength();
     747          36 :                         if( nSize )
     748             :                         {
     749           8 :                             SvMemoryStream aStream (aSequence.getArray(), nSize, STREAM_READ );
     750           8 :                             aStream.Seek ( STREAM_SEEK_TO_BEGIN );
     751             :                             SfxItemSet* pItemSet;
     752             : 
     753           8 :                             if( pPrinter )
     754             :                             {
     755           0 :                                 pItemSet = pPrinter->GetOptions().Clone();
     756             :                             }
     757             :                             else
     758             :                             {
     759             :                                 pItemSet = new SfxItemSet(pDoc->GetPool(),
     760             :                                             SID_PRINTER_NOTFOUND_WARN,  SID_PRINTER_NOTFOUND_WARN,
     761             :                                             SID_PRINTER_CHANGESTODOC,   SID_PRINTER_CHANGESTODOC,
     762             :                                             ATTR_OPTIONS_PRINT,         ATTR_OPTIONS_PRINT,
     763           8 :                                             0 );
     764             :                             }
     765             : 
     766           8 :                             pPrinter = SfxPrinter::Create ( aStream, pItemSet );
     767             : 
     768          16 :                             MapMode aMM (pPrinter->GetMapMode());
     769           8 :                             aMM.SetMapUnit(MAP_100TH_MM);
     770           8 :                             pPrinter->SetMapMode(aMM);
     771             : 
     772           8 :                             pDocSh->SetPrinter( pPrinter );
     773             : 
     774          16 :                             pPrinter = NULL;
     775             :                         }
     776          36 :                     }
     777             :                 }
     778          36 :                 break;
     779             : 
     780             :             case HANDLE_PARAGRAPHSUMMATION :
     781             :             {
     782          36 :                 bool bIsSummationOfParagraphs = false;
     783          36 :                 if ( *pValues >>= bIsSummationOfParagraphs )
     784             :                 {
     785          36 :                     bOk = true;
     786          36 :                     bChanged = true;
     787          36 :                     if ( pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
     788             :                     {
     789          34 :                         sal_uInt32 nSum = bIsSummationOfParagraphs ? EE_CNTRL_ULSPACESUMMATION : 0;
     790             :                         sal_uInt32 nCntrl;
     791             : 
     792          34 :                         pDoc->SetSummationOfParagraphs( bIsSummationOfParagraphs );
     793          34 :                         SdDrawDocument* pDocument = pDocSh->GetDoc();
     794          34 :                         SdrOutliner& rOutl = pDocument->GetDrawOutliner();
     795          34 :                         nCntrl = rOutl.GetControlWord() &~ EE_CNTRL_ULSPACESUMMATION;
     796          34 :                         rOutl.SetControlWord( nCntrl | nSum );
     797          34 :                         ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
     798          34 :                         if( pOutl )
     799             :                         {
     800           0 :                             nCntrl = pOutl->GetControlWord() &~ EE_CNTRL_ULSPACESUMMATION;
     801           0 :                             pOutl->SetControlWord( nCntrl | nSum );
     802             :                         }
     803          34 :                         pOutl = pDocument->GetInternalOutliner( false );
     804          34 :                         if( pOutl )
     805             :                         {
     806          34 :                             nCntrl = pOutl->GetControlWord() &~ EE_CNTRL_ULSPACESUMMATION;
     807          34 :                             pOutl->SetControlWord( nCntrl | nSum );
     808             :                         }
     809             :                     }
     810             :                 }
     811             :             }
     812          36 :             break;
     813             : 
     814             :             case HANDLE_CHARCOMPRESS:
     815             :             {
     816          36 :                 sal_Int16 nCharCompressType = 0;
     817          36 :                 if( *pValues >>= nCharCompressType )
     818             :                 {
     819          36 :                     bOk = true;
     820             : 
     821          36 :                     pDoc->SetCharCompressType( (sal_uInt16)nCharCompressType );
     822          36 :                     SdDrawDocument* pDocument = pDocSh->GetDoc();
     823          36 :                     SdrOutliner& rOutl = pDocument->GetDrawOutliner();
     824          36 :                     rOutl.SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
     825          36 :                     ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
     826          36 :                     if( pOutl )
     827             :                     {
     828           0 :                         pOutl->SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
     829             :                     }
     830          36 :                     pOutl = pDocument->GetInternalOutliner( false );
     831          36 :                     if( pOutl )
     832             :                     {
     833          36 :                         pOutl->SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
     834             :                     }
     835             :                 }
     836          36 :                 break;
     837             : 
     838             :             }
     839             :             case HANDLE_ASIANPUNCT:
     840             :             {
     841          36 :                 bool bAsianPunct = false;
     842          36 :                 if( *pValues >>= bAsianPunct )
     843             :                 {
     844          36 :                     bOk = true;
     845             : 
     846          36 :                     pDoc->SetKernAsianPunctuation( bAsianPunct );
     847          36 :                     SdDrawDocument* pDocument = pDocSh->GetDoc();
     848          36 :                     SdrOutliner& rOutl = pDocument->GetDrawOutliner();
     849          36 :                     rOutl.SetKernAsianPunctuation( bAsianPunct );
     850          36 :                     ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
     851          36 :                     if( pOutl )
     852             :                     {
     853           0 :                         pOutl->SetKernAsianPunctuation( bAsianPunct );
     854             :                     }
     855          36 :                     pOutl = pDocument->GetInternalOutliner( false );
     856          36 :                     if( pOutl )
     857             :                     {
     858          36 :                         pOutl->SetKernAsianPunctuation( bAsianPunct );
     859             :                     }
     860             :                 }
     861          36 :                 break;
     862             : 
     863             :             }
     864             :             case HANDLE_UPDATEFROMTEMPLATE:
     865             :             {
     866          36 :                 bool value = false;
     867          36 :                 if( *pValues >>= value )
     868             :                 {
     869          36 :                     bChanged = ( value != pDocSh->IsQueryLoadTemplate() );
     870          36 :                     pDocSh->SetQueryLoadTemplate( value );
     871          36 :                     bOk = true;
     872             :                 }
     873             :             }
     874          36 :             break;
     875             : 
     876             :             case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
     877             :             {
     878             :                 // Just propagate the new printer independent layout mode to
     879             :                 // the document and determine it really differs from the old
     880             :                 // one.
     881             :                 sal_Int16 nOldValue =
     882          36 :                     (sal_Int16)pDoc->GetPrinterIndependentLayout ();
     883          36 :                 sal_Int16 nValue = 0;
     884          36 :                 if (*pValues >>= nValue)
     885             :                 {
     886          36 :                     pDoc->SetPrinterIndependentLayout (nValue);
     887          36 :                     bChanged = (nValue != nOldValue);
     888          36 :                     bOk = true;
     889             :                 }
     890             :             }
     891          36 :             break;
     892             : 
     893             :             // --> #i33095#
     894             :             case HANDLE_LOAD_READONLY:
     895             :             {
     896          36 :                 bool bNewValue = false;
     897          36 :                 if ( *pValues >>= bNewValue )
     898             :                 {
     899          36 :                     bChanged = ( pDocSh->IsLoadReadonly() != bNewValue );
     900          36 :                     pDocSh->SetLoadReadonly( bNewValue );
     901          36 :                     bOk = true;
     902             :                 }
     903             :             }
     904          36 :             break;
     905             : 
     906             :             case HANDLE_MODIFY_PASSWD:
     907             :             {
     908           0 :                 uno::Sequence< beans::PropertyValue > aInfo;
     909           0 :                 if ( !( *pValues >>= aInfo ) )
     910             :                     throw lang::IllegalArgumentException(
     911             :                         OUString( "Value of type Sequence<PropertyValue> expected!" ),
     912             :                         uno::Reference< uno::XInterface >(),
     913           0 :                         2 );
     914             : 
     915           0 :                 if ( !pDocSh->SetModifyPasswordInfo( aInfo ) )
     916             :                     throw beans::PropertyVetoException(
     917           0 :                         "The hash is not allowed to be changed now!" );
     918             : 
     919             :             }
     920           0 :             break;
     921             : 
     922             :             case HANDLE_SAVE_VERSION:
     923             :             {
     924          36 :                 bool bNewValue = false;
     925          36 :                 if ( *pValues >>= bNewValue )
     926             :                 {
     927          36 :                     bChanged = ( pDocSh->IsSaveVersionOnClose() != bNewValue );
     928          36 :                     pDocSh->SetSaveVersionOnClose( bNewValue );
     929          36 :                     bOk = true;
     930             :                 }
     931             :             }
     932          36 :             break;
     933             : 
     934             :             case HANDLE_EMBED_FONTS:
     935             :             {
     936          30 :                 bool bNewValue = false;
     937          30 :                 if ( *pValues >>= bNewValue )
     938             :                 {
     939          30 :                     bChanged = ( pDoc->IsUsingEmbededFonts() != bNewValue );
     940          30 :                     pDoc->SetIsUsingEmbededFonts( bNewValue );
     941          30 :                     bOk = true;
     942             :                 }
     943             :             }
     944          30 :             break;
     945             : 
     946             :             default:
     947           0 :                 throw UnknownPropertyException();
     948             :         }
     949             : 
     950        1048 :         if( !bOk )
     951           0 :             throw IllegalArgumentException();
     952             :     }
     953             : 
     954        1048 :     if( bOptionsChanged )
     955             :     {
     956           0 :         if( !pPrinter )
     957           0 :             pPrinter = pDocSh->GetPrinter( true );
     958           0 :         SfxItemSet aNewOptions( pPrinter->GetOptions() );
     959           0 :         aNewOptions.Put( aOptionsPrintItem );
     960           0 :         pPrinter->SetOptions( aNewOptions );
     961             :     }
     962             : 
     963        1048 :     if( bChanged || bOptionsChanged )
     964        1164 :         mxModel->SetModified( true );
     965        1048 : }
     966             : 
     967         132 : void DocumentSettings::ExtractURL( XPropertyListType t, Any* pValue )
     968             : {
     969         132 :     XPropertyListRef pList = mxModel->GetDoc()->GetPropertyList( t );
     970         132 :     if( !pList.is() )
     971         132 :         return;
     972             : 
     973         264 :     INetURLObject aPathURL( pList->GetPath() );
     974         132 :     aPathURL.insertName( pList->GetName() );
     975         132 :     aPathURL.setExtension( pList->GetDefaultExt() );
     976         264 :     OUString aPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
     977         264 :     *pValue <<= aPath;
     978             : }
     979             : 
     980             : void
     981         814 : DocumentSettings::_getPropertyValues(
     982             :         const PropertyMapEntry** ppEntries, Any* pValue)
     983             : throw (UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
     984             : {
     985         814 :     ::SolarMutexGuard aGuard;
     986             : 
     987         814 :     SdDrawDocument* pDoc = mxModel->GetDoc();
     988         814 :     ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
     989         814 :     if( NULL == pDoc || NULL == pDocSh )
     990             :     {
     991             :         throw RuntimeException("Document or Shell missing",
     992           0 :                 static_cast<OWeakObject *>(this));
     993             :     }
     994             : 
     995        1628 :     SdOptionsPrintItem aOptionsPrintItem( ATTR_OPTIONS_PRINT );
     996             : 
     997         814 :     SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
     998         814 :     if( pPrinter )
     999             :     {
    1000           0 :         SdOptionsPrintItem* pPrinterOptions = NULL;
    1001           0 :         if(pPrinter->GetOptions().GetItemState( ATTR_OPTIONS_PRINT, false, (const SfxPoolItem**) &pPrinterOptions) == SfxItemState::SET)
    1002           0 :             aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
    1003             :     }
    1004             :     else
    1005             :     {
    1006         814 :         aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
    1007             :     }
    1008         814 :     SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
    1009             : 
    1010        1628 :     for( ; *ppEntries; ppEntries++, pValue++ )
    1011             :     {
    1012         814 :         switch( (*ppEntries)->mnHandle )
    1013             :         {
    1014             :             case HANDLE_COLORTABLEURL:
    1015          22 :                 ExtractURL( XCOLOR_LIST, pValue );
    1016          22 :                 break;
    1017             :             case HANDLE_DASHTABLEURL:
    1018          22 :                 ExtractURL( XDASH_LIST, pValue );
    1019          22 :                 break;
    1020             :             case HANDLE_LINEENDTABLEURL:
    1021          22 :                 ExtractURL( XLINE_END_LIST, pValue );
    1022          22 :                 break;
    1023             :             case HANDLE_HATCHTABLEURL:
    1024          22 :                 ExtractURL( XHATCH_LIST, pValue );
    1025          22 :                 break;
    1026             :             case HANDLE_GRADIENTTABLEURL:
    1027          22 :                 ExtractURL( XGRADIENT_LIST, pValue );
    1028          22 :                 break;
    1029             :             case HANDLE_BITMAPTABLEURL:
    1030          22 :                 ExtractURL( XBITMAP_LIST, pValue );
    1031          22 :                 break;
    1032             :             case HANDLE_FORBIDDENCHARS:
    1033          50 :                 *pValue <<= mxModel->getForbiddenCharsTable();
    1034          50 :                 break;
    1035             :             case HANDLE_APPLYUSERDATA:
    1036          22 :                 *pValue <<= pDocSh->IsUseUserData();
    1037          22 :                 break;
    1038             :             case HANDLE_PRINTDRAWING:
    1039           6 :                 *pValue <<= aPrintOpts.IsDraw();
    1040           6 :                 break;
    1041             :             case HANDLE_PRINTNOTES:
    1042           6 :                 *pValue <<= aPrintOpts.IsNotes();
    1043           6 :                 break;
    1044             :             case HANDLE_PRINTHANDOUT:
    1045           6 :                 *pValue <<= aPrintOpts.IsHandout();
    1046           6 :                 break;
    1047             :             case HANDLE_PRINTOUTLINE:
    1048           6 :                 *pValue <<= aPrintOpts.IsOutline();
    1049           6 :                 break;
    1050             :             case HANDLE_SLIDESPERHANDOUT:
    1051           6 :                 *pValue <<= (sal_Int16)aPrintOpts.GetHandoutPages();
    1052           6 :                 break;
    1053             :             case HANDLE_HANDOUTHORIZONTAL:
    1054           6 :                 *pValue <<= aPrintOpts.IsHandoutHorizontal();
    1055           6 :                 break;
    1056             :             case HANDLE_PRINTPAGENAME:
    1057          22 :                 *pValue <<= aPrintOpts.IsPagename();
    1058          22 :                 break;
    1059             :             case HANDLE_PRINTDATE:
    1060          22 :                 *pValue <<= aPrintOpts.IsDate();
    1061          22 :                 break;
    1062             :             case HANDLE_PRINTTIME:
    1063          22 :                 *pValue <<= aPrintOpts.IsTime();
    1064          22 :                 break;
    1065             :             case HANDLE_PRINTHIDENPAGES:
    1066          22 :                 *pValue <<= aPrintOpts.IsHiddenPages();
    1067          22 :                 break;
    1068             :             case HANDLE_PRINTFITPAGE:
    1069          22 :                 *pValue <<= aPrintOpts.IsPagesize();
    1070          22 :                 break;
    1071             :             case HANDLE_PRINTTILEPAGE:
    1072          22 :                 *pValue <<= aPrintOpts.IsPagetile();
    1073          22 :                 break;
    1074             :             case HANDLE_PRINTBOOKLET:
    1075          22 :                 *pValue <<= aPrintOpts.IsBooklet();
    1076          22 :                 break;
    1077             :             case HANDLE_PRINTBOOKLETFRONT:
    1078          22 :                 *pValue <<= aPrintOpts.IsFrontPage();
    1079          22 :                 break;
    1080             :             case HANDLE_PRINTBOOKLETBACK:
    1081          22 :                 *pValue <<= aPrintOpts.IsBackPage();
    1082          22 :                 break;
    1083             :             case HANDLE_PRINTQUALITY:
    1084          22 :                 *pValue <<= (sal_Int32)aPrintOpts.GetOutputQuality();
    1085          22 :                 break;
    1086             :             case HANDLE_MEASUREUNIT:
    1087             :                 {
    1088             :                     short nMeasure;
    1089          16 :                     SvxFieldUnitToMeasureUnit( pDoc->GetUIUnit(), nMeasure );
    1090          16 :                     *pValue <<= (sal_Int16)nMeasure;
    1091             :                 }
    1092          16 :                 break;
    1093             :             case HANDLE_SCALE_NUM:
    1094          16 :                 *pValue <<= (sal_Int32)pDoc->GetUIScale().GetNumerator();
    1095          16 :                 break;
    1096             :             case HANDLE_SCALE_DOM:
    1097          16 :                 *pValue <<= (sal_Int32)pDoc->GetUIScale().GetDenominator();
    1098          16 :                 break;
    1099             :             case HANDLE_TABSTOP:
    1100          22 :                 *pValue <<= (sal_Int32)pDoc->GetDefaultTabulator();
    1101          22 :                 break;
    1102             :             case HANDLE_PAGENUMFMT:
    1103          22 :                 *pValue <<= (sal_Int32)pDoc->GetPageNumType();
    1104          22 :                 break;
    1105             :             case HANDLE_PRINTERNAME:
    1106             :                 {
    1107          22 :                     SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
    1108          22 :                     *pValue <<= pTempPrinter ? OUString ( pTempPrinter->GetName()) : OUString();
    1109             :                 }
    1110          22 :                 break;
    1111             :             case HANDLE_PRINTERJOB:
    1112             :                 {
    1113          22 :                     SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
    1114          22 :                     if (pTempPrinter)
    1115             :                     {
    1116           0 :                         SvMemoryStream aStream;
    1117           0 :                         pTempPrinter->Store( aStream );
    1118           0 :                         aStream.Seek ( STREAM_SEEK_TO_END );
    1119           0 :                         sal_uInt32 nSize = aStream.Tell();
    1120           0 :                         aStream.Seek ( STREAM_SEEK_TO_BEGIN );
    1121           0 :                         Sequence < sal_Int8 > aSequence ( nSize );
    1122           0 :                         memcpy ( aSequence.getArray(), aStream.GetData(), nSize );
    1123           0 :                         *pValue <<= aSequence;
    1124             :                     }
    1125             :                     else
    1126             :                     {
    1127          22 :                         Sequence < sal_Int8 > aSequence;
    1128          22 :                         *pValue <<= aSequence;
    1129             :                     }
    1130             :                 }
    1131          22 :                 break;
    1132             : 
    1133             :             case HANDLE_PARAGRAPHSUMMATION :
    1134             :             {
    1135          22 :                 bool bIsSummationOfParagraphs = pDoc->IsSummationOfParagraphs();
    1136          22 :                 *pValue <<= bIsSummationOfParagraphs;
    1137             :             }
    1138          22 :             break;
    1139             : 
    1140             :             case HANDLE_CHARCOMPRESS:
    1141             :             {
    1142          22 :                 *pValue <<= (sal_Int16)pDoc->GetCharCompressType();
    1143          22 :                 break;
    1144             :             }
    1145             : 
    1146             :             case HANDLE_ASIANPUNCT:
    1147             :             {
    1148          22 :                 *pValue <<= pDoc->IsKernAsianPunctuation();
    1149          22 :                 break;
    1150             :             }
    1151             : 
    1152             :             case HANDLE_UPDATEFROMTEMPLATE:
    1153             :             {
    1154          22 :                 *pValue <<= pDocSh->IsQueryLoadTemplate();
    1155             :             }
    1156          22 :             break;
    1157             : 
    1158             :             case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
    1159             :             {
    1160             :                 sal_Int16 nPrinterIndependentLayout =
    1161          22 :                     (sal_Int16)pDoc->GetPrinterIndependentLayout();
    1162          22 :                 *pValue <<= nPrinterIndependentLayout;
    1163             :             }
    1164          22 :             break;
    1165             : 
    1166             :             // --> #i33095#
    1167             :             case HANDLE_LOAD_READONLY:
    1168             :             {
    1169          22 :                 *pValue <<= pDocSh->IsLoadReadonly();
    1170             :             }
    1171          22 :             break;
    1172             : 
    1173             :             case HANDLE_MODIFY_PASSWD:
    1174             :             {
    1175          22 :                 *pValue <<= pDocSh->GetModifyPasswordInfo();
    1176             :             }
    1177          22 :             break;
    1178             : 
    1179             :             case HANDLE_SAVE_VERSION:
    1180             :             {
    1181          22 :                 *pValue <<= pDocSh->IsSaveVersionOnClose();
    1182             :             }
    1183          22 :             break;
    1184             : 
    1185             :             case HANDLE_EMBED_FONTS:
    1186             :             {
    1187          42 :                 *pValue <<= pDoc->IsUsingEmbededFonts();
    1188             :             }
    1189          42 :             break;
    1190             : 
    1191             :             default:
    1192           0 :                 throw UnknownPropertyException();
    1193             :         }
    1194         814 :     }
    1195         814 : }
    1196             : 
    1197             : // XInterface
    1198         106 : Any SAL_CALL DocumentSettings::queryInterface( const Type& aType ) throw (RuntimeException, std::exception)
    1199             : {
    1200         106 :     return WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::queryInterface( aType );
    1201             : }
    1202             : 
    1203         212 : void SAL_CALL DocumentSettings::acquire(  ) throw ()
    1204             : {
    1205         212 :     WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::acquire();
    1206         212 : }
    1207             : 
    1208         212 : void SAL_CALL DocumentSettings::release(  ) throw ()
    1209             : {
    1210         212 :     WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::release();
    1211         212 : }
    1212             : 
    1213             : // XPropertySet
    1214          86 : Reference< XPropertySetInfo > SAL_CALL DocumentSettings::getPropertySetInfo(  ) throw(RuntimeException, std::exception)
    1215             : {
    1216          86 :     return PropertySetHelper::getPropertySetInfo();
    1217             : }
    1218             : 
    1219        1048 : void SAL_CALL DocumentSettings::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
    1220             : {
    1221        1048 :     PropertySetHelper::setPropertyValue( aPropertyName, aValue );
    1222        1048 : }
    1223             : 
    1224         814 : Any SAL_CALL DocumentSettings::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
    1225             : {
    1226         814 :     return PropertySetHelper::getPropertyValue( PropertyName );
    1227             : }
    1228             : 
    1229           0 : void SAL_CALL DocumentSettings::addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
    1230             : {
    1231           0 :     PropertySetHelper::addPropertyChangeListener( aPropertyName, xListener );
    1232           0 : }
    1233             : 
    1234           0 : void SAL_CALL DocumentSettings::removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
    1235             : {
    1236           0 :     PropertySetHelper::removePropertyChangeListener( aPropertyName, aListener );
    1237           0 : }
    1238             : 
    1239           0 : void SAL_CALL DocumentSettings::addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
    1240             : {
    1241           0 :     PropertySetHelper::addVetoableChangeListener( PropertyName, aListener );
    1242           0 : }
    1243             : 
    1244           0 : void SAL_CALL DocumentSettings::removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
    1245             : {
    1246           0 :     PropertySetHelper::removeVetoableChangeListener( PropertyName, aListener );
    1247           0 : }
    1248             : 
    1249             : // XMultiPropertySet
    1250           0 : void SAL_CALL DocumentSettings::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) throw(PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
    1251             : {
    1252           0 :     PropertySetHelper::setPropertyValues( aPropertyNames, aValues );
    1253           0 : }
    1254             : 
    1255           0 : Sequence< Any > SAL_CALL DocumentSettings::getPropertyValues( const Sequence< OUString >& aPropertyNames ) throw(RuntimeException, std::exception)
    1256             : {
    1257           0 :     return PropertySetHelper::getPropertyValues( aPropertyNames );
    1258             : }
    1259             : 
    1260           0 : void SAL_CALL DocumentSettings::addPropertiesChangeListener( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener ) throw(RuntimeException, std::exception)
    1261             : {
    1262           0 :     PropertySetHelper::addPropertiesChangeListener( aPropertyNames, xListener );
    1263           0 : }
    1264             : 
    1265           0 : void SAL_CALL DocumentSettings::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& xListener ) throw(RuntimeException, std::exception)
    1266             : {
    1267           0 :     PropertySetHelper::removePropertiesChangeListener( xListener );
    1268           0 : }
    1269             : 
    1270           0 : void SAL_CALL DocumentSettings::firePropertiesChangeEvent( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener ) throw(RuntimeException, std::exception)
    1271             : {
    1272           0 :     PropertySetHelper::firePropertiesChangeEvent( aPropertyNames, xListener );
    1273           0 : }
    1274             : 
    1275             : // XServiceInfo
    1276           0 : OUString SAL_CALL DocumentSettings::getImplementationName(  )
    1277             :     throw(RuntimeException, std::exception)
    1278             : {
    1279           0 :     return OUString( "com.sun.star.comp.Draw.DocumentSettings" );
    1280             : }
    1281             : 
    1282           0 : sal_Bool SAL_CALL DocumentSettings::supportsService( const OUString& ServiceName )
    1283             :     throw(RuntimeException, std::exception)
    1284             : {
    1285           0 :     return cppu::supportsService(this, ServiceName);
    1286             : }
    1287             : 
    1288           0 : Sequence< OUString > SAL_CALL DocumentSettings::getSupportedServiceNames(  )
    1289             :     throw(RuntimeException, std::exception)
    1290             : {
    1291           0 :     Sequence< OUString > aSeq( 2 );
    1292           0 :     aSeq[0] = "com.sun.star.document.Settings" ;
    1293           0 :     if( mxModel->IsImpressDocument() )
    1294             :     {
    1295           0 :         aSeq[1] = "com.sun.star.presentation.DocumentSettings" ;
    1296             :     }
    1297             :     else
    1298             :     {
    1299           0 :         aSeq[1] = "com.sun.star.drawing.DocumentSettings" ;
    1300             :     }
    1301             : 
    1302           0 :     return aSeq;
    1303         114 : }
    1304             : 
    1305             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10