Migrate from ant to gradle

This commit is contained in:
Laurent Clouet
2019-08-10 22:09:32 +02:00
parent 9f1f509bb6
commit 3230807a7d
75 changed files with 317 additions and 80 deletions

View File

@@ -1,346 +0,0 @@
/*
* Copyright (C) 2010-2014 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone;
import java.awt.AWTException;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import com.sheepit.client.Client;
import com.sheepit.client.Configuration;
import com.sheepit.client.Gui;
import com.sheepit.client.Stats;
import com.sheepit.client.standalone.swing.activity.Settings;
import com.sheepit.client.standalone.swing.activity.Working;
public class GuiSwing extends JFrame implements Gui {
public static final String type = "swing";
public enum ActivityType {
WORKING, SETTINGS
}
private SystemTray sysTray;
private JPanel panel;
private Working activityWorking;
private Settings activitySettings;
private TrayIcon trayIcon;
private boolean useSysTray;
private String title;
private int framesRendered;
private boolean waitingForAuthentication;
private Client client;
private ThreadClient threadClient;
public GuiSwing(boolean useSysTray_, String title_) {
framesRendered = 0;
useSysTray = useSysTray_;
title = title_;
waitingForAuthentication = true;
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (activityWorking != null) {
activityWorking.updateTime();
}
}
}, 2 * 1000, 2 * 1000);
}
@Override
public void start() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
}
if (useSysTray) {
try {
sysTray = SystemTray.getSystemTray();
if (SystemTray.isSupported()) {
addWindowStateListener(new WindowStateListener() {
public void windowStateChanged(WindowEvent e) {
if (e.getNewState() == ICONIFIED) {
hideToTray();
}
}
});
}
}
catch (UnsupportedOperationException e) {
sysTray = null;
}
}
URL iconUrl = getClass().getResource("/icon.png");
if (iconUrl != null) {
ImageIcon img = new ImageIcon(iconUrl);
setIconImage(img.getImage());
}
setTitle(title);
setSize(520, 760);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.setLayout(new GridBagLayout());
setContentPane(this.panel);
panel.setBorder(new EmptyBorder(20, 20, 20, 20));
activityWorking = new Working(this);
activitySettings = new Settings(this);
this.showActivity(ActivityType.SETTINGS);
while (waitingForAuthentication) {
try {
synchronized (this) {
wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void stop() {
System.exit(0);
}
@Override
public void status(String msg_) {
if (activityWorking != null) {
this.activityWorking.setStatus(msg_);
}
}
@Override
public void setRenderingProjectName(String name_) {
if (activityWorking != null) {
this.activityWorking.setRenderingProjectName(name_);
}
}
@Override
public void error(String msg_) {
status(msg_);
}
@Override
public void setRemainingTime(String time_) {
if (activityWorking != null) {
this.activityWorking.setRemainingTime(time_);
}
}
@Override
public void setRenderingTime(String time_) {
if (activityWorking != null) {
this.activityWorking.setRenderingTime(time_);
}
}
@Override
public void AddFrameRendered() {
framesRendered++;
if (activityWorking != null) {
this.activityWorking.setRenderedFrame(framesRendered);
}
else {
System.out.println("GuiSwing::AddFrameRendered() error: no working activity");
}
}
@Override
public void displayStats(Stats stats) {
if (activityWorking != null) {
this.activityWorking.displayStats(stats);
}
}
@Override
public Client getClient() {
return client;
}
@Override
public void setClient(Client cli) {
client = cli;
}
@Override
public void setComputeMethod(String computeMethod) {
this.activityWorking.setComputeMethod(computeMethod);
}
public Configuration getConfiguration() {
return client.getConfiguration();
}
public void setCredentials(String contentLogin, String contentPassword) {
client.getConfiguration().setLogin(contentLogin);
client.getConfiguration().setPassword(contentPassword);
waitingForAuthentication = false;
synchronized (this) {
notifyAll();
}
if (threadClient == null || threadClient.isAlive() == false) {
threadClient = new ThreadClient();
threadClient.start();
}
showActivity(ActivityType.WORKING);
}
public void showActivity(ActivityType type) {
panel.removeAll();
panel.doLayout();
if (type == ActivityType.WORKING) {
activityWorking.show();
}
else if (type == ActivityType.SETTINGS) {
activitySettings.show();
}
setVisible(true);
panel.repaint();
}
public void hideToTray() {
if (sysTray == null || SystemTray.isSupported() == false) {
System.out.println("GuiSwing::hideToTray SystemTray not supported!");
return;
}
try {
trayIcon = getTrayIcon();
sysTray.add(trayIcon);
}
catch (AWTException e) {
System.out.println("GuiSwing::hideToTray an error occured while trying to add system tray icon (exception: " + e + ")");
return;
}
setVisible(false);
}
public void restoreFromTray() {
if (sysTray != null && SystemTray.isSupported()) {
sysTray.remove(trayIcon);
setVisible(true);
setExtendedState(getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL); // for toFront and requestFocus to actually work
toFront();
requestFocus();
}
}
public TrayIcon getTrayIcon() {
final PopupMenu trayMenu = new PopupMenu();
URL iconUrl = getClass().getResource("/icon.png");
Image img = Toolkit.getDefaultToolkit().getImage(iconUrl);
final TrayIcon icon = new TrayIcon(img);
MenuItem exit = new MenuItem("Exit");
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
trayMenu.add(exit);
MenuItem open = new MenuItem("Open...");
open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
restoreFromTray();
}
});
trayMenu.add(open);
MenuItem settings = new MenuItem("Settings...");
settings.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
restoreFromTray();
showActivity(ActivityType.SETTINGS);
}
});
trayMenu.add(settings);
icon.setPopupMenu(trayMenu);
icon.setImageAutoSize(true);
icon.setToolTip("SheepIt! Client");
icon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
restoreFromTray();
}
});
return icon;
}
public class ThreadClient extends Thread {
@Override
public void run() {
if (GuiSwing.this.client != null) {
GuiSwing.this.client.run();
}
}
}
}

View File

@@ -1,148 +0,0 @@
/*
* Copyright (C) 2010-2014 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone;
import com.sheepit.client.Client;
import com.sheepit.client.Gui;
import com.sheepit.client.Job;
import com.sheepit.client.Log;
import com.sheepit.client.Stats;
import com.sheepit.client.standalone.text.CLIInputActionHandler;
import com.sheepit.client.standalone.text.CLIInputObserver;
import sun.misc.Signal;
import sun.misc.SignalHandler;
public class GuiText implements Gui {
public static final String type = "text";
private int framesRendered;
private int sigIntCount = 0;
private Log log;
private Client client;
public GuiText() {
this.framesRendered = 0;
this.log = Log.getInstance(null);
}
@Override
public void start() {
if (client != null) {
CLIInputObserver cli_input_observer = new CLIInputObserver(client);
cli_input_observer.addListener(new CLIInputActionHandler());
Thread cli_input_observer_thread = new Thread(cli_input_observer);
cli_input_observer_thread.start();
Signal.handle(new Signal("INT"), new SignalHandler() {
@Override
public void handle(Signal signal) {
sigIntCount++;
if (sigIntCount == 4) {
// This is only for ugly issues that might occur
System.out.println("WARNING: Hitting Ctrl-C again will force close the application.");
}
else if (sigIntCount == 5) {
Signal.raise(new Signal("INT"));
Runtime.getRuntime().halt(0);
}
else if (client.isRunning() && client.isSuspended() == false) {
client.askForStop();
System.out.println("Will exit after current frame... Press Ctrl+C again to exit now.");
}
else {
client.stop();
GuiText.this.stop();
}
}
});
client.run();
client.stop();
}
}
@Override
public void stop() {
Runtime.getRuntime().halt(0);
}
@Override
public void status(String msg_) {
System.out.println(msg_);
log.debug("GUI " + msg_);
}
@Override
public void error(String err_) {
System.out.println("Error " + err_);
log.error("Error " + err_);
}
@Override
public void AddFrameRendered() {
this.framesRendered += 1;
System.out.println("Frames rendered: " + this.framesRendered);
}
@Override
public void displayStats(Stats stats) {
System.out.println("Frames remaining: " + stats.getRemainingFrame());
System.out.println("Credits earned: " + stats.getCreditsEarnedDuringSession());
}
@Override
public void setRenderingProjectName(String name_) {
if (name_ != null && name_.isEmpty() == false) {
System.out.println("Rendering project \"" + name_ + "\"");
}
}
@Override
public void setRemainingTime(String time_) {
System.out.println("Rendering (remaining " + time_ + ")");
}
@Override
public void setRenderingTime(String time_) {
System.out.println("Rendering " + time_);
}
@Override
public void setClient(Client cli) {
client = cli;
}
@Override
public void setComputeMethod(String computeMethod) {
System.out.println("Compute method: " + computeMethod);
}
@Override
public Client getClient() {
return client;
}
}

View File

@@ -1,171 +0,0 @@
/*
* Copyright (C) 2015 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone;
import com.sheepit.client.Client;
import com.sheepit.client.Gui;
import com.sheepit.client.Job;
import com.sheepit.client.Stats;
import com.sheepit.client.standalone.text.CLIInputActionHandler;
import com.sheepit.client.standalone.text.CLIInputObserver;
import sun.misc.Signal;
import sun.misc.SignalHandler;
public class GuiTextOneLine implements Gui {
public static final String type = "oneLine";
private String project;
private int rendered;
private int remaining;
private String creditsEarned;
private int sigIntCount = 0;
private String computeMethod;
private String status;
private String line;
private boolean exiting = false;
private Client client;
public GuiTextOneLine() {
project = "";
rendered = 0;
remaining = 0;
creditsEarned = null;
status = "";
computeMethod = "";
line = "";
}
@Override
public void start() {
if (client != null) {
CLIInputObserver cli_input_observer = new CLIInputObserver(client);
cli_input_observer.addListener(new CLIInputActionHandler());
Thread cli_input_observer_thread = new Thread(cli_input_observer);
cli_input_observer_thread.start();
Signal.handle(new Signal("INT"), new SignalHandler() {
@Override
public void handle(Signal signal) {
sigIntCount++;
if (sigIntCount == 5) {
Signal.raise(new Signal("INT"));
Runtime.getRuntime().halt(0);
}
else if (client.isRunning() && client.isSuspended() == false) {
client.askForStop();
exiting = true;
}
else {
client.stop();
GuiTextOneLine.this.stop();
}
}
});
client.run();
client.stop();
}
}
@Override
public void stop() {
Runtime.getRuntime().halt(0);
}
@Override
public void status(String msg_) {
status = msg_;
updateLine();
}
@Override
public void setRenderingProjectName(String name_) {
if (name_ == null || name_.isEmpty()) {
project = "";
}
else {
project = "Project \"" + name_ + "\" |";
}
updateLine();
}
@Override
public void error(String msg_) {
status = "Error " + msg_;
updateLine();
}
@Override
public void AddFrameRendered() {
rendered += 1;
updateLine();
}
@Override
public void displayStats(Stats stats) {
remaining = stats.getRemainingFrame();
creditsEarned = String.valueOf(stats.getCreditsEarnedDuringSession());
updateLine();
}
@Override
public void setRemainingTime(String time_) {
status = "(remaining " + time_ + ")";
updateLine();
}
@Override
public void setRenderingTime(String time_) {
status = "Rendering " + time_;
updateLine();
}
@Override
public void setClient(Client cli) {
client = cli;
}
@Override
public void setComputeMethod(String computeMethod_) {
computeMethod = computeMethod_;
}
@Override
public Client getClient() {
return client;
}
private void updateLine() {
int charToRemove = line.length();
System.out.print("\r");
line = String.format("Frames: %d Points: %s | %s %s %s", rendered, creditsEarned != null ? creditsEarned : "unknown", project, computeMethod, status + (exiting ? " (Exiting after this frame)" : ""));
System.out.print(line);
for (int i = line.length(); i <= charToRemove; i++) {
System.out.print(" ");
}
}
}

View File

@@ -1,60 +0,0 @@
/*
* Copyright (C) 2017 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone;
import java.util.List;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.OptionDef;
import org.kohsuke.args4j.spi.OptionHandler;
import org.kohsuke.args4j.spi.Parameters;
import org.kohsuke.args4j.spi.Setter;
import com.sheepit.client.Configuration;
import com.sheepit.client.hardware.gpu.GPU;
import com.sheepit.client.hardware.gpu.GPUDevice;
public class ListGpuParameterHandler<T> extends OptionHandler<T> {
public ListGpuParameterHandler(CmdLineParser parser, OptionDef option, Setter<? super T> setter) {
super(parser, option, setter);
}
@Override
public int parseArguments(Parameters params) throws CmdLineException {
List<GPUDevice> gpus = GPU.listDevices(new Configuration(null, null, null));
if (gpus != null) {
for (GPUDevice gpu : gpus) {
System.out.println("Id : " + gpu.getId());
System.out.println("Model : " + gpu.getModel());
System.out.println("Memory, MB: " + (int) (gpu.getMemory() / (1024 * 1024)));
System.out.println();
}
}
System.exit(0);
return 0;
}
@Override
public String getDefaultMetaVariable() {
return null;
}
}

View File

@@ -1,48 +0,0 @@
/*
* Copyright (C) 2015 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.OptionDef;
import org.kohsuke.args4j.spi.OptionHandler;
import org.kohsuke.args4j.spi.Parameters;
import org.kohsuke.args4j.spi.Setter;
import com.sheepit.client.Configuration;
public class VersionParameterHandler<T> extends OptionHandler<T> {
public VersionParameterHandler(CmdLineParser parser, OptionDef option, Setter<? super T> setter) {
super(parser, option, setter);
}
@Override
public int parseArguments(Parameters params) throws CmdLineException {
Configuration config = new Configuration(null, "", "");
System.out.println("Version: " + config.getJarVersion());
System.exit(0);
return 0;
}
@Override
public String getDefaultMetaVariable() {
return null;
}
}

View File

@@ -1,332 +0,0 @@
/*
* Copyright (C) 2010-2014 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import static org.kohsuke.args4j.ExampleMode.REQUIRED;
import org.kohsuke.args4j.Option;
import java.io.File;
import java.net.MalformedURLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import com.sheepit.client.Client;
import com.sheepit.client.Configuration;
import com.sheepit.client.Configuration.ComputeType;
import com.sheepit.client.Gui;
import com.sheepit.client.Log;
import com.sheepit.client.Pair;
import com.sheepit.client.SettingsLoader;
import com.sheepit.client.ShutdownHook;
import com.sheepit.client.Utils;
import com.sheepit.client.hardware.gpu.GPU;
import com.sheepit.client.hardware.gpu.GPUDevice;
import com.sheepit.client.hardware.gpu.nvidia.Nvidia;
import com.sheepit.client.hardware.gpu.opencl.OpenCL;
import com.sheepit.client.network.Proxy;
public class Worker {
@Option(name = "-server", usage = "Render-farm server, default https://client.sheepit-renderfarm.com", metaVar = "URL", required = false)
private String server = "https://client.sheepit-renderfarm.com";
@Option(name = "-login", usage = "User's login", metaVar = "LOGIN", required = false)
private String login = "";
@Option(name = "-password", usage = "User's password", metaVar = "PASSWORD", required = false)
private String password = "";
@Option(name = "-cache-dir", usage = "Cache/Working directory. Caution, everything in it not related to the render-farm will be removed", metaVar = "/tmp/cache", required = false)
private String cache_dir = null;
@Option(name = "-max-uploading-job", usage = "", metaVar = "1", required = false)
private int max_upload = -1;
@Option(name = "-gpu", usage = "Name of the GPU used for the render, for example CUDA_0 for Nvidia or OPENCL_0 for AMD/Intel card", metaVar = "CUDA_0", required = false)
private String gpu_device = null;
@Option(name = "--no-gpu", usage = "Don't detect GPUs", required = false)
private boolean no_gpu_detection = false;
@Option(name = "-compute-method", usage = "CPU: only use cpu, GPU: only use gpu, CPU_GPU: can use cpu and gpu (not at the same time) if -gpu is not use it will not use the gpu", metaVar = "CPU", required = false)
private String method = null;
@Option(name = "-cores", usage = "Number of cores/threads to use for the render", metaVar = "3", required = false)
private int nb_cores = -1;
@Option(name = "-memory", usage = "Maximum memory allow to be used by renderer, number with unit (800M, 2G, ...)", required = false)
private String max_ram = null;
@Option(name = "-rendertime", usage = "Maximum time allow for each frame (in minute)", required = false)
private int max_rendertime = -1;
@Option(name = "--verbose", usage = "Display log", required = false)
private boolean print_log = false;
@Option(name = "-request-time", usage = "H1:M1-H2:M2,H3:M3-H4:M4 Use the 24h format. For example to request job between 2am-8.30am and 5pm-11pm you should do --request-time 2:00-8:30,17:00-23:00 Caution, it's the requesting job time to get a project not the working time", metaVar = "2:00-8:30,17:00-23:00", required = false)
private String request_time = null;
@Option(name = "-proxy", usage = "URL of the proxy", metaVar = "http://login:password@host:port", required = false)
private String proxy = null;
@Option(name = "-extras", usage = "Extras data push on the authentication request", required = false)
private String extras = null;
@Option(name = "-ui", usage = "Specify the user interface to use, default '" + GuiSwing.type + "', available '" + GuiTextOneLine.type + "', '" + GuiText.type + "', '" + GuiSwing.type + "' (graphical)", required = false)
private String ui_type = null;
@Option(name = "-config", usage = "Specify the configuration file", required = false)
private String config_file = null;
@Option(name = "--version", usage = "Display application version", required = false, handler = VersionParameterHandler.class)
private VersionParameterHandler versionHandler;
@Option(name = "--show-gpu", usage = "Print available CUDA devices and exit", required = false, handler = ListGpuParameterHandler.class)
private ListGpuParameterHandler listGpuParameterHandler;
@Option(name = "--no-systray", usage = "Don't use systray", required = false)
private boolean no_systray = false;
@Option(name = "-priority", usage = "Set render process priority (19 lowest to -19 highest)", required = false)
private int priority = 19;
@Option(name = "-title", usage = "Custom title for the GUI Client", required = false)
private String title = "SheepIt Render Farm";
public static void main(String[] args) {
new Worker().doMain(args);
}
public void doMain(String[] args) {
CmdLineParser parser = new CmdLineParser(this);
try {
parser.parseArgument(args);
}
catch (CmdLineException e) {
System.err.println(e.getMessage());
System.err.println("Usage: ");
parser.printUsage(System.err);
System.err.println();
System.err.println("Example: java " + this.getClass().getName() + " " + parser.printExample(REQUIRED));
return;
}
ComputeType compute_method = ComputeType.CPU;
Configuration config = new Configuration(null, login, password);
config.setPrintLog(print_log);
config.setUsePriority(priority);
config.setDetectGPUs(! no_gpu_detection);
if (cache_dir != null) {
File a_dir = new File(cache_dir);
a_dir.mkdirs();
if (a_dir.isDirectory() && a_dir.canWrite()) {
config.setCacheDir(a_dir);
}
}
if (max_upload != -1) {
if (max_upload <= 0) {
System.err.println("Error: max upload should be a greater than zero");
return;
}
config.setMaxUploadingJob(max_upload);
}
if (gpu_device != null) {
if (gpu_device.startsWith(Nvidia.TYPE) == false && gpu_device.startsWith(OpenCL.TYPE) == false) {
System.err.println("GPU_ID should look like '" + Nvidia.TYPE + "_X' or '" + OpenCL.TYPE + "_X' more info on gpus available with --show-gpu");
System.exit(2);
}
String family = "";
if (gpu_device.startsWith(Nvidia.TYPE) == false && gpu_device.startsWith(OpenCL.TYPE) == false) {
System.err.println("GPU_ID should look like '" + Nvidia.TYPE + "_X' or '" + OpenCL.TYPE + "_X' more info on gpus available with --show-gpu");
return;
}
GPUDevice gpu = GPU.getGPUDevice(gpu_device);
if (gpu == null) {
System.err.println("GPU unknown, list of available gpus can be display with --show-gpu");
System.exit(2);
}
config.setGPUDevice(gpu);
}
if (request_time != null) {
String[] intervals = request_time.split(",");
if (intervals != null) {
config.setRequestTime(new LinkedList<Pair<Calendar, Calendar>>());
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
for (String interval : intervals) {
String[] times = interval.split("-");
if (times != null && times.length == 2) {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
try {
start.setTime(timeFormat.parse(times[0]));
end.setTime(timeFormat.parse(times[1]));
}
catch (ParseException e) {
System.err.println("Error: wrong format in request time");
System.exit(2);
}
if (start.before(end)) {
config.getRequestTime().add(new Pair<Calendar, Calendar>(start, end));
}
else {
System.err.println("Error: wrong request time " + times[0] + " is after " + times[1]);
System.exit(2);
}
}
}
}
}
if (nb_cores < -1 || nb_cores == 0) { // -1 is the default
System.err.println("Error: use-number-core should be a greater than zero");
return;
}
else {
config.setNbCores(nb_cores);
}
if (max_ram != null) {
try {
config.setMaxMemory(Utils.parseNumber(max_ram) / 1000); // internal value are in kB
}
catch (java.lang.IllegalStateException e) {
System.err.println("Error: failed to parse memory parameter");
return;
}
}
if (max_rendertime > 0) {
config.setMaxRenderTime(max_rendertime * 60);
}
if (method != null) {
try {
compute_method = ComputeType.valueOf(method);
}
catch (IllegalArgumentException e) {
System.err.println("Error: compute-method unknown");
System.exit(2);
}
}
else {
if (config.getGPUDevice() == null) {
compute_method = ComputeType.CPU;
}
else {
compute_method = ComputeType.GPU;
}
}
if (proxy != null) {
try {
Proxy.set(proxy);
}
catch (MalformedURLException e) {
System.err.println("Error: wrong url for proxy");
System.err.println(e);
System.exit(2);
}
}
if (extras != null) {
config.setExtras(extras);
}
if (compute_method == ComputeType.CPU && config.getGPUDevice() != null) {
System.err.println("You choose to only use the CPU but a GPU was also provided. You can not do both.");
System.err.println("Aborting");
System.exit(2);
}
else if (compute_method == ComputeType.CPU_GPU && config.getGPUDevice() == null) {
System.err.println("You choose to only use the CPU and GPU but no GPU device was provided.");
System.err.println("Aborting");
System.exit(2);
}
else if (compute_method == ComputeType.GPU && config.getGPUDevice() == null) {
System.err.println("You choose to only use the GPU but no GPU device was provided.");
System.err.println("Aborting");
System.exit(2);
}
else if (compute_method == ComputeType.CPU) {
config.setGPUDevice(null); // remove the GPU
}
config.setComputeMethod(compute_method);
if (ui_type != null) {
config.setUIType(ui_type);
}
if (config_file != null) {
if (new File(config_file).exists() == false) {
System.err.println("Configuration file not found.");
System.err.println("Aborting");
System.exit(2);
}
config.setConfigFilePath(config_file);
new SettingsLoader(config_file).merge(config);
}
Log.getInstance(config).debug("client version " + config.getJarVersion());
Gui gui;
String type = config.getUIType();
if (type == null) {
type = "swing";
}
switch (type) {
case GuiTextOneLine.type:
if (config.isPrintLog()) {
System.out.println("OneLine UI can not be used if verbose mode is enabled");
System.exit(2);
}
gui = new GuiTextOneLine();
break;
case GuiText.type:
gui = new GuiText();
break;
default:
case GuiSwing.type:
if (java.awt.GraphicsEnvironment.isHeadless()) {
System.out.println("Graphical ui can not be launch.");
System.out.println("You should set a DISPLAY or use a text ui (with -ui " + GuiTextOneLine.type + " or -ui " + GuiText.type + ").");
System.exit(3);
}
gui = new GuiSwing(no_systray == false, title);
break;
}
Client cli = new Client(gui, config, server);
gui.setClient(cli);
ShutdownHook hook = new ShutdownHook(cli);
hook.attachShutDownHook();
gui.start();
}
}

View File

@@ -1,26 +0,0 @@
/*
* Copyright (C) 2015 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.swing.activity;
public interface Activity {
public void show();
}

View File

@@ -1,656 +0,0 @@
/*
* Copyright (C) 2015 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.swing.activity;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import com.sheepit.client.Configuration;
import com.sheepit.client.Configuration.ComputeType;
import com.sheepit.client.SettingsLoader;
import com.sheepit.client.hardware.cpu.CPU;
import com.sheepit.client.hardware.gpu.GPU;
import com.sheepit.client.hardware.gpu.GPUDevice;
import com.sheepit.client.network.Proxy;
import com.sheepit.client.os.OS;
import com.sheepit.client.standalone.GuiSwing;
import com.sheepit.client.standalone.swing.components.CollapsibleJPanel;
public class Settings implements Activity {
private static final String DUMMY_CACHE_DIR = "Auto detected";
private GuiSwing parent;
private JTextField login;
private JPasswordField password;
private JLabel cacheDirText;
private File cacheDir;
private JFileChooser cacheDirChooser;
private JCheckBox useCPU;
private List<JCheckBoxGPU> useGPUs;
private JSlider cpuCores;
private JSlider ram;
private JSpinner renderTime;
private JSlider priority;
private JTextField proxy;
private JTextField hostname;
private JCheckBox saveFile;
private JCheckBox autoSignIn;
JButton saveButton;
private boolean haveAutoStarted;
private JTextField tileSizeValue;
private JLabel tileSizeLabel;
private JCheckBox customTileSize;
public Settings(GuiSwing parent_) {
parent = parent_;
cacheDir = null;
useGPUs = new LinkedList<JCheckBoxGPU>();
haveAutoStarted = false;
}
@Override
public void show() {
Configuration config = parent.getConfiguration();
new SettingsLoader(config.getConfigFilePath()).merge(config);
List<GPUDevice> gpus = GPU.listDevices(config);
GridBagConstraints constraints = new GridBagConstraints();
int currentRow = 0;
ImageIcon image = new ImageIcon(getClass().getResource("/title.png"));
constraints.fill = GridBagConstraints.CENTER;
JLabel labelImage = new JLabel(image);
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.gridy = currentRow;
parent.getContentPane().add(labelImage, constraints);
++currentRow;
// authentication
CollapsibleJPanel authentication_panel = new CollapsibleJPanel(new GridLayout(2, 2));
authentication_panel.setBorder(BorderFactory.createTitledBorder("Authentication"));
JLabel loginLabel = new JLabel("Username:");
login = new JTextField();
login.setText(parent.getConfiguration().getLogin());
login.setColumns(20);
login.addKeyListener(new CheckCanStart());
JLabel passwordLabel = new JLabel("Password:");
password = new JPasswordField();
password.setText(parent.getConfiguration().getPassword());
password.setColumns(10);
password.addKeyListener(new CheckCanStart());
authentication_panel.add(loginLabel);
authentication_panel.add(login);
authentication_panel.add(passwordLabel);
authentication_panel.add(password);
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.fill = GridBagConstraints.HORIZONTAL;
parent.getContentPane().add(authentication_panel, constraints);
// directory
CollapsibleJPanel directory_panel = new CollapsibleJPanel(new GridLayout(1, 3));
directory_panel.setBorder(BorderFactory.createTitledBorder("Cache"));
JLabel cacheLabel = new JLabel("Working directory:");
directory_panel.add(cacheLabel);
String destination = DUMMY_CACHE_DIR;
if (config.isUserHasSpecifiedACacheDir()) {
destination = config.getCacheDirForSettings().getName();
}
JPanel cacheDirWrapper = new JPanel();
cacheDirWrapper.setLayout(new BoxLayout(cacheDirWrapper, BoxLayout.LINE_AXIS));
cacheDirText = new JLabel(destination);
cacheDirWrapper.add(cacheDirText);
cacheDirWrapper.add(Box.createHorizontalGlue());
cacheDirChooser = new JFileChooser();
cacheDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
JButton openButton = new JButton("...");
openButton.addActionListener(new ChooseFileAction());
cacheDirWrapper.add(openButton);
directory_panel.add(cacheDirWrapper);
currentRow++;
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(directory_panel, constraints);
// compute devices
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints compute_devices_constraints = new GridBagConstraints();
CollapsibleJPanel compute_devices_panel = new CollapsibleJPanel(gridbag);
compute_devices_panel.setBorder(BorderFactory.createTitledBorder("Compute devices"));
ComputeType method = config.getComputeMethod();
useCPU = new JCheckBox("CPU");
boolean gpuChecked = false;
if (method == ComputeType.CPU_GPU) {
useCPU.setSelected(true);
gpuChecked = true;
}
else if (method == ComputeType.CPU) {
useCPU.setSelected(true);
gpuChecked = false;
}
else if (method == ComputeType.GPU) {
useCPU.setSelected(false);
gpuChecked = true;
}
useCPU.addActionListener(new CpuChangeAction());
compute_devices_constraints.gridx = 1;
compute_devices_constraints.gridy = 0;
compute_devices_constraints.fill = GridBagConstraints.BOTH;
compute_devices_constraints.weightx = 1.0;
compute_devices_constraints.weighty = 1.0;
gridbag.setConstraints(useCPU, compute_devices_constraints);
compute_devices_panel.add(useCPU);
for (GPUDevice gpu : gpus) {
JCheckBoxGPU gpuCheckBox = new JCheckBoxGPU(gpu);
gpuCheckBox.setToolTipText(gpu.getId());
if (gpuChecked) {
GPUDevice config_gpu = config.getGPUDevice();
if (config_gpu != null && config_gpu.getId().equals(gpu.getId())) {
gpuCheckBox.setSelected(gpuChecked);
}
}
gpuCheckBox.addActionListener(new GpuChangeAction());
compute_devices_constraints.gridy++;
gridbag.setConstraints(gpuCheckBox, compute_devices_constraints);
compute_devices_panel.add(gpuCheckBox);
useGPUs.add(gpuCheckBox);
}
CPU cpu = new CPU();
if (cpu.cores() > 1) { // if only one core is available, no need to show the choice
double step = 1;
double display = (double)cpu.cores() / step;
while (display > 10) {
step += 1.0;
display = (double)cpu.cores() / step;
}
cpuCores = new JSlider(1, cpu.cores());
cpuCores.setMajorTickSpacing((int)(step));
cpuCores.setMinorTickSpacing(1);
cpuCores.setPaintTicks(true);
cpuCores.setPaintLabels(true);
cpuCores.setValue(config.getNbCores() != -1 ? config.getNbCores() : cpuCores.getMaximum());
JLabel coreLabel = new JLabel("CPU cores:");
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(coreLabel, compute_devices_constraints);
compute_devices_panel.add(coreLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(cpuCores, compute_devices_constraints);
compute_devices_panel.add(cpuCores);
}
// max ram allowed to render
OS os = OS.getOS();
int all_ram = (int) os.getMemory();
ram = new JSlider(0, all_ram);
int step = 1000000;
double display = (double)all_ram / (double)step;
while (display > 10) {
step += 1000000;
display = (double)all_ram / (double)step;
}
Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
for (int g = 0; g < all_ram; g += step) {
labelTable.put(new Integer(g), new JLabel("" + (g / 1000000)));
}
ram.setMajorTickSpacing(step);
ram.setLabelTable(labelTable);
ram.setPaintTicks(true);
ram.setPaintLabels(true);
ram.setValue((int)(config.getMaxMemory() != -1 ? config.getMaxMemory() : os.getMemory()));
JLabel ramLabel = new JLabel("Memory:");
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(ramLabel, compute_devices_constraints);
compute_devices_panel.add(ramLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(ram, compute_devices_constraints);
compute_devices_panel.add(ram);
parent.getContentPane().add(compute_devices_panel, constraints);
// priority
boolean high_priority_support = os.getSupportHighPriority();
priority = new JSlider(high_priority_support ? -19 : 0, 19);
priority.setMajorTickSpacing(19);
priority.setMinorTickSpacing(1);
priority.setPaintTicks(true);
priority.setPaintLabels(true);
priority.setValue(config.getPriority());
JLabel priorityLabel = new JLabel(high_priority_support ? "Priority (High <-> Low):" : "Priority (Normal <-> Low):" );
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(priorityLabel, compute_devices_constraints);
compute_devices_panel.add(priorityLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(priority, compute_devices_constraints);
compute_devices_panel.add(priority);
currentRow++;
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(compute_devices_panel, constraints);
// other
CollapsibleJPanel advanced_panel = new CollapsibleJPanel(new GridLayout(5, 2));
advanced_panel.setBorder(BorderFactory.createTitledBorder("Advanced options"));
JLabel proxyLabel = new JLabel("Proxy:");
proxyLabel.setToolTipText("http://login:password@host:port");
proxy = new JTextField();
proxy.setToolTipText("http://login:password@host:port");
proxy.setText(parent.getConfiguration().getProxy());
proxy.addKeyListener(new CheckCanStart());
advanced_panel.add(proxyLabel);
advanced_panel.add(proxy);
JLabel hostnameLabel = new JLabel("Computer name:");
hostname = new JTextField();
hostname.setText(parent.getConfiguration().getHostname());
advanced_panel.add(hostnameLabel);
advanced_panel.add(hostname);
JLabel renderTimeLabel = new JLabel("Max time per frame (in minute):");
int val = 0;
if (parent.getConfiguration().getMaxRenderTime() > 0) {
val = parent.getConfiguration().getMaxRenderTime() / 60;
}
renderTime = new JSpinner(new SpinnerNumberModel(val,0,1000,1));
advanced_panel.add(renderTimeLabel);
advanced_panel.add(renderTime);
JLabel customTileSizeLabel = new JLabel("Custom render tile size:");
customTileSize = new JCheckBox("", config.getTileSize() != -1);
advanced_panel.add(customTileSizeLabel);
advanced_panel.add(customTileSize);
customTileSize.addActionListener(new TileSizeChange());
tileSizeLabel = new JLabel("Tile Size:");
tileSizeValue = new JTextField();
int fromConfig = parent.getConfiguration().getTileSize();
if (fromConfig == -1) {
if (parent.getConfiguration().getGPUDevice() != null) {
fromConfig = parent.getConfiguration().getGPUDevice().getRecommandedTileSize();
}
else {
fromConfig = 32;
}
}
tileSizeValue.setText(Integer.toString(fromConfig));
hideCustomTileSize(config.getTileSize() != -1, false);
advanced_panel.add(tileSizeLabel);
advanced_panel.add(tileSizeValue);
currentRow++;
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(advanced_panel, constraints);
advanced_panel.setCollapsed(true);
// general settings
JPanel general_panel = new JPanel(new GridLayout(1, 2));
saveFile = new JCheckBox("Save settings", true);
general_panel.add(saveFile);
autoSignIn = new JCheckBox("Auto sign in", config.isAutoSignIn());
autoSignIn.addActionListener(new AutoSignInChangeAction());
general_panel.add(autoSignIn);
currentRow++;
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(general_panel, constraints);
String buttonText = "Start";
if (parent.getClient() != null) {
if (parent.getClient().isRunning()) {
buttonText = "Save";
}
}
saveButton = new JButton(buttonText);
checkDisplaySaveButton();
saveButton.addActionListener(new SaveAction());
currentRow++;
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.gridy = currentRow;
parent.getContentPane().add(saveButton, constraints);
if (haveAutoStarted == false && config.isAutoSignIn() && checkDisplaySaveButton()) {
// auto start
haveAutoStarted = true;
new SaveAction().actionPerformed(null);
}
}
public void hideCustomTileSize(boolean hidden, boolean displayWarning) {
tileSizeValue.setVisible(hidden);
tileSizeLabel.setVisible(hidden);
if (customTileSize.isSelected() == true && displayWarning) {
JOptionPane.showMessageDialog(parent.getContentPane(), "<html>These settings should only be changed if you are an advanced user.<br /> Improper settings may lead to invalid and slower renders!</html>", "Warning: Advanced Users Only!", JOptionPane.WARNING_MESSAGE);
}
}
public boolean checkDisplaySaveButton() {
boolean selected = useCPU.isSelected();
for (JCheckBoxGPU box : useGPUs) {
if (box.isSelected()) {
selected = true;
}
}
if (login.getText().isEmpty() || password.getPassword().length == 0 || Proxy.isValidURL(proxy.getText()) == false) {
selected = false;
}
if (customTileSize.isSelected()) {
try {
Integer.parseInt(tileSizeValue.getText().replaceAll(",", ""));
}
catch (NumberFormatException e) {
selected = false;
}
}
saveButton.setEnabled(selected);
return selected;
}
class ChooseFileAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(parent.getContentPane(), "<html>The working directory has to be dedicated directory. <br />Caution, everything not related to SheepIt-Renderfarm will be removed.<br />You should create a directory specifically for it.</html>", "Warning: files will be removed!", JOptionPane.WARNING_MESSAGE);
int returnVal = cacheDirChooser.showOpenDialog(parent.getContentPane());
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = cacheDirChooser.getSelectedFile();
cacheDir = file;
cacheDirText.setText(cacheDir.getName());
}
}
}
class CpuChangeAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
checkDisplaySaveButton();
}
}
class GpuChangeAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
for (JCheckBox box : useGPUs) {
if (box.equals(e.getSource()) == false) {
box.setSelected(false);
}
}
checkDisplaySaveButton();
}
}
class AutoSignInChangeAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (autoSignIn.isSelected()) {
saveFile.setSelected(true);
}
}
}
class TileSizeChange implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
boolean custom = customTileSize.isSelected();
hideCustomTileSize(custom, true);
}
}
class SaveAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (parent == null) {
return;
}
Configuration config = parent.getConfiguration();
if (config == null) {
return;
}
if (cacheDir != null) {
File fromConfig = config.getStorageDir();
if (fromConfig != null && fromConfig.getAbsolutePath().equals(cacheDir.getAbsolutePath()) == false) {
config.setCacheDir(cacheDir);
}
else {
// do nothing because the directory is the same as before
}
}
GPUDevice selected_gpu = null;
for (JCheckBoxGPU box : useGPUs) {
if (box.isSelected()) {
selected_gpu = box.getGPUDevice();
}
}
ComputeType method = ComputeType.CPU;
if (useCPU.isSelected() && selected_gpu == null) {
method = ComputeType.CPU;
}
else if (useCPU.isSelected() == false && selected_gpu != null) {
method = ComputeType.GPU;
}
else if (useCPU.isSelected() && selected_gpu != null) {
method = ComputeType.CPU_GPU;
}
config.setComputeMethod(method);
if (selected_gpu != null) {
config.setGPUDevice(selected_gpu);
}
int cpu_cores = -1;
if (cpuCores != null) {
cpu_cores = cpuCores.getValue();
}
if (cpu_cores > 0) {
config.setNbCores(cpu_cores);
}
long max_ram = -1;
if (ram != null) {
max_ram = ram.getValue();
}
if (max_ram > 0) {
config.setMaxMemory(max_ram);
}
int max_rendertime = -1;
if (renderTime != null) {
max_rendertime = (Integer)renderTime.getValue() * 60;
config.setMaxRenderTime(max_rendertime);
}
config.setUsePriority(priority.getValue());
String proxyText = null;
if (proxy != null) {
try {
Proxy.set(proxy.getText());
proxyText = proxy.getText();
}
catch (MalformedURLException e1) {
System.err.println("Error: wrong url for proxy");
System.err.println(e1);
System.exit(2);
}
}
String tile = null;
if (customTileSize.isSelected() && tileSizeValue != null) {
try {
tile = tileSizeValue.getText().replaceAll(",", "");
config.setTileSize(Integer.parseInt(tile));
}
catch (NumberFormatException e1) {
System.err.println("Error: wrong tile format");
System.err.println(e1);
System.exit(2);
}
}
else {
config.setTileSize(-1); // no tile
}
parent.setCredentials(login.getText(), new String(password.getPassword()));
String cachePath = null;
if (config.isUserHasSpecifiedACacheDir() && config.getCacheDirForSettings() != null) {
cachePath = config.getCacheDirForSettings().getAbsolutePath();
}
String hostnameText = hostname.getText();
if (hostnameText == null || hostnameText.isEmpty()) {
hostnameText = parent.getConfiguration().getHostname();
}
if (saveFile.isSelected()) {
new SettingsLoader(config.getConfigFilePath(), login.getText(), new String(password.getPassword()), proxyText, hostnameText, method, selected_gpu, cpu_cores, max_ram, max_rendertime, cachePath, autoSignIn.isSelected(), GuiSwing.type, tile, priority.getValue()).saveFile();
}
}
}
class JCheckBoxGPU extends JCheckBox {
private GPUDevice gpu;
public JCheckBoxGPU(GPUDevice gpu) {
super(gpu.getModel());
this.gpu = gpu;
}
public GPUDevice getGPUDevice() {
return gpu;
}
}
public class CheckCanStart implements KeyListener {
@Override
public void keyPressed(KeyEvent arg0) {
}
@Override
public void keyReleased(KeyEvent arg0) {
checkDisplaySaveButton();
}
@Override
public void keyTyped(KeyEvent arg0) {
}
}
}

View File

@@ -1,420 +0,0 @@
/*
* Copyright (C) 2015 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.swing.activity;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Spring;
import javax.swing.SpringLayout;
import com.sheepit.client.Client;
import com.sheepit.client.Job;
import com.sheepit.client.RenderProcess;
import com.sheepit.client.Server;
import com.sheepit.client.Stats;
import com.sheepit.client.Utils;
import com.sheepit.client.os.OS;
import com.sheepit.client.standalone.GuiSwing;
import com.sheepit.client.standalone.GuiSwing.ActivityType;
public class Working implements Activity {
private GuiSwing parent;
private JLabel statusContent;
private JLabel renderedFrameContent;
private JLabel remainingFrameContent;
private JLabel lastRenderTime;
private JLabel lastRender;
private JLabel creditEarned;
private JButton pauseButton;
private JButton exitAfterFrame;
private JLabel current_project_name_value;
private JLabel current_project_duration_value;
private JLabel currrent_project_progression_value;
private JLabel current_project_compute_method_value;
private JLabel user_info_points_total_value;
private JLabel renderable_projects_value;
private JLabel waiting_projects_value;
private JLabel connected_machines_value;
private JLabel user_info_total_rendertime_this_session_value;
public Working(GuiSwing parent_) {
parent = parent_;
statusContent = new JLabel("Init");
renderedFrameContent = new JLabel("");
remainingFrameContent = new JLabel("");
creditEarned = new JLabel("");
current_project_name_value = new JLabel("");
current_project_duration_value = new JLabel("");
currrent_project_progression_value = new JLabel("");
current_project_compute_method_value = new JLabel("");
user_info_points_total_value = new JLabel("");
renderable_projects_value = new JLabel("");
waiting_projects_value = new JLabel("");
connected_machines_value = new JLabel("");
user_info_total_rendertime_this_session_value = new JLabel("");
lastRenderTime = new JLabel("");
lastRender = new JLabel("");
}
@Override
public void show() {
// current project
JPanel current_project_panel = new JPanel(new SpringLayout());
current_project_panel.setBorder(BorderFactory.createTitledBorder("Project"));
JLabel current_project_status = new JLabel("Status: ", JLabel.TRAILING);
JLabel current_project_name = new JLabel("Name: ", JLabel.TRAILING);
JLabel current_project_duration = new JLabel("Rendering for: ", JLabel.TRAILING);
JLabel current_project_progression = new JLabel("Remaining: ", JLabel.TRAILING);
JLabel current_project_compute_method_label = new JLabel("Compute method: ", JLabel.TRAILING);
current_project_panel.add(current_project_status);
current_project_panel.add(statusContent);
current_project_panel.add(current_project_name);
current_project_panel.add(current_project_name_value);
current_project_panel.add(current_project_duration);
current_project_panel.add(current_project_duration_value);
current_project_panel.add(current_project_progression);
current_project_panel.add(currrent_project_progression_value);
current_project_panel.add(current_project_compute_method_label);
current_project_panel.add(current_project_compute_method_value);
// user info
JPanel session_info_panel = new JPanel(new SpringLayout());
session_info_panel.setBorder(BorderFactory.createTitledBorder("Session infos"));
JLabel user_info_credits_this_session = new JLabel("Points earned: ", JLabel.TRAILING);
JLabel user_info_total_rendertime_this_session = new JLabel("Duration: ", JLabel.TRAILING);
JLabel user_info_rendered_frame_this_session = new JLabel("Rendered frames: ", JLabel.TRAILING);
JLabel global_static_renderable_project = new JLabel("Renderable projects: ", JLabel.TRAILING);
session_info_panel.add(user_info_credits_this_session);
session_info_panel.add(creditEarned);
session_info_panel.add(user_info_rendered_frame_this_session);
session_info_panel.add(renderedFrameContent);
session_info_panel.add(global_static_renderable_project);
session_info_panel.add(renderable_projects_value);
session_info_panel.add(user_info_total_rendertime_this_session);
session_info_panel.add(user_info_total_rendertime_this_session_value);
// global stats
JPanel global_stats_panel = new JPanel(new SpringLayout());
global_stats_panel.setBorder(BorderFactory.createTitledBorder("Global stats"));
JLabel global_stats_machine_connected = new JLabel("Machines connected: ", JLabel.TRAILING);
JLabel global_stats_remaining_frame = new JLabel("Remaining frames: ", JLabel.TRAILING);
JLabel global_stats_waiting_project = new JLabel("Active projects: ", JLabel.TRAILING);
JLabel global_stats_user_points = new JLabel("User's points: ", JLabel.TRAILING);
global_stats_panel.add(global_stats_waiting_project);
global_stats_panel.add(waiting_projects_value);
global_stats_panel.add(global_stats_machine_connected);
global_stats_panel.add(connected_machines_value);
global_stats_panel.add(global_stats_remaining_frame);
global_stats_panel.add(remainingFrameContent);
global_stats_panel.add(global_stats_user_points);
global_stats_panel.add(user_info_points_total_value);
// last frame
JPanel last_frame_panel = new JPanel();
last_frame_panel.setLayout(new BoxLayout(last_frame_panel, BoxLayout.Y_AXIS));
last_frame_panel.setBorder(BorderFactory.createTitledBorder("Last rendered frame"));
lastRender.setIcon(new ImageIcon(new BufferedImage(200, 120, BufferedImage.TYPE_INT_ARGB)));
lastRender.setAlignmentX(Component.CENTER_ALIGNMENT);
lastRenderTime.setAlignmentX(Component.CENTER_ALIGNMENT);
last_frame_panel.add(lastRenderTime);
last_frame_panel.add(lastRender);
ImageIcon image = new ImageIcon(getClass().getResource("/title.png"));
JLabel labelImage = new JLabel(image);
labelImage.setAlignmentX(Component.CENTER_ALIGNMENT);
parent.getContentPane().add(labelImage);
JPanel buttonsPanel = new JPanel(new GridLayout(2, 2));
JButton settingsButton = new JButton("Settings");
settingsButton.addActionListener(new SettingsAction());
pauseButton = new JButton("Pause");
Client client = parent.getClient();
if (client != null && client.isSuspended()) {
pauseButton.setText("Resume");
}
pauseButton.addActionListener(new PauseAction());
JButton blockJob = new JButton("Block this project");
blockJob.addActionListener(new blockJobAction());
exitAfterFrame = new JButton("Exit after this frame");
exitAfterFrame.addActionListener(new ExitAfterAction());
buttonsPanel.add(settingsButton);
buttonsPanel.add(pauseButton);
buttonsPanel.add(blockJob);
buttonsPanel.add(exitAfterFrame);
parent.getContentPane().setLayout(new GridBagLayout());
GridBagConstraints global_constraints = new GridBagConstraints();
global_constraints.fill = GridBagConstraints.HORIZONTAL;
global_constraints.weightx = 1;
global_constraints.gridx = 0;
parent.getContentPane().add(current_project_panel, global_constraints);
parent.getContentPane().add(global_stats_panel, global_constraints);
parent.getContentPane().add(session_info_panel, global_constraints);
parent.getContentPane().add(last_frame_panel, global_constraints);
parent.getContentPane().add(buttonsPanel, global_constraints);
Spring widthLeftColumn = getBestWidth(current_project_panel, 4, 2);
widthLeftColumn = Spring.max(widthLeftColumn, getBestWidth(global_stats_panel, 4, 2));
widthLeftColumn = Spring.max(widthLeftColumn, getBestWidth(session_info_panel, 3, 2));
alignPanel(current_project_panel, 5, 2, widthLeftColumn);
alignPanel(global_stats_panel, 4, 2, widthLeftColumn);
alignPanel(session_info_panel, 4, 2, widthLeftColumn);
}
public void setStatus(String msg_) {
statusContent.setText("<html>" + msg_ + "</html>");
}
public void setRenderingProjectName(String msg_) {
current_project_name_value.setText("<html>" + (msg_.length() > 26 ? msg_.substring(0, 26) : msg_) + "</html>");
}
public void setRemainingTime(String time_) {
currrent_project_progression_value.setText("<html>" + time_ + "</html>");
}
public void setRenderingTime(String time_) {
current_project_duration_value.setText("<html>" + time_ + "</html>");
}
public void setComputeMethod(String computeMethod_) {
this.current_project_compute_method_value.setText(computeMethod_);
}
public void displayStats(Stats stats) {
DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0");
remainingFrameContent.setText(df.format(stats.getRemainingFrame()));
creditEarned.setText(df.format(stats.getCreditsEarnedDuringSession()));
user_info_points_total_value.setText(df.format(stats.getCreditsEarned()));
renderable_projects_value.setText(df.format(stats.getRenderableProject()));
waiting_projects_value.setText(df.format(stats.getWaitingProject()));
connected_machines_value.setText(df.format(stats.getConnectedMachine()));
updateTime();
}
public void updateTime() {
if (this.parent.getClient().getStartTime() != 0) {
user_info_total_rendertime_this_session_value.setText(Utils.humanDuration(new Date((new Date().getTime() - this.parent.getClient().getStartTime()))));
}
Job job = this.parent.getClient().getRenderingJob();
if (job != null && job.getProcessRender() != null && job.getProcessRender().getStartTime() > 0) {
current_project_duration_value.setText("<html>" + Utils.humanDuration(new Date((new Date().getTime() - job.getProcessRender().getStartTime()))) + "</html>");
}
else {
current_project_duration_value.setText("");
}
}
public void setRenderedFrame(int n) {
renderedFrameContent.setText(String.valueOf(n));
showLastRender();
}
public void showLastRender() {
Client client = parent.getClient();
if (client != null) {
Job lastJob = client.getPreviousJob();
Server server = client.getServer();
if (server != null) {
byte[] data = server.getLastRender();
if (data != null) {
InputStream is = new ByteArrayInputStream(data);
try {
BufferedImage image = ImageIO.read(is);
if (image != null) {
lastRender.setIcon(new ImageIcon(image));
if (lastJob != null) {
// don't use lastJob.getProcessRender().getDuration() due to timezone
if (lastJob.getProcessRender().getDuration() > 1) {
lastRenderTime.setText("Render time : " + Utils.humanDuration(new Date(lastJob.getProcessRender().getEndTime() - lastJob.getProcessRender().getStartTime())));
}
}
}
}
catch (IOException e) {
System.out.println("Working::showLastRender() exception " + e);
e.printStackTrace();
}
}
}
}
}
private void alignPanel(Container parent, int rows, int cols, Spring width) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
}
catch (ClassCastException exc) {
System.err.println("The first argument to makeCompactGrid must use SpringLayout.");
return;
}
Spring x = Spring.constant(0);
for (int c = 0; c < cols; c++) {
for (int r = 0; r < rows; r++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r, c, parent, cols);
constraints.setX(x);
constraints.setWidth(width);
}
x = Spring.sum(x, width);
}
Spring y = Spring.constant(0);
for (int r = 0; r < rows; r++) {
Spring height = Spring.constant(0);
for (int c = 0; c < cols; c++) {
height = Spring.max(height, getConstraintsForCell(r, c, parent, cols).getHeight());
}
for (int c = 0; c < cols; c++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r, c, parent, cols);
constraints.setY(y);
constraints.setHeight(height);
}
y = Spring.sum(y, height);
}
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, y);
pCons.setConstraint(SpringLayout.EAST, x);
}
private Spring getBestWidth(Container parent, int rows, int cols) {
Spring x = Spring.constant(0);
Spring width = Spring.constant(0);
for (int c = 0; c < cols; c++) {
for (int r = 0; r < rows; r++) {
width = Spring.max(width, getConstraintsForCell(r, c, parent, cols).getWidth());
}
}
return width;
}
private SpringLayout.Constraints getConstraintsForCell(int row, int col, Container parent, int cols) {
SpringLayout layout = (SpringLayout) parent.getLayout();
Component c = parent.getComponent(row * cols + col);
return layout.getConstraints(c);
}
class PauseAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Client client = parent.getClient();
if (client != null) {
if (client.isSuspended()) {
pauseButton.setText("Pause");
client.resume();
}
else {
pauseButton.setText("Resume");
client.suspend();
}
}
}
}
class SettingsAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (parent != null) {
parent.showActivity(ActivityType.SETTINGS);
}
}
}
class ExitAfterAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Client client = parent.getClient();
if (client != null) {
if (client.isRunning()) {
exitAfterFrame.setText("Cancel exit");
client.askForStop();
}
else {
exitAfterFrame.setText("Exit after this frame");
client.cancelStop();
}
}
}
}
class blockJobAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Client client = parent.getClient();
if (client != null) {
Job job = client.getRenderingJob();
if (job != null) {
job.block();
}
}
}
}
}

View File

@@ -1,156 +0,0 @@
/*
* Copyright (C) 2015 Laurent CLOUET
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.swing.components;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
public class CollapsibleJPanel extends JPanel {
private boolean isCompnentsVisible = true;
private int originalHeight;
private String borderTitle = "";
private int COLLAPSED_HEIGHT = 22;
private boolean[] originalVisibilty;
public CollapsibleJPanel(LayoutManager layoutManager) {
setLayout(layoutManager);
addMouseListener(new onClickHandler());
}
public void setCollapsed(boolean aFlag) {
if (aFlag) {
hideComponents();
}
else {
showComponents();
}
}
public void toggleCollapsed() {
if (isCompnentsVisible) {
setCollapsed(true);
}
else {
setCollapsed(false);
}
}
private void hideComponents() {
Component[] components = getComponents();
originalVisibilty = new boolean[components.length];
// Hide all componens on panel
for (int i = 0; i < components.length; i++) {
originalVisibilty[i] = components[i].isVisible();
components[i].setVisible(false);
}
setHeight(COLLAPSED_HEIGHT);
// Add '+' char to end of border title
//setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), borderTitle + " + "));
setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), " + " + borderTitle));
// Update flag
isCompnentsVisible = false;
}
private void showComponents() {
Component[] components = getComponents();
// Set all components in panel to visible
for (int i = 0; i < components.length; i++) {
components[i].setVisible(originalVisibilty[i]);
}
setHeight(originalHeight);
// Add '-' char to end of border title
setBorder(BorderFactory.createTitledBorder(" - " + borderTitle));
// Update flag
isCompnentsVisible = true;
}
private void setHeight(int height) {
setPreferredSize(new Dimension(getPreferredSize().width, height));
setMinimumSize(new Dimension(getMinimumSize().width, height));
setMaximumSize(new Dimension(getMaximumSize().width, height));
}
@Override
public Component add(Component component) { // Need this to get the original height of panel
Component returnComponent = super.add(component);
originalHeight = getPreferredSize().height;
return returnComponent;
}
@Override
public void setBorder(Border border) { // Need this to get the border title
if (border instanceof TitledBorder && (borderTitle == "")) {
borderTitle = ((TitledBorder) border).getTitle();
((TitledBorder) border).setTitle(" - " + borderTitle);
}
super.setBorder(border);
}
public class onClickHandler implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getPoint().y < COLLAPSED_HEIGHT) { // Only if click is on top of panel
((CollapsibleJPanel) e.getComponent()).toggleCollapsed();
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
}
}

View File

@@ -1,104 +0,0 @@
/*
* Copyright (C) 2017 Laurent CLOUET
* Author Rolf Aretz Lap <rolf.aretz@ottogroup.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.text;
import com.sheepit.client.Client;
import com.sheepit.client.Configuration;
import com.sheepit.client.Job;
public class CLIInputActionHandler implements CLIInputListener {
@Override
public void commandEntered(Client client, String command) {
int priorityLength = "priority".length();
//prevent Null Pointer at next step
if (command == null) {
return;
}
if (client == null) {
return;
}
if (command.equalsIgnoreCase("block")) {
Job job = client.getRenderingJob();
if (job != null) {
job.block();
}
}
else if (command.equalsIgnoreCase("resume")) {
client.resume();
}
else if (command.equalsIgnoreCase("pause")) {
client.suspend();
}
else if (command.equalsIgnoreCase("stop")) {
client.askForStop();
}
else if (command.equalsIgnoreCase("status")) {
displayStatus(client);
}
else if (command.equalsIgnoreCase("cancel")) {
client.cancelStop();
}
else if (command.equalsIgnoreCase("quit")) {
client.stop();
System.exit(0);
}
else if ((command.length() > priorityLength) && (command.substring(0, priorityLength).equalsIgnoreCase("priority"))) {
changePriority(client, command.substring(priorityLength));
}
else {
System.out.println("Unknown command: " + command);
System.out.println("status: display client status");
System.out.println("priority <n>: set the priority for the next renderjob");
System.out.println("block: block project");
System.out.println("pause: pause client requesting new jobs");
System.out.println("resume: resume after client was paused");
System.out.println("stop: exit after frame was finished");
System.out.println("cancel: cancel exit");
System.out.println("quit: exit now");
}
}
void changePriority(Client client, String newPriority) {
Configuration config = client.getConfiguration();
if (config != null) {
try {
config.setUsePriority(Integer.parseInt(newPriority.trim()));
}
catch (NumberFormatException e) {
System.out.println("Invalid priority: " + newPriority);
}
}
}
void displayStatus(Client client) {
if (client.isSuspended()) {
System.out.println("Status: paused");
}
else if (client.isRunning()) {
System.out.println("Status: running");
}
else {
System.out.println("Status: will exit after the current frame");
}
}
}

View File

@@ -1,26 +0,0 @@
/*
* Copyright (C) 2017 Laurent CLOUET
* Author Rolf Aretz Lap <rolf.aretz@ottogroup.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.text;
import com.sheepit.client.Client;
public interface CLIInputListener {
public void commandEntered(Client client, String command);
}

View File

@@ -1,65 +0,0 @@
/*
* Copyright (C) 2017 Laurent CLOUET
* Author Rolf Aretz Lap <rolf.aretz@ottogroup.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.sheepit.client.standalone.text;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import com.sheepit.client.Client;
public class CLIInputObserver implements Runnable {
private BufferedReader in;
private Client client;
public CLIInputObserver(Client client) {
this.client = client;
}
private List<CLIInputListener> listeners = new ArrayList<CLIInputListener>();
public void addListener(CLIInputListener toAdd) {
listeners.add(toAdd);
}
public void run() {
in = new BufferedReader(new InputStreamReader(System.in));
String line = "";
while ((line != null) && (line.equalsIgnoreCase("quit") == false)) {
try {
line = in.readLine();
}
catch (Exception e) {
// TODO: handle exception
}
for (CLIInputListener cliil : listeners)
cliil.commandEntered(client, line);
}
try {
in.close();
}
catch (Exception e) {
// TODO: handle exception
}
}
}