Source for gnu.inet.util.MessageOutputStream

   1: /*
   2:  * MessageOutputStream.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: 
  45: /**
  46:  * An output stream that escapes any dots on a line by themself with
  47:  * another dot, for the purposes of sending messages to SMTP and NNTP
  48:  * servers.
  49:  *
  50:  * @author <a href="mailto:dog@gnu.org">Chris Burdess</a>
  51:  */
  52: public class MessageOutputStream
  53:   extends FilterOutputStream
  54: {
  55: 
  56:   /**
  57:    * The stream termination octet.
  58:    */
  59:   public static final int END = 46;
  60: 
  61:   /**
  62:    * The line termination octet.
  63:    */
  64:   public static final int LF = 10;
  65: 
  66:   int[] last = { LF, LF };      // the last character written to the stream
  67: 
  68:   /**
  69:    * Constructs a message output stream connected to the specified output
  70:    * stream.
  71:    * @param out the target output stream
  72:    */
  73:   public MessageOutputStream(OutputStream out)
  74:   {
  75:     super(out);
  76:   }
  77: 
  78:   /**
  79:    * Character write.
  80:    */
  81:   public void write(int c)
  82:     throws IOException
  83:   {
  84:     if (last[0] == LF && last[1] == END && c == LF)
  85:       {
  86:         out.write (END);
  87:       }
  88:     out.write(c);
  89:     last[0] = last[1];
  90:     last[1] = c;
  91:   }
  92:   
  93:   public void write(byte[] bytes)
  94:     throws IOException
  95:   {
  96:     write(bytes, 0, bytes.length);
  97:   }
  98: 
  99:   /**
 100:    * Block write.
 101:    */
 102:   public void write(byte[] bytes, int off, int len)
 103:     throws IOException
 104:   {
 105:     for (int i = 0; i < len; i++)
 106:       {
 107:         int c = (int) bytes[off + i];
 108:         if (last[0] == LF && last[1] == END && c == LF)
 109:           {
 110:             byte[] b2 = new byte[bytes.length + 1];
 111:             System.arraycopy(bytes, off, b2, off, i);
 112:             b2[off + i] = END;
 113:             System.arraycopy(bytes, off + i, b2, off + i + 1, len - i);
 114:             bytes = b2;
 115:             i++;
 116:             len++;
 117:           }
 118:         last[0] = last[1];
 119:         last[1] = c;
 120:       }
 121:     out.write(bytes, off, len);
 122:   }
 123: 
 124: }