LCOV - code coverage report
Current view: top level - idl/source/objects - slot.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 522 577 90.5 %
Date: 2014-11-03 Functions: 47 52 90.4 %
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             : 
      21             : #include <ctype.h>
      22             : #include <stdio.h>
      23             : #include <rtl/strbuf.hxx>
      24             : #include <tools/debug.hxx>
      25             : #include <slot.hxx>
      26             : #include <globals.hxx>
      27             : #include <database.hxx>
      28             : 
      29       16376 : TYPEINIT1( SvMetaSlot, SvMetaAttribute );
      30             : 
      31          68 : SvMetaObject *SvMetaSlot::MakeClone() const
      32             : {
      33          68 :         return new SvMetaSlot( *this );
      34             : }
      35             : 
      36        8249 : SvMetaSlot::SvMetaSlot()
      37             :     : aCachable( true, false )
      38             :     , aSynchron( true, false )
      39             :     , aRecordPerSet( true, false )
      40             :     , aRecordAbsolute( false, false )
      41             :     , pLinkedSlot(0)
      42             :     , pNextSlot(0)
      43             :     , nListPos(0)
      44        8249 :     , pEnumValue(0)
      45             : {
      46        8249 : }
      47             : 
      48        4257 : SvMetaSlot::SvMetaSlot( SvMetaType * pType )
      49             :     : SvMetaAttribute( pType )
      50             :     , aCachable( true, false )
      51             :     , aSynchron( true, false )
      52             :     , aRecordPerSet( true, false )
      53             :     , aRecordAbsolute( false, false )
      54             :     , pLinkedSlot(0)
      55             :     , pNextSlot(0)
      56             :     , nListPos(0)
      57        4257 :     , pEnumValue(0)
      58             : {
      59        4257 : }
      60             : 
      61       11196 : bool SvMetaSlot::IsVariable() const
      62             : {
      63       11196 :     return SvMetaAttribute::IsVariable();
      64             : }
      65             : 
      66       23538 : bool SvMetaSlot::IsMethod() const
      67             : {
      68       23538 :     bool b = SvMetaAttribute::IsMethod();
      69       23538 :     b |= NULL != GetMethod();
      70       23538 :     return b;
      71             : }
      72             : 
      73        5912 : OString SvMetaSlot::GetMangleName( bool bVariable ) const
      74             : {
      75        5912 :     if( !bVariable )
      76             :     {
      77        5912 :         SvMetaAttribute * pMeth = GetMethod();
      78        5912 :         if( pMeth )
      79          22 :             return pMeth->GetName().getString();
      80             :     }
      81        5890 :     return GetName().getString();
      82             : }
      83             : 
      84             : /*************************************************************************
      85             : |*    reference
      86             : |*
      87             : |*    description       Second FALSE in the SvBOOL-Objects means
      88             : |*                      IsSet() provides FALSE (default initialization).
      89             : *************************************************************************/
      90             : /** reference disbandment **/
      91       11683 : SvMetaType * SvMetaSlot::GetSlotType() const
      92             : {
      93       11683 :     if( aSlotType.Is() || !GetRef() ) return aSlotType;
      94        5839 :     return static_cast<SvMetaSlot *>(GetRef())->GetSlotType();
      95             : }
      96       84032 : SvMetaAttribute * SvMetaSlot::GetMethod() const
      97             : {
      98       84032 :     if( aMethod.Is() || !GetRef() ) return aMethod;
      99       41852 :     return static_cast<SvMetaSlot *>(GetRef())->GetMethod();
     100             : }
     101       11756 : bool SvMetaSlot::GetHasCoreId() const
     102             : {
     103       11756 :     if( aHasCoreId.IsSet() || !GetRef() ) return aHasCoreId;
     104        5844 :     return static_cast<SvMetaSlot *>(GetRef())->GetHasCoreId();
     105             : }
     106       23056 : const OString& SvMetaSlot::GetGroupId() const
     107             : {
     108       23056 :     if( !aGroupId.getString().isEmpty() || !GetRef() ) return aGroupId.getString();
     109       11316 :     return static_cast<SvMetaSlot *>(GetRef())->GetGroupId();
     110             : }
     111       11756 : const OString& SvMetaSlot::GetDisableFlags() const
     112             : {
     113       11756 :     if( !aDisableFlags.getString().isEmpty() || !GetRef() ) return aDisableFlags.getString();
     114        4847 :     return static_cast<SvMetaSlot *>(GetRef())->GetDisableFlags();
     115             : }
     116           0 : const OString& SvMetaSlot::GetConfigId() const
     117             : {
     118           0 :     if( !aConfigId.getString().isEmpty() || !GetRef() ) return aConfigId.getString();
     119           0 :     return static_cast<SvMetaSlot *>(GetRef())->GetConfigId();
     120             : }
     121       23437 : const OString& SvMetaSlot::GetExecMethod() const
     122             : {
     123       23437 :     if( !aExecMethod.getString().isEmpty() || !GetRef() ) return aExecMethod.getString();
     124         708 :     return static_cast<SvMetaSlot *>(GetRef())->GetExecMethod();
     125             : }
     126      163740 : const OString& SvMetaSlot::GetStateMethod() const
     127             : {
     128      163740 :     if( !aStateMethod.getString().isEmpty() || !GetRef() ) return aStateMethod.getString();
     129        9155 :     return static_cast<SvMetaSlot *>(GetRef())->GetStateMethod();
     130             : }
     131           0 : const OString& SvMetaSlot::GetDefault() const
     132             : {
     133           0 :     if( !aDefault.getString().isEmpty() || !GetRef() ) return aDefault.getString();
     134           0 :     return static_cast<SvMetaSlot *>(GetRef())->GetDefault();
     135             : }
     136       11751 : bool SvMetaSlot::GetPseudoSlots() const
     137             : {
     138       11751 :     if( aPseudoSlots.IsSet() || !GetRef() ) return aPseudoSlots;
     139        5839 :     return static_cast<SvMetaSlot *>(GetRef())->GetPseudoSlots();
     140             : }
     141       11595 : bool SvMetaSlot::GetCachable() const
     142             : {
     143             :     // Cachable and Volatile are exclusive
     144       11595 :     if( !GetRef() || aCachable.IsSet() || aVolatile.IsSet() )
     145        5912 :          return aCachable;
     146        5683 :     return static_cast<SvMetaSlot *>(GetRef())->GetCachable();
     147             : }
     148       11595 : bool SvMetaSlot::GetVolatile() const
     149             : {
     150             :     // Cachable and Volatile are exclusive
     151       11595 :     if( !GetRef() || aVolatile.IsSet() || aCachable.IsSet() )
     152        5912 :         return aVolatile;
     153        5683 :     return static_cast<SvMetaSlot *>(GetRef())->GetVolatile();
     154             : }
     155       11755 : bool SvMetaSlot::GetToggle() const
     156             : {
     157       11755 :     if( aToggle.IsSet() || !GetRef() ) return aToggle;
     158        5843 :     return static_cast<SvMetaSlot *>(GetRef())->GetToggle();
     159             : }
     160       11727 : bool SvMetaSlot::GetAutoUpdate() const
     161             : {
     162       11727 :     if( aAutoUpdate.IsSet() || !GetRef() ) return aAutoUpdate;
     163        5815 :     return static_cast<SvMetaSlot *>(GetRef())->GetAutoUpdate();
     164             : }
     165       11726 : bool SvMetaSlot::GetSynchron() const
     166             : {
     167             :     // Synchron and Asynchron are exclusive
     168       11726 :     if( !GetRef() || aSynchron.IsSet() || aAsynchron.IsSet() )
     169        5912 :         return aSynchron;
     170        5814 :     return static_cast<SvMetaSlot *>(GetRef())->GetSynchron();
     171             : }
     172       11726 : bool SvMetaSlot::GetAsynchron() const
     173             : {
     174             :     // Synchron and Asynchron are exclusive
     175       11726 :     if( !GetRef() || aAsynchron.IsSet() || aSynchron.IsSet() )
     176        5912 :         return aAsynchron;
     177        5814 :     return static_cast<SvMetaSlot *>(GetRef())->GetAsynchron();
     178             : }
     179       11755 : bool SvMetaSlot::GetRecordPerItem() const
     180             : {
     181             :     // Record- PerItem, No, PerSet and Manual are exclusive
     182       29354 :     if( !GetRef() || aRecordPerItem.IsSet() || aNoRecord.IsSet()
     183       17598 :       || aRecordPerSet.IsSet() || aRecordManual.IsSet() )
     184        5912 :         return aRecordPerItem;
     185        5843 :     return static_cast<SvMetaSlot *>(GetRef())->GetRecordPerItem();
     186             : }
     187       11755 : bool SvMetaSlot::GetRecordPerSet() const
     188             : {
     189             :     // Record- PerItem, No, PerSet and Manual are exclusive
     190       29354 :     if( !GetRef() || aRecordPerItem.IsSet() || aNoRecord.IsSet()
     191       17598 :       || aRecordPerSet.IsSet() || aRecordManual.IsSet() )
     192        5912 :         return aRecordPerSet;
     193        5843 :     return static_cast<SvMetaSlot *>(GetRef())->GetRecordPerSet();
     194             : }
     195       11755 : bool SvMetaSlot::GetRecordManual() const
     196             : {
     197             :     // Record- PerItem, No, PerSet and Manual are exclusive
     198       29354 :     if( !GetRef() || aRecordPerItem.IsSet() || aNoRecord.IsSet()
     199       17598 :       || aRecordPerSet.IsSet() || aRecordManual.IsSet() )
     200        5912 :         return aRecordManual;
     201        5843 :     return static_cast<SvMetaSlot *>(GetRef())->GetRecordManual();
     202             : }
     203       11755 : bool SvMetaSlot::GetNoRecord() const
     204             : {
     205             :     // Record- PerItem, No, PerSet and Manual are exclusive
     206       29354 :     if( !GetRef() || aRecordPerItem.IsSet() || aNoRecord.IsSet()
     207       17598 :       || aRecordPerSet.IsSet() || aRecordManual.IsSet() )
     208        5912 :         return aNoRecord;
     209        5843 :     return static_cast<SvMetaSlot *>(GetRef())->GetNoRecord();
     210             : }
     211       11756 : bool SvMetaSlot::GetRecordAbsolute() const
     212             : {
     213       11756 :     if( !GetRef() || aRecordAbsolute.IsSet() )
     214        5912 :         return aRecordAbsolute;
     215        5844 :     return static_cast<SvMetaSlot *>(GetRef())->GetRecordAbsolute();
     216             : }
     217       11741 : bool SvMetaSlot::GetHasDialog() const
     218             : {
     219       11741 :     if( aHasDialog.IsSet() || !GetRef() ) return aHasDialog;
     220        5829 :     return static_cast<SvMetaSlot *>(GetRef())->GetHasDialog();
     221             : }
     222         272 : const OString& SvMetaSlot::GetPseudoPrefix() const
     223             : {
     224         272 :     if( !aPseudoPrefix.getString().isEmpty() || !GetRef() ) return aPseudoPrefix.getString();
     225         136 :     return static_cast<SvMetaSlot *>(GetRef())->GetPseudoPrefix();
     226             : }
     227       11713 : bool SvMetaSlot::GetMenuConfig() const
     228             : {
     229       11713 :     if( aMenuConfig.IsSet() || !GetRef() ) return aMenuConfig;
     230        5801 :     return static_cast<SvMetaSlot *>(GetRef())->GetMenuConfig();
     231             : }
     232       11721 : bool SvMetaSlot::GetToolBoxConfig() const
     233             : {
     234       11721 :     if( aToolBoxConfig.IsSet() || !GetRef() ) return aToolBoxConfig;
     235        5809 :     return static_cast<SvMetaSlot *>(GetRef())->GetToolBoxConfig();
     236             : }
     237       11755 : bool SvMetaSlot::GetStatusBarConfig() const
     238             : {
     239       11755 :     if( aStatusBarConfig.IsSet() || !GetRef() ) return aStatusBarConfig;
     240        5843 :     return static_cast<SvMetaSlot *>(GetRef())->GetStatusBarConfig();
     241             : }
     242       11725 : bool SvMetaSlot::GetAccelConfig() const
     243             : {
     244       11725 :     if( aAccelConfig.IsSet() || !GetRef() ) return aAccelConfig;
     245        5813 :     return static_cast<SvMetaSlot *>(GetRef())->GetAccelConfig();
     246             : }
     247       11737 : bool SvMetaSlot::GetFastCall() const
     248             : {
     249       11737 :     if( aFastCall.IsSet() || !GetRef() ) return aFastCall;
     250        5825 :     return static_cast<SvMetaSlot *>(GetRef())->GetFastCall();
     251             : }
     252       11754 : bool SvMetaSlot::GetContainer() const
     253             : {
     254       11754 :     if( aContainer.IsSet() || !GetRef() ) return aContainer;
     255        5842 :     return static_cast<SvMetaSlot *>(GetRef())->GetContainer();
     256             : }
     257             : 
     258       11756 : bool SvMetaSlot::GetImageRotation() const
     259             : {
     260       11756 :     if( aImageRotation.IsSet() || !GetRef() ) return aImageRotation;
     261        5844 :     return static_cast<SvMetaSlot *>(GetRef())->GetImageRotation();
     262             : }
     263             : 
     264       11756 : bool SvMetaSlot::GetImageReflection() const
     265             : {
     266       11756 :     if( aImageReflection.IsSet() || !GetRef() ) return aImageReflection;
     267        5844 :     return static_cast<SvMetaSlot *>(GetRef())->GetImageReflection();
     268             : }
     269             : 
     270           0 : const OString& SvMetaSlot::GetUnoName() const
     271             : {
     272           0 :     if( aUnoName.IsSet() || !GetRef() ) return aUnoName.getString();
     273           0 :     return static_cast<SvMetaSlot *>(GetRef())->GetUnoName();
     274             : }
     275             : 
     276      162636 : void SvMetaSlot::ReadAttributesSvIdl( SvIdlDataBase & rBase,
     277             :                                     SvTokenStream & rInStm )
     278             : {
     279      162636 :     SvMetaAttribute::ReadAttributesSvIdl( rBase, rInStm );
     280             : 
     281      162636 :     bool bOk = false;
     282      162636 :     bOk |= aDefault.ReadSvIdl( SvHash_Default(), rInStm );
     283      162636 :     bOk |= aPseudoSlots.ReadSvIdl( SvHash_PseudoSlots(), rInStm );
     284      162636 :     bOk |= aHasCoreId.ReadSvIdl( SvHash_HasCoreId(), rInStm );
     285      162636 :     bOk |= aGroupId.ReadSvIdl( SvHash_GroupId(), rInStm );
     286      162636 :     bOk |= aExecMethod.ReadSvIdl( SvHash_ExecMethod(), rInStm );
     287      162636 :     bOk |= aStateMethod.ReadSvIdl( SvHash_StateMethod(), rInStm );
     288      162636 :     bOk |= aDisableFlags.ReadSvIdl( SvHash_DisableFlags(), rInStm );
     289      162636 :     if( aGet.ReadSvIdl( SvHash_Get(), rInStm ) )
     290             :     {
     291           0 :         rBase.WriteError( "warning", OUStringToOString(rInStm.GetFileName(), RTL_TEXTENCODING_UTF8),
     292             :                     "<Get> old style, use Readonly",
     293             :                     rInStm.GetToken()->GetLine(),
     294           0 :                     rInStm.GetToken()->GetColumn() );
     295             :     }
     296      162636 :     if( aSet.ReadSvIdl( SvHash_Set(), rInStm ) )
     297             :     {
     298           0 :         rBase.WriteError( "warning", OUStringToOString(rInStm.GetFileName(), RTL_TEXTENCODING_UTF8),
     299             :                     "<Set> old style, use method declaration",
     300             :                     rInStm.GetToken()->GetLine(),
     301           0 :                     rInStm.GetToken()->GetColumn() );
     302             :     }
     303             : 
     304      162636 :     if( aCachable.ReadSvIdl( SvHash_Cachable(), rInStm ) )
     305       16279 :         SetCachable( aCachable ), bOk = true;
     306      162636 :     if( aVolatile.ReadSvIdl( SvHash_Volatile(), rInStm ) )
     307           0 :         SetVolatile( aVolatile ), bOk = true;
     308      162636 :     if( aToggle.ReadSvIdl( SvHash_Toggle(), rInStm ) )
     309        8083 :         SetToggle( aToggle ), bOk = true;
     310      162636 :     if( aAutoUpdate.ReadSvIdl( SvHash_AutoUpdate(), rInStm ) )
     311        8098 :         SetAutoUpdate( aAutoUpdate ), bOk = true;
     312             : 
     313      162636 :     if( aSynchron.ReadSvIdl( SvHash_Synchron(), rInStm ) )
     314        6517 :         SetSynchron( aSynchron ), bOk = true;
     315      162636 :     if( aAsynchron.ReadSvIdl( SvHash_Asynchron(), rInStm ) )
     316        1582 :         SetAsynchron( aAsynchron ), bOk = true;
     317             : 
     318      162636 :     if( aRecordAbsolute.ReadSvIdl( SvHash_RecordAbsolute(), rInStm ) )
     319        7893 :         SetRecordAbsolute( aRecordAbsolute), bOk = true;
     320      162636 :     if( aRecordPerItem.ReadSvIdl( SvHash_RecordPerItem(), rInStm ) )
     321         581 :         SetRecordPerItem( aRecordPerItem ), bOk = true;
     322      162636 :     if( aRecordPerSet.ReadSvIdl( SvHash_RecordPerSet(), rInStm ) )
     323        7035 :         SetRecordPerSet( aRecordPerSet ), bOk = true;
     324      162636 :     if( aRecordManual.ReadSvIdl( SvHash_RecordManual(), rInStm ) )
     325         181 :         SetRecordManual( aRecordManual ), bOk = true;
     326      162636 :     if( aNoRecord.ReadSvIdl( SvHash_NoRecord(), rInStm ) )
     327          97 :         SetNoRecord( aNoRecord ), bOk = true;
     328             : 
     329      162636 :     bOk |= aHasDialog.ReadSvIdl( SvHash_HasDialog(), rInStm );
     330      162636 :     bOk |= aPseudoPrefix.ReadSvIdl( SvHash_PseudoPrefix(), rInStm );
     331      162636 :     bOk |= aMenuConfig.ReadSvIdl( SvHash_MenuConfig(), rInStm );
     332      162636 :     bOk |= aToolBoxConfig.ReadSvIdl( SvHash_ToolBoxConfig(), rInStm );
     333      162636 :     bOk |= aStatusBarConfig.ReadSvIdl( SvHash_StatusBarConfig(), rInStm );
     334      162636 :     bOk |= aAccelConfig.ReadSvIdl( SvHash_AccelConfig(), rInStm );
     335             : 
     336      162636 :     SvBOOL aAllConfig;
     337      162636 :     if( aAllConfig.ReadSvIdl( SvHash_AllConfig(), rInStm ) )
     338           0 :         SetAllConfig( aAllConfig ), bOk = true;
     339      162636 :     bOk |= aFastCall.ReadSvIdl( SvHash_FastCall(), rInStm );
     340      162636 :     bOk |= aContainer.ReadSvIdl( SvHash_Container(), rInStm );
     341      162636 :     bOk |= aImageRotation.ReadSvIdl( SvHash_ImageRotation(), rInStm );
     342      162636 :     bOk |= aImageReflection.ReadSvIdl( SvHash_ImageReflection(), rInStm );
     343      162636 :     bOk |= aUnoName.ReadSvIdl( SvHash_UnoName(), rInStm );
     344             : 
     345      162636 :     if( !bOk )
     346             :     {
     347       25026 :         if( !aSlotType.Is() )
     348             :         {
     349       24196 :             sal_uInt32 nTokPos = rInStm.Tell();
     350       24196 :             SvToken * pTok = rInStm.GetToken_Next();
     351       24196 :             if( pTok->Is( SvHash_SlotType() ) )
     352             :             {
     353         807 :                 bool bBraket = rInStm.Read( '(' );
     354         807 :                 if( bBraket || rInStm.Read( '=' ) )
     355             :                 {
     356         807 :                     aSlotType = rBase.ReadKnownType( rInStm );
     357         807 :                     if( aSlotType.Is() )
     358             :                     {
     359         807 :                         if( aSlotType->IsItem() )
     360             :                         {
     361         807 :                             if( bBraket )
     362             :                             {
     363           0 :                                 if( rInStm.Read( ')' ) )
     364         833 :                                     return;
     365             :                             }
     366             :                             else
     367         807 :                                 return;
     368             :                         }
     369           0 :                         rBase.SetError( "the SlotType is not a item", rInStm.GetToken() );
     370           0 :                         rBase.WriteError( rInStm );
     371             :                     }
     372           0 :                     rBase.SetError( "SlotType with unknown item type", rInStm.GetToken() );
     373           0 :                     rBase.WriteError( rInStm );
     374             :                 }
     375             :             }
     376       23389 :             rInStm.Seek( nTokPos );
     377             : 
     378             :         }
     379       24219 :         if( !aMethod.Is() )
     380             :         {
     381       24143 :             SvToken * pTok = rInStm.GetToken();
     382       24143 :             if( pTok->IsIdentifier() )
     383             :             {
     384          26 :                 aMethod = new SvMetaSlot();
     385          26 :                 sal_uInt32 nTokPos = rInStm.Tell();
     386          26 :                 if( aMethod->ReadSvIdl( rBase, rInStm ) )
     387             :                 {
     388          26 :                     if( aMethod->IsMethod() )
     389             :                     {
     390          26 :                         aMethod->SetSlotId( GetSlotId() );
     391          26 :                         if( aMethod->Test( rBase, rInStm ) )
     392          26 :                             return;
     393             :                     }
     394           0 :                     rInStm.Seek( nTokPos );
     395             :                 }
     396           0 :                 aMethod.Clear();
     397             :             }
     398             :         }
     399             :     }
     400             : }
     401             : 
     402       12175 : bool SvMetaSlot::Test( SvIdlDataBase & rBase, SvTokenStream & rInStm )
     403             : {
     404       12175 :     bool bOk = SvMetaAttribute::Test( rBase, rInStm );
     405       12175 :     if( bOk )
     406             :     {
     407       12175 :         SvMetaType * pType = GetType();
     408       12175 :         if( pType->GetType() == TYPE_METHOD )
     409        6732 :             pType = pType->GetReturnType();
     410       12175 :         if( !pType->IsItem() )
     411             :         {
     412           0 :             rBase.SetError( "this attribute is not a slot", rInStm.GetToken() );
     413           0 :             rBase.WriteError( rInStm );
     414           0 :             bOk = false;
     415             :         }
     416             :     }
     417             : 
     418       12175 :     return bOk;
     419             : }
     420             : 
     421       12506 : bool SvMetaSlot::ReadSvIdl( SvIdlDataBase & rBase, SvTokenStream & rInStm )
     422             : {
     423       12506 :     sal_uInt32  nTokPos     = rInStm.Tell();
     424       12506 :     bool bOk = true;
     425             : 
     426       12506 :     SvMetaAttribute * pAttr = rBase.ReadKnownAttr( rInStm, GetType() );
     427       12506 :     if( pAttr )
     428             :     {
     429             :         // c
     430        4041 :         SvMetaSlot * pKnownSlot = PTR_CAST( SvMetaSlot, pAttr );
     431        4041 :         if( pKnownSlot )
     432             :         {
     433        4041 :             SetRef( pKnownSlot );
     434        4041 :             SetName( pKnownSlot->GetName().getString(), &rBase );
     435        4041 :             bOk = SvMetaName::ReadSvIdl( rBase, rInStm );
     436             :         }
     437             :         else
     438             :         {
     439           0 :             OStringBuffer aStr( "attribute " );
     440           0 :             aStr.append(pAttr->GetName().getString());
     441           0 :             aStr.append(" is method or variable but not a slot");
     442           0 :             rBase.SetError( aStr.makeStringAndClear(), rInStm.GetToken() );
     443           0 :             rBase.WriteError( rInStm );
     444           0 :             bOk = false;
     445             :         }
     446             :     }
     447             :     else
     448             :     {
     449        8465 :         bOk = SvMetaAttribute::ReadSvIdl( rBase, rInStm );
     450             : 
     451        8465 :         SvMetaAttribute *pAttr2 = rBase.SearchKnownAttr( GetSlotId() );
     452        8465 :         if( pAttr2 )
     453             :         {
     454             :             // for testing purposes: reference in case of complete definition
     455          49 :             SvMetaSlot * pKnownSlot = PTR_CAST( SvMetaSlot, pAttr2 );
     456          49 :             if( pKnownSlot )
     457             :             {
     458          49 :                 SetRef( pKnownSlot );
     459             : 
     460             :                   // names may differ, because explicitly given
     461          49 :                 if ( pKnownSlot->GetName().getString() != GetName().getString() )
     462             :                 {
     463             :                     OSL_FAIL("Illegal definition!");
     464           0 :                     rInStm.Seek( nTokPos );
     465           0 :                     return false;
     466             :                 }
     467             : 
     468          49 :                   SetName( pKnownSlot->GetName().getString(), &rBase );
     469             :             }
     470             :             else
     471             :             {
     472           0 :                 OStringBuffer aStr("attribute ");
     473           0 :                 aStr.append(pAttr2->GetName().getString());
     474           0 :                 aStr.append(" is method or variable but not a slot");
     475           0 :                 rBase.SetError( aStr.makeStringAndClear(), rInStm.GetToken() );
     476           0 :                 rBase.WriteError( rInStm );
     477           0 :                 bOk = false;
     478             :             }
     479             :         }
     480             :     }
     481             : 
     482       12506 :     if( !bOk )
     483         331 :         rInStm.Seek( nTokPos );
     484             : 
     485       12506 :     return bOk;
     486             : }
     487             : 
     488        5912 : void SvMetaSlot::Insert( SvSlotElementList& rList, const OString& rPrefix,
     489             :                         SvIdlDataBase& rBase)
     490             : {
     491             :     // get insert position through binary search in slotlist
     492        5912 :     sal_uInt16 nId = (sal_uInt16) GetSlotId().GetValue();
     493        5912 :     sal_uInt16 nListCount = (sal_uInt16) rList.size();
     494             :     sal_uInt16 nPos;
     495             :     sal_uLong m;  // for inner "for" loop
     496             : 
     497        5912 :     if ( !nListCount )
     498          76 :         nPos = 0;
     499        5836 :     else if ( nListCount == 1 )
     500          69 :         nPos = rList[ 0 ]->xSlot->GetSlotId().GetValue() >= nId ? 0 : 1;
     501             :     else
     502             :     {
     503        5767 :         sal_uInt16 nMid = 0, nLow = 0;
     504        5767 :         sal_uInt16 nHigh = nListCount - 1;
     505        5767 :         bool bFound = false;
     506       47767 :         while ( !bFound && nLow <= nHigh )
     507             :         {
     508       36398 :             nMid = (nLow + nHigh) >> 1;
     509             :             DBG_ASSERT( nMid < nListCount, "bsearch ist buggy" );
     510       36398 :             int nDiff = (int) nId - (int) rList[ nMid ]->xSlot->GetSlotId().GetValue();
     511       36398 :             if ( nDiff < 0)
     512             :             {
     513       16190 :                 if ( nMid == 0 )
     514         165 :                     break;
     515       16025 :                 nHigh = nMid - 1;
     516             :             }
     517       20208 :             else if ( nDiff > 0 )
     518             :             {
     519       20208 :                 nLow = nMid + 1;
     520       20208 :                 if ( nLow == 0 )
     521           0 :                 break;
     522             :             }
     523             :             else
     524           0 :                 bFound = true;
     525             :         }
     526             : 
     527             :         DBG_ASSERT(!bFound, "Duplicate SlotId!");
     528        5767 :         nPos = bFound ? nMid : nLow;
     529             :     }
     530             : 
     531             :     DBG_ASSERT( nPos <= nListCount,
     532             :         "nPos too large" );
     533             :     DBG_ASSERT( nPos == nListCount || nId <=
     534             :         (sal_uInt16) rList[ nPos ]->xSlot->GetSlotId().GetValue(),
     535             :         "Successor has lower SlotId" );
     536             :     DBG_ASSERT( nPos == 0 || nId >
     537             :         (sal_uInt16) rList[ nPos-1 ]->xSlot->GetSlotId().GetValue(),
     538             :         "Predecessor has higher SlotId" );
     539             :     DBG_ASSERT( nPos+1 >= nListCount || nId <
     540             :         (sal_uInt16) rList[ nPos+1 ]->xSlot->GetSlotId().GetValue(),
     541             :         "Successor has lower SlotId" );
     542             : 
     543        5912 :     if ( nPos < rList.size() )
     544             :     {
     545        5439 :         SvSlotElementList::iterator it = rList.begin();
     546        5439 :         std::advance( it, nPos );
     547        5439 :         rList.insert( it, new SvSlotElement( this, rPrefix ) );
     548             :     }
     549             :     else
     550             :     {
     551         473 :         rList.push_back( new SvSlotElement( this, rPrefix ) );
     552             :     }
     553             : 
     554             :     // iron out EnumSlots
     555        5912 :     SvMetaTypeEnum * pEnum = NULL;
     556        5912 :     SvMetaType * pBType = GetType()->GetBaseType();
     557        5912 :     pEnum = PTR_CAST( SvMetaTypeEnum, pBType );
     558        5912 :     if( GetPseudoSlots() && pEnum && pEnum->Count() )
     559             :     {
     560             :         // clone the MasterSlot
     561           5 :         SvMetaSlotRef xEnumSlot;
     562           5 :         SvMetaSlot *pFirstEnumSlot = NULL;
     563          73 :         for( sal_uLong n = 0; n < pEnum->Count(); n++ )
     564             :         {
     565             :             // create SlotId
     566          68 :             SvMetaEnumValue *enumValue = pEnum->GetObject(n);
     567          68 :             OString aValName = enumValue->GetName().getString();
     568         136 :             OStringBuffer aBuf;
     569          68 :             if( !GetPseudoPrefix().isEmpty() )
     570          68 :                 aBuf.append(GetPseudoPrefix());
     571             :             else
     572           0 :                 aBuf.append(GetSlotId().getString());
     573          68 :             aBuf.append('_');
     574          68 :             aBuf.append(aValName.copy(pEnum->GetPrefix().getLength()));
     575             : 
     576         136 :             OString aSId = aBuf.makeStringAndClear();
     577             : 
     578          68 :             xEnumSlot = NULL;
     579       34712 :             for( m=0; m<rBase.GetAttrList().size(); m++ )
     580             :             {
     581       34712 :                 SvMetaAttribute * pAttr = rBase.GetAttrList()[m];
     582       34712 :                 if (aSId.equals(pAttr->GetSlotId().getString()))
     583             :                 {
     584          68 :                     SvMetaSlot& rSlot = dynamic_cast<SvMetaSlot&>(*pAttr);
     585          68 :                     xEnumSlot = rSlot.Clone();
     586          68 :                     break;
     587             :                 }
     588             :             }
     589             : 
     590          68 :             if ( m == rBase.GetAttrList().size() )
     591             :             {
     592             :                 OSL_FAIL("Invalid EnumSlot!");
     593           0 :                 xEnumSlot = Clone();
     594             :                 sal_uLong nValue;
     595           0 :                 if ( rBase.FindId(aSId , &nValue) )
     596             :                 {
     597           0 :                     SvNumberIdentifier aId;
     598           0 :                     aId.setString(aSId);
     599           0 :                     aId.SetValue(nValue);
     600           0 :                     xEnumSlot->SetSlotId(aId);
     601             :                 }
     602             :             }
     603             : 
     604             :             // The slaves are no master!
     605          68 :             xEnumSlot->aPseudoSlots = false;
     606          68 :             xEnumSlot->SetEnumValue(enumValue);
     607             : 
     608          68 :             if ( !pFirstEnumSlot || xEnumSlot->GetSlotId().GetValue() < pFirstEnumSlot->GetSlotId().GetValue() )
     609           7 :                 pFirstEnumSlot = xEnumSlot;
     610             : 
     611             :             // insert the created slave as well
     612          68 :             xEnumSlot->Insert( rList, rPrefix, rBase);
     613             : 
     614             :             // concatenate the EnumSlots with the master
     615          68 :             xEnumSlot->pLinkedSlot = this;
     616          68 :         }
     617             : 
     618             :         // master points to the first slave
     619           5 :         pLinkedSlot = pFirstEnumSlot;
     620             : 
     621             :         // concatenate slaves among themselves
     622           5 :         xEnumSlot = pFirstEnumSlot;
     623           5 :         size_t i = 0;
     624             :         SvSlotElement *pEle;
     625         205 :         do
     626             :         {
     627         205 :             pEle = ( ++i < rList.size() ) ? rList[ i ] : NULL;
     628         205 :             if ( pEle && pEle->xSlot->pLinkedSlot == this )
     629             :             {
     630          67 :                 xEnumSlot->pNextSlot = pEle->xSlot;
     631          67 :                 xEnumSlot = pEle->xSlot;
     632             :             }
     633             :         }
     634             :         while ( pEle );
     635           5 :         xEnumSlot->pNextSlot = pFirstEnumSlot;
     636             :     }
     637        5912 : }
     638             : 
     639             : 
     640       35450 : static OString MakeSlotName( SvStringHashEntry * pEntry )
     641             : {
     642       35450 :     OStringBuffer aName("SFX_SLOT_");
     643       35450 :     aName.append(pEntry->GetName());
     644       35450 :     return aName.makeStringAndClear().toAsciiUpperCase();
     645             : };
     646             : 
     647        5912 : void SvMetaSlot::WriteSlotStubs( const OString& rShellName,
     648             :                                 ByteStringList & rList,
     649             :                                 SvStream & rOutStm )
     650             : {
     651        5912 :     if ( !GetExport() && !GetHidden() )
     652        5912 :         return;
     653             : 
     654        5912 :     OString aMethodName( GetExecMethod() );
     655       11402 :     if ( !aMethodName.isEmpty() &&
     656        5490 :          aMethodName != "NoExec" )
     657             :     {
     658        5483 :         bool bIn = false;
     659       32891 :         for( size_t n = 0; n < rList.size(); n++ )
     660             :         {
     661       32549 :             if (rList[n]->equals(aMethodName))
     662             :             {
     663        5141 :                 bIn = true;
     664        5141 :                 break;
     665             :             }
     666             :         }
     667             : 
     668        5483 :         if ( !bIn )
     669             :         {
     670         342 :             rList.push_back( new OString(aMethodName) );
     671         342 :             rOutStm.WriteCharPtr( "SFX_EXEC_STUB(" )
     672         684 :                    .WriteCharPtr( rShellName.getStr() )
     673         342 :                    .WriteChar( ',' )
     674         684 :                    .WriteCharPtr( aMethodName.getStr() )
     675         342 :                    .WriteChar( ')' ) << endl;
     676             :         }
     677             :     }
     678             : 
     679        5912 :     aMethodName = GetStateMethod();
     680       11401 :     if (!aMethodName.isEmpty() &&
     681        5489 :         aMethodName != "NoState")
     682             :     {
     683        5166 :         bool bIn = false;
     684       28988 :         for ( size_t n=0; n < rList.size(); n++ )
     685             :         {
     686       28698 :             if (rList[n]->equals(aMethodName))
     687             :             {
     688        4876 :                 bIn = true;
     689        4876 :                 break;
     690             :             }
     691             :         }
     692             : 
     693        5166 :         if ( !bIn )
     694             :         {
     695         290 :             rList.push_back( new OString(aMethodName) );
     696         290 :             rOutStm.WriteCharPtr( "SFX_STATE_STUB(" )
     697         580 :                    .WriteCharPtr( rShellName.getStr() )
     698         290 :                    .WriteChar( ',' )
     699         580 :                    .WriteCharPtr( aMethodName.getStr() )
     700         290 :                    .WriteChar( ')' ) << endl;
     701             :         }
     702        5912 :     }
     703             : }
     704             : 
     705        5912 : void SvMetaSlot::WriteSlot( const OString& rShellName, sal_uInt16 nCount,
     706             :                             const OString& rSlotId,
     707             :                             SvSlotElementList& rSlotList,
     708             :                             size_t nStart,
     709             :                             SvIdlDataBase & rBase, SvStream & rOutStm )
     710             : {
     711        5912 :     if ( !GetExport() && !GetHidden() )
     712        5912 :         return;
     713             : 
     714        5912 :     bool bIsEnumSlot = 0 != pEnumValue;
     715             : 
     716        5912 :     rOutStm.WriteCharPtr( "// Slot Nr. " )
     717       17736 :        .WriteCharPtr( OString::number(nListPos).getStr() )
     718        5912 :        .WriteCharPtr( " : " );
     719        5912 :     OString aSlotIdValue(OString::number(GetSlotId().GetValue()));
     720        5912 :     rOutStm.WriteCharPtr( aSlotIdValue.getStr() ) << endl;
     721        5912 :     WriteTab( rOutStm, 1 );
     722        5912 :     if( bIsEnumSlot )
     723          68 :         rOutStm.WriteCharPtr( "SFX_NEW_SLOT_ENUM( " );
     724             :     else
     725        5844 :         rOutStm.WriteCharPtr( "SFX_NEW_SLOT_ARG( " ).WriteCharPtr( rShellName.getStr() ).WriteChar( ',' ) ;
     726             : 
     727        5912 :     rOutStm.WriteCharPtr( rSlotId.getStr() ).WriteChar( ',' );
     728        5912 :     const SvHelpContext& rHlpCtx = GetHelpContext();
     729        5912 :     if( rHlpCtx.IsSet() )
     730           0 :         rOutStm.WriteCharPtr( rHlpCtx.getString().getStr() ).WriteChar( ',' );
     731             :     else
     732        5912 :         rOutStm.WriteCharPtr( rSlotId.getStr() ).WriteChar( ',' );
     733             : 
     734             :     // GroupId
     735        5912 :     if( !GetGroupId().isEmpty() )
     736        5828 :         rOutStm.WriteCharPtr( GetGroupId().getStr() );
     737             :     else
     738          84 :         rOutStm.WriteChar( '0' );
     739        5912 :     rOutStm.WriteChar( ',' ) << endl;
     740        5912 :     WriteTab( rOutStm, 4 );
     741             : 
     742        5912 :     if( bIsEnumSlot )
     743             :     {
     744          68 :         rOutStm.WriteCharPtr( "&a" ).WriteCharPtr( rShellName.getStr() ).WriteCharPtr( "Slots_Impl[" )
     745         204 :            .WriteCharPtr( OString::number(pLinkedSlot->GetListPos()).getStr() )
     746          68 :            .WriteCharPtr( "] /*Offset Master*/, " ) << endl;
     747          68 :         WriteTab( rOutStm, 4 );
     748          68 :         rOutStm.WriteCharPtr( "&a" ).WriteCharPtr( rShellName.getStr() ).WriteCharPtr( "Slots_Impl[" )
     749         204 :            .WriteCharPtr( OString::number(pNextSlot->GetListPos()).getStr() )
     750          68 :            .WriteCharPtr( "] /*Offset Next*/, " ) << endl;
     751             : 
     752          68 :         WriteTab( rOutStm, 4 );
     753             : 
     754             :         // SlotId
     755          68 :         if( !GetSlotId().getString().isEmpty() )
     756          68 :             rOutStm.WriteCharPtr( pLinkedSlot->GetSlotId().getString().getStr() );
     757             :         else
     758           0 :             rOutStm.WriteChar( '0' );
     759          68 :         rOutStm.WriteChar( ',' );
     760          68 :         rOutStm.WriteCharPtr( pEnumValue->GetName().getString().getStr() );
     761             :     }
     762             :     else
     763             :     {
     764             :         // look for the next slot with the same StateMethod like me
     765             :         // the slotlist is set to the current slot
     766        5844 :         size_t i = nStart;
     767        5844 :         SvSlotElement* pEle = ( ++i < rSlotList.size() ) ? rSlotList[ i ] : NULL;
     768        5844 :         pNextSlot = pEle ? &pEle->xSlot : NULL;
     769       53818 :         while ( pNextSlot )
     770             :         {
     771       94965 :             if ( !pNextSlot->pNextSlot &&
     772       47345 :                 pNextSlot->GetStateMethod() == GetStateMethod()
     773             :             ) {
     774        5490 :                 break;
     775             :             }
     776       42130 :             pEle = ( ++i < rSlotList.size() ) ? rSlotList[ i ] : NULL;
     777       42130 :             pNextSlot = pEle ? &pEle->xSlot : NULL;
     778             :         }
     779             : 
     780        5844 :         if ( !pNextSlot )
     781             :         {
     782             :             // There is no slot behind me that has the same ExecMethod.
     783             :             // So I search for the first slot with it (could be myself).
     784         354 :             i = 0;
     785         354 :             pEle = rSlotList.empty() ? NULL : rSlotList[ i ];
     786         354 :             pNextSlot = pEle ? &pEle->xSlot : NULL;
     787       19284 :             while ( pNextSlot != this )
     788             :             {
     789       37615 :                 if ( !pNextSlot->pEnumValue &&
     790       18742 :                     pNextSlot->GetStateMethod() == GetStateMethod() )
     791         297 :                     break;
     792       18576 :                 pEle = ( ++i < rSlotList.size() ) ? rSlotList[ i ] : NULL;
     793       18576 :                 pNextSlot = pEle ? &pEle->xSlot : NULL;
     794             :             }
     795             :         }
     796             : 
     797        5844 :         if ( !pLinkedSlot )
     798             :         {
     799        5839 :             rOutStm.WriteCharPtr( "0 ," );
     800             :         }
     801             :         else
     802             :         {
     803           5 :             rOutStm.WriteCharPtr( "&a" ).WriteCharPtr( rShellName.getStr() ).WriteCharPtr( "Slots_Impl[" )
     804          15 :                .WriteCharPtr( OString::number(pLinkedSlot->GetListPos()).getStr() )
     805           5 :                .WriteCharPtr( "] /*Offset Linked*/, " ) << endl;
     806           5 :             WriteTab( rOutStm, 4 );
     807             :         }
     808             : 
     809        5844 :         rOutStm.WriteCharPtr( "&a" ).WriteCharPtr( rShellName.getStr() ).WriteCharPtr( "Slots_Impl[" )
     810       17532 :            .WriteCharPtr( OString::number(pNextSlot->GetListPos()).getStr() )
     811        5844 :            .WriteCharPtr( "] /*Offset Next*/, " ) << endl;
     812             : 
     813        5844 :         WriteTab( rOutStm, 4 );
     814             : 
     815             :         // write ExecMethod, with standard name if not specified
     816       11334 :         if( !GetExecMethod().isEmpty() &&
     817        5490 :             GetExecMethod() != "NoExec")
     818             :         {
     819        5483 :             rOutStm.WriteCharPtr( "SFX_STUB_PTR(" ).WriteCharPtr( rShellName.getStr() ).WriteChar( ',' )
     820       10966 :                    .WriteCharPtr( GetExecMethod().getStr() ).WriteChar( ')' );
     821             :         }
     822             :         else
     823         361 :             rOutStm.WriteCharPtr( "SFX_STUB_PTR_EXEC_NONE" );
     824        5844 :         rOutStm.WriteChar( ',' );
     825             : 
     826             :         // write StateMethod, with standard name if not specified
     827       11333 :         if( !GetStateMethod().isEmpty() &&
     828        5489 :             GetStateMethod() != "NoState")
     829             :         {
     830        5166 :             rOutStm.WriteCharPtr( "SFX_STUB_PTR(" ).WriteCharPtr( rShellName.getStr() ).WriteChar( ',' )
     831       10332 :                    .WriteCharPtr( GetStateMethod().getStr() ).WriteChar( ')' );
     832             :         }
     833             :         else
     834         678 :             rOutStm.WriteCharPtr( "SFX_STUB_PTR_STATE_NONE" );
     835             :     }
     836        5912 :     rOutStm.WriteChar( ',' ) << endl;
     837        5912 :     WriteTab( rOutStm, 4 );
     838             : 
     839             :     // write flags
     840        5912 :     if( GetHasCoreId() )
     841           0 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_HasCoreId() ).getStr() ).WriteChar( '|' );
     842        5912 :     if( GetCachable() )
     843        5912 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_Cachable() ).getStr() ).WriteChar( '|' );
     844        5912 :     if( GetVolatile() )
     845           0 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_Volatile() ).getStr() ).WriteChar( '|' );
     846        5912 :     if( GetToggle() )
     847         302 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_Toggle() ).getStr() ).WriteChar( '|' );
     848        5912 :     if( GetAutoUpdate() )
     849        1747 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_AutoUpdate() ).getStr() ).WriteChar( '|' );
     850        5912 :     if( GetSynchron() )
     851        4928 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_Synchron() ).getStr() ).WriteChar( '|' );
     852        5912 :     if( GetAsynchron() )
     853         984 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_Asynchron() ).getStr() ).WriteChar( '|' );
     854        5912 :     if( GetRecordPerItem() )
     855         354 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_RecordPerItem() ).getStr() ).WriteChar( '|' );
     856        5912 :     if( GetRecordPerSet() )
     857        5403 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_RecordPerSet() ).getStr() ).WriteChar( '|' );
     858        5912 :     if( GetRecordManual() )
     859         136 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_RecordManual() ).getStr() ).WriteChar( '|' );
     860        5912 :     if( GetNoRecord() )
     861          19 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_NoRecord() ).getStr() ).WriteChar( '|' );
     862        5912 :     if( GetRecordAbsolute() )
     863           4 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_RecordAbsolute() ).getStr() ).WriteChar( '|' );
     864        5912 :     if( GetHasDialog() )
     865         920 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_HasDialog() ).getStr() ).WriteChar( '|' );
     866        5912 :     if( GetMenuConfig() )
     867        3611 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_MenuConfig() ).getStr() ).WriteChar( '|' );
     868        5912 :     if( GetToolBoxConfig() )
     869        3872 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_ToolBoxConfig() ).getStr() ).WriteChar( '|' );
     870        5912 :     if( GetStatusBarConfig() )
     871          96 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_StatusBarConfig() ).getStr() ).WriteChar( '|' );
     872        5912 :     if( GetAccelConfig() )
     873        3707 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_AccelConfig() ).getStr() ).WriteChar( '|' );
     874        5912 :     if( GetFastCall() )
     875        1032 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_FastCall() ).getStr() ).WriteChar( '|' );
     876        5912 :     if( GetContainer() )
     877         206 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_Container() ).getStr() ).WriteChar( '|' );
     878        5912 :     if ( GetReadOnlyDoc() )
     879        1947 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_ReadOnlyDoc() ).getStr() ).WriteChar( '|' );
     880        5912 :     if( GetImageRotation() )
     881         162 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_ImageRotation() ).getStr() ).WriteChar( '|' );
     882        5912 :     if( GetImageReflection() )
     883         108 :         rOutStm.WriteCharPtr( MakeSlotName( SvHash_ImageReflection() ).getStr() ).WriteChar( '|' );
     884        5912 :     rOutStm.WriteChar( '0' );
     885             : 
     886        5912 :     rOutStm.WriteChar( ',' ) << endl;
     887        5912 :        WriteTab( rOutStm, 4 );
     888        5912 :     if ( GetDisableFlags().isEmpty() )
     889        4915 :         rOutStm.WriteCharPtr( "0" );
     890             :     else
     891         997 :         rOutStm.WriteCharPtr( GetDisableFlags().getStr() );
     892             : 
     893             :     // write attribute type
     894        5912 :     if( !bIsEnumSlot )
     895             :     {
     896        5844 :         rOutStm.WriteChar( ',' ) << endl;
     897        5844 :         WriteTab( rOutStm, 4 );
     898             : 
     899        5844 :         SvMetaType * pT = GetSlotType();
     900        5844 :         if( !pT )
     901             :         {
     902        5352 :             if( !IsVariable() )
     903        2886 :                 pT = rBase.FindType( "SfxVoidItem" );
     904             :             else
     905        2466 :                 pT = GetType();
     906             :         }
     907        5844 :         if( pT )
     908             :         {
     909        5844 :             rOutStm.WriteCharPtr( pT->GetName().getString().getStr() );
     910        5844 :             if( !SvIdlDataBase::FindType( pT, rBase.aUsedTypes ) )
     911         308 :                 rBase.aUsedTypes.push_back( pT );
     912             :         }
     913             :         else
     914           0 :             rOutStm.WriteCharPtr( "SfxVoidItem not defined" );
     915             :     }
     916             :     else
     917             :     {
     918          68 :         SvMetaType *pT = rBase.FindType( "SfxBoolItem" );
     919          68 :         if ( pT && !SvIdlDataBase::FindType( pT, rBase.aUsedTypes ) )
     920           0 :             rBase.aUsedTypes.push_back( pT );
     921             :     }
     922             : 
     923        5912 :     if( !bIsEnumSlot )
     924             :     {
     925        5844 :         rOutStm.WriteChar( ',' ) << endl;
     926        5844 :         WriteTab( rOutStm, 4 );
     927             :         rOutStm
     928       11688 :            .WriteCharPtr( OString::number(nCount).getStr() )
     929        5844 :            .WriteCharPtr( "/*Offset*/, " );
     930             : 
     931        5844 :         if( IsMethod() )
     932             :         {
     933        3398 :             SvMetaAttribute * pMethod = GetMethod();
     934             :             SvMetaType * pType;
     935        3398 :             if( pMethod )
     936          22 :                 pType = pMethod->GetType();
     937             :             else
     938        3376 :                 pType = GetType();
     939        3398 :             sal_uLong nSCount = pType->GetAttrCount();
     940             :             rOutStm
     941        6796 :                .WriteCharPtr( OString::number(nSCount).getStr() )
     942        3398 :                .WriteCharPtr( "/*Count*/," );
     943             :         }
     944             :         else
     945        2446 :             rOutStm.WriteCharPtr( "0," );
     946             : 
     947        5844 :         rOutStm.WriteCharPtr( " " );
     948             : 
     949             :         // Method/Property flags
     950        5844 :         if( IsMethod() )
     951        3398 :             rOutStm.WriteCharPtr( "SFX_SLOT_METHOD|" );
     952        5844 :         if( IsVariable() )
     953             :         {
     954        2468 :             rOutStm.WriteCharPtr( "SFX_SLOT_PROPGET|" );
     955        2468 :             if( !GetReadonly() )
     956        2327 :                 rOutStm.WriteCharPtr( "SFX_SLOT_PROPSET|" );
     957             :         }
     958             : 
     959        5844 :         rOutStm.WriteChar( '0' );
     960             :     }
     961             : 
     962             :     {
     963        5912 :         rOutStm.WriteCharPtr( ",\"" );
     964        5912 :         rOutStm.WriteCharPtr( GetMangleName( false ).getStr() );
     965        5912 :         rOutStm.WriteCharPtr( "\"" );
     966             :     }
     967             : 
     968        5912 :     rOutStm.WriteCharPtr( " )," ) << endl;
     969             : }
     970             : 
     971        5912 : sal_uInt16 SvMetaSlot::WriteSlotParamArray( SvIdlDataBase & rBase, SvStream & rOutStm )
     972             : {
     973        5912 :     if ( !GetExport() && !GetHidden() )
     974           0 :         return 0;
     975             : 
     976        5912 :     SvMetaAttribute * pMethod = GetMethod();
     977        5912 :     if( IsMethod() )
     978             :     {
     979             :         SvMetaType * pType;
     980        3420 :         if( pMethod )
     981          22 :             pType = pMethod->GetType();
     982             :         else
     983        3398 :             pType = GetType();
     984             : 
     985        3420 :         if( !SvIdlDataBase::FindType( pType, rBase.aUsedTypes ) )
     986        1899 :             rBase.aUsedTypes.push_back( pType );
     987             : 
     988             :         const SvMetaAttributeMemberList & rList =
     989        3420 :                     pType->GetAttrList();
     990        5874 :         for( sal_uLong n = 0; n < rList.size(); n++ )
     991             :         {
     992        2454 :             SvMetaAttribute * pPar  = rList[n];
     993        2454 :             SvMetaType * pPType     = pPar->GetType();
     994        2454 :             WriteTab( rOutStm, 1 );
     995        2454 :             rOutStm.WriteCharPtr("{ (const SfxType*) &a")
     996             :                 // item type
     997        4908 :                .WriteCharPtr(pPType->GetName().getString().getStr()).WriteCharPtr("_Impl, ")
     998             :                 // parameter name
     999        4908 :                .WriteCharPtr("\"").WriteCharPtr(pPar->GetName().getString().getStr()).WriteCharPtr("\", ")
    1000             :                 // slot id
    1001        4908 :                .WriteCharPtr(pPar->GetSlotId().getString().getStr()).WriteCharPtr(" },") << endl;
    1002        2454 :             if( !SvIdlDataBase::FindType( pPType, rBase.aUsedTypes ) )
    1003         118 :                 rBase.aUsedTypes.push_back( pPType );
    1004             :         }
    1005        3420 :         return (sal_uInt16)rList.size();
    1006             :     }
    1007        2492 :     return 0;
    1008             : }
    1009             : 
    1010        5912 : sal_uInt16 SvMetaSlot::WriteSlotMap( const OString& rShellName, sal_uInt16 nCount,
    1011             :                                 SvSlotElementList& rSlotList,
    1012             :                                 size_t nStart,
    1013             :                                 SvIdlDataBase & rBase,
    1014             :                                 SvStream & rOutStm )
    1015             : {
    1016             :     // SlotId, if not specified generate from name
    1017        5912 :     OString slotId = GetSlotId().getString();
    1018             : 
    1019        5912 :     sal_uInt16 nSCount = 0;
    1020        5912 :     if( IsMethod() )
    1021             :     {
    1022             :         SvMetaType * pType;
    1023        3420 :         SvMetaAttribute * pMethod = GetMethod();
    1024        3420 :         if( pMethod )
    1025          22 :             pType = pMethod->GetType();
    1026             :         else
    1027        3398 :             pType = GetType();
    1028             : 
    1029        3420 :         nSCount = (sal_uInt16)pType->GetAttrCount();
    1030             :     }
    1031             : 
    1032        5912 :     WriteSlot( rShellName, nCount, slotId, rSlotList, nStart, rBase, rOutStm );
    1033        5912 :     return nSCount;
    1034             : }
    1035             : 
    1036             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10