View Javadoc

1   /* (c) Copyright 2003 Caleigo AB, All rights reserved. 
2    * 
3    * This library is free software; you can redistribute it and/or
4    * modify it under the terms of the GNU Lesser General Public
5    * License as published by the Free Software Foundation; either
6    * version 2.1 of the License, or (at your option) any later version.
7    * 
8    * This library is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11   * Lesser General Public License for more details.
12   * 
13   * You should have received a copy of the GNU Lesser General Public
14   * License along with this library; if not, write to the Free Software
15   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16   *  
17   */
18  
19  package org.caleigo.toolkit.tunnel;
20  
21  import java.io.*;
22  
23  /***
24   *
25   * @author  Mattias Hagstrand
26   * @version 1.00
27   * 
28   *//* 
29   *
30   * WHEN        WHO               WHY & WHAT
31   * -----------------------------------------------------------------------------
32   * 2002-07-31  Mattias Hagstrand Creation
33   */
34  public class ScramblePacker implements ITunnelPacker
35  {
36      // Constants ---------------------------------------------------------------
37      public static final byte DEFAULT_XOR_MASK = 0xF;
38      
39      // Data members ------------------------------------------------------------
40      protected byte mXorMask;
41      
42      // Constructors ------------------------------------------------------------
43      public ScramblePacker()
44      {
45          this(DEFAULT_XOR_MASK);
46      }
47      
48      public ScramblePacker(byte xorMask)
49      {
50          mXorMask = xorMask;
51      }
52      
53      // ITunnelPacker implementation --------------------------------------------
54      
55      /***
56       * Creates and returns an InputStream that wrapps the provided InputStream.
57       * The returned InputStream can then be used to unpack messages. The returned
58       * InputStream must be stateless.
59       */
60      public InputStream createInputStream(InputStream in)
61      {
62          return new ScramblePackerInputStream(in);
63      }
64      
65      /***
66       * Creates and returns an OutputStream that wrapps the provided OutputStream.
67       * The returned OutputStream can then be used to pack messages. The returned
68       * OutputStream must be stateless.
69       */
70      public OutputStream createOutputStream(OutputStream out)
71      {
72          return new ScramblePackerOutputStream(out);
73      }
74      
75      // Nested classes ----------------------------------------------------------
76      protected class ScramblePackerOutputStream extends FilterOutputStream
77      {
78          // Constructors --------------------------------------------------------
79          public ScramblePackerOutputStream(OutputStream out)
80          {
81              super(out);
82          }
83          
84          // Superclass overrides ------------------------------------------------        
85          public void write(int b)
86              throws IOException
87          {
88              this.out.write(b ^ mXorMask);
89          }
90      }
91      
92      /***
93       * Uses a ZipInputStream to read and unzip data from an InputStream. It uses
94       * a circular buffer to store the unziped data.
95       */
96      protected class ScramblePackerInputStream extends FilterInputStream
97      {
98          // Constructors --------------------------------------------------------
99          public ScramblePackerInputStream(InputStream in)
100         {
101             super(in);
102         }
103         
104         // Superclass overrides ------------------------------------------------
105         public int read()
106             throws IOException
107         {
108             return (this.in.read() ^ mXorMask);
109         }
110         
111         public int read(byte[] b, int off, int len)
112             throws IOException
113         {
114             int nbrOfBytesRead = this.in.read(b, off, len);
115             for (int i = off; i < off + nbrOfBytesRead; i++)
116                 b[i] ^= mXorMask;
117             return nbrOfBytesRead;
118         }
119     }
120 }