Click here to Skip to main content
6,596,602 members and growing! (22,310 online)
Email Password   helpLost your password?
Platforms, Frameworks & Libraries » ATL » General     Intermediate

Zlib compression / decompression wrapper as ISequentialStream

By Jens Nilsson

This article discusses wrapping compression and decompression behind a ISeqentialStream interface
VC6Win2K, ATL, Dev
Posted:31 Jan 2003
Views:63,653
Bookmarked:44 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
12 votes for this article.
Popularity: 4.61 Rating: 4.27 out of 5

1

2
1 vote, 8.3%
3
4 votes, 33.3%
4
7 votes, 58.3%
5

Sample Image - zlibstream.jpg

Introduction

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.

Using the code

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();
}

Points of Interest

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

Links

zlib web site

History

2003.01.24 First implementation

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Jens Nilsson


Member

Occupation: Web Developer
Location: Sweden Sweden

Other popular ATL articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 12 of 12 (Total in Forum: 12) (Refresh)FirstPrevNext
GeneralIZWriteSeqStream exists nowhere but in the text of this article Pinmemberbabaa2:20 7 Mar '08  
GeneralRe: IZWriteSeqStream exists nowhere but in the text of this article Pinmemberbabaa3:48 7 Mar '08  
GeneralBigger file handling. Pinmemberjagatnibas12:39 13 Nov '07  
GeneralHuge file / incremental support? PinmemberNeverShaveYourDuck11:13 13 Aug '07  
GeneralCan not compile "zlibstream_demo" in VS 2005 PinmemberR_PR6:53 12 Jul '07  
QuestionNeed Help: Issue with ZlibCleanup PinmemberDennis Jiang23:03 12 Jan '07  
Generalgreat article! Pinmemberstefandreilog1:15 24 Nov '05  
GeneralIStream with gzFile PinmemberMario Turaccio23:20 19 Jul '05  
GeneralDemo project corrupted. PinmemberTW0:06 5 Feb '03  
GeneralRe: Demo project corrupted. PinmemberJens Nilsson12:03 6 Feb '03  
GeneralRe: Demo project corrupted. PinsussAnonymous23:06 6 Feb '03  
GeneralRe: Demo project corrupted. PinmemberJens Nilsson9:20 7 Feb '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin 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