Оптимизирован доступ к операциям

This commit is contained in:
Victor 2013-07-11 15:16:42 +03:00
parent d62b472fe8
commit f32d1d0500
8 changed files with 112 additions and 104 deletions

View File

@ -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) {

View File

@ -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;
}
} }

View File

@ -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);
} }
} }

View File

@ -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();
}
}

View File

@ -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;
// Îòïðàâëÿåì ðàçìåð ïàíåëè. // Îòïðàâëÿåì ðàçìåð ïàíåëè.

View File

@ -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);

View File

@ -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);
} }

View File

@ -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;