Mercurial > hg > Members > nobuyasu > tightVNCProxy
diff src/myVncProxy/MyRfbProto.java @ 24:87b29d6039a6
add package myVncProxy
author | e085711 |
---|---|
date | Sun, 24 Apr 2011 23:03:00 +0900 (2011-04-24) |
parents | src/MyRfbProto.java@b51bb7bc0766 |
children | cded9fd297ab |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/myVncProxy/MyRfbProto.java Sun Apr 24 23:03:00 2011 +0900 @@ -0,0 +1,206 @@ +package myVncProxy; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.BindException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.LinkedList; + + +class MyRfbProto extends RfbProto { + + private int messageType; + private int rectangles; + private int rectX; + private int rectY; + private int rectW; + private int rectH; + private int encoding; + + private ServerSocket servSock; + private int acceptPort; + private byte initData[]; + private LinkedList <Socket> cliList; + + MyRfbProto(String h, int p, VncViewer v ) throws IOException { + super(h, p, v); + cliList = new LinkedList <Socket>(); + } + + MyRfbProto(String h, int p) throws IOException { + super(h, p); + cliList = new LinkedList <Socket>(); + } + + void initServSock(int port) throws IOException{ + servSock = new ServerSocket(port); + acceptPort = port; + } + void selectPort(){ + int i = 5550; + while(true){ + try{ + initServSock(i); + break; + }catch(BindException e){ + i++; + continue; + }catch(IOException e){ + + } + } + } + int getAcceptPort(){ + return acceptPort; + } + void setSoTimeout(int num) throws IOException { + servSock.setSoTimeout(num); + } + + Socket accept() throws IOException { + return servSock.accept(); + } + + void addSock(Socket sock){ + cliList.add(sock); + } + + void mark(int len) throws IOException { + is.mark(len); + } + + void reset() throws IOException { + is.reset(); + } + + boolean markSupported() { + return is.markSupported(); + } + + void readServerInit() throws IOException { + + mark(255); + skipBytes(20); + int nlen = readU32(); + int blen = 20+4+nlen; + initData = new byte[blen]; + reset(); + + mark(blen); + readFully(initData); + reset(); + + framebufferWidth = readU16(); + framebufferHeight = readU16(); + bitsPerPixel = readU8(); + depth = readU8(); + bigEndian = (readU8() != 0); + trueColour = (readU8() != 0); + redMax = readU16(); + greenMax = readU16(); + blueMax = readU16(); + redShift = readU8(); + greenShift = readU8(); + blueShift = readU8(); + byte[] pad = new byte[3]; + readFully(pad); + int nameLength = readU32(); + byte[] name = new byte[nameLength]; + readFully(name); + desktopName = new String(name); + + // Read interaction capabilities (TightVNC protocol extensions) + if (protocolTightVNC) { + int nServerMessageTypes = readU16(); + int nClientMessageTypes = readU16(); + int nEncodingTypes = readU16(); + readU16(); + readCapabilityList(serverMsgCaps, nServerMessageTypes); + readCapabilityList(clientMsgCaps, nClientMessageTypes); + readCapabilityList(encodingCaps, nEncodingTypes); + } + + inNormalProtocol = true; + } + + void sendInitData(Socket sock) throws IOException{ + sock.getOutputStream().write(initData); + } + +// void sendData(byte b[]) throws IOException{ + void sendData(byte b[]){ + try{ + for(Socket cli : cliList){ + try{ + cli.getOutputStream().write(b, 0, b.length); + }catch(IOException e){ + // if socket closed + // cliList.remove(cli); + cliList.remove(cli); + } + } +// System.out.println("cliSize="+cliSize()); + }catch(Exception e){ +// System.out.println("cliSize 0"); + } + } + boolean ready() throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + return br.ready(); + } + + int cliSize(){ + return cliList.size(); + } + void printNumBytesRead(){ + System.out.println("numBytesRead="+numBytesRead); + } + void bufResetSend(int size) throws IOException { + reset(); + int len = size; + if(available() < size ) + len = available(); + byte buffer[] = new byte[len]; + readFully(buffer); + sendData(buffer); + } + void regiFramebufferUpdate()throws IOException{ + mark(16); + messageType = readU8(); + skipBytes(1); + rectangles = readU16(); + rectX = readU16(); + rectY = readU16(); + rectW = readU16(); + rectH = readU16(); + encoding = readU32(); + reset(); + } + void checkAndMark() throws IOException{ + switch(encoding){ + case RfbProto.EncodingRaw: + mark(rectW * rectH * 4 + 16); + break; + default: + mark(1000000); + } + } + + void printFramebufferUpdate(){ + + System.out.println("messageType=" + messageType); + System.out.println("rectangles="+rectangles); + System.out.println("encoding=" + encoding); + switch(encoding){ + case RfbProto.EncodingRaw: + System.out.println("rectW * rectH * 4 + 16 =" + rectW * rectH * 4 + 16); + break; + default: + + + } + } + + +}