Branch data 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 : : #include <svl/brdcst.hxx>
20 : : #include <boost/shared_ptr.hpp>
21 : : #include <deque>
22 : : #include <vector>
23 : :
24 : : #ifndef DELETEZ
25 : : #define DELETEZ(pPtr) { delete pPtr; pPtr = 0; }
26 : : #endif
27 : :
28 : :
29 : : struct SfxPoolVersion_Impl
30 : : {
31 : : sal_uInt16 _nVer;
32 : : sal_uInt16 _nStart, _nEnd;
33 : : const sal_uInt16* _pMap;
34 : :
35 : 236539 : SfxPoolVersion_Impl( sal_uInt16 nVer, sal_uInt16 nStart, sal_uInt16 nEnd,
36 : : const sal_uInt16 *pMap )
37 : : : _nVer( nVer ),
38 : : _nStart( nStart ),
39 : : _nEnd( nEnd ),
40 : 236539 : _pMap( pMap )
41 : 236539 : {}
42 : 365 : SfxPoolVersion_Impl( const SfxPoolVersion_Impl &rOrig )
43 : : : _nVer( rOrig._nVer ),
44 : : _nStart( rOrig._nStart ),
45 : : _nEnd( rOrig._nEnd ),
46 : 365 : _pMap( rOrig._pMap )
47 : 365 : {}
48 : : };
49 : :
50 : : typedef std::vector<SfxPoolItem*> SfxPoolItemArrayBase_Impl;
51 : :
52 : : typedef boost::shared_ptr< SfxPoolVersion_Impl > SfxPoolVersion_ImplPtr;
53 : : typedef std::deque< SfxPoolVersion_ImplPtr > SfxPoolVersionArr_Impl;
54 : :
55 : 373094 : struct SfxPoolItemArray_Impl: public SfxPoolItemArrayBase_Impl
56 : : {
57 : : size_t nFirstFree;
58 : :
59 : 408243 : SfxPoolItemArray_Impl ()
60 : 408243 : : nFirstFree( 0 )
61 : 408243 : {}
62 : : };
63 : :
64 : : struct SfxItemPool_Impl
65 : : {
66 : : SfxBroadcaster aBC;
67 : : std::vector<SfxPoolItemArray_Impl*> maPoolItems;
68 : : std::vector<SfxItemPoolUser*> maSfxItemPoolUsers; /// ObjectUser section
69 : : rtl::OUString aName;
70 : : SfxPoolItem** ppPoolDefaults;
71 : : SfxPoolItem** ppStaticDefaults;
72 : : SfxItemPool* mpMaster;
73 : : SfxItemPool* mpSecondary;
74 : : sal_uInt16* mpPoolRanges;
75 : : SfxPoolVersionArr_Impl aVersions;
76 : : sal_uInt16 mnStart;
77 : : sal_uInt16 mnEnd;
78 : : sal_uInt16 mnFileFormatVersion;
79 : : sal_uInt16 nVersion;
80 : : sal_uInt16 nLoadingVersion;
81 : : sal_uInt16 nInitRefCount; // 1, beim Laden ggf. 2
82 : : sal_uInt16 nVerStart, nVerEnd; // WhichRange in Versions
83 : : sal_uInt16 nStoringStart, nStoringEnd; // zu speichernder Range
84 : : sal_uInt8 nMajorVer, nMinorVer; // Pool selbst
85 : : SfxMapUnit eDefMetric;
86 : : bool bInSetItem;
87 : : bool bStreaming; // in Load() bzw. Store()
88 : : bool mbPersistentRefCounts;
89 : :
90 : 50074 : SfxItemPool_Impl( SfxItemPool* pMaster, const rtl::OUString& rName, sal_uInt16 nStart, sal_uInt16 nEnd )
91 : : : maPoolItems(nEnd - nStart + 1, static_cast<SfxPoolItemArray_Impl*>(NULL))
92 : : , aName(rName)
93 [ + - ]: 50074 : , ppPoolDefaults(new SfxPoolItem* [nEnd - nStart + 1])
94 : : , ppStaticDefaults(0)
95 : : , mpMaster(pMaster)
96 : : , mpSecondary(NULL)
97 : : , mpPoolRanges(NULL)
98 : : , mnStart(nStart)
99 : : , mnEnd(nEnd)
100 : : , mnFileFormatVersion(0)
101 : : , nLoadingVersion(0)
102 : : , nInitRefCount(0)
103 : : , nVerStart(0)
104 : : , nVerEnd(0)
105 : : , nStoringStart(0)
106 : : , nStoringEnd(0)
107 : : , nMajorVer(0)
108 : : , nMinorVer(0)
109 : : , bInSetItem(false)
110 [ + - ][ + - ]: 100148 : , bStreaming(false)
[ + - ]
111 : : {
112 : : DBG_ASSERT(mnStart, "Start-Which-Id must be greater 0" );
113 : 50074 : memset( ppPoolDefaults, 0, sizeof( SfxPoolItem* ) * (nEnd - nStart + 1));
114 : 50074 : }
115 : :
116 : 44770 : ~SfxItemPool_Impl()
117 : 44770 : {
118 [ + - ]: 44770 : DeleteItems();
119 : 44770 : }
120 : :
121 : 89540 : void DeleteItems()
122 : : {
123 : 89540 : std::vector<SfxPoolItemArray_Impl*>::iterator itr = maPoolItems.begin(), itrEnd = maPoolItems.end();
124 [ + - ][ + + ]: 3295635 : for (; itr != itrEnd; ++itr)
125 [ - + ]: 3206095 : delete *itr;
126 : 89540 : maPoolItems.clear();
127 : :
128 [ + + ]: 89540 : delete[] mpPoolRanges;
129 : 89540 : mpPoolRanges = NULL;
130 [ + + ]: 89540 : delete[] ppPoolDefaults;
131 : 89540 : ppPoolDefaults = NULL;
132 : 89540 : }
133 : :
134 : : void readTheItems(SvStream & rStream, sal_uInt32 nCount, sal_uInt16 nVersion,
135 : : SfxPoolItem * pDefItem, SfxPoolItemArray_Impl ** pArr);
136 : : };
137 : :
138 : : // -----------------------------------------------------------------------
139 : :
140 : : // IBM-C-Set mag keine doppelten Defines
141 : : #ifdef DBG
142 : : # undef DBG
143 : : #endif
144 : :
145 : : #if defined(DBG_UTIL) && defined(MSC)
146 : : #define DBG(x) x
147 : : #else
148 : : #define DBG(x)
149 : : #endif
150 : :
151 : : #define CHECK_FILEFORMAT( rStream, nTag ) \
152 : : { sal_uInt16 nFileTag; \
153 : : rStream >> nFileTag; \
154 : : if ( nTag != nFileTag ) \
155 : : { \
156 : : OSL_FAIL( #nTag ); /*! s.u. */ \
157 : : /*! error-code setzen und auswerten! */ \
158 : : (rStream).SetError(SVSTREAM_FILEFORMAT_ERROR); \
159 : : pImp->bStreaming = sal_False; \
160 : : return rStream; \
161 : : } \
162 : : }
163 : :
164 : : #define CHECK_FILEFORMAT_RELEASE( rStream, nTag, pPointer ) \
165 : : { sal_uInt16 nFileTag; \
166 : : rStream >> nFileTag; \
167 : : if ( nTag != nFileTag ) \
168 : : { \
169 : : OSL_FAIL( #nTag ); /*! s.u. */ \
170 : : /*! error-code setzen und auswerten! */ \
171 : : (rStream).SetError(SVSTREAM_FILEFORMAT_ERROR); \
172 : : pImp->bStreaming = sal_False; \
173 : : delete pPointer; \
174 : : return rStream; \
175 : : } \
176 : : }
177 : :
178 : : #define CHECK_FILEFORMAT2( rStream, nTag1, nTag2 ) \
179 : : { sal_uInt16 nFileTag; \
180 : : rStream >> nFileTag; \
181 : : if ( nTag1 != nFileTag && nTag2 != nFileTag ) \
182 : : { \
183 : : OSL_FAIL( #nTag1 ); /*! s.u. */ \
184 : : /*! error-code setzen und auswerten! */ \
185 : : (rStream).SetError(SVSTREAM_FILEFORMAT_ERROR); \
186 : : pImp->bStreaming = sal_False; \
187 : : return rStream; \
188 : : } \
189 : : }
190 : :
191 : : #define SFX_ITEMPOOL_VER_MAJOR sal_uInt8(2)
192 : : #define SFX_ITEMPOOL_VER_MINOR sal_uInt8(0)
193 : :
194 : : #define SFX_ITEMPOOL_TAG_STARTPOOL_4 sal_uInt16(0x1111)
195 : : #define SFX_ITEMPOOL_TAG_STARTPOOL_5 sal_uInt16(0xBBBB)
196 : : #define SFX_ITEMPOOL_TAG_ITEMPOOL sal_uInt16(0xAAAA)
197 : : #define SFX_ITEMPOOL_TAG_ITEMS sal_uInt16(0x2222)
198 : : #define SFX_ITEMPOOL_TAG_ITEM sal_uInt16(0x7777)
199 : : #define SFX_ITEMPOOL_TAG_SIZES sal_uInt16(0x3333)
200 : : #define SFX_ITEMPOOL_TAG_DEFAULTS sal_uInt16(0x4444)
201 : : #define SFX_ITEMPOOL_TAG_VERSIONMAP sal_uInt16(0x5555)
202 : : #define SFX_ITEMPOOL_TAG_HEADER sal_uInt16(0x6666)
203 : : #define SFX_ITEMPOOL_TAG_ENDPOOL sal_uInt16(0xEEEE)
204 : : #define SFX_ITEMPOOL_TAG_TRICK4OLD sal_uInt16(0xFFFF)
205 : :
206 : : #define SFX_ITEMPOOL_REC sal_uInt8(0x01)
207 : : #define SFX_ITEMPOOL_REC_HEADER sal_uInt8(0x10)
208 : : #define SFX_ITEMPOOL_REC_VERSIONMAP sal_uInt16(0x0020)
209 : : #define SFX_ITEMPOOL_REC_WHICHIDS sal_uInt16(0x0030)
210 : : #define SFX_ITEMPOOL_REC_ITEMS sal_uInt16(0x0040)
211 : : #define SFX_ITEMPOOL_REC_DEFAULTS sal_uInt16(0x0050)
212 : :
213 : : #define SFX_ITEMSET_REC sal_uInt8(0x02)
214 : :
215 : : #define SFX_STYLES_REC sal_uInt8(0x03)
216 : : #define SFX_STYLES_REC_HEADER sal_uInt16(0x0010)
217 : : #define SFX_STYLES_REC_STYLES sal_uInt16(0x0020)
218 : :
219 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|