Frames | No Frames |
1: /* 2: * CRLFOutputStream.java 3: * Copyright (C) 2002 The Free Software Foundation 4: * 5: * This file is part of GNU inetlib, a library. 6: * 7: * GNU inetlib is free software; you can redistribute it and/or modify 8: * it under the terms of the GNU General Public License as published by 9: * the Free Software Foundation; either version 2 of the License, or 10: * (at your option) any later version. 11: * 12: * GNU inetlib is distributed in the hope that it will be useful, 13: * but WITHOUT ANY WARRANTY; without even the implied warranty of 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: * GNU General Public License for more details. 16: * 17: * You should have received a copy of the GNU General Public License 18: * along with this library; if not, write to the Free Software 19: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20: * 21: * Linking this library statically or dynamically with other modules is 22: * making a combined work based on this library. Thus, the terms and 23: * conditions of the GNU General Public License cover the whole 24: * combination. 25: * 26: * As a special exception, the copyright holders of this library give you 27: * permission to link this library with independent modules to produce an 28: * executable, regardless of the license terms of these independent 29: * modules, and to copy and distribute the resulting executable under 30: * terms of your choice, provided that you also meet, for each linked 31: * independent module, the terms and conditions of the license of that 32: * module. An independent module is a module which is not derived from 33: * or based on this library. If you modify this library, you may extend 34: * this exception to your version of the library, but you are not 35: * obliged to do so. If you do not wish to do so, delete this 36: * exception statement from your version. 37: */ 38: 39: package gnu.inet.util; 40: 41: import java.io.FilterOutputStream; 42: import java.io.IOException; 43: import java.io.OutputStream; 44: import java.io.UnsupportedEncodingException; 45: 46: /** 47: * An output stream that filters LFs into CR/LF pairs. 48: * 49: * @author <a href="mailto:dog@gnu.org">Chris Burdess</a> 50: */ 51: public class CRLFOutputStream 52: extends FilterOutputStream 53: { 54: 55: static final String US_ASCII = "US-ASCII"; 56: 57: /** 58: * The CR octet. 59: */ 60: public static final int CR = 13; 61: 62: /** 63: * The LF octet. 64: */ 65: public static final int LF = 10; 66: 67: /** 68: * The CR/LF pair. 69: */ 70: public static final byte[] CRLF = { CR, LF }; 71: 72: /** 73: * The last byte read. 74: */ 75: protected int last; 76: 77: /** 78: * Constructs a CR/LF output stream connected to the specified output stream. 79: */ 80: public CRLFOutputStream(OutputStream out) 81: { 82: super(out); 83: last = -1; 84: } 85: 86: /** 87: * Writes a character to the underlying stream. 88: * @exception IOException if an I/O error occurred 89: */ 90: public void write(int ch) throws IOException 91: { 92: if (ch == CR) 93: { 94: out.write(CRLF); 95: } 96: else if (ch == LF) 97: { 98: if (last != CR) 99: { 100: out.write(CRLF); 101: } 102: } 103: else 104: { 105: out.write(ch); 106: } 107: last = ch; 108: } 109: 110: /** 111: * Writes a byte array to the underlying stream. 112: * @exception IOException if an I/O error occurred 113: */ 114: public void write(byte[] b) 115: throws IOException 116: { 117: write(b, 0, b.length); 118: } 119: 120: /** 121: * Writes a portion of a byte array to the underlying stream. 122: * @exception IOException if an I/O error occurred 123: */ 124: public void write(byte[] b, int off, int len) 125: throws IOException 126: { 127: int d = off; 128: len += off; 129: for (int i = off; i < len; i++) 130: { 131: switch (b[i]) 132: { 133: case CR: 134: out.write (b, d, i - d); 135: out.write (CRLF, 0, 2); 136: d = i + 1; 137: break; 138: case LF: 139: if (last != CR) 140: { 141: out.write (b, d, i - d); 142: out.write (CRLF, 0, 2); 143: } 144: d = i + 1; 145: break; 146: } 147: last = b[i]; 148: } 149: if (len - d > 0) 150: { 151: out.write (b, d, len - d); 152: } 153: } 154: 155: /** 156: * Writes the specified ASCII string to the underlying stream. 157: * @exception IOException if an I/O error occurred 158: */ 159: public void write(String text) 160: throws IOException 161: { 162: try 163: { 164: byte[] bytes = text.getBytes(US_ASCII); 165: write(bytes, 0, bytes.length); 166: } 167: catch (UnsupportedEncodingException e) 168: { 169: throw new IOException("The US-ASCII encoding is not supported " + 170: "on this system"); 171: } 172: } 173: 174: /** 175: * Writes a newline to the underlying stream. 176: * @exception IOException if an I/O error occurred 177: */ 178: public void writeln() 179: throws IOException 180: { 181: out.write(CRLF, 0, 2); 182: } 183: 184: }