packetlogger changes

This commit is contained in:
sirjonasxx 2021-04-25 18:05:15 +02:00
parent b7bf03f313
commit eb7c9f1829
16 changed files with 243 additions and 140 deletions

View File

@ -5,15 +5,15 @@ import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionP
import javafx.application.Platform;
import javafx.stage.Stage;
public class InternalExtensionFormBuilder {
public class InternalExtensionFormBuilder<T extends ExtensionForm> {
public static void launch(Class<? extends ExtensionForm> extension, ExtensionProducerObserver observer) {
public T launch(Class<T> extensionClass, ExtensionProducerObserver observer) {
try {
ExtensionInfo extInfo = extension.getAnnotation(ExtensionInfo.class);
ExtensionForm creator = extension.newInstance();
ExtensionInfo extInfo = extensionClass.getAnnotation(ExtensionInfo.class);
T creator = extensionClass.newInstance();
Stage stage = new Stage();
ExtensionForm extensionForm = creator.launchForm(stage);
T extensionForm = (T)(creator.launchForm(stage));
InternalExtension internalExtension = new InternalExtension() {
@Override
@ -67,8 +67,12 @@ public class InternalExtensionFormBuilder {
extensionForm.onHide();
});
});
return extensionForm;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -650,7 +650,7 @@ public class HPacket implements StringifyAble {
if (isCorrupted()) return "";
PacketInfo packetInfo = getPacketInfo(direction, packetInfoManager);
if (packetInfo.getStructure() != null) {
if (packetInfo != null && packetInfo.getStructure() != null) {
return PacketStringUtils.toExpressionFromGivenStructure(this, packetInfo.getStructure(), removeShuffle ? packetInfo : null);
}
return PacketStringUtils.predictedExpression(this, removeShuffle ? packetInfo : null);

View File

@ -44,7 +44,6 @@ public class ExtensionHandler {
}
private void initialize() {
hConnection.getStateObservable().addListener((oldState, newState) -> {
if (newState == HState.CONNECTED) {
synchronized (gEarthExtensions) {
@ -70,7 +69,7 @@ public class ExtensionHandler {
});
extensionProducers = ExtensionProducerFactory.getAll();
extensionProducers.forEach(this::initializeExtensionProducer);
extensionProducers.forEach(extensionProducer -> extensionProducer.startProducing(createExtensionProducerObserver()));
}
@ -173,8 +172,8 @@ public class ExtensionHandler {
private void initializeExtensionProducer(ExtensionProducer producer) {
producer.startProducing(new ExtensionProducerObserver() {
private ExtensionProducerObserver createExtensionProducerObserver() {
return new ExtensionProducerObserver() {
@Override
public void onExtensionProduced(GEarthExtension extension) {
synchronized (gEarthExtensions) {
@ -254,7 +253,7 @@ public class ExtensionHandler {
observable.fireEvent(l -> l.onExtensionConnect(extension));
}
});
};
}
public List<ExtensionProducer> getExtensionProducers() {
@ -264,5 +263,10 @@ public class ExtensionHandler {
return observable;
}
public void addExtensionProducer(ExtensionProducer producer) {
producer.startProducing(createExtensionProducerObserver());
extensionProducers.add(producer);
}
}

View File

@ -3,6 +3,7 @@ package gearth.services.extensionhandler.extensions.extensionproducers;
import gearth.services.extensionhandler.extensions.implementations.network.NetworkExtensionsProducer;
import gearth.services.extensionhandler.extensions.implementations.simple.SimpleExtensionProducer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@ -10,10 +11,11 @@ public class ExtensionProducerFactory {
// returns one of every ExtensionProducer class we have created, to support all types of extensions
public static List<ExtensionProducer> getAll() {
return Arrays.asList(
new NetworkExtensionsProducer(),
new SimpleExtensionProducer()
);
List<ExtensionProducer> all = new ArrayList<>();
all.add(new NetworkExtensionsProducer());
all.add(new SimpleExtensionProducer());
return all;
}

View File

@ -13,6 +13,7 @@ public class SimpleExtensionProducer implements ExtensionProducer {
// uncomment the next line if you want to see an embedded example extension in G-Earth
// observer.onExtensionProduced(new ExampleExtension());
InternalExtensionFormBuilder.launch(BlockAndReplacePackets.class, observer);
new InternalExtensionFormBuilder<BlockAndReplacePackets>()
.launch(BlockAndReplacePackets.class, observer);
}
}

View File

@ -1,4 +1,4 @@
package gearth.ui.logger.loggerdisplays.uilogger;
package gearth.services.internal_extensions.uilogger;
/**
* Created by Jonas on 17/11/2018.

View File

@ -0,0 +1,110 @@
package gearth.services.internal_extensions.uilogger;
import gearth.extensions.ExtensionForm;
import gearth.extensions.ExtensionInfo;
import gearth.misc.packet_info.PacketInfoManager;
import gearth.protocol.HConnection;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import gearth.ui.logger.loggerdisplays.PacketLogger;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.util.ArrayList;
@ExtensionInfo(
Title = "Packet Logger",
Description = "",
Version = "0.1",
Author = "sirjonasxx & Scott"
)
public class UiLogger extends ExtensionForm implements PacketLogger {
private UiLoggerController controller = null;
@Override
public void start(HConnection hConnection) {
// // don't let the user close this window on their own
// stage.setOnCloseRequest(Event::consume);
// primaryStage.show();
}
@Override
public void stop() {
// primaryStage.hide();
// if (stage != null)
// stage.close();
}
@Override
public void appendSplitLine() {
// don't use this, we can't discern incoming/outgoing
//Platform.runLater(() -> controller.appendSplitLine());
}
@Override
protected void initExtension() {
onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> {
controller.setPacketInfoManager(packetInfoManager);
controller.onConnect();
});
}
@Override
protected void onEndConnection() {
controller.onDisconnect();
controller.setPacketInfoManager(new PacketInfoManager(new ArrayList<>()));
}
@Override
public ExtensionForm launchForm(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(UiLogger.class.getResource("UiLogger.fxml"));
Parent root = loader.load();
stage.setTitle("G-Earth | Packet Logger");
stage.initModality(Modality.NONE);
stage.getIcons().add(new Image(getClass().getResourceAsStream("/gearth/G-EarthLogoSmaller.png")));
Scene scene = new Scene(root);
scene.getStylesheets().add("/gearth/ui/bootstrap3.css");
scene.getStylesheets().add("/gearth/services/internal_extensions/uilogger/logger.css");
controller = loader.getController();
controller.setStage(stage);
stage.setScene(scene);
return this;
}
private class Elem {
HPacket packet;
int types;
Elem(HPacket packet, int types) {
this.packet = packet;
this.types = types;
}
}
@Override
public void appendMessage(HPacket packet, int types) {
controller.appendMessage(packet, types);
}
@Override
public void appendStructure(HPacket packet, HMessage.Direction direction) {
}
@Override
protected boolean canLeave() {
return false;
}
@Override
protected boolean canDelete() {
return false;
}
}

View File

@ -1,4 +1,4 @@
package gearth.ui.logger.loggerdisplays.uilogger;
package gearth.services.internal_extensions.uilogger;
import gearth.misc.packet_info.PacketInfo;
import gearth.misc.packet_info.PacketInfoManager;
@ -37,10 +37,15 @@ public class UiLoggerController implements Initializable {
public Label lblPacketInfo;
public CheckMenuItem chkUseNewStructures;
public CheckMenuItem chkOpenOnConnect;
public CheckMenuItem chkResetOnConnect;
public CheckMenuItem chkHideOnDisconnect;
public CheckMenuItem chkResetOnDisconnect;
private StyleClassedTextArea area;
private Stage stage;
private PacketInfoManager packetInfoManager;
private PacketInfoManager packetInfoManager = null;
private boolean viewIncoming = true;
private boolean viewOutgoing = true;
@ -97,7 +102,6 @@ public class UiLoggerController implements Initializable {
boolean packetInfoAvailable = packetInfoManager.getPacketInfoList().size() > 0;
lblPacketInfo.setText("Packet info: " + (packetInfoAvailable ? "True" : "False"));
if ((viewMessageName || viewMessageHash) && packetInfoAvailable) {
List<PacketInfo> messages = packetInfoManager.getAllPacketInfoFromHeaderId(
@ -208,6 +212,10 @@ public class UiLoggerController implements Initializable {
public void setPacketInfoManager(PacketInfoManager packetInfoManager) {
this.packetInfoManager = packetInfoManager;
Platform.runLater(() -> {
boolean packetInfoAvailable = packetInfoManager.getPacketInfoList().size() > 0;
lblPacketInfo.setText("Packet info: " + (packetInfoAvailable ? "True" : "False"));
});
}
public void toggleViewIncoming() {
@ -252,4 +260,22 @@ public class UiLoggerController implements Initializable {
public void clearText(ActionEvent actionEvent) {
area.clear();
}
public void onDisconnect() {
if (chkHideOnDisconnect.isSelected()) {
stage.hide();
}
if (chkResetOnDisconnect.isSelected()) {
clearText(null);
}
}
public void onConnect() {
if (chkResetOnConnect.isSelected()) {
clearText(null);
}
if (chkOpenOnConnect.isSelected()) {
stage.show();
}
}
}

View File

@ -87,7 +87,11 @@ public class GEarthController {
private void trySetController() {
if (++initcount == 2) {
GEarthController self = this;
tabs.forEach(subForm -> subForm.setParentController(self));
extensionsController.setParentController(self);
tabs.forEach(subForm -> {
if (subForm != extensionsController) subForm.setParentController(self);
});
}
}

View File

@ -116,7 +116,11 @@ public class ConnectionController extends SubForm {
}
}
private void updateInputUI() {
if (parentController == null) return;
grd_clientSelection.setDisable(getHConnection().getState() != HState.NOT_CONNECTED);
txtfield_hotelversion.setText(getHConnection().getHotelVersion());
@ -184,6 +188,8 @@ public class ConnectionController extends SubForm {
}
}));
Platform.runLater(this::updateInputUI);
}
public void btnConnect_clicked(ActionEvent actionEvent) {

View File

@ -133,4 +133,8 @@ public class ExtensionsController extends SubForm {
Platform.runLater(this::updateGPythonStatus);
});
}
public ExtensionHandler getExtensionHandler() {
return extensionHandler;
}
}

View File

@ -2,6 +2,7 @@ package gearth.ui.logger;
import gearth.extensions.parsers.HDirection;
import gearth.protocol.connection.HState;
import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducer;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
@ -18,6 +19,7 @@ import gearth.ui.logger.loggerdisplays.PacketLogger;
import gearth.ui.logger.loggerdisplays.PacketLoggerFactory;
import java.util.Calendar;
import java.util.function.Predicate;
public class LoggerController extends SubForm {
@ -34,9 +36,13 @@ public class LoggerController extends SubForm {
private int packetLimit = 8000;
private PacketLogger packetLogger = PacketLoggerFactory.get();
private PacketLoggerFactory packetLoggerFactory;
private PacketLogger packetLogger;
public void onParentSet(){
packetLoggerFactory = new PacketLoggerFactory(parentController.extensionsController.getExtensionHandler());
packetLogger = packetLoggerFactory.get();
getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(() -> {
if (newState == HState.PREPARING) {
miniLogText(Color.ORANGE, "Connecting to "+getHConnection().getDomain() + ":" + getHConnection().getServerPort());

View File

@ -1,21 +1,33 @@
package gearth.ui.logger.loggerdisplays;
import gearth.Main;
import gearth.extensions.InternalExtensionFormBuilder;
import gearth.misc.OSValidator;
import gearth.ui.logger.loggerdisplays.uilogger.UiLogger;
import gearth.services.extensionhandler.ExtensionHandler;
import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducer;
import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducerObserver;
import gearth.services.internal_extensions.uilogger.UiLogger;
/**
* Created by Jonas on 04/04/18.
*/
public class PacketLoggerFactory {
public class PacketLoggerFactory implements ExtensionProducer {
private UiLogger uiLogger;
public static boolean usesUIlogger() {
return (!Main.hasFlag("-t"));
}
public static PacketLogger get() {
public PacketLoggerFactory(ExtensionHandler handler) {
handler.addExtensionProducer(this);
}
public PacketLogger get() {
if (usesUIlogger()) {
return new UiLogger();
// return new UiLogger(); //now an extension
return uiLogger;
}
if (OSValidator.isUnix()) {
@ -24,4 +36,11 @@ public class PacketLoggerFactory {
return new SimpleTerminalLogger();
}
@Override
public void startProducing(ExtensionProducerObserver observer) {
if (usesUIlogger()) {
uiLogger = new InternalExtensionFormBuilder<UiLogger>()
.launch(UiLogger.class, observer);
}
}
}

View File

@ -1,103 +0,0 @@
package gearth.ui.logger.loggerdisplays.uilogger;
import gearth.extensions.parsers.HDirection;
import gearth.protocol.HConnection;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import gearth.ui.logger.loggerdisplays.PacketLogger;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class UiLogger implements PacketLogger {
private Stage stage;
private UiLoggerController controller = null;
private HConnection hConnection = null;
@Override
public void start(HConnection hConnection) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/gearth/ui/logger/uilogger/UiLogger.fxml"));
try {
Parent root = loader.load();
synchronized (appendLater) {
controller = loader.getController();
for (Elem elem : appendLater) {
controller.appendMessage(elem.packet, elem.types);
}
appendLater.clear();
}
stage = new Stage();
stage.setTitle("G-Earth | Packet Logger");
stage.initModality(Modality.NONE);
stage.getIcons().add(new Image(getClass().getResourceAsStream("/gearth/G-EarthLogoSmaller.png")));
Scene scene = new Scene(root);
scene.getStylesheets().add("/gearth/ui/bootstrap3.css");
scene.getStylesheets().add("/gearth/ui/logger/uilogger/logger.css");
UiLoggerController controller = loader.getController();
controller.setStage(stage);
controller.setPacketInfoManager(hConnection.getPacketInfoManager());
stage.setScene(scene);
// don't let the user close this window on their own
stage.setOnCloseRequest(Event::consume);
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void stop() {
if (stage != null)
stage.close();
}
@Override
public void appendSplitLine() {
// don't use this, we can't discern incoming/outgoing
//Platform.runLater(() -> controller.appendSplitLine());
}
private class Elem {
HPacket packet;
int types;
Elem(HPacket packet, int types) {
this.packet = packet;
this.types = types;
}
}
private final List<Elem> appendLater = new ArrayList<>();
@Override
public void appendMessage(HPacket packet, int types) {
synchronized (appendLater) {
if (controller == null) {
appendLater.add(new Elem(packet, types));
}
else {
controller.appendMessage(packet, types);
}
}
}
@Override
public void appendStructure(HPacket packet, HMessage.Direction direction) {
}
}

View File

@ -5,18 +5,27 @@
<?import javafx.scene.input.*?>
<?import javafx.scene.layout.*?>
<BorderPane fx:id="borderPane" prefHeight="560.0" prefWidth="820.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gearth.ui.logger.loggerdisplays.uilogger.UiLoggerController">
<BorderPane fx:id="borderPane" prefHeight="560.0" prefWidth="820.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gearth.services.internal_extensions.uilogger.UiLoggerController">
<top>
<MenuBar BorderPane.alignment="CENTER">
<Menu mnemonicParsing="false" text="Window">
<items>
<CheckMenuItem fx:id="chkAlwaysOnTop" mnemonicParsing="false" onAction="#toggleAlwaysOnTop" text="Always on top" />
<Menu mnemonicParsing="false" text="On connect">
<items>
<CheckMenuItem fx:id="chkOpenOnConnect" mnemonicParsing="false" selected="true" text="Open window" />
<CheckMenuItem fx:id="chkResetOnConnect" mnemonicParsing="false" selected="true" text="Reset packetlogger" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="On disconnect">
<items>
<CheckMenuItem fx:id="chkHideOnDisconnect" mnemonicParsing="false" selected="true" text="Hide window" />
<CheckMenuItem fx:id="chkResetOnDisconnect" mnemonicParsing="false" text="Reset packetlogger" />
</items>
</Menu>
</items>
</Menu>
<Menu mnemonicParsing="false" text="View">
<Menu mnemonicParsing="false" text="Display Details">
<items>
<CheckMenuItem fx:id="chkDisplayStructure" mnemonicParsing="false" onAction="#toggleDisplayStructure" selected="true" text="Structure" />
<CheckMenuItem fx:id="chkMessageName" mnemonicParsing="false" onAction="#toggleMessageName" selected="true" text="Message Name" />
<CheckMenuItem fx:id="chkMessageHash" mnemonicParsing="false" onAction="#toggleMessageHash" text="Message Hash" />
<CheckMenuItem fx:id="chkUseNewStructures" mnemonicParsing="false" onAction="#toggleMessageHash" selected="true" text="New structures" />
</items>
</Menu>
<CheckMenuItem fx:id="chkViewIncoming" mnemonicParsing="false" onAction="#toggleViewIncoming" selected="true" text="View Incoming">
<accelerator>
<KeyCodeCombination alt="UP" code="I" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
@ -29,13 +38,24 @@
<accelerator>
<KeyCodeCombination alt="UP" code="L" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator></CheckMenuItem>
<CheckMenuItem fx:id="chkSkipBigPackets" mnemonicParsing="false" onAction="#toggleSkipPackets" selected="true" text="Skip big packets" />
<CheckMenuItem fx:id="chkAlwaysOnTop" mnemonicParsing="false" onAction="#toggleAlwaysOnTop" text="Always on top" />
<CheckMenuItem fx:id="chkClearText" mnemonicParsing="false" onAction="#clearText" text="Clear text">
<accelerator>
<KeyCodeCombination alt="UP" code="E" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator></CheckMenuItem>
</Menu>
<Menu mnemonicParsing="false" text="Packets">
<items>
<Menu mnemonicParsing="false" text="Display Details">
<items>
<CheckMenuItem fx:id="chkDisplayStructure" mnemonicParsing="false" onAction="#toggleDisplayStructure" selected="true" text="Structure" />
<CheckMenuItem fx:id="chkMessageName" mnemonicParsing="false" onAction="#toggleMessageName" selected="true" text="Message Name" />
<CheckMenuItem fx:id="chkMessageHash" mnemonicParsing="false" onAction="#toggleMessageHash" text="Message Hash" />
<CheckMenuItem fx:id="chkUseNewStructures" mnemonicParsing="false" onAction="#toggleMessageHash" selected="true" text="New structures" />
</items>
</Menu>
<CheckMenuItem fx:id="chkSkipBigPackets" mnemonicParsing="false" onAction="#toggleSkipPackets" selected="true" text="Skip big packets" />
</items>
</Menu>
</MenuBar>
</top>
<bottom>