My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
EcoreCon  
Explication du code de l'exemple ecore_con
Updated Jun 14, 2010 by kraynel@gmail.com

Idée

On veut faire une requête TCP pour récupérer le code html de la page météo de Google. On va écrire une requête, en précisant les Headers à passer "en argument" et l'envoyer au serveur. On récupère et on affiche la réponse.

1ère étape

On ajoute un idler. Il prend comme argument la fonction à appeler et les données à lui passer. Ici, c'est simplement idler_cb :
   ecore_idler_add(idler_cb, null);
L'idler lui-même :
    function idler_cb(data)
    {
      handler = {
	  add: ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _elixir_add, self),		//Fonction appelée juste après avoir créé la connexion, on lui passe les données de "self"
	  del: ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _elixir_del, self),		//Fonction appelée lorsque l'on veut fermer la connexion, on lui passe les données de "self"
	  data: ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _elixir_data, self)	// Fonction appelée lors de la réception de donneés, on lui passe les données de "self"
      };

      server = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, "www.google.com", 80, self);	// On veut se connecter en TCP sur "www.google.com", sur le port 80 (http)
      if (!server)										// Si on n'arrive pas à ouvrir la connexion
	evas_object_text_text_set(state, "Unable to setup connexion !");			// On affiche un message d'erreur

      return 0;
    }

2ème étape

Ouverture de connexion et les headers :

Avec la fonction _elixir_add :

    function _elixir_add(data, type, event)
    {
      var header;

      if (event.server != server) // Si le serveur qui repond n'est pas celui qu'on a contacté, on arrête
	return 1;

      header = "GET http://www.google.com/ig/api?weather=Paris HTTP/1.1\r\n"; // Sinon, on demande la page à récupérer (météo sur Paris)
      header += "Host: www.google.com\r\n\r\n";							// On complète les headers. On peut éventuellement mettre à la suite des identifications

      ecore_con_server_send(server, header);							// On envoie les headers

      evas_object_text_text_set(state, "Sending header");

      return 0;
    }
A partir de maintenant, on a finit d'envoyer des données. On va recevoir la réponse.

3ème étape

Réception des données :

Avec la fonction _elixir_data, qui est appelée automatiquement lors de la réception de données.
    function _elixir_data(data, type, event)
    {
      if (event.server != server) // Si le serveur qui repond n'est pas celui qu'on a contacté, on arrête
	return 1;

      data.count += event.size;	 //Ici, data = self. On incrémente le compteur de taille de données reçues.
      evas_object_text_text_set(down, data.count + " octets"); // On affiche la taille des données reçues.
      evas_textblock_cursor_text_append(cursor, event.data); // On affiche les données reçues.

      return 0;
    }

4ème étape

Fermeture de la connexion :

Avec la fonction _elixir_del, qui est appelée juste avant de tuer la connexion :
    function _elixir_del(data, type, event)
    {
      if (event.server != server) // Si le serveur qui repond n'est pas celui qu'on a contacté, on arrête
	return 1;

      ecore_con_server_del(server);	// On supprime la connexion avec le serveur
      server = null;	// On n'est plus connecté

      evas_object_text_text_set(state, "Download done"); // On affiche un message.

      return 0;
    }

5ème étape

On stoppe l'idler avant de quitter :

Avec la fonction con_shutdown(), juste avant ecore_main_loop_quit() :

     function con_shutdown()
      {
      ecore_event_handler_del(handler.add);
      ecore_event_handler_del(handler.del);
      ecore_event_handler_del(handler.data);
      handler = undefined;
      }

Sign in to add a comment
Powered by Google Project Hosting