diff options
author | DRC <dcommander@users.sourceforge.net> | 2011-10-07 05:38:00 +0000 |
---|---|---|
committer | DRC <dcommander@users.sourceforge.net> | 2011-10-07 05:38:00 +0000 |
commit | c19ab9ec7f3ac4823802388ac953e9494c613575 (patch) | |
tree | 63513ffd7ce0b3ab3de2d9b619cc4e5b892eea31 /java/src/com | |
parent | bba54b0b14fded1d457f426cdc8843a34d6c9dc5 (diff) | |
download | tigervnc-c19ab9ec7f3ac4823802388ac953e9494c613575.tar.gz tigervnc-c19ab9ec7f3ac4823802388ac953e9494c613575.zip |
Move Java source up one level and allow Java viewer to be built as a standalone project (per community request)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4715 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'java/src/com')
100 files changed, 0 insertions, 16398 deletions
diff --git a/java/src/com/jcraft/jzlib/Adler32.java b/java/src/com/jcraft/jzlib/Adler32.java deleted file mode 100644 index d8b6ef86..00000000 --- a/java/src/com/jcraft/jzlib/Adler32.java +++ /dev/null @@ -1,94 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class Adler32{ - - // largest prime smaller than 65536 - static final private int BASE=65521; - // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - static final private int NMAX=5552; - - long adler32(long adler, byte[] buf, int index, int len){ - if(buf == null){ return 1L; } - - long s1=adler&0xffff; - long s2=(adler>>16)&0xffff; - int k; - - while(len > 0) { - k=len<NMAX?len:NMAX; - len-=k; - while(k>=16){ - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - s1+=buf[index++]&0xff; s2+=s1; - k-=16; - } - if(k!=0){ - do{ - s1+=buf[index++]&0xff; s2+=s1; - } - while(--k!=0); - } - s1%=BASE; - s2%=BASE; - } - return (s2<<16)|s1; - } - - /* - private java.util.zip.Adler32 adler=new java.util.zip.Adler32(); - long adler32(long value, byte[] buf, int index, int len){ - if(value==1) {adler.reset();} - if(buf==null) {adler.reset();} - else{adler.update(buf, index, len);} - return adler.getValue(); - } - */ -} diff --git a/java/src/com/jcraft/jzlib/ChangeLog b/java/src/com/jcraft/jzlib/ChangeLog deleted file mode 100644 index c828fae3..00000000 --- a/java/src/com/jcraft/jzlib/ChangeLog +++ /dev/null @@ -1,115 +0,0 @@ -ChangeLog of JZlib -==================================================================== -Last modified: Thu Aug 18 16:16:06 UTC 2005 - - -Changes since version 1.0.6: -- change: memory and performance optimizations in the inflate operation. - Many thanks to Paul Wakefield at platx.org(http://www.platx.org), who - suggested above improvements. -- change: added the nowrap argument to Z{Input,Output}?Stream. - - -Changes since version 1.0.5: -- ZInputStream.read(byte[], int, int) method return sometimes zero - instead of -1 at the end of stream. -- ZOutputStream.end() method should not declare IOException. -- It should be possible to call ZOutputStream.end() method more times - (because you can call close() method and after it end() method in - finally block). -- ZOutputStream.finish() method should not ignore IOException from flush(). -Many thanks to Matej Kraus at seznam.cz , who pointed out above problems. - - -Changes since version 1.0.4: -- a minor bug fix in ZInputStream - - -Changes since version 1.0.3: -- fixed a bug in closing ZOutputStream. - The inflating and deflating processes were not finished successfully. -- added 'finish' and 'end' methods to ZOutputStream.java -- added 'example/test_stream_deflate_inflate.java' - - -Changes since version 1.0.2: -- enabled pure Java implementation of adler32 and - commented out the dependency on J2SE in Adler32.java for J2ME users. - - -Changes since version 1.0.1: -- fixed a bug in deflating some trivial data, for example, - large data chunk filled with zero. -- added 'version' method to JZlib class. - - -Changes since version 1.0.0: -- added ZInputStream and ZOutputStream classes. -- fixed a typo in LICENSE.txt. - - -Changes since version 0.0.9: -- fixed a bug in setting a dictionary in the inflation process. -- The license was changed to a BSD style license. -- Z{Input,Output}Stream classes were deleted. - - -Changes since version 0.0.8: -- fixed a bug in handling a preset dictionary in the inflation process. - - -Changes since version 0.0.7: -- added methods to control the window size (the size of the history - buffer) and to handle the no-wrap option (no zlib header or check), - which is the undocumented functionality of zlib. - - -Changes since version 0.0.6: -- updated InfBlocks.java as zlib did to fix the vulnerability related to - the 'double free'. Of course, JZlib is free from such a vulnerability - like the 'double free', but JZlib had crashed with NullPointerException - by a specially-crafted block of invalid deflated data. - - -Changes since version 0.0.5: -- added 'flush()' method to com.jcraft.jzlib.ZOutputStream. -- fixed to take care when occurring the buffer overflow in - com.jcraft.jzlib.ZOutputStream. -Many thanks to Tim Bendfelt at cs.wisc.edu , who pointed out above problems. - - -Changes since version 0.0.4: -............................ -- fixed a bug in Adler32 class. -- fixed a bug in ZInputStream class -- modified ZInputStream to be extended from InputStream - instead of FileInputStream. -- modified ZOutputStream to be extended from OutputStream - instead of FileOutputStream. -- modified ZStream to be changeable wbits. Give wbits value to - the method 'deflateInit' of ZStream. -Many thanks to Bryan Keller<keller@neomar.com>, who reported bugs -and made suggestions. - - -Changes since version 0.0.3: -............................ -- fixed a bug in the compression level 0. -- modified to be compatible with JIKES's bug. -- added Z[Input,Output]Stream written by Lapo Luchini<lapo@lapo.it>. - - -Changes since version 0.0.2: -............................ -- fixed a critical bug, which had arisen in the deflating operation with - NO_FLUSH and DEFAULT_COMPRESSION mode. - Many thanks to Bryan Keller(keller@neomar.com), who reported this glitch. - - -Changes since version 0.0.1: -............................ -- fixed the bad compression ratio problem, which is reported from - Martin Smith(martin@spamcop.net). The compression ratio was not so good - compared with the compression ration of zlib. Now, this problem has been - fixed and, I hope, that deflated files by JZlib and zlib are completely - same bit by bit. diff --git a/java/src/com/jcraft/jzlib/Deflate.java b/java/src/com/jcraft/jzlib/Deflate.java deleted file mode 100644 index 99788020..00000000 --- a/java/src/com/jcraft/jzlib/Deflate.java +++ /dev/null @@ -1,1623 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -public -final class Deflate{ - - static final private int MAX_MEM_LEVEL=9; - - static final private int Z_DEFAULT_COMPRESSION=-1; - - static final private int MAX_WBITS=15; // 32K LZ77 window - static final private int DEF_MEM_LEVEL=8; - - static class Config{ - int good_length; // reduce lazy search above this match length - int max_lazy; // do not perform lazy search above this match length - int nice_length; // quit search above this match length - int max_chain; - int func; - Config(int good_length, int max_lazy, - int nice_length, int max_chain, int func){ - this.good_length=good_length; - this.max_lazy=max_lazy; - this.nice_length=nice_length; - this.max_chain=max_chain; - this.func=func; - } - } - - static final private int STORED=0; - static final private int FAST=1; - static final private int SLOW=2; - static final private Config[] config_table; - static{ - config_table=new Config[10]; - // good lazy nice chain - config_table[0]=new Config(0, 0, 0, 0, STORED); - config_table[1]=new Config(4, 4, 8, 4, FAST); - config_table[2]=new Config(4, 5, 16, 8, FAST); - config_table[3]=new Config(4, 6, 32, 32, FAST); - - config_table[4]=new Config(4, 4, 16, 16, SLOW); - config_table[5]=new Config(8, 16, 32, 32, SLOW); - config_table[6]=new Config(8, 16, 128, 128, SLOW); - config_table[7]=new Config(8, 32, 128, 256, SLOW); - config_table[8]=new Config(32, 128, 258, 1024, SLOW); - config_table[9]=new Config(32, 258, 258, 4096, SLOW); - } - - static final private String[] z_errmsg = { - "need dictionary", // Z_NEED_DICT 2 - "stream end", // Z_STREAM_END 1 - "", // Z_OK 0 - "file error", // Z_ERRNO (-1) - "stream error", // Z_STREAM_ERROR (-2) - "data error", // Z_DATA_ERROR (-3) - "insufficient memory", // Z_MEM_ERROR (-4) - "buffer error", // Z_BUF_ERROR (-5) - "incompatible version",// Z_VERSION_ERROR (-6) - "" - }; - - // block not completed, need more input or more output - static final private int NeedMore=0; - - // block flush performed - static final private int BlockDone=1; - - // finish started, need only more output at next deflate - static final private int FinishStarted=2; - - // finish done, accept no more input or output - static final private int FinishDone=3; - - // preset dictionary flag in zlib header - static final private int PRESET_DICT=0x20; - - static final private int Z_FILTERED=1; - static final private int Z_HUFFMAN_ONLY=2; - static final private int Z_DEFAULT_STRATEGY=0; - - static final private int Z_NO_FLUSH=0; - static final private int Z_PARTIAL_FLUSH=1; - static final private int Z_SYNC_FLUSH=2; - static final private int Z_FULL_FLUSH=3; - static final private int Z_FINISH=4; - - static final private int Z_OK=0; - static final private int Z_STREAM_END=1; - static final private int Z_NEED_DICT=2; - static final private int Z_ERRNO=-1; - static final private int Z_STREAM_ERROR=-2; - static final private int Z_DATA_ERROR=-3; - static final private int Z_MEM_ERROR=-4; - static final private int Z_BUF_ERROR=-5; - static final private int Z_VERSION_ERROR=-6; - - static final private int INIT_STATE=42; - static final private int BUSY_STATE=113; - static final private int FINISH_STATE=666; - - // The deflate compression method - static final private int Z_DEFLATED=8; - - static final private int STORED_BLOCK=0; - static final private int STATIC_TREES=1; - static final private int DYN_TREES=2; - - // The three kinds of block type - static final private int Z_BINARY=0; - static final private int Z_ASCII=1; - static final private int Z_UNKNOWN=2; - - static final private int Buf_size=8*2; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - static final private int REP_3_6=16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - static final private int REPZ_3_10=17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - static final private int REPZ_11_138=18; - - static final private int MIN_MATCH=3; - static final private int MAX_MATCH=258; - static final private int MIN_LOOKAHEAD=(MAX_MATCH+MIN_MATCH+1); - - static final private int MAX_BITS=15; - static final private int D_CODES=30; - static final private int BL_CODES=19; - static final private int LENGTH_CODES=29; - static final private int LITERALS=256; - static final private int L_CODES=(LITERALS+1+LENGTH_CODES); - static final private int HEAP_SIZE=(2*L_CODES+1); - - static final private int END_BLOCK=256; - - ZStream strm; // pointer back to this zlib stream - int status; // as the name implies - byte[] pending_buf; // output still pending - int pending_buf_size; // size of pending_buf - int pending_out; // next pending byte to output to the stream - int pending; // nb of bytes in the pending buffer - int noheader; // suppress zlib header and adler32 - byte data_type; // UNKNOWN, BINARY or ASCII - byte method; // STORED (for zip only) or DEFLATED - int last_flush; // value of flush param for previous deflate call - - int w_size; // LZ77 window size (32K by default) - int w_bits; // log2(w_size) (8..16) - int w_mask; // w_size - 1 - - byte[] window; - // Sliding window. Input bytes are read into the second half of the window, - // and move to the first half later to keep a dictionary of at least wSize - // bytes. With this organization, matches are limited to a distance of - // wSize-MAX_MATCH bytes, but this ensures that IO is always - // performed with a length multiple of the block size. Also, it limits - // the window size to 64K, which is quite useful on MSDOS. - // To do: use the user input buffer as sliding window. - - int window_size; - // Actual size of window: 2*wSize, except when the user input buffer - // is directly used as sliding window. - - short[] prev; - // Link to older string with same hash index. To limit the size of this - // array to 64K, this link is maintained only for the last 32K strings. - // An index in this array is thus a window index modulo 32K. - - short[] head; // Heads of the hash chains or NIL. - - int ins_h; // hash index of string to be inserted - int hash_size; // number of elements in hash table - int hash_bits; // log2(hash_size) - int hash_mask; // hash_size-1 - - // Number of bits by which ins_h must be shifted at each input - // step. It must be such that after MIN_MATCH steps, the oldest - // byte no longer takes part in the hash key, that is: - // hash_shift * MIN_MATCH >= hash_bits - int hash_shift; - - // Window position at the beginning of the current output block. Gets - // negative when the window is moved backwards. - - int block_start; - - int match_length; // length of best match - int prev_match; // previous match - int match_available; // set if previous match exists - int strstart; // start of string to insert - int match_start; // start of matching string - int lookahead; // number of valid bytes ahead in window - - // Length of the best match at previous step. Matches not greater than this - // are discarded. This is used in the lazy match evaluation. - int prev_length; - - // To speed up deflation, hash chains are never searched beyond this - // length. A higher limit improves compression ratio but degrades the speed. - int max_chain_length; - - // Attempt to find a better match only when the current match is strictly - // smaller than this value. This mechanism is used only for compression - // levels >= 4. - int max_lazy_match; - - // Insert new strings in the hash table only if the match length is not - // greater than this length. This saves time but degrades compression. - // max_insert_length is used only for compression levels <= 3. - - int level; // compression level (1..9) - int strategy; // favor or force Huffman coding - - // Use a faster search when the previous match is longer than this - int good_match; - - // Stop searching when current match exceeds this - int nice_match; - - short[] dyn_ltree; // literal and length tree - short[] dyn_dtree; // distance tree - short[] bl_tree; // Huffman tree for bit lengths - - Tree l_desc=new Tree(); // desc for literal tree - Tree d_desc=new Tree(); // desc for distance tree - Tree bl_desc=new Tree(); // desc for bit length tree - - // number of codes at each bit length for an optimal tree - short[] bl_count=new short[MAX_BITS+1]; - - // heap used to build the Huffman trees - int[] heap=new int[2*L_CODES+1]; - - int heap_len; // number of elements in the heap - int heap_max; // element of largest frequency - // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - // The same heap array is used to build all trees. - - // Depth of each subtree used as tie breaker for trees of equal frequency - byte[] depth=new byte[2*L_CODES+1]; - - int l_buf; // index for literals or lengths */ - - // Size of match buffer for literals/lengths. There are 4 reasons for - // limiting lit_bufsize to 64K: - // - frequencies can be kept in 16 bit counters - // - if compression is not successful for the first block, all input - // data is still in the window so we can still emit a stored block even - // when input comes from standard input. (This can also be done for - // all blocks if lit_bufsize is not greater than 32K.) - // - if compression is not successful for a file smaller than 64K, we can - // even emit a stored file instead of a stored block (saving 5 bytes). - // This is applicable only for zip (not gzip or zlib). - // - creating new Huffman trees less frequently may not provide fast - // adaptation to changes in the input data statistics. (Take for - // example a binary file with poorly compressible code followed by - // a highly compressible string table.) Smaller buffer sizes give - // fast adaptation but have of course the overhead of transmitting - // trees more frequently. - // - I can't count above 4 - int lit_bufsize; - - int last_lit; // running index in l_buf - - // Buffer for distances. To simplify the code, d_buf and l_buf have - // the same number of elements. To use different lengths, an extra flag - // array would be necessary. - - int d_buf; // index of pendig_buf - - int opt_len; // bit length of current block with optimal trees - int static_len; // bit length of current block with static trees - int matches; // number of string matches in current block - int last_eob_len; // bit length of EOB code for last block - - // Output buffer. bits are inserted starting at the bottom (least - // significant bits). - short bi_buf; - - // Number of valid bits in bi_buf. All bits above the last valid bit - // are always zero. - int bi_valid; - - Deflate(){ - dyn_ltree=new short[HEAP_SIZE*2]; - dyn_dtree=new short[(2*D_CODES+1)*2]; // distance tree - bl_tree=new short[(2*BL_CODES+1)*2]; // Huffman tree for bit lengths - } - - void lm_init() { - window_size=2*w_size; - - head[hash_size-1]=0; - for(int i=0; i<hash_size-1; i++){ - head[i]=0; - } - - // Set the default configuration parameters: - max_lazy_match = Deflate.config_table[level].max_lazy; - good_match = Deflate.config_table[level].good_length; - nice_match = Deflate.config_table[level].nice_length; - max_chain_length = Deflate.config_table[level].max_chain; - - strstart = 0; - block_start = 0; - lookahead = 0; - match_length = prev_length = MIN_MATCH-1; - match_available = 0; - ins_h = 0; - } - - // Initialize the tree data structures for a new zlib stream. - void tr_init(){ - - l_desc.dyn_tree = dyn_ltree; - l_desc.stat_desc = StaticTree.static_l_desc; - - d_desc.dyn_tree = dyn_dtree; - d_desc.stat_desc = StaticTree.static_d_desc; - - bl_desc.dyn_tree = bl_tree; - bl_desc.stat_desc = StaticTree.static_bl_desc; - - bi_buf = 0; - bi_valid = 0; - last_eob_len = 8; // enough lookahead for inflate - - // Initialize the first block of the first file: - init_block(); - } - - void init_block(){ - // Initialize the trees. - for(int i = 0; i < L_CODES; i++) dyn_ltree[i*2] = 0; - for(int i= 0; i < D_CODES; i++) dyn_dtree[i*2] = 0; - for(int i= 0; i < BL_CODES; i++) bl_tree[i*2] = 0; - - dyn_ltree[END_BLOCK*2] = 1; - opt_len = static_len = 0; - last_lit = matches = 0; - } - - // Restore the heap property by moving down the tree starting at node k, - // exchanging a node with the smallest of its two sons if necessary, stopping - // when the heap property is re-established (each father smaller than its - // two sons). - void pqdownheap(short[] tree, // the tree to restore - int k // node to move down - ){ - int v = heap[k]; - int j = k << 1; // left son of k - while (j <= heap_len) { - // Set j to the smallest of the two sons: - if (j < heap_len && - smaller(tree, heap[j+1], heap[j], depth)){ - j++; - } - // Exit if v is smaller than both sons - if(smaller(tree, v, heap[j], depth)) break; - - // Exchange v with the smallest son - heap[k]=heap[j]; k = j; - // And continue down the tree, setting j to the left son of k - j <<= 1; - } - heap[k] = v; - } - - static boolean smaller(short[] tree, int n, int m, byte[] depth){ - short tn2=tree[n*2]; - short tm2=tree[m*2]; - return (tn2<tm2 || - (tn2==tm2 && depth[n] <= depth[m])); - } - - // Scan a literal or distance tree to determine the frequencies of the codes - // in the bit length tree. - void scan_tree (short[] tree,// the tree to be scanned - int max_code // and its largest code of non zero frequency - ){ - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0*2+1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0){ max_count = 138; min_count = 3; } - tree[(max_code+1)*2+1] = (short)0xffff; // guard - - for(n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[(n+1)*2+1]; - if(++count < max_count && curlen == nextlen) { - continue; - } - else if(count < min_count) { - bl_tree[curlen*2] += count; - } - else if(curlen != 0) { - if(curlen != prevlen) bl_tree[curlen*2]++; - bl_tree[REP_3_6*2]++; - } - else if(count <= 10) { - bl_tree[REPZ_3_10*2]++; - } - else{ - bl_tree[REPZ_11_138*2]++; - } - count = 0; prevlen = curlen; - if(nextlen == 0) { - max_count = 138; min_count = 3; - } - else if(curlen == nextlen) { - max_count = 6; min_count = 3; - } - else{ - max_count = 7; min_count = 4; - } - } - } - - // Construct the Huffman tree for the bit lengths and return the index in - // bl_order of the last bit length code to send. - int build_bl_tree(){ - int max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - scan_tree(dyn_ltree, l_desc.max_code); - scan_tree(dyn_dtree, d_desc.max_code); - - // Build the bit length tree: - bl_desc.build_tree(this); - // opt_len now includes the length of the tree representations, except - // the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - - // Determine the number of bit length codes to send. The pkzip format - // requires that at least 4 bit length codes be sent. (appnote.txt says - // 3 but the actual value used is 4.) - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (bl_tree[Tree.bl_order[max_blindex]*2+1] != 0) break; - } - // Update opt_len to include the bit length tree and counts - opt_len += 3*(max_blindex+1) + 5+5+4; - - return max_blindex; - } - - - // Send the header for a block using dynamic Huffman trees: the counts, the - // lengths of the bit length codes, the literal tree and the distance tree. - // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - void send_all_trees(int lcodes, int dcodes, int blcodes){ - int rank; // index in bl_order - - send_bits(lcodes-257, 5); // not +255 as stated in appnote.txt - send_bits(dcodes-1, 5); - send_bits(blcodes-4, 4); // not -3 as stated in appnote.txt - for (rank = 0; rank < blcodes; rank++) { - send_bits(bl_tree[Tree.bl_order[rank]*2+1], 3); - } - send_tree(dyn_ltree, lcodes-1); // literal tree - send_tree(dyn_dtree, dcodes-1); // distance tree - } - - // Send a literal or distance tree in compressed form, using the codes in - // bl_tree. - void send_tree (short[] tree,// the tree to be sent - int max_code // and its largest code of non zero frequency - ){ - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0*2+1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0){ max_count = 138; min_count = 3; } - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[(n+1)*2+1]; - if(++count < max_count && curlen == nextlen) { - continue; - } - else if(count < min_count) { - do { send_code(curlen, bl_tree); } while (--count != 0); - } - else if(curlen != 0){ - if(curlen != prevlen){ - send_code(curlen, bl_tree); count--; - } - send_code(REP_3_6, bl_tree); - send_bits(count-3, 2); - } - else if(count <= 10){ - send_code(REPZ_3_10, bl_tree); - send_bits(count-3, 3); - } - else{ - send_code(REPZ_11_138, bl_tree); - send_bits(count-11, 7); - } - count = 0; prevlen = curlen; - if(nextlen == 0){ - max_count = 138; min_count = 3; - } - else if(curlen == nextlen){ - max_count = 6; min_count = 3; - } - else{ - max_count = 7; min_count = 4; - } - } - } - - // Output a byte on the stream. - // IN assertion: there is enough room in pending_buf. - final void put_byte(byte[] p, int start, int len){ - System.arraycopy(p, start, pending_buf, pending, len); - pending+=len; - } - - final void put_byte(byte c){ - pending_buf[pending++]=c; - } - final void put_short(int w) { - put_byte((byte)(w/*&0xff*/)); - put_byte((byte)(w>>>8)); - } - final void putShortMSB(int b){ - put_byte((byte)(b>>8)); - put_byte((byte)(b/*&0xff*/)); - } - - final void send_code(int c, short[] tree){ - int c2=c*2; - send_bits((tree[c2]&0xffff), (tree[c2+1]&0xffff)); - } - - void send_bits(int value, int length){ - int len = length; - if (bi_valid > (int)Buf_size - len) { - int val = value; -// bi_buf |= (val << bi_valid); - bi_buf |= ((val << bi_valid)&0xffff); - put_short(bi_buf); - bi_buf = (short)(val >>> (Buf_size - bi_valid)); - bi_valid += len - Buf_size; - } else { -// bi_buf |= (value) << bi_valid; - bi_buf |= (((value) << bi_valid)&0xffff); - bi_valid += len; - } - } - - // Send one empty static block to give enough lookahead for inflate. - // This takes 10 bits, of which 7 may remain in the bit buffer. - // The current inflate code requires 9 bits of lookahead. If the - // last two codes for the previous block (real code plus EOB) were coded - // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - // the last real code. In this case we send two empty static blocks instead - // of one. (There are no problems if the previous block is stored or fixed.) - // To simplify the code, we assume the worst case of last real code encoded - // on one bit only. - void _tr_align(){ - send_bits(STATIC_TREES<<1, 3); - send_code(END_BLOCK, StaticTree.static_ltree); - - bi_flush(); - - // Of the 10 bits for the empty block, we have already sent - // (10 - bi_valid) bits. The lookahead for the last real code (before - // the EOB of the previous block) was thus at least one plus the length - // of the EOB plus what we have just sent of the empty static block. - if (1 + last_eob_len + 10 - bi_valid < 9) { - send_bits(STATIC_TREES<<1, 3); - send_code(END_BLOCK, StaticTree.static_ltree); - bi_flush(); - } - last_eob_len = 7; - } - - - // Save the match info and tally the frequency counts. Return true if - // the current block must be flushed. - boolean _tr_tally (int dist, // distance of matched string - int lc // match length-MIN_MATCH or unmatched char (if dist==0) - ){ - - pending_buf[d_buf+last_lit*2] = (byte)(dist>>>8); - pending_buf[d_buf+last_lit*2+1] = (byte)dist; - - pending_buf[l_buf+last_lit] = (byte)lc; last_lit++; - - if (dist == 0) { - // lc is the unmatched char - dyn_ltree[lc*2]++; - } - else { - matches++; - // Here, lc is the match length - MIN_MATCH - dist--; // dist = match distance - 1 - dyn_ltree[(Tree._length_code[lc]+LITERALS+1)*2]++; - dyn_dtree[Tree.d_code(dist)*2]++; - } - - if ((last_lit & 0x1fff) == 0 && level > 2) { - // Compute an upper bound for the compressed length - int out_length = last_lit*8; - int in_length = strstart - block_start; - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (int)dyn_dtree[dcode*2] * - (5L+Tree.extra_dbits[dcode]); - } - out_length >>>= 3; - if ((matches < (last_lit/2)) && out_length < in_length/2) return true; - } - - return (last_lit == lit_bufsize-1); - // We avoid equality with lit_bufsize because of wraparound at 64K - // on 16 bit machines and because stored blocks are restricted to - // 64K-1 bytes. - } - - // Send the block data compressed using the given Huffman trees - void compress_block(short[] ltree, short[] dtree){ - int dist; // distance of matched string - int lc; // match length or unmatched char (if dist == 0) - int lx = 0; // running index in l_buf - int code; // the code to send - int extra; // number of extra bits to send - - if (last_lit != 0){ - do{ - dist=((pending_buf[d_buf+lx*2]<<8)&0xff00)| - (pending_buf[d_buf+lx*2+1]&0xff); - lc=(pending_buf[l_buf+lx])&0xff; lx++; - - if(dist == 0){ - send_code(lc, ltree); // send a literal byte - } - else{ - // Here, lc is the match length - MIN_MATCH - code = Tree._length_code[lc]; - - send_code(code+LITERALS+1, ltree); // send the length code - extra = Tree.extra_lbits[code]; - if(extra != 0){ - lc -= Tree.base_length[code]; - send_bits(lc, extra); // send the extra length bits - } - dist--; // dist is now the match distance - 1 - code = Tree.d_code(dist); - - send_code(code, dtree); // send the distance code - extra = Tree.extra_dbits[code]; - if (extra != 0) { - dist -= Tree.base_dist[code]; - send_bits(dist, extra); // send the extra distance bits - } - } // literal or match pair ? - - // Check that the overlay between pending_buf and d_buf+l_buf is ok: - } - while (lx < last_lit); - } - - send_code(END_BLOCK, ltree); - last_eob_len = ltree[END_BLOCK*2+1]; - } - - // Set the data type to ASCII or BINARY, using a crude approximation: - // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. - // IN assertion: the fields freq of dyn_ltree are set and the total of all - // frequencies does not exceed 64K (to fit in an int on 16 bit machines). - void set_data_type(){ - int n = 0; - int ascii_freq = 0; - int bin_freq = 0; - while(n<7){ bin_freq += dyn_ltree[n*2]; n++;} - while(n<128){ ascii_freq += dyn_ltree[n*2]; n++;} - while(n<LITERALS){ bin_freq += dyn_ltree[n*2]; n++;} - data_type=(byte)(bin_freq > (ascii_freq >>> 2) ? Z_BINARY : Z_ASCII); - } - - // Flush the bit buffer, keeping at most 7 bits in it. - void bi_flush(){ - if (bi_valid == 16) { - put_short(bi_buf); - bi_buf=0; - bi_valid=0; - } - else if (bi_valid >= 8) { - put_byte((byte)bi_buf); - bi_buf>>>=8; - bi_valid-=8; - } - } - - // Flush the bit buffer and align the output on a byte boundary - void bi_windup(){ - if (bi_valid > 8) { - put_short(bi_buf); - } else if (bi_valid > 0) { - put_byte((byte)bi_buf); - } - bi_buf = 0; - bi_valid = 0; - } - - // Copy a stored block, storing first the length and its - // one's complement if requested. - void copy_block(int buf, // the input data - int len, // its length - boolean header // true if block header must be written - ){ - int index=0; - bi_windup(); // align on byte boundary - last_eob_len = 8; // enough lookahead for inflate - - if (header) { - put_short((short)len); - put_short((short)~len); - } - - // while(len--!=0) { - // put_byte(window[buf+index]); - // index++; - // } - put_byte(window, buf, len); - } - - void flush_block_only(boolean eof){ - _tr_flush_block(block_start>=0 ? block_start : -1, - strstart-block_start, - eof); - block_start=strstart; - strm.flush_pending(); - } - - // Copy without compression as much as possible from the input stream, return - // the current block state. - // This function does not insert new strings in the dictionary since - // uncompressible data is probably not useful. This function is used - // only for the level=0 compression option. - // NOTE: this function should be optimized to avoid extra copying from - // window to pending_buf. - int deflate_stored(int flush){ - // Stored blocks are limited to 0xffff bytes, pending_buf is limited - // to pending_buf_size, and each stored block has a 5 byte header: - - int max_block_size = 0xffff; - int max_start; - - if(max_block_size > pending_buf_size - 5) { - max_block_size = pending_buf_size - 5; - } - - // Copy as much as possible from input to output: - while(true){ - // Fill the window as much as possible: - if(lookahead<=1){ - fill_window(); - if(lookahead==0 && flush==Z_NO_FLUSH) return NeedMore; - if(lookahead==0) break; // flush the current block - } - - strstart+=lookahead; - lookahead=0; - - // Emit a stored block if pending_buf will be full: - max_start=block_start+max_block_size; - if(strstart==0|| strstart>=max_start) { - // strstart == 0 is possible when wraparound on 16-bit machine - lookahead = (int)(strstart-max_start); - strstart = (int)max_start; - - flush_block_only(false); - if(strm.avail_out==0) return NeedMore; - - } - - // Flush if we may have to slide, otherwise block_start may become - // negative and the data will be gone: - if(strstart-block_start >= w_size-MIN_LOOKAHEAD) { - flush_block_only(false); - if(strm.avail_out==0) return NeedMore; - } - } - - flush_block_only(flush == Z_FINISH); - if(strm.avail_out==0) - return (flush == Z_FINISH) ? FinishStarted : NeedMore; - - return flush == Z_FINISH ? FinishDone : BlockDone; - } - - // Send a stored block - void _tr_stored_block(int buf, // input block - int stored_len, // length of input block - boolean eof // true if this is the last block for a file - ){ - send_bits((STORED_BLOCK<<1)+(eof?1:0), 3); // send block type - copy_block(buf, stored_len, true); // with header - } - - // Determine the best encoding for the current block: dynamic trees, static - // trees or store, and output the encoded block to the zip file. - void _tr_flush_block(int buf, // input block, or NULL if too old - int stored_len, // length of input block - boolean eof // true if this is the last block for a file - ) { - int opt_lenb, static_lenb;// opt_len and static_len in bytes - int max_blindex = 0; // index of last bit length code of non zero freq - - // Build the Huffman trees unless a stored block is forced - if(level > 0) { - // Check if the file is ascii or binary - if(data_type == Z_UNKNOWN) set_data_type(); - - // Construct the literal and distance trees - l_desc.build_tree(this); - - d_desc.build_tree(this); - - // At this point, opt_len and static_len are the total bit lengths of - // the compressed block data, excluding the tree representations. - - // Build the bit length tree for the above two trees, and get the index - // in bl_order of the last bit length code to send. - max_blindex=build_bl_tree(); - - // Determine the best encoding. Compute first the block length in bytes - opt_lenb=(opt_len+3+7)>>>3; - static_lenb=(static_len+3+7)>>>3; - - if(static_lenb<=opt_lenb) opt_lenb=static_lenb; - } - else { - opt_lenb=static_lenb=stored_len+5; // force a stored block - } - - if(stored_len+4<=opt_lenb && buf != -1){ - // 4: two words for the lengths - // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - // Otherwise we can't have processed more than WSIZE input bytes since - // the last block flush, because compression would have been - // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - // transform a block into a stored block. - _tr_stored_block(buf, stored_len, eof); - } - else if(static_lenb == opt_lenb){ - send_bits((STATIC_TREES<<1)+(eof?1:0), 3); - compress_block(StaticTree.static_ltree, StaticTree.static_dtree); - } - else{ - send_bits((DYN_TREES<<1)+(eof?1:0), 3); - send_all_trees(l_desc.max_code+1, d_desc.max_code+1, max_blindex+1); - compress_block(dyn_ltree, dyn_dtree); - } - - // The above check is made mod 2^32, for files larger than 512 MB - // and uLong implemented on 32 bits. - - init_block(); - - if(eof){ - bi_windup(); - } - } - - // Fill the window when the lookahead becomes insufficient. - // Updates strstart and lookahead. - // - // IN assertion: lookahead < MIN_LOOKAHEAD - // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - // At least one byte has been read, or avail_in == 0; reads are - // performed for at least two bytes (required for the zip translate_eol - // option -- not supported here). - void fill_window(){ - int n, m; - int p; - int more; // Amount of free space at the end of the window. - - do{ - more = (window_size-lookahead-strstart); - - // Deal with !@#$% 64K limit: - if(more==0 && strstart==0 && lookahead==0){ - more = w_size; - } - else if(more==-1) { - // Very unlikely, but possible on 16 bit machine if strstart == 0 - // and lookahead == 1 (input done one byte at time) - more--; - - // If the window is almost full and there is insufficient lookahead, - // move the upper half to the lower one to make room in the upper half. - } - else if(strstart >= w_size+ w_size-MIN_LOOKAHEAD) { - System.arraycopy(window, w_size, window, 0, w_size); - match_start-=w_size; - strstart-=w_size; // we now have strstart >= MAX_DIST - block_start-=w_size; - - // Slide the hash table (could be avoided with 32 bit values - // at the expense of memory usage). We slide even when level == 0 - // to keep the hash table consistent if we switch back to level > 0 - // later. (Using level 0 permanently is not an optimal usage of - // zlib, so we don't care about this pathological case.) - - n = hash_size; - p=n; - do { - m = (head[--p]&0xffff); - head[p]=(m>=w_size ? (short)(m-w_size) : 0); - } - while (--n != 0); - - n = w_size; - p = n; - do { - m = (prev[--p]&0xffff); - prev[p] = (m >= w_size ? (short)(m-w_size) : 0); - // If n is not on any hash chain, prev[n] is garbage but - // its value will never be used. - } - while (--n!=0); - more += w_size; - } - - if (strm.avail_in == 0) return; - - // If there was no sliding: - // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - // more == window_size - lookahead - strstart - // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - // => more >= window_size - 2*WSIZE + 2 - // In the BIG_MEM or MMAP case (not yet supported), - // window_size == input_size + MIN_LOOKAHEAD && - // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - // Otherwise, window_size == 2*WSIZE so more >= 2. - // If there was sliding, more >= WSIZE. So in all cases, more >= 2. - - n = strm.read_buf(window, strstart + lookahead, more); - lookahead += n; - - // Initialize the hash value now that we have some input: - if(lookahead >= MIN_MATCH) { - ins_h = window[strstart]&0xff; - ins_h=(((ins_h)<<hash_shift)^(window[strstart+1]&0xff))&hash_mask; - } - // If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - // but this is not important since only literal bytes will be emitted. - } - while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0); - } - - // Compress as much as possible from the input stream, return the current - // block state. - // This function does not perform lazy evaluation of matches and inserts - // new strings in the dictionary only for unmatched strings or for short - // matches. It is used only for the fast compression options. - int deflate_fast(int flush){ -// short hash_head = 0; // head of the hash chain - int hash_head = 0; // head of the hash chain - boolean bflush; // set if current block must be flushed - - while(true){ - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - if(lookahead < MIN_LOOKAHEAD){ - fill_window(); - if(lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH){ - return NeedMore; - } - if(lookahead == 0) break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - if(lookahead >= MIN_MATCH){ - ins_h=(((ins_h)<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff))&hash_mask; - -// prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head=(head[ins_h]&0xffff); - prev[strstart&w_mask]=head[ins_h]; - head[ins_h]=(short)strstart; - } - - // Find the longest match, discarding those <= prev_length. - // At this point we have always match_length < MIN_MATCH - - if(hash_head!=0L && - ((strstart-hash_head)&0xffff) <= w_size-MIN_LOOKAHEAD - ){ - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - if(strategy != Z_HUFFMAN_ONLY){ - match_length=longest_match (hash_head); - } - // longest_match() sets match_start - } - if(match_length>=MIN_MATCH){ - // check_match(strstart, match_start, match_length); - - bflush=_tr_tally(strstart-match_start, match_length-MIN_MATCH); - - lookahead -= match_length; - - // Insert new strings in the hash table only if the match length - // is not too large. This saves time but degrades compression. - if(match_length <= max_lazy_match && - lookahead >= MIN_MATCH) { - match_length--; // string at strstart already in hash table - do{ - strstart++; - - ins_h=((ins_h<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff))&hash_mask; -// prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head=(head[ins_h]&0xffff); - prev[strstart&w_mask]=head[ins_h]; - head[ins_h]=(short)strstart; - - // strstart never exceeds WSIZE-MAX_MATCH, so there are - // always MIN_MATCH bytes ahead. - } - while (--match_length != 0); - strstart++; - } - else{ - strstart += match_length; - match_length = 0; - ins_h = window[strstart]&0xff; - - ins_h=(((ins_h)<<hash_shift)^(window[strstart+1]&0xff))&hash_mask; - // If lookahead < MIN_MATCH, ins_h is garbage, but it does not - // matter since it will be recomputed at next deflate call. - } - } - else { - // No match, output a literal byte - - bflush=_tr_tally(0, window[strstart]&0xff); - lookahead--; - strstart++; - } - if (bflush){ - - flush_block_only(false); - if(strm.avail_out==0) return NeedMore; - } - } - - flush_block_only(flush == Z_FINISH); - if(strm.avail_out==0){ - if(flush == Z_FINISH) return FinishStarted; - else return NeedMore; - } - return flush==Z_FINISH ? FinishDone : BlockDone; - } - - // Same as above, but achieves better compression. We use a lazy - // evaluation for matches: a match is finally adopted only if there is - // no better match at the next window position. - int deflate_slow(int flush){ -// short hash_head = 0; // head of hash chain - int hash_head = 0; // head of hash chain - boolean bflush; // set if current block must be flushed - - // Process the input block. - while(true){ - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - - if (lookahead < MIN_LOOKAHEAD) { - fill_window(); - if(lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return NeedMore; - } - if(lookahead == 0) break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - - if(lookahead >= MIN_MATCH) { - ins_h=(((ins_h)<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff)) & hash_mask; -// prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head=(head[ins_h]&0xffff); - prev[strstart&w_mask]=head[ins_h]; - head[ins_h]=(short)strstart; - } - - // Find the longest match, discarding those <= prev_length. - prev_length = match_length; prev_match = match_start; - match_length = MIN_MATCH-1; - - if (hash_head != 0 && prev_length < max_lazy_match && - ((strstart-hash_head)&0xffff) <= w_size-MIN_LOOKAHEAD - ){ - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - - if(strategy != Z_HUFFMAN_ONLY) { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - - if (match_length <= 5 && (strategy == Z_FILTERED || - (match_length == MIN_MATCH && - strstart - match_start > 4096))) { - - // If prev_match is also MIN_MATCH, match_start is garbage - // but we will ignore the current match anyway. - match_length = MIN_MATCH-1; - } - } - - // If there was a match at the previous step and the current - // match is not better, output the previous match: - if(prev_length >= MIN_MATCH && match_length <= prev_length) { - int max_insert = strstart + lookahead - MIN_MATCH; - // Do not insert strings in hash table beyond this. - - // check_match(strstart-1, prev_match, prev_length); - - bflush=_tr_tally(strstart-1-prev_match, prev_length - MIN_MATCH); - - // Insert in hash table all strings up to the end of the match. - // strstart-1 and strstart are already inserted. If there is not - // enough lookahead, the last two strings are not inserted in - // the hash table. - lookahead -= prev_length-1; - prev_length -= 2; - do{ - if(++strstart <= max_insert) { - ins_h=(((ins_h)<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff))&hash_mask; - //prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head=(head[ins_h]&0xffff); - prev[strstart&w_mask]=head[ins_h]; - head[ins_h]=(short)strstart; - } - } - while(--prev_length != 0); - match_available = 0; - match_length = MIN_MATCH-1; - strstart++; - - if (bflush){ - flush_block_only(false); - if(strm.avail_out==0) return NeedMore; - } - } else if (match_available!=0) { - - // If there was no match at the previous position, output a - // single literal. If there was a match but the current match - // is longer, truncate the previous match to a single literal. - - bflush=_tr_tally(0, window[strstart-1]&0xff); - - if (bflush) { - flush_block_only(false); - } - strstart++; - lookahead--; - if(strm.avail_out == 0) return NeedMore; - } else { - // There is no previous match to compare with, wait for - // the next step to decide. - - match_available = 1; - strstart++; - lookahead--; - } - } - - if(match_available!=0) { - bflush=_tr_tally(0, window[strstart-1]&0xff); - match_available = 0; - } - flush_block_only(flush == Z_FINISH); - - if(strm.avail_out==0){ - if(flush == Z_FINISH) return FinishStarted; - else return NeedMore; - } - - return flush == Z_FINISH ? FinishDone : BlockDone; - } - - int longest_match(int cur_match){ - int chain_length = max_chain_length; // max hash chain length - int scan = strstart; // current string - int match; // matched string - int len; // length of current match - int best_len = prev_length; // best match length so far - int limit = strstart>(w_size-MIN_LOOKAHEAD) ? - strstart-(w_size-MIN_LOOKAHEAD) : 0; - int nice_match=this.nice_match; - - // Stop when cur_match becomes <= limit. To simplify the code, - // we prevent matches with the string of window index 0. - - int wmask = w_mask; - - int strend = strstart + MAX_MATCH; - byte scan_end1 = window[scan+best_len-1]; - byte scan_end = window[scan+best_len]; - - // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - // It is easy to get rid of this optimization if necessary. - - // Do not waste too much time if we already have a good match: - if (prev_length >= good_match) { - chain_length >>= 2; - } - - // Do not look for matches beyond the end of the input. This is necessary - // to make deflate deterministic. - if (nice_match > lookahead) nice_match = lookahead; - - do { - match = cur_match; - - // Skip to next match if the match length cannot increase - // or if the match length is less than 2: - if (window[match+best_len] != scan_end || - window[match+best_len-1] != scan_end1 || - window[match] != window[scan] || - window[++match] != window[scan+1]) continue; - - // The check at best_len-1 can be removed because it will be made - // again later. (This heuristic is not always a win.) - // It is not necessary to compare scan[2] and match[2] since they - // are always equal when the other bytes match, given that - // the hash keys are equal and that HASH_BITS >= 8. - scan += 2; match++; - - // We check for insufficient lookahead only every 8th comparison; - // the 256th check will be made at strstart+258. - do { - } while (window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - scan < strend); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - - if(len>best_len) { - match_start = cur_match; - best_len = len; - if (len >= nice_match) break; - scan_end1 = window[scan+best_len-1]; - scan_end = window[scan+best_len]; - } - - } while ((cur_match = (prev[cur_match & wmask]&0xffff)) > limit - && --chain_length != 0); - - if (best_len <= lookahead) return best_len; - return lookahead; - } - - int deflateInit(ZStream strm, int level, int bits){ - return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY); - } - int deflateInit(ZStream strm, int level){ - return deflateInit(strm, level, MAX_WBITS); - } - int deflateInit2(ZStream strm, int level, int method, int windowBits, - int memLevel, int strategy){ - int noheader = 0; - // byte[] my_version=ZLIB_VERSION; - - // - // if (version == null || version[0] != my_version[0] - // || stream_size != sizeof(z_stream)) { - // return Z_VERSION_ERROR; - // } - - strm.msg = null; - - if (level == Z_DEFAULT_COMPRESSION) level = 6; - - if (windowBits < 0) { // undocumented feature: suppress zlib header - noheader = 1; - windowBits = -windowBits; - } - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || - method != Z_DEFLATED || - windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_HUFFMAN_ONLY) { - return Z_STREAM_ERROR; - } - - strm.dstate = (Deflate)this; - - this.noheader = noheader; - w_bits = windowBits; - w_size = 1 << w_bits; - w_mask = w_size - 1; - - hash_bits = memLevel + 7; - hash_size = 1 << hash_bits; - hash_mask = hash_size - 1; - hash_shift = ((hash_bits+MIN_MATCH-1)/MIN_MATCH); - - window = new byte[w_size*2]; - prev = new short[w_size]; - head = new short[hash_size]; - - lit_bufsize = 1 << (memLevel + 6); // 16K elements by default - - // We overlay pending_buf and d_buf+l_buf. This works since the average - // output size for (length,distance) codes is <= 24 bits. - pending_buf = new byte[lit_bufsize*4]; - pending_buf_size = lit_bufsize*4; - - d_buf = lit_bufsize/2; - l_buf = (1+2)*lit_bufsize; - - this.level = level; - -//System.out.println("level="+level); - - this.strategy = strategy; - this.method = (byte)method; - - return deflateReset(strm); - } - - int deflateReset(ZStream strm){ - strm.total_in = strm.total_out = 0; - strm.msg = null; // - strm.data_type = Z_UNKNOWN; - - pending = 0; - pending_out = 0; - - if(noheader < 0) { - noheader = 0; // was set to -1 by deflate(..., Z_FINISH); - } - status = (noheader!=0) ? BUSY_STATE : INIT_STATE; - strm.adler=strm._adler.adler32(0, null, 0, 0); - - last_flush = Z_NO_FLUSH; - - tr_init(); - lm_init(); - return Z_OK; - } - - int deflateEnd(){ - if(status!=INIT_STATE && status!=BUSY_STATE && status!=FINISH_STATE){ - return Z_STREAM_ERROR; - } - // Deallocate in reverse order of allocations: - pending_buf=null; - head=null; - prev=null; - window=null; - // free - // dstate=null; - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; - } - - int deflateParams(ZStream strm, int _level, int _strategy){ - int err=Z_OK; - - if(_level == Z_DEFAULT_COMPRESSION){ - _level = 6; - } - if(_level < 0 || _level > 9 || - _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) { - return Z_STREAM_ERROR; - } - - if(config_table[level].func!=config_table[_level].func && - strm.total_in != 0) { - // Flush the last buffer: - err = strm.deflate(Z_PARTIAL_FLUSH); - } - - if(level != _level) { - level = _level; - max_lazy_match = config_table[level].max_lazy; - good_match = config_table[level].good_length; - nice_match = config_table[level].nice_length; - max_chain_length = config_table[level].max_chain; - } - strategy = _strategy; - return err; - } - - int deflateSetDictionary (ZStream strm, byte[] dictionary, int dictLength){ - int length = dictLength; - int index=0; - - if(dictionary == null || status != INIT_STATE) - return Z_STREAM_ERROR; - - strm.adler=strm._adler.adler32(strm.adler, dictionary, 0, dictLength); - - if(length < MIN_MATCH) return Z_OK; - if(length > w_size-MIN_LOOKAHEAD){ - length = w_size-MIN_LOOKAHEAD; - index=dictLength-length; // use the tail of the dictionary - } - System.arraycopy(dictionary, index, window, 0, length); - strstart = length; - block_start = length; - - // Insert all strings in the hash table (except for the last two bytes). - // s->lookahead stays null, so s->ins_h will be recomputed at the next - // call of fill_window. - - ins_h = window[0]&0xff; - ins_h=(((ins_h)<<hash_shift)^(window[1]&0xff))&hash_mask; - - for(int n=0; n<=length-MIN_MATCH; n++){ - ins_h=(((ins_h)<<hash_shift)^(window[(n)+(MIN_MATCH-1)]&0xff))&hash_mask; - prev[n&w_mask]=head[ins_h]; - head[ins_h]=(short)n; - } - return Z_OK; - } - - int deflate(ZStream strm, int flush){ - int old_flush; - - if(flush>Z_FINISH || flush<0){ - return Z_STREAM_ERROR; - } - - if(strm.next_out == null || - (strm.next_in == null && strm.avail_in != 0) || - (status == FINISH_STATE && flush != Z_FINISH)) { - strm.msg=z_errmsg[Z_NEED_DICT-(Z_STREAM_ERROR)]; - return Z_STREAM_ERROR; - } - if(strm.avail_out == 0){ - strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - this.strm = strm; // just in case - old_flush = last_flush; - last_flush = flush; - - // Write the zlib header - if(status == INIT_STATE) { - int header = (Z_DEFLATED+((w_bits-8)<<4))<<8; - int level_flags=((level-1)&0xff)>>1; - - if(level_flags>3) level_flags=3; - header |= (level_flags<<6); - if(strstart!=0) header |= PRESET_DICT; - header+=31-(header % 31); - - status=BUSY_STATE; - putShortMSB(header); - - - // Save the adler32 of the preset dictionary: - if(strstart!=0){ - putShortMSB((int)(strm.adler>>>16)); - putShortMSB((int)(strm.adler&0xffff)); - } - strm.adler=strm._adler.adler32(0, null, 0, 0); - } - - // Flush as much pending output as possible - if(pending != 0) { - strm.flush_pending(); - if(strm.avail_out == 0) { - //System.out.println(" avail_out==0"); - // Since avail_out is 0, deflate will be called again with - // more output space, but possibly with both pending and - // avail_in equal to zero. There won't be anything to do, - // but this is not an error situation so make sure we - // return OK instead of BUF_ERROR at next call of deflate: - last_flush = -1; - return Z_OK; - } - - // Make sure there is something to do and avoid duplicate consecutive - // flushes. For repeated and useless calls with Z_FINISH, we keep - // returning Z_STREAM_END instead of Z_BUFF_ERROR. - } - else if(strm.avail_in==0 && flush <= old_flush && - flush != Z_FINISH) { - strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - // User must not provide more input after the first FINISH: - if(status == FINISH_STATE && strm.avail_in != 0) { - strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - // Start a new block or continue the current one. - if(strm.avail_in!=0 || lookahead!=0 || - (flush != Z_NO_FLUSH && status != FINISH_STATE)) { - int bstate=-1; - switch(config_table[level].func){ - case STORED: - bstate = deflate_stored(flush); - break; - case FAST: - bstate = deflate_fast(flush); - break; - case SLOW: - bstate = deflate_slow(flush); - break; - default: - } - - if (bstate==FinishStarted || bstate==FinishDone) { - status = FINISH_STATE; - } - if (bstate==NeedMore || bstate==FinishStarted) { - if(strm.avail_out == 0) { - last_flush = -1; // avoid BUF_ERROR next call, see above - } - return Z_OK; - // If flush != Z_NO_FLUSH && avail_out == 0, the next call - // of deflate should use the same flush parameter to make sure - // that the flush is complete. So we don't have to output an - // empty block here, this will be done at next call. This also - // ensures that for a very small output buffer, we emit at most - // one empty block. - } - - if (bstate==BlockDone) { - if(flush == Z_PARTIAL_FLUSH) { - _tr_align(); - } - else { // FULL_FLUSH or SYNC_FLUSH - _tr_stored_block(0, 0, false); - // For a full flush, this empty block will be recognized - // as a special marker by inflate_sync(). - if(flush == Z_FULL_FLUSH) { - //state.head[s.hash_size-1]=0; - for(int i=0; i<hash_size/*-1*/; i++) // forget history - head[i]=0; - } - } - strm.flush_pending(); - if(strm.avail_out == 0) { - last_flush = -1; // avoid BUF_ERROR at next call, see above - return Z_OK; - } - } - } - - if(flush!=Z_FINISH) return Z_OK; - if(noheader!=0) return Z_STREAM_END; - - // Write the zlib trailer (adler32) - putShortMSB((int)(strm.adler>>>16)); - putShortMSB((int)(strm.adler&0xffff)); - strm.flush_pending(); - - // If avail_out is zero, the application will call deflate again - // to flush the rest. - noheader = -1; // write the trailer only once! - return pending != 0 ? Z_OK : Z_STREAM_END; - } -} diff --git a/java/src/com/jcraft/jzlib/InfBlocks.java b/java/src/com/jcraft/jzlib/InfBlocks.java deleted file mode 100644 index f6997fc6..00000000 --- a/java/src/com/jcraft/jzlib/InfBlocks.java +++ /dev/null @@ -1,614 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class InfBlocks{ - static final private int MANY=1440; - - // And'ing with mask[n] masks the lower n bits - static final private int[] inflate_mask = { - 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, - 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, - 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, - 0x00007fff, 0x0000ffff - }; - - // Table for deflate from PKZIP's appnote.txt. - static final int[] border = { // Order of the bit length code lengths - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - }; - - static final private int Z_OK=0; - static final private int Z_STREAM_END=1; - static final private int Z_NEED_DICT=2; - static final private int Z_ERRNO=-1; - static final private int Z_STREAM_ERROR=-2; - static final private int Z_DATA_ERROR=-3; - static final private int Z_MEM_ERROR=-4; - static final private int Z_BUF_ERROR=-5; - static final private int Z_VERSION_ERROR=-6; - - static final private int TYPE=0; // get type bits (3, including end bit) - static final private int LENS=1; // get lengths for stored - static final private int STORED=2;// processing stored block - static final private int TABLE=3; // get table lengths - static final private int BTREE=4; // get bit lengths tree for a dynamic block - static final private int DTREE=5; // get length, distance trees for a dynamic block - static final private int CODES=6; // processing fixed or dynamic block - static final private int DRY=7; // output remaining window bytes - static final private int DONE=8; // finished last block, done - static final private int BAD=9; // ot a data error--stuck here - - int mode; // current inflate_block mode - - int left; // if STORED, bytes left to copy - - int table; // table lengths (14 bits) - int index; // index into blens (or border) - int[] blens; // bit lengths of codes - int[] bb=new int[1]; // bit length tree depth - int[] tb=new int[1]; // bit length decoding tree - - InfCodes codes=new InfCodes(); // if CODES, current state - - int last; // true if this block is the last block - - // mode independent information - int bitk; // bits in bit buffer - int bitb; // bit buffer - int[] hufts; // single malloc for tree space - byte[] window; // sliding window - int end; // one byte after sliding window - int read; // window read pointer - int write; // window write pointer - Object checkfn; // check function - long check; // check on output - - InfTree inftree=new InfTree(); - - InfBlocks(ZStream z, Object checkfn, int w){ - hufts=new int[MANY*3]; - window=new byte[w]; - end=w; - this.checkfn = checkfn; - mode = TYPE; - reset(z, null); - } - - void reset(ZStream z, long[] c){ - if(c!=null) c[0]=check; - if(mode==BTREE || mode==DTREE){ - } - if(mode==CODES){ - codes.free(z); - } - mode=TYPE; - bitk=0; - bitb=0; - read=write=0; - - if(checkfn != null) - z.adler=check=z._adler.adler32(0L, null, 0, 0); - } - - int proc(ZStream z, int r){ - int t; // temporary storage - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - - // copy input/output information to locals (UPDATE macro restores) - {p=z.next_in_index;n=z.avail_in;b=bitb;k=bitk;} - {q=write;m=(int)(q<read?read-q-1:end-q);} - - // process input based on current state - while(true){ - switch (mode){ - case TYPE: - - while(k<(3)){ - if(n!=0){ - r=Z_OK; - } - else{ - bitb=b; bitk=k; - z.avail_in=n; - z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - }; - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - t = (int)(b & 7); - last = t & 1; - - switch (t >>> 1){ - case 0: // stored - {b>>>=(3);k-=(3);} - t = k & 7; // go to byte boundary - - {b>>>=(t);k-=(t);} - mode = LENS; // get length of stored block - break; - case 1: // fixed - { - int[] bl=new int[1]; - int[] bd=new int[1]; - int[][] tl=new int[1][]; - int[][] td=new int[1][]; - - InfTree.inflate_trees_fixed(bl, bd, tl, td, z); - codes.init(bl[0], bd[0], tl[0], 0, td[0], 0, z); - } - - {b>>>=(3);k-=(3);} - - mode = CODES; - break; - case 2: // dynamic - - {b>>>=(3);k-=(3);} - - mode = TABLE; - break; - case 3: // illegal - - {b>>>=(3);k-=(3);} - mode = BAD; - z.msg = "invalid block type"; - r = Z_DATA_ERROR; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - break; - case LENS: - - while(k<(32)){ - if(n!=0){ - r=Z_OK; - } - else{ - bitb=b; bitk=k; - z.avail_in=n; - z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - }; - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - if ((((~b) >>> 16) & 0xffff) != (b & 0xffff)){ - mode = BAD; - z.msg = "invalid stored block lengths"; - r = Z_DATA_ERROR; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - left = (b & 0xffff); - b = k = 0; // dump bits - mode = left!=0 ? STORED : (last!=0 ? DRY : TYPE); - break; - case STORED: - if (n == 0){ - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - - if(m==0){ - if(q==end&&read!=0){ - q=0; m=(int)(q<read?read-q-1:end-q); - } - if(m==0){ - write=q; - r=inflate_flush(z,r); - q=write;m=(int)(q<read?read-q-1:end-q); - if(q==end&&read!=0){ - q=0; m=(int)(q<read?read-q-1:end-q); - } - if(m==0){ - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - } - } - r=Z_OK; - - t = left; - if(t>n) t = n; - if(t>m) t = m; - System.arraycopy(z.next_in, p, window, q, t); - p += t; n -= t; - q += t; m -= t; - if ((left -= t) != 0) - break; - mode = last!=0 ? DRY : TYPE; - break; - case TABLE: - - while(k<(14)){ - if(n!=0){ - r=Z_OK; - } - else{ - bitb=b; bitk=k; - z.avail_in=n; - z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - }; - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - table = t = (b & 0x3fff); - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - mode = BAD; - z.msg = "too many length or distance symbols"; - r = Z_DATA_ERROR; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - if(blens==null || blens.length<t){ - blens=new int[t]; - } - else{ - for(int i=0; i<t; i++){blens[i]=0;} - } - - {b>>>=(14);k-=(14);} - - index = 0; - mode = BTREE; - case BTREE: - while (index < 4 + (table >>> 10)){ - while(k<(3)){ - if(n!=0){ - r=Z_OK; - } - else{ - bitb=b; bitk=k; - z.avail_in=n; - z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - }; - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - blens[border[index++]] = b&7; - - {b>>>=(3);k-=(3);} - } - - while(index < 19){ - blens[border[index++]] = 0; - } - - bb[0] = 7; - t = inftree.inflate_trees_bits(blens, bb, tb, hufts, z); - if (t != Z_OK){ - r = t; - if (r == Z_DATA_ERROR){ - blens=null; - mode = BAD; - } - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - - index = 0; - mode = DTREE; - case DTREE: - while (true){ - t = table; - if(!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))){ - break; - } - - int[] h; - int i, j, c; - - t = bb[0]; - - while(k<(t)){ - if(n!=0){ - r=Z_OK; - } - else{ - bitb=b; bitk=k; - z.avail_in=n; - z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - }; - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - if(tb[0]==-1){ - //System.err.println("null..."); - } - - t=hufts[(tb[0]+(b&inflate_mask[t]))*3+1]; - c=hufts[(tb[0]+(b&inflate_mask[t]))*3+2]; - - if (c < 16){ - b>>>=(t);k-=(t); - blens[index++] = c; - } - else { // c == 16..18 - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - - while(k<(t+i)){ - if(n!=0){ - r=Z_OK; - } - else{ - bitb=b; bitk=k; - z.avail_in=n; - z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - }; - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - b>>>=(t);k-=(t); - - j += (b & inflate_mask[i]); - - b>>>=(i);k-=(i); - - i = index; - t = table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || - (c == 16 && i < 1)){ - blens=null; - mode = BAD; - z.msg = "invalid bit length repeat"; - r = Z_DATA_ERROR; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - - c = c == 16 ? blens[i-1] : 0; - do{ - blens[i++] = c; - } - while (--j!=0); - index = i; - } - } - - tb[0]=-1; - { - int[] bl=new int[1]; - int[] bd=new int[1]; - int[] tl=new int[1]; - int[] td=new int[1]; - bl[0] = 9; // must be <= 9 for lookahead assumptions - bd[0] = 6; // must be <= 9 for lookahead assumptions - - t = table; - t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), - 1 + ((t >> 5) & 0x1f), - blens, bl, bd, tl, td, hufts, z); - - if (t != Z_OK){ - if (t == Z_DATA_ERROR){ - blens=null; - mode = BAD; - } - r = t; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z,r); - } - codes.init(bl[0], bd[0], hufts, tl[0], hufts, td[0], z); - } - mode = CODES; - case CODES: - bitb=b; bitk=k; - z.avail_in=n; z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - - if ((r = codes.proc(this, z, r)) != Z_STREAM_END){ - return inflate_flush(z, r); - } - r = Z_OK; - codes.free(z); - - p=z.next_in_index; n=z.avail_in;b=bitb;k=bitk; - q=write;m=(int)(q<read?read-q-1:end-q); - - if (last==0){ - mode = TYPE; - break; - } - mode = DRY; - case DRY: - write=q; - r=inflate_flush(z, r); - q=write; m=(int)(q<read?read-q-1:end-q); - if (read != write){ - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z, r); - } - mode = DONE; - case DONE: - r = Z_STREAM_END; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z, r); - case BAD: - r = Z_DATA_ERROR; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z, r); - - default: - r = Z_STREAM_ERROR; - - bitb=b; bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - write=q; - return inflate_flush(z, r); - } - } - } - - void free(ZStream z){ - reset(z, null); - window=null; - hufts=null; - //ZFREE(z, s); - } - - void set_dictionary(byte[] d, int start, int n){ - System.arraycopy(d, start, window, 0, n); - read = write = n; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. - int sync_point(){ - return mode == LENS ? 1 : 0; - } - - // copy as much as possible from the sliding window to the output area - int inflate_flush(ZStream z, int r){ - int n; - int p; - int q; - - // local copies of source and destination pointers - p = z.next_out_index; - q = read; - - // compute number of bytes to copy as far as end of window - n = (int)((q <= write ? write : end) - q); - if (n > z.avail_out) n = z.avail_out; - if (n!=0 && r == Z_BUF_ERROR) r = Z_OK; - - // update counters - z.avail_out -= n; - z.total_out += n; - - // update check information - if(checkfn != null) - z.adler=check=z._adler.adler32(check, window, q, n); - - // copy as far as end of window - System.arraycopy(window, q, z.next_out, p, n); - p += n; - q += n; - - // see if more to copy at beginning of window - if (q == end){ - // wrap pointers - q = 0; - if (write == end) - write = 0; - - // compute bytes to copy - n = write - q; - if (n > z.avail_out) n = z.avail_out; - if (n!=0 && r == Z_BUF_ERROR) r = Z_OK; - - // update counters - z.avail_out -= n; - z.total_out += n; - - // update check information - if(checkfn != null) - z.adler=check=z._adler.adler32(check, window, q, n); - - // copy - System.arraycopy(window, q, z.next_out, p, n); - p += n; - q += n; - } - - // update pointers - z.next_out_index = p; - read = q; - - // done - return r; - } -} diff --git a/java/src/com/jcraft/jzlib/InfCodes.java b/java/src/com/jcraft/jzlib/InfCodes.java deleted file mode 100644 index c768fb1c..00000000 --- a/java/src/com/jcraft/jzlib/InfCodes.java +++ /dev/null @@ -1,605 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class InfCodes{ - - static final private int[] inflate_mask = { - 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, - 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, - 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, - 0x00007fff, 0x0000ffff - }; - - static final private int Z_OK=0; - static final private int Z_STREAM_END=1; - static final private int Z_NEED_DICT=2; - static final private int Z_ERRNO=-1; - static final private int Z_STREAM_ERROR=-2; - static final private int Z_DATA_ERROR=-3; - static final private int Z_MEM_ERROR=-4; - static final private int Z_BUF_ERROR=-5; - static final private int Z_VERSION_ERROR=-6; - - // waiting for "i:"=input, - // "o:"=output, - // "x:"=nothing - static final private int START=0; // x: set up for LEN - static final private int LEN=1; // i: get length/literal/eob next - static final private int LENEXT=2; // i: getting length extra (have base) - static final private int DIST=3; // i: get distance next - static final private int DISTEXT=4;// i: getting distance extra - static final private int COPY=5; // o: copying bytes in window, waiting for space - static final private int LIT=6; // o: got literal, waiting for output space - static final private int WASH=7; // o: got eob, possibly still output waiting - static final private int END=8; // x: got eob and all data flushed - static final private int BADCODE=9;// x: got error - - int mode; // current inflate_codes mode - - // mode dependent information - int len; - - int[] tree; // pointer into tree - int tree_index=0; - int need; // bits needed - - int lit; - - // if EXT or COPY, where and how much - int get; // bits to get for extra - int dist; // distance back to copy from - - byte lbits; // ltree bits decoded per branch - byte dbits; // dtree bits decoder per branch - int[] ltree; // literal/length/eob tree - int ltree_index; // literal/length/eob tree - int[] dtree; // distance tree - int dtree_index; // distance tree - - InfCodes(){ - } - void init(int bl, int bd, - int[] tl, int tl_index, - int[] td, int td_index, ZStream z){ - mode=START; - lbits=(byte)bl; - dbits=(byte)bd; - ltree=tl; - ltree_index=tl_index; - dtree = td; - dtree_index=td_index; - tree=null; - } - - int proc(InfBlocks s, ZStream z, int r){ - int j; // temporary storage - int[] t; // temporary pointer - int tindex; // temporary pointer - int e; // extra bits or operation - int b=0; // bit buffer - int k=0; // bits in bit buffer - int p=0; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int f; // pointer to copy strings from - - // copy input/output information to locals (UPDATE macro restores) - p=z.next_in_index;n=z.avail_in;b=s.bitb;k=s.bitk; - q=s.write;m=q<s.read?s.read-q-1:s.end-q; - - // process input and output based on current state - while (true){ - switch (mode){ - // waiting for "i:"=input, "o:"=output, "x:"=nothing - case START: // x: set up for LEN - if (m >= 258 && n >= 10){ - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - r = inflate_fast(lbits, dbits, - ltree, ltree_index, - dtree, dtree_index, - s, z); - - p=z.next_in_index;n=z.avail_in;b=s.bitb;k=s.bitk; - q=s.write;m=q<s.read?s.read-q-1:s.end-q; - - if (r != Z_OK){ - mode = r == Z_STREAM_END ? WASH : BADCODE; - break; - } - } - need = lbits; - tree = ltree; - tree_index=ltree_index; - - mode = LEN; - case LEN: // i: get length/literal/eob next - j = need; - - while(k<(j)){ - if(n!=0)r=Z_OK; - else{ - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - n--; - b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - tindex=(tree_index+(b&inflate_mask[j]))*3; - - b>>>=(tree[tindex+1]); - k-=(tree[tindex+1]); - - e=tree[tindex]; - - if(e == 0){ // literal - lit = tree[tindex+2]; - mode = LIT; - break; - } - if((e & 16)!=0 ){ // length - get = e & 15; - len = tree[tindex+2]; - mode = LENEXT; - break; - } - if ((e & 64) == 0){ // next table - need = e; - tree_index = tindex/3+tree[tindex+2]; - break; - } - if ((e & 32)!=0){ // end of block - mode = WASH; - break; - } - mode = BADCODE; // invalid code - z.msg = "invalid literal/length code"; - r = Z_DATA_ERROR; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - - case LENEXT: // i: getting length extra (have base) - j = get; - - while(k<(j)){ - if(n!=0)r=Z_OK; - else{ - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - n--; b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - len += (b & inflate_mask[j]); - - b>>=j; - k-=j; - - need = dbits; - tree = dtree; - tree_index=dtree_index; - mode = DIST; - case DIST: // i: get distance next - j = need; - - while(k<(j)){ - if(n!=0)r=Z_OK; - else{ - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - n--; b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - tindex=(tree_index+(b & inflate_mask[j]))*3; - - b>>=tree[tindex+1]; - k-=tree[tindex+1]; - - e = (tree[tindex]); - if((e & 16)!=0){ // distance - get = e & 15; - dist = tree[tindex+2]; - mode = DISTEXT; - break; - } - if ((e & 64) == 0){ // next table - need = e; - tree_index = tindex/3 + tree[tindex+2]; - break; - } - mode = BADCODE; // invalid code - z.msg = "invalid distance code"; - r = Z_DATA_ERROR; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - - case DISTEXT: // i: getting distance extra - j = get; - - while(k<(j)){ - if(n!=0)r=Z_OK; - else{ - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - n--; b|=(z.next_in[p++]&0xff)<<k; - k+=8; - } - - dist += (b & inflate_mask[j]); - - b>>=j; - k-=j; - - mode = COPY; - case COPY: // o: copying bytes in window, waiting for space - f = q - dist; - while(f < 0){ // modulo window size-"while" instead - f += s.end; // of "if" handles invalid distances - } - while (len!=0){ - - if(m==0){ - if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;} - if(m==0){ - s.write=q; r=s.inflate_flush(z,r); - q=s.write;m=q<s.read?s.read-q-1:s.end-q; - - if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;} - - if(m==0){ - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - } - } - - s.window[q++]=s.window[f++]; m--; - - if (f == s.end) - f = 0; - len--; - } - mode = START; - break; - case LIT: // o: got literal, waiting for output space - if(m==0){ - if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;} - if(m==0){ - s.write=q; r=s.inflate_flush(z,r); - q=s.write;m=q<s.read?s.read-q-1:s.end-q; - - if(q==s.end&&s.read!=0){q=0;m=q<s.read?s.read-q-1:s.end-q;} - if(m==0){ - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - } - } - r=Z_OK; - - s.window[q++]=(byte)lit; m--; - - mode = START; - break; - case WASH: // o: got eob, possibly more output - if (k > 7){ // return unused byte, if any - k -= 8; - n++; - p--; // can always return one - } - - s.write=q; r=s.inflate_flush(z,r); - q=s.write;m=q<s.read?s.read-q-1:s.end-q; - - if (s.read != s.write){ - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - mode = END; - case END: - r = Z_STREAM_END; - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - - case BADCODE: // x: got error - - r = Z_DATA_ERROR; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - - default: - r = Z_STREAM_ERROR; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - return s.inflate_flush(z,r); - } - } - } - - void free(ZStream z){ - // ZFREE(z, c); - } - - // Called with number of bytes left to write in window at least 258 - // (the maximum string length) and number of input bytes available - // at least ten. The ten bytes are six bytes for the longest length/ - // distance pair plus four bytes for overloading the bit buffer. - - int inflate_fast(int bl, int bd, - int[] tl, int tl_index, - int[] td, int td_index, - InfBlocks s, ZStream z){ - int t; // temporary pointer - int[] tp; // temporary pointer - int tp_index; // temporary pointer - int e; // extra bits or operation - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int ml; // mask for literal/length tree - int md; // mask for distance tree - int c; // bytes to copy - int d; // distance back to copy from - int r; // copy source pointer - - int tp_index_t_3; // (tp_index+t)*3 - - // load input, output, bit values - p=z.next_in_index;n=z.avail_in;b=s.bitb;k=s.bitk; - q=s.write;m=q<s.read?s.read-q-1:s.end-q; - - // initialize masks - ml = inflate_mask[bl]; - md = inflate_mask[bd]; - - // do until not enough input or output space for fast loop - do { // assume called with m >= 258 && n >= 10 - // get literal/length code - while(k<(20)){ // max bits for literal/length code - n--; - b|=(z.next_in[p++]&0xff)<<k;k+=8; - } - - t= b&ml; - tp=tl; - tp_index=tl_index; - tp_index_t_3=(tp_index+t)*3; - if ((e = tp[tp_index_t_3]) == 0){ - b>>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]); - - s.window[q++] = (byte)tp[tp_index_t_3+2]; - m--; - continue; - } - do { - - b>>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]); - - if((e&16)!=0){ - e &= 15; - c = tp[tp_index_t_3+2] + ((int)b & inflate_mask[e]); - - b>>=e; k-=e; - - // decode distance base of block to copy - while(k<(15)){ // max bits for distance code - n--; - b|=(z.next_in[p++]&0xff)<<k;k+=8; - } - - t= b&md; - tp=td; - tp_index=td_index; - tp_index_t_3=(tp_index+t)*3; - e = tp[tp_index_t_3]; - - do { - - b>>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]); - - if((e&16)!=0){ - // get extra bits to add to distance base - e &= 15; - while(k<(e)){ // get extra bits (up to 13) - n--; - b|=(z.next_in[p++]&0xff)<<k;k+=8; - } - - d = tp[tp_index_t_3+2] + (b&inflate_mask[e]); - - b>>=(e); k-=(e); - - // do the copy - m -= c; - if (q >= d){ // offset before dest - // just copy - r=q-d; - if(q-r>0 && 2>(q-r)){ - s.window[q++]=s.window[r++]; // minimum count is three, - s.window[q++]=s.window[r++]; // so unroll loop a little - c-=2; - } - else{ - System.arraycopy(s.window, r, s.window, q, 2); - q+=2; r+=2; c-=2; - } - } - else{ // else offset after destination - r=q-d; - do{ - r+=s.end; // force pointer in window - }while(r<0); // covers invalid distances - e=s.end-r; - if(c>e){ // if source crosses, - c-=e; // wrapped copy - if(q-r>0 && e>(q-r)){ - do{s.window[q++] = s.window[r++];} - while(--e!=0); - } - else{ - System.arraycopy(s.window, r, s.window, q, e); - q+=e; r+=e; e=0; - } - r = 0; // copy rest from start of window - } - - } - - // copy all or what's left - if(q-r>0 && c>(q-r)){ - do{s.window[q++] = s.window[r++];} - while(--c!=0); - } - else{ - System.arraycopy(s.window, r, s.window, q, c); - q+=c; r+=c; c=0; - } - break; - } - else if((e&64)==0){ - t+=tp[tp_index_t_3+2]; - t+=(b&inflate_mask[e]); - tp_index_t_3=(tp_index+t)*3; - e=tp[tp_index_t_3]; - } - else{ - z.msg = "invalid distance code"; - - c=z.avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - - return Z_DATA_ERROR; - } - } - while(true); - break; - } - - if((e&64)==0){ - t+=tp[tp_index_t_3+2]; - t+=(b&inflate_mask[e]); - tp_index_t_3=(tp_index+t)*3; - if((e=tp[tp_index_t_3])==0){ - - b>>=(tp[tp_index_t_3+1]); k-=(tp[tp_index_t_3+1]); - - s.window[q++]=(byte)tp[tp_index_t_3+2]; - m--; - break; - } - } - else if((e&32)!=0){ - - c=z.avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - - return Z_STREAM_END; - } - else{ - z.msg="invalid literal/length code"; - - c=z.avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - - return Z_DATA_ERROR; - } - } - while(true); - } - while(m>=258 && n>= 10); - - // not enough input or output--restore pointers and return - c=z.avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3; - - s.bitb=b;s.bitk=k; - z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; - s.write=q; - - return Z_OK; - } -} diff --git a/java/src/com/jcraft/jzlib/InfTree.java b/java/src/com/jcraft/jzlib/InfTree.java deleted file mode 100644 index cbca4366..00000000 --- a/java/src/com/jcraft/jzlib/InfTree.java +++ /dev/null @@ -1,520 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class InfTree{ - - static final private int MANY=1440; - - static final private int Z_OK=0; - static final private int Z_STREAM_END=1; - static final private int Z_NEED_DICT=2; - static final private int Z_ERRNO=-1; - static final private int Z_STREAM_ERROR=-2; - static final private int Z_DATA_ERROR=-3; - static final private int Z_MEM_ERROR=-4; - static final private int Z_BUF_ERROR=-5; - static final private int Z_VERSION_ERROR=-6; - - static final int fixed_bl = 9; - static final int fixed_bd = 5; - - static final int[] fixed_tl = { - 96,7,256, 0,8,80, 0,8,16, 84,8,115, - 82,7,31, 0,8,112, 0,8,48, 0,9,192, - 80,7,10, 0,8,96, 0,8,32, 0,9,160, - 0,8,0, 0,8,128, 0,8,64, 0,9,224, - 80,7,6, 0,8,88, 0,8,24, 0,9,144, - 83,7,59, 0,8,120, 0,8,56, 0,9,208, - 81,7,17, 0,8,104, 0,8,40, 0,9,176, - 0,8,8, 0,8,136, 0,8,72, 0,9,240, - 80,7,4, 0,8,84, 0,8,20, 85,8,227, - 83,7,43, 0,8,116, 0,8,52, 0,9,200, - 81,7,13, 0,8,100, 0,8,36, 0,9,168, - 0,8,4, 0,8,132, 0,8,68, 0,9,232, - 80,7,8, 0,8,92, 0,8,28, 0,9,152, - 84,7,83, 0,8,124, 0,8,60, 0,9,216, - 82,7,23, 0,8,108, 0,8,44, 0,9,184, - 0,8,12, 0,8,140, 0,8,76, 0,9,248, - 80,7,3, 0,8,82, 0,8,18, 85,8,163, - 83,7,35, 0,8,114, 0,8,50, 0,9,196, - 81,7,11, 0,8,98, 0,8,34, 0,9,164, - 0,8,2, 0,8,130, 0,8,66, 0,9,228, - 80,7,7, 0,8,90, 0,8,26, 0,9,148, - 84,7,67, 0,8,122, 0,8,58, 0,9,212, - 82,7,19, 0,8,106, 0,8,42, 0,9,180, - 0,8,10, 0,8,138, 0,8,74, 0,9,244, - 80,7,5, 0,8,86, 0,8,22, 192,8,0, - 83,7,51, 0,8,118, 0,8,54, 0,9,204, - 81,7,15, 0,8,102, 0,8,38, 0,9,172, - 0,8,6, 0,8,134, 0,8,70, 0,9,236, - 80,7,9, 0,8,94, 0,8,30, 0,9,156, - 84,7,99, 0,8,126, 0,8,62, 0,9,220, - 82,7,27, 0,8,110, 0,8,46, 0,9,188, - 0,8,14, 0,8,142, 0,8,78, 0,9,252, - 96,7,256, 0,8,81, 0,8,17, 85,8,131, - 82,7,31, 0,8,113, 0,8,49, 0,9,194, - 80,7,10, 0,8,97, 0,8,33, 0,9,162, - 0,8,1, 0,8,129, 0,8,65, 0,9,226, - 80,7,6, 0,8,89, 0,8,25, 0,9,146, - 83,7,59, 0,8,121, 0,8,57, 0,9,210, - 81,7,17, 0,8,105, 0,8,41, 0,9,178, - 0,8,9, 0,8,137, 0,8,73, 0,9,242, - 80,7,4, 0,8,85, 0,8,21, 80,8,258, - 83,7,43, 0,8,117, 0,8,53, 0,9,202, - 81,7,13, 0,8,101, 0,8,37, 0,9,170, - 0,8,5, 0,8,133, 0,8,69, 0,9,234, - 80,7,8, 0,8,93, 0,8,29, 0,9,154, - 84,7,83, 0,8,125, 0,8,61, 0,9,218, - 82,7,23, 0,8,109, 0,8,45, 0,9,186, - 0,8,13, 0,8,141, 0,8,77, 0,9,250, - 80,7,3, 0,8,83, 0,8,19, 85,8,195, - 83,7,35, 0,8,115, 0,8,51, 0,9,198, - 81,7,11, 0,8,99, 0,8,35, 0,9,166, - 0,8,3, 0,8,131, 0,8,67, 0,9,230, - 80,7,7, 0,8,91, 0,8,27, 0,9,150, - 84,7,67, 0,8,123, 0,8,59, 0,9,214, - 82,7,19, 0,8,107, 0,8,43, 0,9,182, - 0,8,11, 0,8,139, 0,8,75, 0,9,246, - 80,7,5, 0,8,87, 0,8,23, 192,8,0, - 83,7,51, 0,8,119, 0,8,55, 0,9,206, - 81,7,15, 0,8,103, 0,8,39, 0,9,174, - 0,8,7, 0,8,135, 0,8,71, 0,9,238, - 80,7,9, 0,8,95, 0,8,31, 0,9,158, - 84,7,99, 0,8,127, 0,8,63, 0,9,222, - 82,7,27, 0,8,111, 0,8,47, 0,9,190, - 0,8,15, 0,8,143, 0,8,79, 0,9,254, - 96,7,256, 0,8,80, 0,8,16, 84,8,115, - 82,7,31, 0,8,112, 0,8,48, 0,9,193, - - 80,7,10, 0,8,96, 0,8,32, 0,9,161, - 0,8,0, 0,8,128, 0,8,64, 0,9,225, - 80,7,6, 0,8,88, 0,8,24, 0,9,145, - 83,7,59, 0,8,120, 0,8,56, 0,9,209, - 81,7,17, 0,8,104, 0,8,40, 0,9,177, - 0,8,8, 0,8,136, 0,8,72, 0,9,241, - 80,7,4, 0,8,84, 0,8,20, 85,8,227, - 83,7,43, 0,8,116, 0,8,52, 0,9,201, - 81,7,13, 0,8,100, 0,8,36, 0,9,169, - 0,8,4, 0,8,132, 0,8,68, 0,9,233, - 80,7,8, 0,8,92, 0,8,28, 0,9,153, - 84,7,83, 0,8,124, 0,8,60, 0,9,217, - 82,7,23, 0,8,108, 0,8,44, 0,9,185, - 0,8,12, 0,8,140, 0,8,76, 0,9,249, - 80,7,3, 0,8,82, 0,8,18, 85,8,163, - 83,7,35, 0,8,114, 0,8,50, 0,9,197, - 81,7,11, 0,8,98, 0,8,34, 0,9,165, - 0,8,2, 0,8,130, 0,8,66, 0,9,229, - 80,7,7, 0,8,90, 0,8,26, 0,9,149, - 84,7,67, 0,8,122, 0,8,58, 0,9,213, - 82,7,19, 0,8,106, 0,8,42, 0,9,181, - 0,8,10, 0,8,138, 0,8,74, 0,9,245, - 80,7,5, 0,8,86, 0,8,22, 192,8,0, - 83,7,51, 0,8,118, 0,8,54, 0,9,205, - 81,7,15, 0,8,102, 0,8,38, 0,9,173, - 0,8,6, 0,8,134, 0,8,70, 0,9,237, - 80,7,9, 0,8,94, 0,8,30, 0,9,157, - 84,7,99, 0,8,126, 0,8,62, 0,9,221, - 82,7,27, 0,8,110, 0,8,46, 0,9,189, - 0,8,14, 0,8,142, 0,8,78, 0,9,253, - 96,7,256, 0,8,81, 0,8,17, 85,8,131, - 82,7,31, 0,8,113, 0,8,49, 0,9,195, - 80,7,10, 0,8,97, 0,8,33, 0,9,163, - 0,8,1, 0,8,129, 0,8,65, 0,9,227, - 80,7,6, 0,8,89, 0,8,25, 0,9,147, - 83,7,59, 0,8,121, 0,8,57, 0,9,211, - 81,7,17, 0,8,105, 0,8,41, 0,9,179, - 0,8,9, 0,8,137, 0,8,73, 0,9,243, - 80,7,4, 0,8,85, 0,8,21, 80,8,258, - 83,7,43, 0,8,117, 0,8,53, 0,9,203, - 81,7,13, 0,8,101, 0,8,37, 0,9,171, - 0,8,5, 0,8,133, 0,8,69, 0,9,235, - 80,7,8, 0,8,93, 0,8,29, 0,9,155, - 84,7,83, 0,8,125, 0,8,61, 0,9,219, - 82,7,23, 0,8,109, 0,8,45, 0,9,187, - 0,8,13, 0,8,141, 0,8,77, 0,9,251, - 80,7,3, 0,8,83, 0,8,19, 85,8,195, - 83,7,35, 0,8,115, 0,8,51, 0,9,199, - 81,7,11, 0,8,99, 0,8,35, 0,9,167, - 0,8,3, 0,8,131, 0,8,67, 0,9,231, - 80,7,7, 0,8,91, 0,8,27, 0,9,151, - 84,7,67, 0,8,123, 0,8,59, 0,9,215, - 82,7,19, 0,8,107, 0,8,43, 0,9,183, - 0,8,11, 0,8,139, 0,8,75, 0,9,247, - 80,7,5, 0,8,87, 0,8,23, 192,8,0, - 83,7,51, 0,8,119, 0,8,55, 0,9,207, - 81,7,15, 0,8,103, 0,8,39, 0,9,175, - 0,8,7, 0,8,135, 0,8,71, 0,9,239, - 80,7,9, 0,8,95, 0,8,31, 0,9,159, - 84,7,99, 0,8,127, 0,8,63, 0,9,223, - 82,7,27, 0,8,111, 0,8,47, 0,9,191, - 0,8,15, 0,8,143, 0,8,79, 0,9,255 - }; - static final int[] fixed_td = { - 80,5,1, 87,5,257, 83,5,17, 91,5,4097, - 81,5,5, 89,5,1025, 85,5,65, 93,5,16385, - 80,5,3, 88,5,513, 84,5,33, 92,5,8193, - 82,5,9, 90,5,2049, 86,5,129, 192,5,24577, - 80,5,2, 87,5,385, 83,5,25, 91,5,6145, - 81,5,7, 89,5,1537, 85,5,97, 93,5,24577, - 80,5,4, 88,5,769, 84,5,49, 92,5,12289, - 82,5,13, 90,5,3073, 86,5,193, 192,5,24577 - }; - - // Tables for deflate from PKZIP's appnote.txt. - static final int[] cplens = { // Copy lengths for literal codes 257..285 - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 - }; - - // see note #13 above about 258 - static final int[] cplext = { // Extra bits for literal codes 257..285 - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 // 112==invalid - }; - - static final int[] cpdist = { // Copy offsets for distance codes 0..29 - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577 - }; - - static final int[] cpdext = { // Extra bits for distance codes - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13}; - - // If BMAX needs to be larger than 16, then h and x[] should be uLong. - static final int BMAX=15; // maximum bit length of any code - - int[] hn = null; // hufts used in space - int[] v = null; // work area for huft_build - int[] c = null; // bit length count table - int[] r = null; // table entry for structure assignment - int[] u = null; // table stack - int[] x = null; // bit offsets, then code stack - - private int huft_build(int[] b, // code lengths in bits (all assumed <= BMAX) - int bindex, - int n, // number of codes (assumed <= 288) - int s, // number of simple-valued codes (0..s-1) - int[] d, // list of base values for non-simple codes - int[] e, // list of extra bits for non-simple codes - int[] t, // result: starting table - int[] m, // maximum lookup bits, returns actual - int[] hp,// space for trees - int[] hn,// hufts used in space - int[] v // working area: values in order of bit length - ){ - // Given a list of code lengths and a maximum table size, make a set of - // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - // if the given code set is incomplete (the tables are still built in this - // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of - // lengths), or Z_MEM_ERROR if not enough memory. - - int a; // counter for codes of length k - int f; // i repeats in table every f entries - int g; // maximum code length - int h; // table level - int i; // counter, current code - int j; // counter - int k; // number of bits in current code - int l; // bits per table (returned in m) - int mask; // (1 << w) - 1, to avoid cc -O bug on HP - int p; // pointer into c[], b[], or v[] - int q; // points to current table - int w; // bits before this table == (l * h) - int xp; // pointer into x - int y; // number of dummy codes added - int z; // number of entries in current table - - // Generate counts for each bit length - - p = 0; i = n; - do { - c[b[bindex+p]]++; p++; i--; // assume all entries <= BMAX - }while(i!=0); - - if(c[0] == n){ // null input--all zero length codes - t[0] = -1; - m[0] = 0; - return Z_OK; - } - - // Find minimum and maximum length, bound *m by those - l = m[0]; - for (j = 1; j <= BMAX; j++) - if(c[j]!=0) break; - k = j; // minimum code length - if(l < j){ - l = j; - } - for (i = BMAX; i!=0; i--){ - if(c[i]!=0) break; - } - g = i; // maximum code length - if(l > i){ - l = i; - } - m[0] = l; - - // Adjust last length count to fill out codes, if needed - for (y = 1 << j; j < i; j++, y <<= 1){ - if ((y -= c[j]) < 0){ - return Z_DATA_ERROR; - } - } - if ((y -= c[i]) < 0){ - return Z_DATA_ERROR; - } - c[i] += y; - - // Generate starting offsets into the value table for each length - x[1] = j = 0; - p = 1; xp = 2; - while (--i!=0) { // note that i == g from above - x[xp] = (j += c[p]); - xp++; - p++; - } - - // Make a table of values in order of bit lengths - i = 0; p = 0; - do { - if ((j = b[bindex+p]) != 0){ - v[x[j]++] = i; - } - p++; - } - while (++i < n); - n = x[g]; // set n to length of v - - // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero - p = 0; // grab values in bit order - h = -1; // no tables yet--level -1 - w = -l; // bits decoded == (l * h) - u[0] = 0; // just to keep compilers happy - q = 0; // ditto - z = 0; // ditto - - // go through the bit lengths (k already is bits in shortest code) - for (; k <= g; k++){ - a = c[k]; - while (a--!=0){ - // here i is the Huffman code of length k bits for value *p - // make tables up to required level - while (k > w + l){ - h++; - w += l; // previous table always l bits - // compute minimum size table less than or equal to l bits - z = g - w; - z = (z > l) ? l : z; // table size upper limit - if((f=1<<(j=k-w))>a+1){ // try a k-w bit table - // too few codes for k-w bit table - f -= a + 1; // deduct codes from patterns left - xp = k; - if(j < z){ - while (++j < z){ // try smaller tables up to z bits - if((f <<= 1) <= c[++xp]) - break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns - } - } - } - z = 1 << j; // table entries for j-bit table - - // allocate new table - if (hn[0] + z > MANY){ // (note: doesn't matter for fixed) - return Z_DATA_ERROR; // overflow of MANY - } - u[h] = q = /*hp+*/ hn[0]; // DEBUG - hn[0] += z; - - // connect to last table, if there is one - if(h!=0){ - x[h]=i; // save pattern for backing up - r[0]=(byte)j; // bits in this table - r[1]=(byte)l; // bits to dump before this table - j=i>>>(w - l); - r[2] = (int)(q - u[h-1] - j); // offset to this table - System.arraycopy(r, 0, hp, (u[h-1]+j)*3, 3); // connect to last table - } - else{ - t[0] = q; // first table is returned result - } - } - - // set up table entry in r - r[1] = (byte)(k - w); - if (p >= n){ - r[0] = 128 + 64; // out of values--invalid code - } - else if (v[p] < s){ - r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block - r[2] = v[p++]; // simple code is just the value - } - else{ - r[0]=(byte)(e[v[p]-s]+16+64); // non-simple--look up in lists - r[2]=d[v[p++] - s]; - } - - // fill code-like entries with r - f=1<<(k-w); - for (j=i>>>w;j<z;j+=f){ - System.arraycopy(r, 0, hp, (q+j)*3, 3); - } - - // backwards increment the k-bit code i - for (j = 1 << (k - 1); (i & j)!=0; j >>>= 1){ - i ^= j; - } - i ^= j; - - // backup over finished tables - mask = (1 << w) - 1; // needed on HP, cc -O bug - while ((i & mask) != x[h]){ - h--; // don't need to update q - w -= l; - mask = (1 << w) - 1; - } - } - } - // Return Z_BUF_ERROR if we were given an incomplete table - return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; - } - - int inflate_trees_bits(int[] c, // 19 code lengths - int[] bb, // bits tree desired/actual depth - int[] tb, // bits tree result - int[] hp, // space for trees - ZStream z // for messages - ){ - int result; - initWorkArea(19); - hn[0]=0; - result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); - - if(result == Z_DATA_ERROR){ - z.msg = "oversubscribed dynamic bit lengths tree"; - } - else if(result == Z_BUF_ERROR || bb[0] == 0){ - z.msg = "incomplete dynamic bit lengths tree"; - result = Z_DATA_ERROR; - } - return result; - } - - int inflate_trees_dynamic(int nl, // number of literal/length codes - int nd, // number of distance codes - int[] c, // that many (total) code lengths - int[] bl, // literal desired/actual bit depth - int[] bd, // distance desired/actual bit depth - int[] tl, // literal/length tree result - int[] td, // distance tree result - int[] hp, // space for trees - ZStream z // for messages - ){ - int result; - - // build literal/length tree - initWorkArea(288); - hn[0]=0; - result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); - if (result != Z_OK || bl[0] == 0){ - if(result == Z_DATA_ERROR){ - z.msg = "oversubscribed literal/length tree"; - } - else if (result != Z_MEM_ERROR){ - z.msg = "incomplete literal/length tree"; - result = Z_DATA_ERROR; - } - return result; - } - - // build distance tree - initWorkArea(288); - result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); - - if (result != Z_OK || (bd[0] == 0 && nl > 257)){ - if (result == Z_DATA_ERROR){ - z.msg = "oversubscribed distance tree"; - } - else if (result == Z_BUF_ERROR) { - z.msg = "incomplete distance tree"; - result = Z_DATA_ERROR; - } - else if (result != Z_MEM_ERROR){ - z.msg = "empty distance tree with lengths"; - result = Z_DATA_ERROR; - } - return result; - } - - return Z_OK; - } - - static int inflate_trees_fixed(int[] bl, //literal desired/actual bit depth - int[] bd, //distance desired/actual bit depth - int[][] tl,//literal/length tree result - int[][] td,//distance tree result - ZStream z //for memory allocation - ){ - bl[0]=fixed_bl; - bd[0]=fixed_bd; - tl[0]=fixed_tl; - td[0]=fixed_td; - return Z_OK; - } - - private void initWorkArea(int vsize){ - if(hn==null){ - hn=new int[1]; - v=new int[vsize]; - c=new int[BMAX+1]; - r=new int[3]; - u=new int[BMAX]; - x=new int[BMAX+1]; - } - if(v.length<vsize){ v=new int[vsize]; } - for(int i=0; i<vsize; i++){v[i]=0;} - for(int i=0; i<BMAX+1; i++){c[i]=0;} - for(int i=0; i<3; i++){r[i]=0;} -// for(int i=0; i<BMAX; i++){u[i]=0;} - System.arraycopy(c, 0, u, 0, BMAX); -// for(int i=0; i<BMAX+1; i++){x[i]=0;} - System.arraycopy(c, 0, x, 0, BMAX+1); - } -} diff --git a/java/src/com/jcraft/jzlib/Inflate.java b/java/src/com/jcraft/jzlib/Inflate.java deleted file mode 100644 index 30310f68..00000000 --- a/java/src/com/jcraft/jzlib/Inflate.java +++ /dev/null @@ -1,374 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class Inflate{ - - static final private int MAX_WBITS=15; // 32K LZ77 window - - // preset dictionary flag in zlib header - static final private int PRESET_DICT=0x20; - - static final int Z_NO_FLUSH=0; - static final int Z_PARTIAL_FLUSH=1; - static final int Z_SYNC_FLUSH=2; - static final int Z_FULL_FLUSH=3; - static final int Z_FINISH=4; - - static final private int Z_DEFLATED=8; - - static final private int Z_OK=0; - static final private int Z_STREAM_END=1; - static final private int Z_NEED_DICT=2; - static final private int Z_ERRNO=-1; - static final private int Z_STREAM_ERROR=-2; - static final private int Z_DATA_ERROR=-3; - static final private int Z_MEM_ERROR=-4; - static final private int Z_BUF_ERROR=-5; - static final private int Z_VERSION_ERROR=-6; - - static final private int METHOD=0; // waiting for method byte - static final private int FLAG=1; // waiting for flag byte - static final private int DICT4=2; // four dictionary check bytes to go - static final private int DICT3=3; // three dictionary check bytes to go - static final private int DICT2=4; // two dictionary check bytes to go - static final private int DICT1=5; // one dictionary check byte to go - static final private int DICT0=6; // waiting for inflateSetDictionary - static final private int BLOCKS=7; // decompressing blocks - static final private int CHECK4=8; // four check bytes to go - static final private int CHECK3=9; // three check bytes to go - static final private int CHECK2=10; // two check bytes to go - static final private int CHECK1=11; // one check byte to go - static final private int DONE=12; // finished check, done - static final private int BAD=13; // got an error--stay here - - int mode; // current inflate mode - - // mode dependent information - int method; // if FLAGS, method byte - - // if CHECK, check values to compare - long[] was=new long[1] ; // computed check value - long need; // stream check value - - // if BAD, inflateSync's marker bytes count - int marker; - - // mode independent information - int nowrap; // flag for no wrapper - int wbits; // log2(window size) (8..15, defaults to 15) - - InfBlocks blocks; // current inflate_blocks state - - int inflateReset(ZStream z){ - if(z == null || z.istate == null) return Z_STREAM_ERROR; - - z.total_in = z.total_out = 0; - z.msg = null; - z.istate.mode = z.istate.nowrap!=0 ? BLOCKS : METHOD; - z.istate.blocks.reset(z, null); - return Z_OK; - } - - int inflateEnd(ZStream z){ - if(blocks != null) - blocks.free(z); - blocks=null; - // ZFREE(z, z->state); - return Z_OK; - } - - int inflateInit(ZStream z, int w){ - z.msg = null; - blocks = null; - - // handle undocumented nowrap option (no zlib header or check) - nowrap = 0; - if(w < 0){ - w = - w; - nowrap = 1; - } - - // set window size - if(w<8 ||w>15){ - inflateEnd(z); - return Z_STREAM_ERROR; - } - wbits=w; - - z.istate.blocks=new InfBlocks(z, - z.istate.nowrap!=0 ? null : this, - 1<<w); - - // reset state - inflateReset(z); - return Z_OK; - } - - int inflate(ZStream z, int f){ - int r; - int b; - - if(z == null || z.istate == null || z.next_in == null) - return Z_STREAM_ERROR; - f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; - r = Z_BUF_ERROR; - while (true){ -//System.out.println("mode: "+z.istate.mode); - switch (z.istate.mode){ - case METHOD: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - if(((z.istate.method = z.next_in[z.next_in_index++])&0xf)!=Z_DEFLATED){ - z.istate.mode = BAD; - z.msg="unknown compression method"; - z.istate.marker = 5; // can't try inflateSync - break; - } - if((z.istate.method>>4)+8>z.istate.wbits){ - z.istate.mode = BAD; - z.msg="invalid window size"; - z.istate.marker = 5; // can't try inflateSync - break; - } - z.istate.mode=FLAG; - case FLAG: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - b = (z.next_in[z.next_in_index++])&0xff; - - if((((z.istate.method << 8)+b) % 31)!=0){ - z.istate.mode = BAD; - z.msg = "incorrect header check"; - z.istate.marker = 5; // can't try inflateSync - break; - } - - if((b&PRESET_DICT)==0){ - z.istate.mode = BLOCKS; - break; - } - z.istate.mode = DICT4; - case DICT4: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L; - z.istate.mode=DICT3; - case DICT3: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L; - z.istate.mode=DICT2; - case DICT2: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L; - z.istate.mode=DICT1; - case DICT1: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need += (z.next_in[z.next_in_index++]&0xffL); - z.adler = z.istate.need; - z.istate.mode = DICT0; - return Z_NEED_DICT; - case DICT0: - z.istate.mode = BAD; - z.msg = "need dictionary"; - z.istate.marker = 0; // can try inflateSync - return Z_STREAM_ERROR; - case BLOCKS: - - r = z.istate.blocks.proc(z, r); - if(r == Z_DATA_ERROR){ - z.istate.mode = BAD; - z.istate.marker = 0; // can try inflateSync - break; - } - if(r == Z_OK){ - r = f; - } - if(r != Z_STREAM_END){ - return r; - } - r = f; - z.istate.blocks.reset(z, z.istate.was); - if(z.istate.nowrap!=0){ - z.istate.mode=DONE; - break; - } - z.istate.mode=CHECK4; - case CHECK4: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L; - z.istate.mode=CHECK3; - case CHECK3: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L; - z.istate.mode = CHECK2; - case CHECK2: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L; - z.istate.mode = CHECK1; - case CHECK1: - - if(z.avail_in==0)return r;r=f; - - z.avail_in--; z.total_in++; - z.istate.need+=(z.next_in[z.next_in_index++]&0xffL); - - if(((int)(z.istate.was[0])) != ((int)(z.istate.need))){ - z.istate.mode = BAD; - z.msg = "incorrect data check"; - z.istate.marker = 5; // can't try inflateSync - break; - } - - z.istate.mode = DONE; - case DONE: - return Z_STREAM_END; - case BAD: - return Z_DATA_ERROR; - default: - return Z_STREAM_ERROR; - } - } - } - - - int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength){ - int index=0; - int length = dictLength; - if(z==null || z.istate == null|| z.istate.mode != DICT0) - return Z_STREAM_ERROR; - - if(z._adler.adler32(1L, dictionary, 0, dictLength)!=z.adler){ - return Z_DATA_ERROR; - } - - z.adler = z._adler.adler32(0, null, 0, 0); - - if(length >= (1<<z.istate.wbits)){ - length = (1<<z.istate.wbits)-1; - index=dictLength - length; - } - z.istate.blocks.set_dictionary(dictionary, index, length); - z.istate.mode = BLOCKS; - return Z_OK; - } - - static private byte[] mark = {(byte)0, (byte)0, (byte)0xff, (byte)0xff}; - - int inflateSync(ZStream z){ - int n; // number of bytes to look at - int p; // pointer to bytes - int m; // number of marker bytes found in a row - long r, w; // temporaries to save total_in and total_out - - // set up - if(z == null || z.istate == null) - return Z_STREAM_ERROR; - if(z.istate.mode != BAD){ - z.istate.mode = BAD; - z.istate.marker = 0; - } - if((n=z.avail_in)==0) - return Z_BUF_ERROR; - p=z.next_in_index; - m=z.istate.marker; - - // search - while (n!=0 && m < 4){ - if(z.next_in[p] == mark[m]){ - m++; - } - else if(z.next_in[p]!=0){ - m = 0; - } - else{ - m = 4 - m; - } - p++; n--; - } - - // restore - z.total_in += p-z.next_in_index; - z.next_in_index = p; - z.avail_in = n; - z.istate.marker = m; - - // return no joy or set up to restart on a new block - if(m != 4){ - return Z_DATA_ERROR; - } - r=z.total_in; w=z.total_out; - inflateReset(z); - z.total_in=r; z.total_out = w; - z.istate.mode = BLOCKS; - return Z_OK; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH - // but removes the length bytes of the resulting empty stored block. When - // decompressing, PPP checks that at the end of input packet, inflate is - // waiting for these length bytes. - int inflateSyncPoint(ZStream z){ - if(z == null || z.istate == null || z.istate.blocks == null) - return Z_STREAM_ERROR; - return z.istate.blocks.sync_point(); - } -} diff --git a/java/src/com/jcraft/jzlib/JZlib.java b/java/src/com/jcraft/jzlib/JZlib.java deleted file mode 100644 index b84d7a1f..00000000 --- a/java/src/com/jcraft/jzlib/JZlib.java +++ /dev/null @@ -1,67 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final public class JZlib{ - private static final String version="1.0.2"; - public static String version(){return version;} - - // compression levels - static final public int Z_NO_COMPRESSION=0; - static final public int Z_BEST_SPEED=1; - static final public int Z_BEST_COMPRESSION=9; - static final public int Z_DEFAULT_COMPRESSION=(-1); - - // compression strategy - static final public int Z_FILTERED=1; - static final public int Z_HUFFMAN_ONLY=2; - static final public int Z_DEFAULT_STRATEGY=0; - - static final public int Z_NO_FLUSH=0; - static final public int Z_PARTIAL_FLUSH=1; - static final public int Z_SYNC_FLUSH=2; - static final public int Z_FULL_FLUSH=3; - static final public int Z_FINISH=4; - - static final public int Z_OK=0; - static final public int Z_STREAM_END=1; - static final public int Z_NEED_DICT=2; - static final public int Z_ERRNO=-1; - static final public int Z_STREAM_ERROR=-2; - static final public int Z_DATA_ERROR=-3; - static final public int Z_MEM_ERROR=-4; - static final public int Z_BUF_ERROR=-5; - static final public int Z_VERSION_ERROR=-6; -} diff --git a/java/src/com/jcraft/jzlib/LICENSE.txt b/java/src/com/jcraft/jzlib/LICENSE.txt deleted file mode 100644 index cdce5007..00000000 --- a/java/src/com/jcraft/jzlib/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -JZlib 0.0.* were released under the GNU LGPL license. Later, we have switched -over to a BSD-style license. - ------------------------------------------------------------------------------- -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/java/src/com/jcraft/jzlib/README b/java/src/com/jcraft/jzlib/README deleted file mode 100644 index 45027db9..00000000 --- a/java/src/com/jcraft/jzlib/README +++ /dev/null @@ -1,124 +0,0 @@ - - JZlib - - zlib in pure Java(TM) - by ymnk@jcraft.com, JCraft,Inc. - - http://www.jcraft.com/jzlib/ - -Last modified: Fri Feb 14 13:31:26 UTC 2003 - -Description -=========== -JZlib is a re-implementation of zlib in pure Java. -The first and final aim for hacking this stuff is -to add the packet compression support to pure Java SSH systems. - - -Documentation -============= -* README files all over the source tree have info related to the stuff - in the directories. -* ChangeLog: what changed from the previous version? -* LICENSE.txt - - -Directories & Files in the Source Tree -====================================== -* com/ has source trees of JZlib. -* example/ has some samples, which demonstrate the usages. -* misc/ has some stuffs. At present, this directory includes - a patch file for MindTerm v.1.2.1, which adds the packet compression - functionality. - - -Features -======== -* Needless to say, JZlib can inflate data, which is deflated by zlib and - JZlib can generate deflated data, which is acceptable and inflated by zlib. -* JZlib supports all compression level and all flushing mode in zlib. -* JZlib does not support gzip file handling supports. -* The performance has not been estimated yet, but it will be not so bad - in deflating/inflating data stream on the low bandwidth network. -* JZlib is licensed under BSD style license. -* Any invention has not been done in developing JZlib. - So, if zlib is patent free, JZlib is also not covered by any patents. - - -Why JZlib? -========== -Java Platform API provides packages 'java.util.zip.*' for -accessing to zlib, but that support is very limited -if you need to use the essence of zlib. For example, -we needed to full access to zlib to add the packet compression -support to pure Java SSH system, but they are useless for our requirements. -The Internet draft, SSH Transport Layer Protocol, says in the section '4.2 Compression' as follows, - - The following compression methods are currently defined: - none REQUIRED no compression - zlib OPTIONAL GNU ZLIB (LZ77) compression - The "zlib" compression is described in [RFC-1950] and in [RFC-1951]. The - compression context is initialized after each key exchange, and is - passed from one packet to the next with only a partial flush being - performed at the end of each packet. A partial flush means that all data - will be output, but the next packet will continue using compression - tables from the end of the previous packet. - -To implement this functionality, the Z_PARTIAL_FLUSH mode of zlib must be -used, however JDK does not permit us to do so. It seems that this problem has -been well known and some people have already reported to -JavaSoft's BugParade(for example, BugId:4255743), -but any positive response has not been returned from JavaSoft, -so this problem will not be solved forever. -This is our motivation to hack JZlib. - - -A unofficial patch for MindTerm v.1.2.1 -======================================= -A unofficial patch file for MindTerm v.1.2.1 has included in 'misc' directory. -It adds the packet compression support to MindTerm. -Please refer to 'misc/README' file. - - -Copyrights & Disclaimers -======================== -JZlib is copyrighted by ymnk, JCraft,Inc. and is licensed through BSD -style license. Read the LICENSE.txt file for the complete license. -ZInputStream and ZOutputStream classes were contributed by Lapo Luchini. - - -Credits -======= -JZlib has been developed by ymnk@jcraft.com, -but he has just re-implemented zlib in pure Java. -So, all credit should go to authors Jean-loup Gailly and Mark Adler -and contributors of zlib. Here is the copyright notice of zlib version 1.1.3, - - |Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - | - |This software is provided 'as-is', without any express or implied - |warranty. In no event will the authors be held liable for any damages - |arising from the use of this software. - | - |Permission is granted to anyone to use this software for any purpose, - |including commercial applications, and to alter it and redistribute it - |freely, subject to the following restrictions: - | - |1. The origin of this software must not be misrepresented; you must not - | claim that you wrote the original software. If you use this software - | in a product, an acknowledgment in the product documentation would be - | appreciated but is not required. - |2. Altered source versions must be plainly marked as such, and must not be - | misrepresented as being the original software. - |3. This notice may not be removed or altered from any source distribution. - | - |Jean-loup Gailly Mark Adler - |jloup@gzip.org madler@alumni.caltech.edu - - -If you have any comments, suggestions and questions, write us -at jzlib@jcraft.com - - -``SSH is a registered trademark and Secure Shell is a trademark of -SSH Communications Security Corp (www.ssh.com)''. diff --git a/java/src/com/jcraft/jzlib/StaticTree.java b/java/src/com/jcraft/jzlib/StaticTree.java deleted file mode 100644 index 0f7f5779..00000000 --- a/java/src/com/jcraft/jzlib/StaticTree.java +++ /dev/null @@ -1,149 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class StaticTree{ - static final private int MAX_BITS=15; - - static final private int BL_CODES=19; - static final private int D_CODES=30; - static final private int LITERALS=256; - static final private int LENGTH_CODES=29; - static final private int L_CODES=(LITERALS+1+LENGTH_CODES); - - // Bit length codes must not exceed MAX_BL_BITS bits - static final int MAX_BL_BITS=7; - - static final short[] static_ltree = { - 12, 8, 140, 8, 76, 8, 204, 8, 44, 8, - 172, 8, 108, 8, 236, 8, 28, 8, 156, 8, - 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, - 252, 8, 2, 8, 130, 8, 66, 8, 194, 8, - 34, 8, 162, 8, 98, 8, 226, 8, 18, 8, - 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, - 114, 8, 242, 8, 10, 8, 138, 8, 74, 8, - 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, - 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, - 186, 8, 122, 8, 250, 8, 6, 8, 134, 8, - 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, - 230, 8, 22, 8, 150, 8, 86, 8, 214, 8, - 54, 8, 182, 8, 118, 8, 246, 8, 14, 8, - 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, - 110, 8, 238, 8, 30, 8, 158, 8, 94, 8, - 222, 8, 62, 8, 190, 8, 126, 8, 254, 8, - 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, - 161, 8, 97, 8, 225, 8, 17, 8, 145, 8, - 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, - 241, 8, 9, 8, 137, 8, 73, 8, 201, 8, - 41, 8, 169, 8, 105, 8, 233, 8, 25, 8, - 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, - 121, 8, 249, 8, 5, 8, 133, 8, 69, 8, - 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, - 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, - 181, 8, 117, 8, 245, 8, 13, 8, 141, 8, - 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, - 237, 8, 29, 8, 157, 8, 93, 8, 221, 8, - 61, 8, 189, 8, 125, 8, 253, 8, 19, 9, - 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, - 211, 9, 467, 9, 51, 9, 307, 9, 179, 9, - 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, - 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, - 331, 9, 203, 9, 459, 9, 43, 9, 299, 9, - 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, - 491, 9, 27, 9, 283, 9, 155, 9, 411, 9, - 91, 9, 347, 9, 219, 9, 475, 9, 59, 9, - 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, - 251, 9, 507, 9, 7, 9, 263, 9, 135, 9, - 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, - 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, - 359, 9, 231, 9, 487, 9, 23, 9, 279, 9, - 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, - 471, 9, 55, 9, 311, 9, 183, 9, 439, 9, - 119, 9, 375, 9, 247, 9, 503, 9, 15, 9, - 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, - 207, 9, 463, 9, 47, 9, 303, 9, 175, 9, - 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, - 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, - 351, 9, 223, 9, 479, 9, 63, 9, 319, 9, - 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, - 511, 9, 0, 7, 64, 7, 32, 7, 96, 7, - 16, 7, 80, 7, 48, 7, 112, 7, 8, 7, - 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, - 56, 7, 120, 7, 4, 7, 68, 7, 36, 7, - 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, - 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, - 163, 8, 99, 8, 227, 8 - }; - - static final short[] static_dtree = { - 0, 5, 16, 5, 8, 5, 24, 5, 4, 5, - 20, 5, 12, 5, 28, 5, 2, 5, 18, 5, - 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, - 30, 5, 1, 5, 17, 5, 9, 5, 25, 5, - 5, 5, 21, 5, 13, 5, 29, 5, 3, 5, - 19, 5, 11, 5, 27, 5, 7, 5, 23, 5 - }; - - static StaticTree static_l_desc = - new StaticTree(static_ltree, Tree.extra_lbits, - LITERALS+1, L_CODES, MAX_BITS); - - static StaticTree static_d_desc = - new StaticTree(static_dtree, Tree.extra_dbits, - 0, D_CODES, MAX_BITS); - - static StaticTree static_bl_desc = - new StaticTree(null, Tree.extra_blbits, - 0, BL_CODES, MAX_BL_BITS); - - short[] static_tree; // static tree or null - int[] extra_bits; // extra bits for each code or null - int extra_base; // base index for extra_bits - int elems; // max number of elements in the tree - int max_length; // max bit length for the codes - - StaticTree(short[] static_tree, - int[] extra_bits, - int extra_base, - int elems, - int max_length - ){ - this.static_tree=static_tree; - this.extra_bits=extra_bits; - this.extra_base=extra_base; - this.elems=elems; - this.max_length=max_length; - } -} diff --git a/java/src/com/jcraft/jzlib/Tree.java b/java/src/com/jcraft/jzlib/Tree.java deleted file mode 100644 index 81038978..00000000 --- a/java/src/com/jcraft/jzlib/Tree.java +++ /dev/null @@ -1,365 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final class Tree{ - static final private int MAX_BITS=15; - static final private int BL_CODES=19; - static final private int D_CODES=30; - static final private int LITERALS=256; - static final private int LENGTH_CODES=29; - static final private int L_CODES=(LITERALS+1+LENGTH_CODES); - static final private int HEAP_SIZE=(2*L_CODES+1); - - // Bit length codes must not exceed MAX_BL_BITS bits - static final int MAX_BL_BITS=7; - - // end of block literal code - static final int END_BLOCK=256; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - static final int REP_3_6=16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - static final int REPZ_3_10=17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - static final int REPZ_11_138=18; - - // extra bits for each length code - static final int[] extra_lbits={ - 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0 - }; - - // extra bits for each distance code - static final int[] extra_dbits={ - 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 - }; - - // extra bits for each bit length code - static final int[] extra_blbits={ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7 - }; - - static final byte[] bl_order={ - 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; - - - // The lengths of the bit length codes are sent in order of decreasing - // probability, to avoid transmitting the lengths for unused bit - // length codes. - - static final int Buf_size=8*2; - - // see definition of array dist_code below - static final int DIST_CODE_LEN=512; - - static final byte[] _dist_code = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, - 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 - }; - - static final byte[] _length_code={ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, - 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, - 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 - }; - - static final int[] base_length = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, - 64, 80, 96, 112, 128, 160, 192, 224, 0 - }; - - static final int[] base_dist = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 - }; - - // Mapping from a distance to a distance code. dist is the distance - 1 and - // must not have side effects. _dist_code[256] and _dist_code[257] are never - // used. - static int d_code(int dist){ - return ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>>7)]); - } - - short[] dyn_tree; // the dynamic tree - int max_code; // largest code with non zero frequency - StaticTree stat_desc; // the corresponding static tree - - // Compute the optimal bit lengths for a tree and update the total bit length - // for the current block. - // IN assertion: the fields freq and dad are set, heap[heap_max] and - // above are the tree nodes sorted by increasing frequency. - // OUT assertions: the field len is set to the optimal bit length, the - // array bl_count contains the frequencies for each bit length. - // The length opt_len is updated; static_len is also updated if stree is - // not null. - void gen_bitlen(Deflate s){ - short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int[] extra = stat_desc.extra_bits; - int base = stat_desc.extra_base; - int max_length = stat_desc.max_length; - int h; // heap index - int n, m; // iterate over the tree elements - int bits; // bit length - int xbits; // extra bits - short f; // frequency - int overflow = 0; // number of elements with bit length too large - - for (bits = 0; bits <= MAX_BITS; bits++) s.bl_count[bits] = 0; - - // In a first pass, compute the optimal bit lengths (which may - // overflow in the case of the bit length tree). - tree[s.heap[s.heap_max]*2+1] = 0; // root of the heap - - for(h=s.heap_max+1; h<HEAP_SIZE; h++){ - n = s.heap[h]; - bits = tree[tree[n*2+1]*2+1] + 1; - if (bits > max_length){ bits = max_length; overflow++; } - tree[n*2+1] = (short)bits; - // We overwrite tree[n*2+1] which is no longer needed - - if (n > max_code) continue; // not a leaf node - - s.bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n*2]; - s.opt_len += f * (bits + xbits); - if (stree!=null) s.static_len += f * (stree[n*2+1] + xbits); - } - if (overflow == 0) return; - - // This happens for example on obj2 and pic of the Calgary corpus - // Find the first bit length which could increase: - do { - bits = max_length-1; - while(s.bl_count[bits]==0) bits--; - s.bl_count[bits]--; // move one leaf down the tree - s.bl_count[bits+1]+=2; // move one overflow item as its brother - s.bl_count[max_length]--; - // The brother of the overflow item also moves one step up, - // but this does not affect bl_count[max_length] - overflow -= 2; - } - while (overflow > 0); - - for (bits = max_length; bits != 0; bits--) { - n = s.bl_count[bits]; - while (n != 0) { - m = s.heap[--h]; - if (m > max_code) continue; - if (tree[m*2+1] != bits) { - s.opt_len += ((long)bits - (long)tree[m*2+1])*(long)tree[m*2]; - tree[m*2+1] = (short)bits; - } - n--; - } - } - } - - // Construct one Huffman tree and assigns the code bit strings and lengths. - // Update the total bit length for the current block. - // IN assertion: the field freq is set for all tree elements. - // OUT assertions: the fields len and code are set to the optimal bit length - // and corresponding code. The length opt_len is updated; static_len is - // also updated if stree is not null. The field max_code is set. - void build_tree(Deflate s){ - short[] tree=dyn_tree; - short[] stree=stat_desc.static_tree; - int elems=stat_desc.elems; - int n, m; // iterate over heap elements - int max_code=-1; // largest code with non zero frequency - int node; // new node being created - - // Construct the initial heap, with least frequent element in - // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - // heap[0] is not used. - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for(n=0; n<elems; n++) { - if(tree[n*2] != 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } - else{ - tree[n*2+1] = 0; - } - } - - // The pkzip format requires that at least one distance code exists, - // and that at least one bit should be sent even if there is only one - // possible code. So to avoid special checks later on we force at least - // two codes of non zero frequency. - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node*2] = 1; - s.depth[node] = 0; - s.opt_len--; if (stree!=null) s.static_len -= stree[node*2+1]; - // node is 0 or 1 so it does not have extra bits - } - this.max_code = max_code; - - // The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - // establish sub-heaps of increasing lengths: - - for(n=s.heap_len/2;n>=1; n--) - s.pqdownheap(tree, n); - - // Construct the Huffman tree by repeatedly combining the least two - // frequent nodes. - - node=elems; // next internal node of the tree - do{ - // n = node of least frequency - n=s.heap[1]; - s.heap[1]=s.heap[s.heap_len--]; - s.pqdownheap(tree, 1); - m=s.heap[1]; // m = node of next least frequency - - s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency - s.heap[--s.heap_max] = m; - - // Create a new node father of n and m - tree[node*2] = (short)(tree[n*2] + tree[m*2]); - s.depth[node] = (byte)(Math.max(s.depth[n],s.depth[m])+1); - tree[n*2+1] = tree[m*2+1] = (short)node; - - // and insert the new node in the heap - s.heap[1] = node++; - s.pqdownheap(tree, 1); - } - while(s.heap_len>=2); - - s.heap[--s.heap_max] = s.heap[1]; - - // At this point, the fields freq and dad are set. We can now - // generate the bit lengths. - - gen_bitlen(s); - - // The field len is now set, we can generate the bit codes - gen_codes(tree, max_code, s.bl_count); - } - - // Generate the codes for a given tree and bit counts (which need not be - // optimal). - // IN assertion: the array bl_count contains the bit length statistics for - // the given tree and the field len is set for all tree elements. - // OUT assertion: the field code is set for all tree elements of non - // zero code length. - static void gen_codes(short[] tree, // the tree to decorate - int max_code, // largest code with non zero frequency - short[] bl_count // number of codes at each bit length - ){ - short[] next_code=new short[MAX_BITS+1]; // next code value for each bit length - short code = 0; // running code value - int bits; // bit index - int n; // code index - - // The distribution counts are first used to generate the code values - // without bit reversal. - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (short)((code + bl_count[bits-1]) << 1); - } - - // Check that the bit counts in bl_count are consistent. The last code - // must be all ones. - //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, - // "inconsistent bit counts"); - //Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); - - for (n = 0; n <= max_code; n++) { - int len = tree[n*2+1]; - if (len == 0) continue; - // Now reverse the bits - tree[n*2] = (short)(bi_reverse(next_code[len]++, len)); - } - } - - // Reverse the first len bits of a code, using straightforward code (a faster - // method would use a table) - // IN assertion: 1 <= len <= 15 - static int bi_reverse(int code, // the value to invert - int len // its bit length - ){ - int res = 0; - do{ - res|=code&1; - code>>>=1; - res<<=1; - } - while(--len>0); - return res>>>1; - } -} - diff --git a/java/src/com/jcraft/jzlib/ZInputStream.java b/java/src/com/jcraft/jzlib/ZInputStream.java deleted file mode 100644 index 3f97c448..00000000 --- a/java/src/com/jcraft/jzlib/ZInputStream.java +++ /dev/null @@ -1,149 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ -/* -Copyright (c) 2001 Lapo Luchini. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS -OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; -import java.io.*; - -public class ZInputStream extends FilterInputStream { - - protected ZStream z=new ZStream(); - protected int bufsize=512; - protected int flush=JZlib.Z_NO_FLUSH; - protected byte[] buf=new byte[bufsize], - buf1=new byte[1]; - protected boolean compress; - - protected InputStream in=null; - - public ZInputStream(InputStream in) { - this(in, false); - } - public ZInputStream(InputStream in, boolean nowrap) { - super(in); - this.in=in; - z.inflateInit(nowrap); - compress=false; - z.next_in=buf; - z.next_in_index=0; - z.avail_in=0; - } - - public ZInputStream(InputStream in, int level) { - super(in); - this.in=in; - z.deflateInit(level); - compress=true; - z.next_in=buf; - z.next_in_index=0; - z.avail_in=0; - } - - /*public int available() throws IOException { - return inf.finished() ? 0 : 1; - }*/ - - public int read() throws IOException { - if(read(buf1, 0, 1)==-1) - return(-1); - return(buf1[0]&0xFF); - } - - private boolean nomoreinput=false; - - public int read(byte[] b, int off, int len) throws IOException { - if(len==0) - return(0); - int err; - z.next_out=b; - z.next_out_index=off; - z.avail_out=len; - do { - if((z.avail_in==0)&&(!nomoreinput)) { // if buffer is empty and more input is avaiable, refill it - z.next_in_index=0; - z.avail_in=in.read(buf, 0, bufsize);//(bufsize<z.avail_out ? bufsize : z.avail_out)); - if(z.avail_in==-1) { - z.avail_in=0; - nomoreinput=true; - } - } - if(compress) - err=z.deflate(flush); - else - err=z.inflate(flush); - if(nomoreinput&&(err==JZlib.Z_BUF_ERROR)) - return(-1); - if(err!=JZlib.Z_OK && err!=JZlib.Z_STREAM_END) - throw new ZStreamException((compress ? "de" : "in")+"flating: "+z.msg); - if((nomoreinput||err==JZlib.Z_STREAM_END)&&(z.avail_out==len)) - return(-1); - } - while(z.avail_out==len&&err==JZlib.Z_OK); - //System.err.print("("+(len-z.avail_out)+")"); - return(len-z.avail_out); - } - - public long skip(long n) throws IOException { - int len=512; - if(n<len) - len=(int)n; - byte[] tmp=new byte[len]; - return((long)read(tmp)); - } - - public int getFlushMode() { - return(flush); - } - - public void setFlushMode(int flush) { - this.flush=flush; - } - - /** - * Returns the total number of bytes input so far. - */ - public long getTotalIn() { - return z.total_in; - } - - /** - * Returns the total number of bytes output so far. - */ - public long getTotalOut() { - return z.total_out; - } - - public void close() throws IOException{ - in.close(); - } -} diff --git a/java/src/com/jcraft/jzlib/ZOutputStream.java b/java/src/com/jcraft/jzlib/ZOutputStream.java deleted file mode 100644 index afee65b3..00000000 --- a/java/src/com/jcraft/jzlib/ZOutputStream.java +++ /dev/null @@ -1,156 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ -/* -Copyright (c) 2001 Lapo Luchini. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS -OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; -import java.io.*; - -public class ZOutputStream extends OutputStream { - - protected ZStream z=new ZStream(); - protected int bufsize=512; - protected int flush=JZlib.Z_NO_FLUSH; - protected byte[] buf=new byte[bufsize], - buf1=new byte[1]; - protected boolean compress; - - protected OutputStream out; - - public ZOutputStream(OutputStream out) { - super(); - this.out=out; - z.inflateInit(); - compress=false; - } - - public ZOutputStream(OutputStream out, int level) { - this(out, level, false); - } - public ZOutputStream(OutputStream out, int level, boolean nowrap) { - super(); - this.out=out; - z.deflateInit(level, nowrap); - compress=true; - } - - public void write(int b) throws IOException { - buf1[0]=(byte)b; - write(buf1, 0, 1); - } - - public void write(byte b[], int off, int len) throws IOException { - if(len==0) - return; - int err; - z.next_in=b; - z.next_in_index=off; - z.avail_in=len; - do{ - z.next_out=buf; - z.next_out_index=0; - z.avail_out=bufsize; - if(compress) - err=z.deflate(flush); - else - err=z.inflate(flush); - if(err!=JZlib.Z_OK) - throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg); - out.write(buf, 0, bufsize-z.avail_out); - } - while(z.avail_in>0 || z.avail_out==0); - } - - public int getFlushMode() { - return(flush); - } - - public void setFlushMode(int flush) { - this.flush=flush; - } - - public void finish() throws IOException { - int err; - do{ - z.next_out=buf; - z.next_out_index=0; - z.avail_out=bufsize; - if(compress){ err=z.deflate(JZlib.Z_FINISH); } - else{ err=z.inflate(JZlib.Z_FINISH); } - if(err!=JZlib.Z_STREAM_END && err != JZlib.Z_OK) - throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg); - if(bufsize-z.avail_out>0){ - out.write(buf, 0, bufsize-z.avail_out); - } - } - while(z.avail_in>0 || z.avail_out==0); - flush(); - } - public void end() { - if(z==null) - return; - if(compress){ z.deflateEnd(); } - else{ z.inflateEnd(); } - z.free(); - z=null; - } - public void close() throws IOException { - try{ - try{finish();} - catch (IOException ignored) {} - } - finally{ - end(); - out.close(); - out=null; - } - } - - /** - * Returns the total number of bytes input so far. - */ - public long getTotalIn() { - return z.total_in; - } - - /** - * Returns the total number of bytes output so far. - */ - public long getTotalOut() { - return z.total_out; - } - - public void flush() throws IOException { - out.flush(); - } - -} diff --git a/java/src/com/jcraft/jzlib/ZStream.java b/java/src/com/jcraft/jzlib/ZStream.java deleted file mode 100644 index 334475e9..00000000 --- a/java/src/com/jcraft/jzlib/ZStream.java +++ /dev/null @@ -1,211 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -final public class ZStream{ - - static final private int MAX_WBITS=15; // 32K LZ77 window - static final private int DEF_WBITS=MAX_WBITS; - - static final private int Z_NO_FLUSH=0; - static final private int Z_PARTIAL_FLUSH=1; - static final private int Z_SYNC_FLUSH=2; - static final private int Z_FULL_FLUSH=3; - static final private int Z_FINISH=4; - - static final private int MAX_MEM_LEVEL=9; - - static final private int Z_OK=0; - static final private int Z_STREAM_END=1; - static final private int Z_NEED_DICT=2; - static final private int Z_ERRNO=-1; - static final private int Z_STREAM_ERROR=-2; - static final private int Z_DATA_ERROR=-3; - static final private int Z_MEM_ERROR=-4; - static final private int Z_BUF_ERROR=-5; - static final private int Z_VERSION_ERROR=-6; - - public byte[] next_in; // next input byte - public int next_in_index; - public int avail_in; // number of bytes available at next_in - public long total_in; // total nb of input bytes read so far - - public byte[] next_out; // next output byte should be put there - public int next_out_index; - public int avail_out; // remaining free space at next_out - public long total_out; // total nb of bytes output so far - - public String msg; - - Deflate dstate; - Inflate istate; - - int data_type; // best guess about the data type: ascii or binary - - public long adler; - Adler32 _adler=new Adler32(); - - public int inflateInit(){ - return inflateInit(DEF_WBITS); - } - public int inflateInit(boolean nowrap){ - return inflateInit(DEF_WBITS, nowrap); - } - public int inflateInit(int w){ - return inflateInit(w, false); - } - - public int inflateInit(int w, boolean nowrap){ - istate=new Inflate(); - return istate.inflateInit(this, nowrap?-w:w); - } - - public int inflate(int f){ - if(istate==null) return Z_STREAM_ERROR; - return istate.inflate(this, f); - } - public int inflateEnd(){ - if(istate==null) return Z_STREAM_ERROR; - int ret=istate.inflateEnd(this); - istate = null; - return ret; - } - public int inflateSync(){ - if(istate == null) - return Z_STREAM_ERROR; - return istate.inflateSync(this); - } - public int inflateSetDictionary(byte[] dictionary, int dictLength){ - if(istate == null) - return Z_STREAM_ERROR; - return istate.inflateSetDictionary(this, dictionary, dictLength); - } - - public int deflateInit(int level){ - return deflateInit(level, MAX_WBITS); - } - public int deflateInit(int level, boolean nowrap){ - return deflateInit(level, MAX_WBITS, nowrap); - } - public int deflateInit(int level, int bits){ - return deflateInit(level, bits, false); - } - public int deflateInit(int level, int bits, boolean nowrap){ - dstate=new Deflate(); - return dstate.deflateInit(this, level, nowrap?-bits:bits); - } - public int deflate(int flush){ - if(dstate==null){ - return Z_STREAM_ERROR; - } - return dstate.deflate(this, flush); - } - public int deflateEnd(){ - if(dstate==null) return Z_STREAM_ERROR; - int ret=dstate.deflateEnd(); - dstate=null; - return ret; - } - public int deflateParams(int level, int strategy){ - if(dstate==null) return Z_STREAM_ERROR; - return dstate.deflateParams(this, level, strategy); - } - public int deflateSetDictionary (byte[] dictionary, int dictLength){ - if(dstate == null) - return Z_STREAM_ERROR; - return dstate.deflateSetDictionary(this, dictionary, dictLength); - } - - // Flush as much pending output as possible. All deflate() output goes - // through this function so some applications may wish to modify it - // to avoid allocating a large strm->next_out buffer and copying into it. - // (See also read_buf()). - void flush_pending(){ - int len=dstate.pending; - - if(len>avail_out) len=avail_out; - if(len==0) return; - - if(dstate.pending_buf.length<=dstate.pending_out || - next_out.length<=next_out_index || - dstate.pending_buf.length<(dstate.pending_out+len) || - next_out.length<(next_out_index+len)){ - System.out.println(dstate.pending_buf.length+", "+dstate.pending_out+ - ", "+next_out.length+", "+next_out_index+", "+len); - System.out.println("avail_out="+avail_out); - } - - System.arraycopy(dstate.pending_buf, dstate.pending_out, - next_out, next_out_index, len); - - next_out_index+=len; - dstate.pending_out+=len; - total_out+=len; - avail_out-=len; - dstate.pending-=len; - if(dstate.pending==0){ - dstate.pending_out=0; - } - } - - // Read a new buffer from the current input stream, update the adler32 - // and total number of bytes read. All deflate() input goes through - // this function so some applications may wish to modify it to avoid - // allocating a large strm->next_in buffer and copying from it. - // (See also flush_pending()). - int read_buf(byte[] buf, int start, int size) { - int len=avail_in; - - if(len>size) len=size; - if(len==0) return 0; - - avail_in-=len; - - if(dstate.noheader==0) { - adler=_adler.adler32(adler, next_in, next_in_index, len); - } - System.arraycopy(next_in, next_in_index, buf, start, len); - next_in_index += len; - total_in += len; - return len; - } - - public void free(){ - next_in=null; - next_out=null; - msg=null; - _adler=null; - } -} diff --git a/java/src/com/jcraft/jzlib/ZStreamException.java b/java/src/com/jcraft/jzlib/ZStreamException.java deleted file mode 100644 index 308bb8a1..00000000 --- a/java/src/com/jcraft/jzlib/ZStreamException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -public class ZStreamException extends java.io.IOException { - public ZStreamException() { - super(); - } - public ZStreamException(String s) { - super(s); - } -} diff --git a/java/src/com/tigervnc/rdr/EndOfStream.java b/java/src/com/tigervnc/rdr/EndOfStream.java deleted file mode 100644 index bdcf7c27..00000000 --- a/java/src/com/tigervnc/rdr/EndOfStream.java +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rdr; - -public class EndOfStream extends Exception { - public EndOfStream() { - super("EndOfStream"); - } -} diff --git a/java/src/com/tigervnc/rdr/Exception.java b/java/src/com/tigervnc/rdr/Exception.java deleted file mode 100644 index a5fe938d..00000000 --- a/java/src/com/tigervnc/rdr/Exception.java +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rdr; - -public class Exception extends RuntimeException { - public Exception(String s) { - super(s); - } -} diff --git a/java/src/com/tigervnc/rdr/IOException.java b/java/src/com/tigervnc/rdr/IOException.java deleted file mode 100644 index 6343d7a4..00000000 --- a/java/src/com/tigervnc/rdr/IOException.java +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rdr; - -class IOException extends Exception { - public IOException(java.io.IOException ex_) { - super(ex_.toString()); - ex = ex_; - } - java.io.IOException ex; -} diff --git a/java/src/com/tigervnc/rdr/InStream.java b/java/src/com/tigervnc/rdr/InStream.java deleted file mode 100644 index 1e0d226e..00000000 --- a/java/src/com/tigervnc/rdr/InStream.java +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// rdr::InStream marshalls data from a buffer stored in RDR (RFB Data -// Representation). -// - -package com.tigervnc.rdr; - -abstract public class InStream { - - // check() ensures there is buffer data for at least one item of size - // itemSize bytes. Returns the number of items in the buffer (up to a - // maximum of nItems). - - public int check(int itemSize, int nItems, boolean wait) { - if (ptr + itemSize * nItems > end) { - if (ptr + itemSize > end) - return overrun(itemSize, nItems, wait); - - nItems = (end - ptr) / itemSize; - } - return nItems; - } - - public int check(int itemSize, int nItems) { return check(itemSize, nItems, true); } - public int check(int itemSize) { return check(itemSize, 1); } - - // checkNoWait() tries to make sure that the given number of bytes can - // be read without blocking. It returns true if this is the case, false - // otherwise. The length must be "small" (less than the buffer size). - - public final boolean checkNoWait(int length) { return check(length, 1, false)!=0; } - - // readU/SN() methods read unsigned and signed N-bit integers. - - public final int readS8() { check(1); return b[ptr++]; } - public final int readS16() { check(2); int b0 = b[ptr++]; - int b1 = b[ptr++] & 0xff; return b0 << 8 | b1; } - public final int readS32() { check(4); int b0 = b[ptr++]; - int b1 = b[ptr++] & 0xff; - int b2 = b[ptr++] & 0xff; - int b3 = b[ptr++] & 0xff; - return b0 << 24 | b1 << 16 | b2 << 8 | b3; } - - public final int readU8() { return readS8() & 0xff; } - public final int readU16() { return readS16() & 0xffff; } - public final int readU32() { return readS32() & 0xffffffff; } - - // readString() reads a string - a U32 length followed by the data. - - public final String readString() { - int len = readU32(); - if (len > maxStringLength) - throw new Exception("InStream max string length exceeded"); - - byte[] str = new byte[len]; - readBytes(str, 0, len); - String utf8string = new String(); - try { - utf8string = new String(str,"UTF8"); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - return utf8string; - } - - // maxStringLength protects against allocating a huge buffer. Set it - // higher if you need longer strings. - - public static int maxStringLength = 65535; - - public final void skip(int bytes) { - while (bytes > 0) { - int n = check(1, bytes); - ptr += n; - bytes -= n; - } - } - - // readBytes() reads an exact number of bytes into an array at an offset. - - public void readBytes(byte[] data, int dataPtr, int length) { - int dataEnd = dataPtr + length; - while (dataPtr < dataEnd) { - int n = check(1, dataEnd - dataPtr); - System.arraycopy(b, ptr, data, dataPtr, n); - ptr += n; - dataPtr += n; - } - } - - public void readBytes(int[] data, int dataPtr, int length) { - int dataEnd = dataPtr + length; - while (dataPtr < dataEnd) { - int n = check(1, dataEnd - dataPtr); - System.arraycopy(b, ptr, data, dataPtr, n); - ptr += n; - dataPtr += n; - } - } - - // readOpaqueN() reads a quantity "without byte-swapping". Because java has - // no byte-ordering, we just use big-endian. - - public final int readOpaque8() { return readU8(); } - public final int readOpaque16() { return readU16(); } - public final int readOpaque32() { return readU32(); } - public final int readOpaque24A() { check(3); int b0 = b[ptr++]; - int b1 = b[ptr++]; int b2 = b[ptr++]; - return b0 << 24 | b1 << 16 | b2 << 8; } - public final int readOpaque24B() { check(3); int b0 = b[ptr++]; - int b1 = b[ptr++]; int b2 = b[ptr++]; - return b0 << 16 | b1 << 8 | b2; } - - public final int readPixel(int bytesPerPixel, boolean e) { - int[] pix = new int[4]; - for (int i=0; i < bytesPerPixel; i++) - pix[i] = readU8(); - if (e) { - return pix[0] << 16 | pix[1] << 8 | pix[2] | (0xff << 24); - } else { - return pix[2] << 16 | pix[1] << 8 | pix[0] | (0xff << 24); - } - } - - public final void readPixels(int[] buf, int length, int bytesPerPixel, boolean e) { - for (int i = 0; i < length; i++) - buf[i] = readPixel(bytesPerPixel, e); - } - - public final int readCompactLength() { - int b = readU8(); - int result = b & 0x7F; - if ((b & 0x80) != 0) { - b = readU8(); - result |= (b & 0x7F) << 7; - if ((b & 0x80) != 0) { - b = readU8(); - result |= (b & 0xFF) << 14; - } - } - return result; - } - - // pos() returns the position in the stream. - - abstract public int pos(); - - // bytesAvailable() returns true if at least one byte can be read from the - // stream without blocking. i.e. if false is returned then readU8() would - // block. - - public boolean bytesAvailable() { return end != ptr; } - - // getbuf(), getptr(), getend() and setptr() are "dirty" methods which allow - // you to manipulate the buffer directly. This is useful for a stream which - // is a wrapper around an underlying stream. - - public final byte[] getbuf() { return b; } - public final int getptr() { return ptr; } - public final int getend() { return end; } - public final void setptr(int p) { ptr = p; } - - // overrun() is implemented by a derived class to cope with buffer overrun. - // It ensures there are at least itemSize bytes of buffer data. Returns - // the number of items in the buffer (up to a maximum of nItems). itemSize - // is supposed to be "small" (a few bytes). - - abstract protected int overrun(int itemSize, int nItems, boolean wait); - - protected InStream() {} - protected byte[] b; - protected int ptr; - protected int end; -} diff --git a/java/src/com/tigervnc/rdr/JavaInStream.java b/java/src/com/tigervnc/rdr/JavaInStream.java deleted file mode 100644 index ce8efddc..00000000 --- a/java/src/com/tigervnc/rdr/JavaInStream.java +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// A JavaInStream reads from a java.io.InputStream -// - -package com.tigervnc.rdr; - -public class JavaInStream extends InStream { - - static final int defaultBufSize = 8192; - static final int minBulkSize = 1024; - - public JavaInStream(java.io.InputStream jis_, int bufSize_) { - jis = jis_; - bufSize = bufSize_; - b = new byte[bufSize]; - ptr = end = offset = 0; - timeWaitedIn100us = 5; - timedKbits = 0; - } - - public JavaInStream(java.io.InputStream jis_) { this(jis_, defaultBufSize); } - - public void readBytes(byte[] data, int dataPtr, int length) { - if (length < minBulkSize) { - super.readBytes(data, dataPtr, length); - return; - } - - int n = end - ptr; - if (n > length) n = length; - - System.arraycopy(b, ptr, data, dataPtr, n); - dataPtr += n; - length -= n; - ptr += n; - - while (length > 0) { - n = read(data, dataPtr, length); - dataPtr += n; - length -= n; - offset += n; - } - } - - public int pos() { return offset + ptr; } - - public void startTiming() { - timing = true; - - // Carry over up to 1s worth of previous rate for smoothing. - - if (timeWaitedIn100us > 10000) { - timedKbits = timedKbits * 10000 / timeWaitedIn100us; - timeWaitedIn100us = 10000; - } - } - - public void stopTiming() { - timing = false; - if (timeWaitedIn100us < timedKbits/2) - timeWaitedIn100us = timedKbits/2; // upper limit 20Mbit/s - } - - public long kbitsPerSecond() { - return timedKbits * 10000 / timeWaitedIn100us; - } - - public long timeWaited() { return timeWaitedIn100us; } - - protected int overrun(int itemSize, int nItems, boolean wait) { - if (itemSize > bufSize) - throw new Exception("JavaInStream overrun: max itemSize exceeded"); - - if (end - ptr != 0) - System.arraycopy(b, ptr, b, 0, end - ptr); - - offset += ptr; - end -= ptr; - ptr = 0; - - while (end < itemSize) { - int n = read(b, end, bufSize - end, wait); - end += n; - } - - if (itemSize * nItems > end) - nItems = end / itemSize; - - return nItems; - } - - private int read(byte[] buf, int bufPtr, int len, boolean wait) { - try { - long before = 0; - if (timing) - before = System.currentTimeMillis(); - - int n = jis.read(buf, bufPtr, len); - if (n < 0) throw new EndOfStream(); - - if (timing) { - long after = System.currentTimeMillis(); - long newTimeWaited = (after - before) * 10; - int newKbits = n * 8 / 1000; - - // limit rate to between 10kbit/s and 40Mbit/s - - if (newTimeWaited > newKbits*1000) newTimeWaited = newKbits*1000; - if (newTimeWaited < newKbits/4) newTimeWaited = newKbits/4; - - timeWaitedIn100us += newTimeWaited; - timedKbits += newKbits; - } - - return n; - - } catch (java.io.IOException e) { - throw new IOException(e); - } - } - private int read(byte[] buf, int bufPtr, int len) { return read(buf, bufPtr, len, true); } - - private java.io.InputStream jis; - private int offset; - private int bufSize; - - boolean timing; - long timeWaitedIn100us; - long timedKbits; -} diff --git a/java/src/com/tigervnc/rdr/JavaOutStream.java b/java/src/com/tigervnc/rdr/JavaOutStream.java deleted file mode 100644 index 015f81f5..00000000 --- a/java/src/com/tigervnc/rdr/JavaOutStream.java +++ /dev/null @@ -1,77 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// A JavaOutStream writes to a java.io.OutputStream -// - -package com.tigervnc.rdr; - -public class JavaOutStream extends OutStream { - - static final int defaultBufSize = 16384; - static final int minBulkSize = 1024; - - public JavaOutStream(java.io.OutputStream jos_, int bufSize_) { - jos = jos_; - bufSize = bufSize_; - b = new byte[bufSize]; - ptr = offset = start = 0; - end = start + bufSize; - } - - public JavaOutStream(java.io.OutputStream jos) { this(jos, defaultBufSize); } - - public int length() - { - return offset + ptr - start; - } - - public void flush() - { - int sentUpTo = start; - while (sentUpTo < ptr) { - try { - jos.write(b, sentUpTo, ptr - sentUpTo); - sentUpTo += ptr - sentUpTo; - offset += ptr - sentUpTo; - } catch (java.io.IOException e) { - throw new IOException(e); - } - } - ptr = start; - } - - protected int overrun(int itemSize, int nItems) - { - if (itemSize > bufSize) - throw new Exception("JavaOutStream overrun: max itemSize exceeded"); - - flush(); - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; - } - - private java.io.OutputStream jos; - private int start; - private int offset; - private int bufSize; -} diff --git a/java/src/com/tigervnc/rdr/MemInStream.java b/java/src/com/tigervnc/rdr/MemInStream.java deleted file mode 100644 index 32911a3a..00000000 --- a/java/src/com/tigervnc/rdr/MemInStream.java +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rdr; - -public class MemInStream extends InStream { - - public MemInStream(byte[] data, int offset, int len) { - b = data; - ptr = offset; - end = offset + len; - } - - public int pos() { return ptr; } - - protected int overrun(int itemSize, int nItems, boolean wait) { - throw new EndOfStream(); - } -} diff --git a/java/src/com/tigervnc/rdr/MemOutStream.java b/java/src/com/tigervnc/rdr/MemOutStream.java deleted file mode 100644 index b3040793..00000000 --- a/java/src/com/tigervnc/rdr/MemOutStream.java +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// A MemOutStream grows as needed when data is written to it. -// - -package com.tigervnc.rdr; - -public class MemOutStream extends OutStream { - - public MemOutStream(int len) { - b = new byte[len]; - ptr = 0; - end = len; - } - public MemOutStream() { this(1024); } - - public int length() { return ptr; } - public void clear() { ptr = 0; }; - public void reposition(int pos) { ptr = pos; } - - // overrun() either doubles the buffer or adds enough space for nItems of - // size itemSize bytes. - - protected int overrun(int itemSize, int nItems) { - int len = ptr + itemSize * nItems; - if (len < end * 2) - len = end * 2; - - byte[] newBuf = new byte[len]; - System.arraycopy(b, 0, newBuf, 0, ptr); - b = newBuf; - end = len; - - return nItems; - } -} diff --git a/java/src/com/tigervnc/rdr/OutStream.java b/java/src/com/tigervnc/rdr/OutStream.java deleted file mode 100644 index 0919453e..00000000 --- a/java/src/com/tigervnc/rdr/OutStream.java +++ /dev/null @@ -1,160 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// rdr::OutStream marshalls data into a buffer stored in RDR (RFB Data -// Representation). -// - -package com.tigervnc.rdr; - -abstract public class OutStream { - - // check() ensures there is buffer space for at least one item of size - // itemSize bytes. Returns the number of items which fit (up to a maximum - // of nItems). - - public final int check(int itemSize, int nItems) { - if (ptr + itemSize * nItems > end) { - if (ptr + itemSize > end) - return overrun(itemSize, nItems); - - nItems = (end - ptr) / itemSize; - } - return nItems; - } - - public final void check(int itemSize) { - if (ptr + itemSize > end) - overrun(itemSize, 1); - } - - // writeU/SN() methods write unsigned and signed N-bit integers. - - public final void writeU8( int u) { check(1); b[ptr++] = (byte)u; } - public final void writeU16(int u) { check(2); b[ptr++] = (byte)(u >> 8); - b[ptr++] = (byte)u; } - public final void writeU32(int u) { check(4); b[ptr++] = (byte)(u >> 24); - b[ptr++] = (byte)(u >> 16); - b[ptr++] = (byte)(u >> 8); - b[ptr++] = (byte)u; } - - public final void writeS8( int s) { writeU8( s); } - public final void writeS16(int s) { writeU16(s); } - public final void writeS32(int s) { writeU32(s); } - - // writeCompactLength() writes 1..3 bytes representing length of the data - // following. This method is used by the Tight encoder. - - public final void writeCompactLength(int len) { - byte b = (byte)(len & 0x7F); - if (len <= 0x7F) { - writeU8(b); - } else { - writeU8(b | 0x80); - b = (byte)(len >> 7 & 0x7F); - if (len <= 0x3FFF) { - writeU8(b); - } else { - writeU8(b | 0x80); - writeU8(len >> 14 & 0xFF); - } - } - } - - // writeString() writes a string - a U32 length followed by the data. - - public final void writeString(String str) { - int len = str.length(); - writeU32(len); - try { - byte[] utf8str = str.getBytes("UTF8"); - writeBytes(utf8str, 0, len); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - - public final void pad(int bytes) { - while (bytes-- > 0) writeU8(0); - } - - public final void skip(int bytes) { - while (bytes > 0) { - int n = check(1, bytes); - ptr += n; - bytes -= n; - } - } - - // writeBytes() writes an exact number of bytes from an array at an offset. - - public void writeBytes(byte[] data, int dataPtr, int length) { - int dataEnd = dataPtr + length; - while (dataPtr < dataEnd) { - int n = check(1, dataEnd - dataPtr); - System.arraycopy(data, dataPtr, b, ptr, n); - ptr += n; - dataPtr += n; - } - } - - // writeOpaqueN() writes a quantity without byte-swapping. Because java has - // no byte-ordering, we just use big-endian. - - public final void writeOpaque8( int u) { writeU8( u); } - public final void writeOpaque16(int u) { writeU16(u); } - public final void writeOpaque32(int u) { writeU32(u); } - public final void writeOpaque24A(int u) { check(3); - b[ptr++] = (byte)(u >> 24); - b[ptr++] = (byte)(u >> 16); - b[ptr++] = (byte)(u >> 8); } - public final void writeOpaque24B(int u) { check(3); - b[ptr++] = (byte)(u >> 16); - b[ptr++] = (byte)(u >> 8); - b[ptr++] = (byte)u; } - - // length() returns the length of the stream. - - abstract public int length(); - - // flush() requests that the stream be flushed. - - public void flush() {} - - // getptr(), getend() and setptr() are "dirty" methods which allow you to - // manipulate the buffer directly. This is useful for a stream which is a - // wrapper around an underlying stream. - - public final byte[] getbuf() { return b; } - public final int getptr() { return ptr; } - public final int getend() { return end; } - public final void setptr(int p) { ptr = p; } - - // overrun() is implemented by a derived class to cope with buffer overrun. - // It ensures there are at least itemSize bytes of buffer space. Returns - // the number of items which fit (up to a maximum of nItems). itemSize is - // supposed to be "small" (a few bytes). - - abstract protected int overrun(int itemSize, int nItems); - - protected OutStream() {} - protected byte[] b; - protected int ptr; - protected int end; -} diff --git a/java/src/com/tigervnc/rdr/ZlibInStream.java b/java/src/com/tigervnc/rdr/ZlibInStream.java deleted file mode 100644 index 62c45bd8..00000000 --- a/java/src/com/tigervnc/rdr/ZlibInStream.java +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// A ZlibInStream reads from a zlib.io.InputStream -// - -package com.tigervnc.rdr; -import com.jcraft.jzlib.*; - -public class ZlibInStream extends InStream { - - static final int defaultBufSize = 16384; - - public ZlibInStream(int bufSize_) - { - bufSize = bufSize_; - b = new byte[bufSize]; - bytesIn = offset = 0; - zs = new ZStream(); - zs.next_in = null; - zs.next_in_index = 0; - zs.avail_in = 0; - if (zs.inflateInit() != JZlib.Z_OK) { - zs = null; - throw new Exception("ZlinInStream: inflateInit failed"); - } - ptr = end = start = 0; - } - - public ZlibInStream() { this(defaultBufSize); } - - protected void finalize() throws Throwable { - b = null; - zs.inflateEnd(); - } - - public void setUnderlying(InStream is, int bytesIn_) - { - underlying = is; - bytesIn = bytesIn_; - ptr = end = start; - } - - public int pos() - { - return offset + ptr - start; - } - - public void reset() - { - ptr = end = start; - if (underlying == null) return; - - while (bytesIn > 0) { - decompress(true); - end = start; // throw away any data - } - underlying = null; - } - - protected int overrun(int itemSize, int nItems, boolean wait) - { - if (itemSize > bufSize) - throw new Exception("ZlibInStream overrun: max itemSize exceeded"); - if (underlying == null) - throw new Exception("ZlibInStream overrun: no underlying stream"); - - if (end - ptr != 0) - System.arraycopy(b, ptr, b, start, end - ptr); - - offset += ptr - start; - end -= ptr - start; - ptr = start; - - while (end - ptr < itemSize) { - if (!decompress(wait)) - return 0; - } - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; - } - - // decompress() calls the decompressor once. Note that this won't - // necessarily generate any output data - it may just consume some input - // data. Returns false if wait is false and we would block on the underlying - // stream. - - private boolean decompress(boolean wait) - { - zs.next_out = b; - zs.next_out_index = end; - zs.avail_out = start + bufSize - end; - - int n = underlying.check(1, 1, wait); - if (n == 0) return false; - zs.next_in = underlying.getbuf(); - zs.next_in_index = underlying.getptr(); - zs.avail_in = underlying.getend() - underlying.getptr(); - if (zs.avail_in > bytesIn) - zs.avail_in = bytesIn; - - int rc = zs.inflate(JZlib.Z_SYNC_FLUSH); - if (rc != JZlib.Z_OK) { - throw new Exception("ZlibInStream: inflate failed"); - } - - bytesIn -= zs.next_in_index - underlying.getptr(); - end = zs.next_out_index; - underlying.setptr(zs.next_in_index); - return true; - } - - private InStream underlying; - private int bufSize; - private int offset; - private com.jcraft.jzlib.ZStream zs; - private int bytesIn; - private int start; -} diff --git a/java/src/com/tigervnc/rfb/AliasParameter.java b/java/src/com/tigervnc/rfb/AliasParameter.java deleted file mode 100644 index 2570b877..00000000 --- a/java/src/com/tigervnc/rfb/AliasParameter.java +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class AliasParameter extends VoidParameter { - public AliasParameter(String name_, String desc_, VoidParameter v) { - super(name_, desc_); - param = v; - } - - public boolean setParam(String v) { return param.setParam(v); } - public boolean setParam() { return param.setParam(); } - - public String getDefaultStr() { return param.getDefaultStr(); } - public String getValueStr() { return param.getValueStr(); } - public boolean isBool() { return param.isBool(); } - - protected VoidParameter param; -} diff --git a/java/src/com/tigervnc/rfb/AuthFailureException.java b/java/src/com/tigervnc/rfb/AuthFailureException.java deleted file mode 100644 index 35fabef0..00000000 --- a/java/src/com/tigervnc/rfb/AuthFailureException.java +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class AuthFailureException extends Exception { - public AuthFailureException(String s) { super(s); } -} diff --git a/java/src/com/tigervnc/rfb/BoolParameter.java b/java/src/com/tigervnc/rfb/BoolParameter.java deleted file mode 100644 index 06c6ed79..00000000 --- a/java/src/com/tigervnc/rfb/BoolParameter.java +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class BoolParameter extends VoidParameter { - public BoolParameter(String name_, String desc_, boolean v) { - super(name_, desc_); - value = v; - defValue = v; - } - - public boolean setParam(String v) { - if (v.equals("1") || v.equalsIgnoreCase("on") || - v.equalsIgnoreCase("true") || v.equalsIgnoreCase("yes")) - value = true; - else if (v.equals("0") || v.equalsIgnoreCase("off") || - v.equalsIgnoreCase("false") || v.equalsIgnoreCase("no")) - value = false; - else - return false; - return true; - } - - public boolean setParam() { setParam(true); return true; } - public void setParam(boolean b) { value = b; } - - public String getDefaultStr() { return defValue ? "1" : "0"; } - public String getValueStr() { return value ? "1" : "0"; } - public boolean isBool() { return true; } - - final public boolean getValue() { return value; } - - protected boolean value; - protected boolean defValue; -} diff --git a/java/src/com/tigervnc/rfb/CConnection.java b/java/src/com/tigervnc/rfb/CConnection.java deleted file mode 100644 index 15e19896..00000000 --- a/java/src/com/tigervnc/rfb/CConnection.java +++ /dev/null @@ -1,356 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import java.util.*; - -import com.tigervnc.rdr.*; - -abstract public class CConnection extends CMsgHandler { - - public CConnection() { - security = new SecurityClient(); - } - - // setStreams() sets the streams to be used for the connection. These must - // be set before initialiseProtocol() and processMsg() are called. The - // CSecurity object may call setStreams() again to provide alternative - // streams over which the RFB protocol is sent (i.e. encrypting/decrypting - // streams). Ownership of the streams remains with the caller - // (i.e. SConnection will not delete them). - public void setStreams(InStream is_, OutStream os_) { - is = is_; - os = os_; - } - - // initialiseProtocol() should be called once the streams and security - // types are set. Subsequently, processMsg() should be called whenever - // there is data to read on the InStream. - public void initialiseProtocol() { - state_ = RFBSTATE_PROTOCOL_VERSION; - } - - // processMsg() should be called whenever there is data to read on the - // InStream. You must have called initialiseProtocol() first. - public void processMsg() { - switch (state_) { - - case RFBSTATE_PROTOCOL_VERSION: processVersionMsg(); break; - case RFBSTATE_SECURITY_TYPES: processSecurityTypesMsg(); break; - case RFBSTATE_SECURITY: processSecurityMsg(); break; - case RFBSTATE_SECURITY_RESULT: processSecurityResultMsg(); break; - case RFBSTATE_INITIALISATION: processInitMsg(); break; - case RFBSTATE_NORMAL: reader_.readMsg(); break; - case RFBSTATE_UNINITIALISED: - throw new Exception("CConnection.processMsg: not initialised yet?"); - default: - throw new Exception("CConnection.processMsg: invalid state"); - } - } - - private void processVersionMsg() { - vlog.debug("reading protocol version"); - Boolean done = new Boolean(true); - if (!cp.readVersion(is, done)) { - state_ = RFBSTATE_INVALID; - throw new Exception("reading version failed: not an RFB server?"); - } - if (!done.booleanValue()) return; - - vlog.info("Server supports RFB protocol version "+cp.majorVersion+"."+ - cp.minorVersion); - - // The only official RFB protocol versions are currently 3.3, 3.7 and 3.8 - if (cp.beforeVersion(3,3)) { - String msg = ("Server gave unsupported RFB protocol version "+ - cp.majorVersion+"."+cp.minorVersion); - vlog.error(msg); - state_ = RFBSTATE_INVALID; - throw new Exception(msg); - } else if (useProtocol3_3 || cp.beforeVersion(3,7)) { - cp.setVersion(3,3); - } else if (cp.afterVersion(3,8)) { - cp.setVersion(3,8); - } - - cp.writeVersion(os); - state_ = RFBSTATE_SECURITY_TYPES; - - vlog.info("Using RFB protocol version "+ - cp.majorVersion+"."+cp.minorVersion); - } - - private void processSecurityTypesMsg() { - vlog.info("processing security types message"); - - int secType = Security.secTypeInvalid; - - List<Integer> secTypes = new ArrayList<Integer>(); - secTypes = security.GetEnabledSecTypes(); - //for (Iterator i = secTypes.iterator(); i.hasNext(); ) - // vlog.info(((Integer)i.next()).toString()); - - if (cp.isVersion(3,3)) { - - // legacy 3.3 server may only offer "vnc authentication" or "none" - - secType = is.readU32(); - if (secType == Security.secTypeInvalid) { - throwConnFailedException(); - - } else if (secType == Security.secTypeNone || secType == Security.secTypeVncAuth) { - Iterator i; - for (i = secTypes.iterator(); i.hasNext(); ) { - int refType = (Integer)i.next(); - if (refType == secType) { - secType = refType; - break; - } - if (!i.hasNext()) - secType = Security.secTypeInvalid; - } - - } else { - vlog.error("Unknown 3.3 security type "+secType); - throw new Exception("Unknown 3.3 security type"); - } - - } else { - - // 3.7 server will offer us a list - - int nServerSecTypes = is.readU8(); - if (nServerSecTypes == 0) - throwConnFailedException(); - - for (int i = 0; i < nServerSecTypes; i++) { - int serverSecType = is.readU8(); - vlog.info("Server offers security type "+ - Security.secTypeName(serverSecType)+"("+serverSecType+")"); - - /* - * Use the first type sent by server which matches client's type. - * It means server's order specifies priority. - */ - if (secType == Security.secTypeInvalid) { - for (Iterator j = secTypes.iterator(); j.hasNext(); ) { - int refType = (Integer)j.next(); - if (refType == serverSecType) { - secType = refType; - break; - } - } - } - } - - // Inform the server of our decision - if (secType != Security.secTypeInvalid) { - os.writeU8(secType); - os.flush(); - vlog.info("Choosing security type "+Security.secTypeName(secType)+ - "("+secType+")"); - } - } - - if (secType == Security.secTypeInvalid) { - state_ = RFBSTATE_INVALID; - vlog.error("No matching security types"); - throw new Exception("No matching security types"); - } - - state_ = RFBSTATE_SECURITY; - csecurity = security.GetCSecurity(secType); - processSecurityMsg(); - } - - private void processSecurityMsg() { - vlog.debug("processing security message"); - if (csecurity.processMsg(this)) { - state_ = RFBSTATE_SECURITY_RESULT; - processSecurityResultMsg(); - } - } - - private void processSecurityResultMsg() { - vlog.debug("processing security result message"); - int result; - if (cp.beforeVersion(3,8) && csecurity.getType() == Security.secTypeNone) { - result = Security.secResultOK; - } else { - if (!is.checkNoWait(1)) return; - result = is.readU32(); - } - switch (result) { - case Security.secResultOK: - securityCompleted(); - return; - case Security.secResultFailed: - vlog.debug("auth failed"); - break; - case Security.secResultTooMany: - vlog.debug("auth failed - too many tries"); - break; - default: - throw new Exception("Unknown security result from server"); - } - String reason; - if (cp.beforeVersion(3,8)) - reason = "Authentication failure"; - else - reason = is.readString(); - state_ = RFBSTATE_INVALID; - throw new AuthFailureException(reason); - } - - private void processInitMsg() { - vlog.debug("reading server initialisation"); - reader_.readServerInit(); - } - - private void throwConnFailedException() { - state_ = RFBSTATE_INVALID; - String reason; - reason = is.readString(); - throw new ConnFailedException(reason); - } - - private void securityCompleted() { - state_ = RFBSTATE_INITIALISATION; - reader_ = new CMsgReaderV3(this, is); - writer_ = new CMsgWriterV3(cp, os); - vlog.debug("Authentication success!"); - authSuccess(); - writer_.writeClientInit(shared); - } - - // Methods to initialise the connection - - // setServerName() is used to provide a unique(ish) name for the server to - // which we are connected. This might be the result of getPeerEndpoint on - // a TcpSocket, for example, or a host specified by DNS name & port. - // The serverName is used when verifying the Identity of a host (see RA2). - public void setServerName(String name) { - serverName = name; - } - - public void setServerPort(int port) { - serverPort = port; - } - - public void initSecTypes() { - nSecTypes = 0; - } - - // setShared sets the value of the shared flag which will be sent to the - // server upon initialisation. - public void setShared(boolean s) { shared = s; } - - // setProtocol3_3 configures whether or not the CConnection should - // only ever support protocol version 3.3 - public void setProtocol3_3(boolean s) { useProtocol3_3 = s; } - - // Methods to be overridden in a derived class - - // getCSecurity() gets the CSecurity object for the given type. The type - // is guaranteed to be one of the secTypes passed in to addSecType(). The - // CSecurity object's destroy() method will be called by the CConnection - // from its destructor. - //abstract public CSecurity getCSecurity(int secType); - - // getCurrentCSecurity() gets the CSecurity instance used for this - // connection. - //public CSecurity getCurrentCSecurity() { return security; } - - // setClientSecTypeOrder() determines whether the client should obey the - // server's security type preference, by picking the first server security - // type that the client supports, or whether it should pick the first type - // that the server supports, from the client-supported list of types. - public void setClientSecTypeOrder( boolean csto ) { - clientSecTypeOrder = csto; - } - - // authSuccess() is called when authentication has succeeded. - public void authSuccess() {} - - // serverInit() is called when the ServerInit message is received. The - // derived class must call on to CConnection::serverInit(). - public void serverInit() { - state_ = RFBSTATE_NORMAL; - vlog.debug("initialisation done"); - } - - // Other methods - - public CMsgReaderV3 reader() { return reader_; } - public CMsgWriterV3 writer() { return writer_; } - - public InStream getInStream() { return is; } - public OutStream getOutStream() { return os; } - - public String getServerName() { return serverName; } - public int getServerPort() { return serverPort; } - - public static final int RFBSTATE_UNINITIALISED = 0; - public static final int RFBSTATE_PROTOCOL_VERSION = 1; - public static final int RFBSTATE_SECURITY_TYPES = 2; - public static final int RFBSTATE_SECURITY = 3; - public static final int RFBSTATE_SECURITY_RESULT = 4; - public static final int RFBSTATE_INITIALISATION = 5; - public static final int RFBSTATE_NORMAL = 6; - public static final int RFBSTATE_INVALID = 7; - - public int state() { return state_; } - - protected void setState(int s) { state_ = s; } - - private void throwAuthFailureException() { - String reason; - vlog.debug("state="+state()+", ver="+cp.majorVersion+"."+cp.minorVersion); - if (state() == RFBSTATE_SECURITY_RESULT && !cp.beforeVersion(3,8)) { - reason = is.readString(); - } else { - reason = "Authentication failure"; - } - state_ = RFBSTATE_INVALID; - vlog.error(reason); - throw new AuthFailureException(reason); - } - - InStream is = null; - OutStream os = null; - CMsgReaderV3 reader_ = null; - CMsgWriterV3 writer_ = null; - boolean shared = false; - public CSecurity csecurity; - public SecurityClient security; - public static final int maxSecTypes = 8; - int nSecTypes; - int[] secTypes; - int state_ = RFBSTATE_UNINITIALISED; - String serverName; - int serverPort; - boolean useProtocol3_3 = false; - boolean clientSecTypeOrder; - public static java.net.Socket sock; - - public static java.net.Socket getSocket() { return sock; } - public static void setSocket(java.net.Socket sock_) { sock = sock_; } - - static LogWriter vlog = new LogWriter("CConnection"); -} diff --git a/java/src/com/tigervnc/rfb/CMsgHandler.java b/java/src/com/tigervnc/rfb/CMsgHandler.java deleted file mode 100644 index 81fd2a1b..00000000 --- a/java/src/com/tigervnc/rfb/CMsgHandler.java +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// CMsgHandler -// - -package com.tigervnc.rfb; - -public class CMsgHandler { - - public CMsgHandler() { - cp = new ConnParams(); - } - - public void setDesktopSize(int width, int height) - { - cp.width = width; - cp.height = height; - } - - public void setExtendedDesktopSize(int reason, int result, - int width, int height, - ScreenSet layout) - { - cp.supportsSetDesktopSize = true; - - if ((reason == screenTypes.reasonClient) && (result != screenTypes.resultSuccess)) - return; - - if (!layout.validate(width, height)) - vlog.error("Server sent us an invalid screen layout"); - - cp.width = width; - cp.height = height; - cp.screenLayout = layout; - } - - public void setPixelFormat(PixelFormat pf) - { - cp.setPF(pf); - } - - public void setName(String name) - { - cp.setName(name); - } - - public void clientRedirect(int port, String host, - String x509subject) {} - - public void setCursor(int width, int height, Point hotspot, - int[] data, byte[] mask) {} - public void serverInit() {} - - public void framebufferUpdateStart() {} - public void framebufferUpdateEnd() {} - public void beginRect(Rect r, int encoding) {} - public void endRect(Rect r, int encoding) {} - - public void setColourMapEntries(int firstColour, int nColours, - int[] rgbs) { } - public void bell() {} - public void serverCutText(String str, int len) {} - - public void fillRect(Rect r, int pix) {} - public void imageRect(Rect r, int[] pixels) {} - public void copyRect(Rect r, int srcX, int srcY) {} - - public ConnParams cp; - - static LogWriter vlog = new LogWriter("CMsgHandler"); -} diff --git a/java/src/com/tigervnc/rfb/CMsgReader.java b/java/src/com/tigervnc/rfb/CMsgReader.java deleted file mode 100644 index 41230560..00000000 --- a/java/src/com/tigervnc/rfb/CMsgReader.java +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// CMsgReader - class for reading RFB messages on the client side -// (i.e. messages from server to client). -// - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -abstract public class CMsgReader { - - protected CMsgReader(CMsgHandler handler_, InStream is_) - { - imageBufIdealSize = 0; - handler = handler_; - is = is_; - imageBuf = null; - imageBufSize = 0; - decoders = new Decoder[Encodings.encodingMax+1]; - } - - protected void readSetColourMapEntries() - { - is.skip(1); - int firstColour = is.readU16(); - int nColours = is.readU16(); - int[] rgbs = new int[nColours * 3]; - for (int i = 0; i < nColours * 3; i++) - rgbs[i] = is.readU16(); - handler.setColourMapEntries(firstColour, nColours, rgbs); - } - - protected void readBell() - { - handler.bell(); - } - - protected void readServerCutText() - { - is.skip(3); - int len = is.readU32(); - if (len > 256*1024) { - is.skip(len); - vlog.error("cut text too long ("+len+" bytes) - ignoring"); - return; - } - byte[] buf = new byte[len]; - is.readBytes(buf, 0, len); - String str = new String(); - try { - str = new String(buf,"UTF8"); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - handler.serverCutText(str, len); - } - - protected void readFramebufferUpdateStart() - { - handler.framebufferUpdateStart(); - } - - protected void readFramebufferUpdateEnd() - { - handler.framebufferUpdateEnd(); - } - - protected void readRect(Rect r, int encoding) - { - if ((r.br.x > handler.cp.width) || (r.br.y > handler.cp.height)) { - vlog.error("Rect too big: "+r.width()+"x"+r.height()+" at "+ - r.tl.x+","+r.tl.y+" exceeds "+handler.cp.width+"x"+ - handler.cp.height); - throw new Exception("Rect too big"); - } - - if (r.is_empty()) - vlog.error("Ignoring zero size rect"); - - handler.beginRect(r, encoding); - - if (encoding == Encodings.encodingCopyRect) { - readCopyRect(r); - } else { - - if (decoders[encoding] == null) { - decoders[encoding] = Decoder.createDecoder(encoding, this); - if (decoders[encoding] == null) { - vlog.error("Unknown rect encoding "+encoding); - throw new Exception("Unknown rect encoding"); - } - } - decoders[encoding].readRect(r, handler); - } - - handler.endRect(r, encoding); - } - - protected void readCopyRect(Rect r) - { - int srcX = is.readU16(); - int srcY = is.readU16(); - handler.copyRect(r, srcX, srcY); - } - - protected void readSetCursor(int width, int height, Point hotspot) - { - int data_len = width * height; - int mask_len = ((width+7)/8) * height; - int[] data = new int[data_len]; - byte[] mask = new byte[mask_len]; - - is.readPixels(data, data_len, (handler.cp.pf().bpp/8), handler.cp.pf().bigEndian); - is.readBytes(mask, 0, mask_len); - - handler.setCursor(width, height, hotspot, data, mask); - } - - public int[] getImageBuf(int required) { return getImageBuf(required, 0, 0); } - - public int[] getImageBuf(int required, int requested, int nPixels) - { - int requiredBytes = required * (handler.cp.pf().bpp / 8); - int requestedBytes = requested * (handler.cp.pf().bpp / 8); - int size = requestedBytes; - if (size > imageBufIdealSize) size = imageBufIdealSize; - - if (size < requiredBytes) - size = requiredBytes; - - if (imageBufSize < size) { - imageBufSize = size; - imageBuf = new int[imageBufSize]; - } - if (nPixels != 0) - nPixels = imageBufSize / (handler.cp.pf().bpp / 8); - return imageBuf; - } - - public final int bpp() - { - return handler.cp.pf().bpp; - } - - abstract public void readServerInit(); - - // readMsg() reads a message, calling the handler as appropriate. - abstract public void readMsg(); - - public InStream getInStream() { return is; } - - public int imageBufIdealSize; - - protected CMsgHandler handler; - protected InStream is; - protected Decoder[] decoders; - protected int[] imageBuf; - protected int imageBufSize; - - static LogWriter vlog = new LogWriter("CMsgReader"); -} diff --git a/java/src/com/tigervnc/rfb/CMsgReaderV3.java b/java/src/com/tigervnc/rfb/CMsgReaderV3.java deleted file mode 100644 index 6d9e254b..00000000 --- a/java/src/com/tigervnc/rfb/CMsgReaderV3.java +++ /dev/null @@ -1,155 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -public class CMsgReaderV3 extends CMsgReader { - - public CMsgReaderV3(CMsgHandler handler_, InStream is_) - { - super(handler_, is_); - nUpdateRectsLeft = 0; - } - - public void readServerInit() - { - int width = is.readU16(); - int height = is.readU16(); - handler.setDesktopSize(width, height); - PixelFormat pf = new PixelFormat(); - pf.read(is); - handler.setPixelFormat(pf); - String name = is.readString(); - handler.setName(name); - handler.serverInit(); - } - - public void readMsg() - { - if (nUpdateRectsLeft == 0) { - - int type = is.readU8(); - switch (type) { - case MsgTypes.msgTypeFramebufferUpdate: readFramebufferUpdate(); break; - case MsgTypes.msgTypeSetColourMapEntries: readSetColourMapEntries(); break; - case MsgTypes.msgTypeBell: readBell(); break; - case MsgTypes.msgTypeServerCutText: readServerCutText(); break; - default: - vlog.error("unknown message type "+type); - throw new Exception("unknown message type"); - } - - } else { - - int x = is.readU16(); - int y = is.readU16(); - int w = is.readU16(); - int h = is.readU16(); - int encoding = is.readS32(); - - switch (encoding) { - case Encodings.pseudoEncodingDesktopSize: - handler.setDesktopSize(w, h); - break; - case Encodings.pseudoEncodingExtendedDesktopSize: - readExtendedDesktopSize(x, y, w, h); - break; - case Encodings.pseudoEncodingDesktopName: - readSetDesktopName(x, y, w, h); - break; - case Encodings.pseudoEncodingCursor: - readSetCursor(w, h, new Point(x,y)); - break; - case Encodings.pseudoEncodingLastRect: - nUpdateRectsLeft = 1; // this rectangle is the last one - break; - case Encodings.pseudoEncodingClientRedirect: - readClientRedirect(x, y, w, h); - break; - default: - readRect(new Rect(x, y, x+w, y+h), encoding); - break; - } - - nUpdateRectsLeft--; - if (nUpdateRectsLeft == 0) handler.framebufferUpdateEnd(); - } - } - - void readFramebufferUpdate() - { - is.skip(1); - nUpdateRectsLeft = is.readU16(); - handler.framebufferUpdateStart(); - } - - void readSetDesktopName(int x, int y, int w, int h) - { - String name = is.readString(); - - if (x != 0 || y != 0 || w != 0 || h != 0) { - vlog.error("Ignoring DesktopName rect with non-zero position/size"); - } else { - handler.setName(name); - } - - } - - void readExtendedDesktopSize(int x, int y, int w, int h) - { - int screens, i; - int id, flags; - int sx, sy, sw, sh; - ScreenSet layout = new ScreenSet(); - - screens = is.readU8(); - is.skip(3); - - for (i = 0;i < screens;i++) { - id = is.readU32(); - sx = is.readU16(); - sy = is.readU16(); - sw = is.readU16(); - sh = is.readU16(); - flags = is.readU32(); - - layout.add_screen(new Screen(id, sx, sy, sw, sh, flags)); - } - - handler.setExtendedDesktopSize(x, y, w, h, layout); - } - - void readClientRedirect(int x, int y, int w, int h) - { - int port = is.readU16(); - String host = is.readString(); - String x509subject = is.readString(); - - if (x != 0 || y != 0 || w != 0 || h != 0) { - vlog.error("Ignoring ClientRedirect rect with non-zero position/size"); - } else { - handler.clientRedirect(port, host, x509subject); - } - } - - int nUpdateRectsLeft; - - static LogWriter vlog = new LogWriter("CMsgReaderV3"); -} diff --git a/java/src/com/tigervnc/rfb/CMsgWriter.java b/java/src/com/tigervnc/rfb/CMsgWriter.java deleted file mode 100644 index 7cafddde..00000000 --- a/java/src/com/tigervnc/rfb/CMsgWriter.java +++ /dev/null @@ -1,171 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -abstract public class CMsgWriter { - - abstract public void writeClientInit(boolean shared); - - public void writeSetPixelFormat(PixelFormat pf) - { - startMsg(MsgTypes.msgTypeSetPixelFormat); - os.pad(3); - pf.write(os); - endMsg(); - } - - public void writeSetEncodings(int nEncodings, int[] encodings) - { - startMsg(MsgTypes.msgTypeSetEncodings); - os.skip(1); - os.writeU16(nEncodings); - for (int i = 0; i < nEncodings; i++) - os.writeU32(encodings[i]); - endMsg(); - } - - // Ask for encodings based on which decoders are supported. Assumes higher - // encoding numbers are more desirable. - - public void writeSetEncodings(int preferredEncoding, boolean useCopyRect) - { - int nEncodings = 0; - int[] encodings = new int[Encodings.encodingMax+3]; - if (cp.supportsLocalCursor) - encodings[nEncodings++] = Encodings.pseudoEncodingCursor; - if (cp.supportsDesktopResize) - encodings[nEncodings++] = Encodings.pseudoEncodingDesktopSize; - if (cp.supportsExtendedDesktopSize) - encodings[nEncodings++] = Encodings.pseudoEncodingExtendedDesktopSize; - if (cp.supportsDesktopRename) - encodings[nEncodings++] = Encodings.pseudoEncodingDesktopName; - if (cp.supportsClientRedirect) - encodings[nEncodings++] = Encodings.pseudoEncodingClientRedirect; - if (Decoder.supported(preferredEncoding)) { - encodings[nEncodings++] = preferredEncoding; - } - if (useCopyRect) { - encodings[nEncodings++] = Encodings.encodingCopyRect; - } - - /* - * Prefer encodings in this order: - * - * Tight, ZRLE, Hextile, * - */ - - if ((preferredEncoding != Encodings.encodingTight) && - Decoder.supported(Encodings.encodingTight)) - encodings[nEncodings++] = Encodings.encodingTight; - - if ((preferredEncoding != Encodings.encodingZRLE) && - Decoder.supported(Encodings.encodingZRLE)) - encodings[nEncodings++] = Encodings.encodingZRLE; - - if ((preferredEncoding != Encodings.encodingHextile) && - Decoder.supported(Encodings.encodingHextile)) - encodings[nEncodings++] = Encodings.encodingHextile; - - // Remaining encodings - for (int i = Encodings.encodingMax; i >= 0; i--) { - switch (i) { - case Encodings.encodingTight: - case Encodings.encodingZRLE: - case Encodings.encodingHextile: - break; - default: - if ((i != preferredEncoding) && Decoder.supported(i)) - encodings[nEncodings++] = i; - } - } - - encodings[nEncodings++] = Encodings.pseudoEncodingLastRect; - if (cp.customCompressLevel && cp.compressLevel >= 0 && cp.compressLevel <= 9) - encodings[nEncodings++] = Encodings.pseudoEncodingCompressLevel0 + cp.compressLevel; - if (!cp.noJpeg && cp.qualityLevel >= 0 && cp.qualityLevel <= 9) - encodings[nEncodings++] = Encodings.pseudoEncodingQualityLevel0 + cp.qualityLevel; - - writeSetEncodings(nEncodings, encodings); - } - - public void writeFramebufferUpdateRequest(Rect r, boolean incremental) - { - startMsg(MsgTypes.msgTypeFramebufferUpdateRequest); - os.writeU8(incremental?1:0); - os.writeU16(r.tl.x); - os.writeU16(r.tl.y); - os.writeU16(r.width()); - os.writeU16(r.height()); - endMsg(); - } - - public void writeKeyEvent(int key, boolean down) - { - startMsg(MsgTypes.msgTypeKeyEvent); - os.writeU8(down?1:0); - os.pad(2); - os.writeU32(key); - endMsg(); - } - - public void writePointerEvent(Point pos, int buttonMask) - { - Point p = new Point(pos.x,pos.y); - if (p.x < 0) p.x = 0; - if (p.y < 0) p.y = 0; - if (p.x >= cp.width) p.x = cp.width - 1; - if (p.y >= cp.height) p.y = cp.height - 1; - - startMsg(MsgTypes.msgTypePointerEvent); - os.writeU8(buttonMask); - os.writeU16(p.x); - os.writeU16(p.y); - endMsg(); - } - - public void writeClientCutText(String str, int len) - { - startMsg(MsgTypes.msgTypeClientCutText); - os.pad(3); - os.writeU32(len); - try { - byte[] utf8str = str.getBytes("UTF8"); - os.writeBytes(utf8str, 0, len); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - endMsg(); - } - - abstract public void startMsg(int type); - abstract public void endMsg(); - - public void setOutStream(OutStream os_) { os = os_; } - - ConnParams getConnParams() { return cp; } - OutStream getOutStream() { return os; } - - protected CMsgWriter(ConnParams cp_, OutStream os_) {cp = cp_; os = os_;} - - ConnParams cp; - OutStream os; - static LogWriter vlog = new LogWriter("CMsgWriter"); -} diff --git a/java/src/com/tigervnc/rfb/CMsgWriterV3.java b/java/src/com/tigervnc/rfb/CMsgWriterV3.java deleted file mode 100644 index ec30a826..00000000 --- a/java/src/com/tigervnc/rfb/CMsgWriterV3.java +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; -import java.util.*; - -public class CMsgWriterV3 extends CMsgWriter { - - public CMsgWriterV3(ConnParams cp_, OutStream os_) { super(cp_, os_); } - - public void writeClientInit(boolean shared) { - os.writeU8(shared?1:0); - endMsg(); - } - - public void startMsg(int type) { - os.writeU8(type); - } - - public void endMsg() { - os.flush(); - } - - public void writeSetDesktopSize(int width, int height, - ScreenSet layout) - { - if (!cp.supportsSetDesktopSize) - throw new Exception("Server does not support SetDesktopSize"); - - startMsg(MsgTypes.msgTypeSetDesktopSize); - os.pad(1); - - os.writeU16(width); - os.writeU16(height); - - os.writeU8(layout.num_screens()); - os.pad(1); - - for (Iterator iter = layout.screens.iterator(); iter.hasNext(); ) { - Screen refScreen = (Screen)iter.next(); - os.writeU32(refScreen.id); - os.writeU16(refScreen.dimensions.tl.x); - os.writeU16(refScreen.dimensions.tl.y); - os.writeU16(refScreen.dimensions.width()); - os.writeU16(refScreen.dimensions.height()); - os.writeU32(refScreen.flags); - } - - endMsg(); - } -} diff --git a/java/src/com/tigervnc/rfb/CSecurity.java b/java/src/com/tigervnc/rfb/CSecurity.java deleted file mode 100644 index e5b300f6..00000000 --- a/java/src/com/tigervnc/rfb/CSecurity.java +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// CSecurity - class on the client side for handling security handshaking. A -// derived class for a particular security type overrides the processMsg() -// method. processMsg() is called first when the security type has been -// decided on, and will keep being called whenever there is data to read from -// the server until either it returns 0, indicating authentication/security -// failure, or it returns 1, to indicate success. A return value of 2 -// (actually anything other than 0 or 1) indicates that it should be called -// back when there is more data to read. -// -// Note that the first time processMsg() is called, there is no guarantee that -// there is any data to read from the CConnection's InStream, but subsequent -// calls guarantee there is at least one byte which can be read without -// blocking. - -package com.tigervnc.rfb; - -abstract public class CSecurity { - abstract public boolean processMsg(CConnection cc); - abstract public int getType(); - abstract public String description(); - - /* - * Use variable directly instead of dumb get/set methods. - * It MUST be set by viewer. - */ - static UserPasswdGetter upg; -} diff --git a/java/src/com/tigervnc/rfb/CSecurityIdent.java b/java/src/com/tigervnc/rfb/CSecurityIdent.java deleted file mode 100644 index 6523e411..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityIdent.java +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import java.io.IOException; - -import com.tigervnc.rdr.*; -import com.tigervnc.vncviewer.*; - -public class CSecurityIdent extends CSecurity { - - public CSecurityIdent() { } - - public boolean processMsg(CConnection cc) { - InStream is = cc.getInStream(); - OutStream os = cc.getOutStream(); - - StringBuffer username = new StringBuffer(); - - CConn.upg.getUserPasswd(username, null); - - // Return the response to the server - os.writeU32(username.length()); - try { - byte[] utf8str = username.toString().getBytes("UTF8"); - os.writeBytes(utf8str, 0, username.length()); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - os.flush(); - return true; - } - - public int getType() { return Security.secTypeIdent; } - - java.net.Socket sock; - UserPasswdGetter upg; - - static LogWriter vlog = new LogWriter("Ident"); - public String description() { return "No Encryption"; } - -} diff --git a/java/src/com/tigervnc/rfb/CSecurityManaged.java b/java/src/com/tigervnc/rfb/CSecurityManaged.java deleted file mode 100644 index 2461682d..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityManaged.java +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import java.io.IOException; - -import com.tigervnc.rdr.*; -import com.tigervnc.vncviewer.*; - -public class CSecurityManaged extends CSecurity { - - public CSecurityManaged() { } - - public boolean processMsg(CConnection cc) { - InStream is = cc.getInStream(); - OutStream os = cc.getOutStream(); - - StringBuffer username = new StringBuffer(); - - CConn.upg.getUserPasswd(username, null); - - // Return the response to the server - os.writeU8(username.length()); - try { - byte[] utf8str = username.toString().getBytes("UTF8"); - os.writeBytes(utf8str, 0, username.length()); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - os.flush(); - int serverPort = is.readU16(); - //if (serverPort==0) { return true; }; - String serverName = cc.getServerName(); - vlog.debug("Redirected to "+serverName+" port "+serverPort); - try { - CConn.getSocket().close(); - cc.setServerPort(serverPort); - sock = new java.net.Socket(serverName, serverPort); - sock.setTcpNoDelay(true); - sock.setTrafficClass(0x10); - CConn.setSocket(sock); - vlog.debug("connected to host "+serverName+" port "+serverPort); - cc.setStreams(new JavaInStream(sock.getInputStream()), - new JavaOutStream(sock.getOutputStream())); - cc.initialiseProtocol(); - } catch (java.io.IOException e) { - e.printStackTrace(); - } - return false; - } - - public int getType() { return Security.secTypeManaged; } - - java.net.Socket sock; - UserPasswdGetter upg; - - static LogWriter vlog = new LogWriter("Managed"); - public String description() { return "No Encryption"; } - -} diff --git a/java/src/com/tigervnc/rfb/CSecurityNone.java b/java/src/com/tigervnc/rfb/CSecurityNone.java deleted file mode 100644 index e31056da..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityNone.java +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class CSecurityNone extends CSecurity { - - public boolean processMsg(CConnection cc) { return true; } - public int getType() { return Security.secTypeNone; } - public String description() { return "No Encryption"; } - static LogWriter vlog = new LogWriter("CSecurityNone"); -} diff --git a/java/src/com/tigervnc/rfb/CSecurityPlain.java b/java/src/com/tigervnc/rfb/CSecurityPlain.java deleted file mode 100644 index 707915cc..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityPlain.java +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; -import com.tigervnc.vncviewer.*; - -public class CSecurityPlain extends CSecurity { - - public CSecurityPlain() { } - - public boolean processMsg(CConnection cc) - { - OutStream os = cc.getOutStream(); - - StringBuffer username = new StringBuffer(); - StringBuffer password = new StringBuffer(); - - CConn.upg.getUserPasswd(username, password); - - // Return the response to the server - os.writeU32(username.length()); - os.writeU32(password.length()); - byte[] utf8str; - try { - utf8str = username.toString().getBytes("UTF8"); - os.writeBytes(utf8str, 0, username.length()); - utf8str = password.toString().getBytes("UTF8"); - os.writeBytes(utf8str, 0, password.length()); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - os.flush(); - return true; - } - - public int getType() { return Security.secTypePlain; } - public String description() { return "ask for username and password"; } - - static LogWriter vlog = new LogWriter("Plain"); -} diff --git a/java/src/com/tigervnc/rfb/CSecurityStack.java b/java/src/com/tigervnc/rfb/CSecurityStack.java deleted file mode 100644 index 5886268e..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityStack.java +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 2005 Martin Koegler - * Copyright (C) 2010 TigerVNC Team - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class CSecurityStack extends CSecurity { - - public CSecurityStack(int Type, String Name, CSecurity s0, - CSecurity s1) - { - name = Name; - type = Type; - state = 0; - state0 = s0; - state1 = s1; - } - - public boolean processMsg(CConnection cc) - { - boolean res = true; - if (state == 0) { - if (state0 != null) - res = state0.processMsg(cc); - - if (!res) - return res; - - state++; - } - - if (state == 1) { - if(state1 != null) - res = state1.processMsg(cc); - - if(!res) - return res; - - state++; - } - - return res; - } - - public final int getType() { return type; } - public final String description() { return name; } - - private int state; - private CSecurity state0; - private CSecurity state1; - private String name; - private int type; - -} diff --git a/java/src/com/tigervnc/rfb/CSecurityTLS.java b/java/src/com/tigervnc/rfb/CSecurityTLS.java deleted file mode 100644 index 73eb6199..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityTLS.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (C) 2003 Sun Microsystems, Inc. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import javax.net.ssl.*; -import java.security.*; -import java.security.cert.*; -import java.security.KeyStore; -import java.io.File; -import java.io.InputStream; -import java.io.FileInputStream; -import java.util.ArrayList; -import java.util.Collection; -import javax.swing.JOptionPane; - -import com.tigervnc.vncviewer.UserPrefs; -import com.tigervnc.rdr.*; - -public class CSecurityTLS extends CSecurity { - - public static StringParameter x509ca - = new StringParameter("x509ca", - "X509 CA certificate", ""); - public static StringParameter x509crl - = new StringParameter("x509crl", - "X509 CRL file", ""); - - private void initGlobal() - { - try { - SSLSocketFactory sslfactory; - SSLContext ctx = SSLContext.getInstance("TLS"); - if (anon) { - ctx.init(null, null, null); - } else { - TrustManager[] myTM = new TrustManager[] { - new MyX509TrustManager() - }; - ctx.init (null, myTM, null); - } - sslfactory = ctx.getSocketFactory(); - try { - ssl = (SSLSocket)sslfactory.createSocket(cc.sock, - cc.sock.getInetAddress().getHostName(), - cc.sock.getPort(), true); - } catch (java.io.IOException e) { - throw new Exception(e.toString()); - } - - if (anon) { - String[] supported; - ArrayList<String> enabled = new ArrayList<String>(); - - supported = ssl.getSupportedCipherSuites(); - - for (int i = 0; i < supported.length; i++) - if (supported[i].matches("TLS_DH_anon.*")) - enabled.add(supported[i]); - - ssl.setEnabledCipherSuites(enabled.toArray(new String[0])); - } else { - ssl.setEnabledCipherSuites(ssl.getSupportedCipherSuites()); - } - - ssl.setEnabledProtocols(new String[]{"SSLv3","TLSv1"}); - ssl.addHandshakeCompletedListener(new MyHandshakeListener()); - } - catch (java.security.GeneralSecurityException e) - { - vlog.error ("TLS handshake failed " + e.toString ()); - return; - } - } - - public CSecurityTLS(boolean _anon) - { - anon = _anon; - setDefaults(); - cafile = x509ca.getData(); - crlfile = x509crl.getData(); - } - - public static void setDefaults() - { - String homeDir = null; - - if ((homeDir=UserPrefs.getHomeDir()) == null) { - vlog.error("Could not obtain VNC home directory path"); - return; - } - - String vnchomedir = homeDir+UserPrefs.getFileSeparator()+".vnc"+ - UserPrefs.getFileSeparator(); - String caDefault = new String(vnchomedir+"x509_ca.pem"); - String crlDefault = new String(vnchomedir+"x509_crl.pem"); - - if (new File(caDefault).exists()) - x509ca.setDefaultStr(caDefault); - if (new File(crlDefault).exists()) - x509crl.setDefaultStr(crlDefault); - } - - public boolean processMsg(CConnection cc) { - is = cc.getInStream(); - os = cc.getOutStream(); - - initGlobal(); - - if (!is.checkNoWait(1)) - return false; - - if (is.readU8() == 0) { - int result = is.readU32(); - String reason; - if (result == Security.secResultFailed || - result == Security.secResultTooMany) - reason = is.readString(); - else - reason = new String("Authentication failure (protocol error)"); - throw new AuthFailureException(reason); - } - - // SSLSocket.getSession blocks until the handshake is complete - session = ssl.getSession(); - if (!session.isValid()) - throw new Exception("TLS Handshake failed!"); - - try { - cc.setStreams(new JavaInStream(ssl.getInputStream()), - new JavaOutStream(ssl.getOutputStream())); - } catch (java.io.IOException e) { - throw new Exception("Failed to set streams"); - } - - return true; - } - - class MyHandshakeListener implements HandshakeCompletedListener { - public void handshakeCompleted(HandshakeCompletedEvent e) { - vlog.info("Handshake succesful!"); - vlog.info("Using cipher suite: " + e.getCipherSuite()); - } - } - - class MyX509TrustManager implements X509TrustManager - { - - X509TrustManager tm; - - MyX509TrustManager() throws java.security.GeneralSecurityException - { - TrustManagerFactory tmf = - TrustManagerFactory.getInstance("PKIX"); - KeyStore ks = KeyStore.getInstance("JKS"); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - try { - ks.load(null, null); - File cacert = new File(cafile); - if (!cacert.exists() || !cacert.canRead()) - return; - InputStream caStream = new FileInputStream(cafile); - X509Certificate ca = (X509Certificate)cf.generateCertificate(caStream); - ks.setCertificateEntry("CA", ca); - PKIXBuilderParameters params = new PKIXBuilderParameters(ks, new X509CertSelector()); - File crlcert = new File(crlfile); - if (!crlcert.exists() || !crlcert.canRead()) { - params.setRevocationEnabled(false); - } else { - InputStream crlStream = new FileInputStream(crlfile); - Collection<? extends CRL> crls = cf.generateCRLs(crlStream); - CertStoreParameters csp = new CollectionCertStoreParameters(crls); - CertStore store = CertStore.getInstance("Collection", csp); - params.addCertStore(store); - params.setRevocationEnabled(true); - } - tmf.init(new CertPathTrustManagerParameters(params)); - } catch (java.io.FileNotFoundException e) { - vlog.error(e.toString()); - } catch (java.io.IOException e) { - vlog.error(e.toString()); - } - tm = (X509TrustManager)tmf.getTrustManagers()[0]; - } - - public void checkClientTrusted(X509Certificate[] chain, String authType) - throws CertificateException - { - tm.checkClientTrusted(chain, authType); - } - - public void checkServerTrusted(X509Certificate[] chain, String authType) - throws CertificateException - { - try { - tm.checkServerTrusted(chain, authType); - } catch (CertificateException e) { - Object[] answer = {"Proceed", "Exit"}; - int ret = JOptionPane.showOptionDialog(null, - e.getCause().getLocalizedMessage()+"\n"+ - "Continue connecting to this host?", - "Confirm certificate exception?", - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, - null, answer, answer[0]); - if (ret == JOptionPane.NO_OPTION) - System.exit(1); - } catch (java.lang.Exception e) { - throw new Exception(e.toString()); - } - } - - public X509Certificate[] getAcceptedIssuers () - { - return tm.getAcceptedIssuers(); - } - } - - public final int getType() { return anon ? Security.secTypeTLSNone : Security.secTypeX509None; } - public final String description() - { return anon ? "TLS Encryption without VncAuth" : "X509 Encryption without VncAuth"; } - - - //protected void setParam(); - //protected void checkSession(); - protected CConnection cc; - - private boolean anon; - private SSLSession session; - private String cafile, crlfile; - private InStream is; - private OutStream os; - private SSLSocket ssl; - - static LogWriter vlog = new LogWriter("CSecurityTLS"); -} diff --git a/java/src/com/tigervnc/rfb/CSecurityVeNCrypt.java b/java/src/com/tigervnc/rfb/CSecurityVeNCrypt.java deleted file mode 100644 index ae758e7f..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityVeNCrypt.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2003 Sun Microsystems, Inc. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import java.util.*; - -import com.tigervnc.rdr.*; - -public class CSecurityVeNCrypt extends CSecurity { - - public CSecurityVeNCrypt(SecurityClient sec) - { - haveRecvdMajorVersion = false; - haveRecvdMinorVersion = false; - haveSentVersion = false; - haveAgreedVersion = false; - haveListOfTypes = false; - haveNumberOfTypes = false; - haveChosenType = false; - majorVersion = 0; - minorVersion = 0; - chosenType = Security.secTypeVeNCrypt; - nAvailableTypes = 0; - availableTypes = null; - iAvailableType = 0; - security = sec; - } - - public boolean processMsg(CConnection cc) { - InStream is = cc.getInStream(); - OutStream os = cc.getOutStream(); - - /* get major, minor versions, send what we can support (or 0.0 for can't support it) */ - if (!haveRecvdMinorVersion) { - minorVersion = is.readU8(); - haveRecvdMinorVersion = true; - - return false; - } - - if (!haveRecvdMajorVersion) { - majorVersion = is.readU8(); - haveRecvdMajorVersion = true; - } - - /* major version in upper 8 bits and minor version in lower 8 bits */ - int Version = (majorVersion << 8) | minorVersion; - - if (!haveSentVersion) { - /* Currently we don't support former VeNCrypt 0.1 */ - if (Version >= 0x0002) { - majorVersion = 0; - minorVersion = 2; - os.writeU8(majorVersion); - os.writeU8(minorVersion); - os.flush(); - } else { - /* Send 0.0 to indicate no support */ - majorVersion = 0; - minorVersion = 0; - os.writeU8(majorVersion); - os.writeU8(minorVersion); - os.flush(); - throw new Exception("Server reported an unsupported VeNCrypt version"); - } - - haveSentVersion = true; - return false; - } - - /* Check that the server is OK */ - if (!haveAgreedVersion) { - if (is.readU8() != 0) - throw new Exception("Server reported it could not support the VeNCrypt version"); - - haveAgreedVersion = true; - return false; - } - - /* get a number of types */ - if (!haveNumberOfTypes) { - nAvailableTypes = is.readU8(); - iAvailableType = 0; - - if (nAvailableTypes <= 0) - throw new Exception("The server reported no VeNCrypt sub-types"); - - availableTypes = new int[nAvailableTypes]; - haveNumberOfTypes = true; - return false; - } - - if (nAvailableTypes > 0) { - /* read in the types possible */ - if (!haveListOfTypes) { - if (is.checkNoWait(4)) { - availableTypes[iAvailableType++] = is.readU32(); - haveListOfTypes = (iAvailableType >= nAvailableTypes); - vlog.debug("Server offers security type "+ - Security.secTypeName(availableTypes[iAvailableType - 1])+" ("+ - availableTypes[iAvailableType - 1]+")"); - - if (!haveListOfTypes) - return false; - - } else - return false; - } - - /* make a choice and send it to the server, meanwhile set up the stack */ - if (!haveChosenType) { - chosenType = Security.secTypeInvalid; - int i; - Iterator j; - List<Integer> secTypes = new ArrayList<Integer>(); - - secTypes = security.GetEnabledExtSecTypes(); - - /* Honor server's security type order */ - for (i = 0; i < nAvailableTypes; i++) { - for (j = secTypes.iterator(); j.hasNext(); ) { - int refType = (Integer)j.next(); - if (refType == availableTypes[i]) { - chosenType = refType; - break; - } - } - - if (chosenType != Security.secTypeInvalid) - break; - } - - vlog.debug("Choosing security type "+Security.secTypeName(chosenType)+ - " ("+chosenType+")"); - - /* Set up the stack according to the chosen type: */ - if (chosenType == Security.secTypeInvalid || chosenType == Security.secTypeVeNCrypt) - throw new AuthFailureException("No valid VeNCrypt sub-type"); - - csecurity = security.GetCSecurity(chosenType); - - /* send chosen type to server */ - os.writeU32(chosenType); - os.flush(); - - haveChosenType = true; - } - } else { - /* - * Server told us that there are 0 types it can support - this should not - * happen, since if the server supports 0 sub-types, it doesn't support - * this security type - */ - throw new AuthFailureException("The server reported 0 VeNCrypt sub-types"); - } - - return csecurity.processMsg(cc); - } - - public final int getType() { return chosenType; } - public final String description() { return Security.secTypeName(chosenType); } - - public static StringParameter secTypesStr; - - private CSecurity csecurity; - SecurityClient security; - private boolean haveRecvdMajorVersion; - private boolean haveRecvdMinorVersion; - private boolean haveSentVersion; - private boolean haveAgreedVersion; - private boolean haveListOfTypes; - private boolean haveNumberOfTypes; - private boolean haveChosenType; - private int majorVersion, minorVersion; - private int chosenType; - private int nAvailableTypes; - private int[] availableTypes; - private int iAvailableType; - //private final String desc; - - static LogWriter vlog = new LogWriter("CSecurityVeNCrypt"); -} diff --git a/java/src/com/tigervnc/rfb/CSecurityVncAuth.java b/java/src/com/tigervnc/rfb/CSecurityVncAuth.java deleted file mode 100644 index 405e79fa..00000000 --- a/java/src/com/tigervnc/rfb/CSecurityVncAuth.java +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; -import com.tigervnc.vncviewer.*; - -public class CSecurityVncAuth extends CSecurity { - - public CSecurityVncAuth() { } - - private static final int vncAuthChallengeSize = 16; - - public boolean processMsg(CConnection cc) - { - InStream is = cc.getInStream(); - OutStream os = cc.getOutStream(); - - // Read the challenge & obtain the user's password - byte[] challenge = new byte[vncAuthChallengeSize]; - is.readBytes(challenge, 0, vncAuthChallengeSize); - StringBuffer passwd = new StringBuffer(); - CConn.upg.getUserPasswd(null, passwd); - - // Calculate the correct response - byte[] key = new byte[8]; - int pwdLen = passwd.length(); - byte[] utf8str = new byte[pwdLen]; - try { - utf8str = passwd.toString().getBytes("UTF8"); - } catch(java.io.UnsupportedEncodingException e) { - e.printStackTrace(); - } - for (int i=0; i<8; i++) - key[i] = i<pwdLen ? utf8str[i] : 0; - DesCipher des = new DesCipher(key); - for (int j = 0; j < vncAuthChallengeSize; j += 8) - des.encrypt(challenge,j,challenge,j); - - // Return the response to the server - os.writeBytes(challenge, 0, vncAuthChallengeSize); - os.flush(); - return true; - } - - public int getType() { return Security.secTypeVncAuth; } - public String description() { return "No Encryption"; } - - static LogWriter vlog = new LogWriter("VncAuth"); -} diff --git a/java/src/com/tigervnc/rfb/Configuration.java b/java/src/com/tigervnc/rfb/Configuration.java deleted file mode 100644 index bc676087..00000000 --- a/java/src/com/tigervnc/rfb/Configuration.java +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// Configuration - class for dealing with configuration parameters. -// - -package com.tigervnc.rfb; - -public class Configuration { - - // - Set named parameter to value - public static boolean setParam(String name, String value) { - VoidParameter param = getParam(name); - if (param == null) return false; - return param.setParam(value); - } - - // - Set parameter to value (separated by "=") - public static boolean setParam(String config) { - boolean hyphen = false; - if (config.charAt(0) == '-') { - hyphen = true; - if (config.charAt(1) == '-') - config = config.substring(2); // allow gnu-style --<option> - else - config = config.substring(1); - } - int equal = config.indexOf('='); - if (equal != -1) { - return setParam(config.substring(0, equal), config.substring(equal+1)); - } else if (hyphen) { - VoidParameter param = getParam(config); - if (param == null) return false; - return param.setParam(); - } - return false; - } - - // - Get named parameter - public static VoidParameter getParam(String name) { - VoidParameter current = head; - while (current != null) { - if (name.equalsIgnoreCase(current.getName())) - return current; - current = current.next; - } - return null; - } - - public static String listParams() { - StringBuffer s = new StringBuffer(); - - VoidParameter current = head; - while (current != null) { - String def_str = current.getDefaultStr(); - String desc = current.getDescription(); - s.append(" "+current.getName()+" - "+desc+" (default="+def_str+")\n"); - current = current.next; - } - - return s.toString(); - } - - public static void readAppletParams(java.applet.Applet applet) { - VoidParameter current = head; - while (current != null) { - String str = applet.getParameter(current.getName()); - if (str != null) - current.setParam(str); - current = current.next; - } - } - - public static VoidParameter head; -} diff --git a/java/src/com/tigervnc/rfb/ConnFailedException.java b/java/src/com/tigervnc/rfb/ConnFailedException.java deleted file mode 100644 index d1ddcb4e..00000000 --- a/java/src/com/tigervnc/rfb/ConnFailedException.java +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class ConnFailedException extends Exception { - public ConnFailedException(String s) { super(s); } -} diff --git a/java/src/com/tigervnc/rfb/ConnParams.java b/java/src/com/tigervnc/rfb/ConnParams.java deleted file mode 100644 index 70d6114f..00000000 --- a/java/src/com/tigervnc/rfb/ConnParams.java +++ /dev/null @@ -1,171 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -public class ConnParams { - static LogWriter vlog = new LogWriter("ConnParams"); - - public ConnParams() { - majorVersion = 0; minorVersion = 0; - width = 0; height = 0; useCopyRect = false; - supportsLocalCursor = false; supportsLocalXCursor = false; - supportsDesktopResize = false; supportsExtendedDesktopSize = false; - supportsDesktopRename = false; supportsLastRect = false; - supportsSetDesktopSize = false; supportsClientRedirect = false; - customCompressLevel = false; compressLevel = 6; - noJpeg = false; qualityLevel = -1; - name_ = null; nEncodings_ = 0; encodings_ = null; - currentEncoding_ = Encodings.encodingRaw; verStrPos = 0; - screenLayout = new ScreenSet(); - - setName(""); - } - - public boolean readVersion(InStream is, Boolean done) - { - if (verStrPos >= 12) return false; - verStr = new StringBuilder(13); - while (verStrPos < 12 && is.checkNoWait(1)) { - verStr.insert(verStrPos++,(char)is.readU8()); - } - - if (verStrPos < 12) { - done = Boolean.valueOf(false); - return true; - } - done = Boolean.valueOf(true); - verStr.insert(12,'0'); - verStrPos = 0; - if (verStr.toString().matches("RFB \\d{3}\\.\\d{3}\\n0")) { - majorVersion = Integer.parseInt(verStr.substring(4,7)); - minorVersion = Integer.parseInt(verStr.substring(8,11)); - return true; - } - return false; - } - - public void writeVersion(OutStream os) { - String str = String.format("RFB %03d.%03d\n", majorVersion, minorVersion); - os.writeBytes(str.getBytes(), 0, 12); - os.flush(); - } - - public int majorVersion; - public int minorVersion; - - public void setVersion(int major, int minor) { - majorVersion = major; minorVersion = minor; - } - public boolean isVersion(int major, int minor) { - return majorVersion == major && minorVersion == minor; - } - public boolean beforeVersion(int major, int minor) { - return (majorVersion < major || - (majorVersion == major && minorVersion < minor)); - } - public boolean afterVersion(int major, int minor) { - return !beforeVersion(major,minor+1); - } - - public int width; - public int height; - public ScreenSet screenLayout; - - public PixelFormat pf() { return pf_; } - public void setPF(PixelFormat pf) { - pf_ = pf; - if (pf.bpp != 8 && pf.bpp != 16 && pf.bpp != 32) { - throw new Exception("setPF: not 8, 16 or 32 bpp?"); - } - } - - public String name() { return name_; } - public void setName(String name) - { - name_ = name; - } - - public int currentEncoding() { return currentEncoding_; } - public int nEncodings() { return nEncodings_; } - public int[] encodings() { return encodings_; } - public void setEncodings(int nEncodings, int[] encodings) - { - if (nEncodings > nEncodings_) { - encodings_ = new int[nEncodings]; - } - nEncodings_ = nEncodings; - useCopyRect = false; - supportsLocalCursor = false; - supportsDesktopResize = false; - customCompressLevel = false; - compressLevel = -1; - noJpeg = true; - qualityLevel = -1; - currentEncoding_ = Encodings.encodingRaw; - - for (int i = nEncodings-1; i >= 0; i--) { - encodings_[i] = encodings[i]; - if (encodings[i] == Encodings.encodingCopyRect) - useCopyRect = true; - else if (encodings[i] == Encodings.pseudoEncodingCursor) - supportsLocalCursor = true; - else if (encodings[i] == Encodings.pseudoEncodingDesktopSize) - supportsDesktopResize = true; - else if (encodings[i] == Encodings.pseudoEncodingClientRedirect) - supportsClientRedirect = true; - else if (encodings[i] >= Encodings.pseudoEncodingCompressLevel0 && - encodings[i] <= Encodings.pseudoEncodingCompressLevel9) { - customCompressLevel = true; - compressLevel = encodings[i] - Encodings.pseudoEncodingCompressLevel0; - } else if (encodings[i] >= Encodings.pseudoEncodingQualityLevel0 && - encodings[i] <= Encodings.pseudoEncodingQualityLevel9) { - noJpeg = false; - qualityLevel = encodings[i] - Encodings.pseudoEncodingQualityLevel0; - } else if (encodings[i] <= Encodings.encodingMax && - Encoder.supported(encodings[i])) - currentEncoding_ = encodings[i]; - } - } - public boolean useCopyRect; - - public boolean supportsLocalCursor; - public boolean supportsLocalXCursor; - public boolean supportsDesktopResize; - public boolean supportsExtendedDesktopSize; - public boolean supportsDesktopRename; - public boolean supportsClientRedirect; - public boolean supportsLastRect; - - public boolean supportsSetDesktopSize; - - public boolean customCompressLevel; - public int compressLevel; - public boolean noJpeg; - public int qualityLevel; - - private PixelFormat pf_; - private String name_; - private int nEncodings_; - private int[] encodings_; - private int currentEncoding_; - private StringBuilder verStr; - private int verStrPos; -} diff --git a/java/src/com/tigervnc/rfb/Cursor.java b/java/src/com/tigervnc/rfb/Cursor.java deleted file mode 100644 index 420eb82a..00000000 --- a/java/src/com/tigervnc/rfb/Cursor.java +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import java.awt.*; - -public class Cursor extends ManagedPixelBuffer { - - public void setSize(int w, int h) { - super.setSize(w, h); - if (mask == null || mask.length < maskLen()) - mask = new byte[maskLen()]; - } - public int maskLen() { return (width() + 7) / 8 * height(); } - - public Point hotspot; - public byte[] mask; -} diff --git a/java/src/com/tigervnc/rfb/Decoder.java b/java/src/com/tigervnc/rfb/Decoder.java deleted file mode 100644 index 8d42ea5e..00000000 --- a/java/src/com/tigervnc/rfb/Decoder.java +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -abstract public class Decoder { - - abstract public void readRect(Rect r, CMsgHandler handler); - - static public boolean supported(int encoding) - { -/* - return encoding <= Encodings.encodingMax && createFns[encoding]; -*/ - return (encoding == Encodings.encodingRaw || - encoding == Encodings.encodingRRE || - encoding == Encodings.encodingHextile || - encoding == Encodings.encodingTight || - encoding == Encodings.encodingZRLE); - } - static public Decoder createDecoder(int encoding, CMsgReader reader) { -/* - if (encoding <= Encodings.encodingMax && createFns[encoding]) - return (createFns[encoding])(reader); - return 0; -*/ - switch(encoding) { - case Encodings.encodingRaw: return new RawDecoder(reader); - case Encodings.encodingRRE: return new RREDecoder(reader); - case Encodings.encodingHextile: return new HextileDecoder(reader); - case Encodings.encodingTight: return new TightDecoder(reader); - case Encodings.encodingZRLE: return new ZRLEDecoder(reader); - } - return null; - } -} diff --git a/java/src/com/tigervnc/rfb/DesCipher.java b/java/src/com/tigervnc/rfb/DesCipher.java deleted file mode 100644 index f7ae9db9..00000000 --- a/java/src/com/tigervnc/rfb/DesCipher.java +++ /dev/null @@ -1,496 +0,0 @@ -// -// This DES class has been extracted from package Acme.Crypto for use in VNC. -// The bytebit[] array has been reversed so that the most significant bit -// in each byte of the key is ignored, not the least significant. Also the -// unnecessary odd parity code has been removed. -// -// These changes are: -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// - -// DesCipher - the DES encryption method -// -// The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is: -// -// Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. -// -// Permission to use, copy, modify, and distribute this software -// and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and -// without fee is hereby granted, provided that this copyright notice is kept -// intact. -// -// WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY -// OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE -// FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR -// DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. -// -// THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE -// CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE -// PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT -// NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE -// SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE -// SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE -// PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP -// SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR -// HIGH RISK ACTIVITIES. -// -// -// The rest is: -// -// Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -// SUCH DAMAGE. -// -// Visit the ACME Labs Java page for up-to-date versions of this and other -// fine Java utilities: http://www.acme.com/java/ - - -/// The DES encryption method. -// <P> -// This is surprisingly fast, for pure Java. On a SPARC 20, wrapped -// in Acme.Crypto.EncryptedOutputStream or Acme.Crypto.EncryptedInputStream, -// it does around 7000 bytes/second. -// <P> -// Most of this code is by Dave Zimmerman <dzimm@widget.com>, and is -// Copyright (c) 1996 Widget Workshop, Inc. See the source file for details. -// <P> -// <A HREF="/resources/classes/Acme/Crypto/DesCipher.java">Fetch the software.</A><BR> -// <A HREF="/resources/classes/Acme.tar.Z">Fetch the entire Acme package.</A> -// <P> -// @see Des3Cipher -// @see EncryptedOutputStream -// @see EncryptedInputStream - -package com.tigervnc.rfb; - -public class DesCipher - { - - // Constructor, byte-array key. - public DesCipher( byte[] key ) - { - setKey( key ); - } - - // Key routines. - - private int[] encryptKeys = new int[32]; - private int[] decryptKeys = new int[32]; - - /// Set the key. - public void setKey( byte[] key ) - { - deskey( key, true, encryptKeys ); - deskey( key, false, decryptKeys ); - } - - // Turn an 8-byte key into internal keys. - private void deskey( byte[] keyBlock, boolean encrypting, int[] KnL ) - { - int i, j, l, m, n; - int[] pc1m = new int[56]; - int[] pcr = new int[56]; - int[] kn = new int[32]; - - for ( j = 0; j < 56; ++j ) - { - l = pc1[j]; - m = l & 07; - pc1m[j] = ( (keyBlock[l >>> 3] & bytebit[m]) != 0 )? 1: 0; - } - - for ( i = 0; i < 16; ++i ) - { - if ( encrypting ) - m = i << 1; - else - m = (15-i) << 1; - n = m+1; - kn[m] = kn[n] = 0; - for ( j = 0; j < 28; ++j ) - { - l = j+totrot[i]; - if ( l < 28 ) - pcr[j] = pc1m[l]; - else - pcr[j] = pc1m[l-28]; - } - for ( j=28; j < 56; ++j ) - { - l = j+totrot[i]; - if ( l < 56 ) - pcr[j] = pc1m[l]; - else - pcr[j] = pc1m[l-28]; - } - for ( j = 0; j < 24; ++j ) - { - if ( pcr[pc2[j]] != 0 ) - kn[m] |= bigbyte[j]; - if ( pcr[pc2[j+24]] != 0 ) - kn[n] |= bigbyte[j]; - } - } - cookey( kn, KnL ); - } - - private void cookey( int[] raw, int KnL[] ) - { - int raw0, raw1; - int rawi, KnLi; - int i; - - for ( i = 0, rawi = 0, KnLi = 0; i < 16; ++i ) - { - raw0 = raw[rawi++]; - raw1 = raw[rawi++]; - KnL[KnLi] = (raw0 & 0x00fc0000) << 6; - KnL[KnLi] |= (raw0 & 0x00000fc0) << 10; - KnL[KnLi] |= (raw1 & 0x00fc0000) >>> 10; - KnL[KnLi] |= (raw1 & 0x00000fc0) >>> 6; - ++KnLi; - KnL[KnLi] = (raw0 & 0x0003f000) << 12; - KnL[KnLi] |= (raw0 & 0x0000003f) << 16; - KnL[KnLi] |= (raw1 & 0x0003f000) >>> 4; - KnL[KnLi] |= (raw1 & 0x0000003f); - ++KnLi; - } - } - - - // Block encryption routines. - - private int[] tempInts = new int[2]; - - /// Encrypt a block of eight bytes. - public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff ) - { - squashBytesToInts( clearText, clearOff, tempInts, 0, 2 ); - des( tempInts, tempInts, encryptKeys ); - spreadIntsToBytes( tempInts, 0, cipherText, cipherOff, 2 ); - } - - /// Decrypt a block of eight bytes. - public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff ) - { - squashBytesToInts( cipherText, cipherOff, tempInts, 0, 2 ); - des( tempInts, tempInts, decryptKeys ); - spreadIntsToBytes( tempInts, 0, clearText, clearOff, 2 ); - } - - // The DES function. - private void des( int[] inInts, int[] outInts, int[] keys ) - { - int fval, work, right, leftt; - int round; - int keysi = 0; - - leftt = inInts[0]; - right = inInts[1]; - - work = ((leftt >>> 4) ^ right) & 0x0f0f0f0f; - right ^= work; - leftt ^= (work << 4); - - work = ((leftt >>> 16) ^ right) & 0x0000ffff; - right ^= work; - leftt ^= (work << 16); - - work = ((right >>> 2) ^ leftt) & 0x33333333; - leftt ^= work; - right ^= (work << 2); - - work = ((right >>> 8) ^ leftt) & 0x00ff00ff; - leftt ^= work; - right ^= (work << 8); - right = (right << 1) | ((right >>> 31) & 1); - - work = (leftt ^ right) & 0xaaaaaaaa; - leftt ^= work; - right ^= work; - leftt = (leftt << 1) | ((leftt >>> 31) & 1); - - for ( round = 0; round < 8; ++round ) - { - work = (right << 28) | (right >>> 4); - work ^= keys[keysi++]; - fval = SP7[ work & 0x0000003f ]; - fval |= SP5[(work >>> 8) & 0x0000003f ]; - fval |= SP3[(work >>> 16) & 0x0000003f ]; - fval |= SP1[(work >>> 24) & 0x0000003f ]; - work = right ^ keys[keysi++]; - fval |= SP8[ work & 0x0000003f ]; - fval |= SP6[(work >>> 8) & 0x0000003f ]; - fval |= SP4[(work >>> 16) & 0x0000003f ]; - fval |= SP2[(work >>> 24) & 0x0000003f ]; - leftt ^= fval; - work = (leftt << 28) | (leftt >>> 4); - work ^= keys[keysi++]; - fval = SP7[ work & 0x0000003f ]; - fval |= SP5[(work >>> 8) & 0x0000003f ]; - fval |= SP3[(work >>> 16) & 0x0000003f ]; - fval |= SP1[(work >>> 24) & 0x0000003f ]; - work = leftt ^ keys[keysi++]; - fval |= SP8[ work & 0x0000003f ]; - fval |= SP6[(work >>> 8) & 0x0000003f ]; - fval |= SP4[(work >>> 16) & 0x0000003f ]; - fval |= SP2[(work >>> 24) & 0x0000003f ]; - right ^= fval; - } - - right = (right << 31) | (right >>> 1); - work = (leftt ^ right) & 0xaaaaaaaa; - leftt ^= work; - right ^= work; - leftt = (leftt << 31) | (leftt >>> 1); - work = ((leftt >>> 8) ^ right) & 0x00ff00ff; - right ^= work; - leftt ^= (work << 8); - work = ((leftt >>> 2) ^ right) & 0x33333333; - right ^= work; - leftt ^= (work << 2); - work = ((right >>> 16) ^ leftt) & 0x0000ffff; - leftt ^= work; - right ^= (work << 16); - work = ((right >>> 4) ^ leftt) & 0x0f0f0f0f; - leftt ^= work; - right ^= (work << 4); - outInts[0] = right; - outInts[1] = leftt; - } - - - // Tables, permutations, S-boxes, etc. - - private static byte[] bytebit = { - (byte)0x01, (byte)0x02, (byte)0x04, (byte)0x08, - (byte)0x10, (byte)0x20, (byte)0x40, (byte)0x80 - }; - private static int[] bigbyte = { - 0x800000, 0x400000, 0x200000, 0x100000, - 0x080000, 0x040000, 0x020000, 0x010000, - 0x008000, 0x004000, 0x002000, 0x001000, - 0x000800, 0x000400, 0x000200, 0x000100, - 0x000080, 0x000040, 0x000020, 0x000010, - 0x000008, 0x000004, 0x000002, 0x000001 - }; - private static byte[] pc1 = { - (byte)56, (byte)48, (byte)40, (byte)32, (byte)24, (byte)16, (byte) 8, - (byte) 0, (byte)57, (byte)49, (byte)41, (byte)33, (byte)25, (byte)17, - (byte) 9, (byte) 1, (byte)58, (byte)50, (byte)42, (byte)34, (byte)26, - (byte)18, (byte)10, (byte) 2, (byte)59, (byte)51, (byte)43, (byte)35, - (byte)62, (byte)54, (byte)46, (byte)38, (byte)30, (byte)22, (byte)14, - (byte) 6, (byte)61, (byte)53, (byte)45, (byte)37, (byte)29, (byte)21, - (byte)13, (byte) 5, (byte)60, (byte)52, (byte)44, (byte)36, (byte)28, - (byte)20, (byte)12, (byte) 4, (byte)27, (byte)19, (byte)11, (byte)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 = { - (byte)13, (byte)16, (byte)10, (byte)23, (byte) 0, (byte) 4, - (byte) 2, (byte)27, (byte)14, (byte) 5, (byte)20, (byte) 9, - (byte)22, (byte)18, (byte)11, (byte)3 , (byte)25, (byte) 7, - (byte)15, (byte) 6, (byte)26, (byte)19, (byte)12, (byte) 1, - (byte)40, (byte)51, (byte)30, (byte)36, (byte)46, (byte)54, - (byte)29, (byte)39, (byte)50, (byte)44, (byte)32, (byte)47, - (byte)43, (byte)48, (byte)38, (byte)55, (byte)33, (byte)52, - (byte)45, (byte)41, (byte)49, (byte)35, (byte)28, (byte)31, - }; - - private static int[] SP1 = { - 0x01010400, 0x00000000, 0x00010000, 0x01010404, - 0x01010004, 0x00010404, 0x00000004, 0x00010000, - 0x00000400, 0x01010400, 0x01010404, 0x00000400, - 0x01000404, 0x01010004, 0x01000000, 0x00000004, - 0x00000404, 0x01000400, 0x01000400, 0x00010400, - 0x00010400, 0x01010000, 0x01010000, 0x01000404, - 0x00010004, 0x01000004, 0x01000004, 0x00010004, - 0x00000000, 0x00000404, 0x00010404, 0x01000000, - 0x00010000, 0x01010404, 0x00000004, 0x01010000, - 0x01010400, 0x01000000, 0x01000000, 0x00000400, - 0x01010004, 0x00010000, 0x00010400, 0x01000004, - 0x00000400, 0x00000004, 0x01000404, 0x00010404, - 0x01010404, 0x00010004, 0x01010000, 0x01000404, - 0x01000004, 0x00000404, 0x00010404, 0x01010400, - 0x00000404, 0x01000400, 0x01000400, 0x00000000, - 0x00010004, 0x00010400, 0x00000000, 0x01010004 - }; - private static int[] SP2 = { - 0x80108020, 0x80008000, 0x00008000, 0x00108020, - 0x00100000, 0x00000020, 0x80100020, 0x80008020, - 0x80000020, 0x80108020, 0x80108000, 0x80000000, - 0x80008000, 0x00100000, 0x00000020, 0x80100020, - 0x00108000, 0x00100020, 0x80008020, 0x00000000, - 0x80000000, 0x00008000, 0x00108020, 0x80100000, - 0x00100020, 0x80000020, 0x00000000, 0x00108000, - 0x00008020, 0x80108000, 0x80100000, 0x00008020, - 0x00000000, 0x00108020, 0x80100020, 0x00100000, - 0x80008020, 0x80100000, 0x80108000, 0x00008000, - 0x80100000, 0x80008000, 0x00000020, 0x80108020, - 0x00108020, 0x00000020, 0x00008000, 0x80000000, - 0x00008020, 0x80108000, 0x00100000, 0x80000020, - 0x00100020, 0x80008020, 0x80000020, 0x00100020, - 0x00108000, 0x00000000, 0x80008000, 0x00008020, - 0x80000000, 0x80100020, 0x80108020, 0x00108000 - }; - private static int[] SP3 = { - 0x00000208, 0x08020200, 0x00000000, 0x08020008, - 0x08000200, 0x00000000, 0x00020208, 0x08000200, - 0x00020008, 0x08000008, 0x08000008, 0x00020000, - 0x08020208, 0x00020008, 0x08020000, 0x00000208, - 0x08000000, 0x00000008, 0x08020200, 0x00000200, - 0x00020200, 0x08020000, 0x08020008, 0x00020208, - 0x08000208, 0x00020200, 0x00020000, 0x08000208, - 0x00000008, 0x08020208, 0x00000200, 0x08000000, - 0x08020200, 0x08000000, 0x00020008, 0x00000208, - 0x00020000, 0x08020200, 0x08000200, 0x00000000, - 0x00000200, 0x00020008, 0x08020208, 0x08000200, - 0x08000008, 0x00000200, 0x00000000, 0x08020008, - 0x08000208, 0x00020000, 0x08000000, 0x08020208, - 0x00000008, 0x00020208, 0x00020200, 0x08000008, - 0x08020000, 0x08000208, 0x00000208, 0x08020000, - 0x00020208, 0x00000008, 0x08020008, 0x00020200 - }; - private static int[] SP4 = { - 0x00802001, 0x00002081, 0x00002081, 0x00000080, - 0x00802080, 0x00800081, 0x00800001, 0x00002001, - 0x00000000, 0x00802000, 0x00802000, 0x00802081, - 0x00000081, 0x00000000, 0x00800080, 0x00800001, - 0x00000001, 0x00002000, 0x00800000, 0x00802001, - 0x00000080, 0x00800000, 0x00002001, 0x00002080, - 0x00800081, 0x00000001, 0x00002080, 0x00800080, - 0x00002000, 0x00802080, 0x00802081, 0x00000081, - 0x00800080, 0x00800001, 0x00802000, 0x00802081, - 0x00000081, 0x00000000, 0x00000000, 0x00802000, - 0x00002080, 0x00800080, 0x00800081, 0x00000001, - 0x00802001, 0x00002081, 0x00002081, 0x00000080, - 0x00802081, 0x00000081, 0x00000001, 0x00002000, - 0x00800001, 0x00002001, 0x00802080, 0x00800081, - 0x00002001, 0x00002080, 0x00800000, 0x00802001, - 0x00000080, 0x00800000, 0x00002000, 0x00802080 - }; - private static int[] SP5 = { - 0x00000100, 0x02080100, 0x02080000, 0x42000100, - 0x00080000, 0x00000100, 0x40000000, 0x02080000, - 0x40080100, 0x00080000, 0x02000100, 0x40080100, - 0x42000100, 0x42080000, 0x00080100, 0x40000000, - 0x02000000, 0x40080000, 0x40080000, 0x00000000, - 0x40000100, 0x42080100, 0x42080100, 0x02000100, - 0x42080000, 0x40000100, 0x00000000, 0x42000000, - 0x02080100, 0x02000000, 0x42000000, 0x00080100, - 0x00080000, 0x42000100, 0x00000100, 0x02000000, - 0x40000000, 0x02080000, 0x42000100, 0x40080100, - 0x02000100, 0x40000000, 0x42080000, 0x02080100, - 0x40080100, 0x00000100, 0x02000000, 0x42080000, - 0x42080100, 0x00080100, 0x42000000, 0x42080100, - 0x02080000, 0x00000000, 0x40080000, 0x42000000, - 0x00080100, 0x02000100, 0x40000100, 0x00080000, - 0x00000000, 0x40080000, 0x02080100, 0x40000100 - }; - private static int[] SP6 = { - 0x20000010, 0x20400000, 0x00004000, 0x20404010, - 0x20400000, 0x00000010, 0x20404010, 0x00400000, - 0x20004000, 0x00404010, 0x00400000, 0x20000010, - 0x00400010, 0x20004000, 0x20000000, 0x00004010, - 0x00000000, 0x00400010, 0x20004010, 0x00004000, - 0x00404000, 0x20004010, 0x00000010, 0x20400010, - 0x20400010, 0x00000000, 0x00404010, 0x20404000, - 0x00004010, 0x00404000, 0x20404000, 0x20000000, - 0x20004000, 0x00000010, 0x20400010, 0x00404000, - 0x20404010, 0x00400000, 0x00004010, 0x20000010, - 0x00400000, 0x20004000, 0x20000000, 0x00004010, - 0x20000010, 0x20404010, 0x00404000, 0x20400000, - 0x00404010, 0x20404000, 0x00000000, 0x20400010, - 0x00000010, 0x00004000, 0x20400000, 0x00404010, - 0x00004000, 0x00400010, 0x20004010, 0x00000000, - 0x20404000, 0x20000000, 0x00400010, 0x20004010 - }; - private static int[] SP7 = { - 0x00200000, 0x04200002, 0x04000802, 0x00000000, - 0x00000800, 0x04000802, 0x00200802, 0x04200800, - 0x04200802, 0x00200000, 0x00000000, 0x04000002, - 0x00000002, 0x04000000, 0x04200002, 0x00000802, - 0x04000800, 0x00200802, 0x00200002, 0x04000800, - 0x04000002, 0x04200000, 0x04200800, 0x00200002, - 0x04200000, 0x00000800, 0x00000802, 0x04200802, - 0x00200800, 0x00000002, 0x04000000, 0x00200800, - 0x04000000, 0x00200800, 0x00200000, 0x04000802, - 0x04000802, 0x04200002, 0x04200002, 0x00000002, - 0x00200002, 0x04000000, 0x04000800, 0x00200000, - 0x04200800, 0x00000802, 0x00200802, 0x04200800, - 0x00000802, 0x04000002, 0x04200802, 0x04200000, - 0x00200800, 0x00000000, 0x00000002, 0x04200802, - 0x00000000, 0x00200802, 0x04200000, 0x00000800, - 0x04000002, 0x04000800, 0x00000800, 0x00200002 - }; - private static int[] SP8 = { - 0x10001040, 0x00001000, 0x00040000, 0x10041040, - 0x10000000, 0x10001040, 0x00000040, 0x10000000, - 0x00040040, 0x10040000, 0x10041040, 0x00041000, - 0x10041000, 0x00041040, 0x00001000, 0x00000040, - 0x10040000, 0x10000040, 0x10001000, 0x00001040, - 0x00041000, 0x00040040, 0x10040040, 0x10041000, - 0x00001040, 0x00000000, 0x00000000, 0x10040040, - 0x10000040, 0x10001000, 0x00041040, 0x00040000, - 0x00041040, 0x00040000, 0x10041000, 0x00001000, - 0x00000040, 0x10040040, 0x00001000, 0x00041040, - 0x10001000, 0x00000040, 0x10000040, 0x10040000, - 0x10040040, 0x10000000, 0x00040000, 0x10001040, - 0x00000000, 0x10041040, 0x00040040, 0x10000040, - 0x10040000, 0x10001000, 0x10001040, 0x00000000, - 0x10041040, 0x00041000, 0x00041000, 0x00001040, - 0x00001040, 0x00040040, 0x10000000, 0x10041000 - }; - - // Routines taken from other parts of the Acme utilities. - - /// Squash bytes down to ints. - public static void squashBytesToInts( byte[] inBytes, int inOff, int[] outInts, int outOff, int intLen ) - { - for ( int i = 0; i < intLen; ++i ) - outInts[outOff + i] = - ( ( inBytes[inOff + i * 4 ] & 0xff ) << 24 ) | - ( ( inBytes[inOff + i * 4 + 1] & 0xff ) << 16 ) | - ( ( inBytes[inOff + i * 4 + 2] & 0xff ) << 8 ) | - ( inBytes[inOff + i * 4 + 3] & 0xff ); - } - - /// Spread ints into bytes. - public static void spreadIntsToBytes( int[] inInts, int inOff, byte[] outBytes, int outOff, int intLen ) - { - for ( int i = 0; i < intLen; ++i ) - { - outBytes[outOff + i * 4 ] = (byte) ( inInts[inOff + i] >>> 24 ); - outBytes[outOff + i * 4 + 1] = (byte) ( inInts[inOff + i] >>> 16 ); - outBytes[outOff + i * 4 + 2] = (byte) ( inInts[inOff + i] >>> 8 ); - outBytes[outOff + i * 4 + 3] = (byte) inInts[inOff + i]; - } - } - } diff --git a/java/src/com/tigervnc/rfb/Encoder.java b/java/src/com/tigervnc/rfb/Encoder.java deleted file mode 100644 index 0964f88e..00000000 --- a/java/src/com/tigervnc/rfb/Encoder.java +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Encoder { - static public boolean supported(int encoding) { - return false; - } -} diff --git a/java/src/com/tigervnc/rfb/Encodings.java b/java/src/com/tigervnc/rfb/Encodings.java deleted file mode 100644 index 493d5488..00000000 --- a/java/src/com/tigervnc/rfb/Encodings.java +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Encodings { - - public static final int encodingRaw = 0; - public static final int encodingCopyRect = 1; - public static final int encodingRRE = 2; - public static final int encodingCoRRE = 4; - public static final int encodingHextile = 5; - public static final int encodingTight = 7; - public static final int encodingZRLE = 16; - - public static final int encodingMax = 255; - - public static final int pseudoEncodingXCursor = -240; - public static final int pseudoEncodingCursor = -239; - public static final int pseudoEncodingDesktopSize = -223; - public static final int pseudoEncodingExtendedDesktopSize = -308; - public static final int pseudoEncodingDesktopName = -307; - public static final int pseudoEncodingClientRedirect = -311; - - // TightVNC-specific - public static final int pseudoEncodingLastRect = -224; - public static final int pseudoEncodingQualityLevel0 = -32; - public static final int pseudoEncodingQualityLevel9 = -23; - public static final int pseudoEncodingCompressLevel0 = -256; - public static final int pseudoEncodingCompressLevel9 = -247; - - public static int encodingNum(String name) { - if (name.equalsIgnoreCase("raw")) return encodingRaw; - if (name.equalsIgnoreCase("copyRect")) return encodingCopyRect; - if (name.equalsIgnoreCase("RRE")) return encodingRRE; - if (name.equalsIgnoreCase("coRRE")) return encodingCoRRE; - if (name.equalsIgnoreCase("hextile")) return encodingHextile; - if (name.equalsIgnoreCase("Tight")) return encodingTight; - if (name.equalsIgnoreCase("ZRLE")) return encodingZRLE; - return -1; - } - - public static String encodingName(int num) { - switch (num) { - case encodingRaw: return "raw"; - case encodingCopyRect: return "copyRect"; - case encodingRRE: return "RRE"; - case encodingCoRRE: return "CoRRE"; - case encodingHextile: return "hextile"; - case encodingTight: return "Tight"; - case encodingZRLE: return "ZRLE"; - default: return "[unknown encoding]"; - } - } -} diff --git a/java/src/com/tigervnc/rfb/Exception.java b/java/src/com/tigervnc/rfb/Exception.java deleted file mode 100644 index 26ac355b..00000000 --- a/java/src/com/tigervnc/rfb/Exception.java +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Exception extends com.tigervnc.rdr.Exception { - public Exception(String s) { super(s); } -} diff --git a/java/src/com/tigervnc/rfb/Hextile.java b/java/src/com/tigervnc/rfb/Hextile.java deleted file mode 100644 index 9c05b729..00000000 --- a/java/src/com/tigervnc/rfb/Hextile.java +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Hextile { - public static final int raw = (1 << 0); - public static final int bgSpecified = (1 << 1); - public static final int fgSpecified = (1 << 2); - public static final int anySubrects = (1 << 3); - public static final int subrectsColoured = (1 << 4); -} diff --git a/java/src/com/tigervnc/rfb/HextileDecoder.java b/java/src/com/tigervnc/rfb/HextileDecoder.java deleted file mode 100644 index 4c32b52c..00000000 --- a/java/src/com/tigervnc/rfb/HextileDecoder.java +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -public class HextileDecoder extends Decoder { - - public HextileDecoder(CMsgReader reader_) { reader = reader_; } - - public void readRect(Rect r, CMsgHandler handler) { - InStream is = reader.getInStream(); - int bytesPerPixel = handler.cp.pf().bpp / 8; - boolean bigEndian = handler.cp.pf().bigEndian; - - int[] buf = reader.getImageBuf(16 * 16 * 4); - - Rect t = new Rect(); - int bg = 0; - int fg = 0; - - for (t.tl.y = r.tl.y; t.tl.y < r.br.y; t.tl.y += 16) { - - t.br.y = Math.min(r.br.y, t.tl.y + 16); - - for (t.tl.x = r.tl.x; t.tl.x < r.br.x; t.tl.x += 16) { - - t.br.x = Math.min(r.br.x, t.tl.x + 16); - - int tileType = is.readU8(); - - if ((tileType & Hextile.raw) != 0) { - is.readPixels(buf, t.area(), bytesPerPixel, bigEndian); - handler.imageRect(t, buf); - continue; - } - - if ((tileType & Hextile.bgSpecified) != 0) - bg = is.readPixel(bytesPerPixel, bigEndian); - - int len = t.area(); - int ptr = 0; - while (len-- > 0) buf[ptr++] = bg; - - if ((tileType & Hextile.fgSpecified) != 0) - fg = is.readPixel(bytesPerPixel, bigEndian); - - if ((tileType & Hextile.anySubrects) != 0) { - int nSubrects = is.readU8(); - - for (int i = 0; i < nSubrects; i++) { - - if ((tileType & Hextile.subrectsColoured) != 0) - fg = is.readPixel(bytesPerPixel, bigEndian); - - int xy = is.readU8(); - int wh = is.readU8(); - -/* - Rect s = new Rect(); - s.tl.x = t.tl.x + ((xy >> 4) & 15); - s.tl.y = t.tl.y + (xy & 15); - s.br.x = s.tl.x + ((wh >> 4) & 15) + 1; - s.br.y = s.tl.y + (wh & 15) + 1; -*/ - int x = ((xy >> 4) & 15); - int y = (xy & 15); - int w = ((wh >> 4) & 15) + 1; - int h = (wh & 15) + 1; - ptr = y * t.width() + x; - int rowAdd = t.width() - w; - while (h-- > 0) { - len = w; - while (len-- > 0) buf[ptr++] = fg; - ptr += rowAdd; - } - } - } - handler.imageRect(t, buf); - } - } - } - - CMsgReader reader; -} diff --git a/java/src/com/tigervnc/rfb/Hostname.java b/java/src/com/tigervnc/rfb/Hostname.java deleted file mode 100644 index 42fda537..00000000 --- a/java/src/com/tigervnc/rfb/Hostname.java +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Hostname { - - public static String getHost(String vncServerName) { - int colonPos = vncServerName.indexOf(':'); - if (colonPos == 0) - return "localhost"; - if (colonPos == -1) - colonPos = vncServerName.length(); - return vncServerName.substring(0, colonPos); - } - - public static int getPort(String vncServerName) { - int colonPos = vncServerName.indexOf(':'); - if (colonPos == -1 || colonPos == vncServerName.length()-1) - return 5900; - if (vncServerName.charAt(colonPos+1) == ':') { - return Integer.parseInt(vncServerName.substring(colonPos+2)); - } - return Integer.parseInt(vncServerName.substring(colonPos+1)) + 5900; - } -} diff --git a/java/src/com/tigervnc/rfb/IntParameter.java b/java/src/com/tigervnc/rfb/IntParameter.java deleted file mode 100644 index 877063e7..00000000 --- a/java/src/com/tigervnc/rfb/IntParameter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class IntParameter extends VoidParameter { - public IntParameter(String name_, String desc_, int v) { - super(name_, desc_); - value = v; - defValue = v; - } - - public boolean setParam(String v) { - try { - value = Integer.parseInt(v); - } catch (NumberFormatException e) { - return false; - } - return true; - } - - public String getDefaultStr() { return Integer.toString(defValue); } - public String getValueStr() { return Integer.toString(value); } - - public int getValue() { return value; } - - protected int value; - protected int defValue; -} diff --git a/java/src/com/tigervnc/rfb/Keysyms.java b/java/src/com/tigervnc/rfb/Keysyms.java deleted file mode 100644 index 6bfafeaf..00000000 --- a/java/src/com/tigervnc/rfb/Keysyms.java +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// Keysyms - defines X keysyms for non-character keys. All keysyms -// corresponding to characters should be generated by calling -// UnicodeToKeysym.translate(). -// - -package com.tigervnc.rfb; - -public class Keysyms { - - public static final int BackSpace = 0xFF08; - public static final int Tab = 0xFF09; - public static final int Linefeed = 0xFF0A; - public static final int Clear = 0xFF0B; - public static final int Return = 0xFF0D; - public static final int Pause = 0xFF13; - public static final int Scroll_Lock = 0xFF14; - public static final int Sys_Req = 0xFF15; - public static final int Escape = 0xFF1B; - public static final int Delete = 0xFFFF; - - public static final int Home = 0xFF50; - public static final int Left = 0xFF51; - public static final int Up = 0xFF52; - public static final int Right = 0xFF53; - public static final int Down = 0xFF54; - public static final int Prior = 0xFF55; - public static final int Page_Up = 0xFF55; - public static final int Next = 0xFF56; - public static final int Page_Down = 0xFF56; - public static final int End = 0xFF57; - public static final int Begin = 0xFF58; - - public static final int Select = 0xFF60; - public static final int Print = 0xFF61; - public static final int Execute = 0xFF62; - public static final int Insert = 0xFF63; - public static final int Undo = 0xFF65; - public static final int Redo = 0xFF66; - public static final int Menu = 0xFF67; - public static final int Find = 0xFF68; - public static final int Cancel = 0xFF69; - public static final int Help = 0xFF6A; - public static final int Break = 0xFF6B; - public static final int Mode_switch = 0xFF7E; - public static final int script_switch = 0xFF7E; - public static final int Num_Lock = 0xFF7F; - - public static final int F1 = 0xFFBE; - public static final int F2 = 0xFFBF; - public static final int F3 = 0xFFC0; - public static final int F4 = 0xFFC1; - public static final int F5 = 0xFFC2; - public static final int F6 = 0xFFC3; - public static final int F7 = 0xFFC4; - public static final int F8 = 0xFFC5; - public static final int F9 = 0xFFC6; - public static final int F10 = 0xFFC7; - public static final int F11 = 0xFFC8; - public static final int F12 = 0xFFC9; - - public static final int Shift_L = 0xFFE1; - public static final int Shift_R = 0xFFE2; - public static final int Control_L = 0xFFE3; - public static final int Control_R = 0xFFE4; - public static final int Meta_L = 0xFFE7; - public static final int Meta_R = 0xFFE8; - public static final int Alt_L = 0xFFE9; - public static final int Alt_R = 0xFFEA; -} diff --git a/java/src/com/tigervnc/rfb/LogWriter.java b/java/src/com/tigervnc/rfb/LogWriter.java deleted file mode 100644 index c5730531..00000000 --- a/java/src/com/tigervnc/rfb/LogWriter.java +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class LogWriter { - - public LogWriter(String name_) { - name = name_; - level = globalLogLevel; - next = log_writers; - log_writers = this; - } - - public void setLevel(int level_) { level = level_; } - - public void write(int level, String str) { - if (level <= this.level) { - System.err.println(name+": "+str); - } - } - - public void error(String str) { write(0, str); } - public void status(String str) { write(10, str); } - public void info(String str) { write(30, str); } - public void debug(String str) { write(100, str); } - - public static boolean setLogParams(String params) { - globalLogLevel = Integer.parseInt(params); - LogWriter current = log_writers; - while (current != null) { - current.setLevel(globalLogLevel); - current = current.next; - } - return true; -// int colon = params.indexOf(':'); -// String logwriter_name = params.substring(0, colon); -// params = params.substring(colon+1); -// colon = params.indexOf(':'); -// String logger_name = params.substring(0, colon); -// params = params.substring(colon+1); -// int level = Integer.parseInt(params); -// // XXX ignore logger name for the moment - -// System.err.println("setting level to "+level); -// System.err.println("logwriters is "+log_writers); -// if (logwriter_name.equals("*")) { -// LogWriter current = log_writers; -// while (current != null) { -// //current.setLog(logger); -// System.err.println("setting level of "+current.name+" to "+level); -// current.setLevel(level); -// current = current.next; -// } -// return true; -// } - -// LogWriter logwriter = getLogWriter(logwriter_name); -// if (logwriter == null) { -// System.err.println("no logwriter found: "+logwriter_name); -// return false; -// } - -// //logwriter.setLog(logger); -// logwriter.setLevel(level); -// return true; - } - - - static LogWriter getLogWriter(String name) { - LogWriter current = log_writers; - while (current != null) { - if (name.equalsIgnoreCase(current.name)) return current; - current = current.next; - } - return null; - } - - String name; - int level; - LogWriter next; - static LogWriter log_writers; - static int globalLogLevel = 30; -} diff --git a/java/src/com/tigervnc/rfb/ManagedPixelBuffer.java b/java/src/com/tigervnc/rfb/ManagedPixelBuffer.java deleted file mode 100644 index 46b5acf7..00000000 --- a/java/src/com/tigervnc/rfb/ManagedPixelBuffer.java +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class ManagedPixelBuffer extends PixelBuffer { - public void setSize(int w, int h) { - width_ = w; - height_ = h; - checkDataSize(); - } - public void setPF(PixelFormat pf) { - super.setPF(pf); - checkDataSize(); - } - - public int dataLen() { return area(); } - - final void checkDataSize() { - if (data == null || data.length < dataLen()) - data = new int[dataLen()]; - } -} diff --git a/java/src/com/tigervnc/rfb/MsgTypes.java b/java/src/com/tigervnc/rfb/MsgTypes.java deleted file mode 100644 index a009b396..00000000 --- a/java/src/com/tigervnc/rfb/MsgTypes.java +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class MsgTypes { - // server to client - - public static final int msgTypeFramebufferUpdate = 0; - public static final int msgTypeSetColourMapEntries = 1; - public static final int msgTypeBell = 2; - public static final int msgTypeServerCutText = 3; - - // client to server - - public static final int msgTypeSetPixelFormat = 0; - public static final int msgTypeFixColourMapEntries = 1; - public static final int msgTypeSetEncodings = 2; - public static final int msgTypeFramebufferUpdateRequest = 3; - public static final int msgTypeKeyEvent = 4; - public static final int msgTypePointerEvent = 5; - public static final int msgTypeClientCutText = 6; - - public static final int msgTypeSetDesktopSize = 251; -} diff --git a/java/src/com/tigervnc/rfb/PixelBuffer.java b/java/src/com/tigervnc/rfb/PixelBuffer.java deleted file mode 100644 index f87fead8..00000000 --- a/java/src/com/tigervnc/rfb/PixelBuffer.java +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// PixelBuffer - note that this code is only written for the 8, 16, and 32 bpp cases at the -// moment. -// - -package com.tigervnc.rfb; - -import java.awt.image.*; - -public class PixelBuffer { - - public PixelBuffer() { - setPF(new PixelFormat()); - } - - public void setPF(PixelFormat pf) { - if (!(pf.bpp == 32) && !(pf.bpp == 16) && !(pf.bpp == 8)) - throw new Exception("Internal error: bpp must be 8, 16, or 32 in PixelBuffer ("+pf.bpp+")"); - format = pf; - switch (pf.depth) { - case 8: - //cm = new IndexColorModel(8, 256, new byte[256], new byte[256], new byte[256]); - cm = new DirectColorModel(8, 7, (7 << 3), (3 << 6)); - break; - case 16: - cm = new DirectColorModel(32, 0xF800, 0x07C0, 0x003E, (0xff << 24)); - break; - case 24: - cm = new DirectColorModel(32, (0xff << 16), (0xff << 8), 0xff, (0xff << 24)); - break; - } - } - public PixelFormat getPF() { return format; } - - public final int width() { return width_; } - public final int height() { return height_; } - public final int area() { return width_ * height_; } - - public void fillRect(int x, int y, int w, int h, int pix) { - for (int ry = y; ry < y + h; ry++) - for (int rx = x; rx < x + w; rx++) - data[ry * width_ + rx] = pix; - } - - public void imageRect(int x, int y, int w, int h, int[] pix) { - for (int j = 0; j < h; j++) - System.arraycopy(pix, (w * j), data, width_ * (y + j) + x, w); - } - - public void copyRect(int x, int y, int w, int h, int srcX, int srcY) { - int dest = (width_ * y) + x; - int src = (width_ * srcY) + srcX; - int inc = width_; - - if (y > srcY) { - src += (h-1) * inc; - dest += (h-1) * inc; - inc = -inc; - } - int destEnd = dest + h * inc; - - while (dest != destEnd) { - System.arraycopy(data, src, data, dest, w); - src += inc; - dest += inc; - } - } - - public void maskRect(int x, int y, int w, int h, int[] pix, byte[] mask) { - int maskBytesPerRow = (w + 7) / 8; - - for (int j = 0; j < h; j++) { - int cy = y + j; - - if (cy < 0 || cy >= height_) - continue; - - for (int i = 0; i < w; i++) { - int cx = x + i; - - if (cx < 0 || cx >= width_) - continue; - - int byte_ = j * maskBytesPerRow + i / 8; - int bit = 7 - i % 8; - - if ((mask[byte_] & (1 << bit)) != 0) - data[cy * width_ + cx] = pix[j * w + i]; - } - } - } - - public int[] data; - public ColorModel cm; - - protected PixelFormat format; - protected int width_, height_; -} diff --git a/java/src/com/tigervnc/rfb/PixelFormat.java b/java/src/com/tigervnc/rfb/PixelFormat.java deleted file mode 100644 index a8ab5f11..00000000 --- a/java/src/com/tigervnc/rfb/PixelFormat.java +++ /dev/null @@ -1,163 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// PixelFormat -// - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -public class PixelFormat { - - public PixelFormat(int b, int d, boolean e, boolean t) { - bpp = b; - depth = d; - bigEndian = e; - trueColour = t; - } - public PixelFormat(int b, int d, boolean e, boolean t, - int rm, int gm, int bm, int rs, int gs, int bs) { - this(b, d, e, t); - redMax = rm; - greenMax = gm; - blueMax = bm; - redShift = rs; - greenShift = gs; - blueShift = bs; - } - public PixelFormat() { this(8,8,false,true,7,7,3,0,3,6); } - - public boolean equal(PixelFormat x) { - return (bpp == x.bpp && - depth == x.depth && - (bigEndian == x.bigEndian || bpp == 8) && - trueColour == x.trueColour && - (!trueColour || (redMax == x.redMax && - greenMax == x.greenMax && - blueMax == x.blueMax && - redShift == x.redShift && - greenShift == x.greenShift && - blueShift == x.blueShift))); - } - - public void read(InStream is) { - bpp = is.readU8(); - depth = is.readU8(); - bigEndian = is.readU8()!=0; - trueColour = is.readU8()!=0; - redMax = is.readU16(); - greenMax = is.readU16(); - blueMax = is.readU16(); - redShift = is.readU8(); - greenShift = is.readU8(); - blueShift = is.readU8(); - is.skip(3); - } - - public void write(OutStream os) { - os.writeU8(bpp); - os.writeU8(depth); - os.writeU8(bigEndian?1:0); - os.writeU8(trueColour?1:0); - os.writeU16(redMax); - os.writeU16(greenMax); - os.writeU16(blueMax); - os.writeU8(redShift); - os.writeU8(greenShift); - os.writeU8(blueShift); - os.pad(3); - } - - public final boolean is888() { - if(!trueColour) - return false; - if(bpp != 32) - return false; - if(depth != 24) - return false; - if(redMax != 255) - return false; - if(greenMax != 255) - return false; - if(blueMax != 255) - return false; - - return true; - } - - public void bufferFromRGB(int dst, byte[] src) { - if (bigEndian) { - dst = - (src[0] & 0xFF) << 16 | (src[1] & 0xFF) << 8 | (src[2] & 0xFF) | 0xFF << 24; - } else { - dst = - (src[2] & 0xFF) << 16 | (src[1] & 0xFF) << 8 | (src[0] & 0xFF) | 0xFF << 24; - } - } - - public String print() { - StringBuffer s = new StringBuffer(); - s.append("depth "+depth+" ("+bpp+"bpp)"); - if (bpp != 8) { - if (bigEndian) - s.append(" big-endian"); - else - s.append(" little-endian"); - } - - if (!trueColour) { - s.append(" colour-map"); - return s.toString(); - } - - if (blueShift == 0 && greenShift > blueShift && redShift > greenShift && - blueMax == (1 << greenShift) - 1 && - greenMax == (1 << (redShift-greenShift)) - 1 && - redMax == (1 << (depth-redShift)) - 1) - { - s.append(" rgb"+(depth-redShift)+(redShift-greenShift)+greenShift); - return s.toString(); - } - - if (redShift == 0 && greenShift > redShift && blueShift > greenShift && - redMax == (1 << greenShift) - 1 && - greenMax == (1 << (blueShift-greenShift)) - 1 && - blueMax == (1 << (depth-blueShift)) - 1) - { - s.append(" bgr"+(depth-blueShift)+(blueShift-greenShift)+greenShift); - return s.toString(); - } - - s.append(" rgb max "+redMax+","+greenMax+","+blueMax+" shift "+redShift+ - ","+greenShift+","+blueShift); - return s.toString(); - } - - public int bpp; - public int depth; - public boolean bigEndian; - public boolean trueColour; - public int redMax; - public int greenMax; - public int blueMax; - public int redShift; - public int greenShift; - public int blueShift; -} diff --git a/java/src/com/tigervnc/rfb/Point.java b/java/src/com/tigervnc/rfb/Point.java deleted file mode 100644 index 25de8c20..00000000 --- a/java/src/com/tigervnc/rfb/Point.java +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Point { - - // Point - // - // Represents a point in 2D space, by X and Y coordinates. - // Can also be used to represent a delta, or offset, between - // two Points. - // Functions are provided to allow Points to be compared for - // equality and translated by a supplied offset. - // Functions are also provided to negate offset Points. - - public Point() {x=0; y=0;} - public Point(int x_, int y_) { x=x_; y=y_;} - public final Point negate() {return new Point(-x, -y);} - public final boolean equals(Point p) {return (x==p.x && y==p.y);} - public final Point translate(Point p) {return new Point(x+p.x, y+p.y);} - public final Point subtract(Point p) {return new Point(x-p.x, y-p.y);} - public int x, y; - -} diff --git a/java/src/com/tigervnc/rfb/RREDecoder.java b/java/src/com/tigervnc/rfb/RREDecoder.java deleted file mode 100644 index e0ff5cfe..00000000 --- a/java/src/com/tigervnc/rfb/RREDecoder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -public class RREDecoder extends Decoder { - - public RREDecoder(CMsgReader reader_) { reader = reader_; } - - public void readRect(Rect r, CMsgHandler handler) { - InStream is = reader.getInStream(); - int bytesPerPixel = handler.cp.pf().bpp / 8; - boolean bigEndian = handler.cp.pf().bigEndian; - int nSubrects = is.readU32(); - int bg = is.readPixel(bytesPerPixel, bigEndian); - handler.fillRect(r, bg); - - for (int i = 0; i < nSubrects; i++) { - int pix = is.readPixel(bytesPerPixel, bigEndian); - int x = is.readU16(); - int y = is.readU16(); - int w = is.readU16(); - int h = is.readU16(); - handler.fillRect(new Rect(r.tl.x+x, r.tl.y+y, r.tl.x+x+w, r.tl.y+y+h), pix); - } - } - - CMsgReader reader; -} diff --git a/java/src/com/tigervnc/rfb/RawDecoder.java b/java/src/com/tigervnc/rfb/RawDecoder.java deleted file mode 100644 index 79db8260..00000000 --- a/java/src/com/tigervnc/rfb/RawDecoder.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class RawDecoder extends Decoder { - - public RawDecoder(CMsgReader reader_) { reader = reader_; } - - public void readRect(Rect r, CMsgHandler handler) { - int x = r.tl.x; - int y = r.tl.y; - int w = r.width(); - int h = r.height(); - int[] imageBuf = reader.getImageBuf(w * h); - int nPixels = imageBuf.length / (reader.bpp() / 8); - int bytesPerRow = w * (reader.bpp() / 8); - while (h > 0) { - int nRows = nPixels / w; - if (nRows > h) nRows = h; - reader.is.readPixels(imageBuf, w * h, (reader.bpp() / 8), handler.cp.pf().bigEndian); - handler.imageRect(new Rect(x, y, x+w, y+nRows), imageBuf); - h -= nRows; - y += nRows; - } - } - - CMsgReader reader; - static LogWriter vlog = new LogWriter("RawDecoder"); -} diff --git a/java/src/com/tigervnc/rfb/Rect.java b/java/src/com/tigervnc/rfb/Rect.java deleted file mode 100644 index fab4f5dd..00000000 --- a/java/src/com/tigervnc/rfb/Rect.java +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class Rect { - - // Rect - // - // Represents a rectangular region defined by its top-left (tl) - // and bottom-right (br) Points. - // Rects may be compared for equality, checked to determine whether - // or not they are empty, cleared (made empty), or intersected with - // one another. The bounding rectangle of two existing Rects - // may be calculated, as may the area of a Rect. - // Rects may also be translated, in the same way as Points, by - // an offset specified in a Point structure. - - public Rect() { - tl=new Point(0,0); - br=new Point(0,0); - } - public Rect(Point tl_, Point br_) { - tl=new Point(tl_.x, tl_.y); - br=new Point(br_.x,br_.y); - } - public Rect(int x1, int y1, int x2, int y2) { - tl=new Point(x1, y1); - br=new Point(x2, y2); - } - public final void setXYWH(int x, int y, int w, int h) { - tl.x = x; tl.y = y; br.x = x+w; br.y = y+h; - } - public final Rect intersect(Rect r) { - Rect result = new Rect(); - result.tl.x = Math.max(tl.x, r.tl.x); - result.tl.y = Math.max(tl.y, r.tl.y); - result.br.x = Math.max(Math.min(br.x, r.br.x), result.tl.x); - result.br.y = Math.max(Math.min(br.y, r.br.y), result.tl.y); - return result; - } - public final Rect union_boundary(Rect r) { - if (r.is_empty()) return this; - if (is_empty()) return r; - Rect result = new Rect(); - result.tl.x = Math.min(tl.x, r.tl.x); - result.tl.y = Math.min(tl.y, r.tl.y); - result.br.x = Math.max(br.x, r.br.x); - result.br.y = Math.max(br.y, r.br.y); - return result; - } - public final Rect translate(Point p) { - return new Rect(tl.translate(p), br.translate(p)); - } - public final boolean equals(Rect r) {return r.tl.equals(tl) && r.br.equals(br);} - public final boolean is_empty() {return (tl.x >= br.x) || (tl.y >= br.y);} - public final void clear() {tl = new Point(); br = new Point();} - public final boolean enclosed_by(Rect r) { - return (tl.x>=r.tl.x) && (tl.y>=r.tl.y) && (br.x<=r.br.x) && (br.y<=r.br.y); - } - public final boolean overlaps(Rect r) { - return tl.x < r.br.x && tl.y < r.br.y && br.x > r.tl.x && br.y > r.tl.y; - } - public final int area() {return is_empty() ? 0 : (br.x-tl.x)*(br.y-tl.y);} - public final Point dimensions() {return new Point(width(), height());} - public final int width() {return br.x-tl.x;} - public final int height() {return br.y-tl.y;} - public final boolean contains(Point p) { - return (tl.x<=p.x) && (tl.y<=p.y) && (br.x>p.x) && (br.y>p.y); - } - public Point tl; - public Point br; - -} diff --git a/java/src/com/tigervnc/rfb/Screen.java b/java/src/com/tigervnc/rfb/Screen.java deleted file mode 100644 index 90b22b6d..00000000 --- a/java/src/com/tigervnc/rfb/Screen.java +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright 2009 Pierre Ossman for Cendio AB - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Represents a single RFB virtual screen, which includes -// coordinates, an id and flags. - -package com.tigervnc.rfb; - -public class Screen { - - public Screen() { id=0; flags=0; dimensions = new Rect(); } - - public Screen(int id_, int x_, int y_, int w_, int h_, int flags_) { - id = id_; - dimensions = new Rect(x_, y_, x_+w_, y_+h_); - flags = flags_; - } - - public final static boolean operator(Screen r) { - if (id != r.id) - return false; - if (!dimensions.equals(r.dimensions)) - return false; - if (flags != r.flags) - return false; - return true; - } - - public static int id; - public static Rect dimensions; - public static int flags; - -} diff --git a/java/src/com/tigervnc/rfb/ScreenSet.java b/java/src/com/tigervnc/rfb/ScreenSet.java deleted file mode 100644 index 071282ff..00000000 --- a/java/src/com/tigervnc/rfb/ScreenSet.java +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright 2009 Pierre Ossman for Cendio AB - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Management class for the RFB virtual screens - -package com.tigervnc.rfb; - -import java.util.*; - -public class ScreenSet { - - // Represents a complete screen configuration, excluding framebuffer - // dimensions. - - public ScreenSet() { - screens = new ArrayList<Screen>(); - } - - public static final int num_screens() { return screens.size(); } - - public static final void add_screen(Screen screen) { screens.add(screen); } - public static final void remove_screen(int id) { - for (Iterator iter = screens.iterator(); iter.hasNext(); ) { - Screen refScreen = (Screen)iter.next(); - if (refScreen.id == id) - iter.remove(); - } - } - - public static final boolean validate(int fb_width, int fb_height) { - List<Integer> seen_ids = new ArrayList<Integer>(); - Rect fb_rect = new Rect(); - - if (screens.isEmpty()) - return false; - if (num_screens() > 255) - return false; - - fb_rect.setXYWH(0, 0, fb_width, fb_height); - - for (Iterator iter = screens.iterator(); iter.hasNext(); ) { - Screen refScreen = (Screen)iter.next(); - if (refScreen.dimensions.is_empty()) - return false; - if (!refScreen.dimensions.enclosed_by(fb_rect)) - return false; - //if (seen_ids.lastIndexOf(refScreen.id) != seen_ids.get(-1)) - // return false; - seen_ids.add(refScreen.id); - } - - return true; - } - - public final void debug_print() { - for (Iterator iter = screens.iterator(); iter.hasNext(); ) { - Screen refScreen = (Screen)iter.next(); - vlog.error(" "+refScreen.id+" (0x"+refScreen.id+"): "+ - refScreen.dimensions.width()+"x"+refScreen.dimensions.height()+ - "+"+refScreen.dimensions.tl.x+"+"+refScreen.dimensions.tl.y+ - " (flags 0x"+refScreen.flags+")"); - } - } - - // FIXME: List order shouldn't matter - //inline bool operator(const ScreenSet& r) const { return screens == r.screens; } - //inline bool operator(const ScreenSet& r) const { return screens != r.screens; } - - public static List<Screen> screens; - - static LogWriter vlog = new LogWriter("ScreenSet"); - -} - diff --git a/java/src/com/tigervnc/rfb/Security.java b/java/src/com/tigervnc/rfb/Security.java deleted file mode 100644 index 379851d8..00000000 --- a/java/src/com/tigervnc/rfb/Security.java +++ /dev/null @@ -1,195 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// SecTypes.java - constants for the various security types. -// - -package com.tigervnc.rfb; -import java.util.*; - -public class Security { - - public static final int secTypeInvalid = 0; - public static final int secTypeNone = 1; - public static final int secTypeVncAuth = 2; - - public static final int secTypeRA2 = 5; - public static final int secTypeRA2ne = 6; - - public static final int secTypeSSPI = 7; - public static final int secTypeSSPIne = 8; - - public static final int secTypeTight = 16; - public static final int secTypeUltra = 17; - public static final int secTypeTLS = 18; - public static final int secTypeVeNCrypt = 19; - - /* VeNCrypt subtypes */ - public static final int secTypePlain = 256; - public static final int secTypeTLSNone = 257; - public static final int secTypeTLSVnc = 258; - public static final int secTypeTLSPlain = 259; - public static final int secTypeX509None = 260; - public static final int secTypeX509Vnc = 261; - public static final int secTypeX509Plain = 262; - public static final int secTypeIdent = 265; - public static final int secTypeTLSIdent = 266; - public static final int secTypeX509Ident = 267; - - // result types - - public static final int secResultOK = 0; - public static final int secResultFailed = 1; - public static final int secResultTooMany = 2; // deprecated - - public Security(StringParameter secTypes) - { - String secTypesStr; - - secTypesStr = secTypes.getData(); - enabledSecTypes = parseSecTypes(secTypesStr); - - secTypesStr = null; - } - - public static List<Integer> enabledSecTypes = new ArrayList<Integer>(); - - public static final List<Integer> GetEnabledSecTypes() - { - List<Integer> result = new ArrayList<Integer>(); - - result.add(secTypeVeNCrypt); - for (Iterator i = enabledSecTypes.iterator(); i.hasNext(); ) { - int refType = (Integer)i.next(); - if (refType < 0x100) - result.add(refType); - } - - return (result); - } - - public static final List<Integer> GetEnabledExtSecTypes() - { - List<Integer> result = new ArrayList<Integer>(); - - for (Iterator i = enabledSecTypes.iterator(); i.hasNext(); ) { - int refType = (Integer)i.next(); - if (refType != secTypeVeNCrypt) /* Do not include VeNCrypt to avoid loops */ - result.add(refType); - } - - return (result); - } - - public static final void EnableSecType(int secType) - { - - for (Iterator i = enabledSecTypes.iterator(); i.hasNext(); ) - if ((Integer)i.next() == secType) - return; - - enabledSecTypes.add(secType); - } - - public boolean IsSupported(int secType) - { - Iterator i; - - for (i = enabledSecTypes.iterator(); i.hasNext(); ) - if ((Integer)i.next() == secType) - return true; - if (secType == secTypeVeNCrypt) - return true; - - return false; - } - - public static void DisableSecType(int secType) { enabledSecTypes.remove((Object)secType); } - - public static int secTypeNum(String name) { - if (name.equalsIgnoreCase("None")) return secTypeNone; - if (name.equalsIgnoreCase("VncAuth")) return secTypeVncAuth; - if (name.equalsIgnoreCase("Tight")) return secTypeTight; - if (name.equalsIgnoreCase("RA2")) return secTypeRA2; - if (name.equalsIgnoreCase("RA2ne")) return secTypeRA2ne; - if (name.equalsIgnoreCase("SSPI")) return secTypeSSPI; - if (name.equalsIgnoreCase("SSPIne")) return secTypeSSPIne; - //if (name.equalsIgnoreCase("ultra")) return secTypeUltra; - //if (name.equalsIgnoreCase("TLS")) return secTypeTLS; - if (name.equalsIgnoreCase("VeNCrypt")) return secTypeVeNCrypt; - - /* VeNCrypt subtypes */ - if (name.equalsIgnoreCase("Plain")) return secTypePlain; - if (name.equalsIgnoreCase("Ident")) return secTypeIdent; - if (name.equalsIgnoreCase("TLSNone")) return secTypeTLSNone; - if (name.equalsIgnoreCase("TLSVnc")) return secTypeTLSVnc; - if (name.equalsIgnoreCase("TLSPlain")) return secTypeTLSPlain; - if (name.equalsIgnoreCase("TLSIdent")) return secTypeTLSIdent; - if (name.equalsIgnoreCase("X509None")) return secTypeX509None; - if (name.equalsIgnoreCase("X509Vnc")) return secTypeX509Vnc; - if (name.equalsIgnoreCase("X509Plain")) return secTypeX509Plain; - if (name.equalsIgnoreCase("X509Ident")) return secTypeX509Ident; - - return secTypeInvalid; - } - - public static String secTypeName(int num) { - switch (num) { - case secTypeNone: return "None"; - case secTypeVncAuth: return "VncAuth"; - case secTypeTight: return "Tight"; - case secTypeRA2: return "RA2"; - case secTypeRA2ne: return "RA2ne"; - case secTypeSSPI: return "SSPI"; - case secTypeSSPIne: return "SSPIne"; - //case secTypeUltra: return "Ultra"; - //case secTypeTLS: return "TLS"; - case secTypeVeNCrypt: return "VeNCrypt"; - - /* VeNCrypt subtypes */ - case secTypePlain: return "Plain"; - case secTypeIdent: return "Ident"; - case secTypeTLSNone: return "TLSNone"; - case secTypeTLSVnc: return "TLSVnc"; - case secTypeTLSPlain: return "TLSPlain"; - case secTypeTLSIdent: return "TLSIdent"; - case secTypeX509None: return "X509None"; - case secTypeX509Vnc: return "X509Vnc"; - case secTypeX509Plain: return "X509Plain"; - case secTypeX509Ident: return "X509Ident"; - default: return "[unknown secType]"; - } - } - - public final static List<Integer> parseSecTypes(String types_) - { - List<Integer> result = new ArrayList<Integer>(); - String[] types = types_.split(","); - for (int i = 0; i < types.length; i++) { - int typeNum = secTypeNum(types[i]); - if (typeNum != secTypeInvalid) - result.add(typeNum); - } - return (result); - } - - public final void SetSecTypes(List<Integer> secTypes) { enabledSecTypes = secTypes; } - - static LogWriter vlog = new LogWriter("Security"); -} diff --git a/java/src/com/tigervnc/rfb/SecurityClient.java b/java/src/com/tigervnc/rfb/SecurityClient.java deleted file mode 100644 index a8abd9e1..00000000 --- a/java/src/com/tigervnc/rfb/SecurityClient.java +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * Copyright (C) 2010 TigerVNC Team - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.vncviewer.CConn; - -public class SecurityClient extends Security { - - public SecurityClient() { super(secTypes); } - - public CSecurity GetCSecurity(int secType) - { - assert (CConn.upg != null); /* (upg == null) means bug in the viewer */ - assert (msg != null); - - if (!IsSupported(secType)) - throw new Exception("Security type not supported"); - - switch (secType) { - case Security.secTypeNone: return (new CSecurityNone()); - case Security.secTypeVncAuth: return (new CSecurityVncAuth()); - case Security.secTypeVeNCrypt: return (new CSecurityVeNCrypt(this)); - case Security.secTypePlain: return (new CSecurityPlain()); - case Security.secTypeIdent: return (new CSecurityIdent()); - case Security.secTypeTLSNone: - return (new CSecurityStack(secTypeTLSNone, "TLS with no password", - new CSecurityTLS(true), null)); - case Security.secTypeTLSVnc: - return (new CSecurityStack(secTypeTLSVnc, "TLS with VNCAuth", - new CSecurityTLS(true), new CSecurityVncAuth())); - case Security.secTypeTLSPlain: - return (new CSecurityStack(secTypeTLSPlain, "TLS with Username/Password", - new CSecurityTLS(true), new CSecurityPlain())); - case Security.secTypeTLSIdent: - return (new CSecurityStack(secTypeTLSIdent, "TLS with username only", - new CSecurityTLS(true), new CSecurityIdent())); - case Security.secTypeX509None: - return (new CSecurityStack(secTypeX509None, "X509 with no password", - new CSecurityTLS(false), null)); - case Security.secTypeX509Vnc: - return (new CSecurityStack(secTypeX509Vnc, "X509 with VNCAuth", - new CSecurityTLS(false), new CSecurityVncAuth())); - case Security.secTypeX509Plain: - return (new CSecurityStack(secTypeX509Plain, "X509 with Username/Password", - new CSecurityTLS(false), new CSecurityPlain())); - case Security.secTypeX509Ident: - return (new CSecurityStack(secTypeX509Ident, "X509 with username only", - new CSecurityTLS(false), new CSecurityIdent())); - default: - throw new Exception("Security type not supported"); - } - - } - - public static void setDefaults() - { - CSecurityTLS.setDefaults(); - } - - //UserPasswdGetter upg = null; - String msg = null; - - static StringParameter secTypes - = new StringParameter("SecurityTypes", - "Specify which security scheme to use (None, VncAuth)", - "Ident,TLSIdent,X509Ident,X509Plain,TLSPlain,X509Vnc,TLSVnc,X509None,TLSNone,VncAuth,None"); - -} diff --git a/java/src/com/tigervnc/rfb/StringParameter.java b/java/src/com/tigervnc/rfb/StringParameter.java deleted file mode 100644 index d7fd1a51..00000000 --- a/java/src/com/tigervnc/rfb/StringParameter.java +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class StringParameter extends VoidParameter { - public StringParameter(String name_, String desc_, String v) { - super(name_, desc_); - value = v; - defValue = v; - } - - public boolean setParam(String v) { - value = v; - return value != null; - } - - public boolean setDefaultStr(String v) { - value = defValue = v; - return defValue != null; - } - - public String getDefaultStr() { return defValue; } - public String getValueStr() { return value; } - - public String getValue() { return value; } - public String getData() { return value; } - - protected String value; - protected String defValue; -} diff --git a/java/src/com/tigervnc/rfb/TightDecoder.java b/java/src/com/tigervnc/rfb/TightDecoder.java deleted file mode 100644 index 5cce3a93..00000000 --- a/java/src/com/tigervnc/rfb/TightDecoder.java +++ /dev/null @@ -1,426 +0,0 @@ -/* Copyright (C) 2000-2003 Constantin Kaplinsky. All Rights Reserved. - * Copyright 2004-2005 Cendio AB. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.InStream; -import com.tigervnc.rdr.ZlibInStream; -import java.awt.image.PixelGrabber; -import java.awt.Image; -import java.util.ArrayList; - -public class TightDecoder extends Decoder { - - final static int TIGHT_MAX_WIDTH = 2048; - - // Compression control - final static int rfbTightExplicitFilter = 0x04; - final static int rfbTightFill = 0x08; - final static int rfbTightJpeg = 0x09; - final static int rfbTightMaxSubencoding = 0x09; - - // Filters to improve compression efficiency - final static int rfbTightFilterCopy = 0x00; - final static int rfbTightFilterPalette = 0x01; - final static int rfbTightFilterGradient = 0x02; - final static int rfbTightMinToCompress = 12; - - public TightDecoder(CMsgReader reader_) { - reader = reader_; - zis = new ZlibInStream[4]; - for (int i = 0; i < 4; i++) - zis[i] = new ZlibInStream(); - } - - public void readRect(Rect r, CMsgHandler handler) - { - InStream is = reader.getInStream(); - int[] buf = reader.getImageBuf(r.width() * r.height()); - boolean cutZeros = false; - PixelFormat myFormat = handler.cp.pf(); - int bpp = handler.cp.pf().bpp; - if (bpp == 32) { - if (myFormat.is888()) { - cutZeros = true; - } - } - - int comp_ctl = is.readU8(); - - int bytesPerPixel = handler.cp.pf().bpp / 8; - boolean bigEndian = handler.cp.pf().bigEndian; - - // Flush zlib streams if we are told by the server to do so. - for (int i = 0; i < 4; i++) { - if ((comp_ctl & 1) != 0) { - zis[i].reset(); - } - comp_ctl >>= 1; - } - - // "Fill" compression type. - if (comp_ctl == rfbTightFill) { - int pix; - if (cutZeros) { - byte[] elem = new byte[3]; - is.readBytes(elem, 0, 3); - if (bigEndian) { - pix = - (elem[2] & 0xFF) << 16 | (elem[1] & 0xFF) << 8 | (elem[0] & 0xFF) | 0xFF << 24; - } else { - pix = - (elem[0] & 0xFF) << 16 | (elem[1] & 0xFF) << 8 | (elem[2] & 0xFF) | 0xFF << 24; - } - } else { - pix = (bpp == 8) ? is.readOpaque8() : is.readOpaque24B(); - } - handler.fillRect(r, pix); - return; - } - - // "JPEG" compression type. - if (comp_ctl == rfbTightJpeg) { - // Read length - int compressedLen = is.readCompactLength(); - if (compressedLen <= 0) - vlog.info("Incorrect data received from the server."); - - // Allocate netbuf and read in data - byte[] netbuf = new byte[compressedLen]; - is.readBytes(netbuf, 0, compressedLen); - - // Create an Image object from the JPEG data. - Image jpeg = java.awt.Toolkit.getDefaultToolkit().createImage(netbuf); - PixelGrabber pg = new PixelGrabber(jpeg, 0, 0, r.width(), r.height(), true); - try { - boolean ret = pg.grabPixels(); - if (!ret) - vlog.info("failed to grab pixels"); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Object pixels = pg.getPixels(); - buf = (pixels instanceof byte[]) ? - convertByteArrayToIntArray((byte[])pixels) : (int[])pixels; - handler.imageRect(r, buf); - return; - } - - // Quit on unsupported compression type. - if (comp_ctl > rfbTightMaxSubencoding) { - throw new Exception("TightDecoder: bad subencoding value received"); - } - - // "Basic" compression type. - int palSize = 0; - int[] palette = new int[256]; - boolean useGradient = false; - - if ((comp_ctl & rfbTightExplicitFilter) != 0) { - int filterId = is.readU8(); - - switch (filterId) { - case rfbTightFilterPalette: - palSize = is.readU8() + 1; - if (cutZeros) { - byte[] elem = new byte[3]; - for (int i = 0; i < palSize; i++) { - is.readBytes(elem, 0, 3); - if (bigEndian) { - palette[i] = - (elem[2] & 0xFF) << 16 | (elem[1] & 0xFF) << 8 | (elem[0] & 0xFF) | 0xFF << 24; - } else { - palette[i] = - (elem[0] & 0xFF) << 16 | (elem[1] & 0xFF) << 8 | (elem[2] & 0xFF) | 0xFF << 24; - } - } - } else { - for (int i = 0; i < palSize; i++) { - palette[i] = (bpp == 8) ? is.readOpaque8() : is.readOpaque24B(); - } - } - break; - case rfbTightFilterGradient: - useGradient = true; - break; - case rfbTightFilterCopy: - break; - default: - throw new Exception("TightDecoder: unknown filter code recieved"); - } - } - - int bppp = bpp; - if (palSize != 0) { - bppp = (palSize <= 2) ? 1 : 8; - } else if (cutZeros) { - bppp = 24; - } - - // Determine if the data should be decompressed or just copied. - int rowSize = (r.width() * bppp + 7) / 8; - int dataSize = r.height() * rowSize; - int streamId = -1; - InStream input; - if (dataSize < rfbTightMinToCompress) { - input = is; - } else { - int length = is.readCompactLength(); - streamId = comp_ctl & 0x03; - zis[streamId].setUnderlying(is, length); - input = (ZlibInStream)zis[streamId]; - } - - if (palSize == 0) { - // Truecolor data. - if (useGradient) { - vlog.info("useGradient"); - if (bpp == 32 && cutZeros) { - vlog.info("FilterGradient24"); - FilterGradient24(r, input, dataSize, buf, handler); - } else { - vlog.info("FilterGradient"); - FilterGradient(r, input, dataSize, buf, handler); - } - } else { - if (cutZeros) { - byte[] elem = new byte[3]; - for (int i = 0; i < r.area(); i++) { - input.readBytes(elem, 0, 3); - if (bigEndian) { - buf[i] = - (elem[2] & 0xFF) << 16 | (elem[1] & 0xFF) << 8 | (elem[0] & 0xFF) | 0xFF << 24; - } else { - buf[i] = - (elem[0] & 0xFF) << 16 | (elem[1] & 0xFF) << 8 | (elem[2] & 0xFF) | 0xFF << 24; - } - } - } else { - for (int ptr=0; ptr < dataSize; ptr++) - buf[ptr] = input.readU8(); - } - } - } else { - int x, y, b; - int ptr = 0; - int bits; - if (palSize <= 2) { - // 2-color palette - for (y = 0; y < r.height(); y++) { - for (x = 0; x < r.width() / 8; x++) { - bits = input.readU8(); - for(b = 7; b >= 0; b--) { - buf[ptr++] = palette[bits >> b & 1]; - } - } - if (r.width() % 8 != 0) { - bits = input.readU8(); - for (b = 7; b >= 8 - r.width() % 8; b--) { - buf[ptr++] = palette[bits >> b & 1]; - } - } - } - } else { - // 256-color palette - for (y = 0; y < r.height(); y++) { - for (x = 0; x < r.width(); x++) { - buf[ptr++] = palette[input.readU8()]; - } - } - } - } - - handler.imageRect(r, buf); - - if (streamId != -1) { - zis[streamId].reset(); - } - } - - private CMsgReader reader; - private ZlibInStream[] zis; - static LogWriter vlog = new LogWriter("TightDecoder"); - - private static int convertByteArrayToInt(byte[] bytes) { - return (bytes[0] << 32) | (bytes[1] << 24) | (bytes[2] << 16) | (bytes[3] << 8) | bytes[4]; - } - - private static byte[] convertIntToByteArray(int integer) { - byte[] bytes = new byte[4]; - bytes[0] =(byte)( integer >> 24 ); - bytes[1] =(byte)( (integer << 8) >> 24 ); - bytes[2] =(byte)( (integer << 16) >> 24 ); - bytes[3] =(byte)( (integer << 24) >> 24 ); - return bytes; - } - private static int[] convertByteArrayToIntArray(byte[] bytes) { - vlog.info("convertByteArrayToIntArray"); - ArrayList<Integer> integers = new ArrayList<Integer>(); - for (int index = 0; index < bytes.length; index += 4) { - byte[] fourBytes = new byte[4]; - fourBytes[0] = bytes[index]; - fourBytes[1] = bytes[index+1]; - fourBytes[2] = bytes[index+2]; - fourBytes[3] = bytes[index+3]; - int integer = convertByteArrayToInt(fourBytes); - integers.add(new Integer(integer)); - } - int[] ints = new int[bytes.length/4]; - for (int index = 0; index < integers.size() ; index++) { - ints[index] = (integers.get(index)).intValue(); - } - return ints; - } - - private static byte[] convertIntArrayToByteArray(int[] integers) { - byte[] bytes = new byte[integers.length*4]; - for (int index = 0; index < integers.length; index++) { - byte[] integerBytes = convertIntToByteArray(integers[index]); - bytes[index*4] = integerBytes[0]; - bytes[1 + (index*4)] = integerBytes[1]; - bytes[2 + (index*4)] = integerBytes[2]; - bytes[3 + (index*4)] = integerBytes[3]; - } - return bytes; - } - - // - // Decode data processed with the "Gradient" filter. - // - - final private void FilterGradient24(Rect r, InStream is, int dataSize, int[] buf, CMsgHandler handler) { - - int x, y, c; - int[] prevRow = new int[TIGHT_MAX_WIDTH * 3]; - int[] thisRow = new int[TIGHT_MAX_WIDTH * 3]; - int[] pix = new int[3]; - int[] est = new int[3]; - - // Allocate netbuf and read in data - int[] netbuf = new int[dataSize]; - for (int i = 0; i < dataSize; i++) - netbuf[i] = is.readU8(); - //is.readBytes(netbuf, 0, dataSize); - - PixelFormat myFormat = handler.cp.pf(); - int rectHeight = r.height(); - int rectWidth = r.width(); - - for (y = 0; y < rectHeight; y++) { - /* First pixel in a row */ - for (c = 0; c < 3; c++) { - pix[c] = netbuf[y*rectWidth*3+c] + prevRow[c]; - thisRow[c] = pix[c]; - } - if (myFormat.bigEndian) { - buf[y*rectWidth] = - (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF) | 0xFF << 24; - } else { - buf[y*rectWidth] = - (pix[2] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[0] & 0xFF) | 0xFF << 24; - } - - /* Remaining pixels of a row */ - for (x = 1; x < rectWidth; x++) { - for (c = 0; c < 3; c++) { - est[c] = prevRow[x*3+c] + pix[c] - prevRow[(x-1)*3+c]; - if (est[c] > 0xFF) { - est[c] = 0xFF; - } else if (est[c] < 0) { - est[c] = 0; - } - pix[c] = netbuf[(y*rectWidth+x)*3+c] + est[c]; - thisRow[x*3+c] = pix[c]; - } - if (myFormat.bigEndian) { - buf[y*rectWidth] = - (pix[2] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[0] & 0xFF) | 0xFF << 24; - } else { - buf[y*rectWidth] = - (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF) | 0xFF << 24; - } - } - - System.arraycopy(thisRow, 0, prevRow, 0, prevRow.length); - } - } - - final private void FilterGradient(Rect r, InStream is, int dataSize, int[] buf, CMsgHandler handler) { - - int x, y, c; - int[] prevRow = new int[TIGHT_MAX_WIDTH]; - int[] thisRow = new int[TIGHT_MAX_WIDTH]; - int[] pix = new int[3]; - int[] est = new int[3]; - - // Allocate netbuf and read in data - int[] netbuf = new int[dataSize]; - for (int i = 0; i < dataSize; i++) - netbuf[i] = is.readU8(); - //is.readBytes(netbuf, 0, dataSize); - - PixelFormat myFormat = handler.cp.pf(); - int rectHeight = r.height(); - int rectWidth = r.width(); - - for (y = 0; y < rectHeight; y++) { - /* First pixel in a row */ - if (myFormat.bigEndian) { - buf[y*rectWidth] = - (pix[2] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[0] & 0xFF) | 0xFF << 24; - } else { - buf[y*rectWidth] = - (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF) | 0xFF << 24; - } - for (c = 0; c < 3; c++) - pix[c] += prevRow[c]; - - /* Remaining pixels of a row */ - for (x = 1; x < rectWidth; x++) { - for (c = 0; c < 3; c++) { - est[c] = prevRow[x*3+c] + pix[c] - prevRow[(x-1)*3+c]; - if (est[c] > 255) { - est[c] = 255; - } else if (est[c] < 0) { - est[c] = 0; - } - } - - // FIXME? - System.arraycopy(pix, 0, netbuf, 0, netbuf.length); - for (c = 0; c < 3; c++) - pix[c] += est[c]; - - System.arraycopy(thisRow, x*3, pix, 0, pix.length); - - if (myFormat.bigEndian) { - buf[y*rectWidth+x] = - (pix[2] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[0] & 0xFF) | 0xFF << 24; - } else { - buf[y*rectWidth+x] = - (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF) | 0xFF << 24; - } - - } - - System.arraycopy(thisRow, 0, prevRow, 0, prevRow.length); - } - } - -} diff --git a/java/src/com/tigervnc/rfb/UnicodeToKeysym.java b/java/src/com/tigervnc/rfb/UnicodeToKeysym.java deleted file mode 100644 index 44f61ba6..00000000 --- a/java/src/com/tigervnc/rfb/UnicodeToKeysym.java +++ /dev/null @@ -1,795 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// UnicodeToKeysym - provides a translate() method to convert from unicode -// characters to the equivalent X keysym. -// - -package com.tigervnc.rfb; - -public class UnicodeToKeysym { - - public static short[][] table = { - { 0x03c0, 0x0100 }, - { 0x03e0, 0x0101 }, - { 0x01c3, 0x0102 }, - { 0x01e3, 0x0103 }, - { 0x01a1, 0x0104 }, - { 0x01b1, 0x0105 }, - { 0x01c6, 0x0106 }, - { 0x01e6, 0x0107 }, - { 0x02c6, 0x0108 }, - { 0x02e6, 0x0109 }, - { 0x02c5, 0x010a }, - { 0x02e5, 0x010b }, - { 0x01c8, 0x010c }, - { 0x01e8, 0x010d }, - { 0x01cf, 0x010e }, - { 0x01ef, 0x010f }, - { 0x01d0, 0x0110 }, - { 0x01f0, 0x0111 }, - { 0x03aa, 0x0112 }, - { 0x03ba, 0x0113 }, - { 0x03cc, 0x0116 }, - { 0x03ec, 0x0117 }, - { 0x01ca, 0x0118 }, - { 0x01ea, 0x0119 }, - { 0x01cc, 0x011a }, - { 0x01ec, 0x011b }, - { 0x02d8, 0x011c }, - { 0x02f8, 0x011d }, - { 0x02ab, 0x011e }, - { 0x02bb, 0x011f }, - { 0x02d5, 0x0120 }, - { 0x02f5, 0x0121 }, - { 0x03ab, 0x0122 }, - { 0x03bb, 0x0123 }, - { 0x02a6, 0x0124 }, - { 0x02b6, 0x0125 }, - { 0x02a1, 0x0126 }, - { 0x02b1, 0x0127 }, - { 0x03a5, 0x0128 }, - { 0x03b5, 0x0129 }, - { 0x03cf, 0x012a }, - { 0x03ef, 0x012b }, - { 0x03c7, 0x012e }, - { 0x03e7, 0x012f }, - { 0x02a9, 0x0130 }, - { 0x02b9, 0x0131 }, - { 0x02ac, 0x0134 }, - { 0x02bc, 0x0135 }, - { 0x03d3, 0x0136 }, - { 0x03f3, 0x0137 }, - { 0x03a2, 0x0138 }, - { 0x01c5, 0x0139 }, - { 0x01e5, 0x013a }, - { 0x03a6, 0x013b }, - { 0x03b6, 0x013c }, - { 0x01a5, 0x013d }, - { 0x01b5, 0x013e }, - { 0x01a3, 0x0141 }, - { 0x01b3, 0x0142 }, - { 0x01d1, 0x0143 }, - { 0x01f1, 0x0144 }, - { 0x03d1, 0x0145 }, - { 0x03f1, 0x0146 }, - { 0x01d2, 0x0147 }, - { 0x01f2, 0x0148 }, - { 0x03bd, 0x014a }, - { 0x03bf, 0x014b }, - { 0x03d2, 0x014c }, - { 0x03f2, 0x014d }, - { 0x01d5, 0x0150 }, - { 0x01f5, 0x0151 }, - { 0x13bc, 0x0152 }, - { 0x13bd, 0x0153 }, - { 0x01c0, 0x0154 }, - { 0x01e0, 0x0155 }, - { 0x03a3, 0x0156 }, - { 0x03b3, 0x0157 }, - { 0x01d8, 0x0158 }, - { 0x01f8, 0x0159 }, - { 0x01a6, 0x015a }, - { 0x01b6, 0x015b }, - { 0x02de, 0x015c }, - { 0x02fe, 0x015d }, - { 0x01aa, 0x015e }, - { 0x01ba, 0x015f }, - { 0x01a9, 0x0160 }, - { 0x01b9, 0x0161 }, - { 0x01de, 0x0162 }, - { 0x01fe, 0x0163 }, - { 0x01ab, 0x0164 }, - { 0x01bb, 0x0165 }, - { 0x03ac, 0x0166 }, - { 0x03bc, 0x0167 }, - { 0x03dd, 0x0168 }, - { 0x03fd, 0x0169 }, - { 0x03de, 0x016a }, - { 0x03fe, 0x016b }, - { 0x02dd, 0x016c }, - { 0x02fd, 0x016d }, - { 0x01d9, 0x016e }, - { 0x01f9, 0x016f }, - { 0x01db, 0x0170 }, - { 0x01fb, 0x0171 }, - { 0x03d9, 0x0172 }, - { 0x03f9, 0x0173 }, - { 0x13be, 0x0178 }, - { 0x01ac, 0x0179 }, - { 0x01bc, 0x017a }, - { 0x01af, 0x017b }, - { 0x01bf, 0x017c }, - { 0x01ae, 0x017d }, - { 0x01be, 0x017e }, - { 0x08f6, 0x0192 }, - { 0x01b7, 0x02c7 }, - { 0x01a2, 0x02d8 }, - { 0x01ff, 0x02d9 }, - { 0x01b2, 0x02db }, - { 0x01bd, 0x02dd }, - { 0x07ae, 0x0385 }, - { 0x07a1, 0x0386 }, - { 0x07a2, 0x0388 }, - { 0x07a3, 0x0389 }, - { 0x07a4, 0x038a }, - { 0x07a7, 0x038c }, - { 0x07a8, 0x038e }, - { 0x07ab, 0x038f }, - { 0x07b6, 0x0390 }, - { 0x07c1, 0x0391 }, - { 0x07c2, 0x0392 }, - { 0x07c3, 0x0393 }, - { 0x07c4, 0x0394 }, - { 0x07c5, 0x0395 }, - { 0x07c6, 0x0396 }, - { 0x07c7, 0x0397 }, - { 0x07c8, 0x0398 }, - { 0x07c9, 0x0399 }, - { 0x07ca, 0x039a }, - { 0x07cb, 0x039b }, - { 0x07cc, 0x039c }, - { 0x07cd, 0x039d }, - { 0x07ce, 0x039e }, - { 0x07cf, 0x039f }, - { 0x07d0, 0x03a0 }, - { 0x07d1, 0x03a1 }, - { 0x07d2, 0x03a3 }, - { 0x07d4, 0x03a4 }, - { 0x07d5, 0x03a5 }, - { 0x07d6, 0x03a6 }, - { 0x07d7, 0x03a7 }, - { 0x07d8, 0x03a8 }, - { 0x07d9, 0x03a9 }, - { 0x07a5, 0x03aa }, - { 0x07a9, 0x03ab }, - { 0x07b1, 0x03ac }, - { 0x07b2, 0x03ad }, - { 0x07b3, 0x03ae }, - { 0x07b4, 0x03af }, - { 0x07ba, 0x03b0 }, - { 0x07e1, 0x03b1 }, - { 0x07e2, 0x03b2 }, - { 0x07e3, 0x03b3 }, - { 0x07e4, 0x03b4 }, - { 0x07e5, 0x03b5 }, - { 0x07e6, 0x03b6 }, - { 0x07e7, 0x03b7 }, - { 0x07e8, 0x03b8 }, - { 0x07e9, 0x03b9 }, - { 0x07ea, 0x03ba }, - { 0x07eb, 0x03bb }, - { 0x07ec, 0x03bc }, - { 0x07ed, 0x03bd }, - { 0x07ee, 0x03be }, - { 0x07ef, 0x03bf }, - { 0x07f0, 0x03c0 }, - { 0x07f1, 0x03c1 }, - { 0x07f3, 0x03c2 }, - { 0x07f2, 0x03c3 }, - { 0x07f4, 0x03c4 }, - { 0x07f5, 0x03c5 }, - { 0x07f6, 0x03c6 }, - { 0x07f7, 0x03c7 }, - { 0x07f8, 0x03c8 }, - { 0x07f9, 0x03c9 }, - { 0x07b5, 0x03ca }, - { 0x07b9, 0x03cb }, - { 0x07b7, 0x03cc }, - { 0x07b8, 0x03cd }, - { 0x07bb, 0x03ce }, - { 0x06b3, 0x0401 }, - { 0x06b1, 0x0402 }, - { 0x06b2, 0x0403 }, - { 0x06b4, 0x0404 }, - { 0x06b5, 0x0405 }, - { 0x06b6, 0x0406 }, - { 0x06b7, 0x0407 }, - { 0x06b8, 0x0408 }, - { 0x06b9, 0x0409 }, - { 0x06ba, 0x040a }, - { 0x06bb, 0x040b }, - { 0x06bc, 0x040c }, - { 0x06be, 0x040e }, - { 0x06bf, 0x040f }, - { 0x06e1, 0x0410 }, - { 0x06e2, 0x0411 }, - { 0x06f7, 0x0412 }, - { 0x06e7, 0x0413 }, - { 0x06e4, 0x0414 }, - { 0x06e5, 0x0415 }, - { 0x06f6, 0x0416 }, - { 0x06fa, 0x0417 }, - { 0x06e9, 0x0418 }, - { 0x06ea, 0x0419 }, - { 0x06eb, 0x041a }, - { 0x06ec, 0x041b }, - { 0x06ed, 0x041c }, - { 0x06ee, 0x041d }, - { 0x06ef, 0x041e }, - { 0x06f0, 0x041f }, - { 0x06f2, 0x0420 }, - { 0x06f3, 0x0421 }, - { 0x06f4, 0x0422 }, - { 0x06f5, 0x0423 }, - { 0x06e6, 0x0424 }, - { 0x06e8, 0x0425 }, - { 0x06e3, 0x0426 }, - { 0x06fe, 0x0427 }, - { 0x06fb, 0x0428 }, - { 0x06fd, 0x0429 }, - { 0x06ff, 0x042a }, - { 0x06f9, 0x042b }, - { 0x06f8, 0x042c }, - { 0x06fc, 0x042d }, - { 0x06e0, 0x042e }, - { 0x06f1, 0x042f }, - { 0x06c1, 0x0430 }, - { 0x06c2, 0x0431 }, - { 0x06d7, 0x0432 }, - { 0x06c7, 0x0433 }, - { 0x06c4, 0x0434 }, - { 0x06c5, 0x0435 }, - { 0x06d6, 0x0436 }, - { 0x06da, 0x0437 }, - { 0x06c9, 0x0438 }, - { 0x06ca, 0x0439 }, - { 0x06cb, 0x043a }, - { 0x06cc, 0x043b }, - { 0x06cd, 0x043c }, - { 0x06ce, 0x043d }, - { 0x06cf, 0x043e }, - { 0x06d0, 0x043f }, - { 0x06d2, 0x0440 }, - { 0x06d3, 0x0441 }, - { 0x06d4, 0x0442 }, - { 0x06d5, 0x0443 }, - { 0x06c6, 0x0444 }, - { 0x06c8, 0x0445 }, - { 0x06c3, 0x0446 }, - { 0x06de, 0x0447 }, - { 0x06db, 0x0448 }, - { 0x06dd, 0x0449 }, - { 0x06df, 0x044a }, - { 0x06d9, 0x044b }, - { 0x06d8, 0x044c }, - { 0x06dc, 0x044d }, - { 0x06c0, 0x044e }, - { 0x06d1, 0x044f }, - { 0x06a3, 0x0451 }, - { 0x06a1, 0x0452 }, - { 0x06a2, 0x0453 }, - { 0x06a4, 0x0454 }, - { 0x06a5, 0x0455 }, - { 0x06a6, 0x0456 }, - { 0x06a7, 0x0457 }, - { 0x06a8, 0x0458 }, - { 0x06a9, 0x0459 }, - { 0x06aa, 0x045a }, - { 0x06ab, 0x045b }, - { 0x06ac, 0x045c }, - { 0x06ae, 0x045e }, - { 0x06af, 0x045f }, - { 0x0ce0, 0x05d0 }, - { 0x0ce1, 0x05d1 }, - { 0x0ce2, 0x05d2 }, - { 0x0ce3, 0x05d3 }, - { 0x0ce4, 0x05d4 }, - { 0x0ce5, 0x05d5 }, - { 0x0ce6, 0x05d6 }, - { 0x0ce7, 0x05d7 }, - { 0x0ce8, 0x05d8 }, - { 0x0ce9, 0x05d9 }, - { 0x0cea, 0x05da }, - { 0x0ceb, 0x05db }, - { 0x0cec, 0x05dc }, - { 0x0ced, 0x05dd }, - { 0x0cee, 0x05de }, - { 0x0cef, 0x05df }, - { 0x0cf0, 0x05e0 }, - { 0x0cf1, 0x05e1 }, - { 0x0cf2, 0x05e2 }, - { 0x0cf3, 0x05e3 }, - { 0x0cf4, 0x05e4 }, - { 0x0cf5, 0x05e5 }, - { 0x0cf6, 0x05e6 }, - { 0x0cf7, 0x05e7 }, - { 0x0cf8, 0x05e8 }, - { 0x0cf9, 0x05e9 }, - { 0x0cfa, 0x05ea }, - { 0x05ac, 0x060c }, - { 0x05bb, 0x061b }, - { 0x05bf, 0x061f }, - { 0x05c1, 0x0621 }, - { 0x05c2, 0x0622 }, - { 0x05c3, 0x0623 }, - { 0x05c4, 0x0624 }, - { 0x05c5, 0x0625 }, - { 0x05c6, 0x0626 }, - { 0x05c7, 0x0627 }, - { 0x05c8, 0x0628 }, - { 0x05c9, 0x0629 }, - { 0x05ca, 0x062a }, - { 0x05cb, 0x062b }, - { 0x05cc, 0x062c }, - { 0x05cd, 0x062d }, - { 0x05ce, 0x062e }, - { 0x05cf, 0x062f }, - { 0x05d0, 0x0630 }, - { 0x05d1, 0x0631 }, - { 0x05d2, 0x0632 }, - { 0x05d3, 0x0633 }, - { 0x05d4, 0x0634 }, - { 0x05d5, 0x0635 }, - { 0x05d6, 0x0636 }, - { 0x05d7, 0x0637 }, - { 0x05d8, 0x0638 }, - { 0x05d9, 0x0639 }, - { 0x05da, 0x063a }, - { 0x05e0, 0x0640 }, - { 0x05e1, 0x0641 }, - { 0x05e2, 0x0642 }, - { 0x05e3, 0x0643 }, - { 0x05e4, 0x0644 }, - { 0x05e5, 0x0645 }, - { 0x05e6, 0x0646 }, - { 0x05e7, 0x0647 }, - { 0x05e8, 0x0648 }, - { 0x05e9, 0x0649 }, - { 0x05ea, 0x064a }, - { 0x05eb, 0x064b }, - { 0x05ec, 0x064c }, - { 0x05ed, 0x064d }, - { 0x05ee, 0x064e }, - { 0x05ef, 0x064f }, - { 0x05f0, 0x0650 }, - { 0x05f1, 0x0651 }, - { 0x05f2, 0x0652 }, - { 0x0da1, 0x0e01 }, - { 0x0da2, 0x0e02 }, - { 0x0da3, 0x0e03 }, - { 0x0da4, 0x0e04 }, - { 0x0da5, 0x0e05 }, - { 0x0da6, 0x0e06 }, - { 0x0da7, 0x0e07 }, - { 0x0da8, 0x0e08 }, - { 0x0da9, 0x0e09 }, - { 0x0daa, 0x0e0a }, - { 0x0dab, 0x0e0b }, - { 0x0dac, 0x0e0c }, - { 0x0dad, 0x0e0d }, - { 0x0dae, 0x0e0e }, - { 0x0daf, 0x0e0f }, - { 0x0db0, 0x0e10 }, - { 0x0db1, 0x0e11 }, - { 0x0db2, 0x0e12 }, - { 0x0db3, 0x0e13 }, - { 0x0db4, 0x0e14 }, - { 0x0db5, 0x0e15 }, - { 0x0db6, 0x0e16 }, - { 0x0db7, 0x0e17 }, - { 0x0db8, 0x0e18 }, - { 0x0db9, 0x0e19 }, - { 0x0dba, 0x0e1a }, - { 0x0dbb, 0x0e1b }, - { 0x0dbc, 0x0e1c }, - { 0x0dbd, 0x0e1d }, - { 0x0dbe, 0x0e1e }, - { 0x0dbf, 0x0e1f }, - { 0x0dc0, 0x0e20 }, - { 0x0dc1, 0x0e21 }, - { 0x0dc2, 0x0e22 }, - { 0x0dc3, 0x0e23 }, - { 0x0dc4, 0x0e24 }, - { 0x0dc5, 0x0e25 }, - { 0x0dc6, 0x0e26 }, - { 0x0dc7, 0x0e27 }, - { 0x0dc8, 0x0e28 }, - { 0x0dc9, 0x0e29 }, - { 0x0dca, 0x0e2a }, - { 0x0dcb, 0x0e2b }, - { 0x0dcc, 0x0e2c }, - { 0x0dcd, 0x0e2d }, - { 0x0dce, 0x0e2e }, - { 0x0dcf, 0x0e2f }, - { 0x0dd0, 0x0e30 }, - { 0x0dd1, 0x0e31 }, - { 0x0dd2, 0x0e32 }, - { 0x0dd3, 0x0e33 }, - { 0x0dd4, 0x0e34 }, - { 0x0dd5, 0x0e35 }, - { 0x0dd6, 0x0e36 }, - { 0x0dd7, 0x0e37 }, - { 0x0dd8, 0x0e38 }, - { 0x0dd9, 0x0e39 }, - { 0x0dda, 0x0e3a }, - { 0x0ddf, 0x0e3f }, - { 0x0de0, 0x0e40 }, - { 0x0de1, 0x0e41 }, - { 0x0de2, 0x0e42 }, - { 0x0de3, 0x0e43 }, - { 0x0de4, 0x0e44 }, - { 0x0de5, 0x0e45 }, - { 0x0de6, 0x0e46 }, - { 0x0de7, 0x0e47 }, - { 0x0de8, 0x0e48 }, - { 0x0de9, 0x0e49 }, - { 0x0dea, 0x0e4a }, - { 0x0deb, 0x0e4b }, - { 0x0dec, 0x0e4c }, - { 0x0ded, 0x0e4d }, - { 0x0df0, 0x0e50 }, - { 0x0df1, 0x0e51 }, - { 0x0df2, 0x0e52 }, - { 0x0df3, 0x0e53 }, - { 0x0df4, 0x0e54 }, - { 0x0df5, 0x0e55 }, - { 0x0df6, 0x0e56 }, - { 0x0df7, 0x0e57 }, - { 0x0df8, 0x0e58 }, - { 0x0df9, 0x0e59 }, - { 0x0ed4, 0x11a8 }, - { 0x0ed5, 0x11a9 }, - { 0x0ed6, 0x11aa }, - { 0x0ed7, 0x11ab }, - { 0x0ed8, 0x11ac }, - { 0x0ed9, 0x11ad }, - { 0x0eda, 0x11ae }, - { 0x0edb, 0x11af }, - { 0x0edc, 0x11b0 }, - { 0x0edd, 0x11b1 }, - { 0x0ede, 0x11b2 }, - { 0x0edf, 0x11b3 }, - { 0x0ee0, 0x11b4 }, - { 0x0ee1, 0x11b5 }, - { 0x0ee2, 0x11b6 }, - { 0x0ee3, 0x11b7 }, - { 0x0ee4, 0x11b8 }, - { 0x0ee5, 0x11b9 }, - { 0x0ee6, 0x11ba }, - { 0x0ee7, 0x11bb }, - { 0x0ee8, 0x11bc }, - { 0x0ee9, 0x11bd }, - { 0x0eea, 0x11be }, - { 0x0eeb, 0x11bf }, - { 0x0eec, 0x11c0 }, - { 0x0eed, 0x11c1 }, - { 0x0eee, 0x11c2 }, - { 0x0ef8, 0x11eb }, - { 0x0ef9, 0x11f0 }, - { 0x0efa, 0x11f9 }, - { 0x0aa2, 0x2002 }, - { 0x0aa1, 0x2003 }, - { 0x0aa3, 0x2004 }, - { 0x0aa4, 0x2005 }, - { 0x0aa5, 0x2007 }, - { 0x0aa6, 0x2008 }, - { 0x0aa7, 0x2009 }, - { 0x0aa8, 0x200a }, - { 0x0abb, 0x2012 }, - { 0x0aaa, 0x2013 }, - { 0x0aa9, 0x2014 }, - { 0x07af, 0x2015 }, - { 0x0cdf, 0x2017 }, - { 0x0ad0, 0x2018 }, - { 0x0ad1, 0x2019 }, - { 0x0afd, 0x201a }, - { 0x0ad2, 0x201c }, - { 0x0ad3, 0x201d }, - { 0x0afe, 0x201e }, - { 0x0af1, 0x2020 }, - { 0x0af2, 0x2021 }, - { 0x0ae6, 0x2022 }, - { 0x0aaf, 0x2025 }, - { 0x0aae, 0x2026 }, - { 0x0ad6, 0x2032 }, - { 0x0ad7, 0x2033 }, - { 0x0afc, 0x2038 }, - { 0x047e, 0x203e }, - { 0x0eff, 0x20a9 }, - { 0x20ac, 0x20ac }, - { 0x0ab8, 0x2105 }, - { 0x06b0, 0x2116 }, - { 0x0afb, 0x2117 }, - { 0x0ad4, 0x211e }, - { 0x0ac9, 0x2122 }, - { 0x0ab0, 0x2153 }, - { 0x0ab1, 0x2154 }, - { 0x0ab2, 0x2155 }, - { 0x0ab3, 0x2156 }, - { 0x0ab4, 0x2157 }, - { 0x0ab5, 0x2158 }, - { 0x0ab6, 0x2159 }, - { 0x0ab7, 0x215a }, - { 0x0ac3, 0x215b }, - { 0x0ac4, 0x215c }, - { 0x0ac5, 0x215d }, - { 0x0ac6, 0x215e }, - { 0x08fb, 0x2190 }, - { 0x08fc, 0x2191 }, - { 0x08fd, 0x2192 }, - { 0x08fe, 0x2193 }, - { 0x08ce, 0x21d2 }, - { 0x08cd, 0x21d4 }, - { 0x08ef, 0x2202 }, - { 0x08c5, 0x2207 }, - { 0x0bca, 0x2218 }, - { 0x08d6, 0x221a }, - { 0x08c1, 0x221d }, - { 0x08c2, 0x221e }, - { 0x08de, 0x2227 }, - { 0x08df, 0x2228 }, - { 0x08dc, 0x2229 }, - { 0x08dd, 0x222a }, - { 0x08bf, 0x222b }, - { 0x08c0, 0x2234 }, - { 0x08c8, 0x223c }, - { 0x08c9, 0x2243 }, - { 0x08bd, 0x2260 }, - { 0x08cf, 0x2261 }, - { 0x08bc, 0x2264 }, - { 0x08be, 0x2265 }, - { 0x08da, 0x2282 }, - { 0x08db, 0x2283 }, - { 0x0bfc, 0x22a2 }, - { 0x0bdc, 0x22a3 }, - { 0x0bce, 0x22a4 }, - { 0x0bc2, 0x22a5 }, - { 0x0bd3, 0x2308 }, - { 0x0bc4, 0x230a }, - { 0x0afa, 0x2315 }, - { 0x08a4, 0x2320 }, - { 0x08a5, 0x2321 }, - { 0x0abc, 0x2329 }, - { 0x0abe, 0x232a }, - { 0x0bcc, 0x2395 }, - { 0x08ab, 0x239b }, - { 0x08ac, 0x239d }, - { 0x08ad, 0x239e }, - { 0x08ae, 0x23a0 }, - { 0x08a7, 0x23a1 }, - { 0x08a8, 0x23a3 }, - { 0x08a9, 0x23a4 }, - { 0x08aa, 0x23a6 }, - { 0x08af, 0x23a8 }, - { 0x08b0, 0x23ac }, - { 0x08a1, 0x23b7 }, - { 0x09ef, 0x23ba }, - { 0x09f0, 0x23bb }, - { 0x09f2, 0x23bc }, - { 0x09f3, 0x23bd }, - { 0x09e2, 0x2409 }, - { 0x09e5, 0x240a }, - { 0x09e9, 0x240b }, - { 0x09e3, 0x240c }, - { 0x09e4, 0x240d }, - { 0x09e8, 0x2424 }, - { 0x09f1, 0x2500 }, - { 0x09f8, 0x2502 }, - { 0x09ec, 0x250c }, - { 0x09eb, 0x2510 }, - { 0x09ed, 0x2514 }, - { 0x09ea, 0x2518 }, - { 0x09f4, 0x251c }, - { 0x09f5, 0x2524 }, - { 0x09f7, 0x252c }, - { 0x09f6, 0x2534 }, - { 0x09ee, 0x253c }, - { 0x09e1, 0x2592 }, - { 0x0ae7, 0x25aa }, - { 0x0ae1, 0x25ab }, - { 0x0adb, 0x25ac }, - { 0x0ae2, 0x25ad }, - { 0x0adf, 0x25ae }, - { 0x0acf, 0x25af }, - { 0x0ae8, 0x25b2 }, - { 0x0ae3, 0x25b3 }, - { 0x0add, 0x25b6 }, - { 0x0acd, 0x25b7 }, - { 0x0ae9, 0x25bc }, - { 0x0ae4, 0x25bd }, - { 0x0adc, 0x25c0 }, - { 0x0acc, 0x25c1 }, - { 0x09e0, 0x25c6 }, - { 0x0ace, 0x25cb }, - { 0x0ade, 0x25cf }, - { 0x0ae0, 0x25e6 }, - { 0x0ae5, 0x2606 }, - { 0x0af9, 0x260e }, - { 0x0aca, 0x2613 }, - { 0x0aea, 0x261c }, - { 0x0aeb, 0x261e }, - { 0x0af8, 0x2640 }, - { 0x0af7, 0x2642 }, - { 0x0aec, 0x2663 }, - { 0x0aee, 0x2665 }, - { 0x0aed, 0x2666 }, - { 0x0af6, 0x266d }, - { 0x0af5, 0x266f }, - { 0x0af3, 0x2713 }, - { 0x0af4, 0x2717 }, - { 0x0ad9, 0x271d }, - { 0x0af0, 0x2720 }, - { 0x04a4, 0x3001 }, - { 0x04a1, 0x3002 }, - { 0x04a2, 0x300c }, - { 0x04a3, 0x300d }, - { 0x04de, 0x309b }, - { 0x04df, 0x309c }, - { 0x04a7, 0x30a1 }, - { 0x04b1, 0x30a2 }, - { 0x04a8, 0x30a3 }, - { 0x04b2, 0x30a4 }, - { 0x04a9, 0x30a5 }, - { 0x04b3, 0x30a6 }, - { 0x04aa, 0x30a7 }, - { 0x04b4, 0x30a8 }, - { 0x04ab, 0x30a9 }, - { 0x04b5, 0x30aa }, - { 0x04b6, 0x30ab }, - { 0x04b7, 0x30ad }, - { 0x04b8, 0x30af }, - { 0x04b9, 0x30b1 }, - { 0x04ba, 0x30b3 }, - { 0x04bb, 0x30b5 }, - { 0x04bc, 0x30b7 }, - { 0x04bd, 0x30b9 }, - { 0x04be, 0x30bb }, - { 0x04bf, 0x30bd }, - { 0x04c0, 0x30bf }, - { 0x04c1, 0x30c1 }, - { 0x04af, 0x30c3 }, - { 0x04c2, 0x30c4 }, - { 0x04c3, 0x30c6 }, - { 0x04c4, 0x30c8 }, - { 0x04c5, 0x30ca }, - { 0x04c6, 0x30cb }, - { 0x04c7, 0x30cc }, - { 0x04c8, 0x30cd }, - { 0x04c9, 0x30ce }, - { 0x04ca, 0x30cf }, - { 0x04cb, 0x30d2 }, - { 0x04cc, 0x30d5 }, - { 0x04cd, 0x30d8 }, - { 0x04ce, 0x30db }, - { 0x04cf, 0x30de }, - { 0x04d0, 0x30df }, - { 0x04d1, 0x30e0 }, - { 0x04d2, 0x30e1 }, - { 0x04d3, 0x30e2 }, - { 0x04ac, 0x30e3 }, - { 0x04d4, 0x30e4 }, - { 0x04ad, 0x30e5 }, - { 0x04d5, 0x30e6 }, - { 0x04ae, 0x30e7 }, - { 0x04d6, 0x30e8 }, - { 0x04d7, 0x30e9 }, - { 0x04d8, 0x30ea }, - { 0x04d9, 0x30eb }, - { 0x04da, 0x30ec }, - { 0x04db, 0x30ed }, - { 0x04dc, 0x30ef }, - { 0x04a6, 0x30f2 }, - { 0x04dd, 0x30f3 }, - { 0x04a5, 0x30fb }, - { 0x04b0, 0x30fc }, - { 0x0ea1, 0x3131 }, - { 0x0ea2, 0x3132 }, - { 0x0ea3, 0x3133 }, - { 0x0ea4, 0x3134 }, - { 0x0ea5, 0x3135 }, - { 0x0ea6, 0x3136 }, - { 0x0ea7, 0x3137 }, - { 0x0ea8, 0x3138 }, - { 0x0ea9, 0x3139 }, - { 0x0eaa, 0x313a }, - { 0x0eab, 0x313b }, - { 0x0eac, 0x313c }, - { 0x0ead, 0x313d }, - { 0x0eae, 0x313e }, - { 0x0eaf, 0x313f }, - { 0x0eb0, 0x3140 }, - { 0x0eb1, 0x3141 }, - { 0x0eb2, 0x3142 }, - { 0x0eb3, 0x3143 }, - { 0x0eb4, 0x3144 }, - { 0x0eb5, 0x3145 }, - { 0x0eb6, 0x3146 }, - { 0x0eb7, 0x3147 }, - { 0x0eb8, 0x3148 }, - { 0x0eb9, 0x3149 }, - { 0x0eba, 0x314a }, - { 0x0ebb, 0x314b }, - { 0x0ebc, 0x314c }, - { 0x0ebd, 0x314d }, - { 0x0ebe, 0x314e }, - { 0x0ebf, 0x314f }, - { 0x0ec0, 0x3150 }, - { 0x0ec1, 0x3151 }, - { 0x0ec2, 0x3152 }, - { 0x0ec3, 0x3153 }, - { 0x0ec4, 0x3154 }, - { 0x0ec5, 0x3155 }, - { 0x0ec6, 0x3156 }, - { 0x0ec7, 0x3157 }, - { 0x0ec8, 0x3158 }, - { 0x0ec9, 0x3159 }, - { 0x0eca, 0x315a }, - { 0x0ecb, 0x315b }, - { 0x0ecc, 0x315c }, - { 0x0ecd, 0x315d }, - { 0x0ece, 0x315e }, - { 0x0ecf, 0x315f }, - { 0x0ed0, 0x3160 }, - { 0x0ed1, 0x3161 }, - { 0x0ed2, 0x3162 }, - { 0x0ed3, 0x3163 }, - { 0x0eef, 0x316d }, - { 0x0ef0, 0x3171 }, - { 0x0ef1, 0x3178 }, - { 0x0ef2, 0x317f }, - { 0x0ef3, 0x3181 }, - { 0x0ef4, 0x3184 }, - { 0x0ef5, 0x3186 }, - { 0x0ef6, 0x318d }, - { 0x0ef7, 0x318e } - }; - - public static int translate(int unicode) { - if ((unicode >= 0x20 && unicode <= 0x7e) || - (unicode >= 0xa0 && unicode <= 0xff)) - return unicode; - - int min = 0; - int max = table.length - 1; - int mid; - - while (max >= min) { - mid = (min + max) / 2; - if (table[mid][1] < unicode) - min = mid + 1; - else if (table[mid][1] > unicode) - max = mid - 1; - else - return table[mid][0]; - } - - /* no matching Unicode value found */ - return -1; - } -} diff --git a/java/src/com/tigervnc/rfb/UserMsgBox.java b/java/src/com/tigervnc/rfb/UserMsgBox.java deleted file mode 100644 index e83d9956..00000000 --- a/java/src/com/tigervnc/rfb/UserMsgBox.java +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// getUserPasswd() gets the username and password. This might involve a -// dialog, getpass(), etc. The user buffer pointer can be null, in which case -// no user name will be retrieved. - -package com.tigervnc.rfb; - -public interface UserMsgBox { - public boolean showMsgBox(int flags,String title, String text); -} diff --git a/java/src/com/tigervnc/rfb/UserPasswdGetter.java b/java/src/com/tigervnc/rfb/UserPasswdGetter.java deleted file mode 100644 index 9796b66f..00000000 --- a/java/src/com/tigervnc/rfb/UserPasswdGetter.java +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// getUserPasswd() gets the username and password. This might involve a -// dialog, getpass(), etc. The user buffer pointer can be null, in which case -// no user name will be retrieved. - -package com.tigervnc.rfb; - -public interface UserPasswdGetter { - public boolean getUserPasswd(StringBuffer user, StringBuffer password); -} diff --git a/java/src/com/tigervnc/rfb/VncAuth.java b/java/src/com/tigervnc/rfb/VncAuth.java deleted file mode 100644 index cce8d81c..00000000 --- a/java/src/com/tigervnc/rfb/VncAuth.java +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class VncAuth { - - public static final int ok = 0; - public static final int failed = 1; - public static final int tooMany = 2; // deprecated - - public static final int challengeSize = 16; - - public static void encryptChallenge(byte[] challenge, String passwd) { - byte[] key = new byte[8]; - for (int i = 0; i < 8 && i < passwd.length(); i++) { - key[i] = (byte)passwd.charAt(i); - } - - DesCipher des = new DesCipher(key); - - for (int j = 0; j < challengeSize; j += 8) - des.encrypt(challenge,j,challenge,j); - } - - void obfuscatePasswd(String passwd, byte[] obfuscated) { - for (int i = 0; i < 8; i++) { - if (i < passwd.length()) - obfuscated[i] = (byte)passwd.charAt(i); - else - obfuscated[i] = 0; - } - DesCipher des = new DesCipher(obfuscationKey); - des.encrypt(obfuscated,0,obfuscated,0); - } - - String unobfuscatePasswd(byte[] obfuscated) { - DesCipher des = new DesCipher(obfuscationKey); - des.decrypt(obfuscated,0,obfuscated,0); - int len; - for (len = 0; len < 8; len++) { - if (obfuscated[len] == 0) break; - } - char[] plain = new char[len]; - for (int i = 0; i < len; i++) { - plain[i] = (char)obfuscated[i]; - } - return new String(plain); - } - - static byte[] obfuscationKey = {23,82,107,6,35,78,88,7}; -} diff --git a/java/src/com/tigervnc/rfb/VoidParameter.java b/java/src/com/tigervnc/rfb/VoidParameter.java deleted file mode 100644 index f41f4c84..00000000 --- a/java/src/com/tigervnc/rfb/VoidParameter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -abstract public class VoidParameter { - public VoidParameter(String name_, String desc_) { - name = name_; - description = desc_; - next = Configuration.head; - Configuration.head = this; - } - - final public String getName() { return name; } - final public String getDescription() { return description; } - - abstract public boolean setParam(String value); - public boolean setParam() { return false; } - abstract public String getDefaultStr(); - abstract public String getValueStr(); - public boolean isBool() { return false; } - - VoidParameter next; - protected String name; - protected String description; -} diff --git a/java/src/com/tigervnc/rfb/ZRLEDecoder.java b/java/src/com/tigervnc/rfb/ZRLEDecoder.java deleted file mode 100644 index 4f740f9d..00000000 --- a/java/src/com/tigervnc/rfb/ZRLEDecoder.java +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -import com.tigervnc.rdr.*; - -public class ZRLEDecoder extends Decoder { - - public ZRLEDecoder(CMsgReader reader_) { - reader = reader_; - zis = new ZlibInStream(); - } - - public void readRect(Rect r, CMsgHandler handler) { - InStream is = reader.getInStream(); - int[] buf = reader.getImageBuf(64 * 64 * 4); - int bytesPerPixel = handler.cp.pf().bpp / 8; - boolean bigEndian = handler.cp.pf().bigEndian; - - int length = is.readU32(); - zis.setUnderlying(is, length); - Rect t = new Rect(); - - for (t.tl.y = r.tl.y; t.tl.y < r.br.y; t.tl.y += 64) { - - t.br.y = Math.min(r.br.y, t.tl.y + 64); - - for (t.tl.x = r.tl.x; t.tl.x < r.br.x; t.tl.x += 64) { - - t.br.x = Math.min(r.br.x, t.tl.x + 64); - - int mode = zis.readU8(); - boolean rle = (mode & 128) != 0; - int palSize = mode & 127; - int[] palette = new int[128]; - - if (bytesPerPixel > 1) { - zis.readPixels(palette, palSize, 3, bigEndian); - } else { - for (int i = 0; i < palSize; i++) { - palette[i] = zis.readPixel(bytesPerPixel, bigEndian); - } - } - - if (palSize == 1) { - int pix = palette[0]; - handler.fillRect(t, pix); - continue; - } - - if (!rle) { - if (palSize == 0) { - - // raw - - if (bytesPerPixel > 1) { - zis.readPixels(buf, t.area(), 3, bigEndian); - } else { - zis.readPixels(buf, t.area(), bytesPerPixel, bigEndian); - } - - } else { - - // packed pixels - int bppp = ((palSize > 16) ? 8 : - ((palSize > 4) ? 4 : ((palSize > 2) ? 2 : 1))); - - int ptr = 0; - - for (int i = 0; i < t.height(); i++) { - int eol = ptr + t.width(); - int b = 0; - int nbits = 0; - - while (ptr < eol) { - if (nbits == 0) { - b = zis.readU8(); - nbits = 8; - } - nbits -= bppp; - int index = (b >> nbits) & ((1 << bppp) - 1) & 127; - buf[ptr++] = palette[index]; - } - } - } - - } else { - - if (palSize == 0) { - - // plain RLE - - int ptr = 0; - int end = ptr + t.area(); - while (ptr < end) { - int pix = (bytesPerPixel > 1 ? zis.readPixel(3, bigEndian) : - zis.readPixel(bytesPerPixel, bigEndian)); - int len = 1; - int b; - do { - b = zis.readU8(); - len += b; - } while (b == 255); - - if (!(len <= end - ptr)) - throw new Exception("ZRLEDecoder: assertion (len <= end - ptr)" - +" failed"); - - while (len-- > 0) buf[ptr++] = pix; - } - } else { - - // palette RLE - - int ptr = 0; - int end = ptr + t.area(); - while (ptr < end) { - int index = zis.readU8(); - int len = 1; - if ((index & 128) != 0) { - int b; - do { - b = zis.readU8(); - len += b; - } while (b == 255); - - if (!(len <= end - ptr)) - throw new Exception("ZRLEDecoder: assertion " - +"(len <= end - ptr) failed"); - } - - index &= 127; - - int pix = palette[index]; - - while (len-- > 0) buf[ptr++] = pix; - } - } - } - - handler.imageRect(t, buf); - } - } - - zis.reset(); - } - - CMsgReader reader; - ZlibInStream zis; -} diff --git a/java/src/com/tigervnc/rfb/screenTypes.java b/java/src/com/tigervnc/rfb/screenTypes.java deleted file mode 100644 index d46741c6..00000000 --- a/java/src/com/tigervnc/rfb/screenTypes.java +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright 2009 Pierre Ossman for Cendio AB - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.rfb; - -public class screenTypes { - - // Reasons - public static final int reasonServer = 0; - public static final int reasonClient = 1; - public static final int reasonOtherClient = 2; - - // Result codes - public static final int resultSuccess = 0; - public static final int resultProhibited = 1; - public static final int resultNoResources = 2; - public static final int resultInvalid = 3; - - public static final int resultUnsolicited = 0xffff; // internal code used for server changes - -} diff --git a/java/src/com/tigervnc/vncviewer/CConn.java b/java/src/com/tigervnc/vncviewer/CConn.java deleted file mode 100644 index 7d76beed..00000000 --- a/java/src/com/tigervnc/vncviewer/CConn.java +++ /dev/null @@ -1,1309 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// CConn -// -// Methods on CConn are called from both the GUI thread and the thread which -// processes incoming RFB messages ("the RFB thread"). This means we need to -// be careful with synchronization here. -// -// Any access to writer() must not only be synchronized, but we must also make -// sure that the connection is in RFBSTATE_NORMAL. We are guaranteed this for -// any code called after serverInit() has been called. Since the DesktopWindow -// isn't created until then, any methods called only from DesktopWindow can -// assume that we are in RFBSTATE_NORMAL. - -package com.tigervnc.vncviewer; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.event.*; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Event; -import java.awt.Frame; -import java.awt.ScrollPane; - -import java.io.*; -import javax.net.ssl.*; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.File; -import java.util.jar.Attributes; -import java.util.jar.Manifest; -import javax.swing.*; -import javax.swing.filechooser.*; -import javax.swing.ImageIcon; -import java.net.URL; -import java.net.ServerSocket; -import javax.swing.border.*; -import java.util.*; - -import com.tigervnc.rdr.*; -import com.tigervnc.rfb.*; -import com.tigervnc.rfb.Exception; -import com.tigervnc.rfb.Point; -import com.tigervnc.rfb.Rect; - -class ViewportFrame extends JFrame -{ - public ViewportFrame(String name, CConn cc_) { - cc = cc_; - setTitle("TigerVNC: "+name); - setFocusable(false); - setFocusTraversalKeysEnabled(false); - addWindowFocusListener(new WindowAdapter() { - public void windowGainedFocus(WindowEvent e) { - sp.getViewport().getView().requestFocusInWindow(); - } - }); - addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - cc.close(); - } - }); - addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - if (cc.options.autoScale || cc.options.fixedRatioScale) { - if (sp.getSize().width != cc.desktop.scaledWidth || - sp.getSize().height != cc.desktop.scaledHeight) { - cc.desktop.setScaledSize(); - sp.setSize(new Dimension(cc.desktop.scaledWidth, - cc.desktop.scaledHeight)); - sp.validate(); - pack(); - update(g); - if (cc.desktop.cursor != null) { - Cursor cursor = cc.desktop.cursor; - cc.setCursor(cursor.width(),cursor.height(),cursor.hotspot, - cursor.data, cursor.mask); - } - } - } - } - }); - } - - public void addChild(DesktopWindow child) { - sp = new JScrollPane(child); - child.setBackground(Color.BLACK); - child.setOpaque(true); - sp.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); - getContentPane().add(sp); - } - - public void setChild(DesktopWindow child) { - getContentPane().removeAll(); - addChild(child); - } - - public void setGeometry(int x, int y, int w, int h, boolean pack) { - if (pack) { - pack(); - } else { - setSize(w, h); - } - if (!cc.options.autoScale && !cc.options.fixedRatioScale) - setLocation(x, y); - setBackground(Color.BLACK); - } - - - CConn cc; - Graphics g; - JScrollPane sp; - static LogWriter vlog = new LogWriter("ViewportFrame"); -} - -public class CConn extends CConnection - implements UserPasswdGetter, UserMsgBox, OptionsDialogCallback -{ - //////////////////////////////////////////////////////////////////// - // The following methods are all called from the RFB thread - - public CConn(VncViewer viewer_, java.net.Socket sock_, - String vncServerName, boolean reverse) - { - serverHost = null; serverPort = 0; sock = sock_; viewer = viewer_; - currentEncoding = Encodings.encodingTight; lastServerEncoding = -1; - fullColour = viewer.fullColour.getValue(); - lowColourLevel = 2; - autoSelect = viewer.autoSelect.getValue(); - shared = viewer.shared.getValue(); formatChange = false; - encodingChange = false; sameMachine = false; - fullScreen = viewer.fullScreen.getValue(); - menuKey = Keysyms.F8; - options = new OptionsDialog(this); - options.initDialog(); - clipboardDialog = new ClipboardDialog(this); - firstUpdate = true; pendingUpdate = false; - - setShared(shared); - upg = this; - msg = this; - - String encStr = viewer.preferredEncoding.getValue(); - int encNum = Encodings.encodingNum(encStr); - if (encNum != -1) { - currentEncoding = encNum; - } - cp.supportsDesktopResize = true; - cp.supportsExtendedDesktopSize = true; - cp.supportsClientRedirect = true; - cp.supportsDesktopRename = true; - cp.supportsLocalCursor = viewer.useLocalCursor.getValue(); - cp.customCompressLevel = viewer.customCompressLevel.getValue(); - cp.compressLevel = viewer.compressLevel.getValue(); - cp.noJpeg = viewer.noJpeg.getValue(); - cp.qualityLevel = viewer.qualityLevel.getValue(); - initMenu(); - - if (sock != null) { - String name = sock.getRemoteSocketAddress()+"::"+sock.getPort(); - vlog.info("Accepted connection from "+name); - } else { - if (vncServerName != null) { - serverHost = Hostname.getHost(vncServerName); - serverPort = Hostname.getPort(vncServerName); - } else { - ServerDialog dlg = new ServerDialog(options, vncServerName, this); - if (!dlg.showDialog() || dlg.server.getSelectedItem().equals("")) { - System.exit(1); - } - vncServerName = (String)dlg.server.getSelectedItem(); - serverHost = Hostname.getHost(vncServerName); - serverPort = Hostname.getPort(vncServerName); - } - - try { - sock = new java.net.Socket(serverHost, serverPort); - } catch (java.io.IOException e) { - throw new Exception(e.toString()); - } - vlog.info("connected to host "+serverHost+" port "+serverPort); - } - - sameMachine = (sock.getLocalSocketAddress() == sock.getRemoteSocketAddress()); - try { - sock.setTcpNoDelay(true); - sock.setTrafficClass(0x10); - setServerName(serverHost); - jis = new JavaInStream(sock.getInputStream()); - jos = new JavaOutStream(sock.getOutputStream()); - } catch (java.net.SocketException e) { - throw new Exception(e.toString()); - } catch (java.io.IOException e) { - throw new Exception(e.toString()); - } - setStreams(jis, jos); - initialiseProtocol(); - } - - public boolean showMsgBox(int flags, String title, String text) - { - StringBuffer titleText = new StringBuffer("VNC Viewer: "+title); - - return true; - } - - // deleteWindow() is called when the user closes the desktop or menu windows. - - void deleteWindow() { - if (viewport != null) - viewport.dispose(); - viewport = null; - } - - // getUserPasswd() is called by the CSecurity object when it needs us to read - // a password from the user. - - public final boolean getUserPasswd(StringBuffer user, StringBuffer passwd) { - String title = ("VNC Authentication [" - +csecurity.description() + "]"); - PasswdDialog dlg; - if (user == null) { - dlg = new PasswdDialog(title, (user == null), (passwd == null)); - } else { - if ((passwd == null) && viewer.sendLocalUsername.getValue()) { - user.append((String)System.getProperties().get("user.name")); - return true; - } - dlg = new PasswdDialog(title, viewer.sendLocalUsername.getValue(), - (passwd == null)); - } - if (!dlg.showDialog()) return false; - if (user != null) { - if (viewer.sendLocalUsername.getValue()) { - user.append((String)System.getProperties().get("user.name")); - } else { - user.append(dlg.userEntry.getText()); - } - } - if (passwd != null) - passwd.append(dlg.passwdEntry.getText()); - return true; - } - - // CConnection callback methods - - // serverInit() is called when the serverInit message has been received. At - // this point we create the desktop window and display it. We also tell the - // server the pixel format and encodings to use and request the first update. - public void serverInit() { - super.serverInit(); - - // If using AutoSelect with old servers, start in FullColor - // mode. See comment in autoSelectFormatAndEncoding. - if (cp.beforeVersion(3, 8) && autoSelect) { - fullColour = true; - } - - serverPF = cp.pf(); - desktop = new DesktopWindow(cp.width, cp.height, serverPF, this); - //desktopEventHandler = desktop.setEventHandler(this); - //desktop.addEventMask(KeyPressMask | KeyReleaseMask); - fullColourPF = desktop.getPF(); - if (!serverPF.trueColour) - fullColour = true; - recreateViewport(); - formatChange = true; encodingChange = true; - requestNewUpdate(); - } - - // setDesktopSize() is called when the desktop size changes (including when - // it is set initially). - public void setDesktopSize(int w, int h) { - super.setDesktopSize(w,h); - resizeFramebuffer(); - } - - // setExtendedDesktopSize() is a more advanced version of setDesktopSize() - public void setExtendedDesktopSize(int reason, int result, int w, int h, - ScreenSet layout) { - super.setExtendedDesktopSize(reason, result, w, h, layout); - - if ((reason == screenTypes.reasonClient) && - (result != screenTypes.resultSuccess)) { - vlog.error("SetDesktopSize failed: "+result); - return; - } - - resizeFramebuffer(); - } - - // clientRedirect() migrates the client to another host/port - public void clientRedirect(int port, String host, - String x509subject) { - try { - getSocket().close(); - setServerPort(port); - sock = new java.net.Socket(host, port); - sock.setTcpNoDelay(true); - sock.setTrafficClass(0x10); - setSocket(sock); - vlog.info("Redirected to "+host+":"+port); - setStreams(new JavaInStream(sock.getInputStream()), - new JavaOutStream(sock.getOutputStream())); - initialiseProtocol(); - } catch (java.io.IOException e) { - e.printStackTrace(); - } - } - - // setName() is called when the desktop name changes - public void setName(String name) { - super.setName(name); - - if (viewport != null) { - viewport.setTitle("TigerVNC: "+name); - } - } - - // framebufferUpdateStart() is called at the beginning of an update. - // Here we try to send out a new framebuffer update request so that the - // next update can be sent out in parallel with us decoding the current - // one. We cannot do this if we're in the middle of a format change - // though. - public void framebufferUpdateStart() { - if (!formatChange) { - pendingUpdate = true; - requestNewUpdate(); - } else - pendingUpdate = false; - } - - // framebufferUpdateEnd() is called at the end of an update. - // For each rectangle, the FdInStream will have timed the speed - // of the connection, allowing us to select format and encoding - // appropriately, and then request another incremental update. - public void framebufferUpdateEnd() { - desktop.framebufferUpdateEnd(); - - if (firstUpdate) { - int width, height; - - if (cp.supportsSetDesktopSize && - viewer.desktopSize.getValue() != null && - viewer.desktopSize.getValue().split("x").length == 2) { - width = Integer.parseInt(viewer.desktopSize.getValue().split("x")[0]); - height = Integer.parseInt(viewer.desktopSize.getValue().split("x")[1]); - ScreenSet layout; - - layout = cp.screenLayout; - - if (layout.num_screens() == 0) - layout.add_screen(new Screen()); - else if (layout.num_screens() != 1) { - - while (true) { - Iterator iter = layout.screens.iterator(); - Screen screen = (Screen)iter.next(); - - if (!iter.hasNext()) - break; - - layout.remove_screen(screen.id); - } - } - - Screen screen0 = (Screen)layout.screens.iterator().next(); - screen0.dimensions.tl.x = 0; - screen0.dimensions.tl.y = 0; - screen0.dimensions.br.x = width; - screen0.dimensions.br.y = height; - - writer().writeSetDesktopSize(width, height, layout); - } - - firstUpdate = false; - } - - // A format change prevented us from sending this before the update, - // so make sure to send it now. - if (formatChange && !pendingUpdate) - requestNewUpdate(); - - // Compute new settings based on updated bandwidth values - if (autoSelect) - autoSelectFormatAndEncoding(); - } - - // The rest of the callbacks are fairly self-explanatory... - - public void setColourMapEntries(int firstColour, int nColours, int[] rgbs) { - desktop.setColourMapEntries(firstColour, nColours, rgbs); - } - - public void bell() { - if (viewer.acceptBell.getValue()) - desktop.getToolkit().beep(); - } - - public void serverCutText(String str, int len) { - if (viewer.acceptClipboard.getValue()) - clipboardDialog.serverCutText(str, len); - } - - // We start timing on beginRect and stop timing on endRect, to - // avoid skewing the bandwidth estimation as a result of the server - // being slow or the network having high latency - public void beginRect(Rect r, int encoding) { - ((JavaInStream)getInStream()).startTiming(); - if (encoding != Encodings.encodingCopyRect) { - lastServerEncoding = encoding; - } - } - - public void endRect(Rect r, int encoding) { - ((JavaInStream)getInStream()).stopTiming(); - } - - public void fillRect(Rect r, int p) { - desktop.fillRect(r.tl.x, r.tl.y, r.width(), r.height(), p); - } - public void imageRect(Rect r, int[] p) { - desktop.imageRect(r.tl.x, r.tl.y, r.width(), r.height(), p); - } - public void copyRect(Rect r, int sx, int sy) { - desktop.copyRect(r.tl.x, r.tl.y, r.width(), r.height(), sx, sy); - } - - public void setCursor(int width, int height, Point hotspot, - int[] data, byte[] mask) { - desktop.setCursor(width, height, hotspot, data, mask); - } - - private void resizeFramebuffer() - { - if ((cp.width == 0) && (cp.height == 0)) - return; - if (desktop == null) - return; - if ((desktop.width() == cp.width) && (desktop.height() == cp.height)) - return; - - desktop.resize(); - recreateViewport(); - } - - // recreateViewport() recreates our top-level window. This seems to be - // better than attempting to resize the existing window, at least with - // various X window managers. - - private void recreateViewport() - { - if (viewport != null) viewport.dispose(); - viewport = new ViewportFrame(cp.name(), this); - viewport.setUndecorated(fullScreen); - desktop.setViewport(viewport); - ClassLoader loader = this.getClass().getClassLoader(); - URL url = loader.getResource("com/tigervnc/vncviewer/tigervnc.ico"); - ImageIcon icon = null; - if (url != null) { - icon = new ImageIcon(url); - viewport.setIconImage(icon.getImage()); - } - viewport.addChild(desktop); - reconfigureViewport(); - if ((cp.width > 0) && (cp.height > 0)) - viewport.setVisible(true); - desktop.initGraphics(); - desktop.requestFocusInWindow(); - } - - private void reconfigureViewport() - { - //viewport.setMaxSize(cp.width, cp.height); - boolean pack = true; - Dimension dpySize = viewport.getToolkit().getScreenSize(); - desktop.setScaledSize(); - int w = desktop.scaledWidth; - int h = desktop.scaledHeight; - if (fullScreen) { - viewport.setExtendedState(JFrame.MAXIMIZED_BOTH); - viewport.setGeometry(0, 0, dpySize.width, dpySize.height, false); - } else { - int wmDecorationWidth = viewport.getInsets().left + viewport.getInsets().right; - int wmDecorationHeight = viewport.getInsets().top + viewport.getInsets().bottom; - if (w + wmDecorationWidth >= dpySize.width) { - w = dpySize.width - wmDecorationWidth; - pack = false; - } - if (h + wmDecorationHeight >= dpySize.height) { - h = dpySize.height - wmDecorationHeight; - pack = false; - } - - if (!pack) - viewport.setPreferredSize(new Dimension(w,h)); - - int x = (dpySize.width - w - wmDecorationWidth) / 2; - int y = (dpySize.height - h - wmDecorationHeight)/2; - - viewport.setExtendedState(JFrame.NORMAL); - viewport.setGeometry(x, y, w, h, pack); - } - viewport.update(viewport.g); - } - - // autoSelectFormatAndEncoding() chooses the format and encoding appropriate - // to the connection speed: - // - // First we wait for at least one second of bandwidth measurement. - // - // Above 16Mbps (i.e. LAN), we choose the second highest JPEG quality, - // which should be perceptually lossless. - // - // If the bandwidth is below that, we choose a more lossy JPEG quality. - // - // If the bandwidth drops below 256 Kbps, we switch to palette mode. - // - // Note: The system here is fairly arbitrary and should be replaced - // with something more intelligent at the server end. - // - private void autoSelectFormatAndEncoding() { - long kbitsPerSecond = ((JavaInStream)getInStream()).kbitsPerSecond(); - long timeWaited = ((JavaInStream)getInStream()).timeWaited(); - boolean newFullColour = fullColour; - int newQualityLevel = cp.qualityLevel; - - // Always use Tight - if (currentEncoding != Encodings.encodingTight) { - currentEncoding = Encodings.encodingTight; - encodingChange = true; - } - - // Check that we have a decent bandwidth measurement - if ((kbitsPerSecond == 0) || (timeWaited < 10000)) - return; - - // Select appropriate quality level - if (!cp.noJpeg) { - if (kbitsPerSecond > 16000) - newQualityLevel = 8; - else - newQualityLevel = 6; - - if (newQualityLevel != cp.qualityLevel) { - vlog.info("Throughput "+kbitsPerSecond+ - " kbit/s - changing to quality "+newQualityLevel); - cp.qualityLevel = newQualityLevel; - viewer.qualityLevel.setParam(Integer.toString(newQualityLevel)); - encodingChange = true; - } - } - - if (cp.beforeVersion(3, 8)) { - // Xvnc from TightVNC 1.2.9 sends out FramebufferUpdates with - // cursors "asynchronously". If this happens in the middle of a - // pixel format change, the server will encode the cursor with - // the old format, but the client will try to decode it - // according to the new format. This will lead to a - // crash. Therefore, we do not allow automatic format change for - // old servers. - return; - } - - // Select best color level - newFullColour = (kbitsPerSecond > 256); - if (newFullColour != fullColour) { - vlog.info("Throughput "+kbitsPerSecond+ - " kbit/s - full color is now "+ - (newFullColour ? "enabled" : "disabled")); - fullColour = newFullColour; - formatChange = true; - } - } - - // requestNewUpdate() requests an update from the server, having set the - // format and encoding appropriately. - private void requestNewUpdate() - { - if (formatChange) { - - /* Catch incorrect requestNewUpdate calls */ - assert(pendingUpdate == false); - - if (fullColour) { - desktop.setPF(fullColourPF); - } else { - if (lowColourLevel == 0) { - desktop.setPF(new PixelFormat(8,3,false,true,1,1,1,2,1,0)); - } else if (lowColourLevel == 1) { - desktop.setPF(new PixelFormat(8,6,false,true,3,3,3,4,2,0)); - } else { - desktop.setPF(new PixelFormat(8,8,false,true,7,7,3,0,3,6)); - } - } - String str = desktop.getPF().print(); - vlog.info("Using pixel format "+str); - cp.setPF(desktop.getPF()); - synchronized (this) { - writer().writeSetPixelFormat(cp.pf()); - } - } - checkEncodings(); - synchronized (this) { - writer().writeFramebufferUpdateRequest(new Rect(0,0,cp.width,cp.height), - !formatChange); - } - formatChange = false; - } - - - //////////////////////////////////////////////////////////////////// - // The following methods are all called from the GUI thread - - // close() closes the socket, thus waking up the RFB thread. - public void close() { - try { - shuttingDown = true; - sock.close(); - } catch (java.io.IOException e) { - e.printStackTrace(); - } - } - - // Menu callbacks. These are guaranteed only to be called after serverInit() - // has been called, since the menu is only accessible from the DesktopWindow - - private void initMenu() { - menu = new F8Menu(this); - } - - void showMenu(int x, int y) { - String os = System.getProperty("os.name"); - if (os.startsWith("Windows")) - com.sun.java.swing.plaf.windows.WindowsLookAndFeel.setMnemonicHidden(false); - menu.show(desktop, x, y); - } - - void showAbout() { - InputStream stream = cl.getResourceAsStream("com/tigervnc/vncviewer/timestamp"); - String pkgDate = ""; - String pkgTime = ""; - try { - Manifest manifest = new Manifest(stream); - Attributes attributes = manifest.getMainAttributes(); - pkgDate = attributes.getValue("Package-Date"); - pkgTime = attributes.getValue("Package-Time"); - } catch (IOException e) { } - JOptionPane.showMessageDialog((viewport != null ? viewport : null), - VncViewer.about1+" v"+VncViewer.version+" ("+VncViewer.build+")\n" - +"Built on "+pkgDate+" at "+pkgTime+"\n" - +VncViewer.about2+"\n" - +VncViewer.about3, - "About TigerVNC Viewer for Java", - JOptionPane.INFORMATION_MESSAGE, - logo); - } - - void showInfo() { - JOptionPane.showMessageDialog(viewport, - "Desktop name: "+cp.name()+"\n" - +"Host: "+serverHost+":"+sock.getPort()+"\n" - +"Size: "+cp.width+"x"+cp.height+"\n" - +"Pixel format: "+desktop.getPF().print()+"\n" - +"(server default "+serverPF.print()+")\n" - +"Requested encoding: "+Encodings.encodingName(currentEncoding)+"\n" - +"Last used encoding: "+Encodings.encodingName(lastServerEncoding)+"\n" - +"Line speed estimate: "+((JavaInStream)getInStream()).kbitsPerSecond()+" kbit/s"+"\n" - +"Protocol version: "+cp.majorVersion+"."+cp.minorVersion+"\n" - +"Security method: "+Security.secTypeName(csecurity.getType()) - +" ["+csecurity.description()+"]", - "VNC connection info", - JOptionPane.PLAIN_MESSAGE); - } - - synchronized public void refresh() { - writer().writeFramebufferUpdateRequest(new Rect(0,0,cp.width,cp.height), false); - pendingUpdate = true; - } - - - // OptionsDialogCallback. setOptions() sets the options dialog's checkboxes - // etc to reflect our flags. getOptions() sets our flags according to the - // options dialog's checkboxes. They are both called from the GUI thread. - // Some of the flags are also accessed by the RFB thread. I believe that - // reading and writing boolean and int values in java is atomic, so there is - // no need for synchronization. - - public void setOptions() { - int digit; - options.autoSelect.setSelected(autoSelect); - options.fullColour.setSelected(fullColour); - options.veryLowColour.setSelected(!fullColour && lowColourLevel == 0); - options.lowColour.setSelected(!fullColour && lowColourLevel == 1); - options.mediumColour.setSelected(!fullColour && lowColourLevel == 2); - options.tight.setSelected(currentEncoding == Encodings.encodingTight); - options.zrle.setSelected(currentEncoding == Encodings.encodingZRLE); - options.hextile.setSelected(currentEncoding == Encodings.encodingHextile); - options.raw.setSelected(currentEncoding == Encodings.encodingRaw); - - options.customCompressLevel.setSelected(viewer.customCompressLevel.getValue()); - digit = 0 + viewer.compressLevel.getValue(); - if (digit >= 0 && digit <= 9) { - options.compressLevel.setSelectedItem(digit); - } else { - options.compressLevel.setSelectedItem(Integer.parseInt(viewer.compressLevel.getDefaultStr())); - } - options.noJpeg.setSelected(!viewer.noJpeg.getValue()); - digit = 0 + viewer.qualityLevel.getValue(); - if (digit >= 0 && digit <= 9) { - options.qualityLevel.setSelectedItem(digit); - } else { - options.qualityLevel.setSelectedItem(Integer.parseInt(viewer.qualityLevel.getDefaultStr())); - } - - options.viewOnly.setSelected(viewer.viewOnly.getValue()); - options.acceptClipboard.setSelected(viewer.acceptClipboard.getValue()); - options.sendClipboard.setSelected(viewer.sendClipboard.getValue()); - options.menuKey.setSelectedIndex(menuKey-0xFFBE); - - if (state() == RFBSTATE_NORMAL) { - options.shared.setEnabled(false); - options.secVeNCrypt.setEnabled(false); - options.encNone.setEnabled(false); - options.encTLS.setEnabled(false); - options.encX509.setEnabled(false); - options.ca.setEnabled(false); - options.crl.setEnabled(false); - options.secIdent.setEnabled(false); - options.secNone.setEnabled(false); - options.secVnc.setEnabled(false); - options.secPlain.setEnabled(false); - options.sendLocalUsername.setEnabled(false); - } else { - options.shared.setSelected(shared); - - /* Process non-VeNCrypt sectypes */ - java.util.List<Integer> secTypes = new ArrayList<Integer>(); - secTypes = security.GetEnabledSecTypes(); - for (Iterator i = secTypes.iterator(); i.hasNext();) { - switch ((Integer)i.next()) { - case Security.secTypeVeNCrypt: - options.secVeNCrypt.setSelected(true); - break; - case Security.secTypeNone: - options.encNone.setSelected(true); - options.secNone.setSelected(true); - break; - case Security.secTypeVncAuth: - options.encNone.setSelected(true); - options.secVnc.setSelected(true); - break; - } - } - - /* Process VeNCrypt subtypes */ - if (options.secVeNCrypt.isSelected()) { - java.util.List<Integer> secTypesExt = new ArrayList<Integer>(); - secTypesExt = security.GetEnabledExtSecTypes(); - for (Iterator iext = secTypesExt.iterator(); iext.hasNext();) { - switch ((Integer)iext.next()) { - case Security.secTypePlain: - options.secPlain.setSelected(true); - options.sendLocalUsername.setSelected(true); - break; - case Security.secTypeIdent: - options.secIdent.setSelected(true); - options.sendLocalUsername.setSelected(true); - break; - case Security.secTypeTLSNone: - options.encTLS.setSelected(true); - options.secNone.setSelected(true); - break; - case Security.secTypeTLSVnc: - options.encTLS.setSelected(true); - options.secVnc.setSelected(true); - break; - case Security.secTypeTLSPlain: - options.encTLS.setSelected(true); - options.secPlain.setSelected(true); - options.sendLocalUsername.setSelected(true); - break; - case Security.secTypeTLSIdent: - options.encTLS.setSelected(true); - options.secIdent.setSelected(true); - options.sendLocalUsername.setSelected(true); - break; - case Security.secTypeX509None: - options.encX509.setSelected(true); - options.secNone.setSelected(true); - break; - case Security.secTypeX509Vnc: - options.encX509.setSelected(true); - options.secVnc.setSelected(true); - break; - case Security.secTypeX509Plain: - options.encX509.setSelected(true); - options.secPlain.setSelected(true); - options.sendLocalUsername.setSelected(true); - break; - case Security.secTypeX509Ident: - options.encX509.setSelected(true); - options.secIdent.setSelected(true); - options.sendLocalUsername.setSelected(true); - break; - } - } - } - options.sendLocalUsername.setEnabled(options.secPlain.isSelected()|| - options.secIdent.isSelected()); - } - - options.fullScreen.setSelected(fullScreen); - options.useLocalCursor.setSelected(viewer.useLocalCursor.getValue()); - options.fastCopyRect.setSelected(viewer.fastCopyRect.getValue()); - options.acceptBell.setSelected(viewer.acceptBell.getValue()); - options.autoScale = false; - options.fixedRatioScale = false; - String scaleString = viewer.scalingFactor.getValue(); - if (scaleString.equals("Auto")) { - options.autoScale = true; - options.scalingFactor.setSelectedItem("Auto"); - // FIXME: set scaleFactor? - } else if(scaleString.equals("FixedRatio")) { - options.fixedRatioScale = true; - options.scalingFactor.setSelectedItem("Fixed Aspect Ratio"); - // FIXME: set scaleFactor? - } else { - digit = Integer.parseInt(scaleString); - if (digit >= 1 && digit <= 1000) { - options.scalingFactor.setSelectedItem(digit+"%"); - } else { - options.scalingFactor.setSelectedItem(Integer.parseInt(viewer.scalingFactor.getDefaultStr())+"%"); - } - scaleFactor = - Integer.parseInt(scaleString.substring(0, scaleString.length())); - if (desktop != null) - desktop.setScaledSize(); - } - } - - public void getOptions() { - autoSelect = options.autoSelect.isSelected(); - if (fullColour != options.fullColour.isSelected()) - formatChange = true; - fullColour = options.fullColour.isSelected(); - if (!fullColour) { - int newLowColourLevel = (options.veryLowColour.isSelected() ? 0 : - options.lowColour.isSelected() ? 1 : 2); - if (newLowColourLevel != lowColourLevel) { - lowColourLevel = newLowColourLevel; - formatChange = true; - } - } - int newEncoding = (options.zrle.isSelected() ? Encodings.encodingZRLE : - options.hextile.isSelected() ? Encodings.encodingHextile : - options.tight.isSelected() ? Encodings.encodingTight : - Encodings.encodingRaw); - if (newEncoding != currentEncoding) { - currentEncoding = newEncoding; - encodingChange = true; - } - - viewer.customCompressLevel.setParam(options.customCompressLevel.isSelected()); - if (cp.customCompressLevel != viewer.customCompressLevel.getValue()) { - cp.customCompressLevel = viewer.customCompressLevel.getValue(); - encodingChange = true; - } - if (Integer.parseInt(options.compressLevel.getSelectedItem().toString()) >= 0 && - Integer.parseInt(options.compressLevel.getSelectedItem().toString()) <= 9) { - viewer.compressLevel.setParam(options.compressLevel.getSelectedItem().toString()); - } else { - viewer.compressLevel.setParam(viewer.compressLevel.getDefaultStr()); - } - if (cp.compressLevel != viewer.compressLevel.getValue()) { - cp.compressLevel = viewer.compressLevel.getValue(); - encodingChange = true; - } - viewer.noJpeg.setParam(!options.noJpeg.isSelected()); - if (cp.noJpeg != viewer.noJpeg.getValue()) { - cp.noJpeg = viewer.noJpeg.getValue(); - encodingChange = true; - } - viewer.qualityLevel.setParam(options.qualityLevel.getSelectedItem().toString()); - if (cp.qualityLevel != viewer.qualityLevel.getValue()) { - cp.qualityLevel = viewer.qualityLevel.getValue(); - encodingChange = true; - } - viewer.sendLocalUsername.setParam(options.sendLocalUsername.isSelected()); - - viewer.viewOnly.setParam(options.viewOnly.isSelected()); - viewer.acceptClipboard.setParam(options.acceptClipboard.isSelected()); - viewer.sendClipboard.setParam(options.sendClipboard.isSelected()); - viewer.fastCopyRect.setParam(options.fastCopyRect.isSelected()); - viewer.acceptBell.setParam(options.acceptBell.isSelected()); - if (options.autoScale) { - viewer.scalingFactor.setParam("Auto"); - scaleFactor = -1; - if (desktop != null) { - reconfigureViewport(); - viewport.update(viewport.g); - } - } else if(options.fixedRatioScale) { - viewer.scalingFactor.setParam("FixedRatio"); - scaleFactor = -1; - if (desktop != null) { - reconfigureViewport(); - viewport.update(viewport.g); - } - } else { - String scaleString = - options.scalingFactor.getSelectedItem().toString(); - viewer.scalingFactor.setParam(scaleString.substring(0, scaleString.length()-1)); - int oldScaleFactor = scaleFactor; - scaleFactor = - Integer.parseInt(scaleString.substring(0, scaleString.length()-1)); - if (oldScaleFactor != scaleFactor && desktop != null) { - reconfigureViewport(); - viewport.update(viewport.g); - } - } - - clipboardDialog.setSendingEnabled(viewer.sendClipboard.getValue()); - menuKey = (options.menuKey.getSelectedIndex()+0xFFBE); - F8Menu.f8.setText("Send F"+(menuKey-Keysyms.F1+1)); - - shared = options.shared.isSelected(); - setShared(shared); - viewer.useLocalCursor.setParam(options.useLocalCursor.isSelected()); - if (cp.supportsLocalCursor != viewer.useLocalCursor.getValue()) { - cp.supportsLocalCursor = viewer.useLocalCursor.getValue(); - encodingChange = true; - if (desktop != null) - desktop.resetLocalCursor(); - } - - checkEncodings(); - - if (state() != RFBSTATE_NORMAL) { - /* Process security types which don't use encryption */ - if (options.encNone.isSelected()) { - if (options.secNone.isSelected()) - Security.EnableSecType(Security.secTypeNone); - if (options.secVnc.isSelected()) - Security.EnableSecType(Security.secTypeVncAuth); - if (options.secPlain.isSelected()) - Security.EnableSecType(Security.secTypePlain); - if (options.secIdent.isSelected()) - Security.EnableSecType(Security.secTypeIdent); - } else { - Security.DisableSecType(Security.secTypeNone); - Security.DisableSecType(Security.secTypeVncAuth); - Security.DisableSecType(Security.secTypePlain); - Security.DisableSecType(Security.secTypeIdent); - } - - /* Process security types which use TLS encryption */ - if (options.encTLS.isSelected()) { - if (options.secNone.isSelected()) - Security.EnableSecType(Security.secTypeTLSNone); - if (options.secVnc.isSelected()) - Security.EnableSecType(Security.secTypeTLSVnc); - if (options.secPlain.isSelected()) - Security.EnableSecType(Security.secTypeTLSPlain); - if (options.secIdent.isSelected()) - Security.EnableSecType(Security.secTypeTLSIdent); - } else { - Security.DisableSecType(Security.secTypeTLSNone); - Security.DisableSecType(Security.secTypeTLSVnc); - Security.DisableSecType(Security.secTypeTLSPlain); - Security.DisableSecType(Security.secTypeTLSIdent); - } - - /* Process security types which use X509 encryption */ - if (options.encX509.isSelected()) { - if (options.secNone.isSelected()) - Security.EnableSecType(Security.secTypeX509None); - if (options.secVnc.isSelected()) - Security.EnableSecType(Security.secTypeX509Vnc); - if (options.secPlain.isSelected()) - Security.EnableSecType(Security.secTypeX509Plain); - if (options.secIdent.isSelected()) - Security.EnableSecType(Security.secTypeX509Ident); - } else { - Security.DisableSecType(Security.secTypeX509None); - Security.DisableSecType(Security.secTypeX509Vnc); - Security.DisableSecType(Security.secTypeX509Plain); - Security.DisableSecType(Security.secTypeX509Ident); - } - - /* Process *None security types */ - if (options.secNone.isSelected()) { - if (options.encNone.isSelected()) - Security.EnableSecType(Security.secTypeNone); - if (options.encTLS.isSelected()) - Security.EnableSecType(Security.secTypeTLSNone); - if (options.encX509.isSelected()) - Security.EnableSecType(Security.secTypeX509None); - } else { - Security.DisableSecType(Security.secTypeNone); - Security.DisableSecType(Security.secTypeTLSNone); - Security.DisableSecType(Security.secTypeX509None); - } - - /* Process *Vnc security types */ - if (options.secVnc.isSelected()) { - if (options.encNone.isSelected()) - Security.EnableSecType(Security.secTypeVncAuth); - if (options.encTLS.isSelected()) - Security.EnableSecType(Security.secTypeTLSVnc); - if (options.encX509.isSelected()) - Security.EnableSecType(Security.secTypeX509Vnc); - } else { - Security.DisableSecType(Security.secTypeVncAuth); - Security.DisableSecType(Security.secTypeTLSVnc); - Security.DisableSecType(Security.secTypeX509Vnc); - } - - /* Process *Plain security types */ - if (options.secPlain.isSelected()) { - if (options.encNone.isSelected()) - Security.EnableSecType(Security.secTypePlain); - if (options.encTLS.isSelected()) - Security.EnableSecType(Security.secTypeTLSPlain); - if (options.encX509.isSelected()) - Security.EnableSecType(Security.secTypeX509Plain); - } else { - Security.DisableSecType(Security.secTypePlain); - Security.DisableSecType(Security.secTypeTLSPlain); - Security.DisableSecType(Security.secTypeX509Plain); - } - - /* Process *Ident security types */ - if (options.secIdent.isSelected()) { - if (options.encNone.isSelected()) - Security.EnableSecType(Security.secTypeIdent); - if (options.encTLS.isSelected()) - Security.EnableSecType(Security.secTypeTLSIdent); - if (options.encX509.isSelected()) - Security.EnableSecType(Security.secTypeX509Ident); - } else { - Security.DisableSecType(Security.secTypeIdent); - Security.DisableSecType(Security.secTypeTLSIdent); - Security.DisableSecType(Security.secTypeX509Ident); - } - - CSecurityTLS.x509ca.setParam(options.ca.getText()); - CSecurityTLS.x509crl.setParam(options.crl.getText()); - } - } - - public void toggleFullScreen() { - fullScreen = !fullScreen; - if (!fullScreen) menu.fullScreen.setSelected(false); - recreateViewport(); - } - - // writeClientCutText() is called from the clipboard dialog - synchronized public void writeClientCutText(String str, int len) { - if (state() != RFBSTATE_NORMAL) return; - writer().writeClientCutText(str,len); - } - - synchronized public void writeKeyEvent(int keysym, boolean down) { - if (state() != RFBSTATE_NORMAL) return; - writer().writeKeyEvent(keysym, down); - } - - synchronized public void writeKeyEvent(KeyEvent ev) { - if (ev.getID() != KeyEvent.KEY_PRESSED && !ev.isActionKey()) - return; - - int keysym; - - if (!ev.isActionKey()) { - vlog.debug("key press "+ev.getKeyChar()); - if (ev.getKeyChar() < 32) { - // if the ctrl modifier key is down, send the equivalent ASCII since we - // will send the ctrl modifier anyway - - if ((ev.getModifiers() & KeyEvent.CTRL_MASK) != 0) { - if ((ev.getModifiers() & KeyEvent.SHIFT_MASK) != 0) { - keysym = ev.getKeyChar() + 64; - if (keysym == -1) - return; - } else { - keysym = ev.getKeyChar() + 96; - if (keysym == 127) keysym = 95; - } - } else { - switch (ev.getKeyCode()) { - case KeyEvent.VK_BACK_SPACE: keysym = Keysyms.BackSpace; break; - case KeyEvent.VK_TAB: keysym = Keysyms.Tab; break; - case KeyEvent.VK_ENTER: keysym = Keysyms.Return; break; - case KeyEvent.VK_ESCAPE: keysym = Keysyms.Escape; break; - default: return; - } - } - - } else if (ev.getKeyChar() == 127) { - keysym = Keysyms.Delete; - - } else { - keysym = UnicodeToKeysym.translate(ev.getKeyChar()); - if (keysym == -1) - return; - } - - } else { - // KEY_ACTION - vlog.debug("key action "+ev.getKeyCode()); - switch (ev.getKeyCode()) { - case KeyEvent.VK_HOME: keysym = Keysyms.Home; break; - case KeyEvent.VK_END: keysym = Keysyms.End; break; - case KeyEvent.VK_PAGE_UP: keysym = Keysyms.Page_Up; break; - case KeyEvent.VK_PAGE_DOWN: keysym = Keysyms.Page_Down; break; - case KeyEvent.VK_UP: keysym = Keysyms.Up; break; - case KeyEvent.VK_DOWN: keysym = Keysyms.Down; break; - case KeyEvent.VK_LEFT: keysym = Keysyms.Left; break; - case KeyEvent.VK_RIGHT: keysym = Keysyms.Right; break; - case KeyEvent.VK_F1: keysym = Keysyms.F1; break; - case KeyEvent.VK_F2: keysym = Keysyms.F2; break; - case KeyEvent.VK_F3: keysym = Keysyms.F3; break; - case KeyEvent.VK_F4: keysym = Keysyms.F4; break; - case KeyEvent.VK_F5: keysym = Keysyms.F5; break; - case KeyEvent.VK_F6: keysym = Keysyms.F6; break; - case KeyEvent.VK_F7: keysym = Keysyms.F7; break; - case KeyEvent.VK_F8: keysym = Keysyms.F8; break; - case KeyEvent.VK_F9: keysym = Keysyms.F9; break; - case KeyEvent.VK_F10: keysym = Keysyms.F10; break; - case KeyEvent.VK_F11: keysym = Keysyms.F11; break; - case KeyEvent.VK_F12: keysym = Keysyms.F12; break; - case KeyEvent.VK_PRINTSCREEN: keysym = Keysyms.Print; break; - case KeyEvent.VK_PAUSE: keysym = Keysyms.Pause; break; - case KeyEvent.VK_INSERT: keysym = Keysyms.Insert; break; - default: return; - } - } - - writeModifiers(ev.getModifiers()); - writeKeyEvent(keysym, true); - writeKeyEvent(keysym, false); - writeModifiers(0); - } - - - synchronized public void writePointerEvent(MouseEvent ev) { - if (state() != RFBSTATE_NORMAL) return; - int x, y; - - switch (ev.getID()) { - case MouseEvent.MOUSE_PRESSED: - buttonMask = 1; - if ((ev.getModifiers() & KeyEvent.ALT_MASK) != 0) buttonMask = 2; - if ((ev.getModifiers() & KeyEvent.META_MASK) != 0) buttonMask = 4; - break; - case MouseEvent.MOUSE_RELEASED: - buttonMask = 0; - break; - } - - writeModifiers(ev.getModifiers() & ~KeyEvent.ALT_MASK & ~KeyEvent.META_MASK); - - if (cp.width != desktop.scaledWidth || - cp.height != desktop.scaledHeight) { - int sx = (desktop.scaleWidthRatio == 1.00) - ? ev.getX() : (int)Math.floor(ev.getX()/desktop.scaleWidthRatio); - int sy = (desktop.scaleHeightRatio == 1.00) - ? ev.getY() : (int)Math.floor(ev.getY()/desktop.scaleHeightRatio); - ev.translatePoint(sx - ev.getX(), sy - ev.getY()); - writer().writePointerEvent(new Point(ev.getX(),ev.getY()), buttonMask); - } else { - writer().writePointerEvent(new Point(ev.getX(),ev.getY()), buttonMask); - } - - if (buttonMask == 0) writeModifiers(0); - } - - - synchronized public void writeWheelEvent(MouseWheelEvent ev) { - if (state() != RFBSTATE_NORMAL) return; - int x, y; - int clicks = ev.getWheelRotation(); - if (clicks < 0) { - buttonMask = 8; - } else { - buttonMask = 16; - } - writeModifiers(ev.getModifiers() & ~KeyEvent.ALT_MASK & ~KeyEvent.META_MASK); - for (int i=0;i<Math.abs(clicks);i++) { - x = ev.getX(); - y = ev.getY(); - writer().writePointerEvent(new Point(x, y), buttonMask); - buttonMask = 0; - writer().writePointerEvent(new Point(x, y), buttonMask); - } - writeModifiers(0); - - } - - - void writeModifiers(int m) { - if ((m & Event.SHIFT_MASK) != (pressedModifiers & Event.SHIFT_MASK)) - writeKeyEvent(Keysyms.Shift_L, (m & Event.SHIFT_MASK) != 0); - if ((m & Event.CTRL_MASK) != (pressedModifiers & Event.CTRL_MASK)) - writeKeyEvent(Keysyms.Control_L, (m & Event.CTRL_MASK) != 0); - if ((m & Event.ALT_MASK) != (pressedModifiers & Event.ALT_MASK)) - writeKeyEvent(Keysyms.Alt_L, (m & Event.ALT_MASK) != 0); - if ((m & Event.META_MASK) != (pressedModifiers & Event.META_MASK)) - writeKeyEvent(Keysyms.Meta_L, (m & Event.META_MASK) != 0); - pressedModifiers = m; - } - - - //////////////////////////////////////////////////////////////////// - // The following methods are called from both RFB and GUI threads - - // checkEncodings() sends a setEncodings message if one is needed. - synchronized private void checkEncodings() { - if (encodingChange && state() == RFBSTATE_NORMAL) { - vlog.info("Using "+Encodings.encodingName(currentEncoding)+" encoding"); - writer().writeSetEncodings(currentEncoding, true); - encodingChange = false; - } - } - - // the following never change so need no synchronization: - JavaInStream jis; - JavaOutStream jos; - - - // viewer object is only ever accessed by the GUI thread so needs no - // synchronization (except for one test in DesktopWindow - see comment - // there). - VncViewer viewer; - - // access to desktop by different threads is specified in DesktopWindow - - // the following need no synchronization: - - ClassLoader cl = this.getClass().getClassLoader(); - ImageIcon logo = new ImageIcon(cl.getResource("com/tigervnc/vncviewer/tigervnc.png")); - public static UserPasswdGetter upg; - public UserMsgBox msg; - - // shuttingDown is set by the GUI thread and only ever tested by the RFB - // thread after the window has been destroyed. - boolean shuttingDown; - - // reading and writing int and boolean is atomic in java, so no - // synchronization of the following flags is needed: - int currentEncoding, lastServerEncoding; - - int lowColourLevel; - - - // All menu, options, about and info stuff is done in the GUI thread (apart - // from when constructed). - F8Menu menu; - OptionsDialog options; - - // clipboard sync issues? - ClipboardDialog clipboardDialog; - - // the following are only ever accessed by the GUI thread: - int buttonMask; - int pressedModifiers; - - public String serverHost; - public int serverPort; - public int menuKey; - PixelFormat serverPF; - ViewportFrame viewport; - DesktopWindow desktop; - PixelFormat fullColourPF; - boolean fullColour; - boolean autoSelect; - boolean shared; - boolean formatChange; - boolean encodingChange; - boolean sameMachine; - boolean fullScreen; - boolean reverseConnection; - boolean firstUpdate; - boolean pendingUpdate; - - int scaleFactor = 100; - - static LogWriter vlog = new LogWriter("CConn"); -} diff --git a/java/src/com/tigervnc/vncviewer/ClipboardDialog.java b/java/src/com/tigervnc/vncviewer/ClipboardDialog.java deleted file mode 100644 index dca85f25..00000000 --- a/java/src/com/tigervnc/vncviewer/ClipboardDialog.java +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -import java.awt.*; -import java.awt.event.*; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import javax.swing.*; -import com.tigervnc.rfb.LogWriter; - -class ClipboardDialog extends Dialog implements ActionListener { - - public ClipboardDialog(CConn cc_) { - super(false); - cc = cc_; - setTitle("VNC clipboard"); - textArea = new JTextArea(5,50); - getContentPane().add("Center", textArea); - - JPanel pb = new JPanel(); - clearButton = new JButton("Clear"); - pb.add(clearButton); - clearButton.addActionListener(this); - sendButton = new JButton("Send to VNC server"); - pb.add(sendButton); - sendButton.addActionListener(this); - cancelButton = new JButton("Cancel"); - pb.add(cancelButton); - cancelButton.addActionListener(this); - getContentPane().add("South", pb); - - pack(); - } - - public void initDialog() { - textArea.setText(current); - textArea.selectAll(); - } - - public void setContents(String str) { - current = str; - textArea.setText(str); - textArea.selectAll(); - } - - public void serverCutText(String str, int len) { - setContents(str); - SecurityManager sm = System.getSecurityManager(); - try { - if (sm != null) sm.checkSystemClipboardAccess(); - Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (cb != null) { - StringSelection ss = new StringSelection(str); - try { - cb.setContents(ss, ss); - } catch(Exception e) { - vlog.debug(e.toString()); - } - } - } catch(SecurityException e) { - System.err.println("Cannot access the system clipboard"); - } - } - - public void setSendingEnabled(boolean b) { - sendButton.setEnabled(b); - } - - public void actionPerformed(ActionEvent e) { - Object s = e.getSource(); - if (s instanceof JButton && (JButton)s == clearButton) { - current = ""; - textArea.setText(current); - } else if (s instanceof JButton && (JButton)s == sendButton) { - ok = true; - current = textArea.getText(); - cc.writeClientCutText(current, current.length()); - endDialog(); - } else if (s instanceof JButton && (JButton)s == cancelButton) { - ok = false; - endDialog(); - } - } - - CConn cc; - String current; - JTextArea textArea; - JButton clearButton, sendButton, cancelButton; - static LogWriter vlog = new LogWriter("ClipboardDialog"); -} diff --git a/java/src/com/tigervnc/vncviewer/DesktopWindow.java b/java/src/com/tigervnc/vncviewer/DesktopWindow.java deleted file mode 100644 index f5acfff1..00000000 --- a/java/src/com/tigervnc/vncviewer/DesktopWindow.java +++ /dev/null @@ -1,553 +0,0 @@ -/* Copyright (C) 2010 D. R. Commander. All Rights Reserved. - * Copyright (C) 2009 Paul Donohue. All Rights Reserved. - * Copyright (C) 2006 Constantin Kaplinsky. All Rights Reserved. - * Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// DesktopWindow is an AWT Canvas representing a VNC desktop. -// -// Methods on DesktopWindow are called from both the GUI thread and the thread -// which processes incoming RFB messages ("the RFB thread"). This means we -// need to be careful with synchronization here. -// - -package com.tigervnc.vncviewer; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.*; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.Clipboard; -import javax.swing.*; - -import com.tigervnc.rfb.*; -import com.tigervnc.rfb.Cursor; -import com.tigervnc.rfb.Exception; -import com.tigervnc.rfb.Point; - -class DesktopWindow extends JPanel implements - Runnable, - MouseListener, - MouseMotionListener, - MouseWheelListener, - KeyListener -{ - - //////////////////////////////////////////////////////////////////// - // The following methods are all called from the RFB thread - - public DesktopWindow(int width, int height, PixelFormat serverPF, CConn cc_) { - cc = cc_; - setSize(width, height); - im = new PixelBufferImage(width, height, cc, this); - - cursor = new Cursor(); - cursorBacking = new ManagedPixelBuffer(); - addMouseListener(this); - addMouseWheelListener(this); - addMouseMotionListener(this); - addKeyListener(this); - addFocusListener(new FocusAdapter() { - public void focusGained(FocusEvent e) { - checkClipboard(); - } - }); - setFocusTraversalKeysEnabled(false); - setFocusable(true); - setDoubleBuffered(true); - } - - public int width() { - return getWidth(); - } - - public int height() { - return getHeight(); - } - - // initGraphics() is needed because for some reason you can't call - // getGraphics() on a newly-created awt Component. It is called when the - // DesktopWindow has actually been made visible so that getGraphics() ought - // to work. - - public void initGraphics() { - cc.viewport.g = cc.viewport.getGraphics(); - graphics = getComponentGraphics(cc.viewport.g); - prepareImage(im.image, scaledWidth, scaledHeight, this); - } - - final public PixelFormat getPF() { return im.getPF(); } - - synchronized public void setPF(PixelFormat pf) { - im.setPF(pf); - } - - public void setViewport(ViewportFrame viewport) - { - viewport.setChild(this); - } - - // Methods called from the RFB thread - these need to be synchronized - // wherever they access data shared with the GUI thread. - - public void setCursor(int w, int h, Point hotspot, - int[] data, byte[] mask) { - // strictly we should use a mutex around this test since useLocalCursor - // might be being altered by the GUI thread. However it's only a single - // boolean and it doesn't matter if we get the wrong value anyway. - - synchronized(this) { - if (!cc.viewer.useLocalCursor.getValue()) return; - - hideLocalCursor(); - - cursor.hotspot = hotspot; - - Dimension bsc = tk.getBestCursorSize(w, h); - - cursor.setSize(((int)bsc.getWidth() > w ? (int)bsc.getWidth() : w), - ((int)bsc.getHeight() > h ? (int)bsc.getHeight() : h)); - cursor.setPF(getPF()); - - cursorBacking.setSize(cursor.width(), cursor.height()); - cursorBacking.setPF(getPF()); - - cursor.data = new int[cursor.width() * cursor.height()]; - cursor.mask = new byte[cursor.maskLen()]; - - // set the masked pixels of the cursor transparent by using an extra bit in - // the colormap. We'll OR this into the data based on the values in the mask. - if (cursor.getPF().bpp == 8) { - cursor.cm = new DirectColorModel(9, 7, (7 << 3), (3 << 6), (1 << 8)); - } - - int maskBytesPerRow = (w + 7) / 8; - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - int byte_ = y * maskBytesPerRow + x / 8; - int bit = 7 - x % 8; - if ((mask[byte_] & (1 << bit)) > 0) { - cursor.data[y * cursor.width() + x] = (cursor.getPF().bpp == 8) ? - data[y * w + x] | (1 << 8) : data[y * w + x]; - } - } - System.arraycopy(mask, y * maskBytesPerRow, cursor.mask, - y * ((cursor.width() + 7) / 8), maskBytesPerRow); - } - - MemoryImageSource bitmap = - new MemoryImageSource(cursor.width(), cursor.height(), cursor.cm, - cursor.data, 0, cursor.width()); - int cw = (int)Math.floor((float)cursor.width() * scaleWidthRatio); - int ch = (int)Math.floor((float)cursor.height() * scaleHeightRatio); - int hint = java.awt.Image.SCALE_DEFAULT; - hotspot = new Point((int)Math.floor((float)hotspot.x * scaleWidthRatio), - (int)Math.floor((float)hotspot.y * scaleHeightRatio)); - Image cursorImage = (cw <= 0 || ch <= 0) ? tk.createImage(bitmap) : - tk.createImage(bitmap).getScaledInstance(cw,ch,hint); - softCursor = tk.createCustomCursor(cursorImage, - new java.awt.Point(hotspot.x,hotspot.y), "Cursor"); - } - - if (softCursor != null) { - setCursor(softCursor); - cursorAvailable = true; - return; - } - - if (!cursorAvailable) { - cursorAvailable = true; - } - - showLocalCursor(); - return; - } - - // setColourMapEntries() changes some of the entries in the colourmap. - // Unfortunately these messages are often sent one at a time, so we delay the - // settings taking effect unless the whole colourmap has changed. This is - // because getting java to recalculate its internal translation table and - // redraw the screen is expensive. - - synchronized public void setColourMapEntries(int firstColour, int nColours, - int[] rgbs) { - im.setColourMapEntries(firstColour, nColours, rgbs); - if (nColours <= 256) { - im.updateColourMap(); - im.put(0, 0, im.width(), im.height(), graphics); - } else { - if (setColourMapEntriesTimerThread == null) { - setColourMapEntriesTimerThread = new Thread(this); - setColourMapEntriesTimerThread.start(); - } - } - } - -// Update the actual window with the changed parts of the framebuffer. - - public void framebufferUpdateEnd() - { - drawInvalidRect(); - } - - // resize() is called when the desktop has changed size - synchronized public void resize() { - int w = cc.cp.width; - int h = cc.cp.height; - hideLocalCursor(); - setSize(w, h); - im.resize(w, h); - } - - final void drawInvalidRect() { - if (!invalidRect) return; - int x = invalidLeft; - int w = invalidRight - x; - int y = invalidTop; - int h = invalidBottom - y; - invalidRect = false; - - synchronized (this) { - im.put(x, y, w, h, graphics); - } - } - - final void invalidate(int x, int y, int w, int h) { - if (invalidRect) { - if (x < invalidLeft) invalidLeft = x; - if (x + w > invalidRight) invalidRight = x + w; - if (y < invalidTop) invalidTop = y; - if (y + h > invalidBottom) invalidBottom = y + h; - } else { - invalidLeft = x; - invalidRight = x + w; - invalidTop = y; - invalidBottom = y + h; - invalidRect = true; - } - - if ((invalidRight - invalidLeft) * (invalidBottom - invalidTop) > 100000) - drawInvalidRect(); - } - - public void beginRect(int x, int y, int w, int h, int encoding) { - invalidRect = false; - } - - public void endRect(int x, int y, int w, int h, int encoding) { - drawInvalidRect(); - } - - synchronized final public void fillRect(int x, int y, int w, int h, int pix) - { - if (overlapsCursor(x, y, w, h)) hideLocalCursor(); - im.fillRect(x, y, w, h, pix); - invalidate(x, y, w, h); - if (softCursor == null) - showLocalCursor(); - } - - synchronized final public void imageRect(int x, int y, int w, int h, - int[] pix) { - if (overlapsCursor(x, y, w, h)) hideLocalCursor(); - im.imageRect(x, y, w, h, pix); - invalidate(x, y, w, h); - if (softCursor == null) - showLocalCursor(); - } - - synchronized final public void copyRect(int x, int y, int w, int h, - int srcX, int srcY) { - if (overlapsCursor(x, y, w, h) || overlapsCursor(srcX, srcY, w, h)) - hideLocalCursor(); - im.copyRect(x, y, w, h, srcX, srcY); - if (!cc.viewer.fastCopyRect.getValue()) { - invalidate(x, y, w, h); - } - } - - - // mutex MUST be held when overlapsCursor() is called - final boolean overlapsCursor(int x, int y, int w, int h) { - return (x < cursorBackingX + cursorBacking.width() && - y < cursorBackingY + cursorBacking.height() && - x+w > cursorBackingX && y+h > cursorBackingY); - } - - - //////////////////////////////////////////////////////////////////// - // The following methods are all called from the GUI thread - - synchronized void resetLocalCursor() { - hideLocalCursor(); - cursorAvailable = false; - } - - // - // Callback methods to determine geometry of our Component. - // - - public Dimension getPreferredSize() { - return new Dimension(scaledWidth, scaledHeight); - } - - public Dimension getMinimumSize() { - return new Dimension(scaledWidth, scaledHeight); - } - - public Dimension getMaximumSize() { - return new Dimension(scaledWidth, scaledHeight); - } - - public void setScaledSize() { - if (!cc.options.autoScale && !cc.options.fixedRatioScale) { - scaledWidth = (int)Math.floor((float)cc.cp.width * (float)cc.scaleFactor/100.0); - scaledHeight = (int)Math.floor((float)cc.cp.height * (float)cc.scaleFactor/100.0); - } else { - if (cc.viewport == null) { - scaledWidth = cc.cp.width; - scaledHeight = cc.cp.height; - } else { - Dimension vpSize = cc.viewport.getSize(); - Insets vpInsets = cc.viewport.getInsets(); - Dimension availableSize = - new Dimension(vpSize.width - vpInsets.left - vpInsets.right, - vpSize.height - vpInsets.top - vpInsets.bottom); - if (availableSize.width == 0 || availableSize.height == 0) - availableSize = new Dimension(cc.cp.width, cc.cp.height); - if (cc.options.fixedRatioScale) { - float widthRatio = (float)availableSize.width / (float)cc.cp.width; - float heightRatio = (float)availableSize.height / (float)cc.cp.height; - float ratio = Math.min(widthRatio, heightRatio); - scaledWidth = (int)Math.floor(cc.cp.width * ratio); - scaledHeight = (int)Math.floor(cc.cp.height * ratio); - } else { - scaledWidth = availableSize.width; - scaledHeight = availableSize.height; - } - } - } - scaleWidthRatio = (float)scaledWidth / (float)cc.cp.width; - scaleHeightRatio = (float)scaledHeight / (float)cc.cp.height; - } - - synchronized public void paintComponent(Graphics g) { - Graphics2D g2 = (Graphics2D) g; - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, - RenderingHints.VALUE_RENDER_QUALITY); - if (cc.cp.width == scaledWidth && cc.cp.height == scaledHeight) { - g2.drawImage(im.image, 0, 0, null); - } else { - g2.drawImage(im.image, 0, 0, scaledWidth, scaledHeight, null); - } - } - - String oldContents = ""; - - synchronized public void checkClipboard() { - SecurityManager sm = System.getSecurityManager(); - try { - if (sm != null) sm.checkSystemClipboardAccess(); - Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); - if (cb != null && cc.viewer.sendClipboard.getValue()) { - Transferable t = cb.getContents(null); - if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) { - try { - String newContents = (String)t.getTransferData(DataFlavor.stringFlavor); - if (newContents != null && !newContents.equals(oldContents)) { - cc.writeClientCutText(newContents, newContents.length()); - oldContents = newContents; - cc.clipboardDialog.setContents(newContents); - } - } catch (java.lang.Exception e) { - System.out.println("Exception getting clipboard data: " + e.getMessage()); - } - } - } - } catch(SecurityException e) { - System.err.println("Cannot access the system clipboard"); - } - } - - /** Mouse-Motion callback function */ - private void mouseMotionCB(MouseEvent e) { - if (!cc.viewer.viewOnly.getValue()) - cc.writePointerEvent(e); - // - If local cursor rendering is enabled then use it - synchronized(this) { - if (cursorAvailable) { - // - Render the cursor! - if (e.getX() != cursorPosX || e.getY() != cursorPosY) { - hideLocalCursor(); - if (e.getX() >= 0 && e.getX() < im.width() && - e.getY() >= 0 && e.getY() < im.height()) { - cursorPosX = e.getX(); - cursorPosY = e.getY(); - if (softCursor == null) - showLocalCursor(); - } - } - } - } - lastX = e.getX(); - lastY = e.getY(); - } - public void mouseDragged(MouseEvent e) { mouseMotionCB(e);} - public void mouseMoved(MouseEvent e) { mouseMotionCB(e);} - - /** Mouse callback function */ - private void mouseCB(MouseEvent e) { - if (!cc.viewer.viewOnly.getValue()) - cc.writePointerEvent(e); - lastX = e.getX(); - lastY = e.getY(); - } - public void mouseReleased(MouseEvent e){ mouseCB(e);} - public void mousePressed(MouseEvent e) { mouseCB(e);} - public void mouseClicked(MouseEvent e){} - public void mouseEntered(MouseEvent e){} - public void mouseExited(MouseEvent e){} - - /** MouseWheel callback function */ - private void mouseWheelCB(MouseWheelEvent e) { - if (!cc.viewer.viewOnly.getValue()) - cc.writeWheelEvent(e); - } - public void mouseWheelMoved(MouseWheelEvent e){ - mouseWheelCB(e); - } - - /** Handle the key-typed event. */ - public void keyTyped(KeyEvent e) {} - /** Handle the key-released event. */ - public void keyReleased(KeyEvent e) {} - /** Handle the key-pressed event. */ - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == - (KeyEvent.VK_F1+cc.menuKey-Keysyms.F1)) { - int sx = (scaleWidthRatio == 1.00) - ? lastX : (int)Math.floor(lastX*scaleWidthRatio); - int sy = (scaleHeightRatio == 1.00) - ? lastY : (int)Math.floor(lastY*scaleHeightRatio); - java.awt.Point ev = new java.awt.Point(lastX, lastY); - ev.translate(sx - lastX, sy - lastY); - cc.showMenu((int)ev.getX(), (int)ev.getY()); - return; - } - if (!cc.viewer.viewOnly.getValue()) - cc.writeKeyEvent(e); - } - - //////////////////////////////////////////////////////////////////// - // The following methods are called from both RFB and GUI threads - - // Note that mutex MUST be held when hideLocalCursor() and showLocalCursor() - // are called. - - private void hideLocalCursor() { - // - Blit the cursor backing store over the cursor - if (cursorVisible) { - cursorVisible = false; - im.imageRect(cursorBackingX, cursorBackingY, cursorBacking.width(), - cursorBacking.height(), cursorBacking.data); - im.put(cursorBackingX, cursorBackingY, cursorBacking.width(), - cursorBacking.height(), graphics); - } - } - - private void showLocalCursor() { - if (cursorAvailable && !cursorVisible) { - if (!im.getPF().equal(cursor.getPF()) || - cursor.width() == 0 || cursor.height() == 0) { - vlog.debug("attempting to render invalid local cursor"); - cursorAvailable = false; - return; - } - cursorVisible = true; - if (softCursor != null) return; - - int cursorLeft = cursor.hotspot.x; - int cursorTop = cursor.hotspot.y; - int cursorRight = cursorLeft + cursor.width(); - int cursorBottom = cursorTop + cursor.height(); - - int x = (cursorLeft >= 0 ? cursorLeft : 0); - int y = (cursorTop >= 0 ? cursorTop : 0); - int w = ((cursorRight < im.width() ? cursorRight : im.width()) - x); - int h = ((cursorBottom < im.height() ? cursorBottom : im.height()) - y); - - cursorBackingX = x; - cursorBackingY = y; - cursorBacking.setSize(w, h); - - for (int j = 0; j < h; j++) - System.arraycopy(im.data, (y+j) * im.width() + x, - cursorBacking.data, j*w, w); - - im.maskRect(cursorLeft, cursorTop, cursor.width(), cursor.height(), - cursor.data, cursor.mask); - im.put(x, y, w, h, graphics); - } - } - - - // run() is executed by the setColourMapEntriesTimerThread - it sleeps for - // 100ms before actually updating the colourmap. - public void run() { - try { - Thread.sleep(100); - } catch (InterruptedException e) {} - synchronized (this) { - im.updateColourMap(); - im.put(0, 0, im.width(), im.height(), graphics); - setColourMapEntriesTimerThread = null; - } - } - - // access to cc by different threads is specified in CConn - CConn cc; - - // access to the following must be synchronized: - PixelBufferImage im; - Graphics graphics; - Thread setColourMapEntriesTimerThread; - - Cursor cursor; - boolean cursorVisible; // Is cursor currently rendered? - boolean cursorAvailable; // Is cursor available for rendering? - int cursorPosX, cursorPosY; - ManagedPixelBuffer cursorBacking; - int cursorBackingX, cursorBackingY; - java.awt.Cursor softCursor; - static Toolkit tk = Toolkit.getDefaultToolkit(); - - public int scaledWidth = 0, scaledHeight = 0; - float scaleWidthRatio, scaleHeightRatio; - - // the following are only ever accessed by the RFB thread: - boolean invalidRect; - int invalidLeft, invalidRight, invalidTop, invalidBottom; - - // the following are only ever accessed by the GUI thread: - int lastX, lastY; - - static LogWriter vlog = new LogWriter("DesktopWindow"); -} diff --git a/java/src/com/tigervnc/vncviewer/Dialog.java b/java/src/com/tigervnc/vncviewer/Dialog.java deleted file mode 100644 index 6a11fb3a..00000000 --- a/java/src/com/tigervnc/vncviewer/Dialog.java +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// This Dialog class implements a pop-up dialog. This is needed because -// apparently you can't use the standard AWT Dialog from within an applet. The -// dialog can be made visible by calling its showDialog() method. Dialogs can -// be modal or non-modal. For a modal dialog box, the showDialog() method must -// be called from a thread other than the GUI thread, and it only returns when -// the dialog box has been dismissed. For a non-modal dialog box, the -// showDialog() method returns immediately. - -package com.tigervnc.vncviewer; - -import java.io.*; -import java.net.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.*; -import javax.swing.*; -import javax.swing.filechooser.*; - -//class Dialog extends JFrame implements WindowListener { -class Dialog extends JFrame { - - protected boolean ok, done; - boolean modal; - - public Dialog(boolean modal_) { - modal = modal_; - //addWindowListener(this); - } - - public boolean showDialog() { - ok = false; - done = false; - initDialog(); - Dimension dpySize = getToolkit().getScreenSize(); - Dimension mySize = getSize(); - int x = (dpySize.width - mySize.width) / 2; - int y = (dpySize.height - mySize.height) / 2; - setLocation(x, y); - ClassLoader cl = this.getClass().getClassLoader(); - ImageIcon icon = new ImageIcon(cl.getResource("com/tigervnc/vncviewer/tigervnc.ico")); - setIconImage(icon.getImage()); - //setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - //setFont(new Font("SansSerif", Font.PLAIN, 11)); - - setVisible(true); - setFocusable(true); - if (!modal) return true; - synchronized(this) { - try { - while (!done) - wait(); - } catch (InterruptedException e) { - } - } - return ok; - } - - public void endDialog() { - done = true; - setVisible(false); - setFocusable(false); - if (modal) { - synchronized (this) { - notify(); - } - } - } - - // initDialog() can be overridden in a derived class. Typically it is used - // to make sure that checkboxes have the right state, etc. - public void initDialog() { - } - - //------------------------------------------------------------------ - // implemented blank methods - //public void windowClosed(WindowEvent event){} - //public void windowDeiconified(WindowEvent event){} - //public void windowIconified(WindowEvent event){} - //public void windowActivated(WindowEvent event){} - //public void windowDeactivated(WindowEvent event){} - //public void windowOpened(WindowEvent event){} - - //------------------------------------------------------------------ - - // method to check which window was closing - //public void windowClosing(WindowEvent event) { - // ok = false; - // endDialog(); - //} - - public void addGBComponent(JComponent c, JComponent cp, - int gx, int gy, - int gw, int gh, - int gipx, int gipy, - double gwx, double gwy, - int fill, int anchor, - Insets insets) - { - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = anchor; - gbc.fill = fill; - gbc.gridx = gx; - gbc.gridy = gy; - gbc.gridwidth = gw; - gbc.gridheight = gh; - gbc.insets = insets; - gbc.ipadx = gipx; - gbc.ipady = gipy; - gbc.weightx = gwx; - gbc.weighty = gwy; - cp.add(c, gbc); - } - - final public String getFileSeperator() { - String seperator = System.getProperties().get("file.separator").toString(); - return seperator; - } - - final public String getUserName() { - String userName = (String)System.getProperties().get("user.name"); - return userName; - } - -} diff --git a/java/src/com/tigervnc/vncviewer/F8Menu.java b/java/src/com/tigervnc/vncviewer/F8Menu.java deleted file mode 100644 index 9b617857..00000000 --- a/java/src/com/tigervnc/vncviewer/F8Menu.java +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -import java.awt.Cursor; -import java.awt.event.*; -import javax.swing.JFrame; -import javax.swing.JPopupMenu; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JCheckBoxMenuItem; - -import com.tigervnc.rfb.*; - -public class F8Menu extends JPopupMenu implements ActionListener { - public F8Menu(CConn cc_) { - super("VNC Menu"); - setLightWeightPopupEnabled(false); - cc = cc_; - restore = addMenuItem("Restore",KeyEvent.VK_R); - move = addMenuItem("Move"); - move.setEnabled(false); - size = addMenuItem("Size"); - size.setEnabled(false); - minimize = addMenuItem("Minimize", KeyEvent.VK_N); - maximize = addMenuItem("Maximize", KeyEvent.VK_X); - addSeparator(); - exit = addMenuItem("Close Viewer", KeyEvent.VK_C); - addSeparator(); - fullScreen = new JCheckBoxMenuItem("Full Screen"); - fullScreen.setMnemonic(KeyEvent.VK_F); - fullScreen.addActionListener(this); - add(fullScreen); - addSeparator(); - clipboard = addMenuItem("Clipboard..."); - addSeparator(); - f8 = addMenuItem("Send F"+(cc.menuKey-Keysyms.F1+1)); - ctrlAltDel = addMenuItem("Send Ctrl-Alt-Del"); - addSeparator(); - refresh = addMenuItem("Refresh Screen", KeyEvent.VK_H); - addSeparator(); - newConn = addMenuItem("New connection...", KeyEvent.VK_W); - options = addMenuItem("Options...", KeyEvent.VK_O); - info = addMenuItem("Connection info...", KeyEvent.VK_I); - about = addMenuItem("About VncViewer...", KeyEvent.VK_A); - addSeparator(); - dismiss = addMenuItem("Dismiss menu"); - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - - JMenuItem addMenuItem(String str, int mnemonic) { - JMenuItem item = new JMenuItem(str, mnemonic); - item.addActionListener(this); - add(item); - return item; - } - - JMenuItem addMenuItem(String str) { - JMenuItem item = new JMenuItem(str); - item.addActionListener(this); - add(item); - return item; - } - - boolean actionMatch(ActionEvent ev, JMenuItem item) { - return ev.getActionCommand().equals(item.getActionCommand()); - } - - public void actionPerformed(ActionEvent ev) { - if (actionMatch(ev, exit)) { - cc.close(); - } else if (actionMatch(ev, fullScreen)) { - cc.toggleFullScreen(); - } else if (actionMatch(ev, restore)) { - if (cc.fullScreen) cc.toggleFullScreen(); - cc.viewport.setExtendedState(JFrame.NORMAL); - } else if (actionMatch(ev, minimize)) { - if (cc.fullScreen) cc.toggleFullScreen(); - cc.viewport.setExtendedState(JFrame.ICONIFIED); - } else if (actionMatch(ev, maximize)) { - if (cc.fullScreen) cc.toggleFullScreen(); - cc.viewport.setExtendedState(JFrame.MAXIMIZED_BOTH); - } else if (actionMatch(ev, clipboard)) { - cc.clipboardDialog.showDialog(); - } else if (actionMatch(ev, f8)) { - cc.writeKeyEvent(cc.menuKey, true); - cc.writeKeyEvent(cc.menuKey, false); - } else if (actionMatch(ev, ctrlAltDel)) { - cc.writeKeyEvent(Keysyms.Control_L, true); - cc.writeKeyEvent(Keysyms.Alt_L, true); - cc.writeKeyEvent(Keysyms.Delete, true); - cc.writeKeyEvent(Keysyms.Delete, false); - cc.writeKeyEvent(Keysyms.Alt_L, false); - cc.writeKeyEvent(Keysyms.Control_L, false); - } else if (actionMatch(ev, refresh)) { - cc.refresh(); - } else if (actionMatch(ev, newConn)) { - VncViewer.newViewer(cc.viewer); - } else if (actionMatch(ev, options)) { - cc.options.showDialog(); - } else if (actionMatch(ev, info)) { - cc.showInfo(); - } else if (actionMatch(ev, about)) { - cc.showAbout(); - } else if (actionMatch(ev, dismiss)) { - firePopupMenuCanceled(); - } - } - - CConn cc; - JMenuItem restore, move, size, minimize, maximize; - JMenuItem exit, clipboard, ctrlAltDel, refresh; - JMenuItem newConn, options, info, about, dismiss; - static JMenuItem f8; - JCheckBoxMenuItem fullScreen; - static LogWriter vlog = new LogWriter("F8Menu"); -} diff --git a/java/src/com/tigervnc/vncviewer/LICENCE.TXT b/java/src/com/tigervnc/vncviewer/LICENCE.TXT deleted file mode 100644 index ae3b5319..00000000 --- a/java/src/com/tigervnc/vncviewer/LICENCE.TXT +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/java/src/com/tigervnc/vncviewer/MANIFEST.MF b/java/src/com/tigervnc/vncviewer/MANIFEST.MF deleted file mode 100644 index b3574fe2..00000000 --- a/java/src/com/tigervnc/vncviewer/MANIFEST.MF +++ /dev/null @@ -1,2 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: com.tigervnc.vncviewer.VncViewer diff --git a/java/src/com/tigervnc/vncviewer/OptionsDialog.java b/java/src/com/tigervnc/vncviewer/OptionsDialog.java deleted file mode 100644 index 9664dc99..00000000 --- a/java/src/com/tigervnc/vncviewer/OptionsDialog.java +++ /dev/null @@ -1,413 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.filechooser.*; -import javax.swing.ImageIcon; -import java.net.URL; -import java.io.IOException; - -import com.tigervnc.rfb.*; -import com.tigervnc.rfb.Exception; - -class OptionsDialog extends Dialog implements - ActionListener, - ItemListener -{ - - // Constants - // Static variables - static LogWriter vlog = new LogWriter("OptionsDialog"); - - OptionsDialogCallback cb; - JPanel FormatPanel, InputsPanel, MiscPanel, DefaultsPanel, SecPanel; - JCheckBox autoSelect, customCompressLevel, noJpeg; - JComboBox menuKey, compressLevel, qualityLevel, scalingFactor; - ButtonGroup encodingGroup, colourGroup; - JRadioButton zrle, hextile, tight, raw; - JRadioButton fullColour, mediumColour, lowColour, veryLowColour; - JCheckBox viewOnly, acceptClipboard, sendClipboard, acceptBell; - JCheckBox fullScreen, shared, useLocalCursor, fastCopyRect; - JCheckBox secVeNCrypt, encNone, encTLS, encX509; - JCheckBox secNone, secVnc, secPlain, secIdent, sendLocalUsername; - JButton okButton, cancelButton; - JButton ca, crl; - JButton defSaveButton; - UserPrefs defaults; - - boolean autoScale = false; - boolean fixedRatioScale = false; - - public OptionsDialog(OptionsDialogCallback cb_) { - super(false); - cb = cb_; - setResizable(false); - setTitle("VNC Viewer Options"); - defaults = new UserPrefs("vncviewer"); - - getContentPane().setLayout( - new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); - - JTabbedPane tabPane = new JTabbedPane(); - - ButtonGroup encodingGroup = new ButtonGroup(); - ButtonGroup colourGroup = new ButtonGroup(); - - // Colour & Encoding tab - FormatPanel=new JPanel(new GridBagLayout()); - - autoSelect = new JCheckBox("Auto Select"); - autoSelect.addItemListener(this); - - JPanel encodingPanel = new JPanel(new GridBagLayout()); - encodingPanel.setBorder(BorderFactory.createTitledBorder("Preferred encoding")); - zrle = addRadioCheckbox("ZRLE", encodingGroup, encodingPanel); - hextile = addRadioCheckbox("Hextile", encodingGroup, encodingPanel); - tight = addRadioCheckbox("Tight", encodingGroup, encodingPanel); - raw = addRadioCheckbox("Raw", encodingGroup, encodingPanel); - - JPanel tightPanel = new JPanel(new GridBagLayout()); - customCompressLevel = new JCheckBox("Custom Compression Level"); - customCompressLevel.addItemListener(this); - Object[] compressionLevels = { 1, 2, 3, 4, 5, 6 }; - compressLevel = new JComboBox(compressionLevels); - compressLevel.setEditable(true); - JLabel compressionLabel = new JLabel("Level (1=fast, 6=best [4-6 are rarely useful])"); - noJpeg = new JCheckBox("Allow JPEG Compression"); - noJpeg.addItemListener(this); - Object[] qualityLevels = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - qualityLevel = new JComboBox(qualityLevels); - JLabel qualityLabel = new JLabel("Level (0=poor, 9=best)"); - compressLevel.setPreferredSize(qualityLevel.getPreferredSize()); - // Hack to set the left inset on editable JComboBox - if (UIManager.getLookAndFeel().getID() == "Windows") { - compressLevel.setBorder(BorderFactory.createCompoundBorder(compressLevel.getBorder(), - BorderFactory.createEmptyBorder(0,1,0,0))); - } else { - ComboBoxEditor editor = compressLevel.getEditor(); - JTextField jtf = (JTextField)editor.getEditorComponent(); - jtf.setBorder(new CompoundBorder(jtf.getBorder(), new EmptyBorder(0,1,0,0))); - } - addGBComponent(customCompressLevel, tightPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,2,0,0)); - addGBComponent(compressLevel, tightPanel, 0, 1, 1, 1, 2, 2, 0, 0, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(0,20,0,0)); - addGBComponent(compressionLabel, tightPanel, 1, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,0)); - addGBComponent(noJpeg, tightPanel, 0, 2, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,2,0,0)); - addGBComponent(qualityLevel, tightPanel, 0, 3, 1, 1, 2, 2, 0, 0, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(0,20,0,0)); - addGBComponent(qualityLabel, tightPanel, 1, 3, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,5,0,0)); - - - JPanel colourPanel = new JPanel(new GridBagLayout()); - colourPanel.setBorder(BorderFactory.createTitledBorder("Colour level")); - fullColour = addRadioCheckbox("Full (all available colours)", colourGroup, colourPanel); - mediumColour = addRadioCheckbox("Medium (256 colours)", colourGroup, colourPanel); - lowColour = addRadioCheckbox("Low (64 colours)", colourGroup, colourPanel); - veryLowColour = addRadioCheckbox("Very low(8 colours)", colourGroup, colourPanel); - - addGBComponent(autoSelect,FormatPanel, 0, 0, 2, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,2,0,0)); - addGBComponent(encodingPanel,FormatPanel, 0, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,2,0,0)); - addGBComponent(colourPanel,FormatPanel, 1, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_END, new Insets(0,2,0,0)); - addGBComponent(tightPanel,FormatPanel, 0, 2, 2, GridBagConstraints.REMAINDER, 2, 2, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,2,0,0)); - - // Inputs tab - InputsPanel=new JPanel(new GridBagLayout()); - - viewOnly = new JCheckBox("View Only (ignore mouse & keyboard)"); - viewOnly.addItemListener(this); - acceptClipboard = new JCheckBox("Accept clipboard from server"); - acceptClipboard.addItemListener(this); - sendClipboard = new JCheckBox("Send clipboard to server"); - sendClipboard.addItemListener(this); - JLabel menuKeyLabel = new JLabel("Menu Key"); - String[] menuKeys = - { "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12" }; - menuKey = new JComboBox(menuKeys); - menuKey.addItemListener(this); - addGBComponent(viewOnly,InputsPanel, 0, 0, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(acceptClipboard,InputsPanel, 0, 1, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(sendClipboard,InputsPanel, 0, 2, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(menuKeyLabel,InputsPanel, 0, 3, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(8,8,0,4)); - addGBComponent(menuKey,InputsPanel, 1, 3, 1, GridBagConstraints.REMAINDER, 0, 0, 25, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(4,4,0,4)); - - // Misc tab - MiscPanel=new JPanel(new GridBagLayout()); - - fullScreen = new JCheckBox("Full-screen mode"); - fullScreen.addItemListener(this); - shared = new JCheckBox("Shared connection (do not disconnect other viewers)"); - shared.addItemListener(this); - useLocalCursor = new JCheckBox("Render cursor locally"); - useLocalCursor.addItemListener(this); - fastCopyRect = new JCheckBox("Fast CopyRect"); - fastCopyRect.addItemListener(this); - acceptBell = new JCheckBox("Beep when requested by the server"); - acceptBell.addItemListener(this); - JLabel scalingFactorLabel = new JLabel("Scaling Factor"); - Object[] scalingFactors = { - "Auto", "Fixed Aspect Ratio", "50%", "75%", "95%", "100%", "105%", - "125%", "150%", "175%", "200%", "250%", "300%", "350%", "400%" }; - scalingFactor = new JComboBox(scalingFactors); - scalingFactor.setEditable(true); - scalingFactor.addItemListener(this); - addGBComponent(fullScreen,MiscPanel, 0, 0, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(shared,MiscPanel, 0, 1, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(useLocalCursor,MiscPanel, 0, 2, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(fastCopyRect,MiscPanel, 0, 3, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(4,4,0,4)); - addGBComponent(acceptBell,MiscPanel, 0, 4, 2, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(4,4,0,4)); - addGBComponent(scalingFactorLabel,MiscPanel, 0, 5, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(8,8,0,4)); - addGBComponent(scalingFactor,MiscPanel, 1, 5, 1, GridBagConstraints.REMAINDER, 0, 0, 25, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(4,4,0,4)); - - // load/save tab - DefaultsPanel=new JPanel(new GridBagLayout()); - - JPanel configPanel = new JPanel(new GridBagLayout()); - configPanel.setBorder(BorderFactory.createTitledBorder("Configuration File")); - JButton cfReloadButton = new JButton("Reload"); - cfReloadButton.addActionListener(this); - addGBComponent(cfReloadButton,configPanel, 0, 0, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); - JButton cfSaveButton = new JButton("Save"); - cfSaveButton.addActionListener(this); - addGBComponent(cfSaveButton,configPanel, 0, 1, 1, 1, 0, 0, 0, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); - JButton cfSaveAsButton = new JButton("Save As..."); - cfSaveAsButton.addActionListener(this); - addGBComponent(cfSaveAsButton,configPanel, 0, 2, 1, 1, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); - cfReloadButton.setEnabled(false); - cfSaveButton.setEnabled(false); - //cfSaveAsButton.setEnabled(!applet); - - JPanel defaultsPanel = new JPanel(new GridBagLayout()); - defaultsPanel.setBorder(BorderFactory.createTitledBorder("Defaults")); - JButton defReloadButton = new JButton("Reload"); - defReloadButton.addActionListener(this); - addGBComponent(defReloadButton,defaultsPanel, 0, 0, 1, 1, 0, 0, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); - defSaveButton = new JButton("Save"); - defSaveButton.addActionListener(this); - addGBComponent(defSaveButton,defaultsPanel, 0, 1, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8)); - - addGBComponent(configPanel,DefaultsPanel, 0, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,4,4,4)); - addGBComponent(defaultsPanel,DefaultsPanel, 1, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,4,4,4)); - //defReloadButton.setEnabled(!applet); - //defSaveButton.setEnabled(!applet); - - // security tab - SecPanel=new JPanel(new GridBagLayout()); - - JPanel encryptionPanel = new JPanel(new GridBagLayout()); - encryptionPanel.setBorder(BorderFactory.createTitledBorder("Session Encryption")); - encNone = addCheckbox("None", null, encryptionPanel); - encTLS = addCheckbox("Anonymous TLS", null, encryptionPanel); - encX509 = addJCheckBox("TLS with X.509 certificates", null, encryptionPanel, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.LINE_START,GridBagConstraints.REMAINDER,new Insets(0,0,0,60),0,0)); - - JPanel x509Panel = new JPanel(new GridBagLayout()); - x509Panel.setBorder(BorderFactory.createTitledBorder("X.509 certificates")); - ca = new JButton("Load CA certificate"); - ca.setPreferredSize(new Dimension(145,25)); - ca.addActionListener(this); - crl = new JButton("Load CRL certificate"); - crl.setPreferredSize(new Dimension(145,25)); - crl.addActionListener(this); - addGBComponent(ca, x509Panel, 0, 0, 1, 1, 2, 2, 0, 1, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(2,2,2,2)); - addGBComponent(crl, x509Panel, 1, 0, 1, 1, 2, 2, 1, 1, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(2,2,2,2)); - - JPanel authPanel = new JPanel(new GridBagLayout()); - authPanel.setBorder(BorderFactory.createTitledBorder("Authentication")); - secNone = addCheckbox("None", null, authPanel); - secVnc = addCheckbox("Standard VNC", null, authPanel); - secPlain = addJCheckBox("Plaintext", null, authPanel, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.LINE_START,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0)); - secIdent = addJCheckBox("Ident", null, authPanel, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.LINE_START,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0)); - sendLocalUsername = new JCheckBox("Send Local Username"); - sendLocalUsername.addItemListener(this); - addGBComponent(sendLocalUsername, authPanel, 1, 2, 1, 2, 0, 0, 2, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(0,20,0,0)); - - secVeNCrypt = new JCheckBox("Extended encryption and authentication methods (VeNCrypt)"); - secVeNCrypt.addItemListener(this); - addGBComponent(secVeNCrypt,SecPanel, 0, 0, 1, 1, 2, 2, 1, 0, GridBagConstraints.HORIZONTAL, GridBagConstraints.FIRST_LINE_START, new Insets(0,2,0,20)); - addGBComponent(encryptionPanel,SecPanel, 0, 1, 1, 1, 2, 2, 1, 0, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(0,4,2,4)); - addGBComponent(x509Panel,SecPanel, 0, 2, 1, 1, 2, 2, 1, 0, GridBagConstraints.NONE, GridBagConstraints.LINE_START, new Insets(2,4,2,4)); - addGBComponent(authPanel,SecPanel, 0, 3, 1, 1, 2, 2, 1, 1, GridBagConstraints.NONE, GridBagConstraints.FIRST_LINE_START, new Insets(2,4,2,4)); - - tabPane.add(FormatPanel); - tabPane.add(InputsPanel); - tabPane.add(MiscPanel); - tabPane.add(DefaultsPanel); - tabPane.add(SecPanel); - tabPane.addTab("Colour & Encoding", FormatPanel); - tabPane.addTab("Inputs", InputsPanel); - tabPane.addTab("Misc", MiscPanel); - tabPane.addTab("Load / Save", DefaultsPanel); - tabPane.addTab("Security", SecPanel); - tabPane.setBorder(BorderFactory.createEmptyBorder(4,4,0,4)); - - okButton = new JButton("OK"); - okButton.setPreferredSize(new Dimension(90,30)); - okButton.addActionListener(this); - cancelButton = new JButton("Cancel"); - cancelButton.setPreferredSize(new Dimension(90,30)); - cancelButton.addActionListener(this); - - JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); - buttonPane.setBorder(BorderFactory.createEmptyBorder(4,0,0,0)); - buttonPane.add(Box.createHorizontalGlue()); - buttonPane.add(okButton); - buttonPane.add(Box.createRigidArea(new Dimension(4,0))); - buttonPane.add(cancelButton); - buttonPane.add(Box.createRigidArea(new Dimension(4,0))); - - this.getContentPane().add(tabPane); - this.getContentPane().add(buttonPane); - - pack(); - - } - - public void initDialog() { - if (cb != null) cb.setOptions(); - zrle.setEnabled(!autoSelect.isSelected()); - hextile.setEnabled(!autoSelect.isSelected()); - tight.setEnabled(!autoSelect.isSelected()); - raw.setEnabled(!autoSelect.isSelected()); - fullColour.setEnabled(!autoSelect.isSelected()); - mediumColour.setEnabled(!autoSelect.isSelected()); - lowColour.setEnabled(!autoSelect.isSelected()); - veryLowColour.setEnabled(!autoSelect.isSelected()); - compressLevel.setEnabled(customCompressLevel.isSelected()); - qualityLevel.setEnabled(noJpeg.isSelected()); - autoScale = (scalingFactor.getSelectedItem().equals("Auto")); - fixedRatioScale = - (scalingFactor.getSelectedItem().equals("Fixed Aspect Ratio")); - sendLocalUsername.setEnabled(secVeNCrypt.isEnabled()&& - (secPlain.isSelected()||secIdent.isSelected())); - } - - JRadioButton addRadioCheckbox(String str, ButtonGroup group, JPanel panel) { - JRadioButton c = new JRadioButton(str); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.LINE_START; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.weightx = 1; - gbc.weighty = 1; - panel.add(c,gbc); - group.add(c); - c.addItemListener(this); - return c; - } - - JCheckBox addCheckbox(String str, ButtonGroup group, JPanel panel) { - JCheckBox c = new JCheckBox(str); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.LINE_START; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.weightx = 1; - gbc.weighty = 1; - panel.add(c,gbc); - if (group != null) - group.add(c); - c.addItemListener(this); - return c; - } - - JCheckBox addJCheckBox(String str, ButtonGroup group, JPanel panel, - GridBagConstraints gbc) { - JCheckBox c = new JCheckBox(str); - panel.add(c,gbc); - if (group != null) - group.add(c); - c.addItemListener(this); - - return c; - } - - public void actionPerformed(ActionEvent e) { - Object s = e.getSource(); - if (s instanceof JButton && (JButton)s == okButton) { - autoScale = (scalingFactor.getSelectedItem().equals("Auto")); - fixedRatioScale = - (scalingFactor.getSelectedItem().equals("Fixed Aspect Ratio")); - ok = true; - if (cb != null) cb.getOptions(); - endDialog(); - } else if (s instanceof JButton && (JButton)s == cancelButton) { - ok = false; - endDialog(); - } else if (s instanceof JButton && (JButton)s == defSaveButton) { - try { - defaults.Save(); - } catch (java.lang.Exception x) { } - } else if (s instanceof JButton && (JButton)s == ca) { - JFileChooser fc = new JFileChooser(); - fc.setDialogTitle("Path to X509 CA certificate"); - int ret = fc.showOpenDialog(this); - if (ret == JFileChooser.APPROVE_OPTION) - CSecurityTLS.x509ca.setParam(fc.getSelectedFile().toString()); - } else if (s instanceof JButton && (JButton)s == crl) { - JFileChooser fc = new JFileChooser(); - fc.setDialogTitle("Path to X509 CRL file"); - int ret = fc.showOpenDialog(this); - if (ret == JFileChooser.APPROVE_OPTION) - CSecurityTLS.x509crl.setParam(fc.getSelectedFile().toString()); - } - } - - public void itemStateChanged(ItemEvent e) { - Object s = e.getSource(); - if (s instanceof JCheckBox && (JCheckBox)s == autoSelect) { - zrle.setEnabled(!autoSelect.isSelected()); - hextile.setEnabled(!autoSelect.isSelected()); - tight.setEnabled(!autoSelect.isSelected()); - raw.setEnabled(!autoSelect.isSelected()); - fullColour.setEnabled(!autoSelect.isSelected()); - mediumColour.setEnabled(!autoSelect.isSelected()); - lowColour.setEnabled(!autoSelect.isSelected()); - veryLowColour.setEnabled(!autoSelect.isSelected()); - defaults.setPref("autoSelect",(autoSelect.isSelected()) ? "on" : "off"); - } - if (s instanceof JCheckBox && (JCheckBox)s == customCompressLevel) { - compressLevel.setEnabled(customCompressLevel.isSelected()); - defaults.setPref("customCompressLevel",(customCompressLevel.isSelected()) ? "on" : "off"); - } - if (s instanceof JCheckBox && (JCheckBox)s == noJpeg) { - qualityLevel.setEnabled(noJpeg.isSelected()); - defaults.setPref("noJpeg",(noJpeg.isSelected()) ? "on" : "off"); - } - if (s instanceof JCheckBox && (JCheckBox)s == sendLocalUsername) { - defaults.setPref("sendLocalUsername",(sendLocalUsername.isSelected()) ? "on" : "off"); - } - if (s instanceof JCheckBox && (JCheckBox)s == secVeNCrypt) { - encNone.setEnabled(secVeNCrypt.isSelected()); - encTLS.setEnabled(secVeNCrypt.isSelected()); - encX509.setEnabled(secVeNCrypt.isSelected()); - ca.setEnabled(secVeNCrypt.isSelected()); - crl.setEnabled(secVeNCrypt.isSelected()); - secIdent.setEnabled(secVeNCrypt.isSelected()); - secNone.setEnabled(secVeNCrypt.isSelected()); - secVnc.setEnabled(secVeNCrypt.isSelected()); - secPlain.setEnabled(secVeNCrypt.isSelected()); - sendLocalUsername.setEnabled(secVeNCrypt.isSelected()); - } - if (s instanceof JCheckBox && (JCheckBox)s == secIdent || - s instanceof JCheckBox && (JCheckBox)s == secPlain) { - sendLocalUsername.setEnabled(secIdent.isSelected()||secPlain.isSelected()); - } - } - -} diff --git a/java/src/com/tigervnc/vncviewer/OptionsDialogCallback.java b/java/src/com/tigervnc/vncviewer/OptionsDialogCallback.java deleted file mode 100644 index f6897e24..00000000 --- a/java/src/com/tigervnc/vncviewer/OptionsDialogCallback.java +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -public interface OptionsDialogCallback { - public void setOptions(); - public void getOptions(); -} diff --git a/java/src/com/tigervnc/vncviewer/PasswdDialog.java b/java/src/com/tigervnc/vncviewer/PasswdDialog.java deleted file mode 100644 index eaace698..00000000 --- a/java/src/com/tigervnc/vncviewer/PasswdDialog.java +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import java.net.URL; - -class PasswdDialog extends Dialog implements KeyListener{ - - public PasswdDialog(String title, boolean userDisabled, boolean passwdDisabled) { - super(true); - setResizable(false); - setTitle(title); - setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - - JPanel p1 = new JPanel(); - userLabel = new JLabel("Username:"); - p1.add(userLabel); - userEntry = new JTextField(30); - userEntry.setEnabled(!userDisabled); - userLabel.setEnabled(!userDisabled); - p1.add(userEntry); - userEntry.addKeyListener(this); - - JPanel p2 = new JPanel(); - passwdLabel = new JLabel("Password:"); - passwdLabel.setPreferredSize(userLabel.getPreferredSize()); - p2.add(passwdLabel); - passwdEntry = new JPasswordField(30); - passwdEntry.setEnabled(!passwdDisabled); - passwdLabel.setEnabled(!passwdDisabled); - p2.add(passwdEntry); - passwdEntry.addKeyListener(this); - - getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS)); - getContentPane().add(p1); - getContentPane().add(p2); - pack(); - if (userEntry.isEnabled()) { - userEntry.requestFocus(); - } else { - passwdEntry.requestFocus(); - } - } - - /** Handle the key-typed event. */ - public void keyTyped(KeyEvent event) { } - /** Handle the key-released event. */ - public void keyReleased(KeyEvent event) { } - /** Handle the key-pressed event. */ - public void keyPressed(KeyEvent event) { - Object s = event.getSource(); - if (s instanceof JTextField && (JTextField)s == userEntry) { - if (event.getKeyCode() == KeyEvent.VK_ENTER) { - ok = true; - endDialog(); - } - } else if (s instanceof JPasswordField && (JPasswordField)s == passwdEntry) { - if (event.getKeyCode() == KeyEvent.VK_ENTER) { - ok = true; - endDialog(); - } - } - } - - JLabel userLabel; - JTextField userEntry; - JLabel passwdLabel; - JTextField passwdEntry; -} diff --git a/java/src/com/tigervnc/vncviewer/PixelBufferImage.java b/java/src/com/tigervnc/vncviewer/PixelBufferImage.java deleted file mode 100644 index 7e5e7174..00000000 --- a/java/src/com/tigervnc/vncviewer/PixelBufferImage.java +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// PixelBufferImage is an PixelBuffer which also acts as an ImageProducer. -// Currently it only supports 8-bit colourmapped pixel format. -// - -package com.tigervnc.vncviewer; - -import java.awt.*; -import java.awt.image.*; -import java.nio.ByteOrder; -import javax.swing.JScrollPane; - -import com.tigervnc.rfb.*; - -public class PixelBufferImage extends PixelBuffer implements ImageProducer -{ - public PixelBufferImage(int w, int h, CConn cc_, DesktopWindow desktop_) { - cc = cc_; - desktop = desktop_; - PixelFormat nativePF = getNativePF(); - switch ((nativePF.depth > cc.serverPF.depth) ? cc.serverPF.depth : nativePF.depth) { - case 8: - setPF(new PixelFormat(8,8,false,true,7,7,3,0,3,6)); - break; - case 16: - setPF(new PixelFormat(16,16,false,true,0xF800,0x07C0,0x003E,0,0,0)); - break; - case 24: - setPF(new PixelFormat(32,24,false,true,0xff,0xff,0xff,16,8,0)); - break; - default: - setPF(new PixelFormat(8,8,false,true,7,7,3,0,3,6)); - vlog.debug("Unsupported native PF, defaulting to depth 8"); - } - resize(w, h); - } - - // resize() resizes the image, preserving the image data where possible. - public void resize(int w, int h) { - if (w == width() && h == height()) return; - - int rowsToCopy = h < height() ? h : height(); - int copyWidth = w < width() ? w : width(); - int oldWidth = width(); - int[] oldData = data; - - width_ = w; - height_ = h; - image = desktop.createImage(this); - //image.setAccelerationPriority(1); - - data = new int[width() * height()]; - - for (int i = 0; i < rowsToCopy; i++) - System.arraycopy(oldData, copyWidth * i, - data, width() * i, copyWidth); - } - - private PixelFormat getNativePF() { - PixelFormat pf; - cm = java.awt.Toolkit.getDefaultToolkit().getColorModel(); - if (cm.getColorSpace().getType() == java.awt.color.ColorSpace.TYPE_RGB) { - int depth = cm.getPixelSize(); - int bpp = (depth > 16 ? 32 : (depth > 8 ? 16 : 8)); - ByteOrder byteOrder = ByteOrder.nativeOrder(); - boolean bigEndian = (byteOrder == ByteOrder.BIG_ENDIAN ? true : false); - boolean trueColour = (depth > 8 ? true : false); - int redShift = cm.getComponentSize()[0] + cm.getComponentSize()[1]; - int greenShift = cm.getComponentSize()[0]; - int blueShift = 0; - pf = new PixelFormat(bpp, depth, bigEndian, trueColour, - (depth > 8 ? 0xff : 0), - (depth > 8 ? 0xff : 0), - (depth > 8 ? 0xff : 0), - (depth > 8 ? redShift : 0), - (depth > 8 ? greenShift : 0), - (depth > 8 ? blueShift : 0)); - } else { - pf = new PixelFormat(8, 8, false, false, 7, 7, 3, 0, 3, 6); - } - vlog.debug("Native pixel format is "+pf.print()); - return pf; - } - - // put() causes the given rectangle to be drawn using the given graphics - // context. - public void put(int x, int y, int w, int h, Graphics g) { - if (ic != null) { - ic.setPixels(x, y, w, h, cm, data, width() * y + x, width()); - ic.imageComplete(ImageConsumer.SINGLEFRAMEDONE); - } - } - - // fillRect(), imageRect(), maskRect() are inherited from PixelBuffer. For - // copyRect() we also need to tell the ImageConsumer that the pixels have - // changed (this is done in the put() call for the others). - - public void copyRect(int x, int y, int w, int h, int srcX, int srcY) { - super.copyRect(x, y, w, h, srcX, srcY); - if (ic == null) return; - ic.setPixels(x, y, w, h, cm, data, width() * y + x, width()); - ic.imageComplete(ImageConsumer.SINGLEFRAMEDONE); - } - - // setColourMapEntries() changes some of the entries in the colourmap. - // However these settings won't take effect until updateColourMap() is - // called. This is because getting java to recalculate its internal - // translation table and redraw the screen is expensive. - - public void setColourMapEntries(int firstColour, int nColours_, - int[] rgbs) { - nColours = nColours_; - reds = new byte[nColours]; - blues = new byte[nColours]; - greens = new byte[nColours]; - for (int i = 0; i < nColours; i++) { - reds[firstColour+i] = (byte)(rgbs[i*3] >> 8); - greens[firstColour+i] = (byte)(rgbs[i*3+1] >> 8); - blues[firstColour+i] = (byte)(rgbs[i*3+2] >> 8); - } - } - - // ImageProducer methods - - public void updateColourMap() { - cm = new IndexColorModel(8, nColours, reds, greens, blues); - } - - public void addConsumer(ImageConsumer c) { - if (ic == c) return; - - vlog.debug("adding consumer "+c); - - if (ic != null) - vlog.error("Only one ImageConsumer allowed - discarding old one"); - - ic = c; - ic.setDimensions(width(), height()); - ic.setHints(ImageConsumer.RANDOMPIXELORDER); - // Calling ic.setColorModel(cm) seemed to help in some earlier versions of - // the JDK, but it shouldn't be necessary because we pass the ColorModel - // with each setPixels() call. - ic.setPixels(0, 0, width(), height(), cm, data, 0, width()); - ic.imageComplete(ImageConsumer.SINGLEFRAMEDONE); - } - - public void removeConsumer(ImageConsumer c) { - System.err.println("removeConsumer "+c); - if (ic == c) ic = null; - } - - public boolean isConsumer(ImageConsumer c) { return ic == c; } - public void requestTopDownLeftRightResend(ImageConsumer c) {} - public void startProduction(ImageConsumer c) { addConsumer(c); } - - Image image; - ImageConsumer ic; - - int nColours; - byte[] reds; - byte[] greens; - byte[] blues; - - CConn cc; - DesktopWindow desktop; - static LogWriter vlog = new LogWriter("PixelBufferImage"); -} diff --git a/java/src/com/tigervnc/vncviewer/README b/java/src/com/tigervnc/vncviewer/README deleted file mode 100644 index 9d825684..00000000 --- a/java/src/com/tigervnc/vncviewer/README +++ /dev/null @@ -1,174 +0,0 @@ - -TigerVNC Java Viewer -==================== - -This distribution is based on the standard VNC source and includes new -TigerVNC-specific features and fixes, such as additional low-bandwidth -optimizations, major GUI improvements, and more. - - Copyright (C) 2000-2003 Constantin Kaplinsky - Copyright (C) 2003 Sun Microsystems, Inc. - Copyright (C) 2002-2005 RealVNC Ltd. - Copyright (C) 2004-2005 Cendio AB - Copyright (C) 2005 Martin Koegler - Copyright (C) 2009 Pierre Ossman for Cendio AB - Copyright (C) 2009-2011 TigerVNC Team - All rights reserved. - -This software is distributed under the GNU General Public Licence as -published by the Free Software Foundation. See the file LICENCE.TXT for the -conditions under which this software is made available. TigerVNC also -contains code from other sources. See the Acknowledgements section below, and -the individual files for details of the conditions under which they are made -available. - - -Installation -============ - -There are three basic ways to use the TigerVNC Java Viewer: - - 1. Running the applet as part of a TigerVNC Server installation. - - Both the Unix and Windows versions of the TigerVNC Server include a small - built-in HTTP server that can serve the TigerVNC Java Viewer to web - clients. This enables easy access to the shared desktop without the need - to install any software on the client machine. - - The Unix TigerVNC Server (Xvnc) is able to serve up any set of files that - are present in a particular directory, which is specified in the -httpd - argument to Xvnc. The default version of the vncserver script will look - for a directory called vnc/classes, one level up from the directory - containing the vncserver script, then it will look for a directory called - /usr/share/vnc/classes, then /usr/local/vnc/classes. It will set the - -httpd argument to Xvnc to the first one of these VNC classes directories - it finds. Thus, one can easily deploy a modified version of the TigerVNC - Java Viewer by simply copying a new version of VncViewer.jar and/or - index.vnc into the VNC classes directory. - - In the case of the Windows TigerVNC Server, VncViewer.jar and index.vnc - are embedded as resources in the WinVNC executable, so deploying a - modified version of the TigerVNC Java Viewer on a Windows server requires - rebuilding WinVNC. - - 2. Running the applet from a standalone web server. - - Another possibility for using the TigerVNC Java Viewer is to install it - under a fully-functional HTTP server, such as Apache or IIS. Due to Java - security restrictions, the applet must be signed in order for it to - connect to a VNC server running on a different machine from the HTTP - server. - - One can install the TigerVNC Java Viewer by simply copying the .class and - .jar files into a directory that is under the control of the HTTP server. - Also, an HTML page should be created to act as a the base document for the - TigerVNC Java Viewer applet (an example named index.html is provided in - this directory. Modify this file to suit your specific needs.) - - 3. Running the viewer as a standalone application. - - Finally, the TigerVNC Java Viewer can be executed locally on the client - machine, but this method requires installation of either a JRE (Java - Runtime Environment) or a JDK (Java Development Kit). If VncViewer.jar is - in the current directory, then the TigerVNC Java Viewer can be launched - with the following command line: - - java -jar VncViewer.jar [parameters] - - Add an argument of -? to the above command line to print a list of - optional parameters supported by VncViewer. - - -Parameters -========== - -The TigerVNC Java Viewer accepts a number of optional parameters, allowing you -to customize its behavior. - -Parameters can be specified in one of the two ways, depending on how the -TigerVNC Java Viewer is used: - - 1. When the TigerVNC Java Viewer is run as an applet (embedded within an HTML - document), parameters should be specified using the <PARAM> HTML tags - within the appropriate <APPLET> section. Example: - - <APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar - WIDTH=400 HEIGHT=300> - <PARAM NAME="PORT" VALUE=5901> - <PARAM NAME="ScalingFactor" VALUE=50> - </APPLET> - - 2. When run as a standalone application, the TigerVNC Java Viewer reads - parameters from the command line. Example: - - java -jar VncViewer.jar Port=5901 ScalingFactor=50 - -Both parameter names and their values are case-insensitive. - -For a complete list of parameters and their descriptions, run: - - java -jar VncViewer.jar -? - - -HINTS -===== - ---> To refresh the remote desktop in the view-only mode, press "r" or "R" - on the keyboard. - - -ACKNOWLEDGEMENTS -================ - -This distribution contains Java DES software by Dave Zimmerman -<dzimm@widget.com> and Jef Poskanzer <jef@acme.com>. This is: - - Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. - - Permission to use, copy, modify, and distribute this software and its - documentation for NON-COMMERCIAL or COMMERCIAL purposes and without fee - is hereby granted, provided that this copyright notice is kept intact. - - WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE - SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT - NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE - LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, - MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. - - THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE - CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE - PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT - NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE - SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE - SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE - PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET - WORKSHOP SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF - FITNESS FOR HIGH RISK ACTIVITIES. - - Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights - reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Visit the ACME Labs Java page for up-to-date versions of this and other - fine Java utilities: http://www.acme.com/java/ diff --git a/java/src/com/tigervnc/vncviewer/ServerDialog.java b/java/src/com/tigervnc/vncviewer/ServerDialog.java deleted file mode 100644 index 00a7e183..00000000 --- a/java/src/com/tigervnc/vncviewer/ServerDialog.java +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -import java.awt.*; -import java.awt.image.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.border.*; -import java.net.URL; -import java.io.File; -import java.util.*; - -import com.tigervnc.rfb.*; -import com.tigervnc.rfb.Exception; - -class ServerDialog extends Dialog implements - ActionListener, - ItemListener -{ - - public ServerDialog(OptionsDialog options_, - String defaultServerName, CConn cc_) { - - super(true); - cc = cc_; - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setResizable(false); - setSize(new Dimension(340, 135)); - setTitle("VNC Viewer : Connection Details"); - - options = options_; - getContentPane().setLayout(new GridBagLayout()); - - JLabel serverLabel = new JLabel("Server:", JLabel.RIGHT); - if (options.defaults.getString("server") != null) { - server = new JComboBox(options.defaults.getString("server").split(",")); - } else { - server = new JComboBox(); - } - - // Hack to set the left inset on editable JComboBox - if (UIManager.getLookAndFeel().getID() == "Windows") { - server.setBorder(BorderFactory.createCompoundBorder(server.getBorder(), - BorderFactory.createEmptyBorder(0,2,0,0))); - } else { - ComboBoxEditor editor = server.getEditor(); - JTextField jtf = (JTextField)editor.getEditorComponent(); - jtf.setBorder(new CompoundBorder(jtf.getBorder(), new EmptyBorder(0,2,0,0))); - } - - server.setEditable(true); - editor = server.getEditor(); - JLabel encryptionLabel = new JLabel("Encryption:"); - encryption = new JComboBox(); - serverLabel.setPreferredSize(encryptionLabel.getPreferredSize()); - - JPanel topPanel = new JPanel(new GridBagLayout()); - - addGBComponent(new JLabel(cc.logo),topPanel, 0, 0, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_START, new Insets(5,5,5,15)); - addGBComponent(serverLabel,topPanel, 1, 0, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.LINE_END, new Insets(10,0,5,5)); - addGBComponent(server,topPanel, 2, 0, 1, 1, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(10,0,5,40)); - - optionsButton = new JButton("Options..."); - aboutButton = new JButton("About..."); - okButton = new JButton("OK"); - cancelButton = new JButton("Cancel"); - JPanel buttonPanel = new JPanel(new GridBagLayout()); - buttonPanel.setPreferredSize(new Dimension(340, 40)); - addGBComponent(aboutButton,buttonPanel, 0, 3, 1, 1, 0, 0, 0.2, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5)); - addGBComponent(optionsButton,buttonPanel, 1, 3, 1, 1, 0, 0, 0, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5)); - addGBComponent(okButton,buttonPanel, 2, 3, 1, 1, 0, 0, 0.8, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5)); - addGBComponent(cancelButton,buttonPanel, 3, 3, 1, 1, 0, 0, 0.5, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(0,5,0,5)); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.LINE_START; - gbc.fill = GridBagConstraints.BOTH; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.gridheight = 1; - gbc.insets = new Insets(0,0,0,0); - gbc.ipadx = 0; - gbc.ipady = 0; - gbc.weightx = 1; - gbc.weighty = 1; - getContentPane().add(topPanel,gbc); - getContentPane().add(buttonPanel); - - server.addActionListener(this); - optionsButton.addActionListener(this); - aboutButton.addActionListener(this); - okButton.addActionListener(this); - cancelButton.addActionListener(this); - - pack(); - } - - public void itemStateChanged(ItemEvent e) { - Object s = e.getSource(); - } - - public void actionPerformed(ActionEvent e) { - Object s = e.getSource(); - if (s instanceof JButton && (JButton)s == okButton) { - ok = true; - endDialog(); - } else if (s instanceof JButton && (JButton)s == cancelButton) { - ok = false; - endDialog(); - } else if (s instanceof JButton && (JButton)s == optionsButton) { - options.showDialog(); - } else if (s instanceof JButton && (JButton)s == aboutButton) { - cc.showAbout(); - } else if (s instanceof JComboBox && (JComboBox)s == server) { - if (e.getActionCommand().equals("comboBoxEdited")) { - server.insertItemAt(editor.getItem(), 0); - server.setSelectedIndex(0); - ok = true; - endDialog(); - } - } - } - - public void endDialog() { - if (ok) { - try { - options.defaults.setPref("encryption",(encryption.getSelectedIndex()==1) ? "off" : "on"); - if (!server.getSelectedItem().toString().equals("")) { - String t = (options.defaults.getString("server")==null) ? "" : options.defaults.getString("server"); - StringTokenizer st = new StringTokenizer(t, ","); - StringBuffer sb = new StringBuffer().append((String)server.getSelectedItem()); - while (st.hasMoreTokens()) { - String s = st.nextToken(); - if (!s.equals((String)server.getSelectedItem()) && !s.equals("")) { - sb.append(','); - sb.append(s); - } - } - options.defaults.setPref("server", sb.toString()); - } - options.defaults.Save(); - } catch (java.io.IOException e) { - System.out.println(e.toString()); - } catch(java.security.AccessControlException e) { - System.out.println(e.toString()); - } - } - done = true; - if (modal) { - synchronized (this) { - notify(); - } - } - this.dispose(); - } - - CConn cc; - JComboBox encryption, server; - ComboBoxEditor editor; - JButton aboutButton, optionsButton, okButton, cancelButton; - OptionsDialog options; - static LogWriter vlog = new LogWriter("ServerDialog"); - -} diff --git a/java/src/com/tigervnc/vncviewer/UserPrefs.java b/java/src/com/tigervnc/vncviewer/UserPrefs.java deleted file mode 100644 index bc2cf0f1..00000000 --- a/java/src/com/tigervnc/vncviewer/UserPrefs.java +++ /dev/null @@ -1,286 +0,0 @@ -/* Copyright (C) 2011 TigerVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -package com.tigervnc.vncviewer; - -import java.util.Properties; -import java.io.FileOutputStream; -import javax.swing.filechooser.*; - -/** - * Simple, generic class to load up or save properties for an application. - * (eg user preferences) - * - * While reading in values, it will automatically convert from string format, - * to your choice of int or boolean, if desired. - * - * We assume that you want properties stored in a file named - * $HOME/.yourappname, where $HOME represents the users "home directory" - * - * Feel free to email comments or suggestions to the author - * - * @version 1.0, 09/16/1997 - * @author Philip Brown phil@bolthole.com - */ - -public class UserPrefs extends Properties { - String userhome=null; //This will have fileseparator on end if it - String prefFile; - String appName; - - Properties systemprops; - - - /** - * We try to read in a preferences file, from the user's "HOME" - * directory. We base the name of the file, on the name of the - * application we are in. - * Use the getHomeDir() call if you want to know what directory - * this is in. - * - * @param appName_ name of application calling this class - */ - public UserPrefs(String appName_) { - appName = appName_; - - try { - systemprops=System.getProperties(); - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access system properties"); - } - // This is guaranteed as always being some valid directory, - // according to spec. - prefFile= getHomeDir()+getFileSeparator()+ - "."+appName; - try { - load(new java.io.FileInputStream(prefFile)); - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access system properties"); - } catch (Exception err) { - if(err instanceof java.io.FileNotFoundException) { - try { - store(new FileOutputStream(prefFile), appName+" preferences"); - } catch (Exception e) { /* FIXME */ } - } else { - // FIXME - should be a dialog - System.out.println("Error opening prefs file:"+err.getMessage()); - } - } - - } - - // Strip off any comments - String trimValue(String prop) { - if(prop==null) - return null; - - int lastpos; - lastpos=prop.indexOf('#'); - if(lastpos==-1) - lastpos=prop.length()-1; - while((prop.charAt(lastpos)==' ') || - (prop.charAt(lastpos)=='\t')) { - lastpos--; - if(lastpos==0) - break; - } - - return prop.substring(0, lastpos+1); - } - - /** - * The java spec guarantees that a "home" directory be - * specified. We look it up for our own uses at initialization - * If you want to do other things in the user's home dir, - * this routine is an easy way to find out where it is. - * - * This returns string that will have trailing fileseparator, eg "/") - * so you can slap together a filename directly after it, and - * not worry about that sort of junk. - */ - final public static String getHomeDir() { - String homeDir = null; - try { - String os = System.getProperty("os.name"); - try { - if (os.startsWith("Windows")) { - // JRE prior to 1.5 cannot reliably determine USERPROFILE - // return user.home and hope it's right... - if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) < 5) { - try { - homeDir = System.getProperty("user.home"); - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access user.home system property"); - } - } else { - homeDir = System.getenv("USERPROFILE"); - } - } else { - try { - homeDir = FileSystemView.getFileSystemView(). - getDefaultDirectory().getCanonicalPath(); - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access system property"); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access os.name system property"); - } - return homeDir; - } - - final private String getUserName() { - String userName = null; - try { - userName = (String) System.getProperties().get("user.name"); - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access user.name system property"); - } - return userName; - } - - final public static String getFileSeparator() { - String separator = null; - try { - separator = Character.toString(java.io.File.separatorChar); - } catch(java.security.AccessControlException e) { - System.out.println("Cannot access file.separator system property"); - } - return separator; - } - - /** - * way to directly set a preference. You'll have to - * do your own type conversion. - * @param prefname name of property - * @param value string value of property - */ - public void setPref(String prefname, String value) { - setProperty(prefname, value); - } - - public void setPref(String prefname, int value) { - systemprops.put(prefname, java.lang.Integer.toString(value)); - } - - public void setPref(String prefname, boolean value) { - put(prefname, (value ? "true" : "false")); - } - - /** - * Gets named resource, as a string value. - * returns null if no such resource defined. - * @param name name of property - */ - public String getString(String name) { - return trimValue(getProperty(name)); - } - /** - * Gets named resource, as a string value. - * - * @param name name of property - * @param defval default value to remember and return , if - * no existing property name found. - */ - public String getString(String name, String defstr) { - String val = trimValue(getProperty(name)); - if(val==null) { - setPref(name, defstr); - return defstr; - } - return val; - } - - /** - * look up property that is an int value - * @param name name of property - */ - public int getInt(String name) { - String strint = trimValue(getProperty(name)); - int val=0; - try { - val = Integer.parseInt(strint); - } catch (NumberFormatException err) { - //we dont care - } - return val; - } - - /** - * look up property that is an int value - * @param name name of property - * @param defval default value to remember and return , if - * no existing property name found. - */ - public int getInt(String name, int defval) { - String strint = trimValue(getProperty(name)); - if(strint==null) { - setPref(name, String.valueOf(defval)); - return defval; - } - int val=0; - try { - val = Integer.parseInt(strint); - } catch (NumberFormatException err) { - //we dont care - } - return val; - } - - /** - * look up property that is a boolean value - * @param name name of property - * @param defval default value to remember and return , if - * no existing property name found. - */ - public boolean getBool(String name) { - String strval = trimValue(getProperty(name)); - if(strval.equals("true")) - return true; - - return false; - } - - /** - * @param name name of property - * @param defval default value to remember and return , if - * no existing property name found. - */ - public boolean getBool(String name, boolean defval) { - String strval = trimValue(getProperty(name)); - if(strval==null) { - setPref(name, String.valueOf(defval)); - return defval; - } - - if(strval.equals("true")) - return true; - - return false; - } - - /** - * save user preferences to default file. Duh. - */ - public void Save() throws java.io.IOException { - store(new FileOutputStream(prefFile), appName+" preferences"); - } -} diff --git a/java/src/com/tigervnc/vncviewer/VncViewer.java b/java/src/com/tigervnc/vncviewer/VncViewer.java deleted file mode 100644 index bea486b0..00000000 --- a/java/src/com/tigervnc/vncviewer/VncViewer.java +++ /dev/null @@ -1,314 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// VncViewer - the VNC viewer applet. It can also be run from the -// command-line, when it behaves as much as possibly like the windows and unix -// viewers. -// -// Unfortunately, because of the way Java classes are loaded on demand, only -// configuration parameters defined in this file can be set from the command -// line or in applet parameters. - -package com.tigervnc.vncviewer; - -import java.awt.*; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Image; -import java.awt.image.*; -import java.awt.Label; -import java.io.InputStream; -import java.util.jar.Attributes; -import java.util.jar.Manifest; -import javax.swing.*; -import java.net.URL; - -import com.tigervnc.rdr.*; -import com.tigervnc.rfb.*; -import com.tigervnc.rfb.Exception; - -public class VncViewer extends java.applet.Applet implements Runnable -{ - public static final String about1 = "TigerVNC Viewer for Java"; - public static final String about2 = "Copyright (C) 1998-2011 "+ - "TigerVNC Team and many others (see README)"; - public static final String about3 = "Visit http://www.tigervnc.org "+ - "for information on TigerVNC."; - public static String version = null; - public static String build = null; - - public static void main(String[] argv) { - try { - String os = System.getProperty("os.name"); - if (os.startsWith("Windows")) { - String laf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; - UIManager.setLookAndFeel(laf); - } else { - UIManager.put("swing.boldMetal", Boolean.FALSE); - javax.swing.plaf.FontUIResource f = new - javax.swing.plaf.FontUIResource("SansSerif", Font.PLAIN, 11); - java.util.Enumeration keys = UIManager.getDefaults().keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - Object value = UIManager.get (key); - if (value instanceof javax.swing.plaf.FontUIResource) - UIManager.put(key, f); - } - } - UIManager.put("TitledBorder.titleColor",Color.blue); - } catch (java.lang.Exception exc) { } - VncViewer viewer = new VncViewer(argv); - viewer.start(); - } - - - public VncViewer(String[] argv) { - applet = false; - - // Override defaults with command-line options - for (int i = 0; i < argv.length; i++) { - if (argv[i].equalsIgnoreCase("-log")) { - if (++i >= argv.length) usage(); - System.err.println("Log setting: "+argv[i]); - LogWriter.setLogParams(argv[i]); - continue; - } - - if (Configuration.setParam(argv[i])) - continue; - - if (argv[i].charAt(0) == '-') { - if (i+1 < argv.length) { - if (Configuration.setParam(argv[i].substring(1), argv[i+1])) { - i++; - continue; - } - } - usage(); - } - - if (vncServerName.getValue() != null) - usage(); - vncServerName.setParam(argv[i]); - } - } - - public static void usage() { - String usage = ("\nusage: vncviewer [options/parameters] "+ - "[host:displayNum] [options/parameters]\n"+ - //" vncviewer [options/parameters] -listen [port] "+ - //"[options/parameters]\n"+ - "\n"+ - "Options:\n"+ - " -log <level> configure logging level\n"+ - "\n"+ - "Parameters can be turned on with -<param> or off with "+ - "-<param>=0\n"+ - "Parameters which take a value can be specified as "+ - "-<param> <value>\n"+ - "Other valid forms are <param>=<value> -<param>=<value> "+ - "--<param>=<value>\n"+ - "Parameter names are case-insensitive. The parameters "+ - "are:\n\n"+ - Configuration.listParams()); - System.err.print(usage); - System.exit(1); - } - - public VncViewer() { - applet = true; - firstApplet = true; - } - - public static void newViewer(VncViewer oldViewer) { - VncViewer viewer = new VncViewer(); - viewer.applet = oldViewer.applet; - viewer.firstApplet = false; - viewer.start(); - } - - - public void init() { - vlog.debug("init called"); - setBackground(Color.white); - ClassLoader cl = this.getClass().getClassLoader(); - ImageIcon icon = new ImageIcon(cl.getResource("com/tigervnc/vncviewer/tigervnc.png")); - logo = icon.getImage(); - } - - public void start() { - vlog.debug("start called"); - if (version == null || build == null) { - ClassLoader cl = this.getClass().getClassLoader(); - InputStream stream = cl.getResourceAsStream("com/tigervnc/vncviewer/timestamp"); - try { - Manifest manifest = new Manifest(stream); - Attributes attributes = manifest.getMainAttributes(); - version = attributes.getValue("Version"); - build = attributes.getValue("Build"); - } catch (java.io.IOException e) { } - } - nViewers++; - if (firstApplet) { - alwaysShowServerDialog.setParam(true); - Configuration.readAppletParams(this); - String host = getCodeBase().getHost(); - if (vncServerName.getValue() == null && vncServerPort.getValue() != 0) { - int port = vncServerPort.getValue(); - vncServerName.setParam(host + ((port >= 5900 && port <= 5999) - ? (":"+(port-5900)) - : ("::"+port))); - } - } - thread = new Thread(this); - thread.start(); - } - - public void paint(Graphics g) { - g.drawImage(logo, 0, 0, this); - int h = logo.getHeight(this)+20; - g.drawString(about1+" v"+version+" ("+build+")", 0, h); - h += g.getFontMetrics().getHeight(); - g.drawString(about2, 0, h); - h += g.getFontMetrics().getHeight(); - g.drawString(about3, 0, h); - } - - public void run() { - CConn cc = null; - try { - cc = new CConn(this, null, vncServerName.getValue(), false); - while (true) - cc.processMsg(); - } catch (EndOfStream e) { - vlog.info(e.toString()); - } catch (java.lang.Exception e) { - if (cc != null) cc.deleteWindow(); - if (cc == null || !cc.shuttingDown) { - e.printStackTrace(); - JOptionPane.showMessageDialog(null, - e.toString(), - "VNC Viewer : Error", - JOptionPane.ERROR_MESSAGE); - } - } - if (cc != null) cc.deleteWindow(); - nViewers--; - if (!applet && nViewers == 0) { - System.exit(0); - } - } - - BoolParameter fastCopyRect - = new BoolParameter("FastCopyRect", - "Use fast CopyRect - turn this off if you get "+ - "screen corruption when copying from off-screen", - true); - BoolParameter useLocalCursor - = new BoolParameter("UseLocalCursor", - "Render the mouse cursor locally", true); - BoolParameter sendLocalUsername - = new BoolParameter("SendLocalUsername", - "Send the local username for SecurityTypes "+ - "such as Plain rather than prompting", true); - BoolParameter autoSelect - = new BoolParameter("AutoSelect", - "Auto select pixel format and encoding", true); - BoolParameter fullColour - = new BoolParameter("FullColour", - "Use full colour - otherwise 6-bit colour is used "+ - "until AutoSelect decides the link is fast enough", - true); - AliasParameter fullColor - = new AliasParameter("FullColor", "Alias for FullColour", fullColour); - StringParameter preferredEncoding - = new StringParameter("PreferredEncoding", - "Preferred encoding to use (Tight, ZRLE, hextile or"+ - " raw) - implies AutoSelect=0", "Tight"); - BoolParameter viewOnly - = new BoolParameter("ViewOnly", "Don't send any mouse or keyboard "+ - "events to the server", false); - BoolParameter shared - = new BoolParameter("Shared", "Don't disconnect other viewers upon "+ - "connection - share the desktop instead", false); - BoolParameter fullScreen - = new BoolParameter("FullScreen", "Full Screen Mode", false); - BoolParameter acceptClipboard - = new BoolParameter("AcceptClipboard", - "Accept clipboard changes from the server", true); - BoolParameter sendClipboard - = new BoolParameter("SendClipboard", - "Send clipboard changes to the server", true); - StringParameter desktopSize - = new StringParameter("DesktopSize", - "Reconfigure desktop size on the server on "+ - "connect (if possible)", ""); - StringParameter scalingFactor - = new StringParameter("ScalingFactor", - "Reduce or enlarge the remote desktop image. "+ - "The value is interpreted as a scaling factor "+ - "in percent. If the parameter is set to "+ - "\"Auto\", then automatic scaling is "+ - "performed. Auto-scaling tries to choose a "+ - "scaling factor in such a way that the whole "+ - "remote desktop will fit on the local screen. "+ - "If the parameter is set to \"FixedRatio\", "+ - "then automatic scaling is performed, but the "+ - "original aspect ratio is preserved.", "100"); - BoolParameter alwaysShowServerDialog - = new BoolParameter("AlwaysShowServerDialog", - "Always show the server dialog even if a server "+ - "has been specified in an applet parameter or on "+ - "the command line", false); - StringParameter vncServerName - = new StringParameter("Server", - "The VNC server <host>[:<dpyNum>] or "+ - "<host>::<port>", null); - IntParameter vncServerPort - = new IntParameter("Port", - "The VNC server's port number, assuming it is on "+ - "the host from which the applet was downloaded", 0); - BoolParameter acceptBell - = new BoolParameter("AcceptBell", - "Produce a system beep when requested to by the server.", - true); - BoolParameter customCompressLevel - = new BoolParameter("CustomCompressLevel", - "Use custom compression level. "+ - "Default if CompressLevel is specified.", false); - IntParameter compressLevel - = new IntParameter("CompressLevel", - "Use specified compression level "+ - "0 = Low, 6 = High", - 1); - BoolParameter noJpeg - = new BoolParameter("NoJPEG", - "Disable lossy JPEG compression in Tight encoding.", false); - IntParameter qualityLevel - = new IntParameter("QualityLevel", - "JPEG quality level. "+ - "0 = Low, 9 = High", - 8); - - Thread thread; - boolean applet, firstApplet; - Image logo; - static int nViewers; - static LogWriter vlog = new LogWriter("main"); -} diff --git a/java/src/com/tigervnc/vncviewer/index.html b/java/src/com/tigervnc/vncviewer/index.html deleted file mode 100644 index ba00e26b..00000000 --- a/java/src/com/tigervnc/vncviewer/index.html +++ /dev/null @@ -1,20 +0,0 @@ -<!-- - index.html - an example HTML page for the TigerVNC Java Viewer applet, to - be used with a standalone web server. Before using this example, please - MAKE SURE to check the following: - - * the CODE and ARCHIVE attributes of the <APPLET> tag should point to - the correct directory (this example assumes that this page is in the - same directory as VncViewer.jar); ---> - -<HTML> -<TITLE> -TigerVNC desktop -</TITLE> -<APPLET CODE="com.tigervnc.vncviewer.VncViewer" ARCHIVE="VncViewer.jar" - WIDTH=500> -</APPLET> -<BR> -<A href="http://www.tigervnc.org/">TigerVNC site</A> -</HTML> diff --git a/java/src/com/tigervnc/vncviewer/index.vnc b/java/src/com/tigervnc/vncviewer/index.vnc deleted file mode 100644 index e8899875..00000000 --- a/java/src/com/tigervnc/vncviewer/index.vnc +++ /dev/null @@ -1,20 +0,0 @@ -<!-- - index.vnc - default HTML page for TigerVNC Java viewer applet, to be - used with Xvnc. On any file ending in .vnc, the HTTP server embedded in - Xvnc will substitute the following variables when preceded by a dollar: - USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT, - Use two dollar signs ($$) to get a dollar sign in the generated - HTML page. ---> - -<HTML> -<TITLE> -$USER's $DESKTOP desktop ($DISPLAY) -</TITLE> -<APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar - WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT> -<param name=PORT value=$PORT> -</APPLET> -<BR> -<A href="http://www.tigervnc.org/">TigerVNC site</A> -</HTML> diff --git a/java/src/com/tigervnc/vncviewer/tigervnc.ico b/java/src/com/tigervnc/vncviewer/tigervnc.ico Binary files differdeleted file mode 100644 index 50b90f00..00000000 --- a/java/src/com/tigervnc/vncviewer/tigervnc.ico +++ /dev/null diff --git a/java/src/com/tigervnc/vncviewer/tigervnc.png b/java/src/com/tigervnc/vncviewer/tigervnc.png Binary files differdeleted file mode 100644 index 8ac883ef..00000000 --- a/java/src/com/tigervnc/vncviewer/tigervnc.png +++ /dev/null diff --git a/java/src/com/tigervnc/vncviewer/timestamp.in b/java/src/com/tigervnc/vncviewer/timestamp.in deleted file mode 100644 index b666e7c0..00000000 --- a/java/src/com/tigervnc/vncviewer/timestamp.in +++ /dev/null @@ -1,6 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: com.tigervnc.vncviewer.VncViewer -Package-Date: @JAVA_DATE@ -Package-Time: @JAVA_TIME@ -Version: @VERSION@ -Build: @BUILD@ |