LCOV - code coverage report
Current view: top level - basic/source/sbx - sbxbase.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 69 195 35.4 %
Date: 2015-06-13 12:38:46 Functions: 20 46 43.5 %
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/debug.hxx>
      21             : #include <tools/stream.hxx>
      22             : #include <vcl/svapp.hxx>
      23             : 
      24             : #include <basic/sbx.hxx>
      25             : #include <basic/sbxfac.hxx>
      26             : #include "sbxbase.hxx"
      27             : 
      28             : #include <rtl/instance.hxx>
      29             : #include <rtl/ustring.hxx>
      30             : 
      31             : // AppData-Structure for SBX:
      32             : 
      33      461974 : TYPEINIT0(SbxBase)
      34             : 
      35         245 : SbxAppData::SbxAppData()
      36             :     : eSbxError(SbxERR_OK)
      37             :     , pBasicFormater(0)
      38         245 :     , eBasicFormaterLangType(LANGUAGE_DONTKNOW)
      39             : {
      40         245 : }
      41             : 
      42         312 : SbxAppData::~SbxAppData()
      43             : {
      44         156 :     SolarMutexGuard g;
      45             : 
      46         156 :     delete pBasicFormater;
      47         156 :     aFacs.clear();
      48         156 : }
      49             : 
      50      275385 : SbxBase::SbxBase()
      51             : {
      52      275385 :     nFlags  = SBX_READWRITE;
      53      275385 : }
      54             : 
      55       11660 : SbxBase::SbxBase( const SbxBase& r )
      56       11660 :     : SvRefBase( r )
      57             : {
      58       11660 :     nFlags  = r.nFlags;
      59       11660 : }
      60             : 
      61      270120 : SbxBase::~SbxBase()
      62             : {
      63      270120 : }
      64             : 
      65           0 : SbxBase& SbxBase::operator=( const SbxBase& r )
      66             : {
      67           0 :     nFlags = r.nFlags;
      68           0 :     return *this;
      69             : }
      70             : 
      71           0 : SbxDataType SbxBase::GetType() const
      72             : {
      73           0 :     return SbxEMPTY;
      74             : }
      75             : 
      76           0 : SbxClassType SbxBase::GetClass() const
      77             : {
      78           0 :     return SbxCLASS_DONTCARE;
      79             : }
      80             : 
      81           0 : void SbxBase::Clear()
      82             : {
      83           0 : }
      84             : 
      85           0 : bool SbxBase::IsFixed() const
      86             : {
      87           0 :     return IsSet( SBX_FIXED );
      88             : }
      89             : 
      90      267344 : void SbxBase::SetModified( bool b )
      91             : {
      92      267344 :     if( IsSet( SBX_NO_MODIFY ) )
      93      269492 :         return;
      94      265196 :     if( b )
      95      219462 :         SetFlag( SBX_MODIFIED );
      96             :     else
      97       45734 :         ResetFlag( SBX_MODIFIED );
      98             : }
      99             : 
     100      244309 : SbxError SbxBase::GetError()
     101             : {
     102      244309 :     return GetSbxData_Impl().eSbxError;
     103             : }
     104             : 
     105          19 : void SbxBase::SetError( SbxError e )
     106             : {
     107          19 :     SbxAppData& r = GetSbxData_Impl();
     108          19 :     if( e && r.eSbxError == SbxERR_OK )
     109          19 :         r.eSbxError = e;
     110          19 : }
     111             : 
     112      192846 : bool SbxBase::IsError()
     113             : {
     114      192846 :     return GetSbxData_Impl().eSbxError != SbxERR_OK;
     115             : }
     116             : 
     117        2405 : void SbxBase::ResetError()
     118             : {
     119        2405 :     GetSbxData_Impl().eSbxError = SbxERR_OK;
     120        2405 : }
     121             : 
     122        4082 : void SbxBase::AddFactory( SbxFactory* pFac )
     123             : {
     124        4082 :     SbxAppData& r = GetSbxData_Impl();
     125             : 
     126             :     // From 1996-03-06: take the HandleLast-Flag into account
     127        4082 :     sal_uInt16 nPos = r.aFacs.size(); // Insert position
     128        4082 :     if( !pFac->IsHandleLast() )         // Only if not self HandleLast
     129             :     {
     130             :         // Rank new factory in front of factories with HandleLast
     131       12097 :         while( nPos > 0 &&
     132        3933 :                 r.aFacs[ nPos-1 ].IsHandleLast() )
     133           0 :             nPos--;
     134             :     }
     135        4082 :     r.aFacs.insert( r.aFacs.begin() + nPos, pFac );
     136        4082 : }
     137             : 
     138        3035 : void SbxBase::RemoveFactory( SbxFactory* pFac )
     139             : {
     140        3035 :     SbxAppData& r = GetSbxData_Impl();
     141       39282 :     for(SbxFacs::iterator it = r.aFacs.begin(); it != r.aFacs.end(); ++it)
     142             :     {
     143       39282 :         if( &(*it) == pFac )
     144             :         {
     145        3035 :             r.aFacs.release( it ).release(); break;
     146             :         }
     147             :     }
     148        3035 : }
     149             : 
     150             : 
     151           0 : SbxBase* SbxBase::Create( sal_uInt16 nSbxId, sal_uInt32 nCreator )
     152             : {
     153             :     // #91626: Hack to skip old Basic dialogs
     154             :     // Problem: There does not exist a factory any more,
     155             :     // so we have to create a dummy SbxVariable instead
     156           0 :     if( nSbxId == 0x65 )    // Dialog Id
     157           0 :         return new SbxVariable;
     158             : 
     159           0 :     OUString aEmptyStr;
     160           0 :     if( nCreator == SBXCR_SBX )
     161           0 :       switch( nSbxId )
     162             :     {
     163           0 :         case SBXID_VALUE:       return new SbxValue;
     164           0 :         case SBXID_VARIABLE:    return new SbxVariable;
     165           0 :         case SBXID_ARRAY:       return new SbxArray;
     166           0 :         case SBXID_DIMARRAY:    return new SbxDimArray;
     167           0 :         case SBXID_OBJECT:      return new SbxObject( aEmptyStr );
     168           0 :         case SBXID_COLLECTION:  return new SbxCollection( aEmptyStr );
     169             :         case SBXID_FIXCOLLECTION:
     170           0 :                                 return new SbxStdCollection( aEmptyStr, aEmptyStr );
     171           0 :         case SBXID_METHOD:      return new SbxMethod( aEmptyStr, SbxEMPTY );
     172           0 :         case SBXID_PROPERTY:    return new SbxProperty( aEmptyStr, SbxEMPTY );
     173             :     }
     174             :     // Unknown type: go over the factories!
     175           0 :     SbxAppData& r = GetSbxData_Impl();
     176           0 :     SbxBase* pNew = NULL;
     177           0 :     for( SbxFactory& rFac : r.aFacs )
     178             :     {
     179           0 :         pNew = rFac.Create( nSbxId, nCreator );
     180           0 :         if( pNew )
     181           0 :             break;
     182             :     }
     183             :     SAL_WARN_IF(!pNew, "basic", "No factory for SBX ID " << nSbxId);
     184           0 :     return pNew;
     185             : }
     186             : 
     187          20 : SbxObject* SbxBase::CreateObject( const OUString& rClass )
     188             : {
     189          20 :     SbxAppData& r = GetSbxData_Impl();
     190          20 :     SbxObject* pNew = NULL;
     191         120 :     for( SbxFactory& rFac : r.aFacs )
     192             :     {
     193         120 :         pNew = rFac.CreateObject( rClass );
     194         120 :         if( pNew )
     195          20 :             break;
     196             :     }
     197             :     SAL_WARN_IF(!pNew, "basic", "No factory for object class " << rClass);
     198          20 :     return pNew;
     199             : }
     200             : 
     201           0 : SbxBase* SbxBase::Load( SvStream& rStrm )
     202             : {
     203             :     sal_uInt16 nSbxId, nFlagsTmp, nVer;
     204             :     sal_uInt32 nCreator, nSize;
     205           0 :     rStrm.ReadUInt32( nCreator ).ReadUInt16( nSbxId ).ReadUInt16( nFlagsTmp ).ReadUInt16( nVer );
     206           0 :     SbxFlagBits nFlags = static_cast<SbxFlagBits>(nFlagsTmp);
     207             : 
     208             :     // Correcting a foolishness of mine:
     209           0 :     if( (nFlags & SBX_RESERVED) != SBX_NONE )
     210           0 :         nFlags = ( nFlags & ~SBX_RESERVED ) | SBX_GBLSEARCH;
     211             : 
     212           0 :     sal_Size nOldPos = rStrm.Tell();
     213           0 :     rStrm.ReadUInt32( nSize );
     214           0 :     SbxBase* p = Create( nSbxId, nCreator );
     215           0 :     if( p )
     216             :     {
     217           0 :         p->nFlags = nFlags;
     218           0 :         if( p->LoadData( rStrm, nVer ) )
     219             :         {
     220           0 :             sal_Size nNewPos = rStrm.Tell();
     221           0 :             nOldPos += nSize;
     222             :             DBG_ASSERT( nOldPos >= nNewPos, "SBX: Too much data loaded" );
     223           0 :             if( nOldPos != nNewPos )
     224           0 :                 rStrm.Seek( nOldPos );
     225           0 :             if( !p->LoadCompleted() )
     226             :             {
     227             :                 // Deleting of the object
     228           0 :                 SbxBaseRef aRef( p );
     229           0 :                 p = NULL;
     230             :             }
     231             :         }
     232             :         else
     233             :         {
     234           0 :             rStrm.SetError( SVSTREAM_FILEFORMAT_ERROR );
     235             :             // Deleting of the object
     236           0 :             SbxBaseRef aRef( p );
     237           0 :             p = NULL;
     238             :         }
     239             :     }
     240             :     else
     241           0 :         rStrm.SetError( SVSTREAM_FILEFORMAT_ERROR );
     242           0 :     return p;
     243             : }
     244             : 
     245             : // Skip the Sbx-Object inside the stream
     246           0 : void SbxBase::Skip( SvStream& rStrm )
     247             : {
     248             :     sal_uInt16 nSbxId, nFlags, nVer;
     249             :     sal_uInt32 nCreator, nSize;
     250           0 :     rStrm.ReadUInt32( nCreator ).ReadUInt16( nSbxId ).ReadUInt16( nFlags ).ReadUInt16( nVer );
     251             : 
     252           0 :     sal_Size nStartPos = rStrm.Tell();
     253           0 :     rStrm.ReadUInt32( nSize );
     254             : 
     255           0 :     rStrm.Seek( nStartPos + nSize );
     256           0 : }
     257             : 
     258           0 : bool SbxBase::Store( SvStream& rStrm )
     259             : {
     260           0 :     if( ( nFlags & SBX_DONTSTORE ) == SBX_NONE )
     261             :     {
     262           0 :         rStrm.WriteUInt32( GetCreator() )
     263           0 :              .WriteUInt16( GetSbxId() )
     264           0 :              .WriteUInt16( GetFlags() )
     265           0 :              .WriteUInt16( GetVersion() );
     266           0 :         sal_Size nOldPos = rStrm.Tell();
     267           0 :         rStrm.WriteUInt32( 0L );
     268           0 :         bool bRes = StoreData( rStrm );
     269           0 :         sal_Size nNewPos = rStrm.Tell();
     270           0 :         rStrm.Seek( nOldPos );
     271           0 :         rStrm.WriteUInt32( nNewPos - nOldPos );
     272           0 :         rStrm.Seek( nNewPos );
     273           0 :         if( rStrm.GetError() != SVSTREAM_OK )
     274           0 :             bRes = false;
     275           0 :         if( bRes )
     276           0 :             bRes = true;
     277           0 :         return bRes;
     278             :     }
     279             :     else
     280           0 :         return true;
     281             : }
     282             : 
     283           0 : bool SbxBase::LoadData( SvStream&, sal_uInt16 )
     284             : {
     285           0 :     return false;
     286             : }
     287             : 
     288           0 : bool SbxBase::StoreData( SvStream& ) const
     289             : {
     290           0 :     return false;
     291             : }
     292             : 
     293           0 : bool SbxBase::LoadPrivateData( SvStream&, sal_uInt16 )
     294             : {
     295           0 :     return true;
     296             : }
     297             : 
     298           0 : bool SbxBase::StorePrivateData( SvStream& ) const
     299             : {
     300           0 :     return true;
     301             : }
     302             : 
     303           0 : bool SbxBase::LoadCompleted()
     304             : {
     305           0 :     return true;
     306             : }
     307             : 
     308             : //////////////////////////////// SbxFactory
     309             : 
     310        3035 : SbxFactory::~SbxFactory()
     311             : {
     312        3035 : }
     313             : 
     314           0 : SbxBase* SbxFactory::Create( sal_uInt16, sal_uInt32 )
     315             : {
     316           0 :     return NULL;
     317             : }
     318             : 
     319           0 : SbxObject* SbxFactory::CreateObject( const OUString& )
     320             : {
     321           0 :     return NULL;
     322             : }
     323             : 
     324             : ///////////////////////////////// SbxInfo
     325             : 
     326         938 : SbxInfo::~SbxInfo()
     327         938 : {}
     328             : 
     329         477 : void SbxInfo::AddParam(const OUString& rName, SbxDataType eType, SbxFlagBits nFlags)
     330             : {
     331         477 :     aParams.push_back(new SbxParamInfo(rName, eType, nFlags));
     332         477 : }
     333             : 
     334        4258 : const SbxParamInfo* SbxInfo::GetParam( sal_uInt16 n ) const
     335             : {
     336        4258 :     if( n < 1 || n > aParams.size() )
     337        1026 :         return NULL;
     338             :     else
     339        3232 :         return &(aParams[n - 1]);
     340             : }
     341             : 
     342           0 : bool SbxInfo::LoadData( SvStream& rStrm, sal_uInt16 nVer )
     343             : {
     344           0 :     aParams.clear();
     345             :     sal_uInt16 nParam;
     346           0 :     aComment = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     347           0 :         RTL_TEXTENCODING_ASCII_US);
     348           0 :     aHelpFile = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     349           0 :         RTL_TEXTENCODING_ASCII_US);
     350           0 :     rStrm.ReadUInt32( nHelpId ).ReadUInt16( nParam );
     351           0 :     while( nParam-- )
     352             :     {
     353             :         sal_uInt16 nType, nFlagsTmp;
     354           0 :         sal_uInt32 nUserData = 0;
     355             :         OUString aName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     356           0 :             RTL_TEXTENCODING_ASCII_US);
     357           0 :         rStrm.ReadUInt16( nType ).ReadUInt16( nFlagsTmp );
     358           0 :         SbxFlagBits nFlags = static_cast<SbxFlagBits>(nFlagsTmp);
     359           0 :         if( nVer > 1 )
     360           0 :             rStrm.ReadUInt32( nUserData );
     361           0 :         AddParam( aName, (SbxDataType) nType, nFlags );
     362           0 :         SbxParamInfo& p(aParams.back());
     363           0 :         p.nUserData = nUserData;
     364           0 :     }
     365           0 :     return true;
     366             : }
     367             : 
     368           0 : bool SbxInfo::StoreData( SvStream& rStrm ) const
     369             : {
     370             :     write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, aComment,
     371           0 :         RTL_TEXTENCODING_ASCII_US );
     372             :     write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, aHelpFile,
     373           0 :         RTL_TEXTENCODING_ASCII_US);
     374           0 :     rStrm.WriteUInt32( nHelpId ).WriteUInt16( aParams.size() );
     375           0 :     for(SbxParams::const_iterator i = aParams.begin(); i != aParams.end(); ++i)
     376             :     {
     377           0 :         write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, i->aName,
     378           0 :             RTL_TEXTENCODING_ASCII_US);
     379           0 :         rStrm.WriteUInt16( i->eType )
     380           0 :              .WriteUInt16( i->nFlags )
     381           0 :              .WriteUInt32( i->nUserData );
     382             :     }
     383           0 :     return true;
     384             : }
     385             : 
     386             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11