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

Generated by: LCOV version 1.10