diff options
Diffstat (limited to 'basic/source/sbx/sbxbase.cxx')
-rw-r--r-- | basic/source/sbx/sbxbase.cxx | 73 |
1 files changed, 48 insertions, 25 deletions
diff --git a/basic/source/sbx/sbxbase.cxx b/basic/source/sbx/sbxbase.cxx index 0e057540c8bc..b90368f68f26 100644 --- a/basic/source/sbx/sbxbase.cxx +++ b/basic/source/sbx/sbxbase.cxx @@ -31,12 +31,14 @@ #include <rtl/ustring.hxx> #include <sal/log.hxx> +#include <filefmt.hxx> // AppData-Structure for SBX: SbxAppData::SbxAppData() : eErrCode(ERRCODE_NONE) + , aErrorMsg(OUString()) , eBasicFormaterLangType(LANGUAGE_DONTKNOW) { } @@ -55,11 +57,7 @@ SbxBase::SbxBase() nFlags = SbxFlagBits::ReadWrite; } -SbxBase::SbxBase( const SbxBase& r ) - : SvRefBase( r ) -{ - nFlags = r.nFlags; -} +SbxBase::SbxBase(const SbxBase& r) = default; SbxBase::~SbxBase() { @@ -96,6 +94,21 @@ ErrCode const & SbxBase::GetError() return GetSbxData_Impl().eErrCode; } +OUString const & SbxBase::GetErrorMsg() +{ + return GetSbxData_Impl().aErrorMsg; +} + +void SbxBase::SetError(ErrCode e, const OUString& rMsg) +{ + SbxAppData& r = GetSbxData_Impl(); + if (e && r.eErrCode == ERRCODE_NONE) + { + r.eErrCode = e; + r.aErrorMsg = rMsg; + } +} + void SbxBase::SetError( ErrCode e ) { SbxAppData& r = GetSbxData_Impl(); @@ -111,6 +124,7 @@ bool SbxBase::IsError() void SbxBase::ResetError() { GetSbxData_Impl().eErrCode = ERRCODE_NONE; + GetSbxData_Impl().aErrorMsg = OUString(); } void SbxBase::AddFactory( SbxFactory* pFac ) @@ -129,7 +143,7 @@ void SbxBase::RemoveFactory( SbxFactory const * pFac ) } -SbxBase* SbxBase::Create( sal_uInt16 nSbxId, sal_uInt32 nCreator ) +SbxBaseRef SbxBase::Create( sal_uInt16 nSbxId, sal_uInt32 nCreator ) { // #91626: Hack to skip old Basic dialogs // Problem: There does not exist a factory any more, @@ -153,7 +167,7 @@ SbxBase* SbxBase::Create( sal_uInt16 nSbxId, sal_uInt32 nCreator ) } // Unknown type: go over the factories! SbxAppData& r = GetSbxData_Impl(); - SbxBase* pNew = nullptr; + SbxBaseRef pNew; for (auto const& rpFac : r.m_Factories) { pNew = rpFac->Create( nSbxId, nCreator ); @@ -164,10 +178,10 @@ SbxBase* SbxBase::Create( sal_uInt16 nSbxId, sal_uInt32 nCreator ) return pNew; } -SbxObject* SbxBase::CreateObject( const OUString& rClass ) +SbxObjectRef SbxBase::CreateObject( const OUString& rClass ) { SbxAppData& r = GetSbxData_Impl(); - SbxObject* pNew = nullptr; + SbxObjectRef pNew; for (auto const& rpFac : r.m_Factories) { pNew = rpFac->CreateObject( rClass ); @@ -178,20 +192,29 @@ SbxObject* SbxBase::CreateObject( const OUString& rClass ) return pNew; } -SbxBase* SbxBase::Load( SvStream& rStrm ) -{ - sal_uInt16 nSbxId, nFlagsTmp, nVer; - sal_uInt32 nCreator, nSize; - rStrm.ReadUInt32( nCreator ).ReadUInt16( nSbxId ).ReadUInt16( nFlagsTmp ).ReadUInt16( nVer ); - SbxFlagBits nFlags = static_cast<SbxFlagBits>(nFlagsTmp); +namespace { +// coverity[ -taint_source ] +[[nodiscard]] SbxFlagBits CorrectFlags(SbxFlagBits nFlags) +{ // Correcting a foolishness of mine: - if( nFlags & SbxFlagBits::Reserved ) - nFlags = ( nFlags & ~SbxFlagBits::Reserved ) | SbxFlagBits::GlobalSearch; + if (nFlags & SbxFlagBits::Reserved) + nFlags |= SbxFlagBits::GlobalSearch; + return nFlags & ~SbxFlagBits::Reserved; +} + +} + +SbxBaseRef SbxBase::Load( SvStream& rStrm ) +{ + sal_uInt16 nSbxId(0), nFlagsTmp(0), nVer(0); + sal_uInt32 nCreator(0), nSize(0); + rStrm.ReadUInt32( nCreator ).ReadUInt16( nSbxId ).ReadUInt16( nFlagsTmp ).ReadUInt16( nVer ); + SbxFlagBits nFlags = CorrectFlags(static_cast<SbxFlagBits>(nFlagsTmp)); sal_uInt64 nOldPos = rStrm.Tell(); rStrm.ReadUInt32( nSize ); - SbxBase* p = Create( nSbxId, nCreator ); + SbxBaseRef p = Create( nSbxId, nCreator ); if( p ) { p->nFlags = nFlags; @@ -222,7 +245,7 @@ SbxBase* SbxBase::Load( SvStream& rStrm ) return p; } -bool SbxBase::Store( SvStream& rStrm ) +std::pair<bool, sal_uInt32> SbxBase::Store( SvStream& rStrm ) { if( ( nFlags & SbxFlagBits::DontStore ) == SbxFlagBits::NONE ) { @@ -232,7 +255,7 @@ bool SbxBase::Store( SvStream& rStrm ) .WriteUInt16( GetVersion() ); sal_uInt64 const nOldPos = rStrm.Tell(); rStrm.WriteUInt32( 0 ); - bool bRes = StoreData( rStrm ); + auto [bRes, nVersion] = StoreData(rStrm); sal_uInt64 const nNewPos = rStrm.Tell(); rStrm.Seek( nOldPos ); rStrm.WriteUInt32( nNewPos - nOldPos ); @@ -241,10 +264,10 @@ bool SbxBase::Store( SvStream& rStrm ) bRes = false; if( bRes ) bRes = true; - return bRes; + return { bRes, nVersion }; } else - return true; + return { true, B_IMG_VERSION_12 }; } bool SbxBase::LoadCompleted() @@ -258,12 +281,12 @@ SbxFactory::~SbxFactory() { } -SbxBase* SbxFactory::Create( sal_uInt16, sal_uInt32 ) +SbxBaseRef SbxFactory::Create( sal_uInt16, sal_uInt32 ) { return nullptr; } -SbxObject* SbxFactory::CreateObject( const OUString& ) +SbxObjectRef SbxFactory::CreateObject( const OUString& ) { return nullptr; } @@ -297,7 +320,7 @@ void SbxInfo::LoadData( SvStream& rStrm, sal_uInt16 nVer ) rStrm.ReadUInt32( nHelpId ).ReadUInt16( nParam ); while( nParam-- ) { - sal_uInt16 nType, nFlagsTmp; + sal_uInt16 nType(0), nFlagsTmp(0); sal_uInt32 nUserData = 0; OUString aName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rStrm, RTL_TEXTENCODING_ASCII_US); |