add src files decompiled via jad
authorAdam Megacz <adam@megacz.com>
Fri, 1 Jan 2010 23:52:45 +0000 (15:52 -0800)
committerAdam Megacz <adam@megacz.com>
Fri, 1 Jan 2010 23:52:45 +0000 (15:52 -0800)
30 files changed:
src/Acme/Crypto/DesCipher.java [new file with mode: 0644]
src/mcsClient/BitMap.java [new file with mode: 0644]
src/mcsClient/ColorPalette.java [new file with mode: 0644]
src/mcsClient/ComboKeyArray.java [new file with mode: 0644]
src/mcsClient/DatagramReader.java [new file with mode: 0644]
src/mcsClient/Decompress.java [new file with mode: 0644]
src/mcsClient/DefaultKeyArray.java [new file with mode: 0644]
src/mcsClient/Help.java [new file with mode: 0644]
src/mcsClient/HexConversion.java [new file with mode: 0644]
src/mcsClient/KeepAlive.java [new file with mode: 0644]
src/mcsClient/KeyButton.java [new file with mode: 0644]
src/mcsClient/KeyButtonListener.java [new file with mode: 0644]
src/mcsClient/KeyData.java [new file with mode: 0644]
src/mcsClient/KeyMap.java [new file with mode: 0644]
src/mcsClient/LiveVideoPanel.java [new file with mode: 0644]
src/mcsClient/LockingKeyStateManager.java [new file with mode: 0644]
src/mcsClient/McsClient.java [new file with mode: 0644]
src/mcsClient/McsKeyAdapter.java [new file with mode: 0644]
src/mcsClient/McsMouseAdapter.java [new file with mode: 0644]
src/mcsClient/McsMouseMotionAdapter.java [new file with mode: 0644]
src/mcsClient/McsTargetSize.java [new file with mode: 0644]
src/mcsClient/McsTcpConnection.java [new file with mode: 0644]
src/mcsClient/McsToolBar.java [new file with mode: 0644]
src/mcsClient/McsVersion.java [new file with mode: 0644]
src/mcsClient/MessageCodes.java [new file with mode: 0644]
src/mcsClient/MessageReader.java [new file with mode: 0644]
src/mcsClient/Options.java [new file with mode: 0644]
src/mcsClient/Row.java [new file with mode: 0644]
src/mcsClient/SavedSettings.java [new file with mode: 0644]
src/mcsClient/SecureDatagramSocket.java [new file with mode: 0644]

