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

Generated by: LCOV version 1.10