|  | @@ -1,188 +1,70 @@
 | 
	
		
			
				|  |  | +/* 
 | 
	
		
			
				|  |  | + * File:   main.c
 | 
	
		
			
				|  |  | + * Author: Arthur Brandao
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Created on 22 novembre 2018
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #include <stdio.h>
 | 
	
		
			
				|  |  |  #include <stdlib.h>
 | 
	
		
			
				|  |  |  #include <unistd.h>
 | 
	
		
			
				|  |  | -#include "json.h"
 | 
	
		
			
				|  |  | -#include "arraylist.h"
 | 
	
		
			
				|  |  | -#include "server.h"
 | 
	
		
			
				|  |  | +#include <signal.h>
 | 
	
		
			
				|  |  |  #include "error.h"
 | 
	
		
			
				|  |  |  #include "bomberstudent_server.h"
 | 
	
		
			
				|  |  | -#include "client.h"
 | 
	
		
			
				|  |  | +#include "main.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* --- Extern --- */
 | 
	
		
			
				|  |  |  extern Error error;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -int parse(){
 | 
	
		
			
				|  |  | -    char str[200];
 | 
	
		
			
				|  |  | -    char* key = NULL;
 | 
	
		
			
				|  |  | -    char* val = NULL;
 | 
	
		
			
				|  |  | -    JsonParser json;
 | 
	
		
			
				|  |  | -    strcpy(str, "{\"name\" : \"Jack\", \"age\": 27, \"test\": true, \"tab\": [1, 2, 3, 4, 5], \"obj\": {\"name\" : \"Jack\", \"age\": 27}, \"nb\": 27.8 }");
 | 
	
		
			
				|  |  | -    //Parse
 | 
	
		
			
				|  |  | -    int a = json_parse(&json, str);
 | 
	
		
			
				|  |  | -    printf("Parse : %d\n", a);
 | 
	
		
			
				|  |  | -    //Affiche toutes les clefs : valeurs
 | 
	
		
			
				|  |  | -    for(int i = 0; i < json.elt; i++){
 | 
	
		
			
				|  |  | -        key = key_index(&json, i);
 | 
	
		
			
				|  |  | -        val = get_index(&json, i);
 | 
	
		
			
				|  |  | -        printf("%s : %s\n", key, val);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    //Recup un nombre
 | 
	
		
			
				|  |  | -    printf("Double : %f %.2f | Int : %d %d\n", get_number(&json, "age"), get_number(&json, "nb"), get_integer(&json, "age"), get_integer(&json, "nb"));
 | 
	
		
			
				|  |  | -    //Recup boolean
 | 
	
		
			
				|  |  | -    printf("Bool : %d %d\n", get_boolean(&json, "test"), get_boolean(&json, "tab"));
 | 
	
		
			
				|  |  | -    //Recup obj
 | 
	
		
			
				|  |  | -    JsonParser* js;
 | 
	
		
			
				|  |  | -    js = get_object(&json, "obj");
 | 
	
		
			
				|  |  | -    if(js != NULL){
 | 
	
		
			
				|  |  | -        int key_i = get_pos(js, "name");
 | 
	
		
			
				|  |  | -        printf("JSON : %s %s, age %d\n", key_index(js, key_i), get_value(js, "name"), get_integer(js, "age"));
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -        printf("JSON : Error");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    //Supprime
 | 
	
		
			
				|  |  | -    free(key);
 | 
	
		
			
				|  |  | -    free(val);
 | 
	
		
			
				|  |  | -    clean_json_parser(&json);
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -int encode(){
 | 
	
		
			
				|  |  | -    //Encode
 | 
	
		
			
				|  |  | -    JsonEncoder json;
 | 
	
		
			
				|  |  | -    ini_encoder(&json);
 | 
	
		
			
				|  |  | -    add_string(&json, "name", "robert");
 | 
	
		
			
				|  |  | -    add_number(&json, "nb", 25.698, 2);
 | 
	
		
			
				|  |  | -    add_integer(&json, "int", 846);
 | 
	
		
			
				|  |  | -    add_string(&json, "aze", "rty");
 | 
	
		
			
				|  |  | -    add_boolean(&json, "bool", false);
 | 
	
		
			
				|  |  | -    add_value(&json, "\"test\": \"aze\nrty\"");
 | 
	
		
			
				|  |  | -    printf("Json\n");
 | 
	
		
			
				|  |  | -    printf("%s\n", json_encode(&json));
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    //Encode un JsonEncoder
 | 
	
		
			
				|  |  | -    JsonEncoder json2;
 | 
	
		
			
				|  |  | -    ini_encoder(&json2);
 | 
	
		
			
				|  |  | -    add_integer(&json2, "vie", 42);
 | 
	
		
			
				|  |  | -    add_object(&json2, "obj", json);
 | 
	
		
			
				|  |  | -    printf("\nJson 2\n");
 | 
	
		
			
				|  |  | -    printf("%s\n", json_encode(&json2));
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    //Decode
 | 
	
		
			
				|  |  | -    JsonParser parser, *parser2;
 | 
	
		
			
				|  |  | -    char* key, *val;
 | 
	
		
			
				|  |  | -    json_parse(&parser, json_encode(&json2));
 | 
	
		
			
				|  |  | -    //Affiche toutes les clefs : valeurs
 | 
	
		
			
				|  |  | -    printf("\nParser\n");
 | 
	
		
			
				|  |  | -    for(int i = 0; i < parser.elt; i++){
 | 
	
		
			
				|  |  | -        key = key_index(&parser, i);
 | 
	
		
			
				|  |  | -        val = get_index(&parser, i);
 | 
	
		
			
				|  |  | -        printf("%s : %s\n", key, val);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    //Lecture du sous json
 | 
	
		
			
				|  |  | -    parser2 = get_object(&parser, "obj");
 | 
	
		
			
				|  |  | -    //Affiche toutes les clefs : valeurs
 | 
	
		
			
				|  |  | -    printf("\nParser 2\n");
 | 
	
		
			
				|  |  | -    for(int i = 0; i < parser2->elt; i++){
 | 
	
		
			
				|  |  | -        key = key_index(parser2, i);
 | 
	
		
			
				|  |  | -        val = get_index(parser2, i);
 | 
	
		
			
				|  |  | -        printf("%s : %s\n", key, val);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    //Clean
 | 
	
		
			
				|  |  | -    clean_json_encoder(&json);
 | 
	
		
			
				|  |  | -    clean_json_encoder(&json2);
 | 
	
		
			
				|  |  | -    clean_json_parser(&parser);
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -int serv(){
 | 
	
		
			
				|  |  | -    char str[BUFFER_SIZE];
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    Server s = server_create_tcp();
 | 
	
		
			
				|  |  | -    s->server_bind(s, 8080);
 | 
	
		
			
				|  |  | -    s->server_accept(s);
 | 
	
		
			
				|  |  | -    s->server_receive(s, str, BUFFER_SIZE);
 | 
	
		
			
				|  |  | -    printf("%s\n", str);
 | 
	
		
			
				|  |  | -    server_close_client(s);
 | 
	
		
			
				|  |  | -    server_close(s);
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    s = server_create_udp();
 | 
	
		
			
				|  |  | -    s->server_bind(s, 8080);
 | 
	
		
			
				|  |  | -    s->server_receive(s, str, BUFFER_SIZE);
 | 
	
		
			
				|  |  | -    printf("%s\n", str);
 | 
	
		
			
				|  |  | -    server_close(s);
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -int serv_udp(){
 | 
	
		
			
				|  |  | -    char str[BUFFER_SIZE];
 | 
	
		
			
				|  |  | -    Server s = server_create_udp();
 | 
	
		
			
				|  |  | -    s->server_bind(s, 18624);
 | 
	
		
			
				|  |  | -    s->server_receive(s, str, BUFFER_SIZE);
 | 
	
		
			
				|  |  | -    s->server_send(s, "i'm a bomberstudent server");
 | 
	
		
			
				|  |  | -    printf("%s\n", str);
 | 
	
		
			
				|  |  | -    server_close(s);
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +/* --- Global --- */
 | 
	
		
			
				|  |  | +boolean stop = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -int serv_tcp(){
 | 
	
		
			
				|  |  | -    char str[BUFFER_SIZE]; 
 | 
	
		
			
				|  |  | -    Server s = server_create_tcp();
 | 
	
		
			
				|  |  | -    s->server_bind(s, 18642);
 | 
	
		
			
				|  |  | -    s->server_accept(s);
 | 
	
		
			
				|  |  | -    s->server_receive(s, str, BUFFER_SIZE);
 | 
	
		
			
				|  |  | -    printf("%s\n", str);
 | 
	
		
			
				|  |  | -    s->server_send(s, "Hello");
 | 
	
		
			
				|  |  | -    server_close_client(s);
 | 
	
		
			
				|  |  | -    server_close(s);
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +/* --- Fonctions privées --- */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -int handler(int cliId, JsonParser* jp){
 | 
	
		
			
				|  |  | -    printf("Handler : %d - %s\n", cliId, get_value(jp, "key"));
 | 
	
		
			
				|  |  | -    JsonEncoder je;
 | 
	
		
			
				|  |  | -    ini_encoder(&je);
 | 
	
		
			
				|  |  | -    add_integer(&je, "code", 200);
 | 
	
		
			
				|  |  | -    add_string(&je, "etat", "ok");
 | 
	
		
			
				|  |  | -    send_client(cliId, &je);
 | 
	
		
			
				|  |  | -    return 1;
 | 
	
		
			
				|  |  | +void handler(int sig){
 | 
	
		
			
				|  |  | +    //Si SIGINT
 | 
	
		
			
				|  |  | +    if(sig == SIGINT){
 | 
	
		
			
				|  |  | +        stop = true;
 | 
	
		
			
				|  |  | +        //Remet le handler
 | 
	
		
			
				|  |  | +        signal(SIGINT, handler);
 | 
	
		
			
				|  |  | +        //Avertit les clients
 | 
	
		
			
				|  |  | +        notify_close(END_USER);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void notify(){
 | 
	
		
			
				|  |  | -    Client* cli = get_client(0);
 | 
	
		
			
				|  |  | +/* --- Fonctions publiques --- */
 | 
	
		
			
				|  |  | +void notify_close(int code){
 | 
	
		
			
				|  |  | +    //Encode la reponse
 | 
	
		
			
				|  |  |      JsonEncoder je;
 | 
	
		
			
				|  |  |      ini_encoder(&je);
 | 
	
		
			
				|  |  | -    add_string(&je, "etat", "ok");
 | 
	
		
			
				|  |  | -    add_integer(&je, "value", 42);
 | 
	
		
			
				|  |  | -    notify_client(cli, "POST", "test", &je);
 | 
	
		
			
				|  |  | +    add_integer(&je, "status", code);
 | 
	
		
			
				|  |  | +    //Avertit tous les clients
 | 
	
		
			
				|  |  | +    notify_all("POST", "server/end", &je);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int main(){
 | 
	
		
			
				|  |  | -    //return parse();
 | 
	
		
			
				|  |  | -    //return encode();
 | 
	
		
			
				|  |  | -    //return serv();
 | 
	
		
			
				|  |  | -    //return serv_udp();
 | 
	
		
			
				|  |  | -    //return serv_tcp();
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    //*
 | 
	
		
			
				|  |  | +    //Lancement gestion d'erreur
 | 
	
		
			
				|  |  |      error_finit("bomberstudent_server.log");
 | 
	
		
			
				|  |  | +    //Inialise le serveur
 | 
	
		
			
				|  |  |      ini_server();
 | 
	
		
			
				|  |  | -    add_handler("POST", "aze/rty", handler);
 | 
	
		
			
				|  |  | +    //Gestion des signaux
 | 
	
		
			
				|  |  | +    signal(SIGINT, handler);
 | 
	
		
			
				|  |  | +    //Ajout des handlers
 | 
	
		
			
				|  |  | +    /*add_handler("POST", "aze/rty", handler);*/
 | 
	
		
			
				|  |  | +    //Lance le serveur UDP
 | 
	
		
			
				|  |  |      if(!launch_udp_server(PORT_UDP)){
 | 
	
		
			
				|  |  |          error.print("Impossible de démarrer le serveur");
 | 
	
		
			
				|  |  |          error.exit_err();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    //Lance les seerveurs TCP
 | 
	
		
			
				|  |  |      if(!launch_tcp_server(PORT_TCP)){
 | 
	
		
			
				|  |  |          error.print("Impossible de démarrer le serveur");
 | 
	
		
			
				|  |  |          error.exit_err();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    sleep(10);
 | 
	
		
			
				|  |  | -    notify();
 | 
	
		
			
				|  |  | -    sleep(15);
 | 
	
		
			
				|  |  | -    error.exit();
 | 
	
		
			
				|  |  | -    //*/
 | 
	
		
			
				|  |  | +    //Attend la fin du programme
 | 
	
		
			
				|  |  | +    while(!stop){
 | 
	
		
			
				|  |  | +        pause();
 | 
	
		
			
				|  |  | +    } 
 | 
	
		
			
				|  |  | +    error.end();
 | 
	
		
			
				|  |  | +    return EXIT_SUCCESS;
 | 
	
		
			
				|  |  |  }
 |