diff options
author | Mike Buland <eichlan@xagasoft.com> | 2007-06-09 05:43:04 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2007-06-09 05:43:04 +0000 |
commit | f5352edf3dc23c044a91f1d1537fa0dc0f0babc7 (patch) | |
tree | c08cd1a97a91a0ece860355fe03c1494651db31c /src/bzip2.cpp | |
parent | 9e8a4944e50fab432012878c66e1bdac20649f76 (diff) | |
download | libbu++-f5352edf3dc23c044a91f1d1537fa0dc0f0babc7.tar.gz libbu++-f5352edf3dc23c044a91f1d1537fa0dc0f0babc7.tar.bz2 libbu++-f5352edf3dc23c044a91f1d1537fa0dc0f0babc7.tar.xz libbu++-f5352edf3dc23c044a91f1d1537fa0dc0f0babc7.zip |
Alright, looks like the bzip2 filter can decompress just fine. It won't try to compensate for overshooting the end of the compression block yet, which it won't
be able to do on streams that don't support seeking...I think I'll make it only
try on stop commands, and try to re-use the buffer otherwise...maybe...it's an
interesting problem since it *always* overshoots (unless you're really, really
lucky...)
Diffstat (limited to '')
-rw-r--r-- | src/bzip2.cpp | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/bzip2.cpp b/src/bzip2.cpp index b8c0f74..433fc91 100644 --- a/src/bzip2.cpp +++ b/src/bzip2.cpp | |||
@@ -12,14 +12,11 @@ Bu::BZip2::BZip2( Bu::Stream &rNext, int nCompression ) : | |||
12 | 12 | ||
13 | Bu::BZip2::~BZip2() | 13 | Bu::BZip2::~BZip2() |
14 | { | 14 | { |
15 | printf("-> Bu::BZip2::~BZip2()\n"); | ||
16 | stop(); | 15 | stop(); |
17 | } | 16 | } |
18 | 17 | ||
19 | void Bu::BZip2::start() | 18 | void Bu::BZip2::start() |
20 | { | 19 | { |
21 | printf("-> Bu::BZip2::start()\n"); | ||
22 | printf("Hey, it's starting...\n"); | ||
23 | bzState.state = NULL; | 20 | bzState.state = NULL; |
24 | bzState.bzalloc = NULL; | 21 | bzState.bzalloc = NULL; |
25 | bzState.bzfree = NULL; | 22 | bzState.bzfree = NULL; |
@@ -31,11 +28,11 @@ void Bu::BZip2::start() | |||
31 | 28 | ||
32 | void Bu::BZip2::stop() | 29 | void Bu::BZip2::stop() |
33 | { | 30 | { |
34 | printf("-> Bu::BZip2::stop()\n"); | ||
35 | if( bzState.state ) | 31 | if( bzState.state ) |
36 | { | 32 | { |
37 | if( bReading ) | 33 | if( bReading ) |
38 | { | 34 | { |
35 | BZ2_bzDecompressEnd( &bzState ); | ||
39 | } | 36 | } |
40 | else | 37 | else |
41 | { | 38 | { |
@@ -81,13 +78,39 @@ size_t Bu::BZip2::read( void *pData, size_t nBytes ) | |||
81 | if( !bzState.state ) | 78 | if( !bzState.state ) |
82 | { | 79 | { |
83 | bReading = true; | 80 | bReading = true; |
81 | BZ2_bzDecompressInit( &bzState, 0, 0 ); | ||
82 | bzState.next_in = pBuf; | ||
83 | bzState.avail_in = 0; | ||
84 | } | 84 | } |
85 | if( bReading == false ) | 85 | if( bReading == false ) |
86 | throw ExceptionBase("This bzip2 filter is in writing mode, you can't read."); | 86 | throw ExceptionBase("This bzip2 filter is in writing mode, you can't read."); |
87 | //bzState.next_in = pData; | 87 | |
88 | //bzState.avail_in = nSizeIn; | 88 | int nRead = 0; |
89 | int nReadTotal = bzState.total_out_lo32; | ||
90 | for(;;) | ||
91 | { | ||
92 | bzState.next_out = (char *)pData; | ||
93 | bzState.avail_out = nBytes; | ||
94 | int ret = BZ2_bzDecompress( &bzState ); | ||
89 | 95 | ||
90 | //printf("%db at [%08X] (%db)\n", bzState.avail_in, (uint32_t)bzState.next_in, bzState.total_in_lo32 ); | 96 | nReadTotal += nRead-bzState.avail_out; |
97 | |||
98 | if( ret == BZ_STREAM_END ) | ||
99 | { | ||
100 | return nBytes-bzState.avail_out; | ||
101 | } | ||
102 | |||
103 | if( bzState.avail_out ) | ||
104 | { | ||
105 | nRead = rNext.read( pBuf, nBufSize ); | ||
106 | bzState.next_in = pBuf; | ||
107 | bzState.avail_in = nRead; | ||
108 | } | ||
109 | else | ||
110 | { | ||
111 | return nBytes-bzState.avail_out; | ||
112 | } | ||
113 | } | ||
91 | return 0; | 114 | return 0; |
92 | } | 115 | } |
93 | 116 | ||