xref: /titanic_41/usr/src/cmd/krb5/kadmin/gui/visualrt/sunsoft/jws/visual/rt/encoding/UCEncoder.java (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * ident	"%Z%%M%	%I%	%E% SMI"
24  *
25  * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
26  * All rights reserved.
27  */
28 
29 /**
30  * Copyright 1996 Active Software Inc.
31  */
32 
33 package sunsoft.jws.visual.rt.encoding;
34 
35 import java.io.*;
36 
37 // Referenced classes of package sunsoft.jws.visual.rt.encoding:
38 //            CRC16
39 
40 public class UCEncoder
41 {
42 
bytesPerAtom()43     protected int bytesPerAtom()
44     {
45         return 2;
46     }
47 
bytesPerLine()48     protected int bytesPerLine()
49     {
50         return 48;
51     }
52 
encodeAtom(OutputStream outStream, byte data[], int offset, int len)53     protected void encodeAtom(OutputStream outStream, byte data[],
54 			      int offset, int len)
55 	throws IOException
56     {
57         byte a = data[offset];
58         byte b;
59         if (len == 2)
60             b = data[offset + 1];
61         else
62             b = 0;
63         crc.update(a);
64         if (len == 2)
65             crc.update(b);
66         outStream.write(map_array[(a >>> 2 & 0x38) + (b >>> 5 & 0x7)]);
67         int p1 = 0;
68         int p2 = 0;
69         for (int i = 1; i < 256; i *= 2)
70 	    {
71 		if ((a & i) != 0)
72 		    p1++;
73 		if ((b & i) != 0)
74 		    p2++;
75 	    }
76 
77         p1 = (p1 & 0x1) * 32;
78         p2 = (p2 & 0x1) * 32;
79         outStream.write(map_array[(a & 0x1f) + p1]);
80         outStream.write(map_array[(b & 0x1f) + p2]);
81     }
82 
encodeLinePrefix(OutputStream outStream, int length)83     protected void encodeLinePrefix(OutputStream outStream, int length)
84 	throws IOException
85     {
86         outStream.write(42);
87         crc.value = 0;
88         tmp[0] = (byte)length;
89         tmp[1] = (byte)sequence;
90         sequence = sequence + 1 & 0xff;
91         encodeAtom(outStream, tmp, 0, 2);
92     }
93 
encodeLineSuffix(OutputStream outStream)94     protected void encodeLineSuffix(OutputStream outStream)
95 	throws IOException
96     {
97         tmp[0] = (byte)(crc.value >>> 8 & 0xff);
98         tmp[1] = (byte)(crc.value & 0xff);
99         encodeAtom(outStream, tmp, 0, 2);
100         pStream.println();
101     }
102 
encodeBufferPrefix(OutputStream a)103     protected void encodeBufferPrefix(OutputStream a)
104 	throws IOException
105     {
106         sequence = 0;
107         pStream = new PrintStream(a);
108     }
109 
encodeBuffer(InputStream inStream, OutputStream outStream)110     public void encodeBuffer(InputStream inStream,
111 			     OutputStream outStream)
112 	throws IOException
113     {
114         byte tmpbuffer[] = new byte[bytesPerLine()];
115         encodeBufferPrefix(outStream);
116         int numBytes;
117         do
118 	    {
119 		numBytes = readFully(inStream, tmpbuffer);
120 		if (numBytes == -1)
121 		    break;
122 		encodeLinePrefix(outStream, numBytes);
123 		for (int j = 0; j < numBytes; j += bytesPerAtom())
124 		    if (j + bytesPerAtom() <= numBytes)
125 			encodeAtom(outStream, tmpbuffer, j, bytesPerAtom());
126 		    else
127 			encodeAtom(outStream, tmpbuffer, j, numBytes - j);
128 
129 		encodeLineSuffix(outStream);
130 	    }
131         while (numBytes >= bytesPerLine());
132         encodeBufferSuffix(outStream);
133     }
134 
readFully(InputStream in, byte buffer[])135     protected int readFully(InputStream in, byte buffer[])
136 	throws IOException
137     {
138         for (int i = 0; i < buffer.length; i++)
139 	    {
140 		int q = in.read();
141 		if (q == -1)
142 		    return i;
143 		buffer[i] = (byte)q;
144 	    }
145 
146         return buffer.length;
147     }
148 
encodeBufferSuffix(OutputStream outputstream)149     protected void encodeBufferSuffix(OutputStream outputstream)
150 	throws IOException
151     {
152     }
153 
encodeBuffer(byte aBuffer[])154     public String encodeBuffer(byte aBuffer[])
155     {
156         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
157         ByteArrayInputStream inStream =
158 	    new ByteArrayInputStream(aBuffer);
159         try
160 	    {
161 		encodeBuffer(inStream, outStream);
162 	    }
163         catch (Exception ex)
164 	    {
165 		throw new Error("encodeBuffer internal error");
166 	    }
167         return outStream.toString();
168     }
169 
UCEncoder()170     public UCEncoder()
171     {
172         super();
173         tmp = new byte[2];
174         crc = new CRC16();
175     }
176 
177     private PrintStream pStream;
178     private static final byte map_array[] = {
179         48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
180         65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
181         75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
182         85, 86, 87, 88, 89, 90, 97, 98, 99, 100,
183         101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
184         111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
185         121, 122, 40, 41
186     };
187     private int sequence;
188     private byte tmp[];
189     private CRC16 crc;
190 
191 }
192