From 886e51257b3d610ee0e4f7576d720495914ae9ec Mon Sep 17 00:00:00 2001
From: Greg Burri <greg.burri@gmail.com>
Date: Fri, 16 May 2008 22:51:04 +0000
Subject: [PATCH] =?utf8?q?FIX=20bug=20du=20process=20qui=20ne=20se=20termi?=
 =?utf8?q?nait=20pas=20lorsque=20la=20connexion=20tcp=20=C3=A9tait=20ferm?=
 =?utf8?q?=C3=A9=20(enfin=20!)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 doc/TODO.txt                                  |  6 +--
 modules/erl/euphorik_bd.erl                   |  4 ++
 .../erl/euphorik_minichat_conversation.erl    | 45 -------------------
 modules/erl/euphorik_protocole.erl            |  8 ++--
 modules/erl/euphorik_requests.erl             |  9 ++--
 5 files changed, 16 insertions(+), 56 deletions(-)

diff --git a/doc/TODO.txt b/doc/TODO.txt
index 805658b..d4b1ec5 100755
--- a/doc/TODO.txt
+++ b/doc/TODO.txt
@@ -166,9 +166,7 @@
 1 : Critique
 2 : Urgent
 3 : Peu grave
-     
-[1] Les processus en attente ne se termine pas lorsque le socket est fermé (pour l'instant un timeout de 1heure est appliqué)
-[1] Possibilité d'enregistrer plusieurs users avec le même login
+     
 [1] Lors de l'extraction d'une conv il arrive que la conv extractée soit bien créée mais vide, le bouton ne ferme pas la conv (très étrange, bug de firefox?)
    * Arrive une fois sur 20 environ
    * Jamais reproduit avec Opera
@@ -215,6 +213,8 @@
 [ok] jQuery définit l'option "X-Requested-With" à "XMLHttpRequest dans l'entête HTTP. De ce fait Yaws exige absolument de l'xml...
    Solution actuelle : jquery.js est modifié pour ne plus définir cette option. Trouver un autre moyen plus élégant.
 [ok] Les smiles ne devraient pas dépasser de la fenêtre lorsqu'ils sont affichés
+[ok] Les processus en attente ne se termine pas lorsque le socket est fermé (pour l'instant un timeout de 1heure est appliqué)
+[ok] Possibilité d'enregistrer plusieurs users avec le même login
 
 === Idées ===
 Une fois l'idée validée elle est déplacée dans une version à venir.
diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl
index d354c21..a6099fe 100755
--- a/modules/erl/euphorik_bd.erl
+++ b/modules/erl/euphorik_bd.erl
@@ -640,8 +640,12 @@ attend_evenement_troll() ->
          {add, [Troll]};
       {mnesia_table_event, {delete, troll, {troll, Id}, _, _}} ->
          {del, Id};
+      {tcp_closed, _} ->
+         exit(normal);
       _ ->
          attend_evenement_troll()
+   % 60 minutes de timeout (on ne sais jamais)
+   % Après 60 minutes de connexion, le client doit donc reétablir une connexion
    after 1000 * 60 * 60 -> 
       timeout
    end.
diff --git a/modules/erl/euphorik_minichat_conversation.erl b/modules/erl/euphorik_minichat_conversation.erl
index 0ce113c..2530327 100755
--- a/modules/erl/euphorik_minichat_conversation.erl
+++ b/modules/erl/euphorik_minichat_conversation.erl
@@ -46,51 +46,6 @@ conversations(Racines, N, D, P) ->
          true ->
             mise_en_forme_conversations(Conversations)
       end.
-   
-   
-% Ecoute les événements de modification d'une table.
-% @spec subscribe(atom(), integer()) -> ok | erreur
-% Obsolète
-%~ subscribe(_Table, 0) ->
-   %~ erreur;
-%~ subscribe(Table, C) ->
-   %~ case mnesia:subscribe({table, Table, simple}) of 
-   	%~ {error, {not_active_local, Table}} ->
-         %~ mnesia:add_table_copy(minichat, node(), ram_copies),
-         %~ subscribe(Table, C - 1);
-      %~ {error, _}->
-         %~ erreur;
-      %~ _ ->
-         %~ ok
-   %~ end.   
-   
-   
-% Arrête d'écouter les modifications d'une table.
-% @spec unsubscribe(atom()) -> term()
-% Obsolète
-%~ unsubscribe(Table) -> 
-   %~ mnesia:unsubscribe({table, Table, simple}).
- 
- 
-% Attend qu'un nouveau message arrive, function bloquante.
-% Renvoie le nouveau message.
-% Obsolète
-% @spec attend_nouveau_message() -> #minichat | timeout
-%~ attend_nouveau_message() ->
-   %~ receive % attente d'un post
-      %~ {mnesia_table_event, {write, Message, _}} ->
-         %~ Message;
-         %~ %file:close(F);
-      %~ {tcp_closed, _} ->
-         %~ mnesia:unsubscribe({table, minichat, simple});      
-      %~ _ ->
-         %~ attend_nouveau_message()
-   % 60 minutes de timeout (le cas ou il n'y a que des consultations et jamais de post)
-   % Après 60 minutes de connexion, le client doit donc reétablir une connexion
-   % TODO : pour être mieux : quand le socket se ferme alors un message devrait être envoyé et débloquer ce receive (demande en cours sur la mailing list de yaws)
-   %~ after 1000 * 60 * 60 -> 
-      %~ timeout
-   %~ end.   
      
 
 % Mise en forme des conversations pour l'utilisateur du module.
diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl
index b81f60a..fd2175d 100755
--- a/modules/erl/euphorik_protocole.erl
+++ b/modules/erl/euphorik_protocole.erl
@@ -271,12 +271,12 @@ wait_event_bd_page_chat() ->
          ok;
       {mnesia_table_event, {write, troll, Troll, [Old_troll | _], _}} when Troll#troll.date_post =/= undefined, Old_troll#troll.date_post == undefined ->
          ok;
-      M ->
-         io:format("M : ~p~n", [M]), %TODO : a virer
+      {tcp_closed, _} ->
+         exit(normal);
+      _ ->
          wait_event_bd_page_chat()
-   % 60 minutes de timeout (le cas ou il n'y a que des consultations et jamais de post)
+   % 60 minutes de timeout (on ne sais jamais)
    % Après 60 minutes de connexion, le client doit donc reétablir une connexion
-   % TODO : pour être mieux : quand le socket se ferme alors un message devrait être envoyé et débloquer ce receive (demande en cours sur la mailing list de yaws)
    after 1000 * 60 * 60 -> 
       timeout
    end.           
diff --git a/modules/erl/euphorik_requests.erl b/modules/erl/euphorik_requests.erl
index 5c2e538..edc0e17 100755
--- a/modules/erl/euphorik_requests.erl
+++ b/modules/erl/euphorik_requests.erl
@@ -20,12 +20,13 @@ tester() ->
 
 
 out(A) ->
-   %io:format("~p~n~n", [A]),
+   %io:format("~p~n", [A]), % utilisé parfois pendant le debug
    IP = case inet:peername(A#arg.clisock) of
-         {ok, {Adresse, _Port}} -> Adresse;
+      {ok, {Adresse, _Port}} -> Adresse;
       _ -> inconnue
-   end,
-   %inet:setopts(A#arg.clisock, inet:getopts(A#arg.clisock, [active])),
+   end,
+   % passive -> active, permet de recevoir {tcp_closed, _} lorsque le socket se ferme
+   inet:setopts(A#arg.clisock, [{active, true}]),
    {value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)),
    Ret = traiter_donnees(Contenu, IP),
    {content, "application/json", Ret}.
-- 
2.49.0