changeset 91:d89e03d99b7f

modify readJpegData()
author e085711
date Thu, 22 Sep 2011 05:14:49 +0900
parents 7a1e934144e6
children 405ead268439
files src/myVncClient/CuiMyVncClient.java src/myVncClient/InterfaceForViewer.java src/myVncClient/MyRfbProto.java src/myVncClient/MyVncClient.java src/myVncClient/VncCanvas.java
diffstat 5 files changed, 102 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/myVncClient/CuiMyVncClient.java	Tue Sep 20 13:42:01 2011 +0900
+++ b/src/myVncClient/CuiMyVncClient.java	Thu Sep 22 05:14:49 2011 +0900
@@ -317,8 +317,8 @@
 
 
 		if (rfb.serverMinor == 855) {
-			boolean useEchoFlag = rfb.readProxyFlag();
-			if (useEchoFlag) {
+			boolean useEchoPortFlag = rfb.readProxyFlag();
+			if (useEchoPortFlag) {
 				byte[] b = new byte[4];
 				b = rfb.readEchoPort();
 				echoPort = castByteInt(b);
@@ -384,8 +384,8 @@
 				+ "." + rfb.clientMinor);
 
 		if (rfb.serverMinor == 855) {
-			boolean useEchoFlag = rfb.readProxyFlag();
-			if (useEchoFlag) {
+			boolean useEchoPortFlag = rfb.readProxyFlag();
+			if (useEchoPortFlag) {
 				byte[] b = new byte[4];
 				b = rfb.readEchoPort();
 				echoPort = castByteInt(b);
@@ -1051,5 +1051,18 @@
 		int echoValue = bb.getInt();
 		return echoValue;
 	}
+	public Image getScreenImage() {
+		return vc.rawPixelsImage;
+	}
+
+	public void writeScreenData(byte[] b, String imageFormat) {
+/*
+		try{
+			vc.drawBufferedImage(b, imageFormat);
+		}catch(IOException e){
+			e.printStackTrace();
+		}
+*/
+	}
 	
 }
--- a/src/myVncClient/InterfaceForViewer.java	Tue Sep 20 13:42:01 2011 +0900
+++ b/src/myVncClient/InterfaceForViewer.java	Thu Sep 22 05:14:49 2011 +0900
@@ -1,6 +1,6 @@
 package myVncClient;
 
-import java.awt.Graphics; 
+import java.awt.Image;
 import java.net.Socket;
 
 public interface InterfaceForViewer extends java.lang.Runnable{
@@ -26,5 +26,6 @@
 
 	public void setClientSocket(Socket sock);
 	public void close();
-	
+	public Image getScreenImage();
+	public void writeScreenData(byte[] b, String imageFormat);
 }
--- a/src/myVncClient/MyRfbProto.java	Tue Sep 20 13:42:01 2011 +0900
+++ b/src/myVncClient/MyRfbProto.java	Thu Sep 22 05:14:49 2011 +0900
@@ -16,7 +16,6 @@
 import java.net.BindException;
 import java.net.ServerSocket;
 import java.net.Socket;
-import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -41,6 +40,8 @@
 	 * CheckMillis is one of new msgType for RFB 3.855. 
 	 */
 	final static byte SpeedCheckMillis = 4;
+	final static byte WriteJpegData = 5;
+	
 	private static final int INFLATE_BUFSIZE = 1024*100;
 	boolean printStatusFlag = false;
 	long startCheckTime;
@@ -92,6 +93,7 @@
 
 	MyRfbProto(String h, int p, MyVncClient v) throws IOException {
 		super(h, p, v);
+		this.viewer = v;
 		cliList = new LinkedList<Socket>();
 		cliListTmp = new LinkedList<Socket>();
 		createBimgFlag = false;
@@ -521,6 +523,46 @@
 		}
 	}
 	
+	void sendFullScreen(String imageFormat, OutputStream os) {
+		BufferedImage bimg = getBufferedImage(viewer.getScreenImage());
+		try {
+			byte[] b = getImageBytes(bimg, imageFormat);
+//			int len = b.length;
+			byte[] length = castIntByte(b.length);
+			System.out.println("jpeg length = " + b.length);
+
+			byte c = 0x05;
+			os.write((byte)WriteJpegData);
+			os.write(length); // length of jpeg data
+			os.write(b); // jpeg data
+			os.flush();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	void readWriteJpegData() throws IOException {
+		byte[] b = readJpegData();
+		viewer.writeScreenData(b, "jpeg");
+	}
+	
+	byte[] readJpegData() throws IOException {
+		int len = readU32();
+		byte[] b = new byte[len];
+		readFully(b);
+		return b;
+	}
+	
+	
+	public BufferedImage getBufferedImage(Image img) {
+		BufferedImage bimg = new BufferedImage(framebufferWidth, framebufferHeight, BufferedImage.TYPE_INT_RGB);
+		Graphics g = bimg.getGraphics();
+		g.drawImage(img, 0, 0, null);
+		g.dispose();
+		return bimg;
+	}
+
+	
 	void readSpeedCheck() throws IOException {
 		byte[] b = new byte[1];
 		readFully(b);
@@ -808,14 +850,13 @@
 					readClientInit(is);
 					sendInitData(os);
 					new Thread(reader).start(); // discard incoming packet here after.
-					if(rfbMinor == 885){
+					if(rfbMinor == 855){
 						// send jpeg data of full screen.  
-						
+						sendFullScreen("jpeg" ,os);
 					} else {
 						// send raw data of full screen.
 						
 					}
-					
 					for (;;) {
 						LinkedList<ByteBuffer> bufs = c.poll();
 						int inputIndex = 0;
--- a/src/myVncClient/MyVncClient.java	Tue Sep 20 13:42:01 2011 +0900
+++ b/src/myVncClient/MyVncClient.java	Thu Sep 22 05:14:49 2011 +0900
@@ -2,6 +2,7 @@
 
 import java.awt.*;
 import java.awt.event.*;
+import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.*;
 import java.util.Random;
@@ -379,8 +380,8 @@
 				+ "." + rfb.clientMinor);
 
 		if (rfb.serverMinor == 855) {
-			boolean useEchoFlag = rfb.readProxyFlag();
-			if (useEchoFlag) {
+			boolean useEchoPortFlag = rfb.readProxyFlag();
+			if (useEchoPortFlag) {
 				byte[] b = new byte[4];
 				b = rfb.readEchoPort();
 				echoPort = castByteInt(b);
@@ -453,8 +454,8 @@
 				+ "." + rfb.clientMinor);
 
 		if (rfb.serverMinor == 855) {
-			boolean useEchoFlag = rfb.readProxyFlag();
-			if (useEchoFlag) {
+			boolean useEchoPortFlag = rfb.readProxyFlag();
+			if (useEchoPortFlag) {
 				byte[] b = new byte[4];
 				b = rfb.readEchoPort();
 				echoPort = castByteInt(b);
@@ -1197,4 +1198,18 @@
 		vncFrame.dispose();
 	}
 
+	@Override
+	public Image getScreenImage() {
+//		return vc.memImage;
+		return vc.rawPixelsImage;
+	}
+	
+	public void writeScreenData(byte[] b, String imageFormat) {
+		try{
+			vc.drawBufferedImage(b, imageFormat);
+		}catch(IOException e){
+			e.printStackTrace();
+		}
+	}
+
 }
--- a/src/myVncClient/VncCanvas.java	Tue Sep 20 13:42:01 2011 +0900
+++ b/src/myVncClient/VncCanvas.java	Thu Sep 22 05:14:49 2011 +0900
@@ -30,6 +30,8 @@
 import java.util.zip.*;
 import java.net.*;
 
+import javax.imageio.ImageIO;
+
 import test.TestComet;
 
 
@@ -386,7 +388,7 @@
 
 		long count = 0;
 		
-		new Thread(){public void run() {TestComet.main(null);}}.start();
+//		new Thread(){public void run() {TestComet.main(null);}}.start();
 		
 		
 		while (true) {
@@ -409,6 +411,13 @@
 
 			// Process the message depending on its type.
 			switch (msgType) {
+			case MyRfbProto.SpeedCheckMillis:
+				rfb.readSpeedCheck();
+				break;
+			case MyRfbProto.WriteJpegData:
+				rfb.readWriteJpegData();
+				
+				break;
 			case RfbProto.FramebufferUpdate:
 
 				if (statNumUpdates == viewer.debugStatsExcludeUpdates
@@ -1937,6 +1946,7 @@
 		memGraphics.drawImage( bimg, 0,0, null);
 		
 	}
+	
 
 	BufferedImage createBufferedImage(Image img){
 		BufferedImage bimg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB  );
@@ -1947,6 +1957,13 @@
 		return bimg;
 	}
 	
+	void drawBufferedImage(byte[] b, String imageFormat) throws IOException{
+		BufferedImage bimg = ImageIO.read(new ByteArrayInputStream(b));
+//		ImageIO.write(bimg, "jpeg", new File("sample.jpeg"));
+		memGraphics.setClip(0,0, rfb.framebufferWidth, rfb.framebufferHeight );
+		memGraphics.drawImage( bimg, 0,0, null);
+		scheduleRepaint(0, 0, rfb.framebufferWidth, rfb.framebufferHeight );
+	}
 	
 	
 }