SvPersistStream dead
since commit 1e4b1e4a1a
"Removing unused SfxItemPool serialisation from editeng"
Change-Id: I8a3cd36a13b7d2322047c2035e0f23c70ca9cdf0
Reviewed-on: https://gerrit.libreoffice.org/40880
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
@@ -224,7 +224,7 @@ SvxFieldData* SvxFieldData::Create(const uno::Reference<text::XTextContent>& xTe
|
||||
}
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxFieldData, SvPersistBase );
|
||||
SV_IMPL_PERSIST1( SvxFieldData );
|
||||
|
||||
|
||||
SvxFieldData::SvxFieldData()
|
||||
@@ -251,16 +251,6 @@ bool SvxFieldData::operator==( const SvxFieldData& rFld ) const
|
||||
}
|
||||
|
||||
|
||||
void SvxFieldData::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SvxFieldData::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MetaAction* SvxFieldData::createBeginComment() const
|
||||
{
|
||||
return new MetaCommentAction( "FIELD_SEQ_BEGIN" );
|
||||
@@ -314,7 +304,7 @@ bool SvxFieldItem::operator==( const SfxPoolItem& rItem ) const
|
||||
// The following are the derivatives of SvxFieldData ...
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxDateField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxDateField );
|
||||
|
||||
|
||||
SvxDateField::SvxDateField()
|
||||
@@ -351,26 +341,6 @@ bool SvxDateField::operator==( const SvxFieldData& rOther ) const
|
||||
}
|
||||
|
||||
|
||||
void SvxDateField::Load( SvPersistStream & rStm )
|
||||
{
|
||||
sal_uInt16 nType, nFormat;
|
||||
|
||||
rStm.ReadInt32( nFixDate );
|
||||
rStm.ReadUInt16( nType );
|
||||
rStm.ReadUInt16( nFormat );
|
||||
|
||||
eType = (SvxDateType)nType;
|
||||
eFormat= (SvxDateFormat)nFormat;
|
||||
}
|
||||
|
||||
|
||||
void SvxDateField::Save( SvPersistStream & rStm )
|
||||
{
|
||||
rStm.WriteInt32( nFixDate );
|
||||
rStm.WriteUInt16( (sal_uInt16)eType );
|
||||
rStm.WriteUInt16( eFormat );
|
||||
}
|
||||
|
||||
|
||||
OUString SvxDateField::GetFormatted( SvNumberFormatter& rFormatter, LanguageType eLang ) const
|
||||
{
|
||||
@@ -448,7 +418,7 @@ MetaAction* SvxDateField::createBeginComment() const
|
||||
return new MetaCommentAction( "FIELD_SEQ_BEGIN" );
|
||||
}
|
||||
|
||||
SV_IMPL_PERSIST1( SvxURLField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxURLField );
|
||||
|
||||
|
||||
SvxURLField::SvxURLField()
|
||||
@@ -483,58 +453,6 @@ bool SvxURLField::operator==( const SvxFieldData& rOther ) const
|
||||
}
|
||||
|
||||
|
||||
static void write_unicode( SvPersistStream & rStm, const OUString& rString )
|
||||
{
|
||||
sal_uInt16 nL = sal::static_int_cast<sal_uInt16>(rString.getLength());
|
||||
rStm.WriteUInt16( nL );
|
||||
//endian specific?, yipes!
|
||||
rStm.WriteBytes( rString.getStr(), nL*sizeof(sal_Unicode) );
|
||||
}
|
||||
|
||||
static OUString read_unicode( SvPersistStream & rStm )
|
||||
{
|
||||
rtl_uString *pStr = nullptr;
|
||||
sal_uInt16 nL = 0;
|
||||
rStm.ReadUInt16( nL );
|
||||
const size_t nMaxRecords = rStm.remainingSize() / sizeof(sal_Unicode);
|
||||
if (nL > nMaxRecords)
|
||||
{
|
||||
SAL_WARN("editeng", "Parsing error: " << nMaxRecords <<
|
||||
" max possible entries, but " << nL << " claimed, truncating");
|
||||
nL = nMaxRecords;
|
||||
}
|
||||
if (nL)
|
||||
{
|
||||
pStr = rtl_uString_alloc(nL);
|
||||
//endian specific?, yipes!
|
||||
rStm.ReadBytes(pStr->buffer, nL*sizeof(sal_Unicode));
|
||||
}
|
||||
//take ownership of buffer and return, otherwise return empty string
|
||||
return pStr ? OUString(pStr, SAL_NO_ACQUIRE) : OUString();
|
||||
}
|
||||
|
||||
void SvxURLField::Load( SvPersistStream & rStm )
|
||||
{
|
||||
sal_uInt16 nFormat = 0;
|
||||
|
||||
rStm.ReadUInt16( nFormat );
|
||||
eFormat= (SvxURLFormat)nFormat;
|
||||
|
||||
aURL = read_unicode( rStm );
|
||||
aRepresentation = read_unicode( rStm );
|
||||
aTargetFrame = read_unicode( rStm );
|
||||
}
|
||||
|
||||
|
||||
void SvxURLField::Save( SvPersistStream & rStm )
|
||||
{
|
||||
rStm.WriteUInt16( eFormat );
|
||||
|
||||
write_unicode( rStm, aURL );
|
||||
write_unicode( rStm, aRepresentation );
|
||||
write_unicode( rStm, aTargetFrame );
|
||||
}
|
||||
|
||||
MetaAction* SvxURLField::createBeginComment() const
|
||||
{
|
||||
// #i46618# Adding target URL to metafile comment
|
||||
@@ -548,7 +466,7 @@ MetaAction* SvxURLField::createBeginComment() const
|
||||
// SvxPageTitleField methods
|
||||
//
|
||||
|
||||
SV_IMPL_PERSIST1( SvxPageTitleField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxPageTitleField );
|
||||
|
||||
SvxPageTitleField::SvxPageTitleField() {}
|
||||
|
||||
@@ -562,14 +480,6 @@ bool SvxPageTitleField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxPageTitleField *>(&rCmp) != nullptr );
|
||||
}
|
||||
|
||||
void SvxPageTitleField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxPageTitleField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
MetaAction* SvxPageTitleField::createBeginComment() const
|
||||
{
|
||||
return new MetaCommentAction( "FIELD_SEQ_BEGIN;PageTitleField" );
|
||||
@@ -581,7 +491,7 @@ MetaAction* SvxPageTitleField::createBeginComment() const
|
||||
// The fields that were removed from Calc:
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxPageField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxPageField );
|
||||
|
||||
SvxPageField::SvxPageField() {}
|
||||
|
||||
@@ -595,21 +505,13 @@ bool SvxPageField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxPageField *>(&rCmp) != nullptr );
|
||||
}
|
||||
|
||||
void SvxPageField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxPageField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
MetaAction* SvxPageField::createBeginComment() const
|
||||
{
|
||||
return new MetaCommentAction( "FIELD_SEQ_BEGIN;PageField" );
|
||||
}
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxPagesField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxPagesField );
|
||||
|
||||
SvxPagesField::SvxPagesField() {}
|
||||
|
||||
@@ -623,15 +525,7 @@ bool SvxPagesField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxPagesField *>(&rCmp) != nullptr);
|
||||
}
|
||||
|
||||
void SvxPagesField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxPagesField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
SV_IMPL_PERSIST1( SvxTimeField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxTimeField );
|
||||
|
||||
SvxTimeField::SvxTimeField() {}
|
||||
|
||||
@@ -645,20 +539,12 @@ bool SvxTimeField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxTimeField *>(&rCmp) != nullptr);
|
||||
}
|
||||
|
||||
void SvxTimeField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxTimeField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
MetaAction* SvxTimeField::createBeginComment() const
|
||||
{
|
||||
return new MetaCommentAction( "FIELD_SEQ_BEGIN" );
|
||||
}
|
||||
|
||||
SV_IMPL_PERSIST1( SvxFileField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxFileField );
|
||||
|
||||
SvxFileField::SvxFileField() {}
|
||||
|
||||
@@ -672,15 +558,7 @@ bool SvxFileField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxFileField *>(&rCmp) != nullptr );
|
||||
}
|
||||
|
||||
void SvxFileField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxFileField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
SV_IMPL_PERSIST1( SvxTableField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxTableField );
|
||||
|
||||
SvxTableField::SvxTableField() : mnTab(0) {}
|
||||
|
||||
@@ -705,19 +583,10 @@ bool SvxTableField::operator==( const SvxFieldData& rCmp ) const
|
||||
return mnTab == static_cast<const SvxTableField&>(rCmp).mnTab;
|
||||
}
|
||||
|
||||
void SvxTableField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxTableField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// SvxExtTimeField
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxExtTimeField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxExtTimeField );
|
||||
|
||||
|
||||
SvxExtTimeField::SvxExtTimeField()
|
||||
@@ -754,27 +623,6 @@ bool SvxExtTimeField::operator==( const SvxFieldData& rOther ) const
|
||||
}
|
||||
|
||||
|
||||
void SvxExtTimeField::Load( SvPersistStream & rStm )
|
||||
{
|
||||
sal_uInt16 nType, nFormat;
|
||||
|
||||
rStm.ReadInt64(m_nFixTime);
|
||||
rStm.ReadUInt16( nType );
|
||||
rStm.ReadUInt16( nFormat );
|
||||
|
||||
eType = (SvxTimeType) nType;
|
||||
eFormat= (SvxTimeFormat) nFormat;
|
||||
}
|
||||
|
||||
|
||||
void SvxExtTimeField::Save( SvPersistStream & rStm )
|
||||
{
|
||||
rStm.WriteInt64(m_nFixTime);
|
||||
rStm.WriteUInt16( eType );
|
||||
rStm.WriteUInt16( eFormat );
|
||||
}
|
||||
|
||||
|
||||
OUString SvxExtTimeField::GetFormatted( SvNumberFormatter& rFormatter, LanguageType eLang ) const
|
||||
{
|
||||
tools::Time aTime( tools::Time::EMPTY );
|
||||
@@ -855,7 +703,7 @@ MetaAction* SvxExtTimeField::createBeginComment() const
|
||||
// SvxExtFileField
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxExtFileField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxExtFileField );
|
||||
|
||||
|
||||
SvxExtFileField::SvxExtFileField()
|
||||
@@ -891,31 +739,6 @@ bool SvxExtFileField::operator==( const SvxFieldData& rOther ) const
|
||||
}
|
||||
|
||||
|
||||
void SvxExtFileField::Load( SvPersistStream & rStm )
|
||||
{
|
||||
sal_uInt16 nType, nFormat;
|
||||
|
||||
// UNICODE: rStm >> aFile;
|
||||
aFile = rStm.ReadUniOrByteString(rStm.GetStreamCharSet());
|
||||
|
||||
rStm.ReadUInt16( nType );
|
||||
rStm.ReadUInt16( nFormat );
|
||||
|
||||
eType = (SvxFileType) nType;
|
||||
eFormat= (SvxFileFormat) nFormat;
|
||||
}
|
||||
|
||||
|
||||
void SvxExtFileField::Save( SvPersistStream & rStm )
|
||||
{
|
||||
// UNICODE: rStm << aFile;
|
||||
rStm.WriteUniOrByteString(aFile, rStm.GetStreamCharSet());
|
||||
|
||||
rStm.WriteUInt16( eType );
|
||||
rStm.WriteUInt16( eFormat );
|
||||
}
|
||||
|
||||
|
||||
OUString SvxExtFileField::GetFormatted() const
|
||||
{
|
||||
OUString aString;
|
||||
@@ -995,7 +818,7 @@ OUString SvxExtFileField::GetFormatted() const
|
||||
// SvxAuthorField
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxAuthorField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxAuthorField );
|
||||
|
||||
|
||||
SvxAuthorField::SvxAuthorField()
|
||||
@@ -1038,33 +861,6 @@ bool SvxAuthorField::operator==( const SvxFieldData& rOther ) const
|
||||
}
|
||||
|
||||
|
||||
void SvxAuthorField::Load( SvPersistStream & rStm )
|
||||
{
|
||||
sal_uInt16 nType = 0, nFormat = 0;
|
||||
|
||||
aName = read_unicode( rStm );
|
||||
aFirstName = read_unicode( rStm );
|
||||
aShortName = read_unicode( rStm );
|
||||
|
||||
rStm.ReadUInt16( nType );
|
||||
rStm.ReadUInt16( nFormat );
|
||||
|
||||
eType = (SvxAuthorType) nType;
|
||||
eFormat= (SvxAuthorFormat) nFormat;
|
||||
}
|
||||
|
||||
|
||||
void SvxAuthorField::Save( SvPersistStream & rStm )
|
||||
{
|
||||
write_unicode( rStm, aName );
|
||||
write_unicode( rStm, aFirstName );
|
||||
write_unicode( rStm, aShortName );
|
||||
|
||||
rStm.WriteUInt16( eType );
|
||||
rStm.WriteUInt16( eFormat );
|
||||
}
|
||||
|
||||
|
||||
OUString SvxAuthorField::GetFormatted() const
|
||||
{
|
||||
OUString aString;
|
||||
@@ -1090,29 +886,7 @@ OUString SvxAuthorField::GetFormatted() const
|
||||
return aString;
|
||||
}
|
||||
|
||||
static SvClassManager* pClassMgr=nullptr;
|
||||
|
||||
SvClassManager& SvxFieldItem::GetClassManager()
|
||||
{
|
||||
if ( !pClassMgr )
|
||||
{
|
||||
pClassMgr = new SvClassManager;
|
||||
pClassMgr->Register(SvxFieldData::StaticClassId(), SvxFieldData::CreateInstance);
|
||||
pClassMgr->Register(SvxURLField::StaticClassId(), SvxURLField::CreateInstance);
|
||||
pClassMgr->Register(SvxDateField::StaticClassId(), SvxDateField::CreateInstance);
|
||||
pClassMgr->Register(SvxPageField::StaticClassId(), SvxPageField::CreateInstance);
|
||||
pClassMgr->Register(SvxPageTitleField::StaticClassId(), SvxPageTitleField::CreateInstance);
|
||||
pClassMgr->Register(SvxTimeField::StaticClassId(), SvxTimeField::CreateInstance);
|
||||
pClassMgr->Register(SvxExtTimeField::StaticClassId(), SvxExtTimeField::CreateInstance);
|
||||
pClassMgr->Register(SvxExtFileField::StaticClassId(), SvxExtFileField::CreateInstance);
|
||||
pClassMgr->Register(SvxAuthorField::StaticClassId(), SvxAuthorField::CreateInstance);
|
||||
}
|
||||
|
||||
return *pClassMgr;
|
||||
}
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxHeaderField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxHeaderField );
|
||||
|
||||
SvxHeaderField::SvxHeaderField() {}
|
||||
|
||||
@@ -1126,16 +900,8 @@ bool SvxHeaderField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxHeaderField *>(&rCmp) != nullptr );
|
||||
}
|
||||
|
||||
void SvxHeaderField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
SV_IMPL_PERSIST1( SvxFooterField );
|
||||
|
||||
void SvxHeaderField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxFooterField, SvxFieldData );
|
||||
SvxFooterField::SvxFooterField() {}
|
||||
|
||||
SvxFieldData* SvxFooterField::Clone() const
|
||||
@@ -1148,16 +914,7 @@ bool SvxFooterField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxFooterField *>(&rCmp) != nullptr );
|
||||
}
|
||||
|
||||
void SvxFooterField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxFooterField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SV_IMPL_PERSIST1( SvxDateTimeField, SvxFieldData );
|
||||
SV_IMPL_PERSIST1( SvxDateTimeField );
|
||||
|
||||
SvxFieldData* SvxDateTimeField::Clone() const
|
||||
{
|
||||
@@ -1169,14 +926,6 @@ bool SvxDateTimeField::operator==( const SvxFieldData& rCmp ) const
|
||||
return ( dynamic_cast< const SvxDateTimeField *>(&rCmp) != nullptr );
|
||||
}
|
||||
|
||||
void SvxDateTimeField::Load( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
void SvxDateTimeField::Save( SvPersistStream & /*rStm*/ )
|
||||
{
|
||||
}
|
||||
|
||||
SvxDateTimeField::SvxDateTimeField() {}
|
||||
|
||||
OUString SvxDateTimeField::GetFormatted(
|
||||
|
@@ -20,7 +20,7 @@
|
||||
|
||||
#include <editeng/measfld.hxx>
|
||||
|
||||
SV_IMPL_PERSIST1(SdrMeasureField,SvxFieldData);
|
||||
SV_IMPL_PERSIST1(SdrMeasureField);
|
||||
|
||||
SdrMeasureField::~SdrMeasureField()
|
||||
{
|
||||
@@ -36,16 +36,4 @@ bool SdrMeasureField::operator==(const SvxFieldData& rSrc) const
|
||||
return eMeasureFieldKind == static_cast<const SdrMeasureField&>(rSrc).GetMeasureFieldKind();
|
||||
}
|
||||
|
||||
void SdrMeasureField::Load(SvPersistStream& rIn)
|
||||
{
|
||||
sal_uInt16 nFieldKind;
|
||||
rIn.ReadUInt16( nFieldKind );
|
||||
eMeasureFieldKind=(SdrMeasureFieldKind)nFieldKind;
|
||||
}
|
||||
|
||||
void SdrMeasureField::Save(SvPersistStream& rOut)
|
||||
{
|
||||
rOut.WriteUInt16( eMeasureFieldKind );
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
|
@@ -82,7 +82,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class SvMetaObject : public SvRttiBase
|
||||
class SvMetaObject : public SvRefBase
|
||||
{
|
||||
protected:
|
||||
OString aName;
|
||||
|
@@ -76,7 +76,6 @@ public:
|
||||
virtual SfxPoolItem* Clone( SfxItemPool *pPool = nullptr ) const override;
|
||||
|
||||
const SvxFieldData* GetField() const { return mxField.get(); }
|
||||
static SvClassManager& GetClassManager();
|
||||
};
|
||||
|
||||
|
||||
|
@@ -1,29 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#ifndef INCLUDED_SVX_SVDFIELD_HXX
|
||||
#define INCLUDED_SVX_SVDFIELD_HXX
|
||||
|
||||
#include <svx/svxdllapi.h>
|
||||
|
||||
void SVX_DLLPUBLIC SdrRegisterFieldClasses();
|
||||
|
||||
#endif // INCLUDED_SVX_SVDFIELD_HXX
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -26,147 +26,18 @@
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
|
||||
#define ERRCODE_IO_NOFACTORY ERRCODE_IO_WRONGFORMAT
|
||||
|
||||
class SvPersistBase;
|
||||
|
||||
typedef void * (*SvCreateInstancePersist)( SvPersistBase ** );
|
||||
|
||||
#define SV_CLASS_REGISTER( Class ) \
|
||||
Register( Class::StaticClassId(), Class::CreateInstance )
|
||||
|
||||
class TOOLS_DLLPUBLIC SvClassManager
|
||||
{
|
||||
typedef std::unordered_map<sal_Int32, SvCreateInstancePersist> Map;
|
||||
Map aAssocTable;
|
||||
|
||||
public:
|
||||
void Register( sal_Int32 nClassId, SvCreateInstancePersist pFunc );
|
||||
SvCreateInstancePersist Get( sal_Int32 nClassId );
|
||||
};
|
||||
|
||||
class TOOLS_DLLPUBLIC SvRttiBase : public SvRefBase
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
||||
#define SV_DECL_PERSIST1( Class, CLASS_ID ) \
|
||||
static sal_Int32 StaticClassId() { return CLASS_ID; } \
|
||||
static void * CreateInstance( SvPersistBase ** ppBase ); \
|
||||
friend SvPersistStream& operator >> ( SvPersistStream & rStm, \
|
||||
Class *& rpObj); \
|
||||
virtual sal_Int32 GetClassId() const override; \
|
||||
virtual void Load( SvPersistStream & ) override; \
|
||||
virtual void Save( SvPersistStream & ) override;
|
||||
|
||||
#define SV_IMPL_PERSIST1( Class, Super1 ) \
|
||||
void * Class::CreateInstance( SvPersistBase ** ppBase )\
|
||||
{ \
|
||||
Class * p = new Class(); \
|
||||
*ppBase = p; \
|
||||
return p; \
|
||||
} \
|
||||
sal_Int32 Class::GetClassId() const \
|
||||
#define SV_IMPL_PERSIST1( Class ) \
|
||||
sal_Int32 Class::GetClassId() const \
|
||||
{ return StaticClassId(); } \
|
||||
SvPersistStream& operator >> (SvPersistStream & rStm, Class *& rpObj)\
|
||||
{ \
|
||||
SvPersistBase * pObj; \
|
||||
rStm >> pObj; \
|
||||
rpObj = dynamic_cast< Class*>( pObj ); \
|
||||
return rStm; \
|
||||
}
|
||||
|
||||
class SvPersistStream;
|
||||
|
||||
class SvPersistBase : public SvRttiBase
|
||||
class SvPersistBase : public SvRefBase
|
||||
{
|
||||
public:
|
||||
virtual sal_Int32 GetClassId() const = 0;
|
||||
virtual void Load( SvPersistStream & ) = 0;
|
||||
virtual void Save( SvPersistStream & ) = 0;
|
||||
TOOLS_DLLPUBLIC friend SvPersistStream& operator >> ( SvPersistStream & rStm,
|
||||
SvPersistBase *& rpObj );
|
||||
};
|
||||
|
||||
class SvStream;
|
||||
|
||||
/** Persistent Stream
|
||||
|
||||
This class provides accessor to storing and loading runtime objects.
|
||||
All dependent objects have to be stored as well.
|
||||
In order to load objects automatically, every object class must
|
||||
provide a Factory method to read an object from stream.
|
||||
The list of all classes is stored in a <SvClassManager> object
|
||||
and is sent to SvPersistStream upon initialization.
|
||||
By using the Method SvPersistStream::WriteCompressed and
|
||||
SvPersistStream::ReadCompressed, compressed sal_uInt32 values may be
|
||||
written to / read from the Stream.
|
||||
Several helper methods exists for writing and reading
|
||||
object lengths to the stream: SvPersistStream::WriteDummyLen,
|
||||
SvPersistStream::WriteLen and SvPersistStream::ReadLen.
|
||||
|
||||
[Example]
|
||||
|
||||
One example is described in the constructor.
|
||||
Assume a ring-like dependency, where A references B,
|
||||
B itself references C, and C references to both D and A.
|
||||
|
||||
The order of the objects upon saving and loading does not matter,
|
||||
as long objects are loaded in the same order they were stored.
|
||||
|
||||
Saving: Loading:
|
||||
A,B,C,D A,B,C,D correct
|
||||
B,A,C,D B,A,C,D correct
|
||||
C,A,B,D A,B,C,D wrong
|
||||
A,B,C,D A,B,C wrong
|
||||
|
||||
@note The file formats DBG_UTIL and !DBG_UTIL differ, but we can read from
|
||||
both versions.
|
||||
*/
|
||||
class TOOLS_DLLPUBLIC SvPersistStream : public SvStream
|
||||
{
|
||||
public:
|
||||
typedef UniqueIndex<SvPersistBase>::Index Index;
|
||||
|
||||
private:
|
||||
typedef std::map<SvPersistBase*, Index> PersistBaseMap;
|
||||
|
||||
SvClassManager & rClassMgr;
|
||||
SvStream * pStm;
|
||||
PersistBaseMap aPTable; // reversed pointer and key
|
||||
UniqueIndex<SvPersistBase>
|
||||
aPUIdx;
|
||||
Index nStartIdx;
|
||||
|
||||
virtual std::size_t GetData(void* pData, std::size_t nSize) override;
|
||||
virtual std::size_t PutData(const void* pData, std::size_t nSize) override;
|
||||
virtual sal_uInt64 SeekPos(sal_uInt64 nPos) override;
|
||||
virtual void FlushData() override;
|
||||
|
||||
protected:
|
||||
void WriteObj( sal_uInt8 nHdr, SvPersistBase * pObj );
|
||||
void ReadObj( SvPersistBase * & rpObj );
|
||||
|
||||
public:
|
||||
virtual void ResetError() override;
|
||||
|
||||
SvPersistStream( SvClassManager &, SvStream * pStream );
|
||||
virtual ~SvPersistStream() override;
|
||||
|
||||
SvPersistBase * GetObject( Index nIdx ) const;
|
||||
Index GetIndex( SvPersistBase * ) const;
|
||||
|
||||
static void WriteCompressed( SvStream & rStm, sal_uInt32 nVal );
|
||||
static sal_uInt32 ReadCompressed( SvStream & rStm );
|
||||
|
||||
sal_uInt32 WriteDummyLen();
|
||||
void WriteLen( sal_uInt32 nLenPos );
|
||||
sal_uInt32 ReadLen( sal_uInt32 * pTestPos );
|
||||
|
||||
SvPersistStream& WritePointer( SvPersistBase * pObj );
|
||||
SvPersistStream& ReadPointer( SvPersistBase * & rpObj );
|
||||
TOOLS_DLLPUBLIC friend SvPersistStream& WriteSvPersistBase(SvPersistStream &, SvPersistBase *);
|
||||
TOOLS_DLLPUBLIC friend SvPersistStream& operator >> (SvPersistStream &, SvPersistBase * &);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -100,7 +100,6 @@
|
||||
#include <svx/imapdlg.hxx>
|
||||
|
||||
#include "editutil.hxx"
|
||||
#include <svx/svdfield.hxx>
|
||||
|
||||
#include "dwfunctr.hxx"
|
||||
#include "acredlin.hxx"
|
||||
@@ -262,14 +261,6 @@ void ScDLL::Init()
|
||||
sc::SearchResultsDlgWrapper::RegisterChildWindow(false, pMod);
|
||||
ScCondFormatDlgWrapper::RegisterChildWindow(false, pMod);
|
||||
|
||||
// EditEngine Field; insofar not already defined in OfficeApplication::Init
|
||||
SvClassManager& rClassManager = SvxFieldItem::GetClassManager();
|
||||
rClassManager.Register(SvxPagesField::StaticClassId(), SvxPagesField::CreateInstance);
|
||||
rClassManager.Register(SvxFileField::StaticClassId(), SvxFileField::CreateInstance);
|
||||
rClassManager.Register(SvxTableField::StaticClassId(), SvxTableField::CreateInstance);
|
||||
|
||||
SdrRegisterFieldClasses(); // Register SvDraw fields
|
||||
|
||||
// Add 3DObject Factory
|
||||
E3dObjFactory();
|
||||
|
||||
|
@@ -25,7 +25,6 @@
|
||||
#include <unotools/configmgr.hxx>
|
||||
#include <unotools/moduleoptions.hxx>
|
||||
#include <svx/fmobjfac.hxx>
|
||||
#include <svx/svdfield.hxx>
|
||||
#include <svx/objfac3d.hxx>
|
||||
#include <vcl/svapp.hxx>
|
||||
|
||||
@@ -277,9 +276,6 @@ void SdDLL::Init()
|
||||
// register your controllers here
|
||||
RegisterControllers(pModule);
|
||||
|
||||
// register SvDraw-Fields
|
||||
SdrRegisterFieldClasses();
|
||||
|
||||
// register 3D-object-factory
|
||||
E3dObjFactory();
|
||||
|
||||
|
@@ -18,27 +18,8 @@
|
||||
*/
|
||||
|
||||
#include <editeng/eeitem.hxx>
|
||||
|
||||
#include <editeng/measfld.hxx>
|
||||
#include <svx/svdotext.hxx>
|
||||
#include <svx/svdfield.hxx>
|
||||
|
||||
static bool bInit = false;
|
||||
|
||||
// Do not remove this, it is still used in src536a!
|
||||
void SdrRegisterFieldClasses()
|
||||
{
|
||||
if ( !bInit )
|
||||
{
|
||||
SvxFieldItem::GetClassManager().SV_CLASS_REGISTER(SdrMeasureField);
|
||||
SvxFieldItem::GetClassManager().SV_CLASS_REGISTER(SvxHeaderField);
|
||||
SvxFieldItem::GetClassManager().SV_CLASS_REGISTER(SvxFooterField);
|
||||
SvxFieldItem::GetClassManager().SV_CLASS_REGISTER(SvxDateTimeField);
|
||||
bInit = true;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////// */
|
||||
|
||||
bool SdrTextObj::CalcFieldValue(const SvxFieldItem& /*rField*/, sal_Int32 /*nPara*/, sal_uInt16 /*nPos*/,
|
||||
bool /*bEdit*/, Color*& /*rpTxtColor*/, Color*& /*rpFldColor*/, OUString& /*rRet*/) const
|
||||
|
@@ -40,7 +40,6 @@
|
||||
#include <comphelper/processfactory.hxx>
|
||||
|
||||
#include <svx/fmobjfac.hxx>
|
||||
#include <svx/svdfield.hxx>
|
||||
#include <svx/objfac3d.hxx>
|
||||
#include <editeng/acorrcfg.hxx>
|
||||
|
||||
@@ -110,9 +109,6 @@ SwDLL::SwDLL()
|
||||
pDocFact->SetDocumentServiceName("com.sun.star.text.TextDocument");
|
||||
}
|
||||
|
||||
// register SvDraw-Fields
|
||||
SdrRegisterFieldClasses();
|
||||
|
||||
// register 3D-object-Factory
|
||||
E3dObjFactory();
|
||||
|
||||
|
@@ -70,7 +70,6 @@ $(eval $(call gb_Library_add_exception_objects,tl,\
|
||||
tools/source/misc/cpuid \
|
||||
tools/source/misc/extendapplicationenvironment \
|
||||
tools/source/ref/globname \
|
||||
tools/source/ref/pstm \
|
||||
tools/source/ref/ref \
|
||||
tools/source/stream/stream \
|
||||
tools/source/stream/vcompat \
|
||||
|
@@ -1,516 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include <tools/pstm.hxx>
|
||||
#include <rtl/strbuf.hxx>
|
||||
#include <osl/diagnose.h>
|
||||
#include <sal/log.hxx>
|
||||
|
||||
#define STOR_NO_OPTIMIZE
|
||||
|
||||
void SvClassManager::Register( sal_Int32 nClassId, SvCreateInstancePersist pFunc )
|
||||
{
|
||||
#ifdef DBG_UTIL
|
||||
SvCreateInstancePersist p;
|
||||
p = Get( nClassId );
|
||||
assert( (!p || p == pFunc) && "register class with same id");
|
||||
#endif
|
||||
aAssocTable.insert(Map::value_type(nClassId, pFunc));
|
||||
}
|
||||
|
||||
SvCreateInstancePersist SvClassManager::Get( sal_Int32 nClassId )
|
||||
{
|
||||
Map::const_iterator i(aAssocTable.find(nClassId));
|
||||
return i == aAssocTable.end() ? nullptr : i->second;
|
||||
}
|
||||
|
||||
/** Constructor
|
||||
|
||||
@param rMgr Stores factories for objects that can persisted
|
||||
@param pStream This stream is used as the medium for PersistStream
|
||||
@param nStartIdxP Start value for object identifier (set > 0 )
|
||||
|
||||
@warning Objects rMgr and pStream must not be manipulated while used in
|
||||
SvPersistStream. An Exception to this is pvStream
|
||||
(cf. <SvPersistStream::SetStream>).
|
||||
@see SvPersistStream::SetStream
|
||||
*/
|
||||
SvPersistStream::SvPersistStream( SvClassManager & rMgr, SvStream * pStream )
|
||||
: rClassMgr( rMgr )
|
||||
, pStm( pStream )
|
||||
, aPUIdx( UniqueIndex<SvPersistBase>::Index(1) )
|
||||
, nStartIdx( 1 )
|
||||
{
|
||||
m_isWritable = true;
|
||||
if( pStm )
|
||||
{
|
||||
SetVersion( pStm->GetVersion() );
|
||||
SetError( pStm->GetError() );
|
||||
SyncSvStream( pStm->Tell() );
|
||||
}
|
||||
}
|
||||
|
||||
SvPersistStream::~SvPersistStream()
|
||||
{
|
||||
if( pStm != nullptr )
|
||||
{
|
||||
SyncSysStream();
|
||||
pStm->SetError( GetError() );
|
||||
pStm = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void SvPersistStream::ResetError()
|
||||
{
|
||||
SvStream::ResetError();
|
||||
assert(pStm && "stream not set");
|
||||
pStm->ResetError();
|
||||
}
|
||||
|
||||
std::size_t SvPersistStream::GetData( void* pData, std::size_t nSize )
|
||||
{
|
||||
assert(pStm && "stream not set");
|
||||
std::size_t const nRet = pStm->ReadBytes( pData, nSize );
|
||||
SetError( pStm->GetError() );
|
||||
return nRet;
|
||||
}
|
||||
|
||||
std::size_t SvPersistStream::PutData( const void* pData, std::size_t nSize )
|
||||
{
|
||||
assert(pStm && "stream not set");
|
||||
std::size_t const nRet = pStm->WriteBytes( pData, nSize );
|
||||
SetError( pStm->GetError() );
|
||||
return nRet;
|
||||
}
|
||||
|
||||
sal_uInt64 SvPersistStream::SeekPos(sal_uInt64 const nPos)
|
||||
{
|
||||
assert(pStm && "stream not set");
|
||||
sal_uInt64 nRet = pStm->Seek( nPos );
|
||||
SetError( pStm->GetError() );
|
||||
return nRet;
|
||||
}
|
||||
|
||||
void SvPersistStream::FlushData()
|
||||
{
|
||||
}
|
||||
|
||||
SvPersistStream::Index SvPersistStream::GetIndex( SvPersistBase * pObj ) const
|
||||
{
|
||||
PersistBaseMap::const_iterator it = aPTable.find( pObj );
|
||||
if( it == aPTable.end() )
|
||||
{
|
||||
return Index(0);
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
SvPersistBase * SvPersistStream::GetObject( Index nIdx ) const
|
||||
{
|
||||
if( nIdx >= nStartIdx )
|
||||
return aPUIdx.Get( nIdx );
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#define LEN_1 0x80
|
||||
#define LEN_2 0x40
|
||||
#define LEN_4 0x20
|
||||
#define LEN_5 0x10
|
||||
|
||||
/** Reads a compressed word from the stream.
|
||||
|
||||
For details on what format is used for compression, see
|
||||
<SvPersistStream::WriteCompressed>.
|
||||
|
||||
@param rStm Source to read compressed data from
|
||||
|
||||
@return Uncompressed word
|
||||
@see SvPersistStream::WriteCompressed
|
||||
*/
|
||||
sal_uInt32 SvPersistStream::ReadCompressed( SvStream & rStm )
|
||||
{
|
||||
sal_uInt32 nRet(0);
|
||||
sal_uInt8 nMask;
|
||||
rStm.ReadUChar( nMask );
|
||||
if( nMask & LEN_1 )
|
||||
nRet = ~LEN_1 & nMask;
|
||||
else if( nMask & LEN_2 )
|
||||
{
|
||||
nRet = ~LEN_2 & nMask;
|
||||
nRet <<= 8;
|
||||
rStm.ReadUChar( nMask );
|
||||
nRet |= nMask;
|
||||
}
|
||||
else if( nMask & LEN_4 )
|
||||
{
|
||||
nRet = ~LEN_4 & nMask;
|
||||
nRet <<= 8;
|
||||
rStm.ReadUChar( nMask );
|
||||
nRet |= nMask;
|
||||
nRet <<= 16;
|
||||
sal_uInt16 n;
|
||||
rStm.ReadUInt16( n );
|
||||
nRet |= n;
|
||||
}
|
||||
else if( nMask & LEN_5 )
|
||||
{
|
||||
if( nMask & 0x0F )
|
||||
{
|
||||
rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
|
||||
OSL_FAIL( "format error" );
|
||||
}
|
||||
rStm.ReadUInt32( nRet );
|
||||
}
|
||||
else
|
||||
{
|
||||
rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
|
||||
OSL_FAIL( "format error" );
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
/** Writes compressed stream
|
||||
|
||||
@param rStm Source for writing compressed data
|
||||
@param nVal This value will be compressed and written
|
||||
|
||||
nVal is compressed and written to stream using the following algorithm
|
||||
nVal < 0x80 => 0x80 + nVal of size 1 Byte.
|
||||
nVal < 0x4000 => 0x4000 + nVal of size 2 Byte.
|
||||
nVal < 0x20000000 => 0x20000000 + nVal of size 4 Byte.
|
||||
nVal > 0x1FFFFFFF => 0x1000000000+ nVal of size 5 Byte.
|
||||
|
||||
@see SvPersistStream::ReadCompressed
|
||||
*/
|
||||
void SvPersistStream::WriteCompressed( SvStream & rStm, sal_uInt32 nVal )
|
||||
{
|
||||
#ifdef STOR_NO_OPTIMIZE
|
||||
if( nVal < 0x80 )
|
||||
rStm.WriteUChar( LEN_1 | nVal );
|
||||
else if( nVal < 0x4000 )
|
||||
{
|
||||
rStm.WriteUChar( LEN_2 | (nVal >> 8) );
|
||||
rStm.WriteUChar( nVal );
|
||||
}
|
||||
else if( nVal < 0x20000000 )
|
||||
{
|
||||
// highest sal_uInt8
|
||||
rStm.WriteUChar( LEN_4 | (nVal >> 24) );
|
||||
// 2nd highest sal_uInt8
|
||||
rStm.WriteUChar( nVal >> 16 );
|
||||
rStm.WriteUInt16( nVal );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
rStm.WriteUChar( LEN_5 );
|
||||
rStm.WriteUInt32( nVal );
|
||||
}
|
||||
}
|
||||
|
||||
/** This method writes length value of 4 Bytes to the stream and returns the
|
||||
stream position.
|
||||
|
||||
Example:
|
||||
@code
|
||||
sal_uInt32 nObjPos = rStm.WriteDummyLen();
|
||||
...
|
||||
// write data
|
||||
...
|
||||
rStm.WriteLen( nObjPos );
|
||||
@endcode
|
||||
|
||||
@return Position of stream behind length value
|
||||
|
||||
@see SvPersistStream::ReadLen
|
||||
@see SvPersistStream::WriteLen
|
||||
*/
|
||||
sal_uInt32 SvPersistStream::WriteDummyLen()
|
||||
{
|
||||
WriteUInt32( 0 );
|
||||
return Tell();
|
||||
}
|
||||
|
||||
/** Write difference between current position and nObjPos
|
||||
as sal_uInt32 to position nObjPos-4 in the stream.
|
||||
|
||||
Afterwards, reset stream to old position.
|
||||
|
||||
Example: Difference does not contain length value
|
||||
@code
|
||||
sal_uInt32 nObjPos = rStm.WriteDummyLen();
|
||||
...
|
||||
// write data
|
||||
...
|
||||
rStm.WriteLen( nObjPos );
|
||||
// write more data
|
||||
@endcode
|
||||
|
||||
@param nObjPos Position+4, on which length is written to
|
||||
|
||||
@see SvPersistStream::ReadLen
|
||||
@see SvPersistStream::WriteDummyLen
|
||||
*/
|
||||
void SvPersistStream::WriteLen( sal_uInt32 nObjPos )
|
||||
{
|
||||
sal_uInt32 nPos = Tell();
|
||||
sal_uInt32 nLen = nPos - nObjPos;
|
||||
// Length in stream must be 4 Bytes
|
||||
Seek( nObjPos - sizeof( sal_uInt32 ) );
|
||||
// write length
|
||||
WriteUInt32( nLen );
|
||||
Seek( nPos );
|
||||
}
|
||||
|
||||
/** Read a length value written to stream
|
||||
|
||||
@param pTestPos Position of the stream after reading length. May be NULL.
|
||||
|
||||
@see SvPersistStream::WriteDummyLen
|
||||
@see SvPersistStream::WriteLen
|
||||
*/
|
||||
sal_uInt32 SvPersistStream::ReadLen( sal_uInt32 * pTestPos )
|
||||
{
|
||||
sal_uInt32 nLen;
|
||||
ReadUInt32( nLen );
|
||||
if( pTestPos )
|
||||
*pTestPos = Tell();
|
||||
return nLen;
|
||||
}
|
||||
|
||||
// File format backward-compatible
|
||||
#ifdef STOR_NO_OPTIMIZE
|
||||
#define P_VER (sal_uInt8)0x00
|
||||
#else
|
||||
#define P_VER (sal_uInt8)0x01
|
||||
#endif
|
||||
#define P_VER_MASK (sal_uInt8)0x0F
|
||||
#define P_ID_0 (sal_uInt8)0x80
|
||||
#define P_OBJ (sal_uInt8)0x40
|
||||
#define P_DBGUTIL (sal_uInt8)0x20
|
||||
#define P_ID (sal_uInt8)0x10
|
||||
#ifdef STOR_NO_OPTIMIZE
|
||||
#define P_STD P_DBGUTIL
|
||||
#else
|
||||
#define P_STD 0
|
||||
#endif
|
||||
|
||||
static void WriteId
|
||||
(
|
||||
SvStream & rStm,
|
||||
sal_uInt8 nHdr,
|
||||
sal_uInt32 nId,
|
||||
sal_uInt16 nClassId
|
||||
)
|
||||
{
|
||||
#ifdef STOR_NO_OPTIMIZE
|
||||
nHdr |= P_ID;
|
||||
#endif
|
||||
nHdr |= P_VER;
|
||||
if( nHdr & P_ID )
|
||||
{
|
||||
if( (nHdr & P_OBJ) || nId != 0 )
|
||||
{ // Id set only for pointers or DBGUTIL
|
||||
rStm.WriteUChar( nHdr );
|
||||
SvPersistStream::WriteCompressed( rStm, nId );
|
||||
}
|
||||
else
|
||||
{ // NULL Pointer
|
||||
rStm.WriteUChar( nHdr | P_ID_0 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
rStm.WriteUChar( nHdr );
|
||||
|
||||
if( (nHdr & P_DBGUTIL) || (nHdr & P_OBJ) )
|
||||
// Objects always have a class id
|
||||
// Pointers only for DBG_UTIL and != NULL
|
||||
SvPersistStream::WriteCompressed( rStm, nClassId );
|
||||
}
|
||||
|
||||
static void ReadId
|
||||
(
|
||||
SvStream & rStm,
|
||||
sal_uInt8 & nHdr,
|
||||
SvPersistStream::Index & nId,
|
||||
sal_uInt16 & nClassId
|
||||
)
|
||||
{
|
||||
nClassId = 0;
|
||||
rStm.ReadUChar( nHdr );
|
||||
if( nHdr & P_ID_0 )
|
||||
nId = SvPersistStream::Index(0);
|
||||
else
|
||||
{
|
||||
if( (nHdr & P_VER_MASK) == 0 )
|
||||
{
|
||||
if( (nHdr & P_DBGUTIL) || !(nHdr & P_OBJ) )
|
||||
nId = SvPersistStream::Index(SvPersistStream::ReadCompressed( rStm ));
|
||||
else
|
||||
nId = SvPersistStream::Index(0);
|
||||
}
|
||||
else if( nHdr & P_ID )
|
||||
nId = SvPersistStream::Index(SvPersistStream::ReadCompressed( rStm ));
|
||||
|
||||
if( (nHdr & P_DBGUTIL) || (nHdr & P_OBJ) )
|
||||
nClassId = (sal_uInt16)SvPersistStream::ReadCompressed( rStm );
|
||||
}
|
||||
}
|
||||
|
||||
void SvPersistStream::WriteObj
|
||||
(
|
||||
sal_uInt8 nHdr,
|
||||
SvPersistBase * pObj
|
||||
)
|
||||
{
|
||||
#ifdef STOR_NO_OPTIMIZE
|
||||
sal_uInt32 nObjPos = 0;
|
||||
if( nHdr & P_DBGUTIL )
|
||||
// remember position for length value
|
||||
nObjPos = WriteDummyLen();
|
||||
#endif
|
||||
pObj->Save( *this );
|
||||
#ifdef STOR_NO_OPTIMIZE
|
||||
if( nHdr & P_DBGUTIL )
|
||||
WriteLen( nObjPos );
|
||||
#endif
|
||||
}
|
||||
|
||||
SvPersistStream& SvPersistStream::WritePointer
|
||||
(
|
||||
SvPersistBase * pObj
|
||||
)
|
||||
{
|
||||
sal_uInt8 nP = P_STD;
|
||||
|
||||
if( pObj )
|
||||
{
|
||||
Index nId = GetIndex( pObj );
|
||||
if( nId )
|
||||
nP |= P_ID;
|
||||
else
|
||||
{
|
||||
nId = aPUIdx.Insert( pObj );
|
||||
aPTable[ pObj ] = nId;
|
||||
nP |= P_OBJ;
|
||||
}
|
||||
WriteId( *this, nP, (sal_uInt32)nId, pObj->GetClassId() );
|
||||
if( nP & P_OBJ )
|
||||
WriteObj( nP, pObj );
|
||||
}
|
||||
else
|
||||
{ // NULL Pointer
|
||||
WriteId( *this, nP | P_ID, 0, 0 );
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void SvPersistStream::ReadObj
|
||||
(
|
||||
SvPersistBase * & rpObj
|
||||
)
|
||||
{
|
||||
sal_uInt8 nHdr;
|
||||
Index nId(0);
|
||||
sal_uInt16 nClassId;
|
||||
|
||||
rpObj = nullptr; // specification: 0 in case of error
|
||||
ReadId( *this, nHdr, nId, nClassId );
|
||||
|
||||
// get version number through masking
|
||||
if( P_VER < (nHdr & P_VER_MASK) )
|
||||
{
|
||||
SetError( SVSTREAM_FILEFORMAT_ERROR );
|
||||
OSL_FAIL( "false version" );
|
||||
}
|
||||
|
||||
if( !(nHdr & P_ID_0) && GetError() == ERRCODE_NONE )
|
||||
{
|
||||
if( P_OBJ & nHdr )
|
||||
{ // read object, nId only set for P_DBGUTIL
|
||||
SAL_WARN_IF( (nHdr & P_DBGUTIL) && nullptr != aPUIdx.Get( nId ), "tools","object already exists");
|
||||
SvCreateInstancePersist pFunc = rClassMgr.Get( nClassId );
|
||||
|
||||
sal_uInt32 nObjLen(0), nObjPos(0);
|
||||
if( nHdr & P_DBGUTIL )
|
||||
nObjLen = ReadLen( &nObjPos );
|
||||
if( !pFunc )
|
||||
{
|
||||
#ifdef DBG_UTIL
|
||||
SAL_INFO( "tools", "no class with id: " << nClassId << " registered" );
|
||||
#else
|
||||
(void)nObjLen;
|
||||
#endif
|
||||
SetError( ERRCODE_IO_NOFACTORY );
|
||||
return;
|
||||
}
|
||||
pFunc( &rpObj );
|
||||
// Save reference
|
||||
rpObj->AddFirstRef();
|
||||
|
||||
// insert into table
|
||||
const Index nNewId = aPUIdx.Insert( rpObj );
|
||||
// in order to restore state after saving
|
||||
aPTable[ rpObj ] = nNewId;
|
||||
SAL_WARN_IF( (nHdr & P_DBGUTIL) && (nId != nNewId), "tools","read write id conflict: not the same");
|
||||
|
||||
rpObj->Load( *this );
|
||||
SAL_WARN_IF( nObjLen + nObjPos != Tell(), "tools", "false object len: read = " << (Tell() - nObjPos)
|
||||
<< ", should = " << nObjLen);
|
||||
rpObj->RestoreNoDelete();
|
||||
rpObj->ReleaseRef();
|
||||
}
|
||||
else
|
||||
{
|
||||
rpObj = GetObject( nId );
|
||||
SAL_WARN_IF(rpObj==nullptr,"tools","object does not exist");
|
||||
SAL_WARN_IF( rpObj->GetClassId() != nClassId , "tools" , "class mismatch" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SvPersistStream& SvPersistStream::ReadPointer
|
||||
(
|
||||
SvPersistBase * & rpObj
|
||||
)
|
||||
{
|
||||
ReadObj( rpObj );
|
||||
return *this;
|
||||
}
|
||||
|
||||
SvPersistStream& WriteSvPersistBase
|
||||
(
|
||||
SvPersistStream & rStm,
|
||||
SvPersistBase * pObj
|
||||
)
|
||||
{
|
||||
return rStm.WritePointer( pObj );
|
||||
}
|
||||
|
||||
SvPersistStream& operator >>
|
||||
(
|
||||
SvPersistStream & rStm,
|
||||
SvPersistBase * & rpObj
|
||||
)
|
||||
{
|
||||
return rStm.ReadPointer( rpObj );
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
Reference in New Issue
Block a user