Files
loongoffice/include/tools/zcodec.hxx
offtkp 932257c50c Add compression support for GZ through ZCodec
ZCodec uses zlib to deflate. That file has code
to allow for compressing to GZ but it's wrapped in defines.

There's places in code where there's need for zlib headers
(ie. svx/source/gallery2/codec.cxx:71) and there will be need
for gz header compression when EMZ/WMZ/SVGZ export support
is added.

Made compression functions care about mbGzLib bool. Also added
a SetCompressionMetadata function to set metadata which are otherwise
impossible to know (such as filename, which is needed in the header)

Change-Id: Ic01050262b0b15e0632564b139c66656afac4611
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135213
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
2022-06-12 09:29:53 +02:00

97 lines
3.5 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#ifndef INCLUDED_TOOLS_ZCODEC_HXX
#define INCLUDED_TOOLS_ZCODEC_HXX
#include <tools/toolsdllapi.h>
#include <tools/long.hxx>
#include <memory>
#include <rtl/string.hxx>
#define ZCODEC_NO_COMPRESSION 0
#define ZCODEC_DEFAULT_COMPRESSION 6
class SvStream;
// The overall client call protocol is one of:
// * BeginCompression, Compress, EndCompression
// * BeginCompression, SetCompressionMetadata, Compress, EndCompression (for gz files)
// * BeginCompression, Decompress, EndCompression
// * BeginCompression, Write*, EndCompression
// * BeginCompression, Read*, EndCompression
// * BeginCompression, ReadAsynchron*, EndCompression
class SAL_WARN_UNUSED TOOLS_DLLPUBLIC ZCodec
{
enum State { STATE_INIT, STATE_DECOMPRESS, STATE_COMPRESS };
State meState;
bool mbStatus;
bool mbFinish;
std::unique_ptr<sal_uInt8[]> mpInBuf;
size_t mnInBufSize;
size_t mnInToRead;
SvStream* mpOStm;
std::unique_ptr<sal_uInt8[]> mpOutBuf;
size_t mnOutBufSize;
sal_uInt32 mnUncompressedSize;
sal_uInt32 mnInBufCRC32;
sal_uInt32 mnLastModifiedTime;
OString msFilename;
int mnCompressLevel;
bool mbGzLib;
void* mpsC_Stream;
void InitCompress();
void InitDecompress(SvStream & inStream);
void ImplWriteBack();
public:
ZCodec( size_t nInBufSize = 32768, size_t nOutBufSize = 32768 );
~ZCodec();
/**
* @brief Checks whether a stream is Z compressed
*
* @param rIStm the stream to check
*/
static bool IsZCompressed( SvStream& rIStm );
void BeginCompression( int nCompressLevel = ZCODEC_DEFAULT_COMPRESSION, bool gzLib = false );
tools::Long EndCompression();
/**
* @brief Set metadata for gzlib compression
*
* @param sFilename the uncompressed file filename
* @param nLastModifiedTime the files last modified time in unix format
*/
void SetCompressionMetadata( const OString& sFilename,
sal_uInt32 nLastModifiedTime, sal_uInt32 nInBufCRC32 );
void Compress( SvStream& rIStm, SvStream& rOStm );
tools::Long Decompress( SvStream& rIStm, SvStream& rOStm );
bool AttemptDecompression( SvStream& rIStm, SvStream& rOStm );
void Write( SvStream& rOStm, const sal_uInt8* pData, sal_uInt32 nSize );
tools::Long Read( SvStream& rIStm, sal_uInt8* pData, sal_uInt32 nSize );
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */