Browse Source

Fix user disconnection via proxy and various other bugs

Yohan Simard 3 years ago
parent
commit
172f9d48a3

+ 2
- 4
client/src/main/java/fr/insa/clavardator/client/db/DatabaseController.java View File

@@ -1,8 +1,8 @@
1 1
 package fr.insa.clavardator.client.db;
2 2
 
3
+import fr.insa.clavardator.client.users.CurrentUser;
3 4
 import fr.insa.clavardator.lib.message.FileMessage;
4 5
 import fr.insa.clavardator.lib.message.Message;
5
-import fr.insa.clavardator.client.users.CurrentUser;
6 6
 import fr.insa.clavardator.lib.users.User;
7 7
 import fr.insa.clavardator.lib.users.UserInformation;
8 8
 import fr.insa.clavardator.lib.util.ErrorCallback;
@@ -275,8 +275,6 @@ public class DatabaseController {
275 275
 						chatHistory.add(new FileMessage(sender, recipient, date, text, filePath));
276 276
 					} catch (IOException e) {
277 277
 						Log.e(getClass().getSimpleName(), "Error while opening the file", e);
278
-						errorCallback.onError(e);
279
-						return;
280 278
 					}
281 279
 				}
282 280
 			}
@@ -325,7 +323,7 @@ public class DatabaseController {
325 323
 			// Handle messages containing a file
326 324
 			String filePath = null;
327 325
 			if (message instanceof FileMessage) {
328
-				filePath = "'" + ((FileMessage) message).getPath() + "'";
326
+				filePath = ((FileMessage) message).getPath();
329 327
 			}
330 328
 			@Language("SQL") String sql = "INSERT INTO message " +
331 329
 					"(timestamp, sender, recipient, text, file_path) VALUES (?, ?, ?, ?, ?)";

+ 1
- 1
client/src/main/java/fr/insa/clavardator/client/users/PeerUser.java View File

@@ -147,7 +147,7 @@ public class PeerUser extends User implements Comparable<PeerUser> {
147 147
 			}
148 148
 			history.addMessage((Message) msg, errorCallback);
149 149
 		} else if (msg instanceof UsernameTakenException) {
150
-			disconnect();
150
+			CurrentUser.getInstance().setState(CurrentUser.State.INVALID);
151 151
 			errorCallback.onError(new Exception("Received username already taken message"));
152 152
 		}
153 153
 	}

+ 32
- 10
client/src/main/java/fr/insa/clavardator/client/users/UserList.java View File

@@ -7,6 +7,7 @@ import fr.insa.clavardator.client.server.Proxy;
7 7
 import fr.insa.clavardator.lib.network.TcpListener;
8 8
 import fr.insa.clavardator.lib.users.User;
9 9
 import fr.insa.clavardator.lib.users.UserInformation;
10
+import fr.insa.clavardator.lib.users.UserState;
10 11
 import fr.insa.clavardator.lib.util.ErrorCallback;
11 12
 import fr.insa.clavardator.lib.util.Log;
12 13
 import javafx.application.Platform;
@@ -52,17 +53,35 @@ public class UserList {
52 53
 			final PeerUser savedUser = userHashmap.get(userInfo.id);
53 54
 			if (savedUser != null) {
54 55
 				if (savedUser.isActive()) {
55
-					Log.v(getClass().getSimpleName(), "Received user from presence server already known and connected");
56
+					if (userInfo.getState() == UserState.DISCONNECTED) {
57
+						Log.v(getClass().getSimpleName(), "Received disconnected user from presence server already known and connected, disconnecting...");
58
+						savedUser.disconnect();
59
+					} else {
60
+						Log.v(getClass().getSimpleName(), "Received user from presence server already known and connected");
61
+					}
56 62
 				} else {
57
-					Log.v(getClass().getSimpleName(), "Received user from presence server already known but not connected, connecting...");
58
-					savedUser.init(proxy, userInfo.id, userInfo.getUsername(), null);
63
+					if (userInfo.getState() == UserState.CONNECTED) {
64
+						Log.v(getClass().getSimpleName(), "Received user from presence server already known but not connected, connecting...");
65
+						savedUser.init(proxy, userInfo.id, userInfo.getUsername(),
66
+								e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
67
+					} else {
68
+						Log.v(getClass().getSimpleName(), "Received disconnected user from presence server already known and not connected.");
69
+					}
59 70
 				}
60 71
 			} else {
61
-				Log.v(getClass().getSimpleName(), "Received new user from presence server");
62
-				final PeerUser user = new PeerUser();
63
-				user.init(proxy, userInfo.id, userInfo.getUsername(), null);
64
-				userHashmap.put(user.getId(), user);
65
-				Platform.runLater(() -> userObservableList.add(user));
72
+				if (userInfo.getState() == UserState.CONNECTED) {
73
+					Log.v(getClass().getSimpleName(), "Received new connected user from presence server");
74
+					final PeerUser user = new PeerUser();
75
+					user.init(proxy, userInfo.id, userInfo.getUsername(),
76
+							e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
77
+					userHashmap.put(user.getId(), user);
78
+					Platform.runLater(() -> userObservableList.add(user));
79
+				} else {
80
+					Log.v(getClass().getSimpleName(), "Received new disconnected user from presence server");
81
+					final PeerUser user = new PeerUser(userInfo.id, userInfo.getUsername());
82
+					userHashmap.put(user.getId(), user);
83
+					Platform.runLater(() -> userObservableList.add(user));
84
+				}
66 85
 			}
67 86
 		}));
