Оптимизирован доступ к операциям
This commit is contained in:
parent
d62b472fe8
commit
f32d1d0500
@ -1,7 +1,6 @@
|
|||||||
package com.annimon.socketfiletransfer;
|
package com.annimon.socketfiletransfer;
|
||||||
|
|
||||||
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
@ -32,17 +31,15 @@ public class Main {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Client client = new Client(host);
|
Client client = new Client(host);
|
||||||
|
final OperationManager manager = client.getManager();
|
||||||
if (args[0].equalsIgnoreCase("file")) {
|
if (args[0].equalsIgnoreCase("file")) {
|
||||||
String filePath = args[1];
|
manager.execute(OperationListener.MODE_FILE_TRANSFER, args[1]);
|
||||||
client.getManager().sendFile( new File(filePath) );
|
|
||||||
} else if (args[0].equalsIgnoreCase("message")) {
|
} else if (args[0].equalsIgnoreCase("message")) {
|
||||||
String message = args[1];
|
manager.execute(OperationListener.MODE_MESSAGE_TRANSFER, args[1]);
|
||||||
client.getManager().sendMessage(message);
|
|
||||||
} else if (args[0].equalsIgnoreCase("cursor")) {
|
} else if (args[0].equalsIgnoreCase("cursor")) {
|
||||||
client.getManager().startCursorControl();
|
manager.execute(OperationListener.MODE_CURSOR_CONTROL);
|
||||||
} else if (args[0].equalsIgnoreCase("brightness")) {
|
} else if (args[0].equalsIgnoreCase("brightness")) {
|
||||||
String brightness = args[1].trim();
|
manager.execute(OperationListener.MODE_BRIGHTNESS_CHANGE, args[1]);
|
||||||
client.getManager().changeBrightness(brightness);
|
|
||||||
}
|
}
|
||||||
client.close();
|
client.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
|
@ -37,24 +37,9 @@ public class OperationListener {
|
|||||||
|
|
||||||
public void listenOperation() throws Exception {
|
public void listenOperation() throws Exception {
|
||||||
int mode = dis.readInt();
|
int mode = dis.readInt();
|
||||||
Operation operation;
|
Operation operation = getOperation(mode);
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (operation != null) {
|
if (operation != null) {
|
||||||
|
operation.setDataInputStream(dis);
|
||||||
operation.startServerSide();
|
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;
|
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 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 class OperationManager extends OperationListener {
|
||||||
|
|
||||||
public void sendFile(File file) throws Exception {
|
public void execute(int mode, Object... params) throws Exception {
|
||||||
Operation operation = new FileOperation(dos);
|
Operation operation = getOperation(mode);
|
||||||
operation.startClientSide(file);
|
if (operation != null) {
|
||||||
|
operation.setDataOutputStream(dos);
|
||||||
|
operation.startClientSide(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
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.ExceptionHandler;
|
||||||
import com.annimon.socketfiletransfer.util.RobotUtils;
|
import com.annimon.socketfiletransfer.util.RobotUtils;
|
||||||
import java.awt.AWTException;
|
import java.awt.AWTException;
|
||||||
@ -12,8 +12,6 @@ import java.awt.event.KeyAdapter;
|
|||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import javax.swing.JDialog;
|
import javax.swing.JDialog;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
@ -36,7 +34,7 @@ public class CursorOperation extends Operation {
|
|||||||
private RobotUtils robot;
|
private RobotUtils robot;
|
||||||
private boolean running;
|
private boolean running;
|
||||||
|
|
||||||
private CursorOperation() {
|
public CursorOperation() {
|
||||||
try {
|
try {
|
||||||
robot = new RobotUtils();
|
robot = new RobotUtils();
|
||||||
} catch (AWTException ex) {
|
} 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
|
@Override
|
||||||
public void startServerSide() throws IOException {
|
public void startServerSide() throws IOException {
|
||||||
int type = NONE;
|
int type = NONE;
|
||||||
@ -91,12 +79,21 @@ public class CursorOperation extends Operation {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startClientSide(Object... params) throws Exception {
|
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();
|
Point cursor = robot.getCursorPosition();
|
||||||
System.out.println("Start tracking cursor. Now: " + cursor.toString());
|
System.out.println("Start tracking cursor. Now: " + cursor.toString());
|
||||||
dos.writeInt(OperationManager.MODE_CURSOR_CONTROL);
|
dos.writeInt(OperationListener.MODE_CURSOR_CONTROL);
|
||||||
running = true;
|
running = true;
|
||||||
|
|
||||||
// Îòïðàâëÿåì ðàçìåð ïàíåëè.
|
// Îòïðàâëÿåì ðàçìåð ïàíåëè.
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package com.annimon.socketfiletransfer.operations;
|
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.Config;
|
||||||
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
import com.annimon.socketfiletransfer.util.ExceptionHandler;
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -18,14 +16,6 @@ public class FileOperation extends Operation {
|
|||||||
|
|
||||||
private static final int BUFFER_SIZE = 1024;
|
private static final int BUFFER_SIZE = 1024;
|
||||||
|
|
||||||
public FileOperation(DataInputStream dis) {
|
|
||||||
this.dis = dis;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FileOperation(DataOutputStream dos) {
|
|
||||||
this.dos = dos;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startServerSide() {
|
public void startServerSide() {
|
||||||
FileOutputStream fout = null;
|
FileOutputStream fout = null;
|
||||||
@ -55,7 +45,7 @@ public class FileOperation extends Operation {
|
|||||||
public void startClientSide(Object... params) throws Exception {
|
public void startClientSide(Object... params) throws Exception {
|
||||||
File file = (File) params[0];
|
File file = (File) params[0];
|
||||||
|
|
||||||
dos.writeInt(OperationManager.MODE_FILE_TRANSFER);
|
dos.writeInt(OperationListener.MODE_FILE_TRANSFER);
|
||||||
|
|
||||||
String name = file.getName();
|
String name = file.getName();
|
||||||
dos.writeUTF(name);
|
dos.writeUTF(name);
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package com.annimon.socketfiletransfer.operations;
|
package com.annimon.socketfiletransfer.operations;
|
||||||
|
|
||||||
|
import com.annimon.socketfiletransfer.OperationListener;
|
||||||
import com.annimon.socketfiletransfer.util.MessageHistory;
|
import com.annimon.socketfiletransfer.util.MessageHistory;
|
||||||
import com.annimon.socketfiletransfer.OperationManager;
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -12,14 +10,6 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
public class MessageOperation extends Operation {
|
public class MessageOperation extends Operation {
|
||||||
|
|
||||||
public MessageOperation(DataInputStream dis) {
|
|
||||||
this.dis = dis;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MessageOperation(DataOutputStream dos) {
|
|
||||||
this.dos = dos;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startServerSide() throws IOException {
|
public void startServerSide() throws IOException {
|
||||||
String text = dis.readUTF();
|
String text = dis.readUTF();
|
||||||
@ -31,7 +21,7 @@ public class MessageOperation extends Operation {
|
|||||||
public void startClientSide(Object... params) throws Exception {
|
public void startClientSide(Object... params) throws Exception {
|
||||||
String message = (String) params[0];
|
String message = (String) params[0];
|
||||||
|
|
||||||
dos.writeInt(OperationManager.MODE_MESSAGE_TRANSFER);
|
dos.writeInt(OperationListener.MODE_MESSAGE_TRANSFER);
|
||||||
dos.writeUTF(message);
|
dos.writeUTF(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,14 @@ public abstract class Operation {
|
|||||||
protected DataInputStream dis;
|
protected DataInputStream dis;
|
||||||
protected DataOutputStream dos;
|
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 startServerSide() throws Exception;
|
||||||
|
|
||||||
public abstract void startClientSide(Object... params) throws Exception;
|
public abstract void startClientSide(Object... params) throws Exception;
|
||||||
|
Loading…
Reference in New Issue
Block a user