]> cygwin.com Git - cygwin-apps/setup.git/blame - compress_bz.cc
* propsheet.cc (PropSheet::SetActivePage): Remove :: from call to
[cygwin-apps/setup.git] / compress_bz.cc
CommitLineData
b24c88b3
RC
1/*
2 * Copyright (c) 2001, Robert Collins.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 * Written by Robert Collins <rbtcollins@hotmail.com>
13 *
14 */
15
92ef6cf8
BD
16/* Archive IO operations for bz2 files. Derived from the fd convenience
17 functions in the libbz2 package. */
b24c88b3 18
b24c88b3 19#include "compress_bz.h"
b24c88b3 20
b16e07fc
MB
21#include <stdexcept>
22using namespace std;
23#include <errno.h>
24
387cb501 25compress_bz::compress_bz (io_stream * parent) : peeklen (0), position (0)
b24c88b3
RC
26{
27 /* read only via this constructor */
28 original = 0;
29 lasterr = 0;
30 if (!parent || parent->error ())
31 {
32 lasterr = EBADF;
33 return;
34 }
35 original = parent;
5bc84ff1 36 owns_original = true;
b24c88b3
RC
37
38 initialisedOk = 0;
39 bufN = 0;
40 writing = 0;
41 strm.bzalloc = 0;
42 strm.bzfree = 0;
43 strm.opaque = 0;
44 int ret = BZ2_bzDecompressInit (&(strm), 0, 0);
45 if (ret)
46 {
47 lasterr = ret;
48 return;
49 }
50 strm.avail_in = 0;
51 strm.next_in = 0;
52 initialisedOk = 1;
53}
54
387cb501
RC
55ssize_t
56compress_bz::read (void *buffer, size_t len)
b24c88b3
RC
57{
58 if (!initialisedOk || writing)
59 return EBADF;
60 if (len == 0)
61 return 0;
62
63 if (peeklen)
92ef6cf8
BD
64 {
65 ssize_t tmplen = std::min (peeklen, len);
66 peeklen -= tmplen;
67 memcpy (buffer, peekbuf, tmplen);
68 memmove (peekbuf, peekbuf + tmplen, tmplen);
69 ssize_t tmpread = read (&((char *) buffer)[tmplen], len - tmplen);
70 if (tmpread >= 0)
b24c88b3 71 return tmpread + tmplen;
92ef6cf8 72 else
b24c88b3
RC
73 return tmpread;
74 }
75
76 strm.avail_out = len;
77 strm.next_out = (char *) buffer;
92ef6cf8 78 int rlen = 1;
b24c88b3
RC
79 while (1)
80 {
81 if (original->error ())
82 {
83 lasterr = original->error ();
84 return -1;
85 }
86 if (strm.avail_in == 0 && rlen > 0)
87 {
88 rlen = original->read (buf, 4096);
89 if (rlen < 0)
90 {
92ef6cf8
BD
91 if (original->error ())
92 lasterr = original->error ();
c1754473
RC
93 else
94 lasterr = rlen;
b24c88b3
RC
95 return -1;
96 }
97 bufN = rlen;
98 strm.avail_in = rlen;
99 strm.next_in = buf;
100 }
101 int
102 ret = BZ2_bzDecompress (&strm);
103 if (ret != BZ_OK && ret != BZ_STREAM_END)
104 {
105 lasterr = ret;
106 return -1;
107 }
108 if (ret == BZ_OK && rlen == 0 && strm.avail_out)
109 {
110 /* unexpected end of file */
111 lasterr = EIO;
112 return -1;
113 }
114 if (ret == BZ_STREAM_END)
387cb501
RC
115 {
116 position += len - strm.avail_out;
117 return len - strm.avail_out;
118 }
b24c88b3 119 if (strm.avail_out == 0)
387cb501
RC
120 {
121 position += len;
122 return len;
123 }
b24c88b3
RC
124 }
125
126 /* not reached */
127 return 0;
128}
129
ca9506cc 130ssize_t compress_bz::write (const void *buffer, size_t len)
b24c88b3 131{
92ef6cf8 132 throw new logic_error ("compress_bz::write is not implemented");
b24c88b3
RC
133}
134
135ssize_t compress_bz::peek (void *buffer, size_t len)
136{
b24c88b3 137 if (writing)
92ef6cf8
BD
138 {
139 lasterr = EBADF;
b24c88b3 140 return -1;
92ef6cf8
BD
141 }
142
b24c88b3
RC
143 /* can only peek 512 bytes */
144 if (len > 512)
92ef6cf8 145 return ENOMEM;
b24c88b3
RC
146
147 if (len > peeklen)
92ef6cf8
BD
148 {
149 size_t want = len - peeklen;
150 ssize_t got = read (&peekbuf[peeklen], want);
151 if (got >= 0)
152 peeklen += got;
153 else
154 /* error */
155 return got;
156
157 /* we may have read less than requested. */
158 memcpy (buffer, peekbuf, peeklen);
159 return peeklen;
160 }
b24c88b3 161 else
92ef6cf8
BD
162 {
163 memcpy (buffer, peekbuf, len);
164 return len;
165 }
b24c88b3
RC
166 return 0;
167}
168
169long
170compress_bz::tell ()
171{
387cb501 172 if (writing)
92ef6cf8
BD
173 throw new logic_error ("compress_bz::tell is not implemented "
174 "in writing mode");
387cb501 175 return position;
b24c88b3
RC
176}
177
ca9506cc
RC
178int
179compress_bz::seek (long where, io_stream_seek_t whence)
180{
92ef6cf8 181 throw new logic_error ("compress_bz::seek is not implemented");
ca9506cc
RC
182}
183
b24c88b3
RC
184int
185compress_bz::error ()
186{
c1754473 187 return lasterr;
b24c88b3
RC
188}
189
190int
26922cd2 191compress_bz::set_mtime (time_t time)
b24c88b3
RC
192{
193 if (original)
26922cd2 194 return original->set_mtime (time);
b24c88b3
RC
195 return 1;
196}
197
b41c2908 198time_t
b24c88b3
RC
199compress_bz::get_mtime ()
200{
201 if (original)
202 return original->get_mtime ();
203 return 0;
204}
205
b41c2908
CV
206mode_t
207compress_bz::get_mode ()
208{
209 if (original)
210 return original->get_mode ();
211 return 0;
212}
213
5bc84ff1
CW
214void
215compress_bz::release_original ()
216{
217 owns_original = false;
218}
219
b24c88b3
RC
220compress_bz::~compress_bz ()
221{
b24c88b3
RC
222 if (initialisedOk)
223 BZ2_bzDecompressEnd (&strm);
5bc84ff1 224 if (original && owns_original)
92ef6cf8 225 delete original;
b24c88b3 226}
This page took 0.090769 seconds and 5 git commands to generate.