package controller; import java.awt.Color; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; import javax.swing.text.BadLocationException; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import config.Configuration; import gui.FenetreChat; import gui.FenetreMenu; import model.*; import network.*; import server.Request; import test.App; public class Agent implements PropertyChangeListener{ private Contact user; private UDPInput BIn; private UDPOutput BOut; //private TCPChat TCPSend; private TCPServer server; //private ListeContacts list; private InetAddress localAddress; private InetAddress broadcast; private ArrayList listTCPOk; private ArrayList listTCPDeg; private DataBase db; private PropertyChangeSupport support; public Agent(InetAddress address, int portIn, int portOut) throws IOException { this.user = new Contact("", address, portIn); this.BIn = new UDPInput(user.getAddress(), portIn); this.BOut = new UDPOutput(user, portOut); this.server = new TCPServer(user.getPort(), user.getAddress()); this.server.addPropertyChangeListener(this); //this.TCPSend = new TCPChat(user); //this.list = ListeContacts.getInstance(); this.localAddress=Tools.getAdress()[0]; this.broadcast= Tools.getAdress()[1]; this.db = DataBase.getInstance(); this.listTCPOk = new ArrayList(); this.listTCPDeg = new ArrayList(); this.support = new PropertyChangeSupport(this); this.BIn.addPropertyChangeListener(this); BIn.start(); } //user ayant déjà fait une connexion public Agent(InetAddress address, int portIn, int portOut, String login) throws IOException { this.db = DataBase.getInstance(); this.user = new Contact(db.getPseudoFromLogin(login), address, portIn); this.BIn = new UDPInput(user.getAddress(), portIn); this.BOut = new UDPOutput(user, portOut); this.server = new TCPServer(user.getPort(), user.getAddress()); this.server.addPropertyChangeListener(this); //this.TCPSend = new TCPChat(user); //this.list = ListeContacts.getInstance(); this.localAddress=Tools.getAdress()[0]; this.broadcast= Tools.getAdress()[1]; this.listTCPOk = new ArrayList(); this.listTCPDeg = new ArrayList(); this.support = new PropertyChangeSupport(this); this.BIn.addPropertyChangeListener(this); BIn.start(); } public void propertyChange(PropertyChangeEvent evt) { switch (evt.getPropertyName()) { case "Msg UDP Recu" : //System.out.println("envoi message"); Message msg = BIn.getMessage(); try { handleMessage(msg); } catch (IOException e) { e.printStackTrace(); } break; case "session chat demarree" : //System.out.println("dans session demarree"); TCPChat tcpChat = this.server.getConnexionTCPChat(); tcpChat.addPropertyChangeListener(this); this.listTCPOk.add(tcpChat); break; case "Msg TCP Recu" : SimpleAttributeSet left = new SimpleAttributeSet(); StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT); StyleConstants.setForeground(left, Color.RED); //System.out.println("dans property change"); TCPChat tcpChatCo = this.listTCPOk.get(0); MessageChat msgRecu = tcpChatCo.getMessageRecu(); //FenetreChat.getTa().append("kevin"+ " : "+msgRecu.getMessage()+"\n"); if(FenetreChat.isOuvert()) { StyledDocument doc = FenetreChat.getDoc(); try { doc.insertString(doc.getLength(), "\n"+msgRecu.getMessage(), left ); } catch (BadLocationException e) { e.printStackTrace(); } doc.setParagraphAttributes(doc.getLength(), 1, left, false); break; } } } /*type 0 : premier message de broadcast * type, 1 : deuxieme message de broadcast avec pseudo * type 2 : Message de déconnexion * type 3 : message pseudo changé * type 4 : Message affichage * type 5 : Message chat */ public void handleMessage(Message msg) throws IOException { switch(msg.getTypeMessage()) { case 0 : //System.out.println("Envoi message présentation"); MessagePseudo msgPresentation = new MessagePseudo(this.localAddress, msg.getAddressSrc(), this.user.getPort(), msg.getPortSrc(), 1, this.user.getPseudo(), this.user.getId(), ""); BOut.send(msgPresentation, msg.getAddressSrc(), msg.getPortSrc()); break; case 1 : MessagePseudo msgPseudo = (MessagePseudo) msg; boolean pseudoExist = Request.sendPseudo(msgPseudo.getPseudo(), "pseudoOK"); if(!pseudoExist) { Contact newUser = new Contact(msgPseudo.getPseudo(), msgPseudo.getAddressSrc(), msgPseudo.getPortSrc()); //Request.sendUser(msgPseudo.getPseudo(), msgPseudo.getAddressSrc().toString(), Integer.toString(msgPseudo.getPortSrc()), "addUser"); //list.addContact(newUser); if(FenetreMenu.ouvert) { FenetreMenu.getCb().addItem(newUser.getPseudo()); } } break; case 2 : MessagePseudo messageDeconnexion = (MessagePseudo) msg; boolean pseudoExiste = Request.sendPseudo(messageDeconnexion.getPseudo(), "pseudoOK"); if(pseudoExiste){ //Request.sendDeconnexion(Integer.toString(messageDeconnexion.getId()),messageDeconnexion.getPseudo(), "deconnexion"); FenetreMenu.getCb().removeItem(messageDeconnexion.getPseudo()); } //fermeture de la fenetre chat le user et la personne qui se deconnecte if(FenetreChat.isOuvert()&&FenetreChat.getDest().getPseudo().equals(messageDeconnexion.getPseudo())) { FenetreChat.fermer(); } break; case 3 : MessagePseudo messageNewPseudo = (MessagePseudo) msg; //Contact contact = list.findContact(messageNewPseudo.getPseudo()); //int id = this.db.getIdFromPseudo(contact.getPseudo()); for(int i = 0 ; i msg_recus = BIn.getListMessage(); for(int i =0; i msg_recus = BIn.getListMessage(); for(int i =0; i getListeTCPChat(){ return listTCPDeg; } public TCPChat getTCPChat() { return this.listTCPDeg.remove(0); } }