68 87
 	}
@@ -108,10 +127,13 @@ public class UserList {
108 127
 		final UserInformation userInfo = handshake.getUserInformation();
109 128
 		final PeerUser savedUser = userHashmap.get(userInfo.id);
110 129
 		if (savedUser != null) {
111
-			savedUser.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(), null);
130
+			savedUser.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(),
131
+					e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
132
+
112 133
 		} else {
113 134
 			final PeerUser user = new PeerUser();
114
-			user.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(), null);
135
+			user.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(),
136
+					e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
115 137
 			userHashmap.put(user.getId(), user);
116 138
 			Platform.runLater(() -> userObservableList.add(user));
117 139
 		}

+ 15
- 13
lib/src/main/java/fr/insa/clavardator/lib/message/FileMessage.java View File

@@ -32,13 +32,13 @@ public class FileMessage extends Message {
32 32
 
33 33
 		File file = new File(filePath);
34 34
 		if (!file.exists())
35
-			throw new IOException("The file " + filePath + " does not exist");
35
+			throw new IOException("The file " + file.getAbsolutePath() + " does not exist");
36 36
 		if (!file.canRead())
37
-			throw new IOException("The file " + filePath + " is not readable");
37
+			throw new IOException("The file " + file.getAbsolutePath() + " is not readable");
38 38
 		if (!file.isFile())
39
-			throw new IOException("The path " + filePath + " does not lead to a file");
39
+			throw new IOException("The path " + file.getAbsolutePath() + " does not lead to a file");
40 40
 		if (file.length() > MAX_FILE_SIZE)
41
-			throw new IOException("The file " + filePath + " is too large");
41
+			throw new IOException("The file " + file.getAbsolutePath() + " is too large");
42 42
 
43 43
 		fileName = file.getName();
44 44
 		path = filePath;
@@ -63,12 +63,20 @@ public class FileMessage extends Message {
63 63
 	 * @return the path to the file
64 64
 	 */
65 65
 	public String storeFile() throws IOException {
66
-		path = STORED_FILES_FOLDER + File.separatorChar + fileName;
67 66
 
68
-		// Create directory
67
+		// Create clavardator directory
69 68
 		File dir = new File(STORED_FILES_FOLDER);
70 69
 		dir.mkdirs();
71 70
 
71
+		// Copy the source file to rawFile
72
+		if (rawFile == null) {
73
+			FileInputStream istream = new FileInputStream(path);
74
+			rawFile = istream.readAllBytes();
75
+			istream.close();
76
+		}
77
+
78
+		path = STORED_FILES_FOLDER + File.separatorChar + fileName;
79
+
72 80
 		// Create new file
73 81
 		int extensionBeginning = fileName.lastIndexOf('.');
74 82
 		String name = fileName;
@@ -84,13 +92,7 @@ public class FileMessage extends Message {
84 92
 			file = new File(path);
85 93
 		}
86 94
 
87
-		// write to the file
88
-		if (rawFile == null) {
89
-			FileInputStream istream = new FileInputStream(fileName);
90
-			rawFile = istream.readAllBytes();
91
-			istream.close();
92
-		}
93
-
95
+		// Write the file in clavardator dir
94 96
 		FileOutputStream ostream = new FileOutputStream(file);
95 97
 		ostream.write(rawFile);
96 98
 		ostream.close();

+ 6
- 5
lib/src/main/java/fr/insa/clavardator/lib/network/TcpConnection.java View File

@@ -95,13 +95,14 @@ public class TcpConnection {
95 95
 	 */
96 96
 	public void close() {
97 97
 		shouldStop = true;
98
-		if (outputStream != null) {
99
-			try {
98
+		try {
99
+			if (outputStream != null)
100 100
 				outputStream.close();
101
+			if (inputStream != null)
101 102
 				inputStream.close();
102
-				socket.close();
103
-			} catch (IOException ignored) {
104
-			}
103
+			socket.close();
104
+		} catch (IOException ignored) {
105
+
105 106
 		}
106 107
 	}
107 108
 

+ 2
- 2
server/src/main/java/fr/insa/clavardator/server/Presence.java View File

@@ -27,9 +27,9 @@ public class Presence {
27 27
 	}
28 28
 
29 29
 	public void publish(UserInformation info) {
30
+		ArrayList<UserInformation> msg = new ArrayList<>(1);
31
+		msg.add(info);
30 32
 		for (TcpConnection subscriber : subscribers.values()) {
31
-			ArrayList<UserInformation> msg = new ArrayList<>(1);
32
-			msg.add(info);
33 33
 			subscriber.send(msg, null,
34 34
 					e -> Log.e(getClass().getSimpleName(), "Error while publishing user information", e));
35 35
 		}

Loading…
Cancel
Save