Оптимизирован доступ к операциям
This commit is contained in:
parent
d62b472fe8
commit
f32d1d0500
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -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,7 +34,7 @@ public class CursorOperation extends Operation {
|
||||
private RobotUtils robot;
|
||||
private boolean running;
|
||||
|
||||
private CursorOperation() {
|
||||
public CursorOperation() {
|
||||
try {
|
||||
robot = new RobotUtils();
|
||||
} catch (AWTException ex) {
|
||||
@ -44,16 +42,6 @@ public class CursorOperation extends Operation {
|
||||
}
|
||||
}
|
||||
|
||||
public CursorOperation(DataInputStream dis) {
|
||||
this();
|
||||
this.dis = dis;
|
||||
}
|
||||
|
||||
public CursorOperation(DataOutputStream dos) {
|
||||
this();
|
||||
this.dos = dos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startServerSide() throws IOException {
|
||||
int type = NONE;
|
||||
@ -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;
|
||||
|
||||
// Îòïðàâëÿåì ðàçìåð ïàíåëè.
|
||||
|
@ -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;
|
||||
@ -18,14 +16,6 @@ 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);
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
@ -12,14 +10,6 @@ import java.io.IOException;
|
||||
*/
|
||||
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 {
|
||||
String text = dis.readUTF();
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,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;
|
||||
|
||||
public abstract void startClientSide(Object... params) throws Exception;
|
||||
|
Loading…
Reference in New Issue
Block a user