1 /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
2 /*
3 Copyright (c) 2011 ymnk, JCraft,Inc. All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7 
8   1. Redistributions of source code must retain the above copyright notice,
9      this list of conditions and the following disclaimer.
10 
11   2. Redistributions in binary form must reproduce the above copyright
12      notice, this list of conditions and the following disclaimer in
13      the documentation and/or other materials provided with the distribution.
14 
15   3. The names of the authors may not be used to endorse or promote products
16      derived from this software without specific prior written permission.
17 
18 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
19 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
21 INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
22 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 package com.jcraft.jzlib;
31 import java.io.*;
32 
33 /**
34  * ZOutputStream
35  *
36  * @deprecated  use DeflaterOutputStream or InflaterInputStream
37  */
38 @Deprecated
39 public class ZOutputStream extends FilterOutputStream {
40 
41   protected int bufsize=512;
42   protected int flush=JZlib.Z_NO_FLUSH;
43   protected byte[] buf=new byte[bufsize];
44   protected boolean compress;
45 
46   protected OutputStream out;
47   private boolean end=false;
48 
49   private DeflaterOutputStream dos;
50   private Inflater inflater;
51 
ZOutputStream(OutputStream out)52   public ZOutputStream(OutputStream out) throws IOException {
53     super(out);
54     this.out=out;
55     inflater = new Inflater();
56     inflater.init();
57     compress=false;
58   }
59 
ZOutputStream(OutputStream out, int level)60   public ZOutputStream(OutputStream out, int level) throws IOException {
61     this(out, level, false);
62   }
63 
ZOutputStream(OutputStream out, int level, boolean nowrap)64   public ZOutputStream(OutputStream out, int level, boolean nowrap) throws IOException {
65     super(out);
66     this.out=out;
67     Deflater deflater = new Deflater(level, nowrap);
68     dos = new DeflaterOutputStream(out, deflater);
69     compress=true;
70   }
71 
72   private byte[] buf1 = new byte[1];
write(int b)73   public void write(int b) throws IOException {
74     buf1[0]=(byte)b;
75     write(buf1, 0, 1);
76   }
77 
write(byte b[], int off, int len)78   public void write(byte b[], int off, int len) throws IOException {
79     if(len==0) return;
80     if(compress){
81       dos.write(b, off, len);
82     }
83     else {
84       inflater.setInput(b, off, len, true);
85       int err = JZlib.Z_OK;
86       while(inflater.avail_in>0){
87         inflater.setOutput(buf, 0, buf.length);
88         err = inflater.inflate(flush);
89         if(inflater.next_out_index>0)
90           out.write(buf, 0, inflater.next_out_index);
91         if(err != JZlib.Z_OK)
92           break;
93       }
94       if(err != JZlib.Z_OK)
95         throw new ZStreamException("inflating: "+inflater.msg);
96       return;
97     }
98   }
99 
getFlushMode()100   public int getFlushMode() {
101     return flush;
102   }
103 
setFlushMode(int flush)104   public void setFlushMode(int flush) {
105     this.flush=flush;
106   }
107 
finish()108   public void finish() throws IOException {
109     int err;
110     if(compress){
111       int tmp = flush;
112       int flush = JZlib.Z_FINISH;
113       try{
114         write("".getBytes(), 0, 0);
115       }
116       finally { flush = tmp; }
117     }
118     else{
119       dos.finish();
120     }
121     flush();
122   }
end()123   public synchronized void end() {
124     if(end) return;
125     if(compress){
126       try { dos.finish(); } catch(Exception e){}
127     }
128     else{
129       inflater.end();
130     }
131     end=true;
132   }
close()133   public void close() throws IOException {
134     try{
135       try{finish();}
136       catch (IOException ignored) {}
137     }
138     finally{
139       end();
140       out.close();
141       out=null;
142     }
143   }
144 
getTotalIn()145   public long getTotalIn() {
146     if(compress) return dos.getTotalIn();
147     else return inflater.total_in;
148   }
149 
getTotalOut()150   public long getTotalOut() {
151     if(compress) return dos.getTotalOut();
152     else return inflater.total_out;
153   }
154 
flush()155   public void flush() throws IOException {
156     out.flush();
157   }
158 
159 }
160