diff options
Diffstat (limited to 'include/tools/pstm.hxx')
-rw-r--r-- | include/tools/pstm.hxx | 135 |
1 files changed, 3 insertions, 132 deletions
diff --git a/include/tools/pstm.hxx b/include/tools/pstm.hxx index 6292a52c897f..1f55c7c0fa0f 100644 --- a/include/tools/pstm.hxx +++ b/include/tools/pstm.hxx @@ -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 |