Remove the weekly troll.
[euphorik.git] / js / communication.js
index 5ef2d88..64ebf40 100644 (file)
 // Regroupe la partie communication JSON client -> serveur de euphorik.\r
 // Voir : http://dev.euphorik.ch/wiki/euk/Protocole\r
 \r
-/**
-  * Les fonctions debutReq et finReq servent, par exemple, à afficher à l'utilisateur
+/**\r
+  * Les fonctions debutReq et finReq servent, par exemple, à afficher à l'utilisateur\r
   * qu'une communication est en cours.\r
-  * @param funError un fonction executée lors d'un réponse 'error' de la part du serveur, peut être redéfinit pour une requête.
-  * @param funDebutReq fonction appelée au début d'une requête (facultatif)
+  * @param funError un fonction executée lors d'un réponse 'error' de la part du serveur, peut être redéfinit pour une requête.\r
+  * @param funDebutReq fonction appelée au début d'une requête (facultatif)\r
   * @param funFinReq fonction appelée à la fin d'une requête (facultatif)\r
   */\r
 euphorik.Communication = function(funError, funDebutReq, funFinReq) {\r
-   this.funError = funError;
-   this.funDebutReq = funDebutReq;
+   this.funError = funError;\r
+   this.funDebutReq = funDebutReq;\r
    this.funFinReq = funFinReq;\r
-};
-
-/**
-  * Charge un fichier depuis une url et retourne son contenu.
-  */
-euphorik.Communication.prototype.load = function(url) {
-   if (this.funDebutReq) {
-      this.funDebutReq();
-   }
-   var contenu = "";
-   $.ajax({async: false, url: url, success : function(page) { contenu += page; }});
-   if (this.funFinReq) {
-      this.funFinReq();
-   }   
-   return contenu;
 };\r
