blob: 7ce636c609ac83c6271107bd20653b8eeba59336 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <svl/brdcst.hxx>
#include <boost/shared_ptr.hpp>
#include <deque>
#ifndef DELETEZ
#define DELETEZ(pPtr) { delete pPtr; pPtr = 0; }
#endif
struct SfxPoolVersion_Impl
{
sal_uInt16 _nVer;
sal_uInt16 _nStart, _nEnd;
sal_uInt16* _pMap;
SfxPoolVersion_Impl( sal_uInt16 nVer, sal_uInt16 nStart, sal_uInt16 nEnd,
sal_uInt16 *pMap )
: _nVer( nVer ),
_nStart( nStart ),
_nEnd( nEnd ),
_pMap( pMap )
{}
SfxPoolVersion_Impl( const SfxPoolVersion_Impl &rOrig )
: _nVer( rOrig._nVer ),
_nStart( rOrig._nStart ),
_nEnd( rOrig._nEnd ),
_pMap( rOrig._pMap )
{}
};
typedef std::deque<SfxPoolItem*> SfxPoolItemArrayBase_Impl;
typedef boost::shared_ptr< SfxPoolVersion_Impl > SfxPoolVersion_ImplPtr;
typedef std::deque< SfxPoolVersion_ImplPtr > SfxPoolVersionArr_Impl;
struct SfxPoolItemArray_Impl: public SfxPoolItemArrayBase_Impl
{
size_t nFirstFree;
SfxPoolItemArray_Impl ()
: nFirstFree( 0 )
{}
};
class SfxStyleSheetIterator;
struct SfxItemPool_Impl
{
SfxBroadcaster aBC;
SfxPoolItemArray_Impl** ppPoolItems;
SfxPoolVersionArr_Impl aVersions;
sal_uInt16 nVersion;
sal_uInt16 nLoadingVersion;
sal_uInt16 nInitRefCount; // 1, beim Laden ggf. 2
sal_uInt16 nVerStart, nVerEnd; // WhichRange in Versions
sal_uInt16 nStoringStart, nStoringEnd; // zu speichernder Range
sal_uInt8 nMajorVer, nMinorVer; // Pool selbst
SfxMapUnit eDefMetric;
FASTBOOL bInSetItem;
FASTBOOL bStreaming; // in Load() bzw. Store()
SfxItemPool_Impl( sal_uInt16 nStart, sal_uInt16 nEnd )
: ppPoolItems (new SfxPoolItemArray_Impl*[ nEnd - nStart + 1])
, nLoadingVersion(0)
, nInitRefCount(0)
, nVerStart(0)
, nVerEnd(0)
, nStoringStart(0)
, nStoringEnd(0)
, nMajorVer(0)
, nMinorVer(0)
, bInSetItem(false)
, bStreaming(false)
{
memset( ppPoolItems, 0, sizeof( SfxPoolItemArray_Impl* ) * ( nEnd - nStart + 1) );
}
~SfxItemPool_Impl()
{
delete[] ppPoolItems;
}
void DeleteItems()
{
delete[] ppPoolItems;
ppPoolItems = 0;
}
};
// -----------------------------------------------------------------------
// IBM-C-Set mag keine doppelten Defines
#ifdef DBG
# undef DBG
#endif
#if defined(DBG_UTIL) && defined(MSC)
#define SFX_TRACE(s,p) \
{ \
ByteString aPtr(RTL_CONSTASCII_STRINGPARAM("0x0000:0x0000")); \
_snprintf(const_cast< sal_Char *>(aPtr.GetBuffer()), aPtr.Len(), \
"%lp", p ); \
aPtr.Insert(s, 0); \
DbgTrace( aPtr.GetBuffer() ); \
}
#define DBG(x) x
#else
#define SFX_TRACE(s,p)
#define DBG(x)
#endif
#define CHECK_FILEFORMAT( rStream, nTag ) \
{ sal_uInt16 nFileTag; \
rStream >> nFileTag; \
if ( nTag != nFileTag ) \
{ \
DBG_ERROR( #nTag ); /*! s.u. */ \
/*! error-code setzen und auswerten! */ \
(rStream).SetError(SVSTREAM_FILEFORMAT_ERROR); \
pImp->bStreaming = sal_False; \
return rStream; \
} \
}
#define CHECK_FILEFORMAT_RELEASE( rStream, nTag, pPointer ) \
{ sal_uInt16 nFileTag; \
rStream >> nFileTag; \
if ( nTag != nFileTag ) \
{ \
DBG_ERROR( #nTag ); /*! s.u. */ \
/*! error-code setzen und auswerten! */ \
(rStream).SetError(SVSTREAM_FILEFORMAT_ERROR); \
pImp->bStreaming = sal_False; \
delete pPointer; \
return rStream; \
} \
}
#define CHECK_FILEFORMAT2( rStream, nTag1, nTag2 ) \
{ sal_uInt16 nFileTag; \
rStream >> nFileTag; \
if ( nTag1 != nFileTag && nTag2 != nFileTag ) \
{ \
DBG_ERROR( #nTag1 ); /*! s.u. */ \
/*! error-code setzen und auswerten! */ \
(rStream).SetError(SVSTREAM_FILEFORMAT_ERROR); \
pImp->bStreaming = sal_False; \
return rStream; \
} \
}
#define SFX_ITEMPOOL_VER_MAJOR sal_uInt8(2)
#define SFX_ITEMPOOL_VER_MINOR sal_uInt8(0)
#define SFX_ITEMPOOL_TAG_STARTPOOL_4 sal_uInt16(0x1111)
#define SFX_ITEMPOOL_TAG_STARTPOOL_5 sal_uInt16(0xBBBB)
#define SFX_ITEMPOOL_TAG_ITEMPOOL sal_uInt16(0xAAAA)
#define SFX_ITEMPOOL_TAG_ITEMS sal_uInt16(0x2222)
#define SFX_ITEMPOOL_TAG_ITEM sal_uInt16(0x7777)
#define SFX_ITEMPOOL_TAG_SIZES sal_uInt16(0x3333)
#define SFX_ITEMPOOL_TAG_DEFAULTS sal_uInt16(0x4444)
#define SFX_ITEMPOOL_TAG_VERSIONMAP sal_uInt16(0x5555)
#define SFX_ITEMPOOL_TAG_HEADER sal_uInt16(0x6666)
#define SFX_ITEMPOOL_TAG_ENDPOOL sal_uInt16(0xEEEE)
#define SFX_ITEMPOOL_TAG_TRICK4OLD sal_uInt16(0xFFFF)
#define SFX_ITEMPOOL_REC sal_uInt8(0x01)
#define SFX_ITEMPOOL_REC_HEADER sal_uInt8(0x10)
#define SFX_ITEMPOOL_REC_VERSIONMAP sal_uInt16(0x0020)
#define SFX_ITEMPOOL_REC_WHICHIDS sal_uInt16(0x0030)
#define SFX_ITEMPOOL_REC_ITEMS sal_uInt16(0x0040)
#define SFX_ITEMPOOL_REC_DEFAULTS sal_uInt16(0x0050)
#define SFX_ITEMSET_REC sal_uInt8(0x02)
#define SFX_STYLES_REC sal_uInt8(0x03)
#define SFX_STYLES_REC_HEADER sal_uInt16(0x0010)
#define SFX_STYLES_REC_STYLES sal_uInt16(0x0020)
//========================================================================
inline sal_uInt16 SfxItemPool::GetIndex_Impl(sal_uInt16 nWhich) const
{
DBG_CHKTHIS(SfxItemPool, 0);
DBG_ASSERT(nWhich >= nStart && nWhich <= nEnd, "Which-Id nicht im Pool-Bereich");
return nWhich - nStart;
}