FileDocCategorySizeDatePackage
Seeder.javaAPI DocExample1932Mon Feb 23 16:11:26 GMT 1998oreilly.jonathan.util

Seeder.java

package oreilly.jonathan.util;

import java.awt.AWTEventMulticaster;
import java.awt.event.*;

public class Seeder
    implements KeyListener {
  protected byte[] mSeed;
  protected int mBitIndex;
  protected boolean mDone;
  protected char mLastKeyChar;
  protected ActionListener mListenerChain;
  protected Counter mCounter;

  public Seeder(int seedBytes) { reset(seedBytes); }
  
  public void reset(int seedBytes) {
    mSeed = new byte[seedBytes];
    mBitIndex = seedBytes * 8 - 1;
    mDone = false;
    mLastKeyChar = '\0';
    mListenerChain = null;
    mCounter = new Counter();
  }

  public byte[] getSeed() { return mSeed; }
  public int getBitLength() { return mSeed.length * 8; }

  public int getCurrentBitIndex() {
    return mSeed.length * 8 - 1 - mBitIndex;
  }

  public void addActionListener(ActionListener al) {
    mListenerChain = AWTEventMulticaster.add(mListenerChain, al);
  }
  
  public void removeActionListener(ActionListener al) {
    mListenerChain = AWTEventMulticaster.remove(mListenerChain, al);
  }

  public void keyPressed(KeyEvent ke) {}
  public void keyReleased(KeyEvent ke) {}
  public void keyTyped(KeyEvent ke) {
    char keyChar = ke.getKeyChar();
    if (keyChar != mLastKeyChar)
      grabTimeBit();
    mLastKeyChar = keyChar;
  }

  protected void grabTimeBit() {
    if (mDone) return;
    int t = mCounter.getCount();
    int bit = t & 0x0001;

    if (bit != 0) {
      int seedIndex = mBitIndex / 8;
      int shiftIndex = mBitIndex % 8;
      mSeed[seedIndex] |= (bit << shiftIndex);
    }

    mBitIndex--;

    if (mBitIndex < 0) {
      mCounter.stop();
      mBitIndex = 0; // Reset this so getCurrentBitIndex() works.
      mDone = true;

      if (mListenerChain != null) {
        mListenerChain.actionPerformed(
            new ActionEvent(this, 0, "Your seed is ready."));
      }
    }
  }
}