-
-/**
-  * Effectue une requête JSON auprès du serveur.
-  * @param action une chaine spécifiant l'action, par exemple "put_message"
-  * @param json les données à envoyer associé à l'action, par exemple {"cookie" : "LKJDLAKSJBFLKASN", "nick" : "Paul", "content" : "Bonjour", "answer_to" : [] }
-  * @param funOk la fonction exécuté après réception des données du serveur
-  * @param funError la fonction exécuté si une erreur arrive (facultatif)
-  * @param asynchrone true pour une communication asychrone (facultatif, truepar défaut)
-  * @param paramsSupp un objet contenant des paramètres supplémentaire pour la fonction ajax de jQuery (facultatif)
+\r
+/**\r
+  * Charge un fichier depuis une url et retourne son contenu.\r
+  */\r
+euphorik.Communication.prototype.load = function(url) {\r
+   if (this.funDebutReq) {\r
+      this.funDebutReq();\r
+   }\r
+   var contenu = "";\r
+   $.ajax({async: false, url: url, success : function(page) { contenu += page; }});\r
+   if (this.funFinReq) {\r
+      this.funFinReq();\r
+   }\r
+   return contenu;\r
+};\r
+\r
+/**\r
+  * Effectue une requête JSON auprès du serveur.\r
+  * @param action une chaine spécifiant l'action, par exemple "put_message"\r
+  * @param json les données à envoyer associé à l'action, par exemple {"cookie" : "LKJDLAKSJBFLKASN", "nick" : "Paul", "content" : "Bonjour", "answer_to" : [] }\r
+  * @param funOk la fonction exécuté après réception des données du serveur\r
+  * @param funError la fonction exécuté si une erreur arrive (facultatif)\r
+  * @param asynchrone true pour une communication asychrone (facultatif, truepar défaut)\r
+  * @param paramsSupp un objet contenant des paramètres supplémentaire pour la fonction ajax de jQuery (facultatif)\r
   */\r
 euphorik.Communication.prototype.requete = function(action, json, funOk, funError, asynchrone, paramsSupp) {\r
    var thisCommunication = this;\r
@@ -65,12 +65,12 @@ euphorik.Communication.prototype.requete = function(action, json, funOk, funErro
    var mess = this.getBase(action);\r
    objectEach(json, function(name, val) {\r
       mess[name] = val;\r
-   });
-   
-   if (this.funDebutReq) {
-      this.funDebutReq();
+   });\r
+\r
+   if (this.funDebutReq) {\r
+      this.funDebutReq();\r
    }\r
-      \r
+\r
    paramsAjax = {\r
       async: asynchrone,\r
       type: "POST",\r
@@ -78,9 +78,9 @@ euphorik.Communication.prototype.requete = function(action, json, funOk, funErro
       dataType: "json",\r
       data: { action : JSON.stringify(mess) },\r
       success:\r
-         function(data) {            
-            if (thisCommunication.funFinReq) {
-               thisCommunication.funFinReq();
+         function(data) {\r
+            if (thisCommunication.funFinReq) {\r
+               thisCommunication.funFinReq();\r
             }\r
             if (data.reply === "error") {\r
                if (funError) {\r
@@ -91,131 +91,133 @@ euphorik.Communication.prototype.requete = function(action, json, funOk, funErro
             } else if (funOk) {\r
                funOk(data);\r
             }\r
-         },
-      error:
-         function(data) {
-            if (thisCommunication.funFinReq) {
-               thisCommunication.funFinReq();
-            }
+         },\r
+      error:\r
+         function(data) {\r
+            if (thisCommunication.funFinReq) {\r
+               thisCommunication.funFinReq();\r
+            }\r
          }\r
    };\r
-   \r
+\r
    if (paramsSupp) {\r
       objectEach(paramsSupp, function(name, val) {\r
          paramsAjax[name] = val;\r
       });\r
    }\r
-   \r
+\r
    jQuery.ajax(paramsAjax);\r
 };\r
-
-euphorik.Communication.prototype.createCometConnection = function(name) {
-   return new Comet(name, this.getBase);
-};
+\r
+euphorik.Communication.prototype.createCometConnection = function(name) {\r
+   return new Comet(name, this.getBase);\r
+};\r
 \r
 euphorik.Communication.prototype.getBase = function(action) {\r
    return {\r
       "header" : { "action" : action, "version" : euphorik.conf.versionProtocole }\r
    };\r
-};
-
-/**
-  * Permet de gérer les événements (push serveur).
-  * Principe de fonctionnement :
-  *  - La page courante créer un objet euphorik.Comet en indiquant le nom de la page et la version du protocole.
-  *  - La page courante attend un événement en appelant 'waitEvent' (non-bloquant) et en donnant deux fonctions :
-  *    - 'funSend' une fonction qui renvoie l'objet à envoyer avant l'attente, par exemple {"dernierMess" : 23}
-  *       ("header" et "page" sont automatiquement ajoutés à l'objet)
-  *    - 'funsReceive' un ensemble de fonctions à appeler en fonction du "reply" du serveur, par exemple {"set_nom" : function(data) { print("ok : " + data.nom); } }
-  *
-  * l'information envoyée est sous la forme :
-  *  {
-  *     "header" : {"action" : "wait_event", "version" : <v> },
-  *     "page" : <page>
-  *     [..]
-  *  }
-  * l'information reçue est sous la forme :
-  *  {
-  *     "reply" : <reply>
-  *     [..]
-  *  }
-  * <reply> et <page> sont de type chaine
-  *
-  * @page [string] la page courante pour laquelle on écoute des événements (un string)
-  * @util [int] la version
-  */
-Comet = function(page, getBase) {
-   this.page = page;
-   this.getBase = getBase;
-   
-   // l'objet JSONHttpRequest représentant la connexion d'attente
-   this.attenteCourante = undefined;
-   
-   // le multhreading du pauvre, merci javascript de m'offrire autant de primitives pour la gestion de la concurrence...
-   this.stop = false;
-};
-
-/**
-  * Arrête l'attente courante s'il y en a une.
-  */
-Comet.prototype.stopAttenteCourante = function() {
-   this.stop = true;
-         
-   if (this.attenteCourante) {
-      this.attenteCourante.abort();
-   }
-};
-
-/**
-  * Attend un événement lié à la page. Non-bloquant. 
-  * @funSend une fonction renvoyant les données json à envoyer
-  * @funsReceive est un objet comprenant les fonctions à appeler en fonction du "reply"
-  * les fonctions acceptent un paramètre correspondant au données reçues.
-  * exemple : {"new_message" : function(data){ ... }}
-  */
-Comet.prototype.waitEvent = function(funSend, funsReceive) {
-   this.stopAttenteCourante();   
-   this.stop = false;   
-   var thisComet = this;
-      
-   // on doit conserver l'ordre des valeurs de l'objet JSON (le serveur les veut dans l'ordre définit dans le protocole)
-   // TODO : ya pas mieux ?
-   var dataToSend = this.getBase("wait_event")
-   dataToSend["page"] = this.page;
-   
-   var poulpe = funSend();
-   objectEach(poulpe, function(k, v) {
-      dataToSend[k] = v;
-   });
-   
-   this.attenteCourante = jQuery.ajax({
-      type: "POST",
-      url: "request",
-      dataType: "json",
-      // TODO : doit disparaitre
-      timeout: 180000, // timeout de 3min. Gros HACK pas beau. FIXME problème décrit ici : http://groups.google.com/group/jquery-en/browse_thread/thread/8724e64af3333a76
-      data: { action : JSON.stringify(dataToSend) },
-      success:
-         function(data) {
-            funsReceive[data.reply](data);
-         
-            // rappel de la fonction dans 100 ms
-            setTimeout(function(){ thisComet.waitEvent2(funSend, funsReceive); }, 100);
-         },
-      error:
-         function(XMLHttpRequest, textStatus, errorThrown) {
-            ;; console.log("Connexion perdue dans Comet.prototype.waitEvent() : \n" + textStatus);
-            setTimeout(function(){ thisComet.waitEvent2(funSend, funsReceive); }, 1000);
-         }
-   });
-};
-
-/**
-  * Si un stopAttenteCourante survient un peu n'importe quand il faut imédiatement arreter de boucler.
-  */
-Comet.prototype.waitEvent2 = function(funSend, funsReceive) {
-   if (this.stop) {
-      return;
-   }
-   this.waitEvent(funSend, funsReceive);
+};\r
+\r
+/**\r
+  * Permet de gérer les événements (push serveur).\r
+  * Principe de fonctionnement :\r
+  *  - La page courante créer un objet euphorik.Comet en indiquant le nom de la page et la version du protocole.\r
+  *  - La page courante attend un événement en appelant 'waitEvent' (non-bloquant) et en donnant deux fonctions :\r
+  *    - 'funsReceive' un ensemble de fonctions à appeler en fonction du "reply" du serveur, par exemple {"set_nom" : function(data) { print("ok : " + data.nom); } }\r
+  *    - 'funSend' une fonction qui renvoie l'objet à envoyer avant l'attente, par exemple {"dernierMess" : 23}\r
+  *       ("header" et "page" sont automatiquement ajoutés à l'objet)\r
+  *\r
+  * l'information envoyée est sous la forme :\r
+  *  {\r
+  *     "header" : {"action" : "wait_event", "version" : <v> },\r
+  *     "page" : <page>\r
+  *     [..]\r
+  *  }\r
+  * l'information reçue est sous la forme :\r
+  *  {\r
+  *     "reply" : <reply>\r
+  *     [..]\r
+  *  }\r
+  * <reply> et <page> sont de type chaine\r
+  *\r
+  * @page [string] la page courante pour laquelle on écoute des événements (un string)\r
+  * @util [int] la version\r
+  */\r
+Comet = function(page, getBase) {\r
+   this.page = page;\r
+   this.getBase = getBase;\r
+\r
+   // l'objet JSONHttpRequest représentant la connexion d'attente\r
+   this.attenteCourante = undefined;\r
+\r
+   // le multhreading du pauvre, merci javascript de m'offrire autant de primitives pour la gestion de la concurrence...\r
+   this.stop = false;\r
+};\r
+\r
+/**\r
+  * Arrête l'attente courante s'il y en a une.\r
+  */\r
+Comet.prototype.stopAttenteCourante = function() {\r
+   this.stop = true;\r
+\r
+   if (this.attenteCourante) {\r
+      this.attenteCourante.abort();\r
+   }\r
+};\r
+\r
+/**\r
+  * Attend un événement lié à la page. Non-bloquant.\r
+  * @funsReceive est un objet comprenant les fonctions à appeler en fonction du "reply"\r
+  * les fonctions acceptent un paramètre correspondant au données reçues.\r
+  * exemple : {"new_message" : function(data){ ... }}\r
+  * @funSend une fonction renvoyant les données json à envoyer (optional)\r
+  */\r
+Comet.prototype.waitEvent = function(funsReceive, funSend) {\r
+   this.stopAttenteCourante();\r
+   this.stop = false;\r
+   var thisComet = this;\r
+\r
+   // on doit conserver l'ordre des valeurs de l'objet JSON (le serveur les veut dans l'ordre définit dans le protocole)\r
+   // TODO : ya pas mieux ?\r
+   var dataToSend = this.getBase("wait_event")\r
+   dataToSend["page"] = this.page;\r
+\r
+   if (funSend !== undefined) {\r
+      var tmp = funSend();\r
+      objectEach(tmp, function(k, v) {\r
+         dataToSend[k] = v;\r
+      });\r
+   }\r
+\r
+   this.attenteCourante = jQuery.ajax({\r
+      type: "POST",\r
+      url: "request",\r
+      dataType: "json",\r
+      // TODO : doit disparaitre\r
+      timeout: 180000, // timeout de 3min. Gros HACK pas beau. FIXME problème décrit ici : http://groups.google.com/group/jquery-en/browse_thread/thread/8724e64af3333a76\r
+      data: { action : JSON.stringify(dataToSend) },\r
+      success:\r
+         function(data) {\r
+            funsReceive[data.reply](data);\r
+\r
+            // rappel de la fonction dans 100 ms\r
+            setTimeout(function(){ thisComet.waitEvent2(funsReceive, funSend); }, 100);\r
+         },\r
+      error:\r
+         function(XMLHttpRequest, textStatus, errorThrown) {\r
+            // console.log("Connexion perdue dans Comet.prototype.waitEvent() : \n" + textStatus);\r
+            setTimeout(function(){ thisComet.waitEvent2(funsReceive, funSend); }, 1000);\r
+         }\r
+   });\r
+};\r
+\r
+/**\r
+  * Si un stopAttenteCourante survient un peu n'importe quand il faut imédiatement arreter de boucler.\r
+  */\r
+Comet.prototype.waitEvent2 = function(funsReceive, funSend) {\r
+   if (this.stop) {\r
+      return;\r
+   }\r
+   this.waitEvent(funsReceive, funSend);\r
 };
\ No newline at end of file