diff --git a/src/Acme/Crypto/DesCipher.java b/src/Acme/Crypto/DesCipher.java
new file mode 100644 (file)
index 0000000..0aae709
--- /dev/null
@@ -0,0 +1,289 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package Acme.Crypto;
+
+
+public class DesCipher {
+
+    private int encryptKeys[];
+    private int decryptKeys[];
+    private int tempInts[];
+    private static byte bytebit[] = {
+        1, 2, 4, 8, 16, 32, 64, -128
+    };
+    private static int bigbyte[] = {
+        0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000, 0x10000, 32768, 16384, 
+        8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 
+        8, 4, 2, 1
+    };
+    private static byte pc1[] = {
+        56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 
+        41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 
+        26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 
+        46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 
+        29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 
+        12, 4, 27, 19, 11, 3
+    };
+    private static int totrot[] = {
+        1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 
+        19, 21, 23, 25, 27, 28
+    };
+    private static byte pc2[] = {
+        13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 
+        20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 
+        26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 
+        29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 
+        33, 52, 45, 41, 49, 35, 28, 31
+    };
+    private static int SP1[] = {
+        0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 4, 0x10000, 1024, 0x1010400, 
+        0x1010404, 1024, 0x1000404, 0x1010004, 0x1000000, 4, 1028, 0x1000400, 0x1000400, 0x10400, 
+        0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, 0, 1028, 
+        0x10404, 0x1000000, 0x10000, 0x1010404, 4, 0x1010000, 0x1010400, 0x1000000, 0x1000000, 1024, 
+        0x1010004, 0x10000, 0x10400, 0x1000004, 1024, 4, 0x1000404, 0x10404, 0x1010404, 0x10004, 
+        0x1010000, 0x1000404, 0x1000004, 1028, 0x10404, 0x1010400, 1028, 0x1000400, 0x1000400, 0, 
+        0x10004, 0x10400, 0, 0x1010004
+    };
+    private static int SP2[] = {
+        0x80108020, 0x80008000, 32768, 0x108020, 0x100000, 32, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 
+        0x80108000, 0x80000000, 0x80008000, 0x100000, 32, 0x80100020, 0x108000, 0x100020, 0x80008020, 0, 
+        0x80000000, 32768, 0x108020, 0x80100000, 0x100020, 0x80000020, 0, 0x108000, 32800, 0x80108000, 
+        0x80100000, 32800, 0, 0x108020, 0x80100020, 0x100000, 0x80008020, 0x80100000, 0x80108000, 32768, 
+        0x80100000, 0x80008000, 32, 0x80108020, 0x108020, 32, 32768, 0x80000000, 32800, 0x80108000, 
+        0x100000, 0x80000020, 0x100020, 0x80008020, 0x80000020, 0x100020, 0x108000, 0, 0x80008000, 32800, 
+        0x80000000, 0x80100020, 0x80108020, 0x108000
+    };
+    private static int SP3[] = {
+        520, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008, 0x8000008, 
+        0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 520, 0x8000000, 8, 0x8020200, 512, 
+        0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 8, 0x8020208, 
+        512, 0x8000000, 0x8020200, 0x8000000, 0x20008, 520, 0x20000, 0x8020200, 0x8000200, 0, 
+        512, 0x20008, 0x8020208, 0x8000200, 0x8000008, 512, 0, 0x8020008, 0x8000208, 0x20000, 
+        0x8000000, 0x8020208, 8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 520, 0x8020000, 
+        0x20208, 8, 0x8020008, 0x20200
+    };
+    private static int SP4[] = {
+        0x802001, 8321, 8321, 128, 0x802080, 0x800081, 0x800001, 8193, 0, 0x802000, 
+        0x802000, 0x802081, 129, 0, 0x800080, 0x800001, 1, 8192, 0x800000, 0x802001, 
+        128, 0x800000, 8193, 8320, 0x800081, 1, 8320, 0x800080, 8192, 0x802080, 
+        0x802081, 129, 0x800080, 0x800001, 0x802000, 0x802081, 129, 0, 0, 0x802000, 
+        8320, 0x800080, 0x800081, 1, 0x802001, 8321, 8321, 128, 0x802081, 129, 
+        1, 8192, 0x800001, 8193, 0x802080, 0x800081, 8193, 8320, 0x800000, 0x802001, 
+        128, 0x800000, 8192, 0x802080
+    };
+    private static int SP5[] = {
+        256, 0x2080100, 0x2080000, 0x42000100, 0x80000, 256, 0x40000000, 0x2080000, 0x40080100, 0x80000, 
+        0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, 0x40080000, 0, 
+        0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0, 0x42000000, 0x2080100, 0x2000000, 
+        0x42000000, 0x80100, 0x80000, 0x42000100, 256, 0x2000000, 0x40000000, 0x2080000, 0x42000100, 0x40080100, 
+        0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 256, 0x2000000, 0x42080000, 0x42080100, 0x80100, 
+        0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, 
+        0, 0x40080000, 0x2080100, 0x40000100
+    };
+    private static int SP6[] = {
+        0x20000010, 0x20400000, 16384, 0x20404010, 0x20400000, 16, 0x20404010, 0x400000, 0x20004000, 0x404010, 
+        0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 16400, 0, 0x400010, 0x20004010, 16384, 
+        0x404000, 0x20004010, 16, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000, 16400, 0x404000, 
+        0x20404000, 0x20000000, 0x20004000, 16, 0x20400010, 0x404000, 0x20404010, 0x400000, 16400, 0x20000010, 
+        0x400000, 0x20004000, 0x20000000, 16400, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, 
+        0, 0x20400010, 16, 16384, 0x20400000, 0x404010, 16384, 0x400010, 0x20004010, 0, 
+        0x20404000, 0x20000000, 0x400010, 0x20004010
+    };
+    private static int SP7[] = {
+        0x200000, 0x4200002, 0x4000802, 0, 2048, 0x4000802, 0x200802, 0x4200800, 0x4200802, 0x200000, 
+        0, 0x4000002, 2, 0x4000000, 0x4200002, 2050, 0x4000800, 0x200802, 0x200002, 0x4000800, 
+        0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 2048, 2050, 0x4200802, 0x200800, 2, 
+        0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 2, 
+        0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 2050, 0x200802, 0x4200800, 2050, 0x4000002, 
+        0x4200802, 0x4200000, 0x200800, 0, 2, 0x4200802, 0, 0x200802, 0x4200000, 2048, 
+        0x4000002, 0x4000800, 2048, 0x200002
+    };
+    private static int SP8[] = {
+        0x10001040, 4096, 0x40000, 0x10041040, 0x10000000, 0x10001040, 64, 0x10000000, 0x40040, 0x10040000, 
+        0x10041040, 0x41000, 0x10041000, 0x41040, 4096, 64, 0x10040000, 0x10000040, 0x10001000, 4160, 
+        0x41000, 0x40040, 0x10040040, 0x10041000, 4160, 0, 0, 0x10040040, 0x10000040, 0x10001000, 
+        0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 4096, 64, 0x10040040, 4096, 0x41040, 
+        0x10001000, 64, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, 0, 0x10041040, 
+        0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0, 0x10041040, 0x41000, 0x41000, 4160, 
+        4160, 0x40040, 0x10000000, 0x10041000
+    };
+
+    public DesCipher(byte abyte0[]) {
+        encryptKeys = new int[32];
+        decryptKeys = new int[32];
+        tempInts = new int[2];
+        setKey(abyte0);
+    }
+
+    public void setKey(byte abyte0[]) {
+        deskey(abyte0, true, encryptKeys);
+        deskey(abyte0, false, decryptKeys);
+    }
+
+    private void deskey(byte abyte0[], boolean flag, int ai[]) {
+        int ai1[] = new int[56];
+        int ai2[] = new int[56];
+        int ai3[] = new int[32];
+        for (int j = 0; j < 56; j++) {
+            byte byte0 = pc1[j];
+            int l1 = byte0 & 7;
+            ai1[j] = (abyte0[byte0 >>> 3] & bytebit[l1]) == 0 ? 0 : 1;
+        }
+
+        for (int i = 0; i < 16; i++) {
+            int i2;
+            if (flag)
+                i2 = i << 1;
+            else
+                i2 = 15 - i << 1;
+            int j2 = i2 + 1;
+            ai3[i2] = ai3[j2] = 0;
+            for (int k = 0; k < 28; k++) {
+                int j1 = k + totrot[i];
+                if (j1 < 28)
+                    ai2[k] = ai1[j1];
+                else
+                    ai2[k] = ai1[j1 - 28];
+            }
+
+            for (int l = 28; l < 56; l++) {
+                int k1 = l + totrot[i];
+                if (k1 < 56)
+                    ai2[l] = ai1[k1];
+                else
+                    ai2[l] = ai1[k1 - 28];
+            }
+
+            for (int i1 = 0; i1 < 24; i1++) {
+                if (ai2[pc2[i1]] != 0)
+                    ai3[i2] |= bigbyte[i1];
+                if (ai2[pc2[i1 + 24]] != 0)
+                    ai3[j2] |= bigbyte[i1];
+            }
+
+        }
+
+        cookey(ai3, ai);
+    }
+
+    private void cookey(int ai[], int ai1[]) {
+        int i1 = 0;
+        int k = 0;
+        int l = 0;
+        for (; i1 < 16; i1++) {
+            int i = ai[k++];
+            int j = ai[k++];
+            ai1[l] = (i & 0xfc0000) << 6;
+            ai1[l] |= (i & 0xfc0) << 10;
+            ai1[l] |= (j & 0xfc0000) >>> 10;
+            ai1[l] |= (j & 0xfc0) >>> 6;
+            l++;
+            ai1[l] = (i & 0x3f000) << 12;
+            ai1[l] |= (i & 0x3f) << 16;
+            ai1[l] |= (j & 0x3f000) >>> 4;
+            ai1[l] |= j & 0x3f;
+            l++;
+        }
+
+    }
+
+    public void encrypt(byte abyte0[], int i, byte abyte1[], int j) {
+        squashBytesToInts(abyte0, i, tempInts, 0, 2);
+        des(tempInts, tempInts, encryptKeys);
+        spreadIntsToBytes(tempInts, 0, abyte1, j, 2);
+    }
+
+    public void decrypt(byte abyte0[], int i, byte abyte1[], int j) {
+        squashBytesToInts(abyte0, i, tempInts, 0, 2);
+        des(tempInts, tempInts, decryptKeys);
+        spreadIntsToBytes(tempInts, 0, abyte1, j, 2);
+    }
+
+    private void des(int ai[], int ai1[], int ai2[]) {
+        int j1 = 0;
+        int l = ai[0];
+        int k = ai[1];
+        int j = (l >>> 4 ^ k) & 0xf0f0f0f;
+        k ^= j;
+        l ^= j << 4;
+        j = (l >>> 16 ^ k) & 0xffff;
+        k ^= j;
+        l ^= j << 16;
+        j = (k >>> 2 ^ l) & 0x33333333;
+        l ^= j;
+        k ^= j << 2;
+        j = (k >>> 8 ^ l) & 0xff00ff;
+        l ^= j;
+        k ^= j << 8;
+        k = k << 1 | k >>> 31 & 1;
+        j = (l ^ k) & 0xaaaaaaaa;
+        l ^= j;
+        k ^= j;
+        l = l << 1 | l >>> 31 & 1;
+        for (int i1 = 0; i1 < 8; i1++) {
+            j = k << 28 | k >>> 4;
+            j ^= ai2[j1++];
+            int i = SP7[j & 0x3f];
+            i |= SP5[j >>> 8 & 0x3f];
+            i |= SP3[j >>> 16 & 0x3f];
+            i |= SP1[j >>> 24 & 0x3f];
+            j = k ^ ai2[j1++];
+            i |= SP8[j & 0x3f];
+            i |= SP6[j >>> 8 & 0x3f];
+            i |= SP4[j >>> 16 & 0x3f];
+            i |= SP2[j >>> 24 & 0x3f];
+            l ^= i;
+            j = l << 28 | l >>> 4;
+            j ^= ai2[j1++];
+            i = SP7[j & 0x3f];
+            i |= SP5[j >>> 8 & 0x3f];
+            i |= SP3[j >>> 16 & 0x3f];
+            i |= SP1[j >>> 24 & 0x3f];
+            j = l ^ ai2[j1++];
+            i |= SP8[j & 0x3f];
+            i |= SP6[j >>> 8 & 0x3f];
+            i |= SP4[j >>> 16 & 0x3f];
+            i |= SP2[j >>> 24 & 0x3f];
+            k ^= i;
+        }
+
+        k = k << 31 | k >>> 1;
+        j = (l ^ k) & 0xaaaaaaaa;
+        l ^= j;
+        k ^= j;
+        l = l << 31 | l >>> 1;
+        j = (l >>> 8 ^ k) & 0xff00ff;
+        k ^= j;
+        l ^= j << 8;
+        j = (l >>> 2 ^ k) & 0x33333333;
+        k ^= j;
+        l ^= j << 2;
+        j = (k >>> 16 ^ l) & 0xffff;
+        l ^= j;
+        k ^= j << 16;
+        j = (k >>> 4 ^ l) & 0xf0f0f0f;
+        l ^= j;
+        k ^= j << 4;
+        ai1[0] = k;
+        ai1[1] = l;
+    }
+
+    public static void squashBytesToInts(byte abyte0[], int i, int ai[], int j, int k) {
+        for (int l = 0; l < k; l++)
+            ai[j + l] = (abyte0[i + l * 4] & 0xff) << 24 | (abyte0[i + l * 4 + 1] & 0xff) << 16 | (abyte0[i + l * 4 + 2] & 0xff) << 8 | abyte0[i + l * 4 + 3] & 0xff;
+
+    }
+
+    public static void spreadIntsToBytes(int ai[], int i, byte abyte0[], int j, int k) {
+        for (int l = 0; l < k; l++) {
+            abyte0[j + l * 4] = (byte)(ai[i + l] >>> 24);
+            abyte0[j + l * 4 + 1] = (byte)(ai[i + l] >>> 16);
+            abyte0[j + l * 4 + 2] = (byte)(ai[i + l] >>> 8);
+            abyte0[j + l * 4 + 3] = (byte)ai[i + l];
+        }
+
+    }
+
+}
diff --git a/src/mcsClient/BitMap.java b/src/mcsClient/BitMap.java
new file mode 100644 (file)
index 0000000..7292d66
--- /dev/null
@@ -0,0 +1,49 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.util.logging.Logger;
+
+class BitMap {
+
+    int bitmap[];
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    BitMap() {
+        bitmap = new int[28];
+    }
+
+    void clear() {
+        for (int i = 0; i < 28; i++)
+            bitmap[i] = 0;
+
+    }
+
+    void setBit(int i) {
+        if (i >= 896) {
+            logger.warning("Sequence number invalid: " + i);
+            return;
+        } else {
+            bitmap[i / 32] |= 1 << i % 32;
+            return;
+        }
+    }
+
+    int findZeroBit() {
+        for (int i = 0; i < 28; i++)
+            if (bitmap[i] != -1) {
+                for (int j = 0; j < 32; j++)
+                    if ((bitmap[i] & 1 << j) == 0) {
+                        bitmap[i] |= 1 << j;
+                        return i * 32 + j;
+                    }
+
+            }
+
+        logger.severe("findZeroBit should not get here");
+        return 0;
+    }
+
+}
diff --git a/src/mcsClient/ColorPalette.java b/src/mcsClient/ColorPalette.java
new file mode 100644 (file)
index 0000000..5c1fbb8
--- /dev/null
@@ -0,0 +1,89 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.*;
+
+public class ColorPalette {
+
+    private int javaColors[];
+    int hardwareColors[];
+    private int microsoftColors[];
+    private final int colorMap[] = {
+        0, 70, 127, 191, 255
+    };
+    private final byte hardwareMap[] = {
+        0, 25, 50, 75, 5, 30, 55, 80, 10, 35, 
+        60, 85, 15, 40, 65, 90, 1, 26, 51, 76, 
+        6, 31, 56, 81, 11, 36, 61, 86, 16, 41, 
+        66, 91, 2, 27, 52, 77, 7, 32, 57, 82, 
+        12, 37, 62, 87, 17, 42, 67, 92, 3, 28, 
+        53, 78, 8, 33, 58, 83, 13, 38, 63, 88, 
+        18, 43, 68, 93, 100, 101, 102, 103, 105, 106, 
+        107, 108, 110, 111, 112, 113, 115, 116, 117, 118, 
+        20, 45, 70, 95, 21, 46, 71, 96, 22, 47, 
+        72, 97, 23, 48, 73, 98, 4, 29, 54, 79, 
+        9, 34, 59, 84, 14, 39, 64, 89, 19, 44, 
+        69, 94, 120, 121, 122, 123, 104, 109, 114, 119, 
+        24, 49, 74, 99, 124, 125, 126, 127
+    };
+
+    public ColorPalette() {
+        javaColors = new int[128];
+        hardwareColors = new int[128];
+        microsoftColors = new int[256];
+        for (int i = 0; i < 125; i += 25) {
+            for (int k = 0; k < 25; k += 5) {
+                for (int i1 = 0; i1 < 5; i1++)
+                    microsoftColors[i + k + i1] = colorMap[i / 25] << 24 | colorMap[k / 5] << 16 | colorMap[i1] << 8;
+
+            }
+
+        }
+
+        microsoftColors[125] = 0x5f5f5f5f;
+        microsoftColors[126] = 0x9f9f9f9f;
+        microsoftColors[127] = 0xdfdfdfdf;
+        for (int j = 0; j < 125; j += 25) {
+            for (int l = 0; l < 25; l += 5) {
+                for (int j1 = 0; j1 < 5; j1++)
+                    javaColors[j + l + j1] = 0xff000000 | colorMap[j / 25] << 0 | colorMap[l / 5] << 8 | colorMap[j1] << 16;
+
+            }
+
+        }
+
+        javaColors[125] = 0xff5f5f5f;
+        javaColors[126] = 0xff9f9f9f;
+        javaColors[127] = 0xffdfdfdf;
+        for (int k1 = 0; k1 < 128; k1++)
+            hardwareColors[k1] = javaColors[hardwareMap[k1]];
+
+    }
+
+    public static void main(String args[]) throws IOException {
+        ColorPalette colorpalette = new ColorPalette();
+        colorpalette.printColorPalette();
+        System.exit(0);
+    }
+
+    public void writeColorPalette(DataOutputStream dataoutputstream) throws IOException {
+        for (int i = 0; i < microsoftColors.length; i++)
+            dataoutputstream.writeInt(microsoftColors[i]);
+
+    }
+
+    private void printColorPalette() throws IOException {
+        System.out.println();
+        System.out.println("Graphical Console Server Custom 128 Color Palette");
+        System.out.println("-------------------------------------------------");
+        System.out.println();
+        System.out.println("\tIndex\tRed\t\tGreen\tBlue");
+        System.out.println("\t-----\t---\t\t-----\t----");
+        for (int i = 0; i < hardwareColors.length; i++)
+            System.out.println("\t" + i + "\t\t" + ((hardwareColors[i] & 0xff0000) >> 16) + "\t\t" + ((hardwareColors[i] & 0xff00) >> 8) + "\t\t" + (hardwareColors[i] & 0xff));
+
+    }
+}
diff --git a/src/mcsClient/ComboKeyArray.java b/src/mcsClient/ComboKeyArray.java
new file mode 100644 (file)
index 0000000..a601e95
--- /dev/null
@@ -0,0 +1,49 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+// Referenced classes of package mcsClient:
+//            KeyData
+
+public class ComboKeyArray
+    implements Serializable {
+
+    private static final int VERSION = 1;
+    private ArrayList buttons[];
+
+    public ComboKeyArray() {
+        buttons = new ArrayList[12];
+    }
+
+    public void setKeysForButton(int i, ArrayList arraylist) {
+        buttons[i] = arraylist;
+    }
+
+    public ArrayList getKeysForButton(int i) {
+        return buttons[i];
+    }
+
+    public String toString() {
+        StringBuffer stringbuffer = new StringBuffer("ComboKeyArray contents");
+        for (int i = 0; i < 12; i++)
+            if (buttons[i] != null) {
+                stringbuffer.append("\nRow " + i + ": ");
+                KeyData keydata;
+                for (Iterator iterator = buttons[i].iterator(); iterator.hasNext(); stringbuffer.append(keydata.getKeyName() + "," + keydata.getUsageCode() + " "))
+                    keydata = (KeyData)iterator.next();
+
+            }
+
+        return stringbuffer.toString();
+    }
+
+    public int getVersion() {
+        return 1;
+    }
+}
diff --git a/src/mcsClient/DatagramReader.java b/src/mcsClient/DatagramReader.java
new file mode 100644 (file)
index 0000000..7a0c33c
--- /dev/null
@@ -0,0 +1,385 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.IOException;
+import java.net.*;
+import java.util.LinkedList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+// Referenced classes of package mcsClient:
+//            BitMap, SecureDatagramSocket, McsTcpConnection, LiveVideoPanel, 
+//            McsToolBar
+
+public final class DatagramReader
+    implements Runnable {
+
+    public boolean videoLostSync;
+    private DatagramSocket dgSocket;
+    private McsTcpConnection mcsTcpConnection;
+    private LiveVideoPanel liveVideoPanel;
+    private LinkedList datagramList;
+    private static final boolean USE_MULTICAST = false;
+    public static final int DEFAULT_DIALIN_BITRATE;
+    public static final int DEFAULT_NET_BITRATE;
+    private long serverTime;
+    private long serverBaseTime;
+    private long clientTime;
+    private long clientBaseTime;
+    private boolean gotBaseTime;
+    private long skew;
+    private long upperSkew;
+    private long lowerSkew;
+    private long initialBitRate;
+    private long skewTime;
+    private boolean gotBeginningOfFrame;
+    private boolean gotInitialBitRate;
+    private boolean detectedPPP;
+    private int frameNumber;
+    private int maxSequenceNumber;
+    private int lastFrameNumber;
+    private long totalFrameSize;
+    private BitMap bitmap;
+    private boolean initialized;
+    private static int nakMessage[] = new int[4];
+    private McsToolBar sliderListener;
+    private int nakCount;
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    public DatagramReader(McsTcpConnection mcstcpconnection, LiveVideoPanel livevideopanel, LinkedList linkedlist, String s, int i, boolean flag) {
+        videoLostSync = false;
+        serverBaseTime = 0L;
+        clientTime = 0L;
+        clientBaseTime = 0L;
+        gotBaseTime = false;
+        skew = 0L;
+        upperSkew = 150L;
+        lowerSkew = -10L;
+        initialBitRate = 0L;
+        skewTime = 225L;
+        gotBeginningOfFrame = false;
+        gotInitialBitRate = false;
+        detectedPPP = false;
+        maxSequenceNumber = 0;
+        lastFrameNumber = 0;
+        totalFrameSize = 0L;
+        bitmap = new BitMap();
+        initialized = true;
+        sliderListener = null;
+        nakCount = 0;
+        mcsTcpConnection = mcstcpconnection;
+        liveVideoPanel = livevideopanel;
+        datagramList = linkedlist;
+        logger.setLevel(Level.WARNING);
+        String s1 = System.getProperty("mcs.debug");
+        if (s1 != null && s1.equalsIgnoreCase("true"))
+            logger.setLevel(Level.ALL);
+        nakMessage[0] = nakMessage.length * 4;
+        nakMessage[1] = 5;
+        if (mcstcpconnection.getDetectedPPP() || flag) {
+            detectedPPP = true;
+            upperSkew = 150L;
+            lowerSkew = -30L;
+            skewTime = 2000L;
+        }
+        if (mcstcpconnection.videoEncrypted())
+            dgSocket = new SecureDatagramSocket(mcstcpconnection.cipher1, mcstcpconnection.cipher2, mcstcpconnection.getLocalPort());
+        else
+            dgSocket = new DatagramSocket(mcstcpconnection.getLocalPort());
+        dgSocket.setReceiveBufferSize(0x1f400);
+        dgSocket.setSoTimeout(500);
+        if (flag)
+            return;
+        try {
+            byte abyte0[] = new byte[10];
+            DatagramPacket datagrampacket = new DatagramPacket(abyte0, abyte0.length, InetAddress.getByName(s), i);
+            for (int j = 0; j < 6; j++) {
+                dgSocket.send(datagrampacket);
+                try {
+                    Thread.currentThread();
+                    Thread.sleep(60L);
+                }
+                catch (InterruptedException interruptedexception) { }
+            }
+
+            try {
+                Thread.currentThread();
+                Thread.sleep(200L);
+            }
+            catch (InterruptedException interruptedexception1) { }
+        }
+        catch (Exception exception) {
+            logger.severe(exception.toString());
+            initialized = false;
+            JOptionPane.showMessageDialog(new JFrame(), "Failed to connect.  Try again.", "Remote Console Datagram Reader Initialization Error", 0);
+        }
+        return;
+    }
+
+    private void cleanupThread() {
+        if (dgSocket != null) {
+            dgSocket.disconnect();
+            dgSocket.close();
+        }
+        dgSocket = null;
+        mcsTcpConnection = null;
+        liveVideoPanel = null;
+        datagramList = null;
+        initialized = false;
+    }
+
+    private void process() {
+        int l;
+        Thread thread;
+        l = 0;
+        boolean flag = false;
+        boolean flag1 = false;
+        boolean flag2 = false;
+        if (!initialized)
+            return;
+        thread = Thread.currentThread();
+          goto _L1
+_L22:
+        if (nakCount >= 25) {
+            logger.info("25 NAK messages sent");
+            nakCount = 0;
+        }
+        DatagramPacket datagrampacket;
+        byte abyte1[] = new byte[1500];
+        datagrampacket = new DatagramPacket(abyte1, abyte1.length);
+        dgSocket.receive(datagrampacket);
+          goto _L2
+        SocketTimeoutException sockettimeoutexception;
+        sockettimeoutexception;
+          goto _L1
+        IOException ioexception3;
+        ioexception3;
+        logger.warning("Datagram Reader - error reading datagram " + ioexception3);
+        return;
+_L2:
+        byte abyte0[];
+        int j;
+        abyte0 = datagrampacket.getData();
+        j = datagrampacket.getOffset();
+        if (datagrampacket.getLength() >= 24) goto _L3; else goto _L1
+_L3:
+        if (abyte0[j + 7] != 6) goto _L5; else goto _L4
+_L4:
+        videoLostSync = true;
+        gotBaseTime = false;
+        logger.info("DatagramReader: video lost sync");
+          goto _L1
+_L5:
+        videoLostSync = false;
+        frameNumber = (abyte0[j + 8] & 0xff) << 8 | abyte0[j + 9] & 0xff;
+        if (gotBeginningOfFrame) goto _L7; else goto _L6
+_L6:
+        if ((abyte0[j + 7] & 0xbf) != 0) goto _L8; else goto _L1
+_L8:
+        gotBeginningOfFrame = true;
+        lastFrameNumber = frameNumber - 1;
+        l = 128;
+        bitmap.clear();
+        bitmap.setBit(0);
+_L7:
+        int i;
+        i = (abyte0[j + 10] & 0xff) << 8 | abyte0[j + 11] & 0xff;
+        int i1 = (abyte0[j + 2] & 0xff) << 8 | abyte0[j + 3] & 0xff;
+        totalFrameSize += i1;
+        serverTime = ((long)abyte0[j + 20] & 255L) << 24 | ((long)abyte0[j + 21] & 255L) << 16 | ((long)abyte0[j + 22] & 255L) << 8 | (long)abyte0[j + 23] & 255L;
+        clientTime = System.currentTimeMillis();
+        if (gotBaseTime) goto _L10; else goto _L9
+_L9:
+        gotBaseTime = true;
+        serverBaseTime = serverTime;
+        clientBaseTime = clientTime;
+        totalFrameSize = 0L;
+          goto _L11
+_L10:
+        long l1;
+        skew = clientTime - clientBaseTime - (serverTime - serverBaseTime);
+        l1 = (totalFrameSize * 8L * 1000L) / ((clientTime - clientBaseTime) + 50L);
+        if (l1 > 0x13880L)
+            liveVideoPanel.doPartialScreenUpdates = false;
+        else
+            liveVideoPanel.doPartialScreenUpdates = true;
+        if (skew >= lowerSkew) goto _L13; else goto _L12
+_L12:
+        gotBaseTime = false;
+          goto _L11
+_L13:
+        if (skew <= upperSkew || clientTime - clientBaseTime <= skewTime) goto _L11; else goto _L14
+_L14:
+        int ai[];
+        if (!gotInitialBitRate) {
+            initialBitRate = l1;
+            gotInitialBitRate = true;
+            if (detectedPPP) {
+                if (initialBitRate < (long)DEFAULT_DIALIN_BITRATE)
+                    initialBitRate = DEFAULT_DIALIN_BITRATE;
+            } else
+            if (initialBitRate < (long)DEFAULT_NET_BITRATE)
+                initialBitRate = DEFAULT_NET_BITRATE;
+            if (sliderListener != null)
+                sliderListener.setSliderInitialBitRate(initialBitRate);
+        } else {
+            if (l1 < (initialBitRate * 60L) / 100L)
+                l1 = (initialBitRate * 60L) / 100L;
+            if (detectedPPP && l1 > initialBitRate)
+                l1 = initialBitRate;
+        }
+        gotBaseTime = false;
+        l1 *= 75L;
+        l1 /= 100L;
+        ai = new int[3];
+        ai[0] = ai.length * 4;
+        ai[1] = 10;
+        ai[2] = (int)l1;
+        thread;
+        if (Thread.interrupted())
+            return;
+        try {
+            mcsTcpConnection.sendMessage(ai, false);
+        }
+        catch (IOException ioexception4) {
+            logger.severe("Socket exception - DatagramReader exiting");
+            return;
+        }
+_L11:
+        if (frameNumber == lastFrameNumber)
+            break MISSING_BLOCK_LABEL_1033;
+        if (frameNumber == lastFrameNumber + 1) goto _L16; else goto _L15
+_L15:
+        nakMessage[2] = 0;
+        nakMessage[3] = frameNumber;
+        try {
+            mcsTcpConnection.sendMessage(nakMessage, false);
+        }
+        catch (IOException ioexception) {
+            logger.severe("Socket exception - DatagramReader exiting");
+            return;
+        }
+        nakCount++;
+          goto _L17
+_L16:
+        if ((l & 0x80) != 0) goto _L19; else goto _L18
+_L18:
+        nakMessage[2] = 0;
+        nakMessage[3] = 0;
+        thread;
+        if (Thread.interrupted())
+            return;
+        try {
+            mcsTcpConnection.sendMessage(nakMessage, false);
+        }
+        catch (IOException ioexception1) {
+            logger.severe("Socket exception - DatagramReader exiting");
+            return;
+        }
+        nakCount++;
+          goto _L17
+_L20:
+        int k;
+        nakMessage[2] = k;
+        nakMessage[3] = frameNumber;
+        thread;
+        if (Thread.interrupted())
+            return;
+        try {
+            mcsTcpConnection.sendMessage(nakMessage, false);
+        }
+        catch (IOException ioexception2) {
+            logger.severe("Socket exception - DatagramReader exiting");
+            return;
+        }
+        nakCount++;
+        break; /* Loop/switch isn't completed */
+_L19:
+        if ((k = bitmap.findZeroBit()) <= maxSequenceNumber) goto _L20; else goto _L17
+_L17:
+        lastFrameNumber = frameNumber;
+        bitmap.clear();
+        l = 0;
+        maxSequenceNumber = 0;
+        bitmap.setBit(i);
+        maxSequenceNumber = i <= maxSequenceNumber ? maxSequenceNumber : i;
+        l |= abyte0[j + 7];
+        abyte0[j + 7] &= 0x3f;
+        int j1;
+        if ((j1 = datagramList.size()) < 10 || liveVideoPanel.imagesAutomaticallyPaused)
+            break MISSING_BLOCK_LABEL_1147;
+        thread;
+        if (Thread.interrupted())
+            return;
+        if (liveVideoPanel.pauseVideo() != 1) {
+            logger.severe("Socket exception - DatagramReader exiting");
+            return;
+        }
+        liveVideoPanel.imagesAutomaticallyPaused = true;
+        long l2 = ((long)abyte0[j] & 255L) << 24 | ((long)abyte0[j + 1] & 255L) << 16 | ((long)abyte0[j + 2] & 255L) << 8 | (long)abyte0[j + 3] & 255L;
+        long l3 = ((long)abyte0[j + 12] & 255L) << 24 | ((long)abyte0[j + 13] & 255L) << 16 | ((long)abyte0[j + 14] & 255L) << 8 | (long)abyte0[j + 15] & 255L;
+        long l4 = ((long)abyte0[j + 16] & 255L) << 24 | ((long)abyte0[j + 17] & 255L) << 16 | ((long)abyte0[j + 18] & 255L) << 8 | (long)abyte0[j + 19] & 255L;
+        if (i >= 0 && i <= 896 && l3 >= 0L && l3 <= 0xc0000L && l4 >= 0L && l3 <= 0xc0000L) {
+            if (l2 != 31L)
+                synchronized (datagramList) {
+                    datagramList.addFirst(datagrampacket);
+                    datagramList.notify();
+                }
+        } else {
+            logger.warning("Bad packet discarded.  seq num: " + i + " vid ram offset: " + l3 + " vid ram count: " + l4);
+        }
+          goto _L1
+        ArrayIndexOutOfBoundsException arrayindexoutofboundsexception;
+        arrayindexoutofboundsexception;
+        logger.warning(arrayindexoutofboundsexception.toString());
+_L1:
+        thread;
+        if (Thread.interrupted())
+            return;
+        if (true) goto _L22; else goto _L21
+_L21:
+    }
+
+    public void run() {
+        process();
+        cleanupThread();
+    }
+
+    protected void finalize() throws Throwable {
+        cleanupThread();
+    }
+
+    public boolean initialized() {
+        return initialized;
+    }
+
+    public void addSliderListener(McsToolBar mcstoolbar) {
+        sliderListener = mcstoolbar;
+    }
+
+    public void setInitialBitRate(long l) {
+        initialBitRate = l;
+        gotInitialBitRate = true;
+        int ai[] = new int[3];
+        ai[0] = ai.length * 4;
+        ai[1] = 10;
+        ai[2] = (int)l;
+        try {
+            mcsTcpConnection.sendMessage(ai, true);
+        }
+        catch (IOException ioexception) {
+            logger.severe("Socket exception - setInitialBitRate");
+            return;
+        }
+    }
+
+    static  {
+        DEFAULT_DIALIN_BITRATE = McsToolBar.BITRATES[2];
+        DEFAULT_NET_BITRATE = McsToolBar.BITRATES[7];
+    }
+}
diff --git a/src/mcsClient/Decompress.java b/src/mcsClient/Decompress.java
new file mode 100644 (file)
index 0000000..310a241
--- /dev/null
@@ -0,0 +1,290 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.image.MemoryImageSource;
+import java.io.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+// Referenced classes of package mcsClient:
+//            HexConversion
+
+public final class Decompress {
+    class VideoCommands {
+
+        private static final byte BF = 96;
+        private static final byte NC = 0;
+        private static final byte CA = 64;
+        private static final byte CB = 32;
+        private static final byte MM = 96;
+        private static final byte WP = -128;
+        private static final byte EF = 112;
+        private static final byte CMD_MASK = -32;
+        private static final byte RC_MASK = 31;
+        private static final byte RC_SIZE = 5;
+
+        VideoCommands() {
+        }
+    }
+
+
+    public static boolean PRINT_DATA = false;
+    private byte imageData[];
+    boolean pixelsInParts;
+    private int oldY;
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    public Decompress(byte abyte0[]) {
+        oldY = 0;
+        imageData = abyte0;
+        logger.setLevel(Level.WARNING);
+        String s = System.getProperty("mcs.debug");
+        if (s != null && s.equalsIgnoreCase("true"))
+            logger.setLevel(Level.ALL);
+    }
+
+    public void doDecompress(DataInputStream datainputstream, int i, int j, int k, MemoryImageSource memoryimagesource, int l, int i1) throws ArrayIndexOutOfBoundsException {
+        int j1 = j;
+        boolean flag = false;
+        int l1 = 0;
+        int i2 = 0;
+        int j2 = 0;
+        byte byte1 = 96;
+        byte byte2 = 96;
+        byte byte3 = 0;
+        boolean flag1 = false;
+        boolean flag2 = false;
+        boolean flag3 = false;
+        boolean flag4 = false;
+        int k2 = 0;
+        int i3 = ((j1 + k + l) - 1) / l;
+        if (j == 0) {
+            pixelsInParts = false;
+            oldY = 0;
+        }
+        int j3 = 0;
+        boolean flag5 = false;
+        do {
+            if (j1 >= j + k) {
+                if (j1 > j + k)
+                    logger.info("ERROR0: imageDataIndex = " + j1 + ", videoRamOffset = " + j + ", videoRamCount = " + k);
+                if (pixelsInParts)
+                    memoryimagesource.newPixels(0, oldY, l - 1, i3 - oldY, false);
+                break;
+            }
+            if (j3 >= i) {
+                if (j3 > i)
+                    logger.warning("ERROR: bytesRead > datagramLength, bytesRead = " + j3 + ", datagramLength = " + i);
+                if (!flag3)
+                    break;
+                j2 = i2;
+                j2 += 2;
+                byte2 = byte1;
+                flag1 = true;
+                flag3 = false;
+                flag5 = true;
+            }
+            if (!flag5) {
+                try {
+                    l1 = datainputstream.readUnsignedByte();
+                    if (PRINT_DATA) {
+                        System.out.print(" " + HexConversion.toString(l1));
+                        if (++k2 >= 32) {
+                            k2 = 0;
+                            System.out.println();
+                        }
+                    }
+                }
+                catch (IOException ioexception) {
+                    logger.info("Decompress - error reading datagram byte " + ioexception);
+                    return;
+                }
+                j3++;
+                byte byte0 = (byte)(l1 & 0xffffffe0);
+                if (flag3)
+                    if (byte0 == byte1) {
+                        byte3++;
+                        i2 |= (l1 & 0x1f) << byte3 * 5;
+                        if (i2 > l * i1)
+                            logger.info("Bad repeat count " + i2);
+                        if (j1 + i2 + 3 >= j + k) {
+                            j2 = i2;
+                            j2 += 2;
+                            byte2 = byte1;
+                            flag1 = true;
+                            flag3 = false;
+                            byte3 = 0;
+                        }
+                    } else {
+                        j2 = i2;
+                        j2 += 2;
+                        byte2 = byte1;
+                        flag1 = true;
+                        flag3 = false;
+                        byte3 = 0;
+                    }
+                switch (byte0) {
+                case 0: // '\0'
+                case 32: // ' '
+                case 64: // '@'
+                    if (byte0 != byte1) {
+                        i2 = l1 & 0x1f;
+                        flag3 = true;
+                        byte3 = 0;
+                    }
+                    break;
+
+                case 96: // '`'
+                    flag4 = true;
+                    break;
+
+                default:
+                    if ((l1 & 0x80) != 0) {
+                        flag2 = true;
+                        break;
+                    }
+                    logger.severe("Unknown video command received, got: " + byte0);
+                    try {
+                        datainputstream.close();
+                    }
+                    catch (IOException ioexception1) {
+                        logger.info(ioexception1.toString());
+                    }
+                    return;
+                }
+                byte1 = byte0;
+            }
+            if (flag1) {
+                switch (byte2) {
+                default:
+                    break;
+
+                case 0: // '\0'
+                    if (j2 > 0x80000) {
+                        int l2 = ((j1 + l) - 1) / l;
+                        memoryimagesource.newPixels(0, oldY, l - 1, l2 - oldY, false);
+                        oldY = ((j1 + j2) - (l - 1)) / l;
+                        pixelsInParts = true;
+                    }
+                    j1 += j2;
+                    break;
+
+                case 64: // '@'
+                    if (j1 - j < l)
+                        logger.warning("Error: copy above index = " + (j1 - j));
+                    while (j2 > 0) 
+                        try {
+                            imageData[j1] = imageData[j1 - l];
+                            j1++;
+                            j2--;
+                        }
+                        catch (ArrayIndexOutOfBoundsException arrayindexoutofboundsexception) {
+                            logger.warning("imageDataIndex: " + j1);
+                            throw arrayindexoutofboundsexception;
+                        }
+                    break;
+
+                case 32: // ' '
+                    if (j1 - j < 1)
+                        logger.warning("Error: copy left index = " + (j1 - j));
+                    byte byte4 = imageData[j1 - 1];
+                    while (j2 > 0) 
+                        try {
+                            imageData[j1] = byte4;
+                            j1++;
+                            j2--;
+                        }
+                        catch (ArrayIndexOutOfBoundsException arrayindexoutofboundsexception1) {
+                            logger.info("imageDataIndex: " + j1);
+                            throw arrayindexoutofboundsexception1;
+                        }
+                    break;
+                }
+                flag1 = false;
+            }
+            if (j1 >= j + k) {
+                if (pixelsInParts)
+                    memoryimagesource.newPixels(0, oldY, l - 1, i3 - oldY, false);
+                break;
+            }
+            if (flag4) {
+                byte byte6 = 0;
+                int k1 = j1;
+                byte byte5 = imageData[j1 - 1];
+                int k3 = j1 - 2;
+                while (k3 >= j)  {
+                    if (imageData[k3] == byte5) {
+                        k3--;
+                        continue;
+                    }
+                    byte6 = imageData[k3];
+                    break;
+                }
+                try {
+                    imageData[j1++] = (l1 & 8) == 0 ? byte5 : byte6;
+                    imageData[j1++] = (l1 & 4) == 0 ? byte5 : byte6;
+                    imageData[j1++] = (l1 & 2) == 0 ? byte5 : byte6;
+                    imageData[j1++] = (l1 & 1) == 0 ? byte5 : byte6;
+                }
+                catch (ArrayIndexOutOfBoundsException arrayindexoutofboundsexception2) {
+                    logger.info("imageDataIndex: " + j1);
+                    throw arrayindexoutofboundsexception2;
+                }
+                if ((l1 & 0x10) != 0)
+                    do {
+                        try {
+                            l1 = datainputstream.readUnsignedByte();
+                            if (PRINT_DATA) {
+                                System.out.print(" " + HexConversion.toString(l1));
+                                if (++k2 >= 32) {
+                                    k2 = 0;
+                                    System.out.println();
+                                }
+                            }
+                        }
+                        catch (IOException ioexception2) {
+                            logger.info("Decompress - error reading monochrome byte");
+                            return;
+                        }
+                        j3++;
+                        try {
+                            imageData[j1++] = (l1 & 0x40) == 0 ? byte5 : byte6;
+                            imageData[j1++] = (l1 & 0x20) == 0 ? byte5 : byte6;
+                            imageData[j1++] = (l1 & 0x10) == 0 ? byte5 : byte6;
+                            imageData[j1++] = (l1 & 8) == 0 ? byte5 : byte6;
+                            imageData[j1++] = (l1 & 4) == 0 ? byte5 : byte6;
+                            imageData[j1++] = (l1 & 2) == 0 ? byte5 : byte6;
+                            imageData[j1++] = (l1 & 1) == 0 ? byte5 : byte6;
+                        }
+                        catch (ArrayIndexOutOfBoundsException arrayindexoutofboundsexception3) {
+                            logger.info("imageDataIndex: " + j1);
+                            throw arrayindexoutofboundsexception3;
+                        }
+                    } while ((l1 & 0x80) != 0);
+                flag4 = false;
+            }
+            if (j1 >= j + k) {
+                if (j1 > j + k)
+                    logger.info("ERROR2: imageDataIndex = " + j1 + ", videoRamOffset = " + j + ", videoRamCount = " + k);
+                if (pixelsInParts)
+                    memoryimagesource.newPixels(0, oldY, l - 1, i3 - oldY, false);
+                break;
+            }
+            if (flag2) {
+                imageData[j1++] = (byte)(l1 & 0x7f);
+                flag2 = false;
+            }
+            if (j1 < j + k)
+                continue;
+            if (j1 > j + k)
+                logger.info("ERROR3: imageDataIndex = " + j1 + ", videoRamOffset = " + j + ", videoRamCount = " + k);
+            if (pixelsInParts)
+                memoryimagesource.newPixels(0, oldY, l - 1, i3 - oldY, false);
+            break;
+        } while (true);
+    }
+
+}
diff --git a/src/mcsClient/DefaultKeyArray.java b/src/mcsClient/DefaultKeyArray.java
new file mode 100644 (file)
index 0000000..4dcee7b
--- /dev/null
@@ -0,0 +1,41 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.util.ArrayList;
+
+// Referenced classes of package mcsClient:
+//            ComboKeyArray, KeyData
+
+final class DefaultKeyArray extends ComboKeyArray {
+
+    public DefaultKeyArray() {
+        ArrayList arraylist = new ArrayList();
+        KeyData keydata = new KeyData("Ctrl (Left)", 224);
+        KeyData keydata1 = new KeyData("Alt (Left)", 226);
+        KeyData keydata2 = new KeyData("Del", 76);
+        arraylist.add(keydata);
+        arraylist.add(keydata1);
+        arraylist.add(keydata2);
+        setKeysForButton(0, arraylist);
+        arraylist = new ArrayList();
+        keydata = new KeyData("Alt (Left)", 226);
+        keydata1 = new KeyData("Tab", 43);
+        arraylist.add(keydata);
+        arraylist.add(keydata1);
+        setKeysForButton(1, arraylist);
+        arraylist = new ArrayList();
+        keydata = new KeyData("Caps Lock", 57);
+        arraylist.add(keydata);
+        setKeysForButton(2, arraylist);
+        arraylist = new ArrayList();
+        keydata = new KeyData("Num Lock", 83);
+        arraylist.add(keydata);
+        setKeysForButton(3, arraylist);
+        for (int i = 4; i < 12; i++)
+            setKeysForButton(i, null);
+
+    }
+}
diff --git a/src/mcsClient/Help.java b/src/mcsClient/Help.java
new file mode 100644 (file)
index 0000000..bb6c403
--- /dev/null
@@ -0,0 +1,83 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.PrintStream;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+
+public class Help extends JComponent
+    implements MouseListener {
+
+    private Image image;
+    private String title;
+    private int imageWidth;
+    private int imageHeight;
+    private TextArea helpText;
+    private JFrame frame;
+
+    public Help(String s, Image image1, int i) {
+        image = image1;
+        title = s;
+        try {
+            MediaTracker mediatracker = new MediaTracker(this);
+            mediatracker.addImage(image1, 0);
+            mediatracker.waitForID(0);
+        }
+        catch (InterruptedException interruptedexception) {
+            System.out.println("help image loading interrupted");
+        }
+        imageWidth = image1.getWidth(null);
+        imageHeight = image1.getHeight(null);
+        addMouseListener(this);
+        helpText = new TextArea(i, 65);
+        helpText.setEditable(false);
+        helpText.setBackground(Color.white);
+    }
+
+    public void paint(Graphics g) {
+        if (image != null)
+            g.drawImage(image, 0, 0, this);
+    }
+
+    public Dimension getPreferredSize() {
+        return new Dimension(imageWidth, imageHeight);
+    }
+
+    public void mousePressed(MouseEvent mouseevent) {
+        showHelp();
+    }
+
+    public void mouseReleased(MouseEvent mouseevent) {
+    }
+
+    public void mouseEntered(MouseEvent mouseevent) {
+    }
+
+    public void mouseExited(MouseEvent mouseevent) {
+    }
+
+    public void mouseClicked(MouseEvent mouseevent) {
+    }
+
+    public void append(String s) {
+        helpText.append(s);
+    }
+
+    private void showHelp() {
+        if (frame != null)
+            frame.dispose();
+        Toolkit toolkit = Toolkit.getDefaultToolkit();
+        Dimension dimension = toolkit.getScreenSize();
+        frame = new JFrame(title);
+        frame.getContentPane().add(helpText);
+        frame.setLocation(dimension.width / 3, dimension.height / 3);
+        frame.pack();
+        frame.show();
+    }
+}
diff --git a/src/mcsClient/HexConversion.java b/src/mcsClient/HexConversion.java
new file mode 100644 (file)
index 0000000..1781566
--- /dev/null
@@ -0,0 +1,33 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+
+public class HexConversion {
+
+    static String stringArray[] = {
+        "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
+        "A", "B", "C", "D", "E", "F"
+    };
+
+    public HexConversion() {
+    }
+
+    public static String toString(int i) {
+        if (i < 0) {
+            i = ~i + 1;
+            i = 256 - i;
+        }
+        return stringArray[i / 16] + stringArray[i % 16];
+    }
+
+    public static String toString(byte abyte0[], int i, int j) {
+        StringBuffer stringbuffer = new StringBuffer();
+        while (j-- > 0) 
+            stringbuffer.append(toString(abyte0[i++]));
+        return stringbuffer.toString();
+    }
+
+}
diff --git a/src/mcsClient/KeepAlive.java b/src/mcsClient/KeepAlive.java
new file mode 100644 (file)
index 0000000..f145f12
--- /dev/null
@@ -0,0 +1,63 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.IOException;
+import java.io.PrintStream;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+// Referenced classes of package mcsClient:
+//            McsTcpConnection
+
+public class KeepAlive
+    implements Runnable {
+
+    private McsTcpConnection mcsTcpConnection;
+    private int keepaliveMessage[];
+    private boolean blueScreenDump;
+
+    public KeepAlive(McsTcpConnection mcstcpconnection, boolean flag) {
+        keepaliveMessage = new int[3];
+        mcsTcpConnection = mcstcpconnection;
+        blueScreenDump = flag;
+        keepaliveMessage[0] = keepaliveMessage.length * 4;
+        keepaliveMessage[1] = 12;
+    }
+
+    private void cleanupThread() {
+        mcsTcpConnection = null;
+    }
+
+    private void process() {
+        do {
+            Thread.currentThread();
+            if (Thread.interrupted())
+                return;
+            try {
+                Thread.currentThread();
+                Thread.sleep(10000L);
+            }
+            catch (InterruptedException interruptedexception) {
+                return;
+            }
+            keepaliveMessage[2] = (int)System.currentTimeMillis();
+            try {
+                mcsTcpConnection.sendMessage(keepaliveMessage);
+            }
+            catch (IOException ioexception) {
+                System.err.println(ioexception.toString() + " - KeepAlive exiting");
+                if (!blueScreenDump)
+                    JOptionPane.showMessageDialog(new JFrame(), "Connection to host lost", "Remote Console Connection Error", 0);
+                return;
+            }
+        } while (true);
+    }
+
+    public void run() {
+        process();
+        cleanupThread();
+    }
+}
diff --git a/src/mcsClient/KeyButton.java b/src/mcsClient/KeyButton.java
new file mode 100644 (file)
index 0000000..77568d3
--- /dev/null
@@ -0,0 +1,80 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.PrintStream;
+import javax.swing.JComponent;
+
+// Referenced classes of package mcsClient:
+//            KeyButtonListener
+
+public class KeyButton extends JComponent
+    implements MouseListener {
+
+    private Image image;
+    private int imageWidth;
+    private int imageHeight;
+    protected KeyButtonListener keyListener;
+    protected int keyState;
+    static final int IMAGES_PER_GIF = 3;
+    static final int KEY_NORMAL = 0;
+    static final int KEY_ACTIVE = 1;
+    static final int KEY_DEPRESSED = 2;
+
+    public KeyButton(Image image1) {
+        keyState = 0;
+        image = image1;
+        try {
+            MediaTracker mediatracker = new MediaTracker(this);
+            mediatracker.addImage(image, 0);
+            mediatracker.waitForID(0);
+        }
+        catch (InterruptedException interruptedexception) {
+            System.out.println("key button image loading interrupted");
+        }
+        imageWidth = image.getWidth(null);
+        imageHeight = image.getHeight(null);
+        addMouseListener(this);
+    }
+
+    public void paintComponent(Graphics g) {
+        if (image != null)
+            g.drawImage(image, 0, -(imageHeight / 3) * keyState, this);
+    }
+
+    public Dimension getPreferredSize() {
+        return new Dimension(imageWidth, imageHeight / 3);
+    }
+
+    public void addKeyButtonListener(KeyButtonListener keybuttonlistener) {
+        keyListener = keybuttonlistener;
+    }
+
+    public void mousePressed(MouseEvent mouseevent) {
+        keyState = 2;
+        if (keyListener != null)
+            keyListener.keyPressed(mouseevent);
+        repaint();
+    }
+
+    public void mouseReleased(MouseEvent mouseevent) {
+        keyState = 0;
+        if (keyListener != null)
+            keyListener.keyReleased(mouseevent);
+        repaint();
+    }
+
+    public void mouseEntered(MouseEvent mouseevent) {
+    }
+
+    public void mouseExited(MouseEvent mouseevent) {
+    }
+
+    public void mouseClicked(MouseEvent mouseevent) {
+    }
+}
diff --git a/src/mcsClient/KeyButtonListener.java b/src/mcsClient/KeyButtonListener.java
new file mode 100644 (file)
index 0000000..95fe767
--- /dev/null
@@ -0,0 +1,14 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.event.MouseEvent;
+
+public interface KeyButtonListener {
+
+    public abstract void keyPressed(MouseEvent mouseevent);
+
+    public abstract void keyReleased(MouseEvent mouseevent);
+}
diff --git a/src/mcsClient/KeyData.java b/src/mcsClient/KeyData.java
new file mode 100644 (file)
index 0000000..7246510
--- /dev/null
@@ -0,0 +1,27 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.Serializable;
+
+public class KeyData
+    implements Serializable {
+
+    private String keyName;
+    private int usageCode;
+
+    public KeyData(String s, int i) {
+        keyName = s;
+        usageCode = i;
+    }
+
+    public String getKeyName() {
+        return keyName;
+    }
+
+    public int getUsageCode() {
+        return usageCode;
+    }
+}
diff --git a/src/mcsClient/KeyMap.java b/src/mcsClient/KeyMap.java
new file mode 100644 (file)
index 0000000..ce39682
--- /dev/null
@@ -0,0 +1,848 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.event.KeyEvent;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class KeyMap {
+
+    public static final int US_104_KEY = 0;
+    public static final int BELGIAN_105_KEY = 1;
+    public static final int FRENCH_105_KEY = 2;
+    public static final int GERMAN_105_KEY = 3;
+    public static final int ITALIAN_105_KEY = 4;
+    public static final int JAPAN_109_KEY = 5;
+    public static final int SPANISH_105_KEY = 6;
+    public static final int UK_105_KEY = 7;
+    public static final int TILDE_ICON = 1;
+    public static final int CIRCUMFLEX_ICON = 2;
+    public static final int DIAERESIS_ICON = 3;
+    public static final int GRAVE_ICON = 4;
+    public static final int ACUTE_ICON = 5;
+    public static final int LEFT_SQUARE_BRACKET_ICON = 6;
+    public static final int RIGHT_SQUARE_BRACKET_ICON = 7;
+    public static final int LEFT_CURLY_BRACKET_ICON = 8;
+    public static final int RIGHT_CURLY_BRACKET_ICON = 9;
+    public static final int BACKSLASH_ICON = 10;
+    public static final int AT_ICON = 11;
+    public static final int A_KEY = 4;
+    public static final int B_KEY = 5;
+    public static final int C_KEY = 6;
+    public static final int D_KEY = 7;
+    public static final int E_KEY = 8;
+    public static final int F_KEY = 9;
+    public static final int G_KEY = 10;
+    public static final int H_KEY = 11;
+    public static final int I_KEY = 12;
+    public static final int J_KEY = 13;
+    public static final int K_KEY = 14;
+    public static final int L_KEY = 15;
+    public static final int M_KEY = 16;
+    public static final int N_KEY = 17;
+    public static final int O_KEY = 18;
+    public static final int P_KEY = 19;
+    public static final int Q_KEY = 20;
+    public static final int R_KEY = 21;
+    public static final int S_KEY = 22;
+    public static final int T_KEY = 23;
+    public static final int U_KEY = 24;
+    public static final int V_KEY = 25;
+    public static final int W_KEY = 26;
+    public static final int X_KEY = 27;
+    public static final int Y_KEY = 28;
+    public static final int Z_KEY = 29;
+    public static final int NUM_1_KEY = 30;
+    public static final int NUM_2_KEY = 31;
+    public static final int NUM_3_KEY = 32;
+    public static final int NUM_4_KEY = 33;
+    public static final int NUM_5_KEY = 34;
+    public static final int NUM_6_KEY = 35;
+    public static final int NUM_7_KEY = 36;
+    public static final int NUM_8_KEY = 37;
+    public static final int NUM_9_KEY = 38;
+    public static final int NUM_0_KEY = 39;
+    public static final int RETURN_KEY = 40;
+    public static final int ESCAPE_KEY = 41;
+    public static final int BACKSPACE_KEY = 42;
+    public static final int TAB_KEY = 43;
+    public static final int SPACE_KEY = 44;
+    public static final int MINUS_UNDERSCORE_KEY = 45;
+    public static final int EQUALS_PLUS_KEY = 46;
+    public static final int LEFT_BRACKETS_KEY = 47;
+    public static final int RIGHT_BRACKETS_KEY = 48;
+    public static final int BACKSLASH_BAR_KEY = 49;
+    public static final int EUROPE1_KEY = 50;
+    public static final int COLONS_KEY = 51;
+    public static final int QUOTES_KEY = 52;
+    public static final int GRAVE_TILDE_KEY = 53;
+    public static final int COMMA_LESS_KEY = 54;
+    public static final int PERIOD_GREATER_KEY = 55;
+    public static final int SLASH_QUESTION_KEY = 56;
+    public static final int CAPS_KEY = 57;
+    public static final int F1_KEY = 58;
+    public static final int F2_KEY = 59;
+    public static final int F3_KEY = 60;
+    public static final int F4_KEY = 61;
+    public static final int F5_KEY = 62;
+    public static final int F6_KEY = 63;
+    public static final int F7_KEY = 64;
+    public static final int F8_KEY = 65;
+    public static final int F9_KEY = 66;
+    public static final int F10_KEY = 67;
+    public static final int F11_KEY = 68;
+    public static final int F12_KEY = 69;
+    public static final int PRINT_SCREEN_KEY = 70;
+    public static final int SCROLL_KEY = 71;
+    public static final int BREAK_KEY = 72;
+    public static final int INSERT_KEY = 73;
+    public static final int HOME_KEY = 74;
+    public static final int PAGE_UP_KEY = 75;
+    public static final int DELETE_KEY = 76;
+    public static final int END_KEY = 77;
+    public static final int PAGE_DOWN_KEY = 78;
+    public static final int RIGHT_KEY = 79;
+    public static final int LEFT_KEY = 80;
+    public static final int DOWN_KEY = 81;
+    public static final int UP_KEY = 82;
+    public static final int NUM_KEY = 83;
+    public static final int KP_DIV_KEY = 84;
+    public static final int KP_MULT_KEY = 85;
+    public static final int KP_SUB_KEY = 86;
+    public static final int KP_ADD_KEY = 87;
+    public static final int KP_ENTER_KEY = 88;
+    public static final int KP_1_KEY = 89;
+    public static final int KP_2_KEY = 90;
+    public static final int KP_3_KEY = 91;
+    public static final int KP_4_KEY = 92;
+    public static final int KP_5_KEY = 93;
+    public static final int KP_6_KEY = 94;
+    public static final int KP_7_KEY = 95;
+    public static final int KP_8_KEY = 96;
+    public static final int KP_9_KEY = 97;
+    public static final int KP_0_KEY = 98;
+    public static final int KP_DEL_KEY = 99;
+    public static final int EUROPE2_KEY = 100;
+    public static final int KP_EQUALS_KEY = 103;
+    public static final int INTL_1_KEY = 135;
+    public static final int INTL_2_KEY = 136;
+    public static final int INTL_3_KEY = 137;
+    public static final int INTL_4_KEY = 138;
+    public static final int INTL_5_KEY = 139;
+    public static final int L_CTRL_KEY = 224;
+    public static final int L_SHIFT_KEY = 225;
+    public static final int L_ALT_KEY = 226;
+    public static final int R_CTRL_KEY = 228;
+    public static final int R_SHIFT_KEY = 229;
+    public static final int R_ALT_KEY = 230;
+    public static final int ALTGR_KEY = 230;
+    public static final int JAPAN1_KEY = 53;
+    public static final int JAPAN30_KEY = 57;
+    public static final int JAPAN131_KEY = 139;
+    public static final int JAPAN132_KEY = 138;
+    public static final int JAPAN133_KEY = 136;
+    private HashMap countryMap;
+    private final int keyCodeMap[];
+    private final HashMap japanKeyCharMap;
+    private final HashMap ukKeyCharMap;
+    private final HashMap spanishKeyCharMap;
+    private final HashMap italianKeyCharMap;
+    private final HashMap germanKeyCharMap;
+    private final HashMap frenchKeyCharMap;
+    private final HashMap belgianKeyCharMap;
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    public KeyMap() {
+        this(0);
+    }
+
+    public KeyMap(int i) {
+        keyCodeMap = new int[0x10000];
+        japanKeyCharMap = new HashMap(22, 1.0F);
+        ukKeyCharMap = new HashMap(20, 1.0F);
+        spanishKeyCharMap = new HashMap(39, 1.0F);
+        italianKeyCharMap = new HashMap(35, 1.0F);
+        germanKeyCharMap = new HashMap(50, 1.0F);
+        frenchKeyCharMap = new HashMap(55, 1.0F);
+        belgianKeyCharMap = new HashMap(55, 1.0F);
+        logger.setLevel(Level.WARNING);
+        String s = System.getProperty("mcs.debug");
+        if (s != null && s.equalsIgnoreCase("true"))
+            logger.setLevel(Level.ALL);
+        buildKeyMaps();
+        setKeyboardType(i);
+    }
+
+    public void setKeyboardType(int i) {
+        switch (i) {
+        case 0: // '\0'
+            countryMap = new HashMap(0);
+            break;
+
+        case 5: // '\005'
+            countryMap = japanKeyCharMap;
+            break;
+
+        case 7: // '\007'
+            countryMap = ukKeyCharMap;
+            break;
+
+        case 6: // '\006'
+            countryMap = spanishKeyCharMap;
+            break;
+
+        case 4: // '\004'
+            countryMap = italianKeyCharMap;
+            break;
+
+        case 3: // '\003'
+            countryMap = germanKeyCharMap;
+            break;
+
+        case 2: // '\002'
+            countryMap = frenchKeyCharMap;
+            break;
+
+        case 1: // '\001'
+            countryMap = belgianKeyCharMap;
+            break;
+
+        default:
+            logger.warning("Invalid country keyboard selected.");
+            break;
+        }
+    }
+
+    public int getButtonCode(int i) {
+        switch (i) {
+        default:
+            break;
+
+        case 1: // '\001'
+            if (countryMap == spanishKeyCharMap)
+                return 33;
+            if (countryMap == frenchKeyCharMap)
+                return 31;
+            if (countryMap == italianKeyCharMap)
+                return 48;
+            if (countryMap == belgianKeyCharMap)
+                return 56;
+            break;
+
+        case 2: // '\002'
+            if (countryMap == spanishKeyCharMap || countryMap == frenchKeyCharMap || countryMap == belgianKeyCharMap)
+                return 47;
+            if (countryMap == germanKeyCharMap)
+                return 53;
+            break;
+
+        case 3: // '\003'
+            if (countryMap == frenchKeyCharMap || countryMap == belgianKeyCharMap)
+                return 47;
+            if (countryMap == spanishKeyCharMap)
+                return 52;
+            break;
+
+        case 4: // '\004'
+            if (countryMap == frenchKeyCharMap)
+                return 36;
+            if (countryMap == spanishKeyCharMap)
+                return 47;
+            if (countryMap == italianKeyCharMap || countryMap == belgianKeyCharMap)
+                return 50;
+            if (countryMap == germanKeyCharMap)
+                return 46;
+            break;
+
+        case 5: // '\005'
+            if (countryMap == spanishKeyCharMap || countryMap == belgianKeyCharMap)
+                return 52;
+            if (countryMap == germanKeyCharMap)
+                return 46;
+            break;
+
+        case 10: // '\n'
+            if (countryMap == spanishKeyCharMap)
+                return 53;
+            if (countryMap == germanKeyCharMap)
+                return 45;
+            // fall through
+
+        case 6: // '\006'
+            return 47;
+
+        case 7: // '\007'
+            return 48;
+
+        case 8: // '\b'
+            return 52;
+
+        case 9: // '\t'
+            return 50;
+
+        case 11: // '\013'
+            return 51;
+        }
+        return 0;
+    }
+
+    public int getButtonModifierCode(int i) {
+        switch (i) {
+        default:
+            break;
+
+        case 1: // '\001'
+            if (countryMap == spanishKeyCharMap || countryMap == frenchKeyCharMap || countryMap == italianKeyCharMap || countryMap == belgianKeyCharMap)
+                return 230;
+            break;
+
+        case 2: // '\002'
+            if (countryMap == spanishKeyCharMap)
+                return 225;
+            break;
+
+        case 3: // '\003'
+            if (countryMap == spanishKeyCharMap || countryMap == frenchKeyCharMap || countryMap == belgianKeyCharMap)
+                return 225;
+            break;
+
+        case 4: // '\004'
+            if (countryMap == frenchKeyCharMap || countryMap == italianKeyCharMap || countryMap == belgianKeyCharMap)
+                return 230;
+            if (countryMap == germanKeyCharMap)
+                return 225;
+            break;
+
+        case 5: // '\005'
+            if (countryMap == belgianKeyCharMap)
+                return 230;
+            break;
+
+        case 6: // '\006'
+        case 7: // '\007'
+        case 8: // '\b'
+        case 9: // '\t'
+        case 10: // '\n'
+            return 230;
+
+        case 11: // '\013'
+            return 230;
+        }
+        return 0;
+    }
+
+    public int getKey(KeyEvent keyevent) {
+        char c = keyevent.getKeyChar();
+        int i = keyevent.getKeyCode();
+        switch (keyevent.getKeyLocation()) {
+        case 4: // '\004'
+            switch (i) {
+            case 10: // '\n'
+                return 88;
+
+            case 109: // 'm'
+                return 86;
+
+            case 107: // 'k'
+                return 87;
+
+            case 106: // 'j'
+                return 85;
+
+            case 111: // 'o'
+                return 84;
+
+            case 155: 
+                return 98;
+
+            case 36: // '$'
+                return 95;
+
+            case 33: // '!'
+                return 97;
+
+            case 44: // ','
+            case 46: // '.'
+            case 110: // 'n'
+            case 127: // '\177'
+                return 99;
+
+            case 35: // '#'
+                return 89;
+
+            case 34: // '"'
+                return 91;
+
+            case 39: // '\''
+                return 94;
+
+            case 37: // '%'
+                return 92;
+
+            case 40: // '('
+                return 90;
+
+            case 38: // '&'
+                return 96;
+
+            case 12: // '\f'
+                return 93;
+            }
+            // fall through
+
+        case 2: // '\002'
+            switch (i) {
+            case 17: // '\021'
+                return 224;
+
+            case 16: // '\020'
+                return 225;
+
+            case 18: // '\022'
+                return 226;
+            }
+            // fall through
+
+        case 3: // '\003'
+            switch (i) {
+            case 17: // '\021'
+                return 228;
+
+            case 16: // '\020'
+                return 229;
+
+            case 18: // '\022'
+                return 230;
+            }
+            break;
+        }
+        if (i == 69)
+            return 8;
+        if (countryMap == frenchKeyCharMap) {
+            if (i == 522 && c == '\uFFFF')
+                return 45;
+            if (i == 515)
+                return 48;
+        }
+        if (countryMap == belgianKeyCharMap) {
+            if (i == 130)
+                return 47;
+            if (i == 515)
+                return 48;
+            if (i == 54)
+                return 35;
+            if (i == 153)
+                return 100;
+        }
+        if ((countryMap == germanKeyCharMap || countryMap == italianKeyCharMap) && i == 521)
+            return 48;
+        Integer integer = (Integer)countryMap.get(new Integer(c));
+        if (integer != null)
+            return integer.intValue();
+        if (countryMap == germanKeyCharMap)
+            switch (i) {
+            case 81: // 'Q'
+                return 20;
+
+            case 153: 
+                return 100;
+
+            case 77: // 'M'
+                return 16;
+            }
+        return keyCodeMap[i];
+    }
+
+    private void buildKeyMaps() {
+        keyCodeMap[65] = 4;
+        keyCodeMap[66] = 5;
+        keyCodeMap[67] = 6;
+        keyCodeMap[68] = 7;
+        keyCodeMap[69] = 8;
+        keyCodeMap[70] = 9;
+        keyCodeMap[71] = 10;
+        keyCodeMap[72] = 11;
+        keyCodeMap[73] = 12;
+        keyCodeMap[74] = 13;
+        keyCodeMap[75] = 14;
+        keyCodeMap[76] = 15;
+        keyCodeMap[77] = 16;
+        keyCodeMap[78] = 17;
+        keyCodeMap[79] = 18;
+        keyCodeMap[80] = 19;
+        keyCodeMap[81] = 20;
+        keyCodeMap[82] = 21;
+        keyCodeMap[83] = 22;
+        keyCodeMap[84] = 23;
+        keyCodeMap[85] = 24;
+        keyCodeMap[86] = 25;
+        keyCodeMap[87] = 26;
+        keyCodeMap[88] = 27;
+        keyCodeMap[89] = 28;
+        keyCodeMap[90] = 29;
+        keyCodeMap[49] = 30;
+        keyCodeMap[517] = 30;
+        keyCodeMap[50] = 31;
+        keyCodeMap[512] = 31;
+        keyCodeMap[51] = 32;
+        keyCodeMap[520] = 32;
+        keyCodeMap[52] = 33;
+        keyCodeMap[515] = 33;
+        keyCodeMap[53] = 34;
+        keyCodeMap[54] = 35;
+        keyCodeMap[514] = 35;
+        keyCodeMap[55] = 36;
+        keyCodeMap[150] = 36;
+        keyCodeMap[56] = 37;
+        keyCodeMap[151] = 37;
+        keyCodeMap[57] = 38;
+        keyCodeMap[519] = 38;
+        keyCodeMap[48] = 39;
+        keyCodeMap[522] = 39;
+        keyCodeMap[10] = 40;
+        keyCodeMap[27] = 41;
+        keyCodeMap[8] = 42;
+        keyCodeMap[9] = 43;
+        keyCodeMap[32] = 44;
+        keyCodeMap[45] = 45;
+        keyCodeMap[523] = 45;
+        keyCodeMap[521] = 46;
+        keyCodeMap[61] = 46;
+        keyCodeMap[91] = 47;
+        keyCodeMap[161] = 47;
+        keyCodeMap[93] = 48;
+        keyCodeMap[162] = 48;
+        keyCodeMap[92] = 49;
+        keyCodeMap[59] = 51;
+        keyCodeMap[513] = 51;
+        keyCodeMap[222] = 52;
+        keyCodeMap[152] = 52;
+        keyCodeMap[192] = 53;
+        keyCodeMap[44] = 54;
+        keyCodeMap[153] = 54;
+        keyCodeMap[46] = 55;
+        keyCodeMap[160] = 55;
+        keyCodeMap[47] = 56;
+        keyCodeMap[20] = 57;
+        keyCodeMap[112] = 58;
+        keyCodeMap[113] = 59;
+        keyCodeMap[114] = 60;
+        keyCodeMap[115] = 61;
+        keyCodeMap[116] = 62;
+        keyCodeMap[117] = 63;
+        keyCodeMap[118] = 64;
+        keyCodeMap[119] = 65;
+        keyCodeMap[120] = 66;
+        keyCodeMap[121] = 67;
+        keyCodeMap[122] = 68;
+        keyCodeMap[123] = 69;
+        keyCodeMap[154] = 70;
+        keyCodeMap[145] = 71;
+        keyCodeMap[19] = 72;
+        keyCodeMap[155] = 73;
+        keyCodeMap[36] = 74;
+        keyCodeMap[33] = 75;
+        keyCodeMap[127] = 76;
+        keyCodeMap[35] = 77;
+        keyCodeMap[34] = 78;
+        keyCodeMap[39] = 79;
+        keyCodeMap[37] = 80;
+        keyCodeMap[40] = 81;
+        keyCodeMap[38] = 82;
+        keyCodeMap[144] = 83;
+        keyCodeMap[97] = 89;
+        keyCodeMap[98] = 90;
+        keyCodeMap[99] = 91;
+        keyCodeMap[100] = 92;
+        keyCodeMap[101] = 93;
+        keyCodeMap[12] = 93;
+        keyCodeMap[102] = 94;
+        keyCodeMap[103] = 95;
+        keyCodeMap[104] = 96;
+        keyCodeMap[105] = 97;
+        keyCodeMap[96] = 98;
+        keyCodeMap[28] = 138;
+        keyCodeMap[29] = 139;
+        keyCodeMap[241] = 136;
+        keyCodeMap[245] = 136;
+        keyCodeMap[243] = 53;
+        keyCodeMap[244] = 53;
+        keyCodeMap[263] = 53;
+        keyCodeMap[65406] = 230;
+        japanKeyCharMap.put(new Integer(34), new Integer(31));
+        japanKeyCharMap.put(new Integer(37), new Integer(34));
+        japanKeyCharMap.put(new Integer(38), new Integer(35));
+        japanKeyCharMap.put(new Integer(39), new Integer(36));
+        japanKeyCharMap.put(new Integer(40), new Integer(37));
+        japanKeyCharMap.put(new Integer(41), new Integer(38));
+        japanKeyCharMap.put(new Integer(42), new Integer(52));
+        japanKeyCharMap.put(new Integer(43), new Integer(51));
+        japanKeyCharMap.put(new Integer(58), new Integer(52));
+        japanKeyCharMap.put(new Integer(61), new Integer(45));
+        japanKeyCharMap.put(new Integer(64), new Integer(47));
+        japanKeyCharMap.put(new Integer(91), new Integer(48));
+        japanKeyCharMap.put(new Integer(92), new Integer(135));
+        japanKeyCharMap.put(new Integer(93), new Integer(50));
+        japanKeyCharMap.put(new Integer(94), new Integer(46));
+        japanKeyCharMap.put(new Integer(95), new Integer(135));
+        japanKeyCharMap.put(new Integer(96), new Integer(47));
+        japanKeyCharMap.put(new Integer(123), new Integer(48));
+        japanKeyCharMap.put(new Integer(124), new Integer(137));
+        japanKeyCharMap.put(new Integer(125), new Integer(50));
+        japanKeyCharMap.put(new Integer(126), new Integer(46));
+        ukKeyCharMap.put(new Integer(201), new Integer(8));
+        ukKeyCharMap.put(new Integer(233), new Integer(8));
+        ukKeyCharMap.put(new Integer(205), new Integer(12));
+        ukKeyCharMap.put(new Integer(237), new Integer(12));
+        ukKeyCharMap.put(new Integer(211), new Integer(18));
+        ukKeyCharMap.put(new Integer(243), new Integer(18));
+        ukKeyCharMap.put(new Integer(218), new Integer(24));
+        ukKeyCharMap.put(new Integer(250), new Integer(24));
+        ukKeyCharMap.put(new Integer(8364), new Integer(33));
+        ukKeyCharMap.put(new Integer(166), new Integer(53));
+        ukKeyCharMap.put(new Integer(172), new Integer(53));
+        ukKeyCharMap.put(new Integer(34), new Integer(31));
+        ukKeyCharMap.put(new Integer(163), new Integer(32));
+        ukKeyCharMap.put(new Integer(35), new Integer(50));
+        ukKeyCharMap.put(new Integer(126), new Integer(50));
+        ukKeyCharMap.put(new Integer(64), new Integer(52));
+        ukKeyCharMap.put(new Integer(215), new Integer(85));
+        ukKeyCharMap.put(new Integer(124), new Integer(100));
+        ukKeyCharMap.put(new Integer(92), new Integer(100));
+        spanishKeyCharMap.put(new Integer(8364), new Integer(8));
+        spanishKeyCharMap.put(new Integer(124), new Integer(30));
+        spanishKeyCharMap.put(new Integer(64), new Integer(31));
+        spanishKeyCharMap.put(new Integer(34), new Integer(31));
+        spanishKeyCharMap.put(new Integer(35), new Integer(32));
+        spanishKeyCharMap.put(new Integer(183), new Integer(32));
+        spanishKeyCharMap.put(new Integer(126), new Integer(33));
+        spanishKeyCharMap.put(new Integer(38), new Integer(35));
+        spanishKeyCharMap.put(new Integer(172), new Integer(35));
+        spanishKeyCharMap.put(new Integer(47), new Integer(36));
+        spanishKeyCharMap.put(new Integer(40), new Integer(37));
+        spanishKeyCharMap.put(new Integer(41), new Integer(38));
+        spanishKeyCharMap.put(new Integer(61), new Integer(39));
+        spanishKeyCharMap.put(new Integer(39), new Integer(45));
+        spanishKeyCharMap.put(new Integer(63), new Integer(45));
+        spanishKeyCharMap.put(new Integer(161), new Integer(46));
+        spanishKeyCharMap.put(new Integer(191), new Integer(46));
+        spanishKeyCharMap.put(new Integer(96), new Integer(47));
+        spanishKeyCharMap.put(new Integer(94), new Integer(47));
+        spanishKeyCharMap.put(new Integer(43), new Integer(48));
+        spanishKeyCharMap.put(new Integer(42), new Integer(48));
+        spanishKeyCharMap.put(new Integer(231), new Integer(50));
+        spanishKeyCharMap.put(new Integer(199), new Integer(50));
+        spanishKeyCharMap.put(new Integer(125), new Integer(50));
+        spanishKeyCharMap.put(new Integer(209), new Integer(51));
+        spanishKeyCharMap.put(new Integer(241), new Integer(51));
+        spanishKeyCharMap.put(new Integer(168), new Integer(52));
+        spanishKeyCharMap.put(new Integer(180), new Integer(52));
+        spanishKeyCharMap.put(new Integer(123), new Integer(52));
+        spanishKeyCharMap.put(new Integer(186), new Integer(53));
+        spanishKeyCharMap.put(new Integer(170), new Integer(53));
+        spanishKeyCharMap.put(new Integer(92), new Integer(53));
+        spanishKeyCharMap.put(new Integer(59), new Integer(54));
+        spanishKeyCharMap.put(new Integer(58), new Integer(55));
+        spanishKeyCharMap.put(new Integer(45), new Integer(56));
+        spanishKeyCharMap.put(new Integer(95), new Integer(56));
+        spanishKeyCharMap.put(new Integer(215), new Integer(85));
+        spanishKeyCharMap.put(new Integer(60), new Integer(100));
+        spanishKeyCharMap.put(new Integer(62), new Integer(100));
+        italianKeyCharMap.put(new Integer(8364), new Integer(8));
+        italianKeyCharMap.put(new Integer(34), new Integer(31));
+        italianKeyCharMap.put(new Integer(163), new Integer(32));
+        italianKeyCharMap.put(new Integer(38), new Integer(35));
+        italianKeyCharMap.put(new Integer(47), new Integer(36));
+        italianKeyCharMap.put(new Integer(40), new Integer(37));
+        italianKeyCharMap.put(new Integer(41), new Integer(38));
+        italianKeyCharMap.put(new Integer(61), new Integer(39));
+        italianKeyCharMap.put(new Integer(39), new Integer(45));
+        italianKeyCharMap.put(new Integer(63), new Integer(45));
+        italianKeyCharMap.put(new Integer(94), new Integer(46));
+        italianKeyCharMap.put(new Integer(236), new Integer(46));
+        italianKeyCharMap.put(new Integer(64), new Integer(20));
+        italianKeyCharMap.put(new Integer(232), new Integer(47));
+        italianKeyCharMap.put(new Integer(233), new Integer(47));
+        italianKeyCharMap.put(new Integer(43), new Integer(48));
+        italianKeyCharMap.put(new Integer(42), new Integer(48));
+        italianKeyCharMap.put(new Integer(126), new Integer(48));
+        italianKeyCharMap.put(new Integer(249), new Integer(50));
+        italianKeyCharMap.put(new Integer(167), new Integer(50));
+        italianKeyCharMap.put(new Integer(96), new Integer(50));
+        italianKeyCharMap.put(new Integer(242), new Integer(51));
+        italianKeyCharMap.put(new Integer(231), new Integer(51));
+        italianKeyCharMap.put(new Integer(224), new Integer(52));
+        italianKeyCharMap.put(new Integer(176), new Integer(52));
+        italianKeyCharMap.put(new Integer(35), new Integer(52));
+        italianKeyCharMap.put(new Integer(92), new Integer(53));
+        italianKeyCharMap.put(new Integer(124), new Integer(53));
+        italianKeyCharMap.put(new Integer(59), new Integer(54));
+        italianKeyCharMap.put(new Integer(58), new Integer(55));
+        italianKeyCharMap.put(new Integer(45), new Integer(56));
+        italianKeyCharMap.put(new Integer(95), new Integer(56));
+        italianKeyCharMap.put(new Integer(215), new Integer(85));
+        italianKeyCharMap.put(new Integer(60), new Integer(100));
+        italianKeyCharMap.put(new Integer(62), new Integer(100));
+        germanKeyCharMap.put(new Integer(8364), new Integer(8));
+        germanKeyCharMap.put(new Integer(181), new Integer(16));
+        germanKeyCharMap.put(new Integer(64), new Integer(20));
+        germanKeyCharMap.put(new Integer(122), new Integer(28));
+        germanKeyCharMap.put(new Integer(90), new Integer(28));
+        germanKeyCharMap.put(new Integer(121), new Integer(29));
+        germanKeyCharMap.put(new Integer(89), new Integer(29));
+        germanKeyCharMap.put(new Integer(34), new Integer(31));
+        germanKeyCharMap.put(new Integer(178), new Integer(31));
+        germanKeyCharMap.put(new Integer(167), new Integer(32));
+        germanKeyCharMap.put(new Integer(179), new Integer(32));
+        germanKeyCharMap.put(new Integer(38), new Integer(35));
+        germanKeyCharMap.put(new Integer(47), new Integer(36));
+        germanKeyCharMap.put(new Integer(123), new Integer(36));
+        germanKeyCharMap.put(new Integer(40), new Integer(37));
+        germanKeyCharMap.put(new Integer(91), new Integer(37));
+        germanKeyCharMap.put(new Integer(41), new Integer(38));
+        germanKeyCharMap.put(new Integer(93), new Integer(38));
+        germanKeyCharMap.put(new Integer(61), new Integer(39));
+        germanKeyCharMap.put(new Integer(125), new Integer(39));
+        germanKeyCharMap.put(new Integer(92), new Integer(45));
+        germanKeyCharMap.put(new Integer(63), new Integer(45));
+        germanKeyCharMap.put(new Integer(223), new Integer(45));
+        germanKeyCharMap.put(new Integer(96), new Integer(46));
+        germanKeyCharMap.put(new Integer(180), new Integer(46));
+        germanKeyCharMap.put(new Integer(252), new Integer(47));
+        germanKeyCharMap.put(new Integer(220), new Integer(47));
+        germanKeyCharMap.put(new Integer(43), new Integer(48));
+        germanKeyCharMap.put(new Integer(42), new Integer(48));
+        germanKeyCharMap.put(new Integer(126), new Integer(48));
+        germanKeyCharMap.put(new Integer(35), new Integer(50));
+        germanKeyCharMap.put(new Integer(39), new Integer(50));
+        germanKeyCharMap.put(new Integer(246), new Integer(51));
+        germanKeyCharMap.put(new Integer(214), new Integer(51));
+        germanKeyCharMap.put(new Integer(228), new Integer(52));
+        germanKeyCharMap.put(new Integer(196), new Integer(52));
+        germanKeyCharMap.put(new Integer(94), new Integer(53));
+        germanKeyCharMap.put(new Integer(176), new Integer(53));
+        germanKeyCharMap.put(new Integer(44), new Integer(54));
+        germanKeyCharMap.put(new Integer(59), new Integer(54));
+        germanKeyCharMap.put(new Integer(46), new Integer(55));
+        germanKeyCharMap.put(new Integer(58), new Integer(55));
+        germanKeyCharMap.put(new Integer(45), new Integer(56));
+        germanKeyCharMap.put(new Integer(95), new Integer(56));
+        germanKeyCharMap.put(new Integer(215), new Integer(85));
+        germanKeyCharMap.put(new Integer(60), new Integer(100));
+        germanKeyCharMap.put(new Integer(62), new Integer(100));
+        germanKeyCharMap.put(new Integer(124), new Integer(100));
+        frenchKeyCharMap.put(new Integer(113), new Integer(4));
+        frenchKeyCharMap.put(new Integer(81), new Integer(4));
+        frenchKeyCharMap.put(new Integer(8364), new Integer(8));
+        frenchKeyCharMap.put(new Integer(44), new Integer(16));
+        frenchKeyCharMap.put(new Integer(63), new Integer(16));
+        frenchKeyCharMap.put(new Integer(97), new Integer(20));
+        frenchKeyCharMap.put(new Integer(65), new Integer(20));
+        frenchKeyCharMap.put(new Integer(122), new Integer(26));
+        frenchKeyCharMap.put(new Integer(90), new Integer(26));
+        frenchKeyCharMap.put(new Integer(119), new Integer(29));
+        frenchKeyCharMap.put(new Integer(87), new Integer(29));
+        frenchKeyCharMap.put(new Integer(38), new Integer(30));
+        frenchKeyCharMap.put(new Integer(126), new Integer(31));
+        frenchKeyCharMap.put(new Integer(233), new Integer(31));
+        frenchKeyCharMap.put(new Integer(34), new Integer(32));
+        frenchKeyCharMap.put(new Integer(35), new Integer(32));
+        frenchKeyCharMap.put(new Integer(39), new Integer(33));
+        frenchKeyCharMap.put(new Integer(123), new Integer(33));
+        frenchKeyCharMap.put(new Integer(40), new Integer(34));
+        frenchKeyCharMap.put(new Integer(91), new Integer(34));
+        frenchKeyCharMap.put(new Integer(45), new Integer(35));
+        frenchKeyCharMap.put(new Integer(124), new Integer(35));
+        frenchKeyCharMap.put(new Integer(232), new Integer(36));
+        frenchKeyCharMap.put(new Integer(96), new Integer(36));
+        frenchKeyCharMap.put(new Integer(95), new Integer(37));
+        frenchKeyCharMap.put(new Integer(92), new Integer(37));
+        frenchKeyCharMap.put(new Integer(231), new Integer(38));
+        frenchKeyCharMap.put(new Integer(94), new Integer(38));
+        frenchKeyCharMap.put(new Integer(224), new Integer(39));
+        frenchKeyCharMap.put(new Integer(64), new Integer(39));
+        frenchKeyCharMap.put(new Integer(176), new Integer(45));
+        frenchKeyCharMap.put(new Integer(41), new Integer(45));
+        frenchKeyCharMap.put(new Integer(93), new Integer(45));
+        frenchKeyCharMap.put(new Integer(125), new Integer(46));
+        frenchKeyCharMap.put(new Integer(168), new Integer(47));
+        frenchKeyCharMap.put(new Integer(164), new Integer(48));
+        frenchKeyCharMap.put(new Integer(36), new Integer(48));
+        frenchKeyCharMap.put(new Integer(163), new Integer(48));
+        frenchKeyCharMap.put(new Integer(42), new Integer(50));
+        frenchKeyCharMap.put(new Integer(181), new Integer(50));
+        frenchKeyCharMap.put(new Integer(109), new Integer(51));
+        frenchKeyCharMap.put(new Integer(77), new Integer(51));
+        frenchKeyCharMap.put(new Integer(249), new Integer(52));
+        frenchKeyCharMap.put(new Integer(37), new Integer(52));
+        frenchKeyCharMap.put(new Integer(178), new Integer(53));
+        frenchKeyCharMap.put(new Integer(59), new Integer(54));
+        frenchKeyCharMap.put(new Integer(46), new Integer(54));
+        frenchKeyCharMap.put(new Integer(58), new Integer(55));
+        frenchKeyCharMap.put(new Integer(47), new Integer(55));
+        frenchKeyCharMap.put(new Integer(33), new Integer(56));
+        frenchKeyCharMap.put(new Integer(167), new Integer(56));
+        frenchKeyCharMap.put(new Integer(215), new Integer(85));
+        frenchKeyCharMap.put(new Integer(60), new Integer(100));
+        frenchKeyCharMap.put(new Integer(62), new Integer(100));
+        belgianKeyCharMap.put(new Integer(113), new Integer(4));
+        belgianKeyCharMap.put(new Integer(81), new Integer(4));
+        belgianKeyCharMap.put(new Integer(8364), new Integer(8));
+        belgianKeyCharMap.put(new Integer(44), new Integer(16));
+        belgianKeyCharMap.put(new Integer(63), new Integer(16));
+        belgianKeyCharMap.put(new Integer(97), new Integer(20));
+        belgianKeyCharMap.put(new Integer(65), new Integer(20));
+        belgianKeyCharMap.put(new Integer(122), new Integer(26));
+        belgianKeyCharMap.put(new Integer(90), new Integer(26));
+        belgianKeyCharMap.put(new Integer(119), new Integer(29));
+        belgianKeyCharMap.put(new Integer(87), new Integer(29));
+        belgianKeyCharMap.put(new Integer(38), new Integer(30));
+        belgianKeyCharMap.put(new Integer(124), new Integer(30));
+        belgianKeyCharMap.put(new Integer(64), new Integer(31));
+        belgianKeyCharMap.put(new Integer(233), new Integer(31));
+        belgianKeyCharMap.put(new Integer(34), new Integer(32));
+        belgianKeyCharMap.put(new Integer(35), new Integer(32));
+        belgianKeyCharMap.put(new Integer(39), new Integer(33));
+        belgianKeyCharMap.put(new Integer(123), new Integer(33));
+        belgianKeyCharMap.put(new Integer(40), new Integer(34));
+        belgianKeyCharMap.put(new Integer(91), new Integer(34));
+        belgianKeyCharMap.put(new Integer(167), new Integer(35));
+        belgianKeyCharMap.put(new Integer(94), new Integer(35));
+        belgianKeyCharMap.put(new Integer(232), new Integer(36));
+        belgianKeyCharMap.put(new Integer(33), new Integer(37));
+        belgianKeyCharMap.put(new Integer(231), new Integer(38));
+        belgianKeyCharMap.put(new Integer(123), new Integer(38));
+        belgianKeyCharMap.put(new Integer(224), new Integer(39));
+        belgianKeyCharMap.put(new Integer(125), new Integer(39));
+        belgianKeyCharMap.put(new Integer(176), new Integer(45));
+        belgianKeyCharMap.put(new Integer(41), new Integer(45));
+        belgianKeyCharMap.put(new Integer(45), new Integer(46));
+        belgianKeyCharMap.put(new Integer(95), new Integer(46));
+        belgianKeyCharMap.put(new Integer(168), new Integer(47));
+        belgianKeyCharMap.put(new Integer(42), new Integer(48));
+        belgianKeyCharMap.put(new Integer(36), new Integer(48));
+        belgianKeyCharMap.put(new Integer(163), new Integer(50));
+        belgianKeyCharMap.put(new Integer(181), new Integer(50));
+        belgianKeyCharMap.put(new Integer(109), new Integer(51));
+        belgianKeyCharMap.put(new Integer(77), new Integer(51));
+        belgianKeyCharMap.put(new Integer(249), new Integer(52));
+        belgianKeyCharMap.put(new Integer(37), new Integer(52));
+        belgianKeyCharMap.put(new Integer(178), new Integer(53));
+        belgianKeyCharMap.put(new Integer(179), new Integer(53));
+        belgianKeyCharMap.put(new Integer(59), new Integer(54));
+        belgianKeyCharMap.put(new Integer(46), new Integer(54));
+        belgianKeyCharMap.put(new Integer(58), new Integer(55));
+        belgianKeyCharMap.put(new Integer(47), new Integer(55));
+        belgianKeyCharMap.put(new Integer(43), new Integer(56));
+        belgianKeyCharMap.put(new Integer(61), new Integer(56));
+        belgianKeyCharMap.put(new Integer(215), new Integer(85));
+        belgianKeyCharMap.put(new Integer(60), new Integer(100));
+        belgianKeyCharMap.put(new Integer(62), new Integer(100));
+        belgianKeyCharMap.put(new Integer(92), new Integer(100));
+    }
+
+}
diff --git a/src/mcsClient/LiveVideoPanel.java b/src/mcsClient/LiveVideoPanel.java
new file mode 100644 (file)
index 0000000..ec0f2b2
--- /dev/null
@@ -0,0 +1,464 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.*;
+import java.awt.image.*;
+import java.io.*;
+import java.net.DatagramPacket;
+import java.util.LinkedList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JPanel;
+
+// Referenced classes of package mcsClient:
+//            ColorPalette, Decompress, McsTargetSize, McsTcpConnection, 
+//            McsToolBar, LockingKeyStateManager
+
+public final class LiveVideoPanel extends JPanel
+    implements Runnable {
+
+    private int targetWidth;
+    private int targetHeight;
+    private boolean initialized;
+    private McsTargetSize targetSize;
+    private ColorPalette colorPalette;
+    private IndexColorModel indexColorModel;
+    private LinkedList datagramList;
+    public static boolean PRINT_HEADER = false;
+    public static boolean MEASURE_PERFORMANCE = false;
+    public boolean SHOW_CURSOR;
+    public static final boolean DEBUG_MOUSE = false;
+    public static final int SUCCESS = 1;
+    public static final int FAILURE = 2;
+    boolean doPartialScreenUpdates;
+    boolean interpolation;
+    Graphics2D graphics2D;
+    RenderingHints renderingHints;
+    private final Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
+    private final Cursor invisibleCursor;
+    private Cursor visibleCursor;
+    private Cursor currentCursor;
+    private byte imageData[];
+    private MemoryImageSource memoryImageSource;
+    private MemoryImageSource memoryImageSource_1024_768;
+    private MemoryImageSource memoryImageSource_800_600;
+    private MemoryImageSource memoryImageSource_640_480;
+    private MemoryImageSource memoryImageSource_640_400;
+    private MemoryImageSource memoryImageSource_656_496;
+    private Image image_1024_768;
+    private Image image_800_600;
+    private Image image_640_480;
+    private Image image_640_400;
+    private Image image_656_496;
+    private Image image;
+    private int blankImage[];
+    private MemoryImageSource blankMemoryImageSource;
+    private Image blank;
+    private Dimension dimension_1024_768;
+    private Dimension dimension_800_600;
+    private Dimension dimension_640_480;
+    private Dimension dimension_640_400;
+    private Dimension dimension_656_496;
+    private McsTcpConnection mcsTcpConnection;
+    private int frameWidth;
+    private int frameHeight;
+    private int livePanelWait;
+    private boolean livePanelSchedule;
+    private McsToolBar sliderListener;
+    private static int resumeMessage[] = new int[2];
+    private static int pauseMessage[] = new int[2];
+    boolean imagesAutomaticallyPaused;
+    private LockingKeyStateManager lockingKeyStateManager;
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    public LiveVideoPanel(McsTcpConnection mcstcpconnection, LinkedList linkedlist, McsTargetSize mcstargetsize, LockingKeyStateManager lockingkeystatemanager) {
+        targetWidth = 1024;
+        targetHeight = 768;
+        initialized = false;
+        colorPalette = new ColorPalette();
+        indexColorModel = new IndexColorModel(8, colorPalette.hardwareColors.length, colorPalette.hardwareColors, 0, 0, null);
+        SHOW_CURSOR = true;
+        doPartialScreenUpdates = true;
+        interpolation = false;
+        graphics2D = null;
+        renderingHints = null;
+        invisibleCursor = defaultToolkit.createCustomCursor(new BufferedImage(1, 1, 2), new Point(0, 0), "");
+        dimension_1024_768 = new Dimension(1024, 768);
+        dimension_800_600 = new Dimension(800, 600);
+        dimension_640_480 = new Dimension(640, 480);
+        dimension_640_400 = new Dimension(640, 400);
+        dimension_656_496 = new Dimension(656, 496);
+        sliderListener = null;
+        imagesAutomaticallyPaused = false;
+        mcsTcpConnection = mcstcpconnection;
+        datagramList = linkedlist;
+        targetSize = mcstargetsize;
+        lockingKeyStateManager = lockingkeystatemanager;
+        imageData = new byte[targetWidth * targetHeight * 2];
+        memoryImageSource_1024_768 = new MemoryImageSource(1024, 768, indexColorModel, imageData, 0, 1024);
+        memoryImageSource_800_600 = new MemoryImageSource(800, 600, indexColorModel, imageData, 0, 800);
+        memoryImageSource_640_480 = new MemoryImageSource(640, 480, indexColorModel, imageData, 0, 640);
+        memoryImageSource_640_400 = new MemoryImageSource(640, 400, indexColorModel, imageData, 0, 640);
+        memoryImageSource_656_496 = new MemoryImageSource(656, 496, indexColorModel, imageData, 0, 656);
+        memoryImageSource_1024_768.setAnimated(true);
+        memoryImageSource_800_600.setAnimated(true);
+        memoryImageSource_640_480.setAnimated(true);
+        memoryImageSource_640_400.setAnimated(true);
+        memoryImageSource_656_496.setAnimated(true);
+        memoryImageSource = memoryImageSource_1024_768;
+        image_1024_768 = createImage(memoryImageSource_1024_768);
+        image_800_600 = createImage(memoryImageSource_800_600);
+        image_640_480 = createImage(memoryImageSource_640_480);
+        image_640_400 = createImage(memoryImageSource_640_400);
+        image_656_496 = createImage(memoryImageSource_656_496);
+        image = image_1024_768;
+        blankImage = new int[0xc0000];
+        blankMemoryImageSource = new MemoryImageSource(1024, 768, indexColorModel, blankImage, 0, 1024);
+        blank = createImage(blankMemoryImageSource);
+        Cursor cursor = getCursor();
+        Cursor cursor1 = cursor;
+        if (!SHOW_CURSOR) {
+            setCursor(invisibleCursor);
+            Cursor cursor2 = invisibleCursor;
+        }
+        resumeMessage[0] = resumeMessage.length * 4;
+        resumeMessage[1] = 8;
+        pauseMessage[0] = pauseMessage.length * 4;
+        pauseMessage[1] = 7;
+        livePanelWait = 0;
+        livePanelSchedule = true;
+        logger.setLevel(Level.WARNING);
+        String s = System.getProperty("mcs.debug");
+        if (s != null && s.equalsIgnoreCase("true"))
+            logger.setLevel(Level.ALL);
+        initialized = true;
+    }
+
+    public void toggleVisibleCursor() {
+        if (currentCursor.equals(visibleCursor)) {
+            setCursor(invisibleCursor);
+            currentCursor = invisibleCursor;
+        } else {
+            setCursor(visibleCursor);
+            currentCursor = visibleCursor;
+        }
+    }
+
+    public boolean initialized() {
+        return initialized;
+    }
+
+    public boolean isFocusable() {
+        return true;
+    }
+
+    public void addNotify() {
+        super.addNotify();
+    }
+
+    public boolean isOpaque() {
+        return false;
+    }
+
+    public void paintComponent(Graphics g) {
+        super.paintComponent(g);
+        Rectangle rectangle = g.getClipBounds();
+        if (rectangle.x >= 0 && rectangle.x < targetWidth && rectangle.y >= 0 && rectangle.y < targetHeight)
+            g.drawImage(image, 0, 0, null);
+        livePanelWait = 0;
+    }
+
+    public void update(Graphics g) {
+        super.update(g);
+    }
+
+    public void setInterpolation(boolean flag) {
+        interpolation = flag;
+    }
+
+    private void cleanupThread() {
+        mcsTcpConnection = null;
+        datagramList = null;
+        lockingKeyStateManager = null;
+        initialized = false;
+    }
+
+    private void process() {
+        float f;
+        float f1;
+        float f2;
+        float f3;
+        long l;
+        int k;
+        boolean flag3;
+        int ai[];
+        Decompress decompress;
+        Thread thread;
+        f = 0.0F;
+        f1 = 0.0F;
+        f2 = 0.0F;
+        f3 = 0.0F;
+        boolean flag = false;
+        k = 2;
+        boolean flag1 = false;
+        boolean flag2 = false;
+        Object obj = null;
+        flag3 = false;
+        Object obj1 = null;
+        ai = new int[2];
+        ai[0] = ai.length * 4;
+        ai[1] = 16;
+        setBackground(Color.white);
+        setEnabled(true);
+        setVisible(true);
+        decompress = new Decompress(imageData);
+        long l1;
+        l = l1 = System.currentTimeMillis();
+        graphics2D = (Graphics2D)getGraphics();
+        renderingHints = graphics2D.getRenderingHints();
+        logger.info("RenderingHints size = " + renderingHints.size());
+        thread = Thread.currentThread();
+        break MISSING_BLOCK_LABEL_1474;
+_L2:
+        LinkedList linkedlist = datagramList;
+        JVM INSTR monitorenter ;
+        int i;
+        DatagramPacket datagrampacket;
+label0:
+        {
+            thread;
+            if (Thread.interrupted()) {
+                logger.info("Terminating LiveVideoPanel");
+                return;
+            }
+            try {
+                while ((i = datagramList.size()) == 0) 
+                    datagramList.wait();
+                datagrampacket = (DatagramPacket)datagramList.removeLast();
+                break label0;
+            }
+            catch (InterruptedException interruptedexception1) { }
+            return;
+        }
+        Exception exception;
+        exception;
+        throw exception;
+        if (i > 2 || !imagesAutomaticallyPaused)
+            break MISSING_BLOCK_LABEL_277;
+        if (resumeVideo() != 1) {
+            logger.severe("Socket exception - LiveVideoPanel exiting");
+            return;
+        }
+        imagesAutomaticallyPaused = false;
+        break MISSING_BLOCK_LABEL_313;
+        if (i < 6 || imagesAutomaticallyPaused)
+            break MISSING_BLOCK_LABEL_313;
+        if (pauseVideo() != 1) {
+            logger.severe("Socket exception - LiveVideoPanel exiting");
+            return;
+        }
+        imagesAutomaticallyPaused = true;
+        DataInputStream datainputstream;
+        try {
+            datainputstream = new DataInputStream(new ByteArrayInputStream(datagrampacket.getData(), datagrampacket.getOffset(), datagrampacket.getLength()));
+        }
+        catch (NullPointerException nullpointerexception) {
+            logger.severe("Data stream has been closed.  LiveVideoPanel exiting.");
+            return;
+        }
+        int i1;
+        int i2;
+        int j2;
+        try {
+            int j = datagrampacket.getLength();
+            i1 = datainputstream.readInt();
+            int j1 = datainputstream.readInt();
+            int k1 = datainputstream.readInt();
+            i2 = datainputstream.readInt();
+            j2 = datainputstream.readInt();
+            int k2 = datainputstream.readInt();
+            if (MEASURE_PERFORMANCE) {
+                f3++;
+                f1 += i1;
+                f += j2;
+            }
+            if (PRINT_HEADER) {
+                System.out.println();
+                System.out.println("dg length: " + i1 + ", vro: " + i2 + ", vrc: " + j2);
+            }
+            flag3 = false;
+            if (i1 > 1458) {
+                flag3 = true;
+                logger.warning("Bad datagramLength = " + i1);
+            }
+            if (j1 != k) {
+                if (j1 == 2) {
+                    memoryImageSource = memoryImageSource_1024_768;
+                    image = image_1024_768;
+                    logger.info("Setting to 1024 x 768");
+                    setPreferredSize(dimension_1024_768);
+                    targetWidth = 1024;
+                    targetHeight = 768;
+                    targetSize.setWidth(1024);
+                    targetSize.setHeight(768);
+                } else
+                if (j1 == 3) {
+                    memoryImageSource = memoryImageSource_800_600;
+                    image = image_800_600;
+                    logger.info("Setting to 800 x 600");
+                    setPreferredSize(dimension_800_600);
+                    targetWidth = 800;
+                    targetHeight = 600;
+                    targetSize.setWidth(800);
+                    targetSize.setHeight(600);
+                } else
+                if (j1 == 4) {
+                    memoryImageSource = memoryImageSource_640_480;
+                    image = image_640_480;
+                    logger.info("Setting to 640 x 480");
+                    setPreferredSize(dimension_640_480);
+                    targetWidth = 640;
+                    targetHeight = 480;
+                    targetSize.setWidth(640);
+                    targetSize.setHeight(480);
+                } else
+                if (j1 == 23) {
+                    memoryImageSource = memoryImageSource_640_400;
+                    image = image_640_400;
+                    logger.info("Setting to 640 x 400");
+                    setPreferredSize(dimension_640_400);
+                    targetWidth = 640;
+                    targetHeight = 400;
+                    targetSize.setWidth(640);
+                    targetSize.setHeight(400);
+                } else
+                if (j1 == 25) {
+                    memoryImageSource = memoryImageSource_656_496;
+                    image = image_656_496;
+                    logger.info("Setting to 656 x 496");
+                    setPreferredSize(dimension_656_496);
+                    targetWidth = 656;
+                    targetHeight = 496;
+                    targetSize.setWidth(656);
+                    targetSize.setHeight(496);
+                } else {
+                    flag3 = true;
+                    logger.warning("Bad messageType = " + j1);
+                }
+                java.awt.Container container = getParent();
+                java.awt.Container container1 = container;
+                k = j1;
+            }
+            if (i2 < 0 || i2 > targetWidth * targetHeight) {
+                flag3 = true;
+                logger.warning("Bad videoRamOffset = " + i2);
+            }
+            if (j2 < 0 || j2 > targetWidth * targetHeight) {
+                flag3 = true;
+                logger.warning("Bad videoRamCount = " + j2);
+            }
+        }
+        catch (IOException ioexception) {
+            logger.warning("LiveVideoPanel: got I/O exception" + ioexception);
+            break; /* Loop/switch isn't completed */
+        }
+        if (!flag3)
+            try {
+                decompress.doDecompress(datainputstream, i1 - 24, i2, j2, memoryImageSource, targetWidth, targetHeight);
+            }
+            catch (ArrayIndexOutOfBoundsException arrayindexoutofboundsexception) {
+                logger.warning("Decompress failed - " + arrayindexoutofboundsexception.toString());
+                flag3 = true;
+            }
+        if (i2 + j2 >= targetWidth * targetHeight)
+            break; /* Loop/switch isn't completed */
+        if (doPartialScreenUpdates) {
+            if (!decompress.pixelsInParts)
+                memoryImageSource.newPixels(0, 0, targetWidth, targetHeight, false);
+            if (!flag3)
+                repaint();
+        }
+_L3:
+        thread;
+        if (!Thread.interrupted()) goto _L2; else goto _L1
+_L1:
+        thread;
+        if (Thread.interrupted())
+            return;
+        if (!decompress.pixelsInParts)
+            memoryImageSource.newPixels(0, 0, targetWidth, targetHeight, false);
+        if (!flag3) {
+            repaint();
+            try {
+                livePanelWait += 2;
+                Thread.currentThread();
+                Thread.sleep(livePanelWait);
+            }
+            catch (InterruptedException interruptedexception) { }
+        }
+        if (MEASURE_PERFORMANCE) {
+            f2++;
+            long l2 = System.currentTimeMillis();
+            if (l2 - l > 10000L) {
+                System.out.println("Datagrams/sec = " + (f3 * 1000F) / (float)(l2 - l));
+                System.out.println("Frames/sec = " + (f2 * 1000F) / (float)(l2 - l));
+                System.out.println("Bit rate = " + (8F * f1) / 10F);
+                f2 = 0.0F;
+                f = 0.0F;
+                f1 = 0.0F;
+                f3 = 0.0F;
+                l = l2 = System.currentTimeMillis();
+                try {
+                    mcsTcpConnection.sendMessage(ai);
+                }
+                catch (IOException ioexception1) {
+                    logger.warning("Socket exception - LiveVideoPanel exiting");
+                    return;
+                }
+            }
+        }
+        thread;
+        if (Thread.interrupted())
+            return;
+          goto _L3
+    }
+
+    public void run() {
+        process();
+        cleanupThread();
+    }
+
+    void setFrameSize(int i, int j) {
+        frameWidth = i;
+        frameHeight = j;
+    }
+
+    public int resumeVideo() {
+        try {
+            mcsTcpConnection.sendMessage(resumeMessage);
+        }
+        catch (IOException ioexception) {
+            return 2;
+        }
+        return 1;
+    }
+
+    public int pauseVideo() {
+        imagesAutomaticallyPaused = false;
+        try {
+            mcsTcpConnection.sendMessage(pauseMessage);
+        }
+        catch (IOException ioexception) {
+            return 2;
+        }
+        return 1;
+    }
+
+    public void addSliderListener(McsToolBar mcstoolbar) {
+        sliderListener = mcstoolbar;
+    }
+
+}
diff --git a/src/mcsClient/LockingKeyStateManager.java b/src/mcsClient/LockingKeyStateManager.java
new file mode 100644 (file)
index 0000000..d7f12a5
--- /dev/null
@@ -0,0 +1,57 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+
+public class LockingKeyStateManager {
+
+    private final Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
+    private boolean clientCapsLock;
+    private boolean clientNumLock;
+    private boolean clientScrollLock;
+    private boolean clientKanaLock;
+    private boolean targetCapsLock;
+    private boolean targetNumLock;
+    private boolean targetScrollLock;
+    private boolean targetKanaLock;
+    private boolean changingCapsLock;
+    private boolean changingNumLock;
+    private boolean changingScrollLock;
+    private boolean changingKanaLock;
+
+    public LockingKeyStateManager() {
+        clientCapsLock = false;
+        clientNumLock = false;
+        clientScrollLock = false;
+        clientKanaLock = false;
+        targetCapsLock = false;
+        targetNumLock = false;
+        targetScrollLock = false;
+        targetKanaLock = false;
+        changingCapsLock = false;
+        changingNumLock = false;
+        changingScrollLock = false;
+        changingKanaLock = false;
+    }
+
+    void saveClientKeyState() {
+    }
+
+    void restoreClientKeyState() {
+    }
+
+    void setTargetKeyState(int i) {
+    }
+
+    boolean filterKeyPress(KeyEvent keyevent) {
+        return keyevent.getKeyCode() == 20 || keyevent.getKeyCode() == 144 || keyevent.getKeyCode() == 145 || keyevent.getKeyCode() == 262;
+    }
+
+    boolean filterKeyRelease(KeyEvent keyevent) {
+        return filterKeyPress(keyevent);
+    }
+}
diff --git a/src/mcsClient/McsClient.java b/src/mcsClient/McsClient.java
new file mode 100644 (file)
index 0000000..b3c690d
--- /dev/null
@@ -0,0 +1,227 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
+import java.awt.*;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URL;
+import java.util.LinkedList;
+import java.util.StringTokenizer;
+import javax.swing.*;
+
+// Referenced classes of package mcsClient:
+//            McsTargetSize, McsVersion, LockingKeyStateManager, McsTcpConnection, 
+//            LiveVideoPanel, McsKeyAdapter, McsMouseAdapter, McsMouseMotionAdapter, 
+//            DatagramReader, McsToolBar, MessageReader, KeepAlive
+
+public class McsClient extends JApplet {
+
+    private static final int FIXED_SIZE = 1;
+    private static final int FULL_SCREEN = 2;
+    private static final int SCROLL_SCREEN = 3;
+    private static final int DEFAULT_REMOTE_PORT = 2000;
+    private static final Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
+    private static final Dimension maxTargetSize = new Dimension(1024, 768);
+    private static int screenWidth;
+    private static int screenHeight;
+    private McsTargetSize mcsTargetSize;
+    private LinkedList datagramList;
+    private McsVersion mcsVersion;
+    private LockingKeyStateManager lockingKeyStateManager;
+    private McsTcpConnection mcsTcpConnection;
+    private McsKeyAdapter mcsKeyAdapter;
+    private LiveVideoPanel liveVideoPanel;
+    private McsMouseAdapter mcsMouseAdapter;
+    private McsMouseMotionAdapter mcsMouseMotionAdapter;
+    private DatagramReader datagramReader;
+    private MessageReader messageReader;
+    private KeepAlive keepAlive;
+    private boolean isStandalone;
+    private ThreadGroup threadGroup;
+    private static final String START = "Show Remote Console";
+    private static final String STOP = "Hide Remote Console";
+    private JButton button;
+    private static final boolean TCP = false;
+    private boolean blueScreenDump;
+    private boolean encryptVideo;
+
+    public McsClient() {
+        mcsTargetSize = new McsTargetSize(1024, 768);
+        datagramList = new LinkedList();
+        mcsVersion = new McsVersion();
+        lockingKeyStateManager = new LockingKeyStateManager();
+        isStandalone = true;
+        blueScreenDump = false;
+        encryptVideo = false;
+    }
+
+    public void init() {
+        try {
+            UIManager.setLookAndFeel(new WindowsLookAndFeel());
+        }
+        catch (Exception exception) { }
+        System.out.println("MCS v.3.6 initialized");
+        isStandalone = false;
+        String s = getParameter("host");
+        if (s == null)
+            s = getCodeBase().getHost();
+        String s1 = s;
+        String s2 = getParameter("bluescreen");
+        if (s2 != null && s2.equalsIgnoreCase("true"))
+            blueScreenDump = true;
+        String s3 = getParameter("userid");
+        if (s3 == null)
+            s3 = "";
+        String s4 = s3;
+        String s5 = getParameter("enc");
+        if (s5 != null && s5.equalsIgnoreCase("on"))
+            encryptVideo = true;
+        String s6 = getParameter("ac");
+        if (s6 == null)
+            s6 = "";
+        String s7 = s6;
+        getContentPane().setBackground(Color.WHITE);
+        begin(s1, s4, s7, false);
+    }
+
+    public void stop() {
+        System.out.println("Stopping applet");
+        if (threadGroup != null)
+            threadGroup.interrupt();
+        if (mcsTcpConnection != null) {
+            mcsTcpConnection.close();
+            mcsTcpConnection = null;
+        }
+    }
+
+    public void begin(String s, String s1, String s2, boolean flag) {
+        int i = 2000;
+        StringTokenizer stringtokenizer = new StringTokenizer(s, ":");
+        String s3 = stringtokenizer.nextToken();
+        if (stringtokenizer.hasMoreTokens())
+            try {
+                i = Integer.parseInt(stringtokenizer.nextToken());
+            }
+            catch (NumberFormatException numberformatexception) {
+                i = 2000;
+            }
+        mcsTcpConnection = new McsTcpConnection(s3, i, encryptVideo, s2);
+        if (!mcsTcpConnection.connected()) {
+            if (isStandalone)
+                System.exit(0);
+            stop();
+            return;
+        }
+        sendUsernameToServer(s1, s2);
+        liveVideoPanel = new LiveVideoPanel(mcsTcpConnection, datagramList, mcsTargetSize, lockingKeyStateManager);
+        mcsKeyAdapter = new McsKeyAdapter(mcsTcpConnection, lockingKeyStateManager);
+        mcsMouseAdapter = new McsMouseAdapter(mcsTcpConnection, liveVideoPanel);
+        mcsMouseMotionAdapter = new McsMouseMotionAdapter(mcsTcpConnection, mcsKeyAdapter);
+        if (!blueScreenDump) {
+            liveVideoPanel.addMouseListener(mcsMouseAdapter);
+            liveVideoPanel.addMouseMotionListener(mcsMouseMotionAdapter);
+            liveVideoPanel.addKeyListener(mcsKeyAdapter);
+            liveVideoPanel.addMouseWheelListener(mcsMouseAdapter);
+        }
+        liveVideoPanel.setPreferredSize(maxTargetSize);
+        liveVideoPanel.setFocusTraversalKeysEnabled(false);
+        datagramReader = new DatagramReader(mcsTcpConnection, liveVideoPanel, datagramList, s3, i, flag);
+        if (!blueScreenDump) {
+            McsToolBar mcstoolbar = new McsToolBar(mcsKeyAdapter, liveVideoPanel);
+            mcstoolbar.setFloatable(false);
+            mcstoolbar.setVisible(false);
+            McsToolBar mcstoolbar1 = new McsToolBar(s3, mcsKeyAdapter, liveVideoPanel, datagramReader, mcstoolbar);
+            getContentPane().add(mcstoolbar1, "North");
+            getContentPane().add(mcstoolbar, "West");
+        }
+        getContentPane().add(liveVideoPanel);
+        liveVideoPanel.requestFocusInWindow();
+        if (!datagramReader.initialized()) {
+            if (isStandalone)
+                System.exit(0);
+            stop();
+            return;
+        }
+        messageReader = new MessageReader(mcsTcpConnection, mcsVersion, lockingKeyStateManager);
+        keepAlive = new KeepAlive(mcsTcpConnection, blueScreenDump);
+        threadGroup = new ThreadGroup("MCS Threads");
+        threadGroup.setDaemon(true);
+        (new Thread(threadGroup, liveVideoPanel, "liveVideoPanel thread")).start();
+        Thread thread = new Thread(threadGroup, datagramReader, "datagramReader thread");
+        thread.setPriority(thread.getPriority() + 2);
+        thread.start();
+        Thread thread1 = new Thread(threadGroup, messageReader, "messageReader thread");
+        if (flag)
+            thread1.setPriority(thread1.getPriority() + 2);
+        thread1.start();
+        Thread thread2 = new Thread(threadGroup, keepAlive, "keepAlive thread");
+        thread2.setPriority(thread2.getPriority() + 2);
+        thread2.start();
+        sendVersionToServer();
+        System.out.println("Command KVM Server to start sending images");
+        sendStartSendingToServer(mcsTcpConnection.getDetectedPPP());
+    }
+
+    private void sendUsernameToServer(String s, String s1) {
+        if (s1 == null)
+            s1 = "";
+        char ac[] = (s + ":" + s1).toCharArray();
+        int ai[] = new int[2 + ac.length];
+        ai[0] = ai.length * 4;
+        ai[1] = 11;
+        for (int i = 0; i < ac.length; i++)
+            ai[2 + i] = ac[i];
+
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send user name.");
+            stop();
+        }
+    }
+
+    private void sendVersionToServer() {
+        int ai[] = new int[4];
+        ai[0] = ai.length * 4;
+        ai[1] = 13;
+        ai[2] = mcsVersion.getClientMajorRev();
+        ai[3] = mcsVersion.getClientMinorRev();
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send version.");
+            stop();
+        }
+    }
+
+    private void sendStartSendingToServer(boolean flag) {
+        int ai[] = new int[3];
+        ai[0] = ai.length * 4;
+        if (blueScreenDump)
+            ai[1] = 24;
+        else
+        if (!flag)
+            ai[1] = 0;
+        else
+            ai[1] = 1;
+        ai[2] = 0;
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send start sending to server.");
+            stop();
+        }
+    }
+
+    public boolean isVideoEncrypted() {
+        return encryptVideo;
+    }
+
+}
diff --git a/src/mcsClient/McsKeyAdapter.java b/src/mcsClient/McsKeyAdapter.java
new file mode 100644 (file)
index 0000000..21890d6
--- /dev/null
@@ -0,0 +1,159 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+// Referenced classes of package mcsClient:
+//            KeyMap, Options, LockingKeyStateManager, McsTcpConnection, 
+//            McsToolBar
+
+public class McsKeyAdapter extends KeyAdapter {
+
+    public static final int SYNC_KEY_RELEASED = 1;
+    public static final int SYNC_KEY_DEPRESSED = 2;
+    public static final int USE_RIGHT_MOUSE_BUTTON = 3;
+    private McsTcpConnection mcsTcpConnection;
+    private LockingKeyStateManager lockingKeyStateManager;
+    private McsToolBar toolBar;
+    private boolean leftAltDown;
+    private boolean rightAltDown;
+    private boolean leftCtrlDown;
+    private boolean rightCtrlDown;
+    private boolean keyboardHasAltGr;
+    private KeyMap keyMap;
+    private String mouseSyncKey;
+    private int mouseSyncState;
+    private ArrayList keyboardEvents;
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    public McsKeyAdapter(McsTcpConnection mcstcpconnection, LockingKeyStateManager lockingkeystatemanager) {
+        toolBar = null;
+        leftAltDown = false;
+        rightAltDown = false;
+        leftCtrlDown = false;
+        rightCtrlDown = false;
+        keyboardHasAltGr = false;
+        mouseSyncState = 1;
+        keyboardEvents = new ArrayList();
+        mcsTcpConnection = mcstcpconnection;
+        lockingKeyStateManager = lockingkeystatemanager;
+        logger.setLevel(Level.WARNING);
+        String s = System.getProperty("mcs.debug");
+        if (s != null && s.equalsIgnoreCase("true"))
+            logger.setLevel(Level.ALL);
+        keyMap = new KeyMap();
+    }
+
+    public void keyPressed(KeyEvent keyevent) {
+        logger.info(keyevent.toString());
+        if (!mouseSyncKey.equals(Options.NO_KEY_SET) && mouseSyncKey.equals(keyevent.getKeyText(keyevent.getKeyCode())))
+            mouseSyncState = 2;
+        if (!lockingKeyStateManager.filterKeyPress(keyevent)) {
+            if ((leftAltDown || rightAltDown) && keyevent.getKeyCode() == 115) {
+                sendKeyEvent(11, 226, 2);
+                sendKeyEvent(11, 230, 3);
+                return;
+            }
+            if (keyevent.getKeyCode() == 17 && keyevent.getKeyLocation() == 2) {
+                if (leftCtrlDown)
+                    return;
+                leftCtrlDown = true;
+            }
+            if (keyevent.getKeyCode() == 17 && keyevent.getKeyLocation() == 3) {
+                if (rightCtrlDown)
+                    return;
+                rightCtrlDown = true;
+            }
+            if (keyevent.getKeyCode() == 18 && keyevent.getKeyLocation() == 2) {
+                if (leftAltDown)
+                    return;
+                leftAltDown = true;
+            }
+            if (keyevent.getKeyCode() == 18 && keyevent.getKeyLocation() == 3) {
+                if (rightAltDown)
+                    return;
+                rightAltDown = true;
+            }
+            if (keyevent.getKeyCode() == 18 && keyboardHasAltGr && keyevent.getKeyLocation() == 3)
+                sendKeyEvent(11, 224, 2);
+            sendKeyEvent(10, keyMap.getKey(keyevent), keyevent.getKeyLocation());
+            keyevent.consume();
+        }
+    }
+
+    public void keyReleased(KeyEvent keyevent) {
+        logger.info(keyevent.toString());
+        if (mouseSyncKey.equals(keyevent.getKeyText(keyevent.getKeyCode())))
+            mouseSyncState = 1;
+        if (!lockingKeyStateManager.filterKeyRelease(keyevent)) {
+            if (keyevent.getKeyCode() == 17 && keyevent.getKeyLocation() == 2)
+                leftCtrlDown = false;
+            if (keyevent.getKeyCode() == 17 && keyevent.getKeyLocation() == 3)
+                rightCtrlDown = false;
+            if (keyevent.getKeyCode() == 18 && keyevent.getKeyLocation() == 2)
+                leftAltDown = false;
+            if (keyevent.getKeyCode() == 18 && keyevent.getKeyLocation() == 3)
+                rightAltDown = false;
+            sendKeyEvent(11, keyMap.getKey(keyevent), keyevent.getKeyLocation());
+            keyevent.consume();
+        }
+    }
+
+    public void sendKeyEvent(int i, int j, int k) {
+        int ai[] = new int[5];
+        ai[0] = ai.length * 4;
+        ai[1] = 15;
+        ai[2] = i;
+        ai[3] = j;
+        ai[4] = k;
+        boolean flag = j == 226 || j == 230 || j == 224 || j == 228 || j == 225 || j == 229;
+        keyboardEvents.add(ai);
+        int ai1[];
+        for (Iterator iterator = keyboardEvents.iterator(); iterator.hasNext(); logger.info("Sent keyMessage, type: " + ai1[2] + ", key code: " + Integer.toHexString(ai1[3] & 0xffff)))
+            try {
+                ai1 = (int[])iterator.next();
+                mcsTcpConnection.sendMessage(ai1);
+            }
+            catch (IOException ioexception) {
+                System.err.println("Could not send send key event McsKeyAdapter.");
+                return;
+            }
+
+        keyboardEvents.clear();
+    }
+
+    public void setKeyboardType(int i) {
+        keyboardHasAltGr = i != 0 && i != 5;
+        keyMap.setKeyboardType(i);
+    }
+
+    public int getButtonCode(int i) {
+        return keyMap.getButtonCode(i);
+    }
+
+    public int getButtonModifierCode(int i) {
+        return keyMap.getButtonModifierCode(i);
+    }
+
+    public void setMouseSyncKey(String s) {
+        mouseSyncKey = s;
+    }
+
+    public int getMouseSyncKeyState() {
+        if (mouseSyncKey.equals(Options.RIGHT_MOUSE))
+            return 3;
+        else
+            return mouseSyncState;
+    }
+
+}
diff --git a/src/mcsClient/McsMouseAdapter.java b/src/mcsClient/McsMouseAdapter.java
new file mode 100644 (file)
index 0000000..744f0d8
--- /dev/null
@@ -0,0 +1,99 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.event.*;
+import java.io.IOException;
+import java.io.PrintStream;
+
+// Referenced classes of package mcsClient:
+//            McsTcpConnection, LiveVideoPanel
+
+public class McsMouseAdapter extends MouseAdapter
+    implements MouseWheelListener {
+
+    private McsTcpConnection mcsTcpConnection;
+    private LiveVideoPanel liveVideoPanel;
+
+    public McsMouseAdapter(McsTcpConnection mcstcpconnection, LiveVideoPanel livevideopanel) {
+        mcsTcpConnection = mcstcpconnection;
+        liveVideoPanel = livevideopanel;
+    }
+
+    public void mouseWheelMoved(MouseWheelEvent mousewheelevent) {
+        int ai[] = new int[4];
+        ai[0] = ai.length * 4;
+        ai[1] = 14;
+        ai[2] = 7;
+        ai[3] = mousewheelevent.getWheelRotation();
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send wheel mouse event.");
+        }
+    }
+
+    public void mousePressed(MouseEvent mouseevent) {
+        int ai[] = new int[4];
+        ai[0] = ai.length * 4;
+        ai[1] = 14;
+        ai[2] = 1;
+        ai[3] = mouseevent.getModifiersEx();
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send send mouse event McsMouseAdapter.");
+            return;
+        }
+        liveVideoPanel.requestFocusInWindow();
+    }
+
+    public void mouseReleased(MouseEvent mouseevent) {
+        int ai[] = new int[4];
+        ai[0] = ai.length * 4;
+        ai[1] = 14;
+        ai[2] = 2;
+        ai[3] = mouseevent.getModifiersEx();
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send send mouse event McsMouseAdapter.");
+            return;
+        }
+    }
+
+    public void mouseEntered(MouseEvent mouseevent) {
+        int ai[] = new int[5];
+        ai[0] = ai.length * 4;
+        ai[1] = 14;
+        ai[2] = 3;
+        ai[3] = mouseevent.getX();
+        ai[4] = mouseevent.getY();
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send send mouse event McsMouseAdapter.");
+            return;
+        }
+    }
+
+    public void mouseExited(MouseEvent mouseevent) {
+        int ai[] = new int[3];
+        ai[0] = ai.length * 4;
+        ai[1] = 14;
+        ai[2] = 4;
+        try {
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not send send mouse event McsMouseAdapter.");
+            return;
+        }
+    }
+}
diff --git a/src/mcsClient/McsMouseMotionAdapter.java b/src/mcsClient/McsMouseMotionAdapter.java
new file mode 100644 (file)
index 0000000..a4824e1
--- /dev/null
@@ -0,0 +1,109 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
+import java.io.IOException;
+import java.io.PrintStream;
+
+// Referenced classes of package mcsClient:
+//            McsKeyAdapter, McsTcpConnection
+
+public class McsMouseMotionAdapter extends MouseMotionAdapter {
+
+    private McsTcpConnection mcsTcpConnection;
+    private McsKeyAdapter keyAdapter;
+    private int xDelta;
+    private int yDelta;
+    private int xPreSyncPoint;
+    private int yPreSyncPoint;
+
+    public McsMouseMotionAdapter(McsTcpConnection mcstcpconnection, McsKeyAdapter mcskeyadapter) {
+        xDelta = 0;
+        yDelta = 0;
+        xPreSyncPoint = 0;
+        yPreSyncPoint = 0;
+        mcsTcpConnection = mcstcpconnection;
+        keyAdapter = mcskeyadapter;
+        resyncMousePointer();
+    }
+
+    public void mouseMoved(MouseEvent mouseevent) {
+        if (keyAdapter.getMouseSyncKeyState() == 2) {
+            if (xPreSyncPoint == 0 && yPreSyncPoint == 0) {
+                xPreSyncPoint = mouseevent.getX();
+                yPreSyncPoint = mouseevent.getY();
+            }
+        } else {
+            if (xPreSyncPoint != 0 || yPreSyncPoint != 0) {
+                xDelta += xPreSyncPoint - mouseevent.getX();
+                yDelta += yPreSyncPoint - mouseevent.getY();
+                xPreSyncPoint = 0;
+                yPreSyncPoint = 0;
+            }
+            int ai[] = new int[5];
+            ai[0] = ai.length * 4;
+            ai[1] = 14;
+            ai[2] = 0;
+            ai[3] = mouseevent.getX() + xDelta <= 0 ? 0 : mouseevent.getX() + xDelta;
+            ai[4] = mouseevent.getY() + yDelta <= 0 ? 0 : mouseevent.getY() + yDelta;
+            try {
+                mcsTcpConnection.sendMessage(ai);
+            }
+            catch (IOException ioexception) {
+                System.err.println("Could not send send mouse event McsMouseMotionAdapter.");
+                return;
+            }
+        }
+    }
+
+    public void mouseDragged(MouseEvent mouseevent) {
+        if (keyAdapter.getMouseSyncKeyState() == 2 || keyAdapter.getMouseSyncKeyState() == 3 && (mouseevent.getModifiersEx() & 0x1000) != 0) {
+            if (xPreSyncPoint == 0 && yPreSyncPoint == 0) {
+                xPreSyncPoint = mouseevent.getX();
+                yPreSyncPoint = mouseevent.getY();
+            }
+        } else {
+            if (xPreSyncPoint != 0 || yPreSyncPoint != 0) {
+                xDelta += xPreSyncPoint - mouseevent.getX();
+                yDelta += yPreSyncPoint - mouseevent.getY();
+                xPreSyncPoint = 0;
+                yPreSyncPoint = 0;
+            }
+            int ai[] = new int[5];
+            ai[0] = ai.length * 4;
+            ai[1] = 14;
+            ai[2] = 0;
+            ai[3] = mouseevent.getX() + xDelta <= 0 ? 0 : mouseevent.getX() + xDelta;
+            ai[4] = mouseevent.getY() + yDelta <= 0 ? 0 : mouseevent.getY() + yDelta;
+            try {
+                mcsTcpConnection.sendMessage(ai);
+            }
+            catch (IOException ioexception) {
+                System.err.println("Could not send send mouse event McsMouseMotionAdapter.");
+                return;
+            }
+        }
+    }
+
+    private void resyncMousePointer() {
+        try {
+            int ai[] = new int[5];
+            ai[0] = ai.length * 4;
+            ai[1] = 14;
+            ai[2] = 0;
+            ai[3] = 1024;
+            ai[4] = 768;
+            mcsTcpConnection.sendMessage(ai);
+            ai[3] = 0;
+            ai[4] = 0;
+            mcsTcpConnection.sendMessage(ai);
+        }
+        catch (IOException ioexception) {
+            System.err.println("Could not resync mouse.");
+        }
+    }
+}
diff --git a/src/mcsClient/McsTargetSize.java b/src/mcsClient/McsTargetSize.java
new file mode 100644 (file)
index 0000000..1d4cc06
--- /dev/null
@@ -0,0 +1,35 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+
+public class McsTargetSize {
+
+    private int width;
+    private int height;
+
+    public McsTargetSize(int i, int j) {
+        width = 1024;
+        height = 768;
+        width = i;
+        height = j;
+    }
+
+    public void setWidth(int i) {
+        width = i;
+    }
+
+    public void setHeight(int i) {
+        height = i;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+}
diff --git a/src/mcsClient/McsTcpConnection.java b/src/mcsClient/McsTcpConnection.java
new file mode 100644 (file)
index 0000000..7e73d71
--- /dev/null
@@ -0,0 +1,194 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import Acme.Crypto.DesCipher;
+import java.io.*;
+import java.net.*;
+import java.util.Arrays;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+public class McsTcpConnection {
+
+    private DataInputStream socketInput;
+    private DataOutputStream socketOutput;
+    private boolean detectedPPP;
+    private int localPort;
+    private InetAddress localAddress;
+    Socket connection;
+    private boolean connected;
+    private boolean encrypt;
+    public DesCipher cipher1;
+    public DesCipher cipher2;
+    private boolean debug;
+
+    public McsTcpConnection(String s, int i, boolean flag, String s1) {
+        socketInput = null;
+        socketOutput = null;
+        detectedPPP = false;
+        connection = null;
+        connected = false;
+        debug = false;
+        Object obj = null;
+        Object obj1 = null;
+        Object obj2 = null;
+        encrypt = flag;
+        try {
+            connection = new Socket(s, i);
+            connection.setTcpNoDelay(true);
+            connection.setReceiveBufferSize(0x20000);
+            NetworkInterface networkinterface = NetworkInterface.getByInetAddress(connection.getLocalAddress());
+            if (networkinterface.getDisplayName().indexOf("PPP") != -1 || networkinterface.getDisplayName().indexOf("ppp") != -1)
+                detectedPPP = true;
+            localPort = connection.getLocalPort();
+            localAddress = connection.getLocalAddress();
+            java.io.InputStream inputstream = connection.getInputStream();
+            java.io.OutputStream outputstream = connection.getOutputStream();
+            System.out.println("Connected via socket: " + connection);
+            socketInput = new DataInputStream(new BufferedInputStream(inputstream));
+            socketOutput = new DataOutputStream(new BufferedOutputStream(outputstream));
+            connected = true;
+            if (flag) {
+                byte abyte0[] = new byte[8];
+                byte abyte1[] = {
+                    34, 17, 31, 76, 113, 30, 91, 115
+                };
+                for (int j = 0; j < 8; j++) {
+                    abyte0[j] = (byte)s1.toCharArray()[j];
+                    abyte1[j] = (byte)(abyte1[j] ^ (byte)s1.toCharArray()[j]);
+                }
+
+                if (debug)
+                    System.out.println("mcsTcpConnection: accessCode = " + s1);
+                cipher1 = new DesCipher(abyte0);
+                cipher2 = new DesCipher(abyte1);
+            }
+        }
+        catch (UnknownHostException unknownhostexception) {
+            close();
+            System.err.println(unknownhostexception);
+            JOptionPane.showMessageDialog(new JFrame(), "Unknown host: " + s, "Remote Console Connection Error", 0);
+        }
+        catch (ConnectException connectexception) {
+            close();
+            System.err.println(connectexception);
+            JOptionPane.showMessageDialog(new JFrame(), "Unable to connect to to " + s + ":" + i + ".", "Remote Console Connection Error", 0);
+        }
+        catch (IOException ioexception) {
+            close();
+            System.err.println(ioexception);
+            JOptionPane.showMessageDialog(new JFrame(), "Connection to " + s + " lost.", "Remote Console Connection Error", 0);
+        }
+    }
+
+    boolean getDetectedPPP() {
+        return detectedPPP;
+    }
+
+    DataInputStream getSocketInput() {
+        return socketInput;
+    }
+
+    int getLocalPort() {
+        return localPort;
+    }
+
+    InetAddress getLocalAddress() {
+        return localAddress;
+    }
+
+    public synchronized void sendMessage(int ai[], boolean flag) throws IOException {
+        if (encrypt) {
+            int l = ai.length * 4;
+            byte abyte0[] = new byte[l];
+            int i1 = 0;
+            for (int i = 0; i < ai.length; i++) {
+                int k = i * 4;
+                abyte0[k] = (byte)((ai[i] & 0xff000000) >> 24);
+                abyte0[k + 1] = (byte)((ai[i] & 0xff0000) >> 16);
+                abyte0[k + 2] = (byte)((ai[i] & 0xff00) >> 8);
+                abyte0[k + 3] = (byte)(ai[i] & 0xff);
+            }
+
+            if (l % 8 > 0)
+                i1 = 8 - l % 8;
+            int j1 = (l + i1) / 8;
+            byte abyte1[] = new byte[j1 * 8];
+            System.arraycopy(abyte0, 0, abyte1, 0, l);
+            if (i1 > 0) {
+                abyte1[abyte1.length - 1] = (byte)i1;
+                if (i1 > 1)
+                    Arrays.fill(abyte1, abyte1.length - i1, abyte1.length - 2, (byte)0);
+            }
+            try {
+                socketOutput.write(encrypt(abyte1, abyte1.length), 0, abyte1.length);
+                if (flag)
+                    socketOutput.flush();
+            }
+            catch (IOException ioexception1) {
+                close();
+                throw ioexception1;
+            }
+        } else {
+            try {
+                for (int j = 0; j < ai.length; j++)
+                    socketOutput.writeInt(ai[j]);
+
+                if (flag)
+                    socketOutput.flush();
+            }
+            catch (IOException ioexception) {
+                close();
+                throw ioexception;
+            }
+        }
+    }
+
+    public synchronized void sendMessage(int ai[]) throws IOException {
+        sendMessage(ai, true);
+    }
+
+    public void close() {
+        connected = false;
+        try {
+            if (connection != null) {
+                connection.close();
+                connection = null;
+            }
+        }
+        catch (IOException ioexception) {
+            System.err.println("Socket already closed.");
+        }
+    }
+
+    public boolean connected() {
+        return connected;
+    }
+
+    public boolean videoEncrypted() {
+        return encrypt;
+    }
+
+    public byte[] decrypt(byte abyte0[], int i, int j) {
+        for (int k = j; k < i + j; k += 8) {
+            cipher1.decrypt(abyte0, k, abyte0, k);
+            cipher2.encrypt(abyte0, k, abyte0, k);
+            cipher1.decrypt(abyte0, k, abyte0, k);
+        }
+
+        return abyte0;
+    }
+
+    public byte[] encrypt(byte abyte0[], int i) {
+        for (int j = 0; j < i; j += 8) {
+            cipher1.encrypt(abyte0, j, abyte0, j);
+            cipher2.decrypt(abyte0, j, abyte0, j);
+            cipher1.encrypt(abyte0, j, abyte0, j);
+        }
+
+        return abyte0;
+    }
+}
diff --git a/src/mcsClient/McsToolBar.java b/src/mcsClient/McsToolBar.java
new file mode 100644 (file)
index 0000000..ed6c790
--- /dev/null
@@ -0,0 +1,585 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.PrintStream;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+// Referenced classes of package mcsClient:
+//            KeyButton, Help, Options, KeyData, 
+//            KeyButtonListener, LiveVideoPanel, DatagramReader, McsKeyAdapter, 
+//            ComboKeyArray
+
+public final class McsToolBar extends JToolBar
+    implements KeyButtonListener {
+
+    public static final int BITRATES[] = {
+        0, 10240, 20480, 30720, 40960, 51200, 0x19000, 0x25800, 0x32000, 0x3e800, 
+        0x4b000, 0x96000, 0xe1000, 0x12c000, 0x177000, 0x2ee000, 0x4e2000
+    };
+    private McsKeyAdapter keyAdapter;
+    private LiveVideoPanel videoPanel;
+    private DatagramReader datagramReader;
+    private JSlider slider;
+    private int lastBitrate;
+    private Help sliderHelp;
+    private JLabel configLink;
+    private Options options;
+    private KeyButton japan1Button;
+    private KeyButton japan1aButton;
+    private KeyButton japan131Button;
+    private KeyButton japan132Button;
+    private KeyButton japan132aButton;
+    private KeyButton japan132sButton;
+    private KeyButton japan133Button;
+    private KeyButton japan133aButton;
+    private KeyButton japan133sButton;
+    private KeyButton japan30Button;
+    private KeyButton japan30aButton;
+    private KeyButton tildeButton;
+    private KeyButton circumflexButton;
+    private KeyButton diaeresisButton;
+    private KeyButton graveButton;
+    private KeyButton acuteButton;
+    private KeyButton rightSquareBracketButton;
+    private KeyButton leftSquareBracketButton;
+    private KeyButton rightCurlyBracketButton;
+    private KeyButton leftCurlyBracketButton;
+    private KeyButton backslashButton;
+    private KeyButton atButton;
+    private static final String SLIDER_HELP_DATA[] = {
+        "The Video Speed selector is used to limit the bandwidth that is devoted to the\n", "Remote Console display on your computer.  Reducing the Video Speed can\n", "improve the rate at which the Remote Console display is refreshed by limiting\n", "the video data that must be displayed.  You can reduce, or even stop, video\n", "data to allow more bandwidth for Remote Disk, if desired.  Move the slider\n", "left or right until you find the bandwidth that achieves the best results."
+    };
+
+    public McsToolBar(McsKeyAdapter mcskeyadapter, LiveVideoPanel livevideopanel) {
+        slider = new JSlider(0, 16);
+        lastBitrate = 16;
+        configLink = new JLabel("<html><u>Preferences</u></html>");
+        keyAdapter = mcskeyadapter;
+        videoPanel = livevideopanel;
+        japan1Button = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan1.gif")));
+        japan1Button.setToolTipText("Send Hankaku/Zenkaku to the server");
+        japan1Button.addKeyButtonListener(this);
+        japan1aButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan1a.gif")));
+        japan1aButton.setToolTipText("Send Kanji to the server");
+        japan1aButton.addKeyButtonListener(this);
+        japan131Button = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan131.gif")));
+        japan131Button.setToolTipText("Send Muhehkan to the server");
+        japan131Button.addKeyButtonListener(this);
+        japan132Button = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan132.gif")));
+        japan132Button.setToolTipText("Send Henkan to the server");
+        japan132Button.addKeyButtonListener(this);
+        japan132aButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan132a.gif")));
+        japan132aButton.setToolTipText("Send Zenkouho to the server");
+        japan132aButton.addKeyButtonListener(this);
+        japan132sButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan132s.gif")));
+        japan132sButton.setToolTipText("Send Zenkouho to the server");
+        japan132sButton.addKeyButtonListener(this);
+        japan133Button = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan133.gif")));
+        japan133Button.setToolTipText("Send Hiragana to the server");
+        japan133Button.addKeyButtonListener(this);
+        japan133aButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan133a.gif")));
+        japan133aButton.setToolTipText("Send Romanji to the server");
+        japan133aButton.addKeyButtonListener(this);
+        japan133sButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan133s.gif")));
+        japan133sButton.setToolTipText("Send Katakana to the server");
+        japan133sButton.addKeyButtonListener(this);
+        japan30Button = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan30.gif")));
+        japan30Button.setToolTipText("Send Eisuu to the server");
+        japan30Button.addKeyButtonListener(this);
+        japan30aButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("japan30a.gif")));
+        japan30aButton.setToolTipText("Send Kanji Bangou to the server");
+        japan30aButton.addKeyButtonListener(this);
+        tildeButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("tilde.gif")));
+        tildeButton.setToolTipText("Send tilde modifier to the server");
+        tildeButton.addKeyButtonListener(this);
+        circumflexButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("circumflex.gif")));
+        circumflexButton.setToolTipText("Send circumflex modifier to the server");
+        circumflexButton.addKeyButtonListener(this);
+        diaeresisButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("diaeresis.gif")));
+        diaeresisButton.setToolTipText("Send diaeresis modifier to the server");
+        diaeresisButton.addKeyButtonListener(this);
+        acuteButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("acute.gif")));
+        acuteButton.setToolTipText("Send acute modifier to the server");
+        acuteButton.addKeyButtonListener(this);
+        graveButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("grave.gif")));
+        graveButton.setToolTipText("Send grave modifier to the server");
+        graveButton.addKeyButtonListener(this);
+        leftSquareBracketButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("leftsquarebracket.gif")));
+        leftSquareBracketButton.setToolTipText("Send left square bracket to the server");
+        leftSquareBracketButton.addKeyButtonListener(this);
+        rightSquareBracketButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("rightsquarebracket.gif")));
+        rightSquareBracketButton.setToolTipText("Send right square bracket to the server");
+        rightSquareBracketButton.addKeyButtonListener(this);
+        leftCurlyBracketButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("leftbracket.gif")));
+        leftCurlyBracketButton.setToolTipText("Send left curly bracket to the server");
+        leftCurlyBracketButton.addKeyButtonListener(this);
+        rightCurlyBracketButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("rightbracket.gif")));
+        rightCurlyBracketButton.setToolTipText("Send right curly bracket to the server");
+        rightCurlyBracketButton.addKeyButtonListener(this);
+        backslashButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("backslash.gif")));
+        backslashButton.setToolTipText("Send backslash to the server");
+        backslashButton.addKeyButtonListener(this);
+        atButton = new KeyButton(Toolkit.getDefaultToolkit().getImage(getClass().getResource("atsign.gif")));
+        atButton.setToolTipText("Send at symbol to the server");
+        atButton.addKeyButtonListener(this);
+        setPreferredSize(new Dimension(95, 350));
+        setLayout(new FlowLayout(0, 2, 2));
+    }
+
+    public McsToolBar(String s, McsKeyAdapter mcskeyadapter, LiveVideoPanel livevideopanel, DatagramReader datagramreader, McsToolBar mcstoolbar) {
+        slider = new JSlider(0, 16);
+        lastBitrate = 16;
+        configLink = new JLabel("<html><u>Preferences</u></html>");
+        keyAdapter = mcskeyadapter;
+        videoPanel = livevideopanel;
+        datagramReader = datagramreader;
+        setLayout(new FlowLayout(0, 3, 3));
+        slider.setToolTipText("Video speed selector");
+        slider.setBackground(getBackground());
+        slider.setPreferredSize(new Dimension(260, 40));
+        slider.setPaintTicks(true);
+        slider.setMajorTickSpacing(2);
+        slider.setMinorTickSpacing(1);
+        slider.setSnapToTicks(true);
+        slider.setPaintLabels(true);
+        Hashtable hashtable = new Hashtable();
+        hashtable.put(new Integer(0), new JLabel("0"));
+        hashtable.put(new Integer(2), new JLabel("20k"));
+        hashtable.put(new Integer(4), new JLabel("40k"));
+        hashtable.put(new Integer(6), new JLabel("100k"));
+        hashtable.put(new Integer(8), new JLabel("200k"));
+        hashtable.put(new Integer(10), new JLabel("300k"));
+        hashtable.put(new Integer(12), new JLabel("900k"));
+        hashtable.put(new Integer(14), new JLabel("1.5M"));
+        hashtable.put(new Integer(16), new JLabel("5M"));
+        slider.setLabelTable(hashtable);
+        slider.addChangeListener(new ChangeListener() {
+
+            public void stateChanged(ChangeEvent changeevent) {
+                JSlider jslider = (JSlider)changeevent.getSource();
+                int j = McsToolBar.BITRATES[jslider.getValue()];
+                if (lastBitrate == 0 && j > 0)
+                    videoPanel.resumeVideo();
+                else
+                if (lastBitrate > 0 && j == 0)
+                    videoPanel.pauseVideo();
+                datagramReader.setInitialBitRate(j);
+                lastBitrate = j;
+            }
+
+        }
+);
+        sliderHelp = new Help("Video Speed Help", Toolkit.getDefaultToolkit().getImage(getClass().getResource("help.gif")), SLIDER_HELP_DATA.length);
+        sliderHelp.setToolTipText("Video Speed Help");
+        for (int i = 0; i < SLIDER_HELP_DATA.length; i++)
+            sliderHelp.append(SLIDER_HELP_DATA[i]);
+
+        options = new Options(s, mcskeyadapter, datagramreader, this, mcstoolbar);
+        options.hide();
+        livevideopanel.addSliderListener(this);
+        datagramreader.addSliderListener(this);
+    }
+
+    public void keyPressed(MouseEvent mouseevent) {
+        if (mouseevent.getSource() == japan1Button)
+            keyAdapter.sendKeyEvent(10, 53, 1);
+        else
+        if (mouseevent.getSource() == japan1aButton) {
+            keyAdapter.sendKeyEvent(10, 226, 1);
+            keyAdapter.sendKeyEvent(10, 53, 1);
+        } else
+        if (mouseevent.getSource() == japan30Button)
+            keyAdapter.sendKeyEvent(10, 57, 1);
+        else
+        if (mouseevent.getSource() == japan30aButton) {
+            keyAdapter.sendKeyEvent(10, 226, 1);
+            keyAdapter.sendKeyEvent(10, 57, 1);
+        } else
+        if (mouseevent.getSource() == japan131Button)
+            keyAdapter.sendKeyEvent(10, 139, 1);
+        else
+        if (mouseevent.getSource() == japan132Button)
+            keyAdapter.sendKeyEvent(10, 138, 1);
+        else
+        if (mouseevent.getSource() == japan132aButton) {
+            keyAdapter.sendKeyEvent(10, 226, 1);
+            keyAdapter.sendKeyEvent(10, 138, 1);
+        } else
+        if (mouseevent.getSource() == japan132sButton) {
+            keyAdapter.sendKeyEvent(10, 225, 1);
+            keyAdapter.sendKeyEvent(10, 138, 1);
+        } else
+        if (mouseevent.getSource() == japan133Button)
+            keyAdapter.sendKeyEvent(10, 136, 1);
+        else
+        if (mouseevent.getSource() == japan133aButton) {
+            keyAdapter.sendKeyEvent(10, 226, 1);
+            keyAdapter.sendKeyEvent(10, 136, 1);
+        } else
+        if (mouseevent.getSource() == japan133sButton) {
+            keyAdapter.sendKeyEvent(10, 225, 1);
+            keyAdapter.sendKeyEvent(10, 136, 1);
+        } else
+        if (mouseevent.getSource() == tildeButton) {
+            int i = keyAdapter.getButtonModifierCode(1);
+            if (i != 0)
+                keyAdapter.sendKeyEvent(10, i, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(1), 1);
+        } else
+        if (mouseevent.getSource() == circumflexButton) {
+            int j = keyAdapter.getButtonModifierCode(2);
+            if (j != 0)
+                keyAdapter.sendKeyEvent(10, j, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(2), 1);
+        } else
+        if (mouseevent.getSource() == diaeresisButton) {
+            int k = keyAdapter.getButtonModifierCode(3);
+            if (k != 0)
+                keyAdapter.sendKeyEvent(10, k, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(3), 1);
+        } else
+        if (mouseevent.getSource() == graveButton) {
+            int l = keyAdapter.getButtonModifierCode(4);
+            if (l != 0)
+                keyAdapter.sendKeyEvent(10, l, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(4), 1);
+        } else
+        if (mouseevent.getSource() == acuteButton) {
+            int i1 = keyAdapter.getButtonModifierCode(5);
+            if (i1 != 0)
+                keyAdapter.sendKeyEvent(10, i1, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(5), 1);
+        } else
+        if (mouseevent.getSource() == leftSquareBracketButton) {
+            int j1 = keyAdapter.getButtonModifierCode(6);
+            if (j1 != 0)
+                keyAdapter.sendKeyEvent(10, j1, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(6), 1);
+        } else
+        if (mouseevent.getSource() == rightSquareBracketButton) {
+            int k1 = keyAdapter.getButtonModifierCode(7);
+            if (k1 != 0)
+                keyAdapter.sendKeyEvent(10, k1, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(7), 1);
+        } else
+        if (mouseevent.getSource() == leftCurlyBracketButton) {
+            int l1 = keyAdapter.getButtonModifierCode(8);
+            if (l1 != 0)
+                keyAdapter.sendKeyEvent(10, l1, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(8), 1);
+        } else
+        if (mouseevent.getSource() == rightCurlyBracketButton) {
+            int i2 = keyAdapter.getButtonModifierCode(9);
+            if (i2 != 0)
+                keyAdapter.sendKeyEvent(10, i2, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(9), 1);
+        } else
+        if (mouseevent.getSource() == backslashButton) {
+            int j2 = keyAdapter.getButtonModifierCode(10);
+            if (j2 != 0)
+                keyAdapter.sendKeyEvent(10, j2, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(10), 1);
+        } else
+        if (mouseevent.getSource() == atButton) {
+            int k2 = keyAdapter.getButtonModifierCode(11);
+            if (k2 != 0)
+                keyAdapter.sendKeyEvent(10, k2, 1);
+            keyAdapter.sendKeyEvent(10, keyAdapter.getButtonCode(11), 1);
+        }
+    }
+
+    public void keyReleased(MouseEvent mouseevent) {
+        if (mouseevent.getSource() == japan1Button)
+            keyAdapter.sendKeyEvent(11, 53, 1);
+        else
+        if (mouseevent.getSource() == japan1aButton) {
+            keyAdapter.sendKeyEvent(11, 53, 1);
+            keyAdapter.sendKeyEvent(11, 226, 1);
+        } else
+        if (mouseevent.getSource() == japan30Button)
+            keyAdapter.sendKeyEvent(11, 57, 1);
+        else
+        if (mouseevent.getSource() == japan30aButton) {
+            keyAdapter.sendKeyEvent(11, 57, 1);
+            keyAdapter.sendKeyEvent(11, 226, 1);
+        } else
+        if (mouseevent.getSource() == japan131Button)
+            keyAdapter.sendKeyEvent(11, 139, 1);
+        else
+        if (mouseevent.getSource() == japan132Button)
+            keyAdapter.sendKeyEvent(11, 138, 1);
+        else
+        if (mouseevent.getSource() == japan132aButton) {
+            keyAdapter.sendKeyEvent(11, 138, 1);
+            keyAdapter.sendKeyEvent(11, 226, 1);
+        } else
+        if (mouseevent.getSource() == japan132sButton) {
+            keyAdapter.sendKeyEvent(11, 138, 1);
+            keyAdapter.sendKeyEvent(11, 225, 1);
+        } else
+        if (mouseevent.getSource() == japan133Button)
+            keyAdapter.sendKeyEvent(11, 136, 1);
+        else
+        if (mouseevent.getSource() == japan133aButton) {
+            keyAdapter.sendKeyEvent(11, 136, 1);
+            keyAdapter.sendKeyEvent(11, 226, 1);
+        } else
+        if (mouseevent.getSource() == japan133sButton) {
+            keyAdapter.sendKeyEvent(11, 136, 1);
+            keyAdapter.sendKeyEvent(11, 225, 1);
+        } else
+        if (mouseevent.getSource() == tildeButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(1), 1);
+            int i = keyAdapter.getButtonModifierCode(1);
+            if (i != 0)
+                keyAdapter.sendKeyEvent(11, i, 1);
+        } else
+        if (mouseevent.getSource() == circumflexButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(2), 1);
+            int j = keyAdapter.getButtonModifierCode(2);
+            if (j != 0)
+                keyAdapter.sendKeyEvent(11, j, 1);
+        } else
+        if (mouseevent.getSource() == diaeresisButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(3), 1);
+            int k = keyAdapter.getButtonModifierCode(3);
+            if (k != 0)
+                keyAdapter.sendKeyEvent(11, k, 1);
+        } else
+        if (mouseevent.getSource() == graveButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(4), 1);
+            int l = keyAdapter.getButtonModifierCode(4);
+            if (l != 0)
+                keyAdapter.sendKeyEvent(11, l, 1);
+        } else
+        if (mouseevent.getSource() == acuteButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(5), 1);
+            int i1 = keyAdapter.getButtonModifierCode(5);
+            if (i1 != 0)
+                keyAdapter.sendKeyEvent(11, i1, 1);
+        } else
+        if (mouseevent.getSource() == leftSquareBracketButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(6), 1);
+            int j1 = keyAdapter.getButtonModifierCode(6);
+            if (j1 != 0)
+                keyAdapter.sendKeyEvent(11, j1, 1);
+        } else
+        if (mouseevent.getSource() == rightSquareBracketButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(7), 1);
+            int k1 = keyAdapter.getButtonModifierCode(7);
+            if (k1 != 0)
+                keyAdapter.sendKeyEvent(11, k1, 1);
+        } else
+        if (mouseevent.getSource() == leftCurlyBracketButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(8), 1);
+            int l1 = keyAdapter.getButtonModifierCode(8);
+            if (l1 != 0)
+                keyAdapter.sendKeyEvent(11, l1, 1);
+        } else
+        if (mouseevent.getSource() == rightCurlyBracketButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(9), 1);
+            int i2 = keyAdapter.getButtonModifierCode(9);
+            if (i2 != 0)
+                keyAdapter.sendKeyEvent(11, i2, 1);
+        } else
+        if (mouseevent.getSource() == backslashButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(10), 1);
+            int j2 = keyAdapter.getButtonModifierCode(10);
+            if (j2 != 0)
+                keyAdapter.sendKeyEvent(11, j2, 1);
+        } else
+        if (mouseevent.getSource() == atButton) {
+            keyAdapter.sendKeyEvent(11, keyAdapter.getButtonCode(11), 1);
+            int k2 = keyAdapter.getButtonModifierCode(11);
+            if (k2 != 0)
+                keyAdapter.sendKeyEvent(11, k2, 1);
+        }
+        videoPanel.requestFocusInWindow();
+        videoPanel.requestFocus();
+    }
+
+    public void populateCountryKeyBar(int i) {
+        removeAll();
+        setVisible(false);
+        switch (i) {
+        case 5: // '\005'
+            add(japan1Button);
+            add(japan1aButton);
+            add(japan30Button);
+            add(japan30aButton);
+            add(japan131Button);
+            add(japan132Button);
+            add(japan132sButton);
+            add(japan132aButton);
+            add(japan133Button);
+            add(japan133sButton);
+            add(japan133aButton);
+            setVisible(true);
+            break;
+
+        case 6: // '\006'
+            add(circumflexButton);
+            add(diaeresisButton);
+            add(graveButton);
+            add(acuteButton);
+            add(tildeButton);
+            add(leftSquareBracketButton);
+            add(rightSquareBracketButton);
+            add(leftCurlyBracketButton);
+            add(rightCurlyBracketButton);
+            add(backslashButton);
+            setVisible(true);
+            break;
+
+        case 4: // '\004'
+            add(graveButton);
+            add(tildeButton);
+            add(atButton);
+            setVisible(true);
+            break;
+
+        case 3: // '\003'
+            add(circumflexButton);
+            add(graveButton);
+            add(acuteButton);
+            add(backslashButton);
+            setVisible(true);
+            break;
+
+        case 2: // '\002'
+            add(circumflexButton);
+            add(diaeresisButton);
+            add(tildeButton);
+            add(graveButton);
+            setVisible(true);
+            break;
+
+        case 1: // '\001'
+            add(circumflexButton);
+            add(diaeresisButton);
+            add(tildeButton);
+            add(graveButton);
+            add(acuteButton);
+            setVisible(true);
+            break;
+        }
+        validate();
+    }
+
+    public void buildCustomizedButtonBar(ComboKeyArray combokeyarray) {
+        removeAll();
+        add(new JLabel("Video Speed (bps)"));
+        add(slider);
+        add(sliderHelp);
+        add(new javax.swing.JToolBar.Separator());
+        for (int i = 0; i < 12; i++) {
+            final ArrayList keyData = combokeyarray.getKeysForButton(i);
+            if (keyData != null) {
+                StringBuffer stringbuffer = new StringBuffer();
+                for (Iterator iterator = keyData.iterator(); iterator.hasNext();) {
+                    KeyData keydata = (KeyData)iterator.next();
+                    String s = keydata.getKeyName();
+                    if (s.endsWith(")"))
+                        s = s.substring(0, s.indexOf('(') - 1);
+                    stringbuffer.append(s);
+                    if (iterator.hasNext())
+                        stringbuffer.append("+");
+                }
+
+                JButton jbutton = new JButton(stringbuffer.toString());
+                jbutton.addActionListener(new ActionListener() {
+
+                    public void actionPerformed(ActionEvent actionevent) {
+                        for (int j = 0; j < keyData.size(); j++) {
+                            KeyData keydata1 = (KeyData)keyData.get(j);
+                            if (keydata1 != null)
+                                keyAdapter.sendKeyEvent(10, keydata1.getUsageCode(), 1);
+                        }
+
+                        for (int k = keyData.size() - 1; k >= 0; k--) {
+                            KeyData keydata2 = (KeyData)keyData.get(k);
+                            if (keydata2 != null)
+                                keyAdapter.sendKeyEvent(11, keydata2.getUsageCode(), 1);
+                        }
+
+                    }
+
+                }
+);
+                add(jbutton);
+            }
+        }
+
+        add(new javax.swing.JToolBar.Separator());
+        configLink.setForeground(Color.BLUE);
+        configLink.addMouseListener(new MouseListener() {
+
+            public void mouseClicked(MouseEvent mouseevent) {
+                options.show();
+            }
+
+            public void mousePressed(MouseEvent mouseevent) {
+                configLink.setForeground(Color.LIGHT_GRAY);
+            }
+
+            public void mouseReleased(MouseEvent mouseevent) {
+                configLink.setForeground(Color.GRAY);
+            }
+
+            public void mouseEntered(MouseEvent mouseevent) {
+                configLink.setForeground(Color.GRAY);
+            }
+
+            public void mouseExited(MouseEvent mouseevent) {
+                configLink.setForeground(Color.BLUE);
+            }
+
+        }
+);
+        add(configLink);
+        validate();
+    }
+
+    public void setSliderInitialBitRate(long l) {
+        if (l <= (long)BITRATES[1]) {
+            slider.setValue(1);
+            datagramReader.setInitialBitRate(BITRATES[1]);
+            return;
+        }
+        if (l >= (long)BITRATES[BITRATES.length - 1]) {
+            slider.setValue(BITRATES.length - 1);
+            datagramReader.setInitialBitRate(BITRATES[BITRATES.length - 1]);
+            return;
+        }
+        for (int i = 0; i < BITRATES.length; i++)
+            if (l < (long)BITRATES[i]) {
+                int j = BITRATES[i - 1] + (BITRATES[i] - BITRATES[i - 1]) / 2;
+                if (l < (long)j) {
+                    slider.setValue(i - 1);
+                    datagramReader.setInitialBitRate(BITRATES[i - 1]);
+                } else {
+                    slider.setValue(i);
+                    datagramReader.setInitialBitRate(BITRATES[i]);
+                }
+                return;
+            }
+
+        System.out.println("Error: Failed to set bitrate: " + l);
+    }
+
+
+
+
+
+
+
+
+}
diff --git a/src/mcsClient/McsVersion.java b/src/mcsClient/McsVersion.java
new file mode 100644 (file)
index 0000000..29043a5
--- /dev/null
@@ -0,0 +1,33 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+
+public class McsVersion {
+
+    public static final int CLIENT_MAJOR_REV = 3;
+    public static final int CLIENT_MINOR_REV = 6;
+    private static int serverMajorRev;
+    private static int serverMinorRev;
+
+    public McsVersion() {
+    }
+
+    public int getClientMajorRev() {
+        return 3;
+    }
+
+    public int getClientMinorRev() {
+        return 6;
+    }
+
+    public void setServerMajorRev(int i) {
+        serverMajorRev = i;
+    }
+
+    public void setServerMinorRev(int i) {
+        serverMinorRev = i;
+    }
+}
diff --git a/src/mcsClient/MessageCodes.java b/src/mcsClient/MessageCodes.java
new file mode 100644 (file)
index 0000000..77e0083
--- /dev/null
@@ -0,0 +1,49 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+
+public class MessageCodes {
+
+    public static final int START_SENDING_VIDEO = 0;
+    public static final int DIALUP_START_SENDING = 1;
+    public static final int VIDEO_DATA_1024_768 = 2;
+    public static final int VIDEO_DATA_800_600 = 3;
+    public static final int VIDEO_DATA_640_480 = 4;
+    public static final int VIDEO_DATA_NEGATIVE_ACK = 5;
+    public static final int VIDEO_LOST_SYNC = 6;
+    public static final int PAUSE_VIDEO = 7;
+    public static final int RESUME_VIDEO = 8;
+    public static final int KEYBOARD_STATE_MESSAGE = 9;
+    public static final int SET_BIT_RATE = 10;
+    public static final int SEND_USERNAME = 11;
+    public static final int SEND_KEEPALIVE = 12;
+    public static final int SEND_VERSION = 13;
+    public static final int MOUSE_MESSAGE = 14;
+    public static final int KEY_MESSAGE = 15;
+    public static final int IDLE_TIME_MESSAGE = 16;
+    public static final int WRITE_MEMORY_BYTE = 17;
+    public static final int WRITE_MEMORY_SHORT = 18;
+    public static final int WRITE_MEMORY_LONG = 19;
+    public static final int READ_MEMORY_BYTE = 20;
+    public static final int READ_MEMORY_SHORT = 21;
+    public static final int READ_MEMORY_LONG = 22;
+    public static final int VIDEO_DATA_640_400 = 23;
+    public static final int START_SENDING_BLUE_SCREEN = 24;
+    public static final int VIDEO_DATA_656_496 = 25;
+    public static final int MOUSE_MOVED = 0;
+    public static final int MOUSE_PRESSED = 1;
+    public static final int MOUSE_RELEASED = 2;
+    public static final int MOUSE_ENTERED = 3;
+    public static final int MOUSE_EXITED = 4;
+    public static final int CALIBRATE_MOUSE = 5;
+    public static final int RESYNC_MOUSE = 6;
+    public static final int MOUSE_WHEEL = 7;
+    public static final int KEY_PRESSED = 10;
+    public static final int KEY_RELEASED = 11;
+
+    public MessageCodes() {
+    }
+}
diff --git a/src/mcsClient/MessageReader.java b/src/mcsClient/MessageReader.java
new file mode 100644 (file)
index 0000000..b1846aa
--- /dev/null
@@ -0,0 +1,225 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.DataInputStream;
+import java.net.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+// Referenced classes of package mcsClient:
+//            McsTcpConnection, LockingKeyStateManager, McsVersion
+
+public class MessageReader
+    implements Runnable {
+
+    private DataInputStream socketInput;
+    private int localPort;
+    private InetAddress localAddress;
+    private McsVersion mcsVersion;
+    private LockingKeyStateManager lockingKeyStateManager;
+    private DatagramSocket dgSocket;
+    private boolean firstIdleTime;
+    private int idleTimer1;
+    private int savedIdleTimer1;
+    private int roundTripTime;
+    private static Logger logger = Logger.getAnonymousLogger();
+
+    public MessageReader(McsTcpConnection mcstcpconnection, McsVersion mcsversion, LockingKeyStateManager lockingkeystatemanager) {
+        firstIdleTime = true;
+        idleTimer1 = 0;
+        socketInput = mcstcpconnection.getSocketInput();
+        localPort = mcstcpconnection.getLocalPort();
+        localAddress = mcstcpconnection.getLocalAddress();
+        mcsVersion = mcsversion;
+        lockingKeyStateManager = lockingkeystatemanager;
+        logger.setLevel(Level.WARNING);
+        String s = System.getProperty("mcs.debug");
+        if (s != null && s.equalsIgnoreCase("true"))
+            logger.setLevel(Level.ALL);
+        try {
+            dgSocket = new DatagramSocket(0, localAddress);
+        }
+        catch (Exception exception) {
+            logger.warning(exception.toString());
+        }
+    }
+
+    private void cleanupThread() {
+        if (dgSocket != null) {
+            dgSocket.disconnect();
+            dgSocket.close();
+        }
+        dgSocket = null;
+        socketInput = null;
+    }
+
+    private void process() {
+        boolean flag = false;
+        boolean flag1 = false;
+        boolean flag2 = false;
+        boolean flag3 = false;
+        boolean flag4 = false;
+        boolean flag5 = false;
+        Object obj = null;
+        Thread thread = Thread.currentThread();
+        do {
+            Thread _tmp = thread;
+            if (!Thread.interrupted()) {
+                int i;
+                int j;
+                try {
+                    i = socketInput.readInt();
+                    j = socketInput.readInt();
+                }
+                catch (Exception exception) {
+                    logger.info("Message Reader - Socket closed");
+                    return;
+                }
+                if (i > 1458) {
+                    logger.warning("Message Reader - invalid message length = " + i + ", command = " + j);
+                    JOptionPane.showMessageDialog(new JFrame(), "Invalid message data", "Remote Console Data Communication Error", 0);
+                    return;
+                }
+                Thread _tmp1 = thread;
+                if (Thread.interrupted()) {
+                    logger.info("MessageReader interrupted.  Exiting.");
+                    return;
+                }
+                switch (j & 0x3f) {
+                case 2: // '\002'
+                case 3: // '\003'
+                case 4: // '\004'
+                case 6: // '\006'
+                case 23: // '\027'
+                case 25: // '\031'
+                    byte abyte0[] = new byte[1458];
+                    abyte0[2] = (byte)(i >> 8);
+                    abyte0[3] = (byte)i;
+                    abyte0[7] = (byte)j;
+                    DatagramPacket datagrampacket;
+                    try {
+                        if (i > 8)
+                            socketInput.readFully(abyte0, 8, i - 8);
+                        datagrampacket = new DatagramPacket(abyte0, i, dgSocket.getLocalAddress(), localPort);
+                    }
+                    catch (Exception exception1) {
+                        logger.severe("Message Reader - error reading video datagram - " + exception1 + ", length = " + i);
+                        JOptionPane.showMessageDialog(new JFrame(), "Error reading video data.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                        return;
+                    }
+                    try {
+                        dgSocket.send(datagrampacket);
+                        break;
+                    }
+                    catch (Exception exception2) {
+                        exception2.printStackTrace();
+                        logger.severe("Message Reader - error sending video datagram - " + exception2);
+                        JOptionPane.showMessageDialog(new JFrame(), "Error sending video data.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                        return;
+                    }
+
+                case 9: // '\t'
+                    try {
+                        int k = socketInput.readInt();
+                        logger.info("Message Reader got keyboard state " + Integer.toHexString(k & 0xff));
+                        lockingKeyStateManager.setTargetKeyState(k);
+                        break;
+                    }
+                    catch (Exception exception3) {
+                        logger.severe("Message Reader - error seting key state - " + exception3);
+                    }
+                    JOptionPane.showMessageDialog(new JFrame(), "Error setting key states.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                    return;
+
+                case 16: // '\020'
+                    try {
+                        idleTimer1 = socketInput.readInt();
+                    }
+                    catch (Exception exception4) {
+                        logger.severe("Message Reader - error reading idle time - " + exception4);
+                        JOptionPane.showMessageDialog(new JFrame(), "Error idle time data.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                        return;
+                    }
+                    if (!firstIdleTime)
+                        logger.info("Idle Time1 (%): " + ((idleTimer1 - savedIdleTimer1) * 1000) / 0x16052);
+                    else
+                        firstIdleTime = false;
+                    savedIdleTimer1 = idleTimer1;
+                    break;
+
+                case 12: // '\f'
+                    int l;
+                    try {
+                        l = socketInput.readInt();
+                    }
+                    catch (Exception exception5) {
+                        logger.severe("Message Reader - error reading keepalive - " + exception5);
+                        JOptionPane.showMessageDialog(new JFrame(), "Error reading keep-alive message.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                        return;
+                    }
+                    roundTripTime = (int)System.currentTimeMillis() - l;
+                    logger.info("Round trip time (ms) = " + roundTripTime);
+                    break;
+
+                case 13: // '\r'
+                    try {
+                        mcsVersion.setServerMajorRev(socketInput.readInt());
+                        mcsVersion.setServerMinorRev(socketInput.readInt());
+                        break;
+                    }
+                    catch (Exception exception6) {
+                        logger.severe("Message Reader - error reading server version - " + exception6);
+                    }
+                    JOptionPane.showMessageDialog(new JFrame(), "Error reading application version information.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                    return;
+
+                case 5: // '\005'
+                case 7: // '\007'
+                case 8: // '\b'
+                case 10: // '\n'
+                case 11: // '\013'
+                case 14: // '\016'
+                case 15: // '\017'
+                case 17: // '\021'
+                case 18: // '\022'
+                case 19: // '\023'
+                case 20: // '\024'
+                case 21: // '\025'
+                case 22: // '\026'
+                case 24: // '\030'
+                default:
+                    logger.warning("MessageReader - unexpected message code " + j);
+                    if (i <= 8)
+                        break;
+                    byte abyte1[] = new byte[i - 8];
+                    try {
+                        socketInput.read(abyte1, 0, abyte1.length);
+                        break;
+                    }
+                    catch (Exception exception7) {
+                        logger.severe("Message Reader - error reading socket - " + exception7);
+                    }
+                    JOptionPane.showMessageDialog(new JFrame(), "Error reading data from server.  Exit and start again.", "Remote Console Data Communication Error", 0);
+                    return;
+                }
+            } else {
+                return;
+            }
+        } while (true);
+    }
+
+    public void run() {
+        process();
+        cleanupThread();
+    }
+
+    protected void finalize() throws Throwable {
+        cleanupThread();
+    }
+
+}
diff --git a/src/mcsClient/Options.java b/src/mcsClient/Options.java
new file mode 100644 (file)
index 0000000..54b9d8a
--- /dev/null
@@ -0,0 +1,355 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.util.ArrayList;
+import javax.swing.*;
+
+// Referenced classes of package mcsClient:
+//            DefaultKeyArray, SavedSettings, Row, ComboKeyArray, 
+//            KeyData, McsKeyAdapter, McsToolBar, DatagramReader
+
+public final class Options extends JFrame
+    implements KeyListener, ActionListener {
+
+    public static final int MAX_BUTTONS = 12;
+    public static final int MAX_KEYS = 4;
+    public static final int EXPECTED_PREFS_VER = 1;
+    public static final int EXPECTED_COMBO_KEYS_VER = 1;
+    protected static final String EMPTY = "";
+    protected static final String CLEAR = "Clear";
+    private static final String KEY_FILE_NAME = "keys.dat";
+    private static final String PREFS_FILE_NAME = "prefs.dat";
+    private static final String RESTORE = "Restore Defaults";
+    private static final String CANCEL = "Cancel Changes";
+    private static final String SAVE = "Save Buttons";
+    private final DefaultKeyArray defaultKeys = new DefaultKeyArray();
+    private Row row[];
+    private JButton restore;
+    private JButton cancel;
+    private JButton save;
+    private String hostName;
+    private McsKeyAdapter keyAdapter;
+    private McsToolBar toolBar;
+    private McsToolBar countryKeyBar;
+    private JComboBox kbSelector;
+    private static final String KEYBOARDS[] = {
+        "US 104-key keyboard", "Belgian 105-key keyboard", "French 105-key keyboard", "German 105-key keyboard", "Italian 105-key keyboard (142)", "Japanese 109-key keyboard", "Spanish 105-key keyboard", "UK 105-key keyboard"
+    };
+    private JComboBox mouseSyncKey;
+    private static final String SYNC_KEYS[] = {
+        "None", "Escape", "Alt", "Right Mouse Button"
+    };
+    public static final String NO_KEY_SET = SYNC_KEYS[0];
+    public static final String RIGHT_MOUSE = SYNC_KEYS[3];
+    private SavedSettings savedSettings;
+
+    public Options(String s, McsKeyAdapter mcskeyadapter, DatagramReader datagramreader, McsToolBar mcstoolbar, McsToolBar mcstoolbar1) {
+        restore = new JButton("Restore Defaults");
+        cancel = new JButton("Cancel Changes");
+        save = new JButton("Save Buttons");
+        hostName = s;
+        keyAdapter = mcskeyadapter;
+        toolBar = mcstoolbar;
+        countryKeyBar = mcstoolbar1;
+        restore.addActionListener(this);
+        restore.addKeyListener(this);
+        cancel.addActionListener(this);
+        cancel.addKeyListener(this);
+        save.addActionListener(this);
+        save.addKeyListener(this);
+        restore.setToolTipText("Restore buttons to factory default settings.");
+        cancel.setToolTipText("Cancel changes made to button settings.");
+        save.setToolTipText("Save changes made to button settings.");
+        setTitle("Remote Console Preferences");
+        setDefaultCloseOperation(1);
+        setResizable(false);
+        try {
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+        }
+        catch (Exception exception) { }
+        try {
+            savedSettings = (SavedSettings)getSerializedObject("prefs.dat");
+        }
+        catch (Exception exception1) {
+            savedSettings = new SavedSettings();
+        }
+        JPanel jpanel = new JPanel();
+        jpanel.setLayout(new GridBagLayout());
+        jpanel.setBackground(getBackground());
+        GridBagConstraints gridbagconstraints = new GridBagConstraints();
+        gridbagconstraints.fill = 0;
+        gridbagconstraints.anchor = 10;
+        gridbagconstraints.weightx = 1.0D;
+        gridbagconstraints.weighty = 1.0D;
+        gridbagconstraints.insets = new Insets(20, 20, 20, 20);
+        JTextArea jtextarea = new JTextArea("You can create key buttons to represent common key combinations or keys that would\nbe trapped by your computer.  Create and customize the remote console key buttons\nby typing a key into each box below.  Click on Save Buttons when you are finished, and \nthe customized buttons will appear on your console control bar.\n\nSimulate the Print Screen key by pressing and holding the 'P' key for 3 seconds.");
+        jtextarea.setBackground(getBackground());
+        jtextarea.setEditable(false);
+        jtextarea.setFont(new Font("Sans Serif", 0, 12));
+        add(jtextarea, jpanel, gridbagconstraints, 0, 0, 10, 4);
+        gridbagconstraints.insets = new Insets(0, 0, 0, 0);
+        JPanel jpanel1 = new JPanel();
+        row = new Row[12];
+        for (int i = 0; i < 12; i++) {
+            row[i] = new Row(i + 1, this);
+            jpanel1.add(row[i]);
+        }
+
+        jpanel1.setPreferredSize(new Dimension((int)row[1].getPreferredSize().getWidth(), 12 * ((int)row[1].getPreferredSize().getHeight() + 10)));
+        JScrollPane jscrollpane = new JScrollPane(jpanel1);
+        jscrollpane.setPreferredSize(new Dimension((int)row[1].getPreferredSize().getWidth() + 30, 300));
+        add(jscrollpane, jpanel, gridbagconstraints, 0, 10, 10, 1);
+        jscrollpane.validate();
+        jpanel1.validate();
+        gridbagconstraints.anchor = 17;
+        gridbagconstraints.insets = new Insets(14, 20, 8, 0);
+        add(restore, jpanel, gridbagconstraints, 0, 22, 1, 1);
+        gridbagconstraints.anchor = 10;
+        gridbagconstraints.insets = new Insets(14, 0, 8, 0);
+        add(cancel, jpanel, gridbagconstraints, 4, 22, 1, 1);
+        gridbagconstraints.anchor = 13;
+        gridbagconstraints.insets = new Insets(14, 0, 8, 20);
+        add(save, jpanel, gridbagconstraints, 8, 22, 1, 1);
+        try {
+            ComboKeyArray combokeyarray = (ComboKeyArray)getSerializedObject("keys.dat");
+            if (combokeyarray.getVersion() != 1)
+                throw new IOException("Old version of ComboKeyArray found.");
+            loadButtonArray(combokeyarray);
+        }
+        catch (ClassNotFoundException classnotfoundexception) {
+            System.out.println(classnotfoundexception);
+        }
+        catch (IOException ioexception) {
+            loadButtonArray(defaultKeys);
+        }
+        saveButtonClicked();
+        JTabbedPane jtabbedpane = new JTabbedPane();
+        jtabbedpane.setBackground(getBackground());
+        getContentPane().setLayout(new FlowLayout(0, 1, 5));
+        getContentPane().add(jtabbedpane);
+        jtabbedpane.addTab("Key Buttons", jpanel);
+        gridbagconstraints.insets = new Insets(20, 20, 0, 20);
+        gridbagconstraints.anchor = 11;
+        JPanel jpanel2 = new JPanel();
+        jpanel2.setLayout(new GridBagLayout());
+        jpanel2.setBackground(getBackground());
+        JTextArea jtextarea1 = new JTextArea("The keyboard selector enables you to select the keyboard type that will be emulated.");
+        jtextarea1.setBackground(getBackground());
+        jtextarea1.setEditable(false);
+        jtextarea1.setFont(new Font("Sans Serif", 0, 12));
+        add(jtextarea1, jpanel2, gridbagconstraints, 0, 0, 20, 8);
+        kbSelector = new JComboBox(KEYBOARDS);
+        kbSelector.setToolTipText("Keyboard type selector");
+        kbSelector.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent actionevent) {
+                String s1 = (String)kbSelector.getSelectedItem();
+                for (int j = 0; j < Options.KEYBOARDS.length; j++) {
+                    if (!s1.equals(Options.KEYBOARDS[j]))
+                        continue;
+                    countryKeyBar.populateCountryKeyBar(j);
+                    keyAdapter.setKeyboardType(j);
+                    System.out.println("Keyboard selected: " + j);
+                    try {
+                        savedSettings.setKeyboardNum(j);
+                        saveSerializedObject("prefs.dat", savedSettings);
+                    }
+                    catch (IOException ioexception1) {
+                        System.out.println("Could not save keyboard number.");
+                    }
+                    break;
+                }
+
+            }
+
+        }
+);
+        JPanel jpanel3 = new JPanel();
+        javax.swing.border.TitledBorder titledborder = BorderFactory.createTitledBorder("Keyboard Type");
+        jpanel3.setBorder(titledborder);
+        jpanel3.setBackground(getBackground());
+        jpanel3.add(kbSelector);
+        add(jpanel3, jpanel2, gridbagconstraints, 10, 8, 1, 1);
+        jtabbedpane.addTab("Keyboard Type", jpanel2);
+        JPanel jpanel4 = new JPanel();
+        jpanel4.setLayout(new GridBagLayout());
+        jpanel4.setBackground(getBackground());
+        JTextArea jtextarea2 = new JTextArea("The mouse sync selector enables you to designate the key or mouse button to use\nin order to align the client and server mouse cursors with each other.  When you\nneed to synchronize the cursors, hold down the designated key or mouse button and\nmove the client mouse until the cursors are aligned.  The server's mouse cursor\nwill not move while the designated key or button is held down.\n\nNote that using the mouse sync key or button may have the effect of making it\nimpossible to reach regions of the console with your mouse if a large correction is\nrequired.  If necessary, close the Remote Control window and restart to realign the\ncursors.");
+        jtextarea2.setBackground(getBackground());
+        jtextarea2.setEditable(false);
+        jtextarea2.setFont(new Font("Sans Serif", 0, 12));
+        add(jtextarea2, jpanel4, gridbagconstraints, 0, 0, 20, 8);
+        keyAdapter.setMouseSyncKey(SYNC_KEYS[0]);
+        mouseSyncKey = new JComboBox(SYNC_KEYS);
+        mouseSyncKey.setToolTipText("Mouse synchronization key or button");
+        mouseSyncKey.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent actionevent) {
+                keyAdapter.setMouseSyncKey((String)mouseSyncKey.getSelectedItem());
+                try {
+                    savedSettings.setMouseSyncKeyNum(mouseSyncKey.getSelectedIndex());
+                    saveSerializedObject("prefs.dat", savedSettings);
+                }
+                catch (IOException ioexception1) {
+                    System.out.println("Could not save mouse sync key number.");
+                }
+            }
+
+        }
+);
+        JPanel jpanel5 = new JPanel();
+        javax.swing.border.TitledBorder titledborder1 = BorderFactory.createTitledBorder("Mouse Sync");
+        jpanel5.setBorder(titledborder1);
+        jpanel5.setBackground(getBackground());
+        jpanel5.add(mouseSyncKey);
+        add(jpanel5, jpanel4, gridbagconstraints, 10, 8, 1, 1);
+        jtabbedpane.addTab("Mouse Sync", jpanel4);
+        if (savedSettings.getVersion() == 1) {
+            kbSelector.setSelectedIndex(savedSettings.getKeyboardNum());
+            mouseSyncKey.setSelectedIndex(savedSettings.getMouseSyncKeyNum());
+        }
+        pack();
+    }
+
+    public void actionPerformed(ActionEvent actionevent) {
+        if (actionevent.getSource() == restore)
+            loadButtonArray(defaultKeys);
+        else
+        if (actionevent.getSource() == cancel)
+            try {
+                loadButtonArray((ComboKeyArray)getSerializedObject("keys.dat"));
+            }
+            catch (ClassNotFoundException classnotfoundexception) {
+                System.out.println(classnotfoundexception);
+            }
+            catch (IOException ioexception) {
+                loadButtonArray(defaultKeys);
+            }
+        else
+        if (actionevent.getSource() == save)
+            saveButtonClicked();
+    }
+
+    public void keyPressed(KeyEvent keyevent) {
+        if (keyevent.getKeyCode() != 10)
+            return;
+        if (keyevent.getSource() == restore)
+            loadButtonArray(defaultKeys);
+        else
+        if (keyevent.getSource() == cancel)
+            try {
+                loadButtonArray((ComboKeyArray)getSerializedObject("keys.dat"));
+            }
+            catch (ClassNotFoundException classnotfoundexception) {
+                System.out.println(classnotfoundexception);
+            }
+            catch (IOException ioexception) {
+                loadButtonArray(defaultKeys);
+            }
+        else
+        if (keyevent.getSource() == save)
+            saveButtonClicked();
+    }
+
+    public void keyTyped(KeyEvent keyevent) {
+        keyevent.consume();
+    }
+
+    public void keyReleased(KeyEvent keyevent) {
+    }
+
+    protected void getFocusOnSaveButton() {
+        save.requestFocus();
+    }
+
+    private void add(Component component, JPanel jpanel, GridBagConstraints gridbagconstraints, int i, int j, int k, int l) {
+        gridbagconstraints.gridx = i;
+        gridbagconstraints.gridy = j;
+        gridbagconstraints.gridwidth = k;
+        gridbagconstraints.gridheight = l;
+        jpanel.add(component, gridbagconstraints);
+    }
+
+    private void saveButtonClicked() {
+        ComboKeyArray combokeyarray = new ComboKeyArray();
+        for (int i = 0; i < 12; i++)
+            if (row[i].isValid()) {
+                ArrayList arraylist = new ArrayList();
+                for (int j = 0; j < 4; j++) {
+                    String s = row[i].keyField[j].getText();
+                    if (!s.equals("")) {
+                        KeyData keydata = new KeyData(s, row[i].usageCode[j]);
+                        arraylist.add(keydata);
+                    }
+                }
+
+                combokeyarray.setKeysForButton(i, arraylist);
+            }
+
+        try {
+            saveSerializedObject("keys.dat", combokeyarray);
+        }
+        catch (IOException ioexception) {
+            System.out.println(ioexception);
+        }
+        toolBar.buildCustomizedButtonBar(combokeyarray);
+    }
+
+    private void loadButtonArray(ComboKeyArray combokeyarray) {
+        for (int i = 0; i < 12; i++) {
+            row[i].setValid(false);
+            ArrayList arraylist = combokeyarray.getKeysForButton(i);
+            for (int j = 0; j < 4; j++) {
+                KeyData keydata;
+                if (arraylist != null && j < arraylist.size()) {
+                    keydata = (KeyData)arraylist.get(j);
+                    row[i].setValid(true);
+                } else {
+                    keydata = new KeyData("", 0);
+                }
+                row[i].keyField[j].setText(keydata.getKeyName());
+                row[i].usageCode[j] = keydata.getUsageCode();
+            }
+
+        }
+
+    }
+
+    private Object getSerializedObject(String s) throws ClassNotFoundException, IOException {
+        File file = new File(System.getProperty("user.home"), "IBM");
+        File file1 = new File(file, hostName);
+        File file2 = new File(file1, s);
+        FileInputStream fileinputstream = new FileInputStream(file2);
+        ObjectInputStream objectinputstream = new ObjectInputStream(fileinputstream);
+        Object obj = objectinputstream.readObject();
+        objectinputstream.close();
+        return obj;
+    }
+
+    private void saveSerializedObject(String s, Object obj) throws IOException {
+        File file = new File(System.getProperty("user.home"), "IBM");
+        file.mkdir();
+        File file1 = new File(file, hostName);
+        file1.mkdir();
+        File file2 = new File(file1, s);
+        FileOutputStream fileoutputstream = new FileOutputStream(file2);
+        ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
+        objectoutputstream.writeObject(obj);
+        objectoutputstream.flush();
+        objectoutputstream.close();
+    }
+
+
+
+
+
+
+
+
+}
diff --git a/src/mcsClient/Row.java b/src/mcsClient/Row.java
new file mode 100644 (file)
index 0000000..ef8c78f
--- /dev/null
@@ -0,0 +1,128 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.event.*;
+import javax.swing.*;
+
+// Referenced classes of package mcsClient:
+//            KeyMap, Options
+
+final class Row extends JPanel
+    implements KeyListener, ActionListener {
+
+    protected JTextField keyField[];
+    protected int usageCode[];
+    protected JButton clear;
+    protected Options options;
+    private long pressTime;
+
+    public Row(int i, Options options1) {
+        clear = new JButton("Clear");
+        pressTime = 0L;
+        options = options1;
+        setBackground(options.getBackground());
+        setLayout(new FlowLayout(0, 8, 8));
+        javax.swing.border.TitledBorder titledborder = BorderFactory.createTitledBorder("Button " + i);
+        setBorder(titledborder);
+        setValid(false);
+        keyField = new JTextField[4];
+        usageCode = new int[4];
+        for (int j = 0; j < 4; j++) {
+            keyField[j] = new JTextField("", 8);
+            keyField[j].addKeyListener(this);
+            keyField[j].setFocusTraversalKeysEnabled(false);
+            add(keyField[j]);
+            if (j < 3)
+                add(new JLabel("+"));
+        }
+
+        clear.setFont(new Font("Sans Serif", 0, 11));
+        clear.setToolTipText("Clear all entries for this button.");
+        clear.addKeyListener(this);
+        clear.addActionListener(this);
+        add(clear);
+    }
+
+    public void actionPerformed(ActionEvent actionevent) {
+        clearButtonClicked();
+    }
+
+    public void keyPressed(KeyEvent keyevent) {
+        if (keyevent.getSource() == clear && keyevent.getKeyCode() == 10) {
+            clearButtonClicked();
+            return;
+        }
+        if (keyevent.getKeyCode() == 0)
+            return;
+        if (pressTime == 0L)
+            pressTime = keyevent.getWhen();
+        int i = -1;
+        for (int j = 0; j < 4; j++) {
+            if (keyevent.getSource() != keyField[j])
+                continue;
+            i = j;
+            break;
+        }
+
+        if (keyevent.getKeyCode() == 80 && keyevent.getWhen() - pressTime > 3000L)
+            keyevent = new KeyEvent(this, 1, System.currentTimeMillis(), 0, 154, ' ', 1);
+        KeyEvent _tmp = keyevent;
+        String s = KeyEvent.getKeyText(keyevent.getKeyCode());
+        if (keyevent.getKeyLocation() == 2)
+            s = s + " (Left)";
+        else
+        if (keyevent.getKeyLocation() == 3)
+            s = s + " (Right)";
+        if (s.equals("Delete"))
+            s = "Del";
+        setValid(true);
+        KeyMap keymap = new KeyMap(0);
+        if (!s.equalsIgnoreCase(keyField[i].getText())) {
+            usageCode[i] = keymap.getKey(keyevent);
+            keyField[i].setText("");
+            keyField[i].setText(s);
+        }
+        keyevent.consume();
+    }
+
+    public void keyTyped(KeyEvent keyevent) {
+        keyevent.consume();
+    }
+
+    public void keyReleased(KeyEvent keyevent) {
+        pressTime = 0L;
+        int i = -1;
+        for (int j = 0; j < 4; j++) {
+            if (keyevent.getSource() != keyField[j])
+                continue;
+            i = j;
+            break;
+        }
+
+        if (i < 3)
+            keyField[i + 1].requestFocus();
+        else
+            options.getFocusOnSaveButton();
+        keyevent.consume();
+    }
+
+    public boolean isValid() {
+        return clear.isEnabled();
+    }
+
+    public void setValid(boolean flag) {
+        clear.setEnabled(flag);
+    }
+
+    private void clearButtonClicked() {
+        for (int i = 0; i < 4; i++)
+            keyField[i].setText("");
+
+        setValid(false);
+    }
+}
diff --git a/src/mcsClient/SavedSettings.java b/src/mcsClient/SavedSettings.java
new file mode 100644 (file)
index 0000000..afad63c
--- /dev/null
@@ -0,0 +1,40 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import java.io.Serializable;
+
+public class SavedSettings
+    implements Serializable {
+
+    private static final int VERSION = 1;
+    private int keyboardNum;
+    private int mouseSyncKeyNum;
+
+    public SavedSettings() {
+        keyboardNum = 0;
+        mouseSyncKeyNum = 0;
+    }
+
+    public void setKeyboardNum(int i) {
+        keyboardNum = i;
+    }
+
+    public int getKeyboardNum() {
+        return keyboardNum;
+    }
+
+    public void setMouseSyncKeyNum(int i) {
+        mouseSyncKeyNum = i;
+    }
+
+    public int getMouseSyncKeyNum() {
+        return mouseSyncKeyNum;
+    }
+
+    public int getVersion() {
+        return 1;
+    }
+}
diff --git a/src/mcsClient/SecureDatagramSocket.java b/src/mcsClient/SecureDatagramSocket.java
new file mode 100644 (file)
index 0000000..7e04b1c
--- /dev/null
@@ -0,0 +1,53 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3) fieldsfirst nonlb space 
+
+package mcsClient;
+
+import Acme.Crypto.DesCipher;
+import java.io.IOException;
+import java.net.*;
+
+public final class SecureDatagramSocket extends DatagramSocket {
+
+    private DesCipher cipher1;
+    private DesCipher cipher2;
+    private static final boolean debug = false;
+
+    public SecureDatagramSocket(DesCipher descipher, DesCipher descipher1, int i) throws SocketException {
+        super(i);
+        cipher1 = descipher;
+        cipher2 = descipher1;
+    }
+
+    public SecureDatagramSocket(DesCipher descipher, DesCipher descipher1, int i, InetAddress inetaddress) throws SocketException {
+        super(i, inetaddress);
+        cipher1 = descipher;
+        cipher2 = descipher1;
+    }
+
+    public synchronized void receive(DatagramPacket datagrampacket) throws IOException {
+        super.receive(datagrampacket);
+        decrypt(datagrampacket.getData(), datagrampacket.getLength(), datagrampacket.getOffset());
+    }
+
+    private byte[] decrypt(byte abyte0[]) {
+        for (int i = 0; i < abyte0.length; i += 8) {
+            cipher1.decrypt(abyte0, i, abyte0, i);
+            cipher2.encrypt(abyte0, i, abyte0, i);
+            cipher1.decrypt(abyte0, i, abyte0, i);
+        }
+
+        return abyte0;
+    }
+
+    private byte[] decrypt(byte abyte0[], int i, int j) {
+        for (int k = j; k < i + j; k += 8) {
+            cipher1.decrypt(abyte0, k, abyte0, k);
+            cipher2.encrypt(abyte0, k, abyte0, k);
+            cipher1.decrypt(abyte0, k, abyte0, k);
+        }
+
+        return abyte0;
+    }
+}