![]() |
Platforms, Frameworks & Libraries »
ATL »
General
Intermediate
Zlib compression / decompression wrapper as ISequentialStreamBy Jens NilssonThis article discusses wrapping compression and decompression behind a ISeqentialStream interface |
VC6Win2K, ATL, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

I have been looking for a compression library that can compress XML fragments
on the fly from the IStream interface and decompress it back. There
are several file compression libraries, most based on zlib
, but I needed custom storage such as compressed streams inside structured
storage files.
This is a first shot at wrapping zlib
compression library behind a COM IStream interface. I provide a
pure ATL C++ implementation and a simple demo COM based implementation. Both
take an IStream as an initializer and compress/decompress on the
fly on the Read and Write methods.
I hope this will be usefull for more people than me. I haven't tried this with MSXML SAX Parser yet but as I understand it the SAX Parser should bot need more than the ISequentialStream interface and thus should work fine with this implementation.
These are the classes found in the header file zlibistream.h
// // ZSequentialStreamBase , base class for the implementaion classes // // Implementation classes for ISequentialStream interfaces, constrained to // either writing or reading. Template class T needs to provide implementaion // for overridable member functions FillBuffer and EmptyBuffer. // // template<class T, int bufferSize=16384> class ZReadSequentialStreamImpl; // template<class T, int bufferSize=16384> class ZWriteSequentialStreamImpl; // // // Implementation of read and write sequential streams based on implementation // classes above. These classe overrides the FillBuffer and EmptyBuffer by // reading from or writing to a user supplied stream. // // template<int bufferSize=16384> class ZReadSequentialStreamT; // template<int bufferSize=16384> class ZWriteSequentialStreamT; // // Convenience typedef's for stackbased classes (no AddRef(), Release() or QI) // // typedef CComObjectStack<ZWriteSequentialStreamT<> > ZWriteSequentialStream; // typedef CComObjectStack<ZReadSequentialStreamT<> > ZReadSequentialStream; //
The following snippets shows how to use the C++ wrapper on an IStream
// Writing to a stream CComPtr<IStream> spStm; ... // get an IStream for writing to storage // Use zlib sequential stream implementation for writing (compression) ZWriteSequentialStream zw; zw.Initialize(spStm); // initialize for writing to the IStream zw.Write((void*)buffer, bufLen, &cb); zw.Cleanup(); // Reading from a stream CComPtr<IStream> spStm; ... // get an IStream for reading from storage // Use zlib sequential stream implementation for reading (decompression) ZReadSequentialStream zr; zr.Initialize(spStm); // initialize for reading from the IStream zr.Read((void*)buffer, bufLen, &cb); zr.Cleanup();
The following snippets shows how to use the COM wrapper on an IStream
// Writing to a stream CComPtr<IStream> spStm; ... // get an IStream for writing to storage // Use COM wrapper for writing (compression) CComPtr<IZWriteSeqStream> spWrite; if (SUCCEEDED(spWrite.CoCreateInstance(__uuidof(ZWriteSeqStream)))) { spWrite->Initialize(CComVariant(spStm)); CComQIPtr<ISequentialStream> spSeq = spWrite; spSeq->Write((void*)buffer, bufLen, &cb); //cleanup spWrite.Release(); } // Reading from a stream CComPtr<IStream> spStm; ... // get an IStream for reading from storage // Use COM wrapper for reading (decompression) CComPtr<IZReadSeqStream> spRead; if (SUCCEEDED(spRead.CoCreateInstance(__uuidof(ZReadSeqStream)))) { spRead->Initialize(CComVariant(spStm)); CComQIPtr<ISequentialStream> spSeq = spRead; spSeq->Read((void*)buffer, bufLen, &cb); //cleanup spRead.Release(); }
The only problem, so far, was to synchronize the zstream buffer
in zlib so the data is available for the
Read and Write IStream functions.
The demo project includes a static library for zlib 1.1.4
2003.01.24 First implementation
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 31 Jan 2003 Editor: Chris Maunder |
Copyright 2003 by Jens Nilsson Everything else Copyright © CodeProject, 1999-2009 Web16 | Advertise on the Code Project |