diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-06-13 23:20:18 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-06-13 23:20:18 +0100 |
commit | b879a95c1d1b6241e7bc1b6fb6349e91e4baf5f1 (patch) | |
tree | cba640a6241b00fc7db443b40cc91c769da667b0 /hwpfilter/source/hiodev.cxx | |
parent | bfd0bbab201d574d3387dacf1c74e80a3ed157bb (diff) |
gbuildize hwpfilter
Diffstat (limited to 'hwpfilter/source/hiodev.cxx')
-rw-r--r-- | hwpfilter/source/hiodev.cxx | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/hwpfilter/source/hiodev.cxx b/hwpfilter/source/hiodev.cxx new file mode 100644 index 000000000000..0416a96c7091 --- /dev/null +++ b/hwpfilter/source/hiodev.cxx @@ -0,0 +1,366 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifdef __GNUG__ +#pragma implementation "hiodev.h" +#endif + +#include <stdio.h> +#include <errno.h> +// DVO: add zlib/ prefix +#ifdef SYSTEM_ZLIB +#include <zlib.h> +#else +#include <zlib/zlib.h> +#endif +#ifdef WIN32 +# include <io.h> +#else +# include <unistd.h> +#endif + +#include "hwplib.h" +#include "hgzip.h" +#include "hiodev.h" +#include "hwpfile.h" +#include "hstream.h" + +const int BUFSIZE = 1024; +static uchar rBuf[BUFSIZE]; + +// HIODev abstract class +HIODev::HIODev() +{ + init(); +} + + +HIODev::~HIODev() +{ +} + + +void HIODev::init() +{ + compressed = false; +} + + +int HIODev::read1b(void *ptr, int nmemb) +{ + uchar *p = (uchar *) ptr; + int ii; + + if (state()) + return -1; + for (ii = 0; ii < nmemb; ii++) + { + p[ii] = sal::static_int_cast<uchar>(read1b()); + if (state()) + break; + } + return ii; +} + + +int HIODev::read2b(void *ptr, int nmemb) +{ + ushort *p = (ushort *) ptr; + int ii; + + if (state()) + return -1; + for (ii = 0; ii < nmemb; ii++) + { + p[ii] = sal::static_int_cast<uchar>(read2b()); + if (state()) + break; + } + return ii; +} + + +int HIODev::read4b(void *ptr, int nmemb) +{ + ulong *p = (ulong *) ptr; + int ii; + + if (state()) + return -1; + for (ii = 0; ii < nmemb; ii++) + { + p[ii] = read4b(); + if (state()) + break; + } + return ii; +} + + +// hfileiodev class +HStreamIODev::HStreamIODev(HStream & stream):_stream(stream) +{ + init(); +} + + +HStreamIODev::~HStreamIODev() +{ + close(); +} + + +void HStreamIODev::init() +{ + _gzfp = NULL; + compressed = false; +} + + +bool HStreamIODev::open() +{ + if (!(_stream.available())) + return false; + return true; +} + + +void HStreamIODev::flush(void) +{ + if (_gzfp) + gz_flush(_gzfp, Z_FINISH); +} + + +void HStreamIODev::close(void) +{ +/* ÷ ݴ´. */ + this->flush(); + if (_gzfp) + gz_close(_gzfp); /* gz_close() calls stream_closeInput() */ + else + _stream.closeInput(); + _gzfp = NULL; +} + + +int HStreamIODev::state(void) const +{ + return 0; +} + + +/* zlib κ */ +bool HStreamIODev::setCompressed(bool flag) +{ + compressed = flag; + if (flag == true) + return 0 != (_gzfp = gz_open(_stream)); + else if (_gzfp) + { + gz_flush(_gzfp, Z_FINISH); + gz_close(_gzfp); + _gzfp = 0; + } + return true; +} + + +// IO routines + +#define GZREAD(ptr,len) (_gzfp?gz_read(_gzfp,ptr,len):0) + +int HStreamIODev::read1b() +{ + int res = (compressed) ? GZREAD(rBuf, 1) : _stream.readBytes(rBuf, 1); + + if (res <= 0) + return -1; + else + return (unsigned char) rBuf[0]; +} + + +int HStreamIODev::read2b() +{ + int res = (compressed) ? GZREAD(rBuf, 2) : _stream.readBytes(rBuf, 2); + + if (res <= 0) + return -1; + else + return ((unsigned char) rBuf[1] << 8 | (unsigned char) rBuf[0]); +} + + +long HStreamIODev::read4b() +{ + int res = (compressed) ? GZREAD(rBuf, 4) : _stream.readBytes(rBuf, 4); + + if (res <= 0) + return -1; + else + return ((unsigned char) rBuf[3] << 24 | (unsigned char) rBuf[2] << 16 | + (unsigned char) rBuf[1] << 8 | (unsigned char) rBuf[0]); +} + + +int HStreamIODev::readBlock(void *ptr, int size) +{ + int count = + (compressed) ? GZREAD(ptr, size) : _stream.readBytes((byte *) ptr, + + size); + + return count; +} + + +int HStreamIODev::skipBlock(int size) +{ + if (compressed){ + if( size <= BUFSIZE ) + return GZREAD(rBuf, size); + else{ + int remain = size; + while(remain){ + if( remain > BUFSIZE ) + remain -= GZREAD(rBuf, BUFSIZE); + else{ + remain -= GZREAD(rBuf, remain); + break; + } + } + return size - remain; + } + } + return _stream.skipBytes(size); +} + + +HMemIODev::HMemIODev(char *s, int len) +{ + init(); + ptr = (uchar *) s; + length = len; +} + + +HMemIODev::~HMemIODev() +{ + close(); +} + + +void HMemIODev::init() +{ + ptr = 0; + length = 0; + pos = 0; +} + + +bool HMemIODev::open() +{ + return true; +} + + +void HMemIODev::flush(void) +{ +} + + +void HMemIODev::close(void) +{ +} + + +int HMemIODev::state(void) const +{ + if (pos <= length) + return 0; + else + return -1; +} + + +bool HMemIODev::setCompressed(bool ) +{ + return false; +} + + +int HMemIODev::read1b() +{ + if (pos <= length) + return ptr[pos++]; + else + return 0; +} + + +int HMemIODev::read2b() +{ + pos += 2; + if (pos <= length) + return ptr[pos - 1] << 8 | ptr[pos - 2]; + else + return 0; +} + + +long HMemIODev::read4b() +{ + pos += 4; + if (pos <= length) + return DWORD(ptr[pos - 1] << 24 | ptr[pos - 2] << 16 | + ptr[pos - 3] << 8 | ptr[pos - 4]); + else + return 0; +} + + +int HMemIODev::readBlock(void *p, int size) +{ + if (length < pos + size) + size = length - pos; + memcpy(p, ptr + pos, size); + pos += size; + return size; +} + + +int HMemIODev::skipBlock(int size) +{ + if (length < pos + size) + return 0; + pos += size; + return size; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |