You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/09/14 05:24:19 UTC

svn commit: r1760631 [4/5] - in /openmeetings/application: branches/3.1.x/openmeetings-flash/src/main/swf/base/remote/ branches/3.1.x/openmeetings-flash/src/main/swf/screensharing/ branches/3.1.x/openmeetings-screenshare/src/main/java/org/apache/openme...

Modified: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Modified: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Added: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.job;
+
+import org.apache.openmeetings.screenshare.CaptureScreen;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+@DisallowConcurrentExecution
+public class CursorJob implements Job {
+	public static final String CAPTURE_KEY = "capture";
+	
+	public CursorJob() {}
+	
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		JobDataMap data = context.getJobDetail().getJobDataMap();
+		CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
+		if (!capture.getSendFrameGuard()) {
+			capture.sendCursorStatus();
+		}
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.job;
+
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerHeight;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerWidth;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerY;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.awt.AWTException;
+import java.awt.Rectangle;
+import java.awt.Robot;
+
+import org.apache.openmeetings.screenshare.CaptureScreen;
+import org.apache.openmeetings.screenshare.ScreenV1Encoder;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.red5.server.net.rtmp.event.VideoData;
+import org.slf4j.Logger;
+
+@DisallowConcurrentExecution
+public class EncodeJob implements Job {
+	private static final Logger log = getLogger(EncodeJob.class);
+	public static final String CAPTURE_KEY = "capture";
+	Robot robot;
+	Rectangle screen = new Rectangle(spinnerX, spinnerY, spinnerWidth, spinnerHeight);
+	int[][] image = null;
+	
+	public EncodeJob() {
+		try {
+			robot = new Robot();
+		} catch (AWTException e) {
+			log.error("encode: Unexpected Error while creating robot", e);
+		}
+	}
+	
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		JobDataMap data = context.getJobDetail().getJobDataMap();
+		CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
+		
+		long start = 0;
+		if (log.isTraceEnabled()) {
+			start = System.currentTimeMillis();
+		}
+		image = ScreenV1Encoder.getImage(screen, robot);
+		if (log.isTraceEnabled()) {
+			log.trace(String.format("encode: Image was captured in %s ms, size %sk", System.currentTimeMillis() - start, 4 * image.length * image[0].length / 1024));
+			start = System.currentTimeMillis();
+		}
+		try {
+			VideoData vData = capture.getEncoder().encode(image);
+			if (log.isTraceEnabled()) {
+				long now = System.currentTimeMillis();
+				log.trace(String.format("encode: Image was encoded in %s ms, timestamp is %s", now - start, now - capture.getStartTime()));
+			}
+			capture.getFrames().offer(vData);
+			capture.getEncoder().createUnalteredFrame();
+		} catch (Exception e) {
+			log.error("Error while encoding: ", e);
+		}
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/OmKeyEvent.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/OmKeyEvent.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/OmKeyEvent.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/OmKeyEvent.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.job;
+
+import static java.lang.Boolean.TRUE;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+
+import static org.apache.openmeetings.screenshare.util.Util.getInt;
+import static org.slf4j.LoggerFactory.getLogger;
+
+public class OmKeyEvent {
+	private static final Logger log = getLogger(OmKeyEvent.class);
+	private static final Map<Integer, Integer> KEY_MAP = new HashMap<>();
+	static {
+		KEY_MAP.put(13, KeyEvent.VK_ENTER);
+		KEY_MAP.put(16, 0);
+		KEY_MAP.put(20, KeyEvent.VK_CAPS_LOCK);
+		KEY_MAP.put(46, KeyEvent.VK_DELETE);
+		KEY_MAP.put(110, KeyEvent.VK_DECIMAL);
+		KEY_MAP.put(186, KeyEvent.VK_SEMICOLON);
+		KEY_MAP.put(187, KeyEvent.VK_EQUALS);
+		KEY_MAP.put(188, KeyEvent.VK_COMMA);
+		KEY_MAP.put(189, KeyEvent.VK_MINUS);
+		KEY_MAP.put(190, KeyEvent.VK_PERIOD);
+		KEY_MAP.put(191, KeyEvent.VK_SLASH);
+		KEY_MAP.put(219, KeyEvent.VK_OPEN_BRACKET);
+		KEY_MAP.put(220, KeyEvent.VK_BACK_SLASH);
+		KEY_MAP.put(221, KeyEvent.VK_CLOSE_BRACKET);
+		KEY_MAP.put(222, KeyEvent.VK_QUOTE);
+	}
+	private boolean alt = false;
+	private boolean ctrl = false;
+	private boolean shift = false;
+	private int key = 0;
+	private char ch = 0;
+	
+	public OmKeyEvent(int key) {
+		this(key, false);
+	}
+
+	public OmKeyEvent(int key, boolean shift) {
+		this.key = key;
+		this.shift = shift;
+	}
+
+	public OmKeyEvent(Map<String, Object> obj) {
+		alt = TRUE.equals(obj.get("alt"));
+		ctrl = TRUE.equals(obj.get("ctrl"));
+		shift = TRUE.equals(obj.get("shift"));
+		ch = (char)getInt(obj, "char");
+		Integer _key = null;
+		int key = getInt(obj, "key");
+		if (key == 0) {
+			if (ch == 61) {
+				this.key = KeyEvent.VK_EQUALS;
+			}
+		} else {
+			_key = KEY_MAP.get(key);
+			this.key = _key == null ? key : _key;
+		}
+		log.debug("sequence:: shift {}, orig {} -> key {}, _key {}", shift, key, this.key, _key);
+	}
+
+	public int[] sequence() {
+		List<Integer> list = new ArrayList<>();
+		if (alt) {
+			list.add(KeyEvent.VK_ALT);
+		}
+		if (ctrl) {
+			list.add(KeyEvent.VK_CONTROL);
+		}
+		if (shift) {
+			list.add(KeyEvent.VK_SHIFT);
+		}
+		if (key != 0) {
+			list.add(key);
+		}
+		return list.stream().mapToInt(Integer::intValue).toArray();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + key;
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (!(obj instanceof OmKeyEvent)) {
+			return false;
+		}
+		OmKeyEvent other = (OmKeyEvent) obj;
+		if (key != other.key) {
+			return false;
+		}
+		return true;
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,194 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.job;
+
+import static java.awt.Toolkit.getDefaultToolkit;
+import static java.awt.datatransfer.DataFlavor.stringFlavor;
+import static org.apache.openmeetings.screenshare.Core.Ampl_factor;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerHeight;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerWidth;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerY;
+import static org.apache.openmeetings.screenshare.util.Util.getFloat;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.awt.AWTException;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.openmeetings.screenshare.Core;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+
+@DisallowConcurrentExecution
+public class RemoteJob implements Job {
+	private static final Logger log = getLogger(RemoteJob.class);
+	private static final boolean isWindows = System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") > -1;
+	public static final String CORE_KEY = "core";
+	private Robot robot = null;
+	
+	public RemoteJob() {
+		try {
+			robot = new Robot();
+			robot.setAutoDelay(5);
+		} catch (AWTException e) {
+			log.error("Unexpected error while creating Robot", e);
+		}
+	}
+
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		JobDataMap data = context.getJobDetail().getJobDataMap();
+		Core core = (Core)data.get(CORE_KEY);
+		try {
+			Map<String, Object> obj = null;
+			while ((obj = core.getRemoteEvents().poll(1, TimeUnit.MILLISECONDS)) != null) { 
+				String action = "" + obj.get("action");
+				log.trace("Action polled:: {}, count: {}", action, core.getRemoteEvents().size());
+
+				if (action.equals("onmouseup")) {
+					Point p = getCoordinates(obj);
+					robot.mouseMove(p.x, p.y);
+					robot.mouseRelease(InputEvent.BUTTON1_MASK);
+				} else if (action.equals("onmousedown")) {
+					Point p = getCoordinates(obj);
+					robot.mouseMove(p.x, p.y);
+					robot.mousePress(InputEvent.BUTTON1_MASK);
+				} else if (action.equals("mousePos")) {
+					Point p = getCoordinates(obj);
+					robot.mouseMove(p.x, p.y);
+				} else if (action.equals("keyDown")) {
+					pressSequence(new OmKeyEvent(obj).sequence());
+				} else if (action.equals("paste")) {
+					String paste = obj.get("paste").toString();
+					pressSpecialSign(paste);
+				} else if (action.equals("copy")) {
+					String paste = getHighlightedText();
+
+					Map<Integer, String> map = new HashMap<Integer, String>();
+					map.put(0, "copiedText");
+					map.put(1, paste);
+
+					String clientId = obj.get("clientId").toString();
+
+					core.getInstance().invoke("sendMessageWithClientById", new Object[]{map, clientId}, core);
+				} else if (action.equals("show")) {
+					String paste = getClipboardText();
+
+					Map<Integer, String> map = new HashMap<Integer, String>();
+					map.put(0, "copiedText");
+					map.put(1, paste);
+
+					String clientId = obj.get("clientId").toString();
+
+					core.getInstance().invoke("sendMessageWithClientById", new Object[]{map, clientId}, core);
+				}
+			}
+		} catch (Exception err) {
+			log.error("[sendRemoteCursorEvent]", err);
+		}
+	}
+
+	private void pressSequence(int... codes) throws InterruptedException {
+		for (int i = 0; i < codes.length; ++i) {
+			robot.keyPress(codes[i]);
+		}
+		for (int i = codes.length - 1; i > -1; --i) {
+			robot.keyRelease(codes[i]);
+		}
+	}
+
+	private String getHighlightedText() {
+		try {
+			if (isWindows) {
+				// pressing STRG+C == copy
+				pressSequence(KeyEvent.VK_CONTROL, KeyEvent.VK_C);
+			} else {
+				// Macintosh simulate Copy
+				pressSequence(157, 67);
+			}
+			return getClipboardText();
+		} catch (Exception e) {
+			log.error("Unexpected exception while getting highlighted text", e);
+		}
+		return "";
+	}
+
+	public String getClipboardText() {
+		try {
+			// get the system clipboard
+			Clipboard systemClipboard = 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!!!
+			} else if (clipboardContents.isDataFlavorSupported(stringFlavor)) {
+				// see if DataFlavor of DataFlavor.stringFlavor is supported
+				// return text content
+				String returnText = (String) clipboardContents.getTransferData(stringFlavor);
+				return returnText;
+			}
+		} catch (Exception e) {
+			log.error("Unexpected exception while getting clipboard text", e);
+		}
+		return "";
+	}
+
+	private void pressSpecialSign(String charValue) {
+		Clipboard clippy = getDefaultToolkit().getSystemClipboard();
+		try {
+			Transferable transferableText = new StringSelection(charValue);
+			clippy.setContents(transferableText, null);
+
+			if (isWindows) {
+				// pressing STRG+V == insert-mode
+				pressSequence(KeyEvent.VK_CONTROL, KeyEvent.VK_V);
+			} else {
+				// Macintosh simulate Insert
+				pressSequence(157, 86);
+			}
+		} catch (Exception e) {
+			log.error("Unexpected exception while pressSpecialSign", e);
+		}
+	}
+
+	private Point getCoordinates(Map<String, Object> obj) {
+		float scaleFactorX = spinnerWidth / (Ampl_factor * resizeX);
+		float scaleFactorY = spinnerHeight / (Ampl_factor * resizeY);
+
+		int x = Math.round(scaleFactorX * getFloat(obj, "x") + spinnerX);
+		int y = Math.round(scaleFactorY * getFloat(obj, "y") + spinnerY);
+		return new Point(x, y);
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/SendJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/SendJob.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/SendJob.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/SendJob.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.job;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.io.IOException;
+
+import org.apache.openmeetings.screenshare.CaptureScreen;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.red5.server.net.rtmp.event.VideoData;
+import org.slf4j.Logger;
+
+public class SendJob implements Job {
+	private static final Logger log = getLogger(SendJob.class);
+	public static final String CAPTURE_KEY = "capture";
+	public SendJob() {}
+	
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		JobDataMap data = context.getJobDetail().getJobDataMap();
+		CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
+		capture.setSendFrameGuard(true);
+		if (log.isTraceEnabled()) {
+			long real = System.currentTimeMillis() - capture.getStartTime();
+			log.trace(String.format("send: Enter method, timestamp: %s, real: %s, diff: %s", capture.getTimestamp(), real, real - capture.getTimestamp().get()));
+		}
+		VideoData f = capture.getFrames().poll();
+		if (log.isTraceEnabled()) {
+			log.trace(String.format("send: Getting %s image", f == null ? "DUMMY" : "CAPTURED"));
+		}
+		f = f == null ? capture.getEncoder().getUnalteredFrame() : f;
+		if (f != null) {
+			try {
+				capture.pushVideo(f, capture.getTimestamp().get());
+				if (log.isTraceEnabled()) {
+					long real = System.currentTimeMillis() - capture.getStartTime();
+					log.trace(String.format("send: Sending video %sk, timestamp: %s, real: %s, diff: %s", f.getData().capacity() / 1024, capture.getTimestamp(), real, real - capture.getTimestamp().get()));
+				}
+				capture.getTimestamp().addAndGet(capture.getTimestampDelta());
+				if (log.isTraceEnabled()) {
+					log.trace(String.format("send: new timestamp: %s", capture.getTimestamp()));
+				}
+			} catch (IOException e) {
+				log.error("Error while sending: ", e);
+			}
+		} else if (log.isTraceEnabled()) {
+			log.trace(String.format("send: nothing to send"));
+		}
+		capture.setSendFrameGuard(false);
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/util/Util.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/util/Util.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/util/Util.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/util/Util.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.util;
+
+import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME;
+import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_SKIP_UPDATE_CHECK;
+
+import java.util.Map;
+import java.util.Properties;
+
+public class Util {
+	public static Properties getQurtzProps(String name) {
+		final Properties p = new Properties();
+		p.put(PROP_SCHED_SKIP_UPDATE_CHECK, "true");
+		p.put(PROP_SCHED_INSTANCE_NAME, name);
+		p.put("org.quartz.threadPool.threadCount", "10");
+		return p;
+	}
+
+	public static String getString(Map<String, Object> map, String key) {
+		return String.valueOf(map.get(key));
+	}
+
+	public static Double getDouble(Map<String, Object> map, String key) {
+		return Double.valueOf(getString(map, key));
+	}
+
+	public static int getInt(Map<String, Object> map, String key) {
+		return getDouble(map, key).intValue();
+	}
+
+	public static float getFloat(Map<String, Object> map, String key) {
+		return getDouble(map, key).floatValue();
+	}
+
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp Wed Sep 14 05:24:18 2016
@@ -36,7 +36,7 @@
 		<jar href="bcprov-jdk15on-1.55.jar" main="true"/>
 		<jar href="openmeetings-screenshare-${project.version}-full.jar" main="true"/>
 	</resources>
-	<application-desc main-class='org.apache.openmeetings.screen.webstart.CoreScreenShare'>
+	<application-desc main-class='org.apache.openmeetings.screenshare.Core'>
 		<argument>$url</argument>
 		<argument>$publicSid</argument>
 		<argument>$labels</argument>

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/AudioTone.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/AudioTone.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/AudioTone.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/AudioTone.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioSystem;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/BaseScreenEncoder.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/BaseScreenEncoder.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/BaseScreenEncoder.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/BaseScreenEncoder.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java Wed Sep 14 05:24:18 2016
@@ -16,33 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.FPS;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerHeight;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerWidth;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerX;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerY;
+import static org.apache.openmeetings.screenshare.Core.QUARTZ_GROUP_NAME;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.FPS;
+import static org.apache.openmeetings.screenshare.util.Util.getQurtzProps;
 import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
-import static org.quartz.impl.StdSchedulerFactory.PROP_SCHED_SKIP_UPDATE_CHECK;
 import static org.slf4j.LoggerFactory.getLogger;
 
-import java.awt.AWTException;
-import java.awt.Rectangle;
-import java.awt.Robot;
 import java.io.IOException;
-import java.util.Properties;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.quartz.DisallowConcurrentExecution;
-import org.quartz.Job;
+import org.apache.openmeetings.screenshare.job.CursorJob;
+import org.apache.openmeetings.screenshare.job.EncodeJob;
+import org.apache.openmeetings.screenshare.job.SendJob;
 import org.quartz.JobBuilder;
-import org.quartz.JobDataMap;
 import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
@@ -55,16 +46,15 @@ import org.red5.server.net.rtmp.event.Vi
 import org.red5.server.stream.message.RTMPMessage;
 import org.slf4j.Logger;
 
-class CaptureScreen extends Thread {
+public class CaptureScreen extends Thread {
 	private static final Logger log = getLogger(CaptureScreen.class);
-	private final static String QUARTZ_GROUP_NAME = "ScreenShare";
 	private final static String QUARTZ_CURSOR_TRIGGER_NAME = "CursorTrigger";
 	private final static String QUARTZ_CURSOR_JOB_NAME = "CursorJob";
-	private CoreScreenShare core;
-	private int timeBetweenFrames;
+	private Core core;
+	private int timestampDelta;
 	private volatile AtomicInteger timestamp = new AtomicInteger(0);
 	private volatile AtomicBoolean sendFrameGuard = new AtomicBoolean(false);
-	private long timeCaptureStarted = 0;
+	private long startTime = 0;
 	private volatile boolean active = true;
 	private IScreenEncoder se;
 	private IScreenShare client;
@@ -76,7 +66,7 @@ class CaptureScreen extends Thread {
 	private boolean startPublish = false;
 	private Scheduler _scheduler;
 
-	public CaptureScreen(CoreScreenShare coreScreenShare, IScreenShare client, String host, String app, int port) {
+	public CaptureScreen(Core coreScreenShare, IScreenShare client, String host, String app, int port) {
 		core = coreScreenShare;
 		this.client = client;
 		this.host = host;
@@ -86,12 +76,9 @@ class CaptureScreen extends Thread {
 
 	private Scheduler getScheduler() {
 		if (_scheduler == null) {
-			final Properties p = new Properties();
-			p.put(PROP_SCHED_SKIP_UPDATE_CHECK, "true");
-			p.put("org.quartz.threadPool.threadCount", "10");
 			try {
-				SchedulerFactory sf = new StdSchedulerFactory(p);
-				_scheduler = sf.getScheduler();
+				SchedulerFactory schdlrFactory = new StdSchedulerFactory(getQurtzProps("CaptureScreen"));
+				_scheduler = schdlrFactory.getScheduler();
 			} catch (SchedulerException e) {
 				log.error("Unexpected error while creating scheduler", e);
 			}
@@ -110,7 +97,7 @@ class CaptureScreen extends Thread {
 		}
 		active = false;
 		timestamp = new AtomicInteger(0);
-		timeCaptureStarted = 0;
+		startTime = 0;
 	}
 
 	@Override
@@ -120,20 +107,20 @@ class CaptureScreen extends Thread {
 				Thread.sleep(60);
 			}
 
-			timeBetweenFrames = 1000 / FPS;
+			timestampDelta = 1000 / FPS;
 			se = new ScreenV1Encoder(3 * FPS); //send keyframe every 3 seconds
-			timeCaptureStarted = System.currentTimeMillis();
+			startTime = System.currentTimeMillis();
 
 			JobDetail encodeJob = JobBuilder.newJob(EncodeJob.class).withIdentity("EncodeJob", QUARTZ_GROUP_NAME).build();
 			encodeJob.getJobDataMap().put(EncodeJob.CAPTURE_KEY, this);
 			Trigger encodeTrigger = TriggerBuilder.newTrigger()
 					.withIdentity("EncodeTrigger", QUARTZ_GROUP_NAME)
-					.withSchedule(simpleSchedule().withIntervalInMilliseconds(timeBetweenFrames).repeatForever())
+					.withSchedule(simpleSchedule().withIntervalInMilliseconds(timestampDelta).repeatForever())
 					.build();
 			JobDetail sendJob = JobBuilder.newJob(SendJob.class).withIdentity("SendJob", QUARTZ_GROUP_NAME).build();
 			Trigger sendTrigger = TriggerBuilder.newTrigger()
 					.withIdentity("SendTrigger", QUARTZ_GROUP_NAME)
-					.withSchedule(simpleSchedule().withIntervalInMilliseconds(timeBetweenFrames).repeatForever())
+					.withSchedule(simpleSchedule().withIntervalInMilliseconds(timestampDelta).repeatForever())
 					.build();
 			sendJob.getJobDataMap().put(SendJob.CAPTURE_KEY, this);
 
@@ -163,105 +150,7 @@ class CaptureScreen extends Thread {
 	}
 	*/
 	
-	@DisallowConcurrentExecution
-	public static class EncodeJob implements Job {
-		private static final String CAPTURE_KEY = "capture";
-		Robot robot;
-		Rectangle screen = new Rectangle(spinnerX, spinnerY, spinnerWidth, spinnerHeight);
-		int[][] image = null;
-		
-		public EncodeJob() {
-			try {
-				robot = new Robot();
-			} catch (AWTException e) {
-				log.error("encode: Unexpected Error while creating robot", e);
-			}
-		}
-		
-		@Override
-		public void execute(JobExecutionContext context) throws JobExecutionException {
-			JobDataMap data = context.getJobDetail().getJobDataMap();
-			CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
-			
-			long start = 0;
-			if (log.isTraceEnabled()) {
-				start = System.currentTimeMillis();
-			}
-			image = ScreenV1Encoder.getImage(screen, robot);
-			if (log.isTraceEnabled()) {
-				log.trace(String.format("encode: Image was captured in %s ms, size %sk", System.currentTimeMillis() - start, 4 * image.length * image[0].length / 1024));
-				start = System.currentTimeMillis();
-			}
-			try {
-				VideoData vData = capture.se.encode(image);
-				if (log.isTraceEnabled()) {
-					long now = System.currentTimeMillis();
-					log.trace(String.format("encode: Image was encoded in %s ms, timestamp is %s", now - start, now - capture.timeCaptureStarted));
-				}
-				capture.frames.offer(vData);
-				capture.se.createUnalteredFrame();
-			} catch (Exception e) {
-				log.error("Error while encoding: ", e);
-			}
-		}
-	}
-	
-	public static class SendJob implements Job {
-		private static final String CAPTURE_KEY = "capture";
-		public SendJob() {}
-		
-		@Override
-		public void execute(JobExecutionContext context) throws JobExecutionException {
-			JobDataMap data = context.getJobDetail().getJobDataMap();
-			CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
-			capture.sendFrameGuard.set(true);
-			if (log.isTraceEnabled()) {
-				long real = System.currentTimeMillis() - capture.timeCaptureStarted;
-				log.trace(String.format("send: Enter method, timestamp: %s, real: %s, diff: %s", capture.timestamp, real, real - capture.timestamp.get()));
-			}
-			VideoData f = capture.frames.poll();
-			if (log.isTraceEnabled()) {
-				log.trace(String.format("send: Getting %s image", f == null ? "DUMMY" : "CAPTURED"));
-			}
-			f = f == null ? capture.se.getUnalteredFrame() : f;
-			if (f != null) {
-				try {
-					capture.pushVideo(f, capture.timestamp.get());
-					if (log.isTraceEnabled()) {
-						long real = System.currentTimeMillis() - capture.timeCaptureStarted;
-						log.trace(String.format("send: Sending video %sk, timestamp: %s, real: %s, diff: %s", f.getData().capacity() / 1024, capture.timestamp, real, real - capture.timestamp.get()));
-					}
-					capture.timestamp.addAndGet(capture.timeBetweenFrames);
-					if (log.isTraceEnabled()) {
-						log.trace(String.format("send: new timestamp: %s", capture.timestamp));
-					}
-				} catch (IOException e) {
-					log.error("Error while sending: ", e);
-				}
-			} else if (log.isTraceEnabled()) {
-				log.trace(String.format("send: nothing to send"));
-			}
-			capture.sendFrameGuard.set(false);
-		}
-	}
-	
-	@DisallowConcurrentExecution
-	public static class CursorJob implements Job {
-		private static final String CAPTURE_KEY = "capture";
-		
-		public CursorJob() {}
-		
-		@Override
-		public void execute(JobExecutionContext context) throws JobExecutionException {
-			JobDataMap data = context.getJobDetail().getJobDataMap();
-			CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
-			if (!capture.sendFrameGuard.get()) {
-				capture.core.sendCursorStatus();
-			}
-		}
-	}
-	
-	private void pushVideo(VideoData data, int ts) throws IOException {
+	public void pushVideo(VideoData data, int ts) throws IOException {
 		if (startPublish) {
 			if (Red5.getConnectionLocal() == null) {
 				Red5.setConnectionLocal(client.getConnection());
@@ -295,6 +184,38 @@ class CaptureScreen extends Thread {
 		this.startPublish = startPublish;
 	}
 
+	public IScreenEncoder getEncoder() {
+		return se;
+	}
+
+	public ArrayBlockingQueue<VideoData> getFrames() {
+		return frames;
+	}
+
+	public void setSendFrameGuard(boolean b) {
+		sendFrameGuard.set(b);
+	}
+
+	public boolean getSendFrameGuard() {
+		return sendFrameGuard.get();
+	}
+
+	public AtomicInteger getTimestamp() {
+		return timestamp;
+	}
+
+	public long getStartTime() {
+		return startTime;
+	}
+
+	public int getTimestampDelta() {
+		return timestampDelta;
+	}
+
+	public void sendCursorStatus() {
+		core.sendCursorStatus();
+	}
+
 	public void setSendCursor(boolean sendCursor) {
 		try {
 			Scheduler s = getScheduler();

Copied: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java (from r1760627, openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java)
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java?p2=openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java&p1=openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java&r1=1760627&r2=1760631&rev=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java Wed Sep 14 05:24:18 2016
@@ -16,32 +16,36 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
-import static java.awt.Toolkit.getDefaultToolkit;
-import static java.awt.datatransfer.DataFlavor.stringFlavor;
 import static java.lang.Boolean.TRUE;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.resizeY;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerHeight;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerWidth;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerX;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.spinnerY;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerHeight;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerWidth;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerY;
+import static org.apache.openmeetings.screenshare.util.Util.getQurtzProps;
+import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.awt.MouseInfo;
 import java.awt.Point;
-import java.awt.Robot;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
 import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
 
-import org.apache.openmeetings.screen.webstart.gui.ScreenSharerFrame;
+import org.apache.openmeetings.screenshare.gui.ScreenSharerFrame;
+import org.apache.openmeetings.screenshare.job.RemoteJob;
+import org.quartz.JobBuilder;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.SchedulerFactory;
+import org.quartz.Trigger;
+import org.quartz.TriggerBuilder;
+import org.quartz.impl.StdSchedulerFactory;
 import org.red5.client.net.rtmp.INetStreamEventHandler;
 import org.red5.io.utils.ObjectMap;
 import org.red5.server.api.Red5;
@@ -57,8 +61,12 @@ import org.red5.server.net.rtmp.status.S
 import org.slf4j.Logger;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 
-public class CoreScreenShare implements IPendingServiceCallback, INetStreamEventHandler {
-	private static final Logger log = getLogger(CoreScreenShare.class);
+public class Core implements IPendingServiceCallback, INetStreamEventHandler {
+	private static final Logger log = getLogger(Core.class);
+	public static float Ampl_factor = 1f;
+	final static String QUARTZ_GROUP_NAME = "ScreenShare";
+	final static String QUARTZ_REMOTE_JOB_NAME = "RemoteJob";
+	final static String QUARTZ_REMOTE_TRIGGER_NAME = "RemoteTrigger";
 
 	enum Protocol {
 		rtmp, rtmpt, rtmpe, rtmps
@@ -82,16 +90,16 @@ public class CoreScreenShare implements
 	private boolean allowRecording = true;
 	private boolean allowPublishing = true;
 
-	private boolean startStreaming = false;
+	private boolean startSharing = false;
 	private boolean startRecording = false;
 	private boolean startPublishing = false;
-	public float Ampl_factor = 1f;
 	public boolean isConnected = false;
 	private boolean readyToRecord = false;
 	private boolean audioNotify = false;
 	private boolean remoteEnabled = true;
-
-	public Map<Integer, Boolean> currentPressedKeys = new HashMap<Integer, Boolean>();
+	private SchedulerFactory schdlrFactory;
+	private Scheduler schdlr;
+	private LinkedBlockingQueue<Map<String, Object>> remoteEvents = new LinkedBlockingQueue<>();
 
 	private CaptureScreen getCapture() {
 		if (_capture == null) {
@@ -105,7 +113,7 @@ public class CoreScreenShare implements
 	//
 	// ------------------------------------------------------------------------
 
-	public CoreScreenShare(String[] args) {
+	public Core(String[] args) {
 		try {
 			System.setProperty("org.terracotta.quartz.skipUpdateCheck", "true");
 			for (String arg : args) {
@@ -132,9 +140,7 @@ public class CoreScreenShare implements
 					textArray = labelTexts.split(";");
 
 					log.debug("labelTexts :: " + labelTexts);
-
 					log.debug("textArray Length " + textArray.length);
-
 					for (int i = 0; i < textArray.length; i++) {
 						log.debug(i + " :: " + textArray[i]);
 					}
@@ -166,6 +172,15 @@ public class CoreScreenShare implements
 			} else {
 				System.exit(0);
 			}
+			schdlrFactory = new StdSchedulerFactory(getQurtzProps("CoreScreenShare"));
+			schdlr = schdlrFactory.getScheduler();
+			JobDetail remoteJob = JobBuilder.newJob(RemoteJob.class).withIdentity(QUARTZ_REMOTE_JOB_NAME, QUARTZ_GROUP_NAME).build();
+			Trigger cursorTrigger = TriggerBuilder.newTrigger()
+					.withIdentity(QUARTZ_REMOTE_TRIGGER_NAME, QUARTZ_GROUP_NAME)
+					.withSchedule(simpleSchedule().withIntervalInMilliseconds(50).repeatForever())
+					.build();
+			remoteJob.getJobDataMap().put(RemoteJob.CORE_KEY, this);
+			schdlr.scheduleJob(remoteJob, cursorTrigger);
 
 			createWindow(textArray);
 		} catch (Exception err) {
@@ -174,7 +189,7 @@ public class CoreScreenShare implements
 	}
 
 	public static void main(String[] args) {
-		new CoreScreenShare(args);
+		new Core(args);
 	}
 
 	// ------------------------------------------------------------------------
@@ -243,7 +258,7 @@ public class CoreScreenShare implements
 			map.put("screenHeight", scaledHeight);
 			map.put("publishName", publishName);
 			map.put("startRecording", startRecording);
-			map.put("startStreaming", startStreaming);
+			map.put("startStreaming", startSharing);
 			map.put("startPublishing", startPublishing);
 			map.put("publishingHost", frame.getPublishHost());
 			map.put("publishingApp", frame.getPublishApp());
@@ -258,8 +273,13 @@ public class CoreScreenShare implements
 		}
 	}
 
-	public void streamingStart() {
-		startStreaming = true;
+	public void sharingStart() {
+		try {
+			schdlr.start();
+		} catch (SchedulerException e) {
+			log.error("[schdlr.start]", e);
+		}
+		startSharing = true;
 		captureScreenStart();
 	}
 	
@@ -295,8 +315,13 @@ public class CoreScreenShare implements
 		}
 	}
 
-	public void streamingStop() {
-		startStreaming = false;
+	public void sharingStop() {
+		try {
+			schdlr.standby();
+		} catch (SchedulerException e) {
+			log.error("[schdlr.standby]", e);
+		}
+		startSharing = false;
 		captureScreenStop("stopStreaming");
 	}
 	
@@ -327,18 +352,23 @@ public class CoreScreenShare implements
 		}
 	}
 
-	public void stopStreaming() {
-		frame.setSharingStatus(false, !startPublishing && !startRecording && !startStreaming);
-		startStreaming = false;
+	public void stopSharing() {
+		try {
+			schdlr.standby();
+		} catch (SchedulerException e) {
+			log.error("[schdlr.standby]", e);
+		}
+		frame.setSharingStatus(false, !startPublishing && !startRecording && !startSharing);
+		startSharing = false;
 	}
 	
 	public void stopRecording() {
-		frame.setRecordingStatus(false, !startPublishing && !startRecording && !startStreaming);
+		frame.setRecordingStatus(false, !startPublishing && !startRecording && !startSharing);
 		startRecording = false;
 	}
 	
 	public void stopPublishing() {
-		frame.setPublishingStatus(false, !startPublishing && !startRecording && !startStreaming);
+		frame.setPublishingStatus(false, !startPublishing && !startRecording && !startSharing);
 		startPublishing = false;
 		if (publishClient != null) {
 			publishClient.disconnect();
@@ -383,7 +413,7 @@ public class CoreScreenShare implements
 		try {
 			log.debug("ScreenShare stopStream");
 
-			stopStreaming();
+			stopSharing();
 			stopRecording();
 			stopPublishing();
 			isConnected = false;
@@ -417,239 +447,16 @@ public class CoreScreenShare implements
 		return TRUE.equals(Boolean.valueOf("" + b));
 	}
 	
-	private static String getString(Map<String, Object> map, String key) {
-		return String.valueOf(map.get(key));
-	}
-
-	private static Double getDouble(Map<String, Object> map, String key) {
-		return Double.valueOf(getString(map, key));
-	}
-	
-	private static int getInt(Map<String, Object> map, String key) {
-		return getDouble(map, key).intValue();
-	}
-	
-	private static float getFloat(Map<String, Object> map, String key) {
-		return getDouble(map, key).floatValue();
-	}
-	
-	private Point getCoordinates(Map<String, Object> returnMap) {
-		float scaleFactorX = spinnerWidth / (Ampl_factor * resizeX);
-		float scaleFactorY = spinnerHeight / (Ampl_factor * resizeY);
-
-		int x = Math.round(scaleFactorX * getFloat(returnMap, "x") + spinnerX);
-		int y = Math.round(scaleFactorY * getFloat(returnMap, "y") + spinnerY);
-		return new Point(x, y);
-	}
-	
-	public void sendRemoteCursorEvent(Object obj) {
-		try {
-			if (!remoteEnabled) {
-				return;
-			}
-			log.trace("#### sendRemoteCursorEvent ");
-			log.trace("Result Map Type "+obj.getClass().getName());
-
-			@SuppressWarnings("unchecked")
-			Map<String, Object> returnMap = (Map<String, Object>)obj;
-
-			String action = "" + returnMap.get("action");
-
-			if (action.equals("onmouseup")) {
-				Robot robot = new Robot();
-				
-				Point p = getCoordinates(returnMap);
-				robot.mouseMove(p.x, p.y);
-				robot.mouseRelease(InputEvent.BUTTON1_MASK);
-			} else if (action.equals("onmousedown")) {
-				Robot robot = new Robot();
-
-				Point p = getCoordinates(returnMap);
-				robot.mouseMove(p.x, p.y);
-				robot.mousePress(InputEvent.BUTTON1_MASK);
-			} else if (action.equals("mousePos")) {
-				Robot robot = new Robot();
-
-				Point p = getCoordinates(returnMap);
-				robot.mouseMove(p.x, p.y);
-			} else if (action.equals("onkeydown")) {
-				Robot robot = new Robot();
-
-				int key = getInt(returnMap, "k");
-
-				log.trace("KEY EVENT!!!!!  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 (Integer storedKey : currentPressedKeys.keySet()) {
-						robot.keyRelease(storedKey);
-					}
-
-					currentPressedKeys.clear();
-
-					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;
-				}
-
-				if (doAction) {
-					currentPressedKeys.put(key, true);
-
-					robot.keyPress(key);
-				}
-			} else if (action.equals("onkeyup")) {
-				Robot robot = new Robot();
-
-				int key = getInt(returnMap, "k");
-
-				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;
-				}
-
-				log.trace("KEY EVENT!!!!!  key onkeyup 2- " + key);
-
-				if (doAction) {
-					if (currentPressedKeys.containsKey(key)) {
-						currentPressedKeys.remove(key);
-
-						robot.keyRelease(key);
-					}
-				}
-			} else if (action.equals("paste")) {
-				Robot robot = new Robot();
-
-				String paste = returnMap.get("paste").toString();
-
-				pressSpecialSign(paste, robot);
-			} else if (action.equals("copy")) {
-				Robot robot = new Robot();
-
-				String paste = this.getHighlightedText(robot);
-
-				Map<Integer, String> map = new HashMap<Integer, String>();
-				map.put(0, "copiedText");
-				map.put(1, paste);
-
-				String clientId = returnMap.get("clientId").toString();
-
-				instance.invoke("sendMessageWithClientById", new Object[]{map, clientId}, this);
-			} else if (action.equals("show")) {
-				String paste = getClipboardText();
-
-				Map<Integer, String> map = new HashMap<Integer, String>();
-				map.put(0, "copiedText");
-				map.put(1, paste);
-
-				String clientId = returnMap.get("clientId").toString();
-
-				instance.invoke("sendMessageWithClientById", new Object[]{map, clientId}, this);
-			}
-		} catch (Exception err) {
-			log.error("[sendRemoteCursorEvent]", err);
-		}
-	}
-
-	public String getClipboardText() {
-		try {
-			// get the system clipboard
-			Clipboard systemClipboard = 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(stringFlavor)) {
-				// return text content
-				String returnText = (String) clipboardContents.getTransferData(stringFlavor);
-
-				return returnText;
-			}
-
-			return "";
-		} catch (Exception e) {
-			log.error("Unexpected exception while getting clipboard text", e);
-		}
-		return "";
-	}
-
-	private static void pressSequence(Robot robot, long delay, int... codes) throws InterruptedException {
-		for (int i = 0; i < codes.length; ++i) {
-			robot.keyPress(codes[i]);
-			Thread.sleep(delay);
-		}
-		for (int i = codes.length - 1; i >= 0; --i) {
-			robot.keyRelease(codes[i]);
-			Thread.sleep(delay);
-		}
-	}
-	
-	private String getHighlightedText(Robot robot) {
-		try {
-			if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") >= 0) {
-				// pressing STRG+C == copy
-				pressSequence(robot, 200, KeyEvent.VK_CONTROL, KeyEvent.VK_C);
-			} else {
-				// Macintosh simulate Copy
-				pressSequence(robot, 200, 157, 67);
-			}
-			return getClipboardText();
-		} catch (Exception e) {
-			log.error("Unexpected exception while getting highlighted text", e);
+	public void sendRemoteCursorEvent(Map<String, Object> obj) {
+		if (!remoteEnabled) {
+			return;
 		}
-		return "";
-	}
-
-	private static void pressSpecialSign(String charValue, Robot robot) {
-		Clipboard clippy = getDefaultToolkit().getSystemClipboard();
-		try {
-			Transferable transferableText = new StringSelection(charValue);
-			clippy.setContents(transferableText, null);
+		log.trace("#### sendRemoteCursorEvent ");
+		log.trace("Result Map Type "+ obj);
 
-			if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") > -1) {
-				// pressing STRG+V == insert-mode
-				pressSequence(robot, 100, KeyEvent.VK_CONTROL, KeyEvent.VK_V);
-			} else {
-				// Macintosh simulate Insert
-				pressSequence(robot, 100, 157, 86);
-			}
-		} catch (Exception e) {
-			log.error("Unexpected exception while pressSpecialSign", e);
+		if (obj != null) {
+			remoteEvents.offer(obj);
+			log.trace("Action offered:: {}, count: {}", obj, remoteEvents.size());
 		}
 	}
 
@@ -707,7 +514,7 @@ public class CoreScreenShare implements
 					return;
 				}
 			} else if ("createStream".equals(method)) {
-				if (startRecording || startStreaming) {
+				if (startRecording || startSharing) {
 					if (o != null && o instanceof Number) {
 						getCapture().setStreamId((Number)o);
 					}
@@ -717,7 +524,7 @@ public class CoreScreenShare implements
 					log.debug("setup capture thread spinnerWidth = {}; spinnerHeight = {};", spinnerWidth, spinnerHeight);
 	
 					if (!getCapture().isAlive()) {
-						getCapture().setSendCursor(startStreaming);
+						getCapture().setSendCursor(startSharing);
 						getCapture().start();
 					}
 				}
@@ -727,7 +534,7 @@ public class CoreScreenShare implements
 					log.trace("Stopping to stream, there is neither a Desktop Sharing nor Recording anymore");
 					stopStream();
 				} else if ("stopSharingOnly".equals(result)) {
-					stopStreaming();
+					stopSharing();
 				} else if ("stopRecordingOnly".equals(result)) {
 					stopRecording();
 				} else if ("stopPublishingOnly".equals(result)) {
@@ -769,4 +576,12 @@ public class CoreScreenShare implements
 		deadlockGuard.afterPropertiesSet();
 		conn.setDeadlockGuardScheduler(deadlockGuard);
 	}
+
+	public IScreenShare getInstance() {
+		return instance;
+	}
+
+	public LinkedBlockingQueue<Map<String, Object>> getRemoteEvents() {
+		return remoteEvents;
+	}
 }

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenEncoder.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenEncoder.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenEncoder.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenEncoder.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import java.io.IOException;
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/IScreenShare.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import java.util.Map;
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPClientPublish.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPClientPublish.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPClientPublish.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPClientPublish.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import org.red5.client.net.rtmp.INetStreamEventHandler;
 import org.red5.client.net.rtmp.RTMPClient;
@@ -34,13 +34,13 @@ class RTMPClientPublish extends RTMPClie
 	private static final Logger logger = LoggerFactory.getLogger(RTMPClientPublish.class);
 	private final CaptureScreen publishScreen;
 	private String id;
-	private CoreScreenShare core;
+	private Core core;
 	
-	public void setCore(CoreScreenShare core) {
+	public void setCore(Core core) {
 		this.core = core;
 	}
 	
-	RTMPClientPublish(CoreScreenShare core, String host, String app, String id) {
+	RTMPClientPublish(Core core, String host, String app, String id) {
 		this.id = id;
 		this.core = core;
 		publishScreen = new CaptureScreen(core, this, host, app, 1935);

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPSScreenShare.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPSScreenShare.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPSScreenShare.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPSScreenShare.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import org.red5.client.net.rtmps.RTMPSClient;
 import org.red5.server.net.ICommand;
@@ -29,9 +29,9 @@ import org.slf4j.LoggerFactory;
 public class RTMPSScreenShare extends RTMPSClient implements IScreenShare {
 	private static final Logger log = LoggerFactory.getLogger(RTMPSScreenShare.class);
 
-	private final CoreScreenShare core;
+	private final Core core;
 
-	public RTMPSScreenShare(CoreScreenShare core) {
+	public RTMPSScreenShare(Core core) {
 		this.core = core;
 	};
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPScreenShare.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPScreenShare.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPScreenShare.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPScreenShare.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import org.red5.client.net.rtmp.RTMPClient;
 import org.red5.server.net.ICommand;
@@ -29,9 +29,9 @@ import org.slf4j.LoggerFactory;
 public class RTMPScreenShare extends RTMPClient implements IScreenShare {
 	private static final Logger log = LoggerFactory.getLogger(RTMPScreenShare.class);
 
-	private final CoreScreenShare core;
+	private final Core core;
 
-	public RTMPScreenShare(CoreScreenShare core) {
+	public RTMPScreenShare(Core core) {
 		this.core = core;
 	}
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTSScreenShare.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTSScreenShare.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTSScreenShare.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTSScreenShare.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import org.red5.client.net.rtmps.RTMPTSClient;
 import org.red5.server.net.ICommand;
@@ -29,9 +29,9 @@ import org.slf4j.LoggerFactory;
 public class RTMPTSScreenShare extends RTMPTSClient implements IScreenShare {
 	private static final Logger log = LoggerFactory.getLogger(RTMPTSScreenShare.class);
 
-	private final CoreScreenShare core;
+	private final Core core;
 
-	public RTMPTSScreenShare(CoreScreenShare core, boolean secure) {
+	public RTMPTSScreenShare(Core core, boolean secure) {
 		this.core = core;
 	};
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTScreenShare.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTScreenShare.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTScreenShare.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/RTMPTScreenShare.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
 import org.red5.client.net.rtmpt.RTMPTClient;
 import org.red5.server.net.ICommand;
@@ -29,9 +29,9 @@ import org.slf4j.LoggerFactory;
 public class RTMPTScreenShare extends RTMPTClient implements IScreenShare {
 	private static final Logger log = LoggerFactory.getLogger(RTMPTScreenShare.class);
 
-	private final CoreScreenShare core;
+	private final Core core;
 
-	public RTMPTScreenShare(CoreScreenShare core) {
+	public RTMPTScreenShare(Core core) {
 		this.core = core;
 	};
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java Wed Sep 14 05:24:18 2016
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart;
+package org.apache.openmeetings.screenshare;
 
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.resizeY;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
 import static org.red5.io.IoConstants.FLAG_CODEC_SCREEN;
 import static org.red5.io.IoConstants.FLAG_FRAMETYPE_INTERFRAME;
 import static org.red5.io.IoConstants.FLAG_FRAMETYPE_KEYFRAME;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/BlankArea.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/BlankArea.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/BlankArea.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/BlankArea.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import javax.swing.*;
 import java.awt.Dimension;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/MouseListenerable.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/MouseListenerable.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/MouseListenerable.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/MouseListenerable.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.event.MouseAdapter;
 

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/NumberSpinner.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/NumberSpinner.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/NumberSpinner.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/NumberSpinner.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import javax.swing.JSpinner;
 import javax.swing.SpinnerNumberModel;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Dimension;
 import java.awt.Toolkit;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenKeyListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenKeyListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenKeyListener.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenKeyListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java Wed Sep 14 05:24:18 2016
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.ROUND_VALUE;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.resizeY;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.ROUND_VALUE;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
+import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.awt.AWTException;
@@ -56,8 +56,8 @@ import javax.swing.event.ChangeListener;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 
-import org.apache.openmeetings.screen.webstart.CoreScreenShare;
-import org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.ScreenQuality;
+import org.apache.openmeetings.screenshare.Core;
+import org.apache.openmeetings.screenshare.gui.ScreenDimensions.ScreenQuality;
 import org.slf4j.Logger;
 
 public class ScreenSharerFrame extends JFrame {
@@ -191,8 +191,8 @@ public class ScreenSharerFrame extends J
 		private static final long serialVersionUID = 1L;
 
 		public VerticalSlider() {
-			ImageIcon iUp = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/up.png"));
-			ImageIcon iDown = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/down.png"));
+			ImageIcon iUp = new ImageIcon(ScreenSharerFrame.class.getResource("up.png"));
+			ImageIcon iDown = new ImageIcon(ScreenSharerFrame.class.getResource("down.png"));
 			setSize(16, 32);
 			JLabel jUp = new JLabel(iUp);
 			jUp.setBounds(0, 0, 16, 16);
@@ -207,8 +207,8 @@ public class ScreenSharerFrame extends J
 		private static final long serialVersionUID = 1L;
 
 		public HorizontalSlider() {
-			ImageIcon iLeft = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/previous.png"));
-			ImageIcon iRight = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/next.png"));
+			ImageIcon iLeft = new ImageIcon(ScreenSharerFrame.class.getResource("previous.png"));
+			ImageIcon iRight = new ImageIcon(ScreenSharerFrame.class.getResource("next.png"));
 			setSize(32, 16);
 			JLabel jLeft = new JLabel(iLeft);
 			jLeft.setBounds(0, 0, 16, 16);
@@ -228,7 +228,7 @@ public class ScreenSharerFrame extends J
 	 * @throws AWTException 
 	 * @throws IOException 
 	 */
-	public ScreenSharerFrame(final CoreScreenShare core, String[] textLabels) throws AWTException {
+	public ScreenSharerFrame(final Core core, String[] textLabels) throws AWTException {
 		setTitle(getTextLabel(textLabels, 0)); //#id 730
 		setBackground(Color.WHITE);
 		setResizable(false);
@@ -261,8 +261,8 @@ public class ScreenSharerFrame extends J
 		reduceYLabel = getTextLabel(textLabels, 32); //#id 1474
 		recordingTipLabel = getTextLabel(textLabels, 35); //#id 1477
 		publishingTipLabel = getTextLabel(textLabels, 34); //#id 1476
-		startIcon = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/play.png"));
-		stopIcon = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/stop.png"));
+		startIcon = new ImageIcon(getClass().getResource("play.png"));
+		stopIcon = new ImageIcon(getClass().getResource("stop.png"));
 		btnStartStopSharing = new JButton(startSharingLabel);
 		btnStartStopSharing.setToolTipText(startSharingLabel);
 		btnStartStopSharing.setIcon(startIcon);
@@ -273,14 +273,14 @@ public class ScreenSharerFrame extends J
 				if (sharingStarted) {
 					if (!sharingActionRequested) {
 						sharingActionRequested = true;
-						core.streamingStop();
+						core.sharingStop();
 					} else {
 						logger.warn("Sharing action is already requested");
 					}
 				} else {
 					if (!sharingActionRequested) {
 						sharingActionRequested = true;
-						core.streamingStart();
+						core.sharingStart();
 					} else {
 						logger.warn("Sharing action is already requested");
 					}

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Modified: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java?rev=1760631&r1=1760630&r2=1760631&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java (original)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java Wed Sep 14 05:24:18 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.screen.webstart.gui;
+package org.apache.openmeetings.screenshare.gui;
 
 import java.awt.Component;
 import java.awt.Cursor;

Added: openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java?rev=1760631&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java (added)
+++ openmeetings/application/trunk/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/CursorJob.java Wed Sep 14 05:24:18 2016
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.screenshare.job;
+
+import org.apache.openmeetings.screenshare.CaptureScreen;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+@DisallowConcurrentExecution
+public class CursorJob implements Job {
+	public static final String CAPTURE_KEY = "capture";
+	
+	public CursorJob() {}
+	
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+		JobDataMap data = context.getJobDetail().getJobDataMap();
+		CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
+		if (!capture.getSendFrameGuard()) {
+			capture.sendCursorStatus();
+		}
+	}
+}