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 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(); 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 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 userList) { if (o == this.commUDP) { ArrayList pseudos = new ArrayList(); 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; } }