diff --git a/src/com/annimon/socketfiletransfer/Main.java b/src/com/annimon/socketfiletransfer/Main.java index 94fb45a..09e0053 100644 --- a/src/com/annimon/socketfiletransfer/Main.java +++ b/src/com/annimon/socketfiletransfer/Main.java @@ -1,7 +1,6 @@ package com.annimon.socketfiletransfer; import com.annimon.socketfiletransfer.util.ExceptionHandler; -import java.io.File; import java.io.IOException; import javax.swing.JOptionPane; @@ -32,17 +31,15 @@ public class Main { } try { Client client = new Client(host); + final OperationManager manager = client.getManager(); if (args[0].equalsIgnoreCase("file")) { - String filePath = args[1]; - client.getManager().sendFile( new File(filePath) ); + manager.execute(OperationListener.MODE_FILE_TRANSFER, args[1]); } else if (args[0].equalsIgnoreCase("message")) { - String message = args[1]; - client.getManager().sendMessage(message); + manager.execute(OperationListener.MODE_MESSAGE_TRANSFER, args[1]); } else if (args[0].equalsIgnoreCase("cursor")) { - client.getManager().startCursorControl(); + manager.execute(OperationListener.MODE_CURSOR_CONTROL); } else if (args[0].equalsIgnoreCase("brightness")) { - String brightness = args[1].trim(); - client.getManager().changeBrightness(brightness); + manager.execute(OperationListener.MODE_BRIGHTNESS_CHANGE, args[1]); } client.close(); } catch (IOException ex) { diff --git a/src/com/annimon/socketfiletransfer/OperationListener.java b/src/com/annimon/socketfiletransfer/OperationListener.java index 59c9930..c02db7b 100644 --- a/src/com/annimon/socketfiletransfer/OperationListener.java +++ b/src/com/annimon/socketfiletransfer/OperationListener.java @@ -37,24 +37,9 @@ public class OperationListener { public void listenOperation() throws Exception { int mode = dis.readInt(); - Operation operation; - switch(mode) { - case MODE_FILE_TRANSFER: - operation = new FileOperation(dis); - break; - case MODE_MESSAGE_TRANSFER: - operation = new MessageOperation(dis); - break; - case MODE_CURSOR_CONTROL: - operation = new CursorOperation(dis); - break; - case MODE_BRIGHTNESS_CHANGE: - operation = new BrightnessOperation(dis); - break; - default: - return; - } + Operation operation = getOperation(mode); if (operation != null) { + operation.setDataInputStream(dis); operation.startServerSide(); } } @@ -75,4 +60,24 @@ public class OperationListener { } } } + + protected Operation getOperation(int mode) { + Operation operation = null; + switch(mode) { + case MODE_FILE_TRANSFER: + operation = new FileOperation(); + break; + case MODE_MESSAGE_TRANSFER: + operation = new MessageOperation(); + break; + case MODE_CURSOR_CONTROL: + operation = new CursorOperation(); + break; + case MODE_BRIGHTNESS_CHANGE: + operation = new BrightnessOperation(); + break; + } + + return operation; + } } diff --git a/src/com/annimon/socketfiletransfer/OperationManager.java b/src/com/annimon/socketfiletransfer/OperationManager.java index 6de7184..4448c2b 100644 --- a/src/com/annimon/socketfiletransfer/OperationManager.java +++ b/src/com/annimon/socketfiletransfer/OperationManager.java @@ -1,14 +1,6 @@ package com.annimon.socketfiletransfer; -import com.annimon.socketfiletransfer.operations.BrightnessOperation; -import com.annimon.socketfiletransfer.operations.CursorOperation; -import com.annimon.socketfiletransfer.operations.MessageOperation; -import com.annimon.socketfiletransfer.operations.FileOperation; import com.annimon.socketfiletransfer.operations.Operation; -import java.awt.Toolkit; -import java.io.File; -import javax.swing.JDialog; -import javax.swing.JPanel; /** * Менеджер операций с данными. @@ -16,35 +8,12 @@ import javax.swing.JPanel; */ public class OperationManager extends OperationListener { - public void sendFile(File file) throws Exception { - Operation operation = new FileOperation(dos); - operation.startClientSide(file); - } - - public void sendMessage(String message) throws Exception { - Operation operation = new MessageOperation(dos); - operation.startClientSide(message); - } - - public void startCursorControl() throws Exception { - JPanel panel = new JPanel(); - panel.setFocusable(true); - panel.requestFocusInWindow(); - panel.setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize()); - - JDialog dialog = new JDialog(); - dialog.add(panel); - dialog.setUndecorated(true); - dialog.pack(); - dialog.setVisible(true); - - Operation operation = new CursorOperation(dos); - operation.startClientSide(dialog, panel); - } - - public void changeBrightness(String brightness) throws Exception { - Operation operation = new BrightnessOperation(dos); - operation.startClientSide(brightness); + public void execute(int mode, Object... params) throws Exception { + Operation operation = getOperation(mode); + if (operation != null) { + operation.setDataOutputStream(dos); + operation.startClientSide(params); + } } } diff --git a/src/com/annimon/socketfiletransfer/operations/BrightnessOperation.java b/src/com/annimon/socketfiletransfer/operations/BrightnessOperation.java new file mode 100644 index 0000000..aa445d9 --- /dev/null +++ b/src/com/annimon/socketfiletransfer/operations/BrightnessOperation.java @@ -0,0 +1,52 @@ +package com.annimon.socketfiletransfer.operations; + +import com.annimon.socketfiletransfer.OperationListener; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; + +/** + * + * @author aNNiMON + */ +public class BrightnessOperation extends Operation { + + @Override + public void startServerSide() throws Exception { + String value = dis.readUTF(); + + String path = extractExecutable("/brgt"); + String[] cmd = { path, value }; + Process p = Runtime.getRuntime().exec(cmd); + p.waitFor(); + + new File(path).delete(); + } + + @Override + public void startClientSide(Object... params) throws Exception { + String value = (String) params[0]; + + dos.writeInt(OperationListener.MODE_BRIGHTNESS_CHANGE); + dos.writeUTF(value); + } + + private String extractExecutable(String res) throws Exception { + InputStream is = getClass().getResourceAsStream(res); + + File executable = File.createTempFile("exec", ".exe"); + + final int BUFFER_SIZE = 1024; + FileOutputStream fout = new FileOutputStream(executable); + byte[] buffer = new byte[BUFFER_SIZE]; + int count; + while ((count = is.read(buffer, 0, BUFFER_SIZE)) != -1) { + fout.write(buffer, 0, count); + } + fout.flush(); + fout.close(); + + return executable.getAbsolutePath(); + } + +} diff --git a/src/com/annimon/socketfiletransfer/operations/CursorOperation.java b/src/com/annimon/socketfiletransfer/operations/CursorOperation.java index f2d5fba..413b821 100644 --- a/src/com/annimon/socketfiletransfer/operations/CursorOperation.java +++ b/src/com/annimon/socketfiletransfer/operations/CursorOperation.java @@ -1,6 +1,6 @@ package com.annimon.socketfiletransfer.operations; -import com.annimon.socketfiletransfer.OperationManager; +import com.annimon.socketfiletransfer.OperationListener; import com.annimon.socketfiletransfer.util.ExceptionHandler; import com.annimon.socketfiletransfer.util.RobotUtils; import java.awt.AWTException; @@ -12,8 +12,6 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import javax.swing.JDialog; import javax.swing.JPanel; @@ -36,23 +34,13 @@ public class CursorOperation extends Operation { private RobotUtils robot; private boolean running; - private CursorOperation() { + public CursorOperation() { try { robot = new RobotUtils(); } catch (AWTException ex) { ExceptionHandler.handle(ex); } } - - public CursorOperation(DataInputStream dis) { - this(); - this.dis = dis; - } - - public CursorOperation(DataOutputStream dos) { - this(); - this.dos = dos; - } @Override public void startServerSide() throws IOException { @@ -91,12 +79,21 @@ public class CursorOperation extends Operation { @Override public void startClientSide(Object... params) throws Exception { - final JDialog dialog = (JDialog) params[0]; - JPanel panel = (JPanel) params[1]; + // Создание диалога для прослушивания событий. + JPanel panel = new JPanel(); + panel.setFocusable(true); + panel.requestFocusInWindow(); + panel.setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize()); + + JDialog dialog = new JDialog(); + dialog.add(panel); + dialog.setUndecorated(true); + dialog.pack(); + dialog.setVisible(true); Point cursor = robot.getCursorPosition(); System.out.println("Start tracking cursor. Now: " + cursor.toString()); - dos.writeInt(OperationManager.MODE_CURSOR_CONTROL); + dos.writeInt(OperationListener.MODE_CURSOR_CONTROL); running = true; // Отправляем размер панели. diff --git a/src/com/annimon/socketfiletransfer/operations/FileOperation.java b/src/com/annimon/socketfiletransfer/operations/FileOperation.java index 19661c1..ae87369 100644 --- a/src/com/annimon/socketfiletransfer/operations/FileOperation.java +++ b/src/com/annimon/socketfiletransfer/operations/FileOperation.java @@ -1,10 +1,8 @@ package com.annimon.socketfiletransfer.operations; -import com.annimon.socketfiletransfer.OperationManager; +import com.annimon.socketfiletransfer.OperationListener; import com.annimon.socketfiletransfer.util.Config; import com.annimon.socketfiletransfer.util.ExceptionHandler; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -17,15 +15,7 @@ import java.io.IOException; public class FileOperation extends Operation { private static final int BUFFER_SIZE = 1024; - - public FileOperation(DataInputStream dis) { - this.dis = dis; - } - - public FileOperation(DataOutputStream dos) { - this.dos = dos; - } - + @Override public void startServerSide() { FileOutputStream fout = null; @@ -55,7 +45,7 @@ public class FileOperation extends Operation { public void startClientSide(Object... params) throws Exception { File file = (File) params[0]; - dos.writeInt(OperationManager.MODE_FILE_TRANSFER); + dos.writeInt(OperationListener.MODE_FILE_TRANSFER); String name = file.getName(); dos.writeUTF(name); diff --git a/src/com/annimon/socketfiletransfer/operations/MessageOperation.java b/src/com/annimon/socketfiletransfer/operations/MessageOperation.java index ffc8b43..e1cd45a 100644 --- a/src/com/annimon/socketfiletransfer/operations/MessageOperation.java +++ b/src/com/annimon/socketfiletransfer/operations/MessageOperation.java @@ -1,9 +1,7 @@ package com.annimon.socketfiletransfer.operations; +import com.annimon.socketfiletransfer.OperationListener; import com.annimon.socketfiletransfer.util.MessageHistory; -import com.annimon.socketfiletransfer.OperationManager; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; /** @@ -11,14 +9,6 @@ import java.io.IOException; * @author aNNiMON */ public class MessageOperation extends Operation { - - public MessageOperation(DataInputStream dis) { - this.dis = dis; - } - - public MessageOperation(DataOutputStream dos) { - this.dos = dos; - } @Override public void startServerSide() throws IOException { @@ -31,7 +21,7 @@ public class MessageOperation extends Operation { public void startClientSide(Object... params) throws Exception { String message = (String) params[0]; - dos.writeInt(OperationManager.MODE_MESSAGE_TRANSFER); + dos.writeInt(OperationListener.MODE_MESSAGE_TRANSFER); dos.writeUTF(message); } diff --git a/src/com/annimon/socketfiletransfer/operations/Operation.java b/src/com/annimon/socketfiletransfer/operations/Operation.java index 58764ed..b076104 100644 --- a/src/com/annimon/socketfiletransfer/operations/Operation.java +++ b/src/com/annimon/socketfiletransfer/operations/Operation.java @@ -11,6 +11,14 @@ public abstract class Operation { protected DataInputStream dis; protected DataOutputStream dos; + + public void setDataInputStream(DataInputStream dis) { + this.dis = dis; + } + + public void setDataOutputStream(DataOutputStream dos) { + this.dos = dos; + } public abstract void startServerSide() throws Exception;