summaryrefslogtreecommitdiff
path: root/cryptopp/crypto/gzip.h
diff options
context:
space:
mode:
authorwatcherhd <watcherhd@e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb>2011-04-21 14:14:52 +0000
committerwatcherhd <watcherhd@e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb>2011-04-21 14:14:52 +0000
commitcb4a46e7fbe62d788e66ed6121c717a2d22a4d7c (patch)
tree30df260fdc5a1b5a7049c2f8cac8b7ef17513d6d /cryptopp/crypto/gzip.h
parent19b6f534d2e784a1e120bf52c4aa07004798f473 (diff)
svn.miranda.im is moving to a new home!
git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb
Diffstat (limited to 'cryptopp/crypto/gzip.h')
-rw-r--r--cryptopp/crypto/gzip.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/cryptopp/crypto/gzip.h b/cryptopp/crypto/gzip.h
new file mode 100644
index 0000000..b96fc1e
--- /dev/null
+++ b/cryptopp/crypto/gzip.h
@@ -0,0 +1,65 @@
+#ifndef CRYPTOPP_GZIP_H
+#define CRYPTOPP_GZIP_H
+
+#include "zdeflate.h"
+#include "zinflate.h"
+#include "crc.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+/// GZIP Compression (RFC 1952)
+class Gzip : public Deflator
+{
+public:
+ Gzip(BufferedTransformation *attachment=NULL, unsigned int deflateLevel=DEFAULT_DEFLATE_LEVEL, unsigned int log2WindowSize=DEFAULT_LOG2_WINDOW_SIZE, bool detectUncompressible=true)
+ : Deflator(attachment, deflateLevel, log2WindowSize, detectUncompressible) {}
+ Gzip(const NameValuePairs &parameters, BufferedTransformation *attachment=NULL)
+ : Deflator(parameters, attachment) {}
+
+protected:
+ enum {MAGIC1=0x1f, MAGIC2=0x8b, // flags for the header
+ DEFLATED=8, FAST=4, SLOW=2};
+
+ void WritePrestreamHeader();
+ void ProcessUncompressedData(const byte *string, size_t length);
+ void WritePoststreamTail();
+
+ word32 m_totalLen;
+ CRC32 m_crc;
+};
+
+/// GZIP Decompression (RFC 1952)
+class Gunzip : public Inflator
+{
+public:
+ typedef Inflator::Err Err;
+ class HeaderErr : public Err {public: HeaderErr() : Err(INVALID_DATA_FORMAT, "Gunzip: header decoding error") {}};
+ class TailErr : public Err {public: TailErr() : Err(INVALID_DATA_FORMAT, "Gunzip: tail too short") {}};
+ class CrcErr : public Err {public: CrcErr() : Err(DATA_INTEGRITY_CHECK_FAILED, "Gunzip: CRC check error") {}};
+ class LengthErr : public Err {public: LengthErr() : Err(DATA_INTEGRITY_CHECK_FAILED, "Gunzip: length check error") {}};
+
+ /*! \param repeat decompress multiple compressed streams in series
+ \param autoSignalPropagation 0 to turn off MessageEnd signal
+ */
+ Gunzip(BufferedTransformation *attachment = NULL, bool repeat = false, int autoSignalPropagation = -1);
+
+protected:
+ enum {MAGIC1=0x1f, MAGIC2=0x8b, // flags for the header
+ DEFLATED=8};
+
+ enum FLAG_MASKS {
+ CONTINUED=2, EXTRA_FIELDS=4, FILENAME=8, COMMENTS=16, ENCRYPTED=32};
+
+ unsigned int MaxPrestreamHeaderSize() const {return 1024;}
+ void ProcessPrestreamHeader();
+ void ProcessDecompressedData(const byte *string, size_t length);
+ unsigned int MaxPoststreamTailSize() const {return 8;}
+ void ProcessPoststreamTail();
+
+ word32 m_length;
+ CRC32 m_crc;
+};
+
+NAMESPACE_END
+
+#endif