|
|
@@ -1,31 +1,41 @@
|
|
|
package ui;
|
|
|
|
|
|
import crypto.KeyManager;
|
|
|
-import model.AuthMessage;
|
|
|
import model.Chat;
|
|
|
+import model.FileTransfer;
|
|
|
import model.Message;
|
|
|
import net.RelayClient;
|
|
|
import net.direct.DirectClient;
|
|
|
-import net.direct.DirectServer;
|
|
|
|
|
|
import javax.swing.*;
|
|
|
import java.awt.*;
|
|
|
import java.awt.event.KeyAdapter;
|
|
|
import java.awt.event.KeyEvent;
|
|
|
+import java.awt.event.WindowAdapter;
|
|
|
+import java.awt.event.WindowEvent;
|
|
|
+import java.security.PublicKey;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.util.List;
|
|
|
|
|
|
public class ChatWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
+ private Chat chat;
|
|
|
+ private MainWindow mainWindow;
|
|
|
private String targetName;
|
|
|
private JTextArea chatArea;
|
|
|
private JTextField inputField;
|
|
|
- private boolean useRelay;
|
|
|
- private String targetUUID;
|
|
|
+ private PublicKey targetKey;
|
|
|
private DirectClient directClient;
|
|
|
private RelayClient relayClient;
|
|
|
+ private FileSplitMerger fileSplitMerger; // Neu
|
|
|
|
|
|
- public ChatWindow(String targetName, Chat chat) {
|
|
|
- this.useRelay = chat.isUsingRelay();
|
|
|
- this.targetUUID = chat.getTargetUUID();
|
|
|
+ public ChatWindow(String targetName, Chat chat, MainWindow mainWindow) {
|
|
|
+ this.targetKey = chat.getTargetKey();
|
|
|
this.targetName = targetName;
|
|
|
+ this.mainWindow = mainWindow;
|
|
|
+ this.chat = chat;
|
|
|
+ this.fileSplitMerger = new FileSplitMerger(); // Neu
|
|
|
+
|
|
|
setTitle("Chat mit " + targetName);
|
|
|
setSize(400, 500);
|
|
|
setLocationRelativeTo(null);
|
|
|
@@ -34,34 +44,38 @@ public class ChatWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
chatArea = new JTextArea();
|
|
|
chatArea.setEditable(false);
|
|
|
inputField = new JTextField();
|
|
|
+
|
|
|
JButton sendBtn = new JButton("Senden");
|
|
|
+ JButton fileBtn = new JButton("📎 Datei"); // 🔹 Neuer Button für Datei-Upload
|
|
|
+
|
|
|
JPanel inputPanel = new JPanel(new BorderLayout());
|
|
|
+
|
|
|
+ // Panel für Buttons rechts nebeneinander
|
|
|
+ JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 0));
|
|
|
+ buttonPanel.add(fileBtn);
|
|
|
+ buttonPanel.add(sendBtn);
|
|
|
+
|
|
|
inputPanel.add(inputField, BorderLayout.CENTER);
|
|
|
- inputPanel.add(sendBtn, BorderLayout.EAST);
|
|
|
+ inputPanel.add(buttonPanel, BorderLayout.EAST);
|
|
|
+
|
|
|
add(new JScrollPane(chatArea), BorderLayout.CENTER);
|
|
|
add(inputPanel, BorderLayout.SOUTH);
|
|
|
setVisible(true);
|
|
|
|
|
|
- setupMessages(chat);
|
|
|
- // Create the send action that can be reused
|
|
|
+ try {
|
|
|
+ setupMessages(chat);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
Runnable sendAction = () -> {
|
|
|
String msg = inputField.getText();
|
|
|
if (!msg.isEmpty()) {
|
|
|
- inputField.setText("");
|
|
|
- chatArea.append("Du: " + msg + "\n");
|
|
|
- Message toSend = new Message(KeyManager.getMyUUID().toString(), targetUUID, msg);
|
|
|
-
|
|
|
- chat.addMessage(toSend);
|
|
|
- if (useRelay) {
|
|
|
- relayClient.send(toSend);
|
|
|
- } else {
|
|
|
- directClient.send(msg);
|
|
|
- }
|
|
|
+ sendMessage(msg, chat);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
sendBtn.addActionListener(e -> sendAction.run());
|
|
|
-
|
|
|
inputField.addKeyListener(new KeyAdapter() {
|
|
|
@Override
|
|
|
public void keyPressed(KeyEvent e) {
|
|
|
@@ -71,9 +85,98 @@ public class ChatWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
- if (useRelay) {
|
|
|
+ // 🔹 Datei senden Aktion
|
|
|
+ fileBtn.addActionListener(e -> selectAndSendFile());
|
|
|
+
|
|
|
+ setupHandlers(chat);
|
|
|
+ setupOnClose();
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 🔹 Öffnet Datei-Dialog, spaltet und sendet Datei über Socket */
|
|
|
+ private void selectAndSendFile() {
|
|
|
+ JFileChooser chooser = new JFileChooser();
|
|
|
+ chooser.setDialogTitle("Wähle eine Datei zum Senden aus");
|
|
|
+ int result = chooser.showOpenDialog(this);
|
|
|
+
|
|
|
+ if (result == JFileChooser.APPROVE_OPTION) {
|
|
|
+ File selectedFile = chooser.getSelectedFile();
|
|
|
+ chatArea.append("📤 Sende Datei: " + selectedFile.getName() + "\n");
|
|
|
+
|
|
|
+ try {
|
|
|
+ // Datei in Stücke teilen
|
|
|
+ List<FileTransfer> parts = fileSplitMerger.splitFile(
|
|
|
+ selectedFile,
|
|
|
+ 1024 * 512, // 512 KB Stückgröße
|
|
|
+ targetKey,
|
|
|
+ KeyManager.getPublicKey()
|
|
|
+ );
|
|
|
+
|
|
|
+ // Alle Teile verschicken
|
|
|
+ for (FileTransfer ft : parts) {
|
|
|
+ if (chat.isUsingRelay()) {
|
|
|
+ relayClient.send(ft);
|
|
|
+ } else {
|
|
|
+ directClient.send(ft);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ chatArea.append("✅ Datei erfolgreich in " + parts.size() + " Teile aufgeteilt und gesendet.\n");
|
|
|
+
|
|
|
+ } catch (Exception ex) {
|
|
|
+ ex.printStackTrace();
|
|
|
+ JOptionPane.showMessageDialog(this,
|
|
|
+ "Fehler beim Senden der Datei:\n" + ex.getMessage(),
|
|
|
+ "Dateiübertragungsfehler", JOptionPane.ERROR_MESSAGE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void updateChat(Chat newChat) throws Exception {
|
|
|
+ chatArea.removeAll();
|
|
|
+ this.chat = newChat;
|
|
|
+ setupMessages(newChat);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void updateChat() throws Exception {
|
|
|
+ chatArea.removeAll();
|
|
|
+ setupMessages(chat);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setupOnClose() {
|
|
|
+ ChatWindow closedWindow = this;
|
|
|
+ addWindowListener(new WindowAdapter() {
|
|
|
+ @Override
|
|
|
+ public void windowClosing(WindowEvent e) {
|
|
|
+ mainWindow.closedWindow(closedWindow);
|
|
|
+ e.getWindow().dispose();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private void sendMessage(String msg, Chat chat) {
|
|
|
+ inputField.setText("");
|
|
|
+ Message toSend = new Message(KeyManager.getPublicKey(), targetKey, msg);
|
|
|
+
|
|
|
+ try {
|
|
|
+ toSend.encrypt();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ System.out.println("Something went wrong with the Encryption of this message!");
|
|
|
+ }
|
|
|
+ if (chat.isUsingRelay()) {
|
|
|
+ relayClient.send(toSend);
|
|
|
+ } else {
|
|
|
+ directClient.send(toSend);
|
|
|
+ }
|
|
|
+ chat.addMessage(toSend);
|
|
|
+ chatArea.append("Du: " + msg + "\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setupHandlers(Chat chat) {
|
|
|
+ System.out.println("Setup handlers: relay=" + chat.isUsingRelay() + ", addr=" + chat.getRelayAddress() + ", port=" + chat.getPort());
|
|
|
+ if (chat.isUsingRelay()) {
|
|
|
try {
|
|
|
- relayClient = new RelayClient(chat.getRelayAddress(), KeyManager.getMyUUID().toString(), this);
|
|
|
+ relayClient = new RelayClient(chat.getRelayAddress(), KeyManager.getPublicKey(), this);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
JOptionPane.showMessageDialog(this, "Verbindung zum Relay-Server fehlgeschlagen: " + e.getMessage(),
|
|
|
@@ -81,8 +184,7 @@ public class ChatWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
}
|
|
|
} else {
|
|
|
try {
|
|
|
- directClient = new DirectClient(chat.getRelayAddress());
|
|
|
- new DirectServer(this).start(); // Für eingehende Nachrichten
|
|
|
+ directClient = new DirectClient(chat.getRelayAddress(), chat.getPort(), this::onMessage);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
JOptionPane.showMessageDialog(this, "Direkte Verbindung fehlgeschlagen: " + e.getMessage(),
|
|
|
@@ -91,22 +193,35 @@ public class ChatWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void setupMessages(Chat chat) {
|
|
|
- for(Message msg : chat.getMessages()){
|
|
|
- if(msg.getSenderUUID().equals(targetUUID)){
|
|
|
- chatArea.append(targetName + ": " + msg.getContent() + "\n");
|
|
|
- }else if(msg.getReceiverUUID().equals(targetUUID)){
|
|
|
- chatArea.append("Du: " + msg.getContent() + "\n");
|
|
|
- }else{
|
|
|
- chatArea.append("Something went wrong whilst loading this message! \n");
|
|
|
+ private void setupMessages(Chat chat) throws Exception {
|
|
|
+ chat.decryptWholeChat(KeyManager.getPrivateKey(), KeyManager.getPublicKey());
|
|
|
+ for (Message msg : chat.getMessages()) {
|
|
|
+ if (msg.didISendThis(KeyManager.getPublicKey())) {
|
|
|
+ chatArea.append("Du: " + msg.getContentForSender() + "\n");
|
|
|
+ } else {
|
|
|
+ chatArea.append(targetName + ": " + msg.getContentForReceiver() + "\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onMessage(Message msg) {
|
|
|
- //System.out.println("Empfangen: " + msg.getContent());
|
|
|
- //String username = msg.getSenderUUID();
|
|
|
- SwingUtilities.invokeLater(() -> chatArea.append(targetName + ": " + msg.getContent() + "\n"));
|
|
|
+ mainWindow.onMessage(msg);
|
|
|
+ SwingUtilities.invokeLater(() -> chatArea.append(targetName + ": " + msg.getContentForSender() + "\n"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public Chat getChat() {
|
|
|
+ return chat;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void addMessage(Message msg) {
|
|
|
+ try {
|
|
|
+ msg.decrypt(KeyManager.getPrivateKey(), KeyManager.getPublicKey());
|
|
|
+ chat.addMessage(msg);
|
|
|
+ updateChat();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|