Projet_COO_POO/src_reseau/standard/ControleurStandard.java
2021-01-31 16:33:59 +01:00

318 lines
No EOL
8 KiB
Java

package standard;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import communication.tcp.TCPServer;
import communication.udp.CommunicationUDP;
import connexion.VueConnexion;
import database.SQLiteManager;
import main.Utilisateur;
import observers.ObserverInputMessage;
import observers.ObserverSocketState;
import observers.ObserverUserList;
import session.VueSession;
public class ControleurStandard implements ActionListener, ListSelectionListener, WindowListener, ObserverInputMessage,
ObserverUserList, ObserverSocketState {
private enum ModifPseudo {
TERMINE, EN_COURS
}
private ModifPseudo modifPseudo;
private VueStandard vue;
private CommunicationUDP commUDP;
private String lastPseudo;
private TCPServer tcpServ;
private ArrayList<String> idsSessionEnCours;
private SQLiteManager sqlManager;
private VueConnexion vueConnexion;
public ControleurStandard(VueStandard vue, CommunicationUDP commUDP, SQLiteManager sqlManager, VueConnexion vueConnexion) throws IOException {
this.vue = vue;
this.vue.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
this.vueConnexion = vueConnexion;
this.tcpServ = new TCPServer();
this.tcpServ.addObserver(this);
this.tcpServ.start();
this.commUDP = commUDP;
this.idsSessionEnCours = new ArrayList<String>();
this.sqlManager = sqlManager;
}
// ---------- LISTSELECTION LISTENER OPERATIONS ----------//
@Override
public void valueChanged(ListSelectionEvent e) {
// Case when a list element is selected
if (this.vue.getActiveUsersList().isFocusOwner() && !e.getValueIsAdjusting()
&& this.vue.getActiveUsersList().getSelectedValue() != null) {
JList<String> list = this.vue.getActiveUsersList();
String pseudoOther = list.getSelectedValue();
Utilisateur other = this.commUDP.getUserFromPseudo(pseudoOther);
String idOther = other.getId();
// Check if we are already asking for a session/chatting with the person
// selected
// null condition because the list.clearSelection() generates an event
if (!this.idsSessionEnCours.contains(idOther)) {
int choix = this.vue.displayJOptionSessionCreation(pseudoOther);
System.out.println("choix : " + choix);
if (choix == 0) {
InetAddress ipOther = other.getIp();
try {
Socket socketComm = new Socket(ipOther, TCPServer.PORT_SERVER);
this.sendMessage(socketComm, Utilisateur.getSelf().getPseudo());
String reponse = this.readMessage(socketComm);
System.out.println("reponse : " + reponse);
if (reponse.equals("accepted")) {
this.idsSessionEnCours.add(idOther);
VueSession session = new VueSession(socketComm, idOther, pseudoOther, ipOther, this.sqlManager);
this.vue.addSession(pseudoOther, session);
this.vue.displayJOptionResponse("acceptee");
} else {
this.vue.displayJOptionResponse("refusee");
socketComm.close();
System.out.println("refused");
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
list.clearSelection();
System.out.println("pseudo de la personne a atteindre : " + pseudoOther);
}
}
// ---------- ACTION LISTENER OPERATIONS ----------//
@Override
public void actionPerformed(ActionEvent e) {
// Cas Modifier Pseudo
if ((JButton) e.getSource() == this.vue.getButtonModifierPseudo()) {
JButton modifierPseudo = (JButton) e.getSource();
if (this.modifPseudo == ModifPseudo.TERMINE) {
this.lastPseudo = Utilisateur.getSelf().getPseudo();
modifierPseudo.setText("OK");
this.modifPseudo = ModifPseudo.EN_COURS;
} else {
if (this.vue.getDisplayedPseudo().length() >= 1
&& !this.commUDP.containsUserFromPseudo(this.vue.getDisplayedPseudo().toLowerCase())) {
Utilisateur.getSelf().setPseudo(this.vue.getDisplayedPseudo());
this.commUDP.sendMessageInfoPseudo();
} else {
this.vue.setDisplayedPseudo(this.lastPseudo);
}
modifierPseudo.setText("Modifier");
this.modifPseudo = ModifPseudo.TERMINE;
}
this.vue.toggleEditPseudo();
}
// Cas deconnexion
else if ((JButton) e.getSource() == this.vue.getButtonDeconnexion()) {
try {
this.setVueConnexion();
} catch (IOException e1) {
e1.printStackTrace();
}
}
else if (this.vue.isButtonTab(e.getSource())) {
JButton button = (JButton) e.getSource();
int index = this.vue.removeSession(button);
this.idsSessionEnCours.remove(index);
}
}
// ---------- WINDOW LISTENER OPERATIONS ----------//
@Override
public void windowClosing(WindowEvent e) {
try {
this.setVueConnexion();
} catch (IOException e1) {
e1.printStackTrace();
}
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
// ------------SOCKET-------------//
private void sendMessage(Socket sock, String message) throws IOException {
PrintWriter output = new PrintWriter(sock.getOutputStream(), true);
output.println(message);
}
private String readMessage(Socket sock) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream()));
return input.readLine();
}
// ------------OBSERVERS-------------//
@Override
public void update(Object o, Object arg) {
if (o == this.tcpServ) {
Socket sockAccept = (Socket) arg;
try {
String pseudoOther = this.readMessage(sockAccept);
Utilisateur other = this.commUDP.getUserFromPseudo(pseudoOther);
String idOther = other.getId();
InetAddress ipOther = other.getIp();
int reponse;
if (!this.idsSessionEnCours.contains(idOther)) {
reponse = this.vue.displayJOptionAskForSession(pseudoOther);
System.out.println("reponse : " + reponse);
} else {
reponse = 1;
}
if (reponse == 0) {
this.idsSessionEnCours.add(idOther);
this.sendMessage(sockAccept, "accepted");
VueSession session = new VueSession(sockAccept, idOther, pseudoOther,ipOther, this.sqlManager);
this.vue.addSession(pseudoOther, session);
} else {
this.sendMessage(sockAccept, "refused");
sockAccept.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void updateList(Object o, ArrayList<Utilisateur> userList) {
if (o == this.commUDP) {
ArrayList<String> pseudos = new ArrayList<String>();
for (Utilisateur u : userList) {
pseudos.add(u.getPseudo());
}
this.vue.setActiveUsersList(pseudos);
}
}
@Override
public void updateSocketState(Object o, Object arg) {
VueSession session = (VueSession) arg;
int index = this.vue.removeSession(session);
this.idsSessionEnCours.remove(index);
}
private void setVueConnexion() throws UnknownHostException, IOException {
this.commUDP.sendMessageDelete();
this.vue.removeAllUsers();
this.vue.closeAllSession();
this.idsSessionEnCours.clear();
Utilisateur.resetSelf();
this.commUDP.setObserver(null);
this.vue.setVisible(false);
this.vueConnexion.setVisible(true);
}
protected void init() throws UnknownHostException, IOException {
this.commUDP.setObserver(this);
this.commUDP.sendMessageConnecte();
this.commUDP.sendMessageInfoPseudo();
this.modifPseudo = ModifPseudo.TERMINE;
}
}