Modified: 
incubator/openmeetings/trunk/singlewebapp/src/red5-screenshare/org/red5/screen/webstart/ScreenShare.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/red5-screenshare/org/red5/screen/webstart/ScreenShare.java?rev=1292756&r1=1292755&r2=1292756&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/red5-screenshare/org/red5/screen/webstart/ScreenShare.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/red5-screenshare/org/red5/screen/webstart/ScreenShare.java
 Thu Feb 23 11:57:54 2012
@@ -18,631 +18,32 @@
  */
 package org.red5.screen.webstart;
 
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.MouseInfo;
-import java.awt.Point;
-import java.awt.PointerInfo;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Robot;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBuffer;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.zip.DeflaterOutputStream;
-
-import javax.imageio.ImageIO;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JSpinner;
-import javax.swing.UIManager;
-
-import org.apache.mina.core.buffer.IoBuffer;
-import org.red5.io.ITagReader;
-import org.red5.io.ITagWriter;
-import org.red5.io.utils.ObjectMap;
-import org.red5.screen.webstart.gui.VirtualScreen;
-import org.red5.screen.webstart.gui.VirtualScreenBean;
-import org.red5.server.api.event.IEvent;
 import org.red5.server.api.service.IPendingServiceCall;
-import org.red5.server.api.service.IPendingServiceCallback;
 import org.red5.server.net.rtmp.Channel;
 import org.red5.server.net.rtmp.ClientExceptionHandler;
-import org.red5.server.net.rtmp.INetStreamEventHandler;
 import org.red5.server.net.rtmp.RTMPClient;
 import org.red5.server.net.rtmp.RTMPConnection;
 import org.red5.server.net.rtmp.codec.RTMP;
 import org.red5.server.net.rtmp.event.Notify;
-import org.red5.server.net.rtmp.event.VideoData;
 import org.red5.server.net.rtmp.message.Header;
-import org.red5.server.net.rtmp.status.StatusCodes;
-import org.red5.server.stream.message.RTMPMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ScreenShare extends RTMPClient implements INetStreamEventHandler,
-               ClientExceptionHandler, IPendingServiceCallback {
+public class ScreenShare extends RTMPClient implements ClientExceptionHandler, 
IScreenShare {
 
        private static final Logger logger = LoggerFactory
                        .getLogger(ScreenShare.class);
-       public static ScreenShare instance = null;
-
-       public boolean startPublish = false;
-       public Integer playStreamId;
-       public Integer publishStreamId;
-       public String publishName;
-       public RTMPConnection conn;
-       public ITagWriter writer;
-       public ITagReader reader;
-       public int videoTs = 0;
-       public int audioTs = 0;
-       public int kt = 0;
-       public int kt2 = 0;
-       public IoBuffer buffer;
-       public CaptureScreen capture = null;
-       public Thread thread = null;
-
-       public java.awt.Container contentPane;
-       public JFrame t;
-       public JLabel textArea;
-       public JLabel textWarningArea;
-       public JLabel textAreaQualy;
-       public JButton startButton;
-       public JButton stopButton;
-       public JButton exitButton;
-       public JSpinner jSpin;
-       public JLabel tFieldScreenZoom;
-       public JLabel blankArea;
-       public BlankArea virtualScreen;
-       public JLabel vscreenXLabel;
-       public JLabel vscreenYLabel;
-       public JSpinner jVScreenXSpin;
-       public JSpinner jVScreenYSpin;
-       public JLabel vscreenWidthLabel;
-       public JLabel vscreenHeightLabel;
-       public JSpinner jVScreenWidthSpin;
-       public JSpinner jVScreenHeightSpin;
-
-       // ---
-
-       public JComboBox jVScreenResizeMode;
-       public JLabel vscreenResizeLabel;
-       // public JLabel vscreenResizeHeightLabel;
-       // public JSpinner jVScreenResizeWidthSpin;
-       // public JSpinner jVScreenResizeHeightSpin;
-       // ---
-
-       public JLabel textAreaHeaderRecording;
-       public JLabel textAreaHeaderRecordingDescr;
-       public JButton startButtonRecording;
-       public JButton stopButtonRecording;
-
-       public JLabel vScreenIconLeft;
-       public JLabel vScreenIconRight;
-       public JLabel vScreenIconUp;
-       public JLabel vScreenIconDown;
-       public JLabel myBandWidhtTestLabel;
-
-       public String host = "btg199251";
-       public String app = "oflaDemo";
-       public int port = 1935;
-       public int defaultQualityScreensharing = 0;
-
-       public Long organization_id = 0L;
-       public Long user_id = null;
-       public Boolean allowRecording = true;
-
-       public boolean startRecording = false;
-       public boolean stopRecording = false;
-
-       public boolean startStreaming = false;
-       public boolean stopStreaming = false;
-
-       public String label730 = "Desktop Publisher";
-       public String label731 = "This application will publish your screen";
-       public String label732 = "Start Sharing";
-       public String label733 = "Stop Sharing";
-       public String label734 = "Select your screen Area:";
-       public String label735 = "Change width";
-       public String label737 = "Change height";
-       public String label738 = "SharingScreen X:";
-       public String label739 = "SharingScreen Y:";
-       public String label740 = "SharingScreen Width:";
-       public String label741 = "SharingScreen Height:";
-       public String label742 = "Connection was closed by Server";
-       public String label844 = "Show Mouse Position at viewers";
-
-       public String label869 = "Recording";
-       public String label870 = "<HTML>You may record and share your screen at 
the same time."
-                       + "To enable others to see your screen just hit the 
start button on the top."
-                       + "To only record the Session it is sufficient to click 
start recording.</HTML>";
-       public String label871 = "Start Recording";
-       public String label872 = "Stop Recording";
-       public String label878 = "Stop Sharing";
 
-       public String label1089 = "Quality of the ScreenShare: -";
-       public String label1090 = "Very high Quality -";
-       public String label1091 = "High Quality -";
-       public String label1092 = "Medium Quality -";
-       public String label1093 = "Low Quality -";
-
-       public Float imgQuality = new Float(0.40);
-
-       // public Float scaleFactor = 1F;
-       public float Ampl_factor = 1.3f;
-
-       public boolean isConnected = false;
-
-       public Map<Integer, Boolean> currentPressedKeys = new HashMap<Integer, 
Boolean>();
-
-       // 
------------------------------------------------------------------------
-       //
-       // Main
-       //
-       // 
------------------------------------------------------------------------
+       private CommonScreenShare instance = null;
 
        private ScreenShare() {
+               instance = new CommonScreenShare(this);
        };
 
        public static void main(String[] args) {
-               try {
-
-                       instance = new ScreenShare();
-
-                       if (args.length == 9) {
-
-                               instance.host = args[0];
-                               instance.app = args[1];
-                               instance.port = Integer.parseInt(args[2]);
-                               instance.publishName = args[3];
-
-                               String labelTexts = args[4];
-
-                               instance.organization_id = 
Long.parseLong(args[5]);
-
-                               instance.defaultQualityScreensharing = Integer
-                                               .parseInt(args[6]);
-                               instance.user_id = Long.parseLong(args[7]);
-                               instance.allowRecording = 
Boolean.parseBoolean(args[8]);
-
-                               if (labelTexts.length() > 0) {
-                                       String[] textArray = 
labelTexts.split(";");
-
-                                       logger.debug("labelTexts :: " + 
labelTexts);
-
-                                       logger.debug("textArray Length " + 
textArray.length);
-
-                                       for (int i = 0; i < textArray.length; 
i++) {
-                                               logger.debug(i + " :: " + 
textArray[i]);
-                                       }
-
-                                       instance.label730 = textArray[0];
-                                       instance.label731 = textArray[1];
-                                       instance.label732 = textArray[2];
-                                       instance.label733 = textArray[3];
-                                       instance.label734 = textArray[4];
-                                       instance.label735 = textArray[5];
-                                       instance.label737 = textArray[6];
-                                       instance.label738 = textArray[7];
-                                       instance.label739 = textArray[8];
-                                       instance.label740 = textArray[9];
-                                       instance.label741 = textArray[10];
-                                       instance.label742 = textArray[11];
-                                       instance.label844 = textArray[12];
-
-                                       instance.label869 = textArray[13];
-                                       instance.label870 = "<html>" + 
textArray[14] + "</html>";
-                                       instance.label871 = textArray[15];
-                                       instance.label872 = textArray[16];
-                                       instance.label878 = textArray[17];
-
-                                       instance.label1089 = textArray[18];
-                                       instance.label1090 = textArray[19];
-                                       instance.label1091 = textArray[20];
-                                       instance.label1092 = textArray[21];
-                                       instance.label1093 = textArray[22];
-
-                               }
-
-                       } else {
-                               instance = null;
-                               System.out
-                                               .println("\nRed5 SceenShare: 
use as java ScreenShare <host> <app name> <port> <stream name>\n Example: 
SceenShare localhost oflaDemo 1935 screen_stream");
-                               System.exit(0);
-                       }
-
-                       logger.debug("host: " + instance.host + ", app: " + 
instance.app
-                                       + ", port: " + instance.port + ", 
publish: "
-                                       + instance.publishName);
-
-                       instance.createWindow();
-
-               } catch (Exception err) {
-                       logger.error("", err);
-               }
-       }
-
-       // 
------------------------------------------------------------------------
-       //
-       // Wrapper - Constructor for testing
-       //
-       // 
------------------------------------------------------------------------
-       public ScreenShare(String host, String app, Integer port,
-                       String publishName, Long organization_id) {
-               instance = new ScreenShare();
-
-               instance.host = host;
-               instance.app = app;
-               instance.port = port;
-               instance.publishName = publishName;
-               instance.organization_id = organization_id;
-
-               logger.debug("host: " + instance.host + ", app: " + instance.app
-                               + ", port: " + instance.port + ", publish: "
-                               + instance.publishName);
-
-               instance.createWindow();
-       }
-
-       // 
------------------------------------------------------------------------
-       //
-       // GUI
-       //
-       // 
------------------------------------------------------------------------
-
-       public void createWindow() {
-               try {
-
-                       ImageIcon start_btn = 
createImageIcon("/webstart_play.png");
-                       ImageIcon stop_btn = 
createImageIcon("/webstart_stop.png");
-
-                       UIManager
-                                       .setLookAndFeel(new 
com.incors.plaf.kunststoff.KunststoffLookAndFeel());
-                       UIManager.getLookAndFeelDefaults().put("ClassLoader",
-                                       getClass().getClassLoader());
-
-                       t = new JFrame(this.label730);
-                       contentPane = t.getContentPane();
-                       contentPane.setBackground(Color.WHITE);
-                       textArea = new JLabel();
-                       textArea.setBackground(Color.WHITE);
-                       contentPane.setLayout(null);
-                       contentPane.add(textArea);
-
-                       // logger.debug("addKey Listener");
-                       // t.addKeyListener(new ScreenKeyListener());
-
-                       // *****
-                       // Header Overall
-                       textArea.setText(this.label731);
-                       textArea.setBounds(10, 0, 400, 24);
-
-                       // *****
-                       // Start Button Screen Sharing
-                       startButton = new JButton(this.label732, start_btn);
-                       startButton.addActionListener(new ActionListener() {
-                               public void actionPerformed(ActionEvent arg0) {
-                                       // TODO Auto-generated method stub
-                                       startRecording = false;
-                                       startStreaming = true;
-                                       captureScreenStart();
-                               }
-                       });
-                       startButton.setBounds(30, 34, 200, 32);
-                       t.add(startButton);
-
-                       // *****
-                       // Stop Button Screen Sharing
-                       stopButton = new JButton(this.label733, stop_btn);
-                       stopButton.addActionListener(new ActionListener() {
-                               public void actionPerformed(ActionEvent arg0) {
-                                       // TODO Auto-generated method stub
-                                       stopRecording = false;
-                                       stopStreaming = true;
-                                       captureScreenStop();
-                               }
-                       });
-                       stopButton.setBounds(290, 34, 200, 32);
-                       stopButton.setEnabled(false);
-                       t.add(stopButton);
-
-                       // add the small screen thumb to the JFrame
-                       new VirtualScreen();
-
-                       // *****
-                       // Text Recording
-                       textAreaHeaderRecording = new JLabel();
-
-                       // FIXME: Set Font to bold
-                       // textAreaHeaderRecording.setB
-                       // Font f = textAreaHeaderRecording.getFont();
-                       // 
textAreaHeaderRecording.setFont(f.deriveFont(f.getStyle() ^
-                       // Font.BOLD));
-
-                       textAreaHeaderRecording.setText(this.label869);
-                       contentPane.add(textAreaHeaderRecording);
-                       textAreaHeaderRecording.setBounds(10, 340, 480, 24);
-
-                       textAreaHeaderRecordingDescr = new JLabel();
-                       textAreaHeaderRecordingDescr.setText(this.label870);
-                       contentPane.add(textAreaHeaderRecordingDescr);
-                       textAreaHeaderRecordingDescr.setBounds(10, 360, 480, 
54);
-
-                       if (instance.allowRecording) {
-
-                               // *****
-                               // Start Button Recording
-                               startButtonRecording = new 
JButton(this.label871, start_btn);
-                               startButtonRecording.addActionListener(new 
ActionListener() {
-                                       public void actionPerformed(ActionEvent 
arg0) {
-                                               // TODO Auto-generated method 
stub
-                                               startRecording = true;
-                                               startStreaming = false;
-                                               captureScreenStart();
-                                       }
-                               });
-                               startButtonRecording.setBounds(30, 420, 200, 
32);
-                               t.add(startButtonRecording);
-
-                               // *****
-                               // Stop Button Recording
-                               stopButtonRecording = new 
JButton(this.label872, stop_btn);
-                               stopButtonRecording.addActionListener(new 
ActionListener() {
-                                       public void actionPerformed(ActionEvent 
arg0) {
-                                               // TODO Auto-generated method 
stub
-                                               stopRecording = true;
-                                               stopStreaming = false;
-                                               captureScreenStop();
-                                       }
-                               });
-                               stopButtonRecording.setBounds(290, 420, 200, 
32);
-                               stopButtonRecording.setEnabled(false);
-                               t.add(stopButtonRecording);
-
-                       }
-
-                       // *****
-                       // Text Warning
-                       textWarningArea = new JLabel();
-                       contentPane.add(textWarningArea);
-                       textWarningArea.setBounds(10, 450, 420, 54);
-                       // textWarningArea.setBackground(Color.WHITE);
-
-                       // *****
-                       // Exit Button
-                       exitButton = new JButton(this.label878);
-                       exitButton.addActionListener(new ActionListener() {
-                               public void actionPerformed(ActionEvent arg0) {
-                                       // TODO Auto-generated method stub
-                                       t.setVisible(false);
-                                       System.exit(0);
-                               }
-                       });
-                       exitButton.setBounds(290, 460, 200, 32);
-                       t.add(exitButton);
-
-                       // *****
-                       // Background Image
-                       Image im_left = ImageIO.read(ScreenShare.class
-                                       .getResource("/background.png"));
-                       ImageIcon iIconBack = new ImageIcon(im_left);
-
-                       JLabel jLab = new JLabel(iIconBack);
-                       jLab.setBounds(0, 0, 500, 440);
-                       t.add(jLab);
-
-                       t.addWindowListener(new WindowAdapter() {
-                               public void windowClosing(WindowEvent e) {
-                                       t.setVisible(false);
-                                       System.exit(0);
-                               }
-
-                       });
-                       t.pack();
-                       t.setLocation(30, 30);
-                       t.setSize(500, 530);
-                       t.setVisible(true);
-                       t.setResizable(false);
-
-                       logger.debug("initialized");
-
-               } catch (Exception err) {
-                       logger.error("createWindow Exception: ", err);
-                       err.printStackTrace();
-               }
-       }
-
-       protected static ImageIcon createImageIcon(String path) throws 
Exception {
-               java.net.URL imgURL = ScreenShare.class.getResource(path);
-               return new ImageIcon(imgURL);
-       }
-
-       public void showBandwidthWarning(String warning) {
-               textWarningArea.setText(warning);
-       }
-
-       synchronized public void sendCursorStatus() {
-               try {
-
-                       PointerInfo a = MouseInfo.getPointerInfo();
-                       Point mouseP = a.getLocation();
-
-                       // Integer x = 
Long.valueOf(Math.round(mouseP.getX())).intValue();
-                       // Integer y = 
Long.valueOf(Math.round(mouseP.getY())).intValue();
-
-                       Float scaleFactor = 
Float.valueOf(VirtualScreenBean.vScreenResizeX)
-                                       / 
Float.valueOf(VirtualScreenBean.vScreenSpinnerWidth);
-
-                       // Real size: Real mouse position = Resize : X
-                       Integer x = Long
-                                       .valueOf(
-                                                       
Math.round(((mouseP.getX() - VirtualScreenBean.vScreenSpinnerX) * scaleFactor)
-                                                                       * 
Ampl_factor)).intValue();
-                       Integer y = Long
-                                       .valueOf(
-                                                       
Math.round(((mouseP.getY() - VirtualScreenBean.vScreenSpinnerY) * scaleFactor)
-                                                                       * 
Ampl_factor)).intValue();
-
-                       HashMap<String, Object> cursorPosition = new 
HashMap<String, Object>();
-                       cursorPosition.put("publicSID", this.publishName);
-                       cursorPosition.put("cursor_x", x);
-                       cursorPosition.put("cursor_y", y);
-
-                       invoke("setNewCursorPosition", new Object[] { 
cursorPosition },
-                                       this);
-
-               } catch (Exception err) {
-                       System.out.println("captureScreenStart Exception: ");
-                       System.err.println(err);
-                       textArea.setText("Exception: " + err);
-                       logger.error("[sendCursorStatus]", err);
-               }
-       }
-
-       synchronized public void setConnectionAsSharingClient() {
-
-               try {
-
-                       logger.debug("########## setConnectionAsSharingClient");
-
-                       HashMap<String, Object> map = new HashMap<String, 
Object>();
-                       // map.put("screenX",VirtualScreenBean.vScreenSpinnerX);
-                       // map.put("screenY",VirtualScreenBean.vScreenSpinnerY);
-                       map.put("screenX", VirtualScreenBean.vScreenResizeX);
-                       map.put("screenY", VirtualScreenBean.vScreenResizeY);
-
-                       // int scaledWidth =
-                       // 
Float.valueOf(Math.round(VirtualScreenBean.vScreenSpinnerWidth*scaleFactor)).intValue();
-                       // int scaledHeight =
-                       // 
Float.valueOf(Math.round(VirtualScreenBean.vScreenSpinnerHeight*scaleFactor)).intValue();
-
-                       int scaledWidth = Float.valueOf(
-                                       
Math.round(VirtualScreenBean.vScreenResizeX * Ampl_factor))
-                                       .intValue();
-                       int scaledHeight = Float.valueOf(
-                                       
Math.round(VirtualScreenBean.vScreenResizeY * Ampl_factor))
-                                       .intValue();
-
-                       logger.debug("########## setConnectionAsSharingClient 
vScreenResizeX "
-                                       + VirtualScreenBean.vScreenResizeX);
-                       logger.debug("########## setConnectionAsSharingClient 
vScreenResizeY "
-                                       + VirtualScreenBean.vScreenResizeY);
-
-                       map.put("screenWidth", scaledWidth);
-                       map.put("screenHeight", scaledHeight);
-
-                       logger.debug("########## setConnectionAsSharingClient"
-                                       + scaledWidth + " || " + scaledHeight);
-
-                       // 
map.put("screenWidth",VirtualScreenBean.vScreenResizeX);
-                       // 
map.put("screenHeight",VirtualScreenBean.vScreenResizeY);
-
-                       map.put("publishName", this.publishName);
-                       map.put("startRecording", this.startRecording);
-                       map.put("startStreaming", this.startStreaming);
-
-                       map.put("organization_id", this.organization_id);
-                       map.put("user_id", this.user_id);
-
-                       invoke("setConnectionAsSharingClient", new Object[] { 
map }, this);
-
-               } catch (Exception err) {
-                       logger.error("setConnectionAsSharingClient Exception: 
", err);
-                       textArea.setText("Error: " + err.getLocalizedMessage());
-                       logger.error("[setConnectionAsSharingClient]", err);
-               }
-       }
-
-       private void captureScreenStart() {
-               try {
-
-                       logger.debug("captureScreenStart");
-
-                       startStream(host, app, port, publishName);
-
-               } catch (Exception err) {
-                       logger.error("captureScreenStart Exception: ", err);
-                       textArea.setText("Exception: " + err);
-               }
+               new ScreenShare().instance.main(args);
        }
-
-       private void captureScreenStop() {
-               try {
-
-                       logger.debug("INVOKE screenSharerAction");
-
-                       HashMap<String, Object> map = new HashMap<String, 
Object>();
-                       map.put("stopStreaming", this.stopStreaming);
-                       map.put("stopRecording", this.stopRecording);
-
-                       invoke("screenSharerAction", new Object[] { map }, 
this);
-
-                       if (this.stopStreaming) {
-                               startButton.setEnabled(true);
-                               stopButton.setEnabled(false);
-                       } else {
-                               startButtonRecording.setEnabled(true);
-                               stopButtonRecording.setEnabled(false);
-                       }
-
-               } catch (Exception err) {
-                       logger.error("captureScreenStop Exception: ", err);
-                       textArea.setText("Exception: " + err);
-               }
-       }
-
-       // 
------------------------------------------------------------------------
-       //
-       // Public
-       //
-       // 
------------------------------------------------------------------------
-
-       public void startStream(String host, String app, int port,
-                       String publishName) {
-
-               logger.debug("ScreenShare startStream");
-               this.publishName = publishName;
-
-               videoTs = 0;
-               audioTs = 0;
-               kt = 0;
-               kt2 = 0;
-
-               try {
-
-                       if (!isConnected) {
-                               connect(host, port, app, this);
-                       } else {
-                               setConnectionAsSharingClient();
-                       }
-
-               } catch (Exception e) {
-                       logger.error("ScreenShare startStream exception " + e);
-               }
-
-       }
-
+       
        // 
------------------------------------------------------------------------
        //
        // Override
@@ -666,970 +67,20 @@ public class ScreenShare extends RTMPCli
                        Header source, Notify invoke, RTMP rtmp) {
                super.onInvoke(conn, channel, source, invoke, rtmp);
 
-               if (invoke.getType() == IEvent.Type.STREAM_DATA) {
-                       // logger.debug("Ignoring stream data notify with 
header: {}",
-                       // source);
-                       return;
-               }
-               // logger.debug("onInvoke: {}, invokeId: {}", invoke, invoke
-               // .getInvokeId());
-
-               // logger.debug("ServiceMethodName :: "+
-               // invoke.getCall().getServiceMethodName());
-               // logger.debug("Arguments :: "+ 
invoke.getCall().getArguments());
-
-               if (invoke.getCall().getServiceMethodName()
-                               .equals("sendRemoteCursorEvent")) {
-
-                       
sendRemoteCursorEvent(invoke.getCall().getArguments()[0]);
-
-               }
-
-       }
-
-       public void stopStream() {
-               try {
-
-                       logger.debug("ScreenShare stopStream");
-
-                       isConnected = false;
-
-                       disconnect();
-                       capture.stop();
-                       capture.release();
-                       thread = null;
-
-               } catch (Exception e) {
-                       logger.error("ScreenShare stopStream exception " + e);
-               }
-
+               instance.onInvoke(conn, channel, source, invoke, rtmp);
        }
 
-       // 
------------------------------------------------------------------------
-       //
-       // Implementations
-       //
-       // 
------------------------------------------------------------------------
-
+       @Override
        public void handleException(Throwable throwable) {
                logger.error("{}", new Object[] { throwable.getCause() });
                System.out.println(throwable.getCause());
        }
 
        public void onStreamEvent(Notify notify) {
-
-               logger.debug("onStreamEvent " + notify);
-
-               ObjectMap map = (ObjectMap) notify.getCall().getArguments()[0];
-               String code = (String) map.get("code");
-
-               if (StatusCodes.NS_PUBLISH_START.equals(code)) {
-                       logger.debug("onStreamEvent Publish start");
-                       startPublish = true;
-               }
-       }
-
-       public void sendRemoteCursorEvent(Object obj) {
-               try {
-
-                       // logger.debug("#### sendRemoteCursorEvent ");
-
-                       // logger.debug("Result Map Type 
"+obj.getClass().getName());
-
-                       Map returnMap = (Map) obj;
-
-                       // logger.debug("result "+returnMap.get("result"));
-
-                       String action = returnMap.get("action").toString();
-
-                       if (action.equals("onmouseup")) {
-
-                               Robot robot = new Robot();
-
-                               // VirtualScreenBean
-
-                               // Integer x = Math.round ( ( (
-                               // 
Float.valueOf(returnMap.get("x").toString()).floatValue()
-                               // *VirtualScreenBean.vScreenResizeX
-                               // )/VirtualScreenBean.vScreenSpinnerWidth) / 
Ampl_factor) ;
-                               // Integer y = Math.round ( ( (
-                               // 
Float.valueOf(returnMap.get("y").toString()).floatValue()
-                               // *VirtualScreenBean.vScreenResizeY
-                               // )/VirtualScreenBean.vScreenSpinnerHeight)/ 
Ampl_factor) ;
-                               //
-
-                               // logger.debug("x 1 "+returnMap.get("x"));
-
-                               Float scaleFactor = Float
-                                               
.valueOf(VirtualScreenBean.vScreenSpinnerWidth)
-                                               / 
Float.valueOf(VirtualScreenBean.vScreenResizeX);
-
-                               // logger.debug("x 1 scaleFactor "+scaleFactor);
-
-                               Float part_x1 = 
((Float.valueOf(returnMap.get("x").toString())
-                                               .floatValue() * scaleFactor) / 
Float
-                                               .valueOf(Ampl_factor));
-
-                               // logger.debug("x 1 part_x1 "+part_x1);
-
-                               Integer x = Math.round(part_x1
-                                               + 
VirtualScreenBean.vScreenSpinnerX);
-
-                               Integer y = Math
-                                               
.round(((Float.valueOf(returnMap.get("y").toString())
-                                                               .floatValue()
-                                                               * 
VirtualScreenBean.vScreenSpinnerHeight / VirtualScreenBean.vScreenResizeY) / 
Ampl_factor)
-                                                               + 
VirtualScreenBean.vScreenSpinnerY);
-
-                               // logger.debug("x|y "+x+" || "+y);
-
-                               robot.mouseMove(x, y);
-                               robot.mouseRelease(InputEvent.BUTTON1_MASK);
-
-                       } else if (action.equals("onmousedown")) {
-
-                               Robot robot = new Robot();
-
-                               Float scaleFactor = Float
-                                               
.valueOf(VirtualScreenBean.vScreenSpinnerWidth)
-                                               / 
Float.valueOf(VirtualScreenBean.vScreenResizeX);
-                               Float part_x1 = 
((Float.valueOf(returnMap.get("x").toString())
-                                               .floatValue() * scaleFactor) / 
Float
-                                               .valueOf(Ampl_factor));
-                               Integer x = Math.round(part_x1
-                                               + 
VirtualScreenBean.vScreenSpinnerX);
-                               Integer y = Math
-                                               
.round(((Float.valueOf(returnMap.get("y").toString())
-                                                               .floatValue()
-                                                               * 
VirtualScreenBean.vScreenSpinnerHeight / VirtualScreenBean.vScreenResizeY) / 
Ampl_factor)
-                                                               + 
VirtualScreenBean.vScreenSpinnerY);
-
-                               robot.mouseMove(x, y);
-                               robot.mousePress(InputEvent.BUTTON1_MASK);
-
-                       } else if (action.equals("mousePos")) {
-
-                               Robot robot = new Robot();
-
-                               Float scaleFactor = Float
-                                               
.valueOf(VirtualScreenBean.vScreenSpinnerWidth)
-                                               / 
Float.valueOf(VirtualScreenBean.vScreenResizeX);
-
-                               Float part_x1 = 
((Float.valueOf(returnMap.get("x").toString())
-                                               .floatValue() * scaleFactor) / 
Float
-                                               .valueOf(Ampl_factor));
-
-                               Integer x = Math.round(part_x1
-                                               + 
VirtualScreenBean.vScreenSpinnerX);
-
-                               Integer y = Math
-                                               
.round(((Float.valueOf(returnMap.get("y").toString())
-                                                               .floatValue()
-                                                               * 
VirtualScreenBean.vScreenSpinnerHeight / VirtualScreenBean.vScreenResizeY) / 
Ampl_factor)
-                                                               + 
VirtualScreenBean.vScreenSpinnerY);
-
-                               robot.mouseMove(x, y);
-
-                       } else if (action.equals("onkeydown")) {
-
-                               Robot robot = new Robot();
-
-                               Integer key = 
Integer.valueOf(returnMap.get("k").toString())
-                                               .intValue();
-
-                               // logger.debug("key onkeydown -1 "+key);
-                               boolean doAction = true;
-
-                               if (key == 221) {
-                                       key = 61;
-                               } else if (key == -1) {
-
-                                       String charValue = 
returnMap.get("c").toString();
-
-                                       // key = KeyEvent.VK_ADD;
-                                       doAction = false;
-
-                                       for (Iterator<Integer> iter = 
this.currentPressedKeys
-                                                       .keySet().iterator(); 
iter.hasNext();) {
-                                               Integer storedKey = iter.next();
-
-                                               robot.keyRelease(storedKey);
-
-                                       }
-
-                                       this.currentPressedKeys = new 
HashMap<Integer, Boolean>();
-
-                                       this.pressSpecialSign(charValue, robot);
-                               } else if (key == 188) {
-                                       key = 44;
-                               } else if (key == 189) {
-                                       key = 109;
-                               } else if (key == 190) {
-                                       key = 46;
-                               } else if (key == 191) {
-                                       key = 47;
-                               } else if (key == 13) {
-                                       key = KeyEvent.VK_ENTER;
-                               }
-
-                               // logger.debug("key onkeydown -2 "+key);
-
-                               if (doAction) {
-
-                                       this.currentPressedKeys.put(key, true);
-
-                                       robot.keyPress(key);
-                               }
-
-                       } else if (action.equals("onkeyup")) {
-
-                               Robot robot = new Robot();
-
-                               Integer key = 
Integer.valueOf(returnMap.get("k").toString())
-                                               .intValue();
-
-                               // logger.debug("key onkeyup 1- "+key);
-
-                               boolean doAction = true;
-
-                               if (key == 221) {
-                                       key = 61;
-                               } else if (key == -1) {
-                                       doAction = false;
-                               } else if (key == 188) {
-                                       key = 44;
-                               } else if (key == 189) {
-                                       key = 109;
-                               } else if (key == 190) {
-                                       key = 46;
-                               } else if (key == 191) {
-                                       key = 47;
-                               } else if (key == 13) {
-                                       key = KeyEvent.VK_ENTER;
-                               }
-
-                               // logger.debug("key onkeyup 2- "+key);
-
-                               if (doAction) {
-
-                                       if 
(this.currentPressedKeys.containsKey(key)) {
-                                               
this.currentPressedKeys.remove(key);
-
-                                               robot.keyRelease(key);
-
-                                       }
-
-                               }
-
-                       } else if (action.equals("paste")) {
-
-                               Robot robot = new Robot();
-
-                               String paste = 
returnMap.get("paste").toString();
-
-                               this.pressSpecialSign(paste, robot);
-
-                       } else if (action.equals("copy")) {
-
-                               Robot robot = new Robot();
-
-                               String paste = this.getHighlightedText(robot);
-
-                               HashMap<Integer, String> map = new 
HashMap<Integer, String>();
-                               map.put(0, "copiedText");
-                               map.put(1, paste);
-
-                               String clientId = 
returnMap.get("clientId").toString();
-
-                               // public synchronized int 
sendMessageWithClientById(Object
-                               // newMessage, String clientId)
-
-                               invoke("sendMessageWithClientById", new 
Object[] { map,
-                                               clientId }, this);
-
-                       } else if (action.equals("show")) {
-
-                               Robot robot = new Robot();
-
-                               String paste = this.getClipboardText();
-
-                               HashMap<Integer, String> map = new 
HashMap<Integer, String>();
-                               map.put(0, "copiedText");
-                               map.put(1, paste);
-
-                               String clientId = 
returnMap.get("clientId").toString();
-
-                               // public synchronized int 
sendMessageWithClientById(Object
-                               // newMessage, String clientId)
-
-                               invoke("sendMessageWithClientById", new 
Object[] { map,
-                                               clientId }, this);
-
-                       }
-
-                       // KeyEvent.VK
-                       // KeyEvent.
-
-               } catch (Exception err) {
-                       logger.error("[sendRemoteCursorEvent]", err);
-               }
-       }
-
-       public String getClipboardText() {
-               try {
-                       // get the system clipboard
-                       Clipboard systemClipboard = Toolkit.getDefaultToolkit()
-                                       .getSystemClipboard();
-
-                       // get the contents on the clipboard in a
-                       // transferable object
-                       Transferable clipboardContents = 
systemClipboard.getContents(null);
-
-                       // check if clipboard is empty
-                       if (clipboardContents == null) {
-
-                               // Clipboard is empty!!!
-                               return ("");
-
-                               // see if DataFlavor of
-                               // DataFlavor.stringFlavor is supported
-                       } else if (clipboardContents
-                                       
.isDataFlavorSupported(DataFlavor.stringFlavor)) {
-
-                               // return text content
-                               String returnText = (String) clipboardContents
-                                               
.getTransferData(DataFlavor.stringFlavor);
-
-                               return returnText;
-                       }
-
-                       return "";
-               } catch (UnsupportedFlavorException ufe) {
-                       ufe.printStackTrace();
-               } catch (IOException ioe) {
-                       ioe.printStackTrace();
-               }
-               return "";
-       }
-
-       private String getHighlightedText(Robot instance) {
-
-               try {
-
-                       // clippy.setContents( selection,selection );
-
-                       // logger.debug("os.name :: 
"+System.getProperty("os.name"));
-
-                       if 
(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") >= 0) {
-
-                               // logger.debug("IS WINDOWS");
-
-                               // dr�ckt STRG+C == copy
-                               instance.keyPress(KeyEvent.VK_CONTROL);
-                               Thread.sleep(200);
-                               instance.keyPress(KeyEvent.VK_C);
-                               Thread.sleep(200);
-                               instance.keyRelease(KeyEvent.VK_C);
-                               Thread.sleep(200);
-                               instance.keyRelease(KeyEvent.VK_CONTROL);
-                               Thread.sleep(200);
-
-                       } else {
-
-                               // logger.debug("IS MAC");
-
-                               // Macintosh simulate Copy
-                               instance.keyPress(157);
-                               Thread.sleep(200);
-                               instance.keyPress(67);
-                               Thread.sleep(200);
-                               instance.keyRelease(67);
-                               Thread.sleep(200);
-                               instance.keyRelease(157);
-                               Thread.sleep(200);
-
-                       }
-
-                       String charValue = this.getClipboardText();
-
-                       // 
JOptionPane.showMessageDialog(ScreenShare.instance.contentPane,
-                       // charValue);
-
-                       return charValue;
-
-               } catch (Exception ex) {
-                       ex.printStackTrace();
-               }
-               return "";
-               // clippy.setContents( clippysContent ,null); //zur�cksetzen 
vom alten
-               // Kontext
-       }
-
-       private void pressSpecialSign(String charValue, Robot instance) {
-               Clipboard clippy = 
Toolkit.getDefaultToolkit().getSystemClipboard();
-               // Transferable clippysContent = clippy.getContents( null );
-               try {
-
-                       Transferable transferableText = new 
StringSelection(charValue);
-                       clippy.setContents(transferableText, null);
-
-                       // logger.debug("os.name :: 
"+System.getProperty("os.name"));
-
-                       if 
(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") >= 0) {
-
-                               // logger.debug("IS WINDOWS");
-
-                               // dr�ckt STRG+V == einf�gen
-                               instance.keyPress(KeyEvent.VK_CONTROL);
-                               Thread.sleep(100);
-                               instance.keyPress(KeyEvent.VK_V);
-                               Thread.sleep(100);
-                               instance.keyRelease(KeyEvent.VK_V);
-                               Thread.sleep(100);
-                               instance.keyRelease(KeyEvent.VK_CONTROL);
-                               Thread.sleep(100);
-
-                       } else {
-
-                               // logger.debug("IS MAC");
-
-                               // Macintosh simulate Insert
-                               instance.keyPress(157);
-                               Thread.sleep(100);
-                               instance.keyPress(86);
-                               Thread.sleep(100);
-                               instance.keyRelease(86);
-                               Thread.sleep(100);
-                               instance.keyRelease(157);
-                               Thread.sleep(100);
-
-                       }
-
-                       // oder wenn das keine Exception wirft
-                       /*
-                        * instance.keyPress( KeyEvent.VK_PASTE ); 
instance.keyRelease(
-                        * KeyEvent.VK_PASTE );
-                        */
-
-                       // 
JOptionPane.showMessageDialog(ScreenShare.instance.contentPane,
-                       // charValue);
-
-               } catch (Exception ex) {
-                       ex.printStackTrace();
-               }
-               // clippy.setContents( clippysContent ,null); //zur�cksetzen 
vom alten
-               // Kontext
+               instance.onStreamEvent(notify);
        }
 
        public void resultReceived(IPendingServiceCall call) {
-               try {
-
-                       // logger.debug( "service call result: " + call );
-
-                       if (call.getServiceMethodName().equals("connect")) {
-
-                               isConnected = true;
-                               setConnectionAsSharingClient();
-
-                       } else if (call.getServiceMethodName().equals(
-                                       "setConnectionAsSharingClient")) {
-
-                               // logger.debug("call get Method Name 
"+call.getServiceMethodName());
-
-                               Object o = call.getResult();
-
-                               // logger.debug("Result Map Type 
"+o.getClass().getName());
-
-                               Map returnMap = (Map) o;
-
-                               // logger.debug("result 
"+returnMap.get("result"));
-
-                               // for (Iterator iter =
-                               // 
returnMap.keySet().iterator();iter.hasNext();) {
-                               // logger.debug("key "+iter.next());
-                               // }
-
-                               if (!Boolean.valueOf(
-                                               
returnMap.get("alreadyPublished").toString())
-                                               .booleanValue()) {
-
-                                       // logger.debug("Stream not yet started 
- do it ");
-
-                                       createStream(this);
-
-                               } else {
-
-                                       if (this.capture != null) {
-                                               this.capture.resetBuffer();
-                                       }
-
-                                       // logger.debug("The Stream was already 
started ");
-                               }
-
-                               if (returnMap.get("modus") != null) {
-                                       if (returnMap.get("modus").toString()
-                                                       
.equals("startStreaming")) {
-                                               
this.startButton.setEnabled(false);
-                                               
this.stopButton.setEnabled(true);
-                                       } else if 
(returnMap.get("modus").toString()
-                                                       
.equals("startRecording")) {
-                                               
this.startButtonRecording.setEnabled(false);
-                                               
this.stopButtonRecording.setEnabled(true);
-                                       }
-                               } else {
-                                       throw new Exception(
-                                                       "Could not aquire modus 
for event setConnectionAsSharingClient");
-                               }
-
-                       } else if 
(call.getServiceMethodName().equals("createStream")) {
-
-                               publishStreamId = (Integer) call.getResult();
-                               logger.debug("createPublishStream result stream 
id: "
-                                               + publishStreamId);
-                               logger.debug("publishing video by name: " + 
publishName);
-                               publish(publishStreamId, publishName, "live", 
this);
-
-                               logger.debug("setup capture thread");
-
-                               capture = new 
CaptureScreen(VirtualScreenBean.vScreenSpinnerX,
-                                               
VirtualScreenBean.vScreenSpinnerY,
-                                               
VirtualScreenBean.vScreenSpinnerWidth,
-                                               
VirtualScreenBean.vScreenSpinnerHeight,
-                                               
VirtualScreenBean.vScreenResizeX,
-                                               
VirtualScreenBean.vScreenResizeY);
-
-                               if (thread == null) {
-                                       thread = new Thread(capture);
-                                       thread.start();
-                               }
-                               capture.start();
-
-                       } else if 
(call.getServiceMethodName().equals("screenSharerAction")) {
-
-                               logger.debug("call ### get Method Name "
-                                               + call.getServiceMethodName());
-
-                               Object o = call.getResult();
-
-                               logger.debug("Result Map Type " + 
o.getClass().getName());
-
-                               Map returnMap = (Map) o;
-
-                               // logger.debug("result 
"+returnMap.get("result"));
-
-                               // for (Iterator iter =
-                               // 
returnMap.keySet().iterator();iter.hasNext();) {
-                               // logger.debug("key "+iter.next());
-                               // }
-
-                               if (returnMap.get("result").equals("stopAll")) {
-
-                                       logger.debug("Stopping to stream, there 
is neither a Desktop Sharing nor Recording anymore");
-
-                                       stopStream();
-
-                               }
-
-                               // logger.debug("Stop No Doubt!");
-                               // stopStream();
-
-                       } else if (call.getServiceMethodName().equals(
-                                       "setNewCursorPosition")) {
-
-                               // Do not do anything
-
-                       } else {
-
-                               logger.debug("Unkown method " + 
call.getServiceMethodName());
-
-                       }
-
-               } catch (Exception err) {
-                       logger.error("[resultReceived]", err);
-               }
-       }
-
-       // else if 
(call.getServiceMethodName().equals("sendRemoteCursorEvent")) {
-       //
-       // logger.debug("#### sendRemoteCursorEvent 
"+call.getServiceMethodName());
-       //
-       // Object o = call.getResult();
-       //
-       // logger.debug("Result Map Type "+o.getClass().getName());
-       //
-       // Map returnMap = (Map) o;
-       //
-       // logger.debug("result "+returnMap.get("result"));
-       //
-       // String action = returnMap.get("action").toString();
-       //
-       // if (action.equals("onmouseup")) {
-       //
-       // Robot robot = new Robot();
-       //
-       // Integer x = Math.round
-       // (Float.valueOf(returnMap.get("x").toString()).floatValue() / 
Ampl_factor)
-       // ;
-       // Integer y = Math.round
-       // (Float.valueOf(returnMap.get("y").toString()).floatValue() / 
Ampl_factor)
-       // ;
-       //
-       // logger.debug("x|y "+x+" || "+y);
-       //
-       // robot.mouseMove(x, y);
-       //
-       // }
-       //
-       //
-       //
-       // }
-
-       public void pushVideo(int len, byte[] video, long ts) throws 
IOException {
-
-               // logger.debug("PUSH VIDEO "+ts);
-
-               if (!startPublish)
-                       return;
-
-               if (buffer == null) {
-                       buffer = IoBuffer.allocate(1024);
-                       buffer.setAutoExpand(true);
-               }
-
-               buffer.clear();
-               buffer.put(video);
-               buffer.flip();
-
-               VideoData videoData = new VideoData(buffer);
-               videoData.setTimestamp((int) ts);
-
-               kt++;
-
-               // if ( kt < 10 ) {
-               // logger.debug( "+++ " + videoData );
-               // System.out.println( "+++ " + videoData);
-               // }
-
-               RTMPMessage rtmpMsg = RTMPMessage.build(videoData);
-               publishStreamData(publishStreamId, rtmpMsg);
-       }
-
-       // 
------------------------------------------------------------------------
-       //
-       // CaptureScreen
-       //
-       // 
------------------------------------------------------------------------
-
-       private final class CaptureScreen extends Object implements Runnable {
-               private volatile int x = 0;
-               private volatile int y = 0;
-               private volatile int resizeX;
-               private volatile int resizeY;
-
-               private volatile int width = resizeX; // 320
-               private volatile int height = resizeY; // 240
-
-               private int timeBetweenFrames = 1000; // frameRate
-
-               private volatile long timestamp = 0;
-
-               private volatile boolean active = true;
-               private volatile boolean stopped = false;
-               private byte[] previousItems = null;
-
-               // 
------------------------------------------------------------------------
-               //
-               // Constructor
-               //
-               // 
------------------------------------------------------------------------
-
-               public CaptureScreen(final int x, final int y, final int width,
-                               final int height, int resizeX, int resizeY) {
-
-                       this.x = x;
-                       this.y = y;
-                       this.width = width;
-                       this.height = height;
-                       this.resizeX = resizeX;
-                       this.resizeY = resizeY;
-
-                       if (VirtualScreenBean.vScreenScaleFactor
-                                       
.equals(ScreenShare.instance.label1090)) {
-                               timeBetweenFrames = 100;
-                       } else {
-                               timeBetweenFrames = 1000;
-                       }
-
-                       // logger.debug("############ timeBetweenFrames :: 
"+timeBetweenFrames);
-                       // logger.debug( "CaptureScreen: x=" + x + ", y=" + y + 
", w=" +
-                       // width + ", h=" + height + ",resizeX="+ resizeX + " 
resizeY= "
-                       // +resizeY );
-
-               }
-
-               // 
------------------------------------------------------------------------
-               //
-               // Public
-               //
-               // 
------------------------------------------------------------------------
-
-               public void setOrigin(final int x, final int y) {
-                       this.x = x;
-                       this.y = y;
-               }
-
-               public void start() {
-                       stopped = false;
-               }
-
-               public void stop() {
-                       stopped = true;
-               }
-
-               public void release() {
-                       active = false;
-               }
-
-               public void resetBuffer() {
-                       this.previousItems = null;
-               }
-
-               // 
------------------------------------------------------------------------
-               //
-               // Thread loop
-               //
-               // 
------------------------------------------------------------------------
-
-               public void run() {
-                       final int blockWidth = 32;
-                       final int blockHeight = 32;
-
-                       int frameCounter = 0;
-
-                       int orig_width = width;
-                       int orig_height = height;
-
-                       try {
-                               Robot robot = new Robot();
-
-                               this.previousItems = null;
-
-                               while (active) {
-
-                                       final long ctime = 
System.currentTimeMillis();
-
-                                       width = orig_width;
-                                       height = orig_height;
-
-                                       BufferedImage image = robot
-                                                       
.createScreenCapture(new Rectangle(x, y, width,
-                                                                       
height));
-
-                                       int width_new = resizeX;
-                                       int height_new = resizeY;
-                                       width = resizeX;
-                                       height = resizeY;
-                                       // Resize to 640*480
-                                       // Create new (blank) image of required 
(scaled) size
-                                       BufferedImage image_raw = new 
BufferedImage(width_new,
-                                                       height_new, 
BufferedImage.TYPE_INT_RGB);
-
-                                       Graphics2D graphics2D = 
image_raw.createGraphics();
-                                       graphics2D.setRenderingHint(
-                                                       
RenderingHints.KEY_INTERPOLATION,
-                                                       
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
-                                       graphics2D.drawImage(image, 0, 0, 
width_new, height_new,
-                                                       null);
-                                       graphics2D.dispose();
-
-                                       // End resize
-
-                                       int scaledWidth = width;
-                                       int scaledHeight = height;
-
-                                       byte[] current = toBGR(image_raw);
-                                       /* *
-                                        * if (scaleFactor != 1F) {
-                                        * 
-                                        * logger.debug("Calc new Scaled 
Instance ",scaleFactor);
-                                        * 
-                                        * scaledWidth =
-                                        * 
Float.valueOf(Math.round(width*scaleFactor)).intValue();
-                                        * scaledHeight =
-                                        * 
Float.valueOf(Math.round(height*scaleFactor)).intValue();
-                                        * 
-                                        * Image img = 
image_raw.getScaledInstance(scaledWidth,
-                                        * scaledHeight,Image.SCALE_SMOOTH);
-                                        * 
-                                        * BufferedImage image_scaled = new
-                                        * BufferedImage(scaledWidth,
-                                        * 
scaledHeight,BufferedImage.TYPE_3BYTE_BGR);
-                                        * 
-                                        * Graphics2D biContext = 
image_scaled.createGraphics();
-                                        * biContext.drawImage(img, 0, 0, 
null); current =
-                                        * toBGR(image_scaled); } else { 
current = toBGR(image_raw);
-                                        * }
-                                        */
-
-                                       try {
-                                               // timestamp += (1000000 / 
timeBetweenFrames);
-                                               timestamp += timeBetweenFrames;
-
-                                               // logger.debug("timestamp :: 
"+timestamp);
-
-                                               final byte[] screenBytes = 
encode(current,
-                                                               
this.previousItems, blockWidth, blockHeight,
-                                                               scaledWidth, 
scaledHeight);
-                                               pushVideo(screenBytes.length, 
screenBytes, timestamp);
-                                               this.previousItems = current;
-
-                                               if (++frameCounter % 100 == 0)
-                                                       this.previousItems = 
null;
-
-                                       } catch (Exception e) {
-                                               e.printStackTrace();
-                                       }
-
-                                       final int spent = (int) 
(System.currentTimeMillis() - ctime);
-
-                                       sendCursorStatus();
-
-                                       // logger.debug("Sleep :: 
"+(Math.max(0, timeBetweenFrames -
-                                       // spent)));
-
-                                       Thread.sleep(Math.max(0, 
timeBetweenFrames - spent));
-                               }
-                       } catch (Exception e) {
-                               e.printStackTrace();
-                       }
-               }
-
-               // 
------------------------------------------------------------------------
-               //
-               // Private
-               //
-               // 
------------------------------------------------------------------------
-
-               private byte[] toBGR(BufferedImage image) {
-                       final int width = image.getWidth();
-                       final int height = image.getHeight();
-
-                       byte[] buf = new byte[3 * width * height];
-
-                       final DataBuffer buffer = 
image.getData().getDataBuffer();
-
-                       for (int y = 0; y < height; y++) {
-
-                               for (int x = 0; x < width; x++) {
-                                       final int rgb = buffer.getElem(y * 
width + x);
-                                       final int offset = 3 * (y * width + x);
-
-                                       buf[offset + 0] = (byte) (rgb & 0xFF);
-                                       buf[offset + 1] = (byte) ((rgb >> 8) & 
0xFF);
-                                       buf[offset + 2] = (byte) ((rgb >> 16) & 
0xFF);
-                               }
-
-                       }
-
-                       return buf;
-               }
-
-               private byte[] encode(final byte[] current, final byte[] 
previous,
-                               final int blockWidth, final int blockHeight, 
final int width,
-                               final int height) throws Exception {
-                       ByteArrayOutputStream baos = new 
ByteArrayOutputStream(16 * 1024);
-
-                       if (previous == null) {
-                               baos.write(getTag(0x01, 0x03)); // keyframe 
(all cells)
-                       } else {
-                               baos.write(getTag(0x02, 0x03)); // frame 
(changed cells)
-                       }
-
-                       // write header
-                       final int wh = width + ((blockWidth / 16 - 1) << 12);
-                       final int hh = height + ((blockHeight / 16 - 1) << 12);
-
-                       writeShort(baos, wh);
-                       writeShort(baos, hh);
-
-                       // write content
-                       int y0 = height;
-                       int x0 = 0;
-                       int bwidth = blockWidth;
-                       int bheight = blockHeight;
-
-                       while (y0 > 0) {
-                               bheight = Math.min(y0, blockHeight);
-                               y0 -= bheight;
-
-                               bwidth = blockWidth;
-                               x0 = 0;
-
-                               while (x0 < width) {
-                                       bwidth = (x0 + blockWidth > width) ? 
width - x0
-                                                       : blockWidth;
-
-                                       final boolean changed = 
isChanged(current, previous, x0,
-                                                       y0, bwidth, bheight, 
width, height);
-
-                                       if (changed) {
-                                               ByteArrayOutputStream blaos = 
new ByteArrayOutputStream(
-                                                               4 * 1024);
-
-                                               DeflaterOutputStream dos = new 
DeflaterOutputStream(
-                                                               blaos);
-
-                                               for (int y = 0; y < bheight; 
y++) {
-                                                       dos.write(current, 3 * 
((y0 + bheight - y - 1)
-                                                                       * width 
+ x0), 3 * bwidth);
-                                               }
-
-                                               dos.finish();
-
-                                               final byte[] bbuf = 
blaos.toByteArray();
-                                               final int written = bbuf.length;
-
-                                               // write DataSize
-                                               writeShort(baos, written);
-                                               // write Data
-                                               baos.write(bbuf, 0, written);
-                                       } else {
-                                               // write DataSize
-                                               writeShort(baos, 0);
-                                       }
-                                       x0 += bwidth;
-                               }
-                       }
-
-                       return baos.toByteArray();
-               }
-
-               private void writeShort(OutputStream os, final int n) throws 
Exception {
-                       os.write((n >> 8) & 0xFF);
-                       os.write((n >> 0) & 0xFF);
-               }
-
-               public boolean isChanged(final byte[] current, final byte[] 
previous,
-                               final int x0, final int y0, final int 
blockWidth,
-                               final int blockHeight, final int width, final 
int height) {
-                       if (previous == null)
-                               return true;
-
-                       for (int y = y0, ny = y0 + blockHeight; y < ny; y++) {
-                               final int foff = 3 * (x0 + width * y);
-                               final int poff = 3 * (x0 + width * y);
-
-                               for (int i = 0, ni = 3 * blockWidth; i < ni; 
i++) {
-                                       if (current[foff + i] != previous[poff 
+ i])
-                                               return true;
-                               }
-                       }
-
-                       return false;
-               }
-
-               public int getTag(final int frame, final int codec) {
-                       return ((frame & 0x0F) << 4) + ((codec & 0x0F) << 0);
-               }
+               instance.resultReceived(call);
        }
 }


Reply via email to