LCOV - code coverage report
Current view: top level - basic/source/sbx - sbxvar.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 129 326 39.6 %
Date: 2015-06-13 12:38:46 Functions: 32 49 65.3 %
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 <config_features.h>
      21             : 
      22             : #include <tools/debug.hxx>
      23             : #include <tools/stream.hxx>
      24             : #include <svl/SfxBroadcaster.hxx>
      25             : 
      26             : #include <basic/sbx.hxx>
      27             : #include "runtime.hxx"
      28             : #include "sbxres.hxx"
      29             : #include "sbxconv.hxx"
      30             : #include "sbunoobj.hxx"
      31             : #include <math.h>
      32             : #include <ctype.h>
      33             : 
      34             : #include <com/sun/star/uno/XInterface.hpp>
      35             : using namespace com::sun::star::uno;
      36             : 
      37             : ///////////////////////////// SbxVariable
      38             : 
      39      525534 : TYPEINIT1(SbxVariable,SbxValue)
      40             : 
      41             : ///////////////////////////// SbxVariableImpl
      42             : 
      43         270 : class SbxVariableImpl
      44             : {
      45             :     friend class SbxVariable;
      46             :     OUString                    m_aDeclareClassName;
      47             :     Reference< XInterface >     m_xComListener;
      48             :     StarBASIC*                  m_pComListenerParentBasic;
      49             : 
      50         135 :     SbxVariableImpl()
      51         135 :         : m_pComListenerParentBasic( NULL )
      52         135 :     {}
      53         135 :     SbxVariableImpl( const SbxVariableImpl& r )
      54             :         : m_aDeclareClassName( r.m_aDeclareClassName )
      55             :         , m_xComListener( r.m_xComListener )
      56         135 :         , m_pComListenerParentBasic( r.m_pComListenerParentBasic )
      57             :     {
      58         135 :     }
      59             : };
      60             : 
      61             : 
      62             : ///////////////////////////// Constructors
      63             : 
      64        7134 : SbxVariable::SbxVariable() : SbxValue()
      65             : {
      66        7134 :     mpSbxVariableImpl = NULL;
      67        7134 :     pCst = NULL;
      68        7134 :     pParent = NULL;
      69        7134 :     nUserData = 0;
      70        7134 :     nHash = 0;
      71        7134 : }
      72             : 
      73        8309 : SbxVariable::SbxVariable( const SbxVariable& r )
      74             :     : SvRefBase( r ),
      75             :       SbxValue( r ),
      76             :       mpPar( r.mpPar ),
      77        8309 :       pInfo( r.pInfo )
      78             : {
      79        8309 :     mpSbxVariableImpl = NULL;
      80        8309 :     if( r.mpSbxVariableImpl != NULL )
      81             :     {
      82           0 :         mpSbxVariableImpl = new SbxVariableImpl( *r.mpSbxVariableImpl );
      83             : #if HAVE_FEATURE_SCRIPTING
      84           0 :         if( mpSbxVariableImpl->m_xComListener.is() )
      85             :         {
      86           0 :             registerComListenerVariableForBasic( this, mpSbxVariableImpl->m_pComListenerParentBasic );
      87             :         }
      88             : #endif
      89             :     }
      90        8309 :     pCst = NULL;
      91        8309 :     if( r.CanRead() )
      92             :     {
      93        8309 :         pParent = r.pParent;
      94        8309 :         nUserData = r.nUserData;
      95        8309 :         maName = r.maName;
      96        8309 :         nHash = r.nHash;
      97             :     }
      98             :     else
      99             :     {
     100           0 :         pParent = NULL;
     101           0 :         nUserData = 0;
     102           0 :         nHash = 0;
     103             :     }
     104        8309 : }
     105             : 
     106      141230 : SbxVariable::SbxVariable( SbxDataType t, void* p ) : SbxValue( t, p )
     107             : {
     108      141230 :     mpSbxVariableImpl = NULL;
     109      141230 :     pCst = NULL;
     110      141230 :     pParent = NULL;
     111      141230 :     nUserData = 0;
     112      141230 :     nHash = 0;
     113      141230 : }
     114             : 
     115      327566 : SbxVariable::~SbxVariable()
     116             : {
     117             : #if HAVE_FEATURE_SCRIPTING
     118      147512 :     if( IsSet( SBX_DIM_AS_NEW ))
     119             :     {
     120           1 :         removeDimAsNewRecoverItem( this );
     121             :     }
     122             : #endif
     123      147512 :     delete mpSbxVariableImpl;
     124      147512 :     delete pCst;
     125      180054 : }
     126             : 
     127             : ////////////////////////////// Broadcasting
     128             : 
     129      239433 : SfxBroadcaster& SbxVariable::GetBroadcaster()
     130             : {
     131      239433 :     if( !pCst )
     132             :     {
     133      123581 :         pCst = new SfxBroadcaster;
     134             :     }
     135      239433 :     return *pCst;
     136             : }
     137             : 
     138       12241 : SbxArray* SbxVariable::GetParameters() const
     139             : {
     140       12241 :     return mpPar;
     141             : }
     142             : 
     143             : 
     144             : // Perhaps some day one could cut the parameter 0.
     145             : // then the copying will be dropped ...
     146             : 
     147      328139 : void SbxVariable::Broadcast( sal_uIntPtr nHintId )
     148             : {
     149      328139 :     if( pCst && !IsSet( SBX_NO_BROADCAST ) )
     150             :     {
     151             :         // Because the method could be called from outside, check the
     152             :         // rights here again
     153       95777 :         if( nHintId & SBX_HINT_DATAWANTED )
     154             :         {
     155       93731 :             if( !CanRead() )
     156             :             {
     157           0 :                 return;
     158             :             }
     159             :         }
     160       95777 :         if( nHintId & SBX_HINT_DATACHANGED )
     161             :         {
     162        2045 :             if( !CanWrite() )
     163             :             {
     164           0 :                 return;
     165             :             }
     166             :         }
     167             : 
     168             :         //fdo#86843 Add a ref during the following block to guard against
     169             :         //getting deleted before completing this method
     170       95777 :         SbxVariableRef aBroadcastGuard(this);
     171             : 
     172             :         // Avoid further broadcasting
     173       95777 :         SfxBroadcaster* pSave = pCst;
     174       95777 :         pCst = NULL;
     175       95777 :         SbxFlagBits nSaveFlags = GetFlags();
     176       95777 :         SetFlag( SBX_READWRITE );
     177       95777 :         if( mpPar.Is() )
     178             :         {
     179             :             // Register this as element 0, but don't change over the parent!
     180        2796 :             mpPar->GetRef( 0 ) = this;
     181             :         }
     182       95777 :         pSave->Broadcast( SbxHint( nHintId, this ) );
     183       95777 :         delete pCst; // who knows already, onto which thoughts someone comes?
     184       95777 :         pCst = pSave;
     185       95777 :         SetFlags( nSaveFlags );
     186             :     }
     187             : }
     188             : 
     189           1 : SbxInfo* SbxVariable::GetInfo()
     190             : {
     191           1 :     if( !pInfo )
     192             :     {
     193           1 :         Broadcast( SBX_HINT_INFOWANTED );
     194           1 :         if( pInfo.Is() )
     195             :         {
     196           1 :             SetModified( true );
     197             :         }
     198             :     }
     199           1 :     return pInfo;
     200             : }
     201             : 
     202         420 : void SbxVariable::SetInfo( SbxInfo* p )
     203             : {
     204         420 :     pInfo = p;
     205         420 : }
     206             : 
     207       32829 : void SbxVariable::SetParameters( SbxArray* p )
     208             : {
     209       32829 :     mpPar = p;
     210       32829 : }
     211             : 
     212             : 
     213             : /////////////////////////// Name of the variables
     214             : 
     215      139166 : void SbxVariable::SetName( const OUString& rName )
     216             : {
     217      139166 :     maName = rName;
     218      139166 :     nHash = MakeHashCode( rName );
     219      139166 : }
     220             : 
     221      395082 : const OUString& SbxVariable::GetName( SbxNameType t ) const
     222             : {
     223             :     static const char cSuffixes[] = "  %&!#@ $";
     224      395082 :     if( t == SbxNAME_NONE )
     225             :     {
     226      395082 :         return maName;
     227             :     }
     228             :     // Request parameter-information (not for objects)
     229           0 :     const_cast<SbxVariable*>(this)->GetInfo();
     230             :     // Append nothing, if it is a simple property (no empty brackets)
     231           0 :     if( !pInfo || ( pInfo->aParams.empty() && GetClass() == SbxCLASS_PROPERTY ))
     232             :     {
     233           0 :         return maName;
     234             :     }
     235           0 :     sal_Unicode cType = ' ';
     236           0 :     OUString aTmp( maName );
     237             :     // short type? Then fetch it, possible this is 0.
     238           0 :     SbxDataType et = GetType();
     239           0 :     if( t == SbxNAME_SHORT_TYPES )
     240             :     {
     241           0 :         if( et <= SbxSTRING )
     242             :         {
     243           0 :             cType = cSuffixes[ et ];
     244             :         }
     245           0 :         if( cType != ' ' )
     246             :         {
     247           0 :             aTmp += OUString(sal_Unicode(cType));
     248             :         }
     249             :     }
     250           0 :     aTmp += "(";
     251             : 
     252           0 :     for(SbxParams::const_iterator i = pInfo->aParams.begin(); i != pInfo->aParams.end(); ++i)
     253             :     {
     254           0 :         int nt = i->eType & 0x0FFF;
     255           0 :         if( i != pInfo->aParams.begin() )
     256             :         {
     257           0 :             aTmp += ",";
     258             :         }
     259           0 :         if( (i->nFlags & SBX_OPTIONAL) != SBX_NONE )
     260             :         {
     261           0 :             aTmp += OUString( SbxRes( STRING_OPTIONAL ) );
     262             :         }
     263           0 :         if( i->eType & SbxBYREF )
     264             :         {
     265           0 :             aTmp += OUString( SbxRes( STRING_BYREF ) );
     266             :         }
     267           0 :         aTmp += i->aName;
     268           0 :         cType = ' ';
     269             :         // short type? Then fetch it, possible this is 0.
     270           0 :         if( t == SbxNAME_SHORT_TYPES )
     271             :         {
     272           0 :             if( nt <= SbxSTRING )
     273             :             {
     274           0 :                 cType = cSuffixes[ nt ];
     275             :             }
     276             :         }
     277           0 :         if( cType != ' ' )
     278             :         {
     279           0 :             aTmp += OUString((sal_Unicode)cType);
     280           0 :             if( i->eType & SbxARRAY )
     281             :             {
     282           0 :                 aTmp += "()";
     283             :             }
     284             :         }
     285             :         else
     286             :         {
     287           0 :             if( i->eType & SbxARRAY )
     288             :             {
     289           0 :                 aTmp += "()";
     290             :             }
     291             :             // long type?
     292           0 :             if( t != SbxNAME_SHORT )
     293             :             {
     294           0 :                 aTmp += OUString( SbxRes( STRING_AS ) );
     295           0 :                 if( nt < 32 )
     296             :                 {
     297           0 :                     aTmp += OUString( SbxRes( sal::static_int_cast< sal_uInt16 >( STRING_TYPES + nt ) ) );
     298             :                 }
     299             :                 else
     300             :                 {
     301           0 :                     aTmp += OUString( SbxRes( STRING_ANY ) );
     302             :                 }
     303             :             }
     304             :         }
     305             :     }
     306           0 :     aTmp += ")";
     307             :     // Long type? Then fetch it
     308           0 :     if( t == SbxNAME_LONG_TYPES && et != SbxEMPTY )
     309             :     {
     310           0 :         aTmp += OUString( SbxRes( STRING_AS ) );
     311           0 :         if( et < 32 )
     312             :         {
     313           0 :             aTmp += OUString( SbxRes( sal::static_int_cast< sal_uInt16 >( STRING_TYPES + et ) ) );
     314             :         }
     315             :         else
     316             :         {
     317           0 :             aTmp += OUString( SbxRes( STRING_ANY ) );
     318             :         }
     319             :     }
     320           0 :     const_cast<SbxVariable*>(this)->aToolString = aTmp;
     321           0 :     return aToolString;
     322             : }
     323             : 
     324             : // Create a simple hashcode: the first six characters were evaluated.
     325             : 
     326     2284838 : sal_uInt16 SbxVariable::MakeHashCode( const OUString& rName )
     327             : {
     328     2284838 :     sal_uInt16 n = 0;
     329     2284838 :     sal_Int32 i = 0;
     330     2284838 :     sal_uInt16 nLen = rName.getLength();
     331     2284838 :     if( nLen > 6 )
     332             :     {
     333     1999965 :         nLen = 6;
     334             :     }
     335    17982476 :      while( nLen-- )
     336             :     {
     337    13412800 :         sal_uInt8 c = (sal_uInt8)rName[i++];
     338             :         // If we have a commen sigen break!!
     339    13412800 :         if( c >= 0x80 )
     340             :         {
     341           0 :             return 0;
     342             :         }
     343    13412800 :         n = sal::static_int_cast< sal_uInt16 >( ( n << 3 ) + toupper( c ) );
     344             :     }
     345     2284838 :     return n;
     346             : }
     347             : 
     348             : ////////////////////////////// Operators
     349             : 
     350        5864 : SbxVariable& SbxVariable::operator=( const SbxVariable& r )
     351             : {
     352        5864 :     SbxValue::operator=( r );
     353        5864 :     delete mpSbxVariableImpl;
     354        5864 :     if( r.mpSbxVariableImpl != NULL )
     355             :     {
     356         135 :         mpSbxVariableImpl = new SbxVariableImpl( *r.mpSbxVariableImpl );
     357             : #if HAVE_FEATURE_SCRIPTING
     358         135 :         if( mpSbxVariableImpl->m_xComListener.is() )
     359             :         {
     360           0 :             registerComListenerVariableForBasic( this, mpSbxVariableImpl->m_pComListenerParentBasic );
     361             :         }
     362             : #endif
     363             :     }
     364             :     else
     365             :     {
     366        5729 :         mpSbxVariableImpl = NULL;
     367             :     }
     368        5864 :     return *this;
     369             : }
     370             : 
     371             : //////////////////////////////// Conversion
     372             : 
     373      142882 : SbxDataType SbxVariable::GetType() const
     374             : {
     375      142882 :     if( aData.eType == SbxOBJECT )
     376             :     {
     377       14627 :         return aData.pObj ? aData.pObj->GetType() : SbxOBJECT;
     378             :     }
     379      128255 :     else if( aData.eType == SbxVARIANT )
     380             :     {
     381           0 :         return aData.pObj ? aData.pObj->GetType() : SbxVARIANT;
     382             :     }
     383             :     else
     384             :     {
     385      128255 :         return aData.eType;
     386             :     }
     387             : }
     388             : 
     389           9 : SbxClassType SbxVariable::GetClass() const
     390             : {
     391           9 :     return SbxCLASS_VARIABLE;
     392             : }
     393             : 
     394      220774 : void SbxVariable::SetModified( bool b )
     395             : {
     396      220774 :     if( IsSet( SBX_NO_MODIFY ) )
     397             :     {
     398      225226 :         return;
     399             :     }
     400      216322 :     SbxBase::SetModified( b );
     401      216322 :     if( pParent && pParent != this ) //??? HotFix: Recursion out here MM
     402             :     {
     403        9811 :         pParent->SetModified( b );
     404             :     }
     405             : }
     406             : 
     407      187478 : void SbxVariable::SetParent( SbxObject* p )
     408             : {
     409             : #ifdef DBG_UTIL
     410             :     // Will the parent of a SbxObject be set?
     411             :     if ( p && ISA(SbxObject) )
     412             :     {
     413             :         // then this had to be a child of the new parent
     414             :         bool bFound = false;
     415             :         SbxArray *pChildren = p->GetObjects();
     416             :         if ( pChildren )
     417             :         {
     418             :             for ( sal_uInt16 nIdx = 0; !bFound && nIdx < pChildren->Count(); ++nIdx )
     419             :             {
     420             :                 bFound = ( this == pChildren->Get(nIdx) );
     421             :             }
     422             :         }
     423             :         SAL_INFO_IF(
     424             :             !bFound, "basic.sbx",
     425             :             "dangling: [" << GetName() << "].SetParent([" << p->GetName()
     426             :                 << "])");
     427             :     }
     428             : #endif
     429             : 
     430      187478 :     pParent = p;
     431      187478 : }
     432             : 
     433         135 : SbxVariableImpl* SbxVariable::getImpl()
     434             : {
     435         135 :     if( mpSbxVariableImpl == NULL )
     436             :     {
     437         135 :         mpSbxVariableImpl = new SbxVariableImpl();
     438             :     }
     439         135 :     return mpSbxVariableImpl;
     440             : }
     441             : 
     442           0 : const OUString& SbxVariable::GetDeclareClassName()
     443             : {
     444           0 :     SbxVariableImpl* pImpl = getImpl();
     445           0 :     return pImpl->m_aDeclareClassName;
     446             : }
     447             : 
     448         135 : void SbxVariable::SetDeclareClassName( const OUString& rDeclareClassName )
     449             : {
     450         135 :     SbxVariableImpl* pImpl = getImpl();
     451         135 :     pImpl->m_aDeclareClassName = rDeclareClassName;
     452         135 : }
     453             : 
     454           0 : void SbxVariable::SetComListener( ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xComListener,
     455             :                                   StarBASIC* pParentBasic )
     456             : {
     457           0 :     SbxVariableImpl* pImpl = getImpl();
     458           0 :     pImpl->m_xComListener = xComListener;
     459           0 :     pImpl->m_pComListenerParentBasic = pParentBasic;
     460             : #if HAVE_FEATURE_SCRIPTING
     461           0 :     registerComListenerVariableForBasic( this, pParentBasic );
     462             : #endif
     463           0 : }
     464             : 
     465           0 : void SbxVariable::ClearComListener()
     466             : {
     467           0 :     SbxVariableImpl* pImpl = getImpl();
     468           0 :     pImpl->m_xComListener.clear();
     469           0 : }
     470             : 
     471             : 
     472             : ////////////////////////////// Loading/Saving
     473             : 
     474           0 : bool SbxVariable::LoadData( SvStream& rStrm, sal_uInt16 nVer )
     475             : {
     476             :     sal_uInt16 nType;
     477             :     sal_uInt8 cMark;
     478           0 :     rStrm.ReadUChar( cMark );
     479           0 :     if( cMark == 0xFF )
     480             :     {
     481           0 :         if( !SbxValue::LoadData( rStrm, nVer ) )
     482             :         {
     483           0 :             return false;
     484             :         }
     485           0 :         maName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     486           0 :                                                                 RTL_TEXTENCODING_ASCII_US);
     487             :         sal_uInt32 nTemp;
     488           0 :         rStrm.ReadUInt32( nTemp );
     489           0 :         nUserData = nTemp;
     490             :     }
     491             :     else
     492             :     {
     493           0 :         rStrm.SeekRel( -1L );
     494           0 :         rStrm.ReadUInt16( nType );
     495           0 :         maName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     496           0 :                                                                 RTL_TEXTENCODING_ASCII_US);
     497             :         sal_uInt32 nTemp;
     498           0 :         rStrm.ReadUInt32( nTemp );
     499           0 :         nUserData = nTemp;
     500             :         // correction: old methods have instead of SbxNULL now SbxEMPTY
     501           0 :         if( nType == SbxNULL && GetClass() == SbxCLASS_METHOD )
     502             :         {
     503           0 :             nType = SbxEMPTY;
     504             :         }
     505           0 :         SbxValues aTmp;
     506           0 :         OUString aTmpString;
     507           0 :         OUString aVal;
     508           0 :         aTmp.eType = aData.eType = (SbxDataType) nType;
     509           0 :         aTmp.pOUString = &aVal;
     510           0 :         switch( nType )
     511             :         {
     512             :         case SbxBOOL:
     513             :         case SbxERROR:
     514             :         case SbxINTEGER:
     515           0 :             rStrm.ReadInt16( aTmp.nInteger ); break;
     516             :         case SbxLONG:
     517           0 :             rStrm.ReadInt32( aTmp.nLong ); break;
     518             :         case SbxSINGLE:
     519             :         {
     520             :             // Floats as ASCII
     521           0 :             aTmpString = read_uInt16_lenPrefixed_uInt8s_ToOUString(
     522           0 :                     rStrm, RTL_TEXTENCODING_ASCII_US);
     523             :             double d;
     524             :             SbxDataType t;
     525           0 :             if( ImpScan( aTmpString, d, t, NULL ) != SbxERR_OK || t == SbxDOUBLE )
     526             :             {
     527           0 :                 aTmp.nSingle = 0;
     528           0 :                 return false;
     529             :             }
     530           0 :             aTmp.nSingle = (float) d;
     531           0 :             break;
     532             :         }
     533             :         case SbxDATE:
     534             :         case SbxDOUBLE:
     535             :         {
     536             :             // Floats as ASCII
     537           0 :             aTmpString = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     538           0 :                                                                         RTL_TEXTENCODING_ASCII_US);
     539             :             SbxDataType t;
     540           0 :             if( ImpScan( aTmpString, aTmp.nDouble, t, NULL ) != SbxERR_OK )
     541             :             {
     542           0 :                 aTmp.nDouble = 0;
     543           0 :                 return false;
     544             :             }
     545           0 :             break;
     546             :         }
     547             :         case SbxSTRING:
     548           0 :             aVal = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     549           0 :                                                                   RTL_TEXTENCODING_ASCII_US);
     550           0 :             break;
     551             :         case SbxEMPTY:
     552             :         case SbxNULL:
     553           0 :             break;
     554             :         default:
     555           0 :             aData.eType = SbxNULL;
     556             :             DBG_ASSERT( false, "Loaded a non-supported data type" );
     557           0 :             return false;
     558             :         }
     559             :         // putt value
     560           0 :         if( nType != SbxNULL && nType != SbxEMPTY && !Put( aTmp ) )
     561             :         {
     562           0 :             return false;
     563           0 :         }
     564             :     }
     565           0 :     rStrm.ReadUChar( cMark );
     566             :     // cMark is also a version number!
     567             :     // 1: initial version
     568             :     // 2: with nUserData
     569           0 :     if( cMark )
     570             :     {
     571           0 :         if( cMark > 2 )
     572             :         {
     573           0 :             return false;
     574             :         }
     575           0 :         pInfo = new SbxInfo;
     576           0 :         pInfo->LoadData( rStrm, (sal_uInt16) cMark );
     577             :     }
     578             :     // Load private data only, if it is a SbxVariable
     579           0 :     if( GetClass() == SbxCLASS_VARIABLE && !LoadPrivateData( rStrm, nVer ) )
     580             :     {
     581           0 :         return false;
     582             :     }
     583           0 :     Broadcast( SBX_HINT_DATACHANGED );
     584           0 :     nHash =  MakeHashCode( maName );
     585           0 :     SetModified( true );
     586           0 :     return true;
     587             : }
     588             : 
     589           0 : bool SbxVariable::StoreData( SvStream& rStrm ) const
     590             : {
     591           0 :     rStrm.WriteUChar( 0xFF );      // Marker
     592             :     bool bValStore;
     593           0 :     if( this->IsA( TYPE(SbxMethod) ) )
     594             :     {
     595             :         // #50200 Avoid that objects , which during the runtime
     596             :         // as return-value are saved in the method as a value were saved
     597           0 :         SbxVariable* pThis = const_cast<SbxVariable*>(this);
     598           0 :         SbxFlagBits nSaveFlags = GetFlags();
     599           0 :         pThis->SetFlag( SBX_WRITE );
     600           0 :         pThis->SbxValue::Clear();
     601           0 :         pThis->SetFlags( nSaveFlags );
     602             : 
     603             :         // So that the method will not be executed in any case!
     604             :         // CAST, to avoid const!
     605           0 :         pThis->SetFlag( SBX_NO_BROADCAST );
     606           0 :         bValStore = SbxValue::StoreData( rStrm );
     607           0 :         pThis->ResetFlag( SBX_NO_BROADCAST );
     608             :     }
     609             :     else
     610             :     {
     611           0 :         bValStore = SbxValue::StoreData( rStrm );
     612             :     }
     613           0 :     if( !bValStore )
     614             :     {
     615           0 :         return false;
     616             :     }
     617             :     write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, maName,
     618           0 :                                                       RTL_TEXTENCODING_ASCII_US);
     619           0 :     rStrm.WriteUInt32( nUserData );
     620           0 :     if( pInfo.Is() )
     621             :     {
     622           0 :         rStrm.WriteUChar( 2 );     // Version 2: with UserData!
     623           0 :         pInfo->StoreData( rStrm );
     624             :     }
     625             :     else
     626             :     {
     627           0 :         rStrm.WriteUChar( 0 );
     628             :     }
     629             :     // Save private data only, if it is a SbxVariable
     630           0 :     if( GetClass() == SbxCLASS_VARIABLE )
     631             :     {
     632           0 :         return StorePrivateData( rStrm );
     633             :     }
     634             :     else
     635             :     {
     636           0 :         return true;
     637             :     }
     638             : }
     639             : 
     640             : ////////////////////////////// SbxInfo
     641             : 
     642          59 : SbxInfo::SbxInfo() : aHelpFile(), nHelpId( 0 ), aParams()
     643          59 : {}
     644             : 
     645         419 : SbxInfo::SbxInfo( const OUString& r, sal_uInt32 n )
     646         419 :        : aHelpFile( r ), nHelpId( n ), aParams()
     647         419 : {}
     648             : 
     649             : ////////////////////////////// SbxAlias
     650             : 
     651           0 : SbxAlias::SbxAlias( const SbxAlias& r )
     652             :         : SvRefBase( r ), SbxVariable( r ),
     653           0 :           SfxListener( r ), xAlias( r.xAlias )
     654           0 : {}
     655             : 
     656           0 : SbxAlias& SbxAlias::operator=( const SbxAlias& r )
     657             : {
     658           0 :     xAlias = r.xAlias;
     659           0 :     return *this;
     660             : }
     661             : 
     662           0 : SbxAlias::~SbxAlias()
     663             : {
     664           0 :     if( xAlias.Is() )
     665             :     {
     666           0 :         EndListening( xAlias->GetBroadcaster() );
     667             :     }
     668           0 : }
     669             : 
     670           0 : void SbxAlias::Broadcast( sal_uIntPtr nHt )
     671             : {
     672           0 :     if( xAlias.Is() )
     673             :     {
     674           0 :         xAlias->SetParameters( GetParameters() );
     675           0 :         if( nHt == SBX_HINT_DATAWANTED )
     676             :         {
     677           0 :             SbxVariable::operator=( *xAlias );
     678             :         }
     679           0 :         else if( nHt == SBX_HINT_DATACHANGED || nHt == SBX_HINT_CONVERTED )
     680             :         {
     681           0 :             *xAlias = *this;
     682             :         }
     683           0 :         else if( nHt == SBX_HINT_INFOWANTED )
     684             :         {
     685           0 :             xAlias->Broadcast( nHt );
     686           0 :             pInfo = xAlias->GetInfo();
     687             :         }
     688             :     }
     689           0 : }
     690             : 
     691           0 : void SbxAlias::SFX_NOTIFY( SfxBroadcaster&, const TypeId&,
     692             :                            const SfxHint& rHint, const TypeId& )
     693             : {
     694           0 :     const SbxHint* p = dynamic_cast<const SbxHint*>(&rHint);
     695           0 :     if( p && p->GetId() == SBX_HINT_DYING )
     696             :     {
     697           0 :         xAlias.Clear();
     698             :         // delete the alias?
     699           0 :         if( pParent )
     700             :         {
     701           0 :             pParent->Remove( this );
     702             :         }
     703             :     }
     704           0 : }
     705             : 
     706           0 : void SbxVariable::Dump( SvStream& rStrm, bool bFill )
     707             : {
     708           0 :     OString aBNameStr(OUStringToOString(GetName( SbxNAME_SHORT_TYPES ), RTL_TEXTENCODING_ASCII_US));
     709           0 :     rStrm.WriteCharPtr( "Variable( " )
     710           0 :          .WriteCharPtr( OString::number(reinterpret_cast<sal_Int64>(this)).getStr() ).WriteCharPtr( "==" )
     711           0 :          .WriteCharPtr( aBNameStr.getStr() );
     712           0 :     OString aBParentNameStr(OUStringToOString(GetParent()->GetName(), RTL_TEXTENCODING_ASCII_US));
     713           0 :     if ( GetParent() )
     714             :     {
     715           0 :         rStrm.WriteCharPtr( " in parent '" ).WriteCharPtr( aBParentNameStr.getStr() ).WriteCharPtr( "'" );
     716             :     }
     717             :     else
     718             :     {
     719           0 :         rStrm.WriteCharPtr( " no parent" );
     720             :     }
     721           0 :     rStrm.WriteCharPtr( " ) " );
     722             : 
     723             :     // output also the object at object-vars
     724           0 :     if ( GetValues_Impl().eType == SbxOBJECT &&
     725           0 :             GetValues_Impl().pObj &&
     726           0 :             GetValues_Impl().pObj != this &&
     727           0 :             GetValues_Impl().pObj != GetParent() )
     728             :     {
     729           0 :         rStrm.WriteCharPtr( " contains " );
     730           0 :         static_cast<SbxObject*>(GetValues_Impl().pObj)->Dump( rStrm, bFill );
     731             :     }
     732             :     else
     733             :     {
     734           0 :         rStrm << endl;
     735           0 :     }
     736           0 : }
     737             : 
     738             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11