Fix user disconnection via proxy and various other bugs
This commit is contained in:
parent
f41c7baa8b
commit
172f9d48a3
6 changed files with 58 additions and 35 deletions
|
@ -1,8 +1,8 @@
|
||||||
package fr.insa.clavardator.client.db;
|
package fr.insa.clavardator.client.db;
|
||||||
|
|
||||||
|
import fr.insa.clavardator.client.users.CurrentUser;
|
||||||
import fr.insa.clavardator.lib.message.FileMessage;
|
import fr.insa.clavardator.lib.message.FileMessage;
|
||||||
import fr.insa.clavardator.lib.message.Message;
|
import fr.insa.clavardator.lib.message.Message;
|
||||||
import fr.insa.clavardator.client.users.CurrentUser;
|
|
||||||
import fr.insa.clavardator.lib.users.User;
|
import fr.insa.clavardator.lib.users.User;
|
||||||
import fr.insa.clavardator.lib.users.UserInformation;
|
import fr.insa.clavardator.lib.users.UserInformation;
|
||||||
import fr.insa.clavardator.lib.util.ErrorCallback;
|
import fr.insa.clavardator.lib.util.ErrorCallback;
|
||||||
|
@ -275,8 +275,6 @@ public class DatabaseController {
|
||||||
chatHistory.add(new FileMessage(sender, recipient, date, text, filePath));
|
chatHistory.add(new FileMessage(sender, recipient, date, text, filePath));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(getClass().getSimpleName(), "Error while opening the file", e);
|
Log.e(getClass().getSimpleName(), "Error while opening the file", e);
|
||||||
errorCallback.onError(e);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,7 +323,7 @@ public class DatabaseController {
|
||||||
// Handle messages containing a file
|
// Handle messages containing a file
|
||||||
String filePath = null;
|
String filePath = null;
|
||||||
if (message instanceof FileMessage) {
|
if (message instanceof FileMessage) {
|
||||||
filePath = "'" + ((FileMessage) message).getPath() + "'";
|
filePath = ((FileMessage) message).getPath();
|
||||||
}
|
}
|
||||||
@Language("SQL") String sql = "INSERT INTO message " +
|
@Language("SQL") String sql = "INSERT INTO message " +
|
||||||
"(timestamp, sender, recipient, text, file_path) VALUES (?, ?, ?, ?, ?)";
|
"(timestamp, sender, recipient, text, file_path) VALUES (?, ?, ?, ?, ?)";
|
||||||
|
|
|
@ -147,7 +147,7 @@ public class PeerUser extends User implements Comparable<PeerUser> {
|
||||||
}
|
}
|
||||||
history.addMessage((Message) msg, errorCallback);
|
history.addMessage((Message) msg, errorCallback);
|
||||||
} else if (msg instanceof UsernameTakenException) {
|
} else if (msg instanceof UsernameTakenException) {
|
||||||
disconnect();
|
CurrentUser.getInstance().setState(CurrentUser.State.INVALID);
|
||||||
errorCallback.onError(new Exception("Received username already taken message"));
|
errorCallback.onError(new Exception("Received username already taken message"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import fr.insa.clavardator.client.server.Proxy;
|
||||||
import fr.insa.clavardator.lib.network.TcpListener;
|
import fr.insa.clavardator.lib.network.TcpListener;
|
||||||
import fr.insa.clavardator.lib.users.User;
|
import fr.insa.clavardator.lib.users.User;
|
||||||
import fr.insa.clavardator.lib.users.UserInformation;
|
import fr.insa.clavardator.lib.users.UserInformation;
|
||||||
|
import fr.insa.clavardator.lib.users.UserState;
|
||||||
import fr.insa.clavardator.lib.util.ErrorCallback;
|
import fr.insa.clavardator.lib.util.ErrorCallback;
|
||||||
import fr.insa.clavardator.lib.util.Log;
|
import fr.insa.clavardator.lib.util.Log;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
|
@ -52,17 +53,35 @@ public class UserList {
|
||||||
final PeerUser savedUser = userHashmap.get(userInfo.id);
|
final PeerUser savedUser = userHashmap.get(userInfo.id);
|
||||||
if (savedUser != null) {
|
if (savedUser != null) {
|
||||||
if (savedUser.isActive()) {
|
if (savedUser.isActive()) {
|
||||||
Log.v(getClass().getSimpleName(), "Received user from presence server already known and connected");
|
if (userInfo.getState() == UserState.DISCONNECTED) {
|
||||||
|
Log.v(getClass().getSimpleName(), "Received disconnected user from presence server already known and connected, disconnecting...");
|
||||||
|
savedUser.disconnect();
|
||||||
|
} else {
|
||||||
|
Log.v(getClass().getSimpleName(), "Received user from presence server already known and connected");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.v(getClass().getSimpleName(), "Received user from presence server already known but not connected, connecting...");
|
if (userInfo.getState() == UserState.CONNECTED) {
|
||||||
savedUser.init(proxy, userInfo.id, userInfo.getUsername(), null);
|
Log.v(getClass().getSimpleName(), "Received user from presence server already known but not connected, connecting...");
|
||||||
|
savedUser.init(proxy, userInfo.id, userInfo.getUsername(),
|
||||||
|
e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
|
||||||
|
} else {
|
||||||
|
Log.v(getClass().getSimpleName(), "Received disconnected user from presence server already known and not connected.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.v(getClass().getSimpleName(), "Received new user from presence server");
|
if (userInfo.getState() == UserState.CONNECTED) {
|
||||||
final PeerUser user = new PeerUser();
|
Log.v(getClass().getSimpleName(), "Received new connected user from presence server");
|
||||||
user.init(proxy, userInfo.id, userInfo.getUsername(), null);
|
final PeerUser user = new PeerUser();
|
||||||
userHashmap.put(user.getId(), user);
|
user.init(proxy, userInfo.id, userInfo.getUsername(),
|
||||||
Platform.runLater(() -> userObservableList.add(user));
|
e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
|
||||||
|
userHashmap.put(user.getId(), user);
|
||||||
|
Platform.runLater(() -> userObservableList.add(user));
|
||||||
|
} else {
|
||||||
|
Log.v(getClass().getSimpleName(), "Received new disconnected user from presence server");
|
||||||
|
final PeerUser user = new PeerUser(userInfo.id, userInfo.getUsername());
|
||||||
|
userHashmap.put(user.getId(), user);
|
||||||
|
Platform.runLater(() -> userObservableList.add(user));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -108,10 +127,13 @@ public class UserList {
|
||||||
final UserInformation userInfo = handshake.getUserInformation();
|
final UserInformation userInfo = handshake.getUserInformation();
|
||||||
final PeerUser savedUser = userHashmap.get(userInfo.id);
|
final PeerUser savedUser = userHashmap.get(userInfo.id);
|
||||||
if (savedUser != null) {
|
if (savedUser != null) {
|
||||||
savedUser.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(), null);
|
savedUser.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(),
|
||||||
|
e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
final PeerUser user = new PeerUser();
|
final PeerUser user = new PeerUser();
|
||||||
user.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(), null);
|
user.init(handshake.getConnection(), userInfo.id, userInfo.getUsername(),
|
||||||
|
e -> Log.e(getClass().getSimpleName(), "Error with user " + userInfo.getUsername(), e));
|
||||||
userHashmap.put(user.getId(), user);
|
userHashmap.put(user.getId(), user);
|
||||||
Platform.runLater(() -> userObservableList.add(user));
|
Platform.runLater(() -> userObservableList.add(user));
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,13 +32,13 @@ public class FileMessage extends Message {
|
||||||
|
|
||||||
File file = new File(filePath);
|
File file = new File(filePath);
|
||||||
if (!file.exists())
|
if (!file.exists())
|
||||||
throw new IOException("The file " + filePath + " does not exist");
|
throw new IOException("The file " + file.getAbsolutePath() + " does not exist");
|
||||||
if (!file.canRead())
|
if (!file.canRead())
|
||||||
throw new IOException("The file " + filePath + " is not readable");
|
throw new IOException("The file " + file.getAbsolutePath() + " is not readable");
|
||||||
if (!file.isFile())
|
if (!file.isFile())
|
||||||
throw new IOException("The path " + filePath + " does not lead to a file");
|
throw new IOException("The path " + file.getAbsolutePath() + " does not lead to a file");
|
||||||
if (file.length() > MAX_FILE_SIZE)
|
if (file.length() > MAX_FILE_SIZE)
|
||||||
throw new IOException("The file " + filePath + " is too large");
|
throw new IOException("The file " + file.getAbsolutePath() + " is too large");
|
||||||
|
|
||||||
fileName = file.getName();
|
fileName = file.getName();
|
||||||
path = filePath;
|
path = filePath;
|
||||||
|
@ -63,12 +63,20 @@ public class FileMessage extends Message {
|
||||||
* @return the path to the file
|
* @return the path to the file
|
||||||
*/
|
*/
|
||||||
public String storeFile() throws IOException {
|
public String storeFile() throws IOException {
|
||||||
path = STORED_FILES_FOLDER + File.separatorChar + fileName;
|
|
||||||
|
|
||||||
// Create directory
|
// Create clavardator directory
|
||||||
File dir = new File(STORED_FILES_FOLDER);
|
File dir = new File(STORED_FILES_FOLDER);
|
||||||
dir.mkdirs();
|
dir.mkdirs();
|
||||||
|
|
||||||
|
// Copy the source file to rawFile
|
||||||
|
if (rawFile == null) {
|
||||||
|
FileInputStream istream = new FileInputStream(path);
|
||||||
|
rawFile = istream.readAllBytes();
|
||||||
|
istream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
path = STORED_FILES_FOLDER + File.separatorChar + fileName;
|
||||||
|
|
||||||
// Create new file
|
// Create new file
|
||||||
int extensionBeginning = fileName.lastIndexOf('.');
|
int extensionBeginning = fileName.lastIndexOf('.');
|
||||||
String name = fileName;
|
String name = fileName;
|
||||||
|
@ -84,13 +92,7 @@ public class FileMessage extends Message {
|
||||||
file = new File(path);
|
file = new File(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write to the file
|
// Write the file in clavardator dir
|
||||||
if (rawFile == null) {
|
|
||||||
FileInputStream istream = new FileInputStream(fileName);
|
|
||||||
rawFile = istream.readAllBytes();
|
|
||||||
istream.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
FileOutputStream ostream = new FileOutputStream(file);
|
FileOutputStream ostream = new FileOutputStream(file);
|
||||||
ostream.write(rawFile);
|
ostream.write(rawFile);
|
||||||
ostream.close();
|
ostream.close();
|
||||||
|
|
|
@ -95,13 +95,14 @@ public class TcpConnection {
|
||||||
*/
|
*/
|
||||||
public void close() {
|
public void close() {
|
||||||
shouldStop = true;
|
shouldStop = true;
|
||||||
if (outputStream != null) {
|
try {
|
||||||
try {
|
if (outputStream != null)
|
||||||
outputStream.close();
|
outputStream.close();
|
||||||
|
if (inputStream != null)
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
socket.close();
|
socket.close();
|
||||||
} catch (IOException ignored) {
|
} catch (IOException ignored) {
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,9 @@ public class Presence {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void publish(UserInformation info) {
|
public void publish(UserInformation info) {
|
||||||
|
ArrayList<UserInformation> msg = new ArrayList<>(1);
|
||||||
|
msg.add(info);
|
||||||
for (TcpConnection subscriber : subscribers.values()) {
|
for (TcpConnection subscriber : subscribers.values()) {
|
||||||
ArrayList<UserInformation> msg = new ArrayList<>(1);
|
|
||||||
msg.add(info);
|
|
||||||
subscriber.send(msg, null,
|
subscriber.send(msg, null,
|
||||||
e -> Log.e(getClass().getSimpleName(), "Error while publishing user information", e));
|
e -> Log.e(getClass().getSimpleName(), "Error while publishing user information", e));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue