LCOV - code coverage report
Current view: top level - basic/source/sbx - sbxbase.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 192 0.0 %
Date: 2014-04-14 Functions: 0 47 0.0 %
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/shl.hxx>
      21             : #include <tools/stream.hxx>
      22             : 
      23             : #include <basic/sbx.hxx>
      24             : #include <basic/sbxfac.hxx>
      25             : #include "sbxbase.hxx"
      26             : 
      27             : #include <rtl/instance.hxx>
      28             : #include <rtl/ustring.hxx>
      29             : #include <boost/foreach.hpp>
      30             : 
      31             : // AppData-Structure for SBX:
      32             : 
      33           0 : TYPEINIT0(SbxBase)
      34             : 
      35             : namespace
      36             : {
      37             :     class theSbxAppData : public rtl::Static<SbxAppData, theSbxAppData> {};
      38             : }
      39             : 
      40           0 : SbxAppData& GetSbxData_Impl()
      41             : {
      42           0 :     return theSbxAppData::get();
      43             : }
      44             : 
      45           0 : SbxAppData::~SbxAppData()
      46             : {
      47           0 :     delete pBasicFormater;
      48           0 : }
      49             : 
      50           0 : SbxBase::SbxBase()
      51             : {
      52           0 :     nFlags  = SBX_READWRITE;
      53           0 : }
      54             : 
      55           0 : SbxBase::SbxBase( const SbxBase& r )
      56           0 :     : SvRefBase( r )
      57             : {
      58           0 :     nFlags  = r.nFlags;
      59           0 : }
      60             : 
      61           0 : SbxBase::~SbxBase()
      62             : {
      63           0 : }
      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           0 : void SbxBase::SetModified( bool b )
      91             : {
      92           0 :     if( IsSet( SBX_NO_MODIFY ) )
      93           0 :         return;
      94           0 :     if( b )
      95           0 :         SetFlag( SBX_MODIFIED );
      96             :     else
      97           0 :         ResetFlag( SBX_MODIFIED );
      98             : }
      99             : 
     100           0 : SbxError SbxBase::GetError()
     101             : {
     102           0 :     return GetSbxData_Impl().eSbxError;
     103             : }
     104             : 
     105           0 : void SbxBase::SetError( SbxError e )
     106             : {
     107           0 :     SbxAppData& r = GetSbxData_Impl();
     108           0 :     if( e && r.eSbxError == SbxERR_OK )
     109           0 :         r.eSbxError = e;
     110           0 : }
     111             : 
     112           0 : bool SbxBase::IsError()
     113             : {
     114           0 :     return GetSbxData_Impl().eSbxError != SbxERR_OK;
     115             : }
     116             : 
     117           0 : void SbxBase::ResetError()
     118             : {
     119           0 :     GetSbxData_Impl().eSbxError = SbxERR_OK;
     120           0 : }
     121             : 
     122           0 : void SbxBase::AddFactory( SbxFactory* pFac )
     123             : {
     124           0 :     SbxAppData& r = GetSbxData_Impl();
     125             : 
     126             :     // From 1996-03-06: take the HandleLast-Flag into account
     127           0 :     sal_uInt16 nPos = r.aFacs.size(); // Insert position
     128           0 :     if( !pFac->IsHandleLast() )         // Only if not self HandleLast
     129             :     {
     130             :         // Rank new factory in front of factories with HandleLast
     131           0 :         while( nPos > 0 &&
     132           0 :                 r.aFacs[ nPos-1 ].IsHandleLast() )
     133           0 :             nPos--;
     134             :     }
     135           0 :     r.aFacs.insert( r.aFacs.begin() + nPos, pFac );
     136           0 : }
     137             : 
     138           0 : void SbxBase::RemoveFactory( SbxFactory* pFac )
     139             : {
     140           0 :     SbxAppData& r = GetSbxData_Impl();
     141           0 :     for(SbxFacs::iterator it = r.aFacs.begin(); it != r.aFacs.end(); ++it)
     142             :     {
     143           0 :         if( &(*it) == pFac )
     144             :         {
     145           0 :             r.aFacs.release( it ).release(); break;
     146             :         }
     147             :     }
     148           0 : }
     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 :     BOOST_FOREACH(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           0 : SbxObject* SbxBase::CreateObject( const OUString& rClass )
     188             : {
     189           0 :     SbxAppData& r = GetSbxData_Impl();
     190           0 :     SbxObject* pNew = NULL;
     191           0 :     BOOST_FOREACH(SbxFactory& rFac, r.aFacs)
     192             :     {
     193           0 :         pNew = rFac.CreateObject( rClass );
     194           0 :         if( pNew )
     195           0 :             break;
     196             :     }
     197             :     SAL_WARN_IF(!pNew, "basic", "No factory for object class " << rClass);
     198           0 :     return pNew;
     199             : }
     200             : 
     201           0 : SbxBase* SbxBase::Load( SvStream& rStrm )
     202             : {
     203             :     sal_uInt16 nSbxId, nFlags, nVer;
     204             :     sal_uInt32 nCreator, nSize;
     205           0 :     rStrm.ReadUInt32( nCreator ).ReadUInt16( nSbxId ).ReadUInt16( nFlags ).ReadUInt16( nVer );
     206             : 
     207             :     // Correcting a foolishness of mine:
     208           0 :     if( nFlags & SBX_RESERVED )
     209           0 :         nFlags = ( nFlags & ~SBX_RESERVED ) | SBX_GBLSEARCH;
     210             : 
     211           0 :     sal_Size nOldPos = rStrm.Tell();
     212           0 :     rStrm.ReadUInt32( nSize );
     213           0 :     SbxBase* p = Create( nSbxId, nCreator );
     214           0 :     if( p )
     215             :     {
     216           0 :         p->nFlags = nFlags;
     217           0 :         if( p->LoadData( rStrm, nVer ) )
     218             :         {
     219           0 :             sal_Size nNewPos = rStrm.Tell();
     220           0 :             nOldPos += nSize;
     221             :             DBG_ASSERT( nOldPos >= nNewPos, "SBX: Too much data loaded" );
     222           0 :             if( nOldPos != nNewPos )
     223           0 :                 rStrm.Seek( nOldPos );
     224           0 :             if( !p->LoadCompleted() )
     225             :             {
     226             :                 // Deleting of the object
     227           0 :                 SbxBaseRef aRef( p );
     228           0 :                 p = NULL;
     229             :             }
     230             :         }
     231             :         else
     232             :         {
     233           0 :             rStrm.SetError( SVSTREAM_FILEFORMAT_ERROR );
     234             :             // Deleting of the object
     235           0 :             SbxBaseRef aRef( p );
     236           0 :             p = NULL;
     237             :         }
     238             :     }
     239             :     else
     240           0 :         rStrm.SetError( SVSTREAM_FILEFORMAT_ERROR );
     241           0 :     return p;
     242             : }
     243             : 
     244             : // Skip the Sbx-Object inside the stream
     245           0 : void SbxBase::Skip( SvStream& rStrm )
     246             : {
     247             :     sal_uInt16 nSbxId, nFlags, nVer;
     248             :     sal_uInt32 nCreator, nSize;
     249           0 :     rStrm.ReadUInt32( nCreator ).ReadUInt16( nSbxId ).ReadUInt16( nFlags ).ReadUInt16( nVer );
     250             : 
     251           0 :     sal_Size nStartPos = rStrm.Tell();
     252           0 :     rStrm.ReadUInt32( nSize );
     253             : 
     254           0 :     rStrm.Seek( nStartPos + nSize );
     255           0 : }
     256             : 
     257           0 : bool SbxBase::Store( SvStream& rStrm )
     258             : {
     259           0 :     if( !( nFlags & SBX_DONTSTORE ) )
     260             :     {
     261           0 :         rStrm.WriteUInt32( (sal_uInt32) GetCreator() )
     262           0 :              .WriteUInt16( (sal_uInt16) GetSbxId() )
     263           0 :              .WriteUInt16( (sal_uInt16) GetFlags() )
     264           0 :              .WriteUInt16( (sal_uInt16) GetVersion() );
     265           0 :         sal_Size nOldPos = rStrm.Tell();
     266           0 :         rStrm.WriteUInt32( (sal_uInt32) 0L );
     267           0 :         bool bRes = StoreData( rStrm );
     268           0 :         sal_Size nNewPos = rStrm.Tell();
     269           0 :         rStrm.Seek( nOldPos );
     270           0 :         rStrm.WriteUInt32( (sal_uInt32) ( nNewPos - nOldPos ) );
     271           0 :         rStrm.Seek( nNewPos );
     272           0 :         if( rStrm.GetError() != SVSTREAM_OK )
     273           0 :             bRes = false;
     274           0 :         if( bRes )
     275           0 :             bRes = StoreCompleted();
     276           0 :         return bRes;
     277             :     }
     278             :     else
     279           0 :         return true;
     280             : }
     281             : 
     282           0 : bool SbxBase::LoadData( SvStream&, sal_uInt16 )
     283             : {
     284           0 :     return false;
     285             : }
     286             : 
     287           0 : bool SbxBase::StoreData( SvStream& ) const
     288             : {
     289           0 :     return false;
     290             : }
     291             : 
     292           0 : bool SbxBase::LoadPrivateData( SvStream&, sal_uInt16 )
     293             : {
     294           0 :     return true;
     295             : }
     296             : 
     297           0 : bool SbxBase::StorePrivateData( SvStream& ) const
     298             : {
     299           0 :     return true;
     300             : }
     301             : 
     302           0 : bool SbxBase::LoadCompleted()
     303             : {
     304           0 :     return true;
     305             : }
     306             : 
     307           0 : bool SbxBase::StoreCompleted()
     308             : {
     309           0 :     return true;
     310             : }
     311             : 
     312             : //////////////////////////////// SbxFactory
     313             : 
     314           0 : SbxFactory::~SbxFactory()
     315             : {
     316           0 : }
     317             : 
     318           0 : SbxBase* SbxFactory::Create( sal_uInt16, sal_uInt32 )
     319             : {
     320           0 :     return NULL;
     321             : }
     322             : 
     323           0 : SbxObject* SbxFactory::CreateObject( const OUString& )
     324             : {
     325           0 :     return NULL;
     326             : }
     327             : 
     328             : ///////////////////////////////// SbxInfo
     329             : 
     330           0 : SbxInfo::~SbxInfo()
     331           0 : {}
     332             : 
     333           0 : void SbxInfo::AddParam(const OUString& rName, SbxDataType eType, sal_uInt16 nFlags)
     334             : {
     335           0 :     aParams.push_back(new SbxParamInfo(rName, eType, nFlags));
     336           0 : }
     337             : 
     338           0 : const SbxParamInfo* SbxInfo::GetParam( sal_uInt16 n ) const
     339             : {
     340           0 :     if( n < 1 || n > aParams.size() )
     341           0 :         return NULL;
     342             :     else
     343           0 :         return &(aParams[n - 1]);
     344             : }
     345             : 
     346           0 : bool SbxInfo::LoadData( SvStream& rStrm, sal_uInt16 nVer )
     347             : {
     348           0 :     aParams.clear();
     349             :     sal_uInt16 nParam;
     350           0 :     aComment = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     351           0 :         RTL_TEXTENCODING_ASCII_US);
     352           0 :     aHelpFile = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     353           0 :         RTL_TEXTENCODING_ASCII_US);
     354           0 :     rStrm.ReadUInt32( nHelpId ).ReadUInt16( nParam );
     355           0 :     while( nParam-- )
     356             :     {
     357             :         sal_uInt16 nType, nFlags;
     358           0 :         sal_uInt32 nUserData = 0;
     359             :         OUString aName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm,
     360           0 :             RTL_TEXTENCODING_ASCII_US);
     361           0 :         rStrm.ReadUInt16( nType ).ReadUInt16( nFlags );
     362           0 :         if( nVer > 1 )
     363           0 :             rStrm.ReadUInt32( nUserData );
     364           0 :         AddParam( aName, (SbxDataType) nType, nFlags );
     365           0 :         SbxParamInfo& p(aParams.back());
     366           0 :         p.nUserData = nUserData;
     367           0 :     }
     368           0 :     return true;
     369             : }
     370             : 
     371           0 : bool SbxInfo::StoreData( SvStream& rStrm ) const
     372             : {
     373             :     write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, aComment,
     374           0 :         RTL_TEXTENCODING_ASCII_US );
     375             :     write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, aHelpFile,
     376           0 :         RTL_TEXTENCODING_ASCII_US);
     377           0 :     rStrm.WriteUInt32( nHelpId ).WriteUInt16( static_cast<sal_uInt16>(aParams.size()) );
     378           0 :     for(SbxParams::const_iterator i = aParams.begin(); i != aParams.end(); ++i)
     379             :     {
     380           0 :         write_uInt16_lenPrefixed_uInt8s_FromOUString(rStrm, i->aName,
     381           0 :             RTL_TEXTENCODING_ASCII_US);
     382           0 :         rStrm.WriteUInt16( (sal_uInt16) i->eType )
     383           0 :              .WriteUInt16( (sal_uInt16) i->nFlags )
     384           0 :              .WriteUInt32( (sal_uInt32) i->nUserData );
     385             :     }
     386           0 :     return true;
     387             : }
     388             : 
     389             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10