public Message(MessageSujet sujet, Connection source, int id, bool enReception)
 {
     this.sujetMsg = sujet;
     this.connSource = source;
     this.typeMsg = MessageSujetToMessageType(sujetMsg);
     this.repondu = false;
     this.id = id;
     this.estEnvoyer = false;
     this.enReception = enReception;
     this.reponse = null;
 }
 private void handleRequete(Message msg)
 {
     handler.onRequestReceived(msg);
 }
 private void handleReponse(Message msg)
 {
     lock (reponses)
     {
         reponses.Add(msg.id, msg);
     }
 }
 private void handleNotif(Message msg)
 {
     handler.onNotifReceived(msg);
 }
        public Message creerMessage(Message.MessageSujet sujet)
        {
            switch(sujet)
            {
                case Message.MessageSujet.RequeteVolerJoueur:
                    return new RequeteVoleur(sujet, this, generateId(), false);

                case Message.MessageSujet.RequeteConstructionColonie:
                case Message.MessageSujet.RequeteConstructionRoute:
                case Message.MessageSujet.RequeteConstructionVille:
                case Message.MessageSujet.RequeteDeplacerVoleur:
                    return new RequetePosition(sujet, this, generateId(), false);

                case Message.MessageSujet.RequeteRejoindrePartie:
                    return new RequeteRejoindrePartie(sujet, this, generateId(), false);

                case Message.MessageSujet.ReponseVoleur:
                case Message.MessageSujet.ReponseRes:
                    return new ReponseRes(sujet, this, generateId(), false);

                case Message.MessageSujet.ReponseDe:
                    return new ReponseDe(sujet, this, generateId(), false);

                case Message.MessageSujet.ReponseCarteDev:
                    return new ReponseCarteDev(sujet, this, generateId(), false);

                case Message.MessageSujet.NotifMessage:
                    return new NotifMessage(sujet, this, generateId(), false);

                case Message.MessageSujet.NotifJoueurAssigne:
                    return new NotifJoueurAssigne(sujet, this, generateId(), false);

                case Message.MessageSujet.NotifPartieCreer:
                    return new NotifPartieCreer(sujet, this, generateId(), false);

                case Message.MessageSujet.NotifColoniePlace:
                case Message.MessageSujet.NotifRoutePlace:
                case Message.MessageSujet.NotifVillePlace:
                case Message.MessageSujet.NotifVoleurDeplace:
                    return new NotifAjoutElement(sujet, this, generateId(), false);

                case Message.MessageSujet.NotifPerteCarte:
                    return new NotifPerteCarte(sujet, this, generateId(), false);

                case Message.MessageSujet.NotifDebutTour:
                    return new NotifDebutTour(sujet, this, generateId(), false);

                default:
                    return new Message(sujet, this, generateId(), false);
            }
        }
 public Message attendreReponse(Message msg)
 {
     return listener.getReponse(msg.id);
 }
 public void envoyer(Message msg)
 {
     //todo catch exception et call onConnectionClose(this)
     getSerializer().Serialize(strm, msg);
 }
        public Message creerReponse(Message.MessageSujet sujet, Message msg)
        {
            /* todo Creer reponse du type aproprie */
            Message reponse = creerMessage(sujet);
            reponse.setAsReponse(msg);

            return reponse;
        }
 public void sendPosition(Message.MessageSujet sujet, Joueur j, int position)
 {
     NotifAjoutElement msg = (NotifAjoutElement)conn.creerMessage(sujet);
     msg.joueur = j;
     msg.position = position;
     msg.envoyer();
 }
 public void setAsReponse(Message request)
 {
     this.repondu = false;
     this.estEnvoyer = false;
     this.enReception = false;
     id = request.id;
 }
 public void setAsReceived(Connection conn)
 {
     repondu = false;
     estEnvoyer = false;
     enReception = true;
     connSource = conn;
     reponse = null;
 }
        /*
         *  getReponse : Attend la reponse au messge et la retourne. Cache la reponse permettant ainsi d'etre appeler a plusieurs reprises.
         */
        public Message getReponse()
        {
            if (typeMsg == MessageType.Notif || this.enReception )
            {
                throw new InvalidOperationException("Attente de reponse sur une notification!");
            }

            if (reponse == null) reponse = connSource.attendreReponse(this);

            return reponse;
        }
        /*
         *  repondre : Methode servant a envoyer le message par le biais de la connection qui l'a creer.
         */
        public Message creerReponse(MessageSujet sujet)
        {
            if (reponse != null || !isStateValidForResponse())
            {
                throw new InvalidOperationException("Etat invalide du message pour la reponse.");
            }

            reponse = connSource.creerReponse(sujet, this);
            return reponse;
        }
 private void sendAllPosition(Message.MessageSujet sujet, Joueur j, int position)
 {
     foreach (ServeurJoueur sj in joueursEnAttente)
     {
         sj.sendPosition(sujet, j, position);
     }
 }