/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.deskshare.client;
import jargs.gnu.CmdLineParser;
import jargs.gnu.CmdLineParser.Option;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class DeskshareMain implements ClientListener, LifeLineListener {
private final BlockingQueue<ExitCode> exitReasonQ = new LinkedBlockingQueue<ExitCode>(5);
private List<String> optionHelpStrings = new ArrayList<String>();
private static LifeLine lifeline;
private static DeskshareClient client;
private Option addHelp(Option option, String helpString) {
optionHelpStrings.add(" -" + option.shortForm() + ", --" + option.longForm() + ": " + helpString);
return option;
}
private void printUsage() {
System.err.println("usage: deskshare [options]");
for (Iterator<String> i = optionHelpStrings.iterator(); i.hasNext(); ) {
System.err.println(i.next());
}
}
public static void main(String[] args) {
DeskshareMain dsMain = new DeskshareMain();
CmdLineParser parser = new CmdLineParser();
CmdLineParser.Option host = dsMain.addHelp(parser.addStringOption('s', "server"), serverHelpText);
CmdLineParser.Option port = dsMain.addHelp(parser.addIntegerOption('p', "port"),"The port the application is listening");
CmdLineParser.Option listenPort = dsMain.addHelp(parser.addIntegerOption('l', "listenPort"),"Port to listen for lifeline");
CmdLineParser.Option room = dsMain.addHelp(parser.addStringOption('r', "room"),"Room");
CmdLineParser.Option cWidth = dsMain.addHelp(parser.addIntegerOption('w', "captureWidth"),"Width of the screen capture");
CmdLineParser.Option cHeight = dsMain.addHelp(parser.addIntegerOption('t', "captureHeight"),"Height of the screen capture");
CmdLineParser.Option sWidth = dsMain.addHelp(parser.addIntegerOption('d', "scaleWidth"),"Scale capture width");
CmdLineParser.Option sHeight = dsMain.addHelp(parser.addIntegerOption('g', "scaleHeight"),"Scale capture height");
// CmdLineParser.Option quality = dsMain.addHelp(parser.addBooleanOption('q', "quality"),"Scale with better quality instead of speed");
// CmdLineParser.Option aspectRatio = dsMain.addHelp(parser.addBooleanOption('a', "aspectRatio"),"Maintain aspect ratio when scaling");
// CmdLineParser.Option autoScale = dsMain.addHelp(parser.addDoubleOption('a', "autoScale"),"Scale factor [0.5 to 0.8]. Override -d and -g options.");
CmdLineParser.Option xCoord = dsMain.addHelp(parser.addIntegerOption('x', "x"),"Upper-left x coordinate of the screen capture");
CmdLineParser.Option yCoord = dsMain.addHelp(parser.addIntegerOption('y', "y"),"Upper-left y coordinate of the screen capture");
CmdLineParser.Option tryHttpTunnel = dsMain.addHelp(parser.addBooleanOption('n', "httptunnel"),"Http tunnel if direct connection fails");
CmdLineParser.Option icon = dsMain.addHelp(parser.addStringOption('i', "icon"),"Path to system tray icon file");
CmdLineParser.Option help = dsMain.addHelp(parser.addBooleanOption('h', "help"),"Show this help message");
CmdLineParser.Option fullScreen = dsMain.addHelp(parser.addBooleanOption('f', "full-screen"),"Capture the full screen.");
CmdLineParser.Option useSVC2 = dsMain.addHelp(parser.addBooleanOption('2', "useSVC2"),"Use Screen Video V2.");
try {
parser.parse(args);
} catch (CmdLineParser.OptionException e) {
System.err.println(e.getMessage());
dsMain.printUsage();
System.exit(2);
}
if (Boolean.TRUE.equals(parser.getOptionValue(help))) {
dsMain.printUsage();
System.exit(0);
}
// Extract the values entered for the various options -- if the
// options were not specified, the corresponding values will be
// the default.
String hostValue = (String)parser.getOptionValue(host, "localhost");
Integer portValue = (Integer)parser.getOptionValue(port, new Integer(9123));
Integer listenPortValue = (Integer)parser.getOptionValue(listenPort, new Integer(9125));
String roomValue = (String)parser.getOptionValue(room, "85115");
Integer cWidthValue = (Integer)parser.getOptionValue(cWidth, new Integer(800));
Integer cHeightValue = (Integer)parser.getOptionValue(cHeight, new Integer(600));
Integer sWidthValue = (Integer)parser.getOptionValue(sWidth, new Integer(800));
Integer sHeightValue = (Integer)parser.getOptionValue(sHeight, new Integer(600));
// Boolean qualityValue = (Boolean)parser.getOptionValue(quality, new Boolean(false));
// Double autoScaleValue = (Double)parser.getOptionValue(autoScale, new Double(0));
// Double autoScaleValue = new Double(0);
// Boolean aspectValue = (Boolean)parser.getOptionValue(aspectRatio, new Boolean(false));
Integer xValue = (Integer)parser.getOptionValue(xCoord, new Integer(0));
Integer yValue = (Integer)parser.getOptionValue(yCoord, new Integer(0));
Boolean tunnelValue = (Boolean)parser.getOptionValue(tryHttpTunnel, new Boolean(false));
String iconValue = (String)parser.getOptionValue(icon, "bbb.gif");
Boolean fullScreenValue = (Boolean)parser.getOptionValue(fullScreen, new Boolean(false));
Boolean useSVC2Value = (Boolean)parser.getOptionValue(useSVC2, new Boolean(false));
Image image = Toolkit.getDefaultToolkit().getImage(iconValue);
lifeline = new LifeLine(listenPortValue.intValue(), dsMain);
lifeline.listen();
client = new DeskshareClient.NewBuilder().host(hostValue).port(portValue)
.room(roomValue).captureWidth(cWidthValue)
.captureHeight(cHeightValue).scaleWidth(sWidthValue).scaleHeight(sHeightValue)
.quality(true).autoScale(0)
.x(xValue).y(yValue).fullScreen(fullScreenValue).useSVC2(useSVC2Value)
.httpTunnel(tunnelValue).trayIcon(image).enableTrayIconActions(true).build();
client.addClientListener(dsMain);
client.start();
try {
System.out.println("Waiting for trigger to Stop client.");
ExitCode reason = dsMain.exitReasonQ.take();
System.out.println("Stopping client.");
client.stop();
lifeline.disconnect();
System.exit(reason.getExitCode());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(500);
}
}
public void onClientStop(ExitCode reason) {
queueExitCode(reason);
}
@Override
public void disconnected(ExitCode reason) {
queueExitCode(reason);
}
private void queueExitCode(ExitCode reason) {
try {
// System.out.println("Trigger stop client ." + exitReasonQ.remainingCapacity());
exitReasonQ.put(reason);
System.out.println("Triggered stop client.");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
client.stop();
lifeline.disconnect();
System.exit(reason.getExitCode());
}
}
private static final String serverHelpText = "\n\t The host or IP of the desktop sharing server. Default is localhost.";
}