1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include "bu/bzip2.h"
#include "bu/exceptions.h"
using namespace Bu;
Bu::BZip2::BZip2( Bu::Stream &rNext, int nCompression ) :
Bu::Filter( rNext ),
nCompression( nCompression )
{
start();
}
Bu::BZip2::~BZip2()
{
printf("-> Bu::BZip2::~BZip2()\n");
stop();
}
void Bu::BZip2::start()
{
printf("-> Bu::BZip2::start()\n");
printf("Hey, it's starting...\n");
bzState.state = NULL;
bzState.bzalloc = NULL;
bzState.bzfree = NULL;
bzState.opaque = NULL;
nBufSize = 50000;
pBuf = new char[nBufSize];
}
void Bu::BZip2::stop()
{
printf("-> Bu::BZip2::stop()\n");
if( bzState.state )
{
if( bReading )
{
}
else
{
for(;;)
{
bzState.next_in = NULL;
bzState.avail_in = 0;
bzState.avail_out = nBufSize;
bzState.next_out = pBuf;
int res = BZ2_bzCompress( &bzState, BZ_FINISH );
if( bzState.avail_out < nBufSize )
{
rNext.write( pBuf, nBufSize-bzState.avail_out );
}
if( res == BZ_STREAM_END )
break;
}
BZ2_bzCompressEnd( &bzState );
}
}
}
void Bu::BZip2::bzError( int code )
{
switch( code )
{
case BZ_OK:
return;
case BZ_CONFIG_ERROR:
throw ExceptionBase("The bzip2 library has been miscompiled.");
case BZ_PARAM_ERROR:
throw ExceptionBase("bzip2 parameter error.");
case BZ_MEM_ERROR:
throw ExceptionBase("Not enough memory available for bzip2.");
}
}
size_t Bu::BZip2::read( void *pData, size_t nBytes )
{
if( !bzState.state )
{
bReading = true;
}
if( bReading == false )
throw ExceptionBase("This bzip2 filter is in writing mode, you can't read.");
//bzState.next_in = pData;
//bzState.avail_in = nSizeIn;
//printf("%db at [%08X] (%db)\n", bzState.avail_in, (uint32_t)bzState.next_in, bzState.total_in_lo32 );
return 0;
}
size_t Bu::BZip2::write( const void *pData, size_t nBytes )
{
if( !bzState.state )
{
bReading = false;
BZ2_bzCompressInit( &bzState, nCompression, 0, 30 );
}
if( bReading == true )
throw ExceptionBase("This bzip2 filter is in reading mode, you can't write.");
bzState.next_in = (char *)pData;
bzState.avail_in = nBytes;
for(;;)
{
bzState.avail_out = nBufSize;
bzState.next_out = pBuf;
BZ2_bzCompress( &bzState, BZ_RUN );
if( bzState.avail_out < nBufSize )
{
rNext.write( pBuf, nBufSize-bzState.avail_out );
}
if( bzState.avail_in == 0 )
break;
}
return 0;
}
|