xref: /AOO41X/main/svl/source/numbers/numhead.cxx (revision 40df464ee80f942fd2baf5effc726656f4be12a0)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svl.hxx"
26 #ifndef GCC
27 #endif
28 #include <tools/debug.hxx>
29 
30 #include "numhead.hxx"
31 
32 //      ID's fuer Dateien:
33 #define SV_NUMID_SIZES                      0x4200
34 
35 // STATIC DATA -----------------------------------------------------------
36 
37 //SEG_EOFGLOBALS()
38 
39 // =======================================================================
40 /*                              wird fuer SvNumberformatter nicht gebraucht
41 //#pragma SEG_FUNCDEF(numhead_01)
42 
43 SvNumReadHeader::SvNumReadHeader(SvStream& rNewStream) :
44     rStream( rNewStream )
45 {
46     sal_uLong nDataSize;
47     rStream >> nDataSize;
48     nDataEnd = rStream.Tell() + nDataSize;
49 }
50 
51 //#pragma SEG_FUNCDEF(numhead_02)
52 
53 SvNumReadHeader::~SvNumReadHeader()
54 {
55     sal_uLong nReadEnd = rStream.Tell();
56     DBG_ASSERT( nReadEnd <= nDataEnd, "zuviele Bytes gelesen" );
57     if ( nReadEnd != nDataEnd )
58         rStream.Seek(nDataEnd);                     // Rest ueberspringen
59 }
60 
61 //#pragma SEG_FUNCDEF(numhead_03)
62 
63 sal_uLong SvNumReadHeader::BytesLeft() const
64 {
65     sal_uLong nReadEnd = rStream.Tell();
66     if (nReadEnd <= nDataEnd)
67         return nDataEnd-nReadEnd;
68 
69     DBG_ERROR("Fehler bei SvNumReadHeader::BytesLeft");
70     return 0;
71 }
72 
73 // -----------------------------------------------------------------------
74 
75 //#pragma SEG_FUNCDEF(numhead_04)
76 
77 SvNumWriteHeader::SvNumWriteHeader(SvStream& rNewStream, sal_uLong nDefault) :
78     rStream( rNewStream )
79 {
80     nDataSize = nDefault;
81     rStream << nDataSize;
82     nDataPos = rStream.Tell();
83 }
84 
85 //#pragma SEG_FUNCDEF(numhead_05)
86 
87 SvNumWriteHeader::~SvNumWriteHeader()
88 {
89     sal_uLong nPos = rStream.Tell();
90 
91     if ( nPos - nDataPos != nDataSize )             // Default getroffen?
92     {
93         nDataSize = nPos - nDataPos;
94         rStream.Seek(nDataPos - sizeof(sal_uInt32));
95         rStream << nDataSize;                       // Groesse am Anfang eintragen
96         rStream.Seek(nPos);
97     }
98 }
99 */
100 
101 // =======================================================================
102 
103 //#pragma SEG_FUNCDEF(numhead_06)
104 
105 //! mit Skip() synchron
ImpSvNumMultipleReadHeader(SvStream & rNewStream)106 ImpSvNumMultipleReadHeader::ImpSvNumMultipleReadHeader(SvStream& rNewStream) :
107     rStream( rNewStream )
108 {
109     sal_uInt32 nDataSize;
110     rStream >> nDataSize;
111     sal_uLong nDataPos = rStream.Tell();
112     nEntryEnd = nDataPos;
113 
114     rStream.SeekRel(nDataSize);
115     sal_uInt16 nID;
116     rStream >> nID;
117     if (nID != SV_NUMID_SIZES)
118     {
119         DBG_ERROR("SV_NUMID_SIZES nicht gefunden");
120     }
121     sal_uInt32 nSizeTableLen;
122     rStream >> nSizeTableLen;
123     pBuf = new char[nSizeTableLen];
124     rStream.Read( pBuf, nSizeTableLen );
125     pMemStream = new SvMemoryStream( pBuf, nSizeTableLen, STREAM_READ );
126 
127     nEndPos = rStream.Tell();
128     rStream.Seek( nDataPos );
129 }
130 
131 //#pragma SEG_FUNCDEF(numhead_07)
132 
~ImpSvNumMultipleReadHeader()133 ImpSvNumMultipleReadHeader::~ImpSvNumMultipleReadHeader()
134 {
135     DBG_ASSERT( pMemStream->Tell() == pMemStream->GetEndOfData(),
136                 "Sizes nicht vollstaendig gelesen" );
137     delete pMemStream;
138     delete [] pBuf;
139 
140     rStream.Seek(nEndPos);
141 }
142 
143 //! mit ctor synchron
144 // static
Skip(SvStream & rStream)145 void ImpSvNumMultipleReadHeader::Skip( SvStream& rStream )
146 {
147     sal_uInt32 nDataSize;
148     rStream >> nDataSize;
149     rStream.SeekRel( nDataSize );
150     sal_uInt16 nID;
151     rStream >> nID;
152     if ( nID != SV_NUMID_SIZES )
153     {
154         DBG_ERROR("SV_NUMID_SIZES nicht gefunden");
155     }
156     sal_uInt32 nSizeTableLen;
157     rStream >> nSizeTableLen;
158     rStream.SeekRel( nSizeTableLen );
159 }
160 
161 //#pragma SEG_FUNCDEF(numhead_08)
162 
EndEntry()163 void ImpSvNumMultipleReadHeader::EndEntry()
164 {
165     sal_uLong nPos = rStream.Tell();
166     DBG_ASSERT( nPos <= nEntryEnd, "zuviel gelesen" );
167     if ( nPos != nEntryEnd )
168         rStream.Seek( nEntryEnd );          // Rest ueberspringen
169 }
170 
171 //#pragma SEG_FUNCDEF(numhead_0d)
172 
StartEntry()173 void ImpSvNumMultipleReadHeader::StartEntry()
174 {
175     sal_uLong nPos = rStream.Tell();
176     sal_uInt32 nEntrySize;
177     (*pMemStream) >> nEntrySize;
178 
179     nEntryEnd = nPos + nEntrySize;
180 }
181 
182 //#pragma SEG_FUNCDEF(numhead_09)
183 
BytesLeft() const184 sal_uLong ImpSvNumMultipleReadHeader::BytesLeft() const
185 {
186     sal_uLong nReadEnd = rStream.Tell();
187     if (nReadEnd <= nEntryEnd)
188         return nEntryEnd-nReadEnd;
189 
190     DBG_ERROR("Fehler bei ImpSvNumMultipleReadHeader::BytesLeft");
191     return 0;
192 }
193 
194 // -----------------------------------------------------------------------
195 
196 //#pragma SEG_FUNCDEF(numhead_0a)
197 
ImpSvNumMultipleWriteHeader(SvStream & rNewStream,sal_uLong nDefault)198 ImpSvNumMultipleWriteHeader::ImpSvNumMultipleWriteHeader(SvStream& rNewStream,
199                                                    sal_uLong nDefault) :
200     rStream( rNewStream ),
201     aMemStream( 4096, 4096 )
202 {
203     nDataSize = nDefault;
204     rStream << nDataSize;
205 
206     nDataPos = rStream.Tell();
207     nEntryStart = nDataPos;
208 }
209 
210 //#pragma SEG_FUNCDEF(numhead_0b)
211 
~ImpSvNumMultipleWriteHeader()212 ImpSvNumMultipleWriteHeader::~ImpSvNumMultipleWriteHeader()
213 {
214     sal_uLong nDataEnd = rStream.Tell();
215 
216     rStream << (sal_uInt16) SV_NUMID_SIZES;
217     rStream << static_cast<sal_uInt32>(aMemStream.Tell());
218     rStream.Write( aMemStream.GetData(), aMemStream.Tell() );
219 
220     if ( nDataEnd - nDataPos != nDataSize )                 // Default getroffen?
221     {
222         nDataSize = nDataEnd - nDataPos;
223         sal_uLong nPos = rStream.Tell();
224         rStream.Seek(nDataPos-sizeof(sal_uInt32));
225         rStream << nDataSize;                               // Groesse am Anfang eintragen
226         rStream.Seek(nPos);
227     }
228 }
229 
230 //#pragma SEG_FUNCDEF(numhead_0c)
231 
EndEntry()232 void ImpSvNumMultipleWriteHeader::EndEntry()
233 {
234     sal_uLong nPos = rStream.Tell();
235     aMemStream << static_cast<sal_uInt32>(nPos - nEntryStart);
236 }
237 
238 //#pragma SEG_FUNCDEF(numhead_0e)
239 
StartEntry()240 void ImpSvNumMultipleWriteHeader::StartEntry()
241 {
242     sal_uLong nPos = rStream.Tell();
243     nEntryStart = nPos;
244 }
245 
246