home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / java / util / uuencoder.java < prev    next >
Text File  |  1995-08-11  |  6KB  |  193 lines

  1. /*
  2.  * @(#)UUEncoder.java    1.3 95/03/16 Chuck McManis
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19. package java.util;
  20.  
  21. import java.io.InputStream;
  22. import java.io.OutputStream;
  23. import java.io.PrintStream;
  24.  
  25. /**
  26.  * This class implements a Berkeley uu character encoder. This encoder
  27.  * was made famous by uuencode program.
  28.  *
  29.  * The basic character coding is algorithmic, taking 6 bits of binary
  30.  * data and adding it to an ASCII ' ' (space) character. This converts
  31.  * these six bits into a printable representation. Note that it depends
  32.  * on the ASCII character encoding standard for english. Groups of three
  33.  * bytes are converted into 4 characters by treating the three bytes
  34.  * a four 6 bit groups, group 1 is byte 1's most significant six bits,
  35.  * group 2 is byte 1's least significant two bits plus byte 2's four
  36.  * most significant bits. etc.
  37.  *
  38.  * In this encoding, the buffer prefix is:
  39.  * <pre>
  40.  *     begin [mode] [filename]
  41.  * </pre>
  42.  *
  43.  * This is followed by one or more lines of the form:
  44.  * <pre>
  45.  *    (len)(data)(data)(data) ...
  46.  * </pre>
  47.  * where (len) is the number of bytes on this line. Note that groupings
  48.  * are always four characters, even if length is not a multiple of three
  49.  * bytes. When less than three characters are encoded, the values of the
  50.  * last remaining bytes is undefined and should be ignored.
  51.  *
  52.  * The last line of data in a uuencoded file is represented by a single
  53.  * space character. This is translated by the decoding engine to a line
  54.  * length of zero. This is immediately followed by a line which contains
  55.  * the word 'end[newline]'
  56.  *
  57.  * @version     1.3, 16 Mar 1995
  58.  * @author      Chuck McManis
  59.  * @see        CharacterEncoder
  60.  * @see        UUDecoder
  61.  */
  62. public class UUEncoder extends CharacterEncoder {
  63.  
  64.     /** 
  65.      * This name is stored in the begin line.
  66.      */
  67.     private String bufferName;
  68.  
  69.     /**
  70.      * Represents UNIX(tm) mode bits. Generally three octal digits representing
  71.      * read, write, and execute permission of the owner, group owner, and
  72.      * others. They should be interpreted as the bit groups:
  73.      * (owner) (group) (others)
  74.      *    rwx      rwx     rwx     (r = read, w = write, x = execute)
  75.      *
  76.      * By default these are set to 644 (UNIX rw-r--r-- permissions).
  77.      */
  78.     private int mode;
  79.  
  80.  
  81.     /**
  82.      * Default - buffer begin line will be:
  83.      * <pre>
  84.      *    begin 644 encoder.buf
  85.      * </pre>
  86.      */
  87.     public UUEncoder() {
  88.     bufferName = "encoder.buf";
  89.     mode = 644;
  90.     }
  91.  
  92.     /**
  93.      * Specifies a name for the encoded bufer, begin line will be:
  94.      * <pre>
  95.      *    begin 644 [FNAME]
  96.      * </pre>
  97.      */
  98.     public UUEncoder(String fname) {
  99.     bufferName = fname;
  100.     mode = 644;
  101.     }
  102.  
  103.     /**
  104.      * Specifies a name and mode for the encoded bufer, begin line will be:
  105.      * <pre>
  106.      *    begin [MODE] [FNAME]
  107.      * </pre>
  108.      */
  109.     public UUEncoder(String fname, int newMode) {
  110.     bufferName = fname;
  111.     mode = newMode;
  112.     }
  113.  
  114.     /** number of bytes per atom in uuencoding is 3 */
  115.     int bytesPerAtom() {
  116.     return (3);    
  117.     }
  118.  
  119.     /** number of bytes per line in uuencoding is 45 */
  120.     int bytesPerLine() {
  121.     return (45);
  122.     }
  123.  
  124.     /**
  125.      * encodeAtom - take three bytes and encodes them into 4 characters
  126.      * If len is less than 3 then remaining bytes are filled with '1'.
  127.      * This insures that the last line won't end in spaces and potentiallly
  128.      * be truncated.
  129.      */  
  130.     void encodeAtom(OutputStream outStream, byte data[], int offset, int len) {
  131.     byte    a, b = 1, c = 1;
  132.     int    c1, c2, c3, c4;
  133.  
  134.     a = data[offset];
  135.     if (len > 1) {
  136.         b = data[offset+1];
  137.     }
  138.     if (len > 2) {
  139.         c = data[offset+2];
  140.     }
  141.  
  142.     c1 = (a >>> 2) & 0xff;
  143.     c2 = ((a << 4) & 0x30) | ((b >>> 4) & 0xf);
  144.     c3 = ((b << 2) & 0x3c) | ((c >>> 6) & 0x3);
  145.     c4 = c & 0x3f;
  146.     outStream.write(c1 + ' ');
  147.     outStream.write(c2 + ' ');
  148.     outStream.write(c3 + ' ');
  149.     outStream.write(c4 + ' ');
  150.     return;
  151.     }
  152.  
  153.     /**
  154.      * Encode the line prefix which consists of the single character. The
  155.      * lenght is added to the value of ' ' (32 decimal) and printed.
  156.      */
  157.     void encodeLinePrefix(OutputStream outStream, int length) {
  158.     outStream.write((length & 0x3f) + ' ');
  159.     } 
  160.  
  161.  
  162.     /**
  163.      * The line suffix for uuencoded files is simply a new line.
  164.      */
  165.     void encodeLineSuffix(OutputStream outStream) {
  166.     pStream.println();
  167.     }
  168.  
  169.     /**
  170.      * encodeBufferPrefix writes the begin line to the output stream.
  171.      */
  172.     void encodeBufferPrefix(OutputStream a) { 
  173.     super.pStream = new PrintStream(a);
  174.     super.pStream.print("begin "+mode+" ");
  175.     if (bufferName != null) {
  176.         super.pStream.println(bufferName);
  177.     } else {
  178.         super.pStream.println("encoder.bin");
  179.     }
  180.     super.pStream.flush();
  181.     }
  182.  
  183.     /**
  184.      * encodeBufferSuffix writes the single line containing space (' ') and
  185.      * the line containing the word 'end' to the output stream.
  186.      */
  187.     void encodeBufferSuffix(OutputStream a) { 
  188.     super.pStream.println(" \nend");
  189.     super.pStream.flush();
  190.     }
  191.  
  192. }
  193.