LibreOffice Module lotuswordpro (master) 1
lwpobjstrm.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*************************************************************************
3 *
4 * The Contents of this file are made available subject to the terms of
5 * either of the following licenses
6 *
7 * - GNU Lesser General Public License Version 2.1
8 * - Sun Industry Standards Source License Version 1.1
9 *
10 * Sun Microsystems Inc., October, 2000
11 *
12 * GNU Lesser General Public License Version 2.1
13 * =============================================
14 * Copyright 2000 by Sun Microsystems, Inc.
15 * 901 San Antonio Road, Palo Alto, CA 94303, USA
16 *
17 * This library is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License version 2.1, as published by the Free Software Foundation.
20 *
21 * This library is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 * Lesser General Public License for more details.
25 *
26 * You should have received a copy of the GNU Lesser General Public
27 * License along with this library; if not, write to the Free Software
28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29 * MA 02111-1307 USA
30 *
31 *
32 * Sun Industry Standards Source License Version 1.1
33 * =================================================
34 * The contents of this file are subject to the Sun Industry Standards
35 * Source License Version 1.1 (the "License"); You may not use this file
36 * except in compliance with the License. You may obtain a copy of the
37 * License at http://www.openoffice.org/license.html.
38 *
39 * Software provided under this License is provided on an "AS IS" basis,
40 * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
41 * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
42 * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
43 * See the License for the specific provisions governing your rights and
44 * obligations concerning the Software.
45 *
46 * The Initial Developer of the Original Code is: IBM Corporation
47 *
48 * Copyright: 2008 by IBM Corporation
49 *
50 * All Rights Reserved.
51 *
52 * Contributor(s): _______________________________________
53 *
54 *
55 ************************************************************************/
56
57#include <lwpobjstrm.hxx>
58#include <lwptools.hxx>
59
60#include <sal/types.h>
61#include <tools/solar.h>
62#include <memory>
63
67LwpObjectStream::LwpObjectStream(LwpSvStream* pStrm, bool isCompressed, sal_uInt16 size)
68 : m_pContentBuf(nullptr)
69 , m_nBufSize(size)
70 , m_nReadPos(0)
71 , m_pStrm(pStrm)
72 , m_bCompressed(isCompressed)
73{
75 throw std::range_error("bad Object size");
76 // read object data from stream
77 if (m_nBufSize > 0)
79}
80
85{
87
88 m_nReadPos = 0;
89
90 if (m_bCompressed)
91 {
92 std::unique_ptr<sal_uInt8[]> xCompressBuf(new sal_uInt8[m_nBufSize]);
93
94 sal_uInt8* pCompressBuffer = xCompressBuf.get();
95 memset(pCompressBuffer, 0, m_nBufSize);
96 m_nBufSize = m_pStrm->Read(pCompressBuffer, m_nBufSize);
97
98 sal_uInt8 pTempDst[IO_BUFFERSIZE];
99 m_nBufSize = DecompressBuffer(pTempDst, pCompressBuffer, m_nBufSize);
100 assert(m_nBufSize < IO_BUFFERSIZE);
101
103 memcpy(m_pContentBuf, pTempDst, m_nBufSize);
104 }
105 else
106 {
109 }
110}
115{
116 if (size <= 100)
117 {
118 return m_SmallBuffer;
119 }
120 m_BigBuffer.resize(size);
121 return m_BigBuffer.data();
122}
127
133{
134 m_BigBuffer.clear();
135 m_pContentBuf = nullptr;
136}
137
139
143sal_uInt16 LwpObjectStream::QuickRead(void* buf, sal_uInt16 len)
144{
145 memset(buf, 0, len);
146 if (len > m_nBufSize - m_nReadPos)
147 {
148 len = m_nBufSize - m_nReadPos;
149 }
150 if (m_pContentBuf && len)
151 {
152 memcpy(buf, m_pContentBuf + m_nReadPos, len);
153 m_nReadPos += len;
154 }
155 return len;
156}
160void LwpObjectStream::SeekRel(sal_uInt16 pos)
161{
162 if (pos > m_nBufSize - m_nReadPos)
164 m_nReadPos += pos;
165}
169void LwpObjectStream::Seek(sal_uInt16 pos)
170{
171 if (pos < m_nBufSize)
172 {
173 m_nReadPos = pos;
174 }
175}
176
181{
182 SVBT16 aValue = { 0 };
183 QuickRead(aValue, sizeof(aValue));
184 return static_cast<bool>(SVBT16ToUInt16(aValue));
185}
189sal_uInt32 LwpObjectStream::QuickReaduInt32(bool* pFailure)
190{
191 SVBT32 aValue = { 0 };
192 sal_uInt16 nRead = QuickRead(aValue, sizeof(aValue));
193 if (pFailure)
194 *pFailure = (nRead != sizeof(aValue));
195 return SVBT32ToUInt32(aValue);
196}
200sal_uInt16 LwpObjectStream::QuickReaduInt16(bool* pFailure)
201{
202 SVBT16 aValue = { 0 };
203 sal_uInt16 nRead = QuickRead(aValue, sizeof(aValue));
204 if (pFailure)
205 *pFailure = (nRead != sizeof(aValue));
206 return SVBT16ToUInt16(aValue);
207}
212{
213 SVBT32 aValue = { 0 };
214 QuickRead(aValue, sizeof(aValue));
215 return static_cast<sal_Int32>(SVBT32ToUInt32(aValue));
216}
221{
222 SVBT16 aValue = { 0 };
223 QuickRead(aValue, sizeof(aValue));
224
225 return static_cast<sal_Int16>(SVBT16ToUInt16(aValue));
226}
231{
232 sal_uInt8 aValue = 0;
233 sal_uInt16 nRead = QuickRead(&aValue, sizeof(aValue));
234 if (pFailure)
235 *pFailure = (nRead != sizeof(aValue));
236 return aValue;
237}
242{
243 union {
244 double d;
245 sal_uInt8 c[8];
246 } s;
247 memset(s.c, 0, sizeof(s.c));
248 QuickRead(s.c, sizeof(s.c));
249#if defined(OSL_BIGENDIAN)
250 for (size_t i = 0; i < 4; ++i)
251 std::swap(s.c[i], s.c[7 - i]);
252#endif
253 return s.d;
254}
259{
260 sal_uInt16 extra = QuickReaduInt16();
261 while (extra != 0)
262 extra = QuickReaduInt16();
263}
272sal_uInt16 LwpObjectStream::DecompressBuffer(sal_uInt8* pDst, sal_uInt8* pSrc, sal_uInt16 Size)
273{
274 sal_uInt16 Cnt;
275 sal_uInt32 DstSize = 0;
276
277 while (Size)
278 {
279 switch (*pSrc & 0xC0)
280 {
281 case 0x00:
282 // 1 - 64 bytes of 0
283 // Code 00zzzzzz
284 // where zzzzzz is the count - 1 of compressed 0 bytes
285
286 Cnt = (*pSrc++ & 0x3F) + 1;
287 if (DstSize + Cnt >= IO_BUFFERSIZE)
288 throw BadDecompress();
289 memset(pDst, 0, Cnt);
290 pDst += Cnt;
291 DstSize += Cnt;
292 Size--;
293 break;
294
295 case 0x40:
296 // 1 - 8 zeros followed by 1 - 8 non-zero
297 // Code 01zzznnn binary
298 // where zzz is the count - 1 of compressed zero bytes
299 // and nnn is the count - 1 of following non-zero bytes
300
301 Cnt = ((*pSrc & 0x38) >> 3) + 1;
302 if (DstSize + Cnt >= IO_BUFFERSIZE)
303 throw BadDecompress();
304 memset(pDst, 0, Cnt);
305 pDst += Cnt;
306 DstSize += Cnt;
307 Cnt = (*pSrc++ & 0x07) + 1;
308 if (Size < Cnt + 1)
309 throw BadDecompress();
310 Size -= Cnt + 1;
311 if (DstSize + Cnt >= IO_BUFFERSIZE)
312 throw BadDecompress();
313 memcpy(pDst, pSrc, Cnt);
314 pDst += Cnt;
315 DstSize += Cnt;
316 pSrc += Cnt;
317 break;
318
319 case 0x80:
320 // 1 0 followed by 1 - 64 bytes of non-zero
321 // Code 0x80 (or 0x40 if 8 or less non-zero)
322 // Code 10nnnnnn binary
323 // where nnnnnn is the count - 1 of following non-zero bytes
324
325 *pDst++ = 0;
326 DstSize++;
327 [[fallthrough]];
328
329 case 0xC0:
330 // 1 - 64 bytes of non-zero
331 // Code = 11nnnnnn binary
332 // nnnnnn is the count less 1 of following non-zero bytes
333
334 Cnt = (*pSrc++ & 0x3F) + 1;
335 if (Size < Cnt + 1)
336 throw BadDecompress();
337 Size -= Cnt + 1;
338 if (DstSize + Cnt >= IO_BUFFERSIZE)
339 throw BadDecompress();
340 memcpy(pDst, pSrc, Cnt);
341 pDst += Cnt;
342 DstSize += Cnt;
343 pSrc += Cnt;
344 break;
345 }
346 assert(DstSize < IO_BUFFERSIZE);
347 if (DstSize >= IO_BUFFERSIZE)
348 throw BadDecompress();
349 }
350 return static_cast<sal_uInt16>(DstSize);
351}
356{
357 sal_uInt16 diskSize;
358
359 diskSize = QuickReaduInt16();
360 QuickReaduInt16(); //len
361
362 OUString str;
363 if (diskSize < sizeof diskSize)
364 throw std::range_error("Too small size");
365 LwpTools::QuickReadUnicode(this, str, diskSize - sizeof(diskSize), RTL_TEXTENCODING_MS_1252);
366 return str;
367}
368
369/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
double d
OUString QuickReadStringPtr()
@descr quick read string with 1252
Definition: lwpobjstrm.cxx:355
sal_uInt16 QuickReaduInt16(bool *pFailure=nullptr)
@descr Quick read sal_uInt32
Definition: lwpobjstrm.cxx:200
sal_uInt16 QuickRead(void *buf, sal_uInt16 len)
@descr read len bytes from object stream to buffer
Definition: lwpobjstrm.cxx:143
sal_uInt16 CheckExtra()
@descr check if extra bytes
Definition: lwpobjstrm.cxx:267
void SkipExtra()
@descr skip extra bytes
Definition: lwpobjstrm.cxx:258
void SeekRel(sal_uInt16 pos)
@descr SeekRel pos in object stream/buffer
Definition: lwpobjstrm.cxx:160
double QuickReadDouble()
@descr Quick read double
Definition: lwpobjstrm.cxx:241
sal_Int16 QuickReadInt16()
@descr Quick read sal_Int16
Definition: lwpobjstrm.cxx:220
void ReadComplete()
@descr signal complete to release object buffer
Definition: lwpobjstrm.cxx:126
void Read2Buffer()
@descr read object data from stream to buffer
Definition: lwpobjstrm.cxx:84
sal_uInt16 m_nBufSize
Definition: lwpobjstrm.hxx:90
std::vector< sal_uInt8 > m_BigBuffer
Definition: lwpobjstrm.hxx:85
sal_uInt8 QuickReaduInt8(bool *pFailure=nullptr)
@descr Quick read sal_uInt8
Definition: lwpobjstrm.cxx:230
sal_uInt16 remainingSize() const
Definition: lwpobjstrm.cxx:138
static sal_uInt16 DecompressBuffer(sal_uInt8 *pDst, sal_uInt8 *pSrc, sal_uInt16 Size)
@descr decompress data buffer from pSrc to pDst Refer to the CAmiPro40File::DecompressObject(~) in LW...
Definition: lwpobjstrm.cxx:272
sal_uInt16 m_nReadPos
Definition: lwpobjstrm.hxx:91
sal_uInt8 m_SmallBuffer[100]
Definition: lwpobjstrm.hxx:84
void Seek(sal_uInt16 pos)
@descr Seek to pos in object buffer/buffer
Definition: lwpobjstrm.cxx:169
sal_uInt32 QuickReaduInt32(bool *pFailure=nullptr)
@descr Quick read sal_uInt32
Definition: lwpobjstrm.cxx:189
LwpSvStream * m_pStrm
Definition: lwpobjstrm.hxx:92
sal_Int32 QuickReadInt32()
@descr Quick read sal_Int32
Definition: lwpobjstrm.cxx:211
LwpObjectStream(LwpSvStream *pStrm, bool isCompressed, sal_uInt16 size)
@descr ctor() from LwpSvStream
Definition: lwpobjstrm.cxx:67
sal_uInt8 * AllocBuffer(sal_uInt16 size)
@descr alloc size of buffer
Definition: lwpobjstrm.cxx:114
bool QuickReadBool()
@descr Quick read sal_Bool
Definition: lwpobjstrm.cxx:180
void ReleaseBuffer()
@descr release object buffer
Definition: lwpobjstrm.cxx:132
sal_uInt8 * m_pContentBuf
Definition: lwpobjstrm.hxx:83
encapsulate XInputStream to provide SvStream like interfaces
Definition: lwpsvstream.hxx:69
size_t Read(void *bytes, size_t nBytesToRead)
@descr read nBytesToRead bytes to buf
Definition: lwpsvstream.cxx:70
static void QuickReadUnicode(LwpObjectStream *pObjStrm, OUString &str, sal_uInt16 strlen, rtl_TextEncoding aEncoding)
@descr read lwp unicode string from stream to OUString per aEncoding
Definition: lwptools.cxx:84
size
int i
sal_uInt8 SVBT32[4]
sal_uInt8 SVBT16[2]
unsigned char sal_uInt8
size_t pos