verifyne::Ticket *verifyne::Api::request_new_ticket(std::string purpose, verifyne::Ticket::TICKET_TYPE ticket_type) { /* Generate fresh nonce */ std::random_device rd; std::uniform_int_distribution<int> distribution(0,255); std::stringstream ss_nonce; for(int i = 0; i < 16; i++) { ss_nonce << std::hex << distribution(rd); } std::string nonce(ss_nonce.str()); verifyne::ApiResponse *ar = new_ticket(purpose, nonce, ticket_type); verifyne::Ticket *ticket = new verifyne::Ticket(ar); delete ar; return ticket; }
int main(int argc, char *argv[]) { int free_parking_lots = PARKING_LOT_SIZE; char *entrance_log,*exit_log; // Strings para log files char msg_buffer[30]; char time_string[30]; /* Auxiliares */ int status; // Estatus de procedimientos int i; // Iteraciones int last_ticket; // Último ticket struct msg *m; // Auxiliar para lectura de mensajes pthread_t tid; // Thread para socket if (argc != 7) { printf ("Uso: sem_svr -l <puerto_sem_svr> -i <bitácora_entrada> -o <bitácora_salida> \n"); exit(0); } /* Port get for listening */ if (strcmp("-l",argv[1]) == 0 ) listen_port = atoi(argv[2]); else if (strcmp("-l",argv[3]) == 0 ) listen_port = atoi(argv[4]); else if (strcmp("-l",argv[5]) == 0 ) listen_port = atoi(argv[6]); else { perror("Error: No se ha especificado del puerto"); exit(0); } if (strcmp("-i",argv[1]) == 0 ) entrance_log = argv[2]; else if (strcmp("-i",argv[3]) == 0 ) entrance_log = argv[4]; else if (strcmp("-i",argv[5]) == 0 ) entrance_log = argv[6]; else { perror("Error: No se ha especificado la bitacora de entrada"); exit(0); } if (strcmp("-o",argv[1]) == 0 ) exit_log = argv[2]; else if (strcmp("-o",argv[3]) == 0 ) exit_log = argv[4]; else if (strcmp("-o",argv[5]) == 0 ) exit_log = argv[6]; else { perror("Error: No se ha especificado la bitacora de salida"); exit(0); } /* Initialize parking lot */ for (i = 0; i < PARKING_LOT_SIZE; ++i) parking_space[i] = NULL; /* initialize circular buffer for messages*/ init_buffer(&cb,(sizeof(struct msg))); /* Iniciando hilo de socket de lectura */ pthread_create(&tid, NULL, read_messages, NULL); pthread_detach(tid); /* Ciclo indefinido de espera de mensajes, procesamiento y respuesta*/ while (1){ // Entrega de tickets y aceptar tickets de salida while(free_parking_lots > 0 ) { /* Esperar a el socket haya recibido alg'un mensaje */ while (its_empty(cb)) sleep(0.5); /* Consumir mensaje */ m = read_cb(&cb); if (m->in_out=='e') { last_ticket = new_ticket(); --free_parking_lots; strftime(time_string ,30 ,"%d%m%Y%H%M" ,parking_space[last_ticket]); // formato BDDMMYYYYHHMMSSS con SSS como ticket serial sprintf(msg_buffer,"1%s%03d",time_string,last_ticket); write_action(entrance_log,WENT_IN,last_ticket); answerClient(m->client.sin_addr,msg_buffer); } else if (m->in_out=='s' && parking_space[m->car_id] != NULL) { ++free_parking_lots; last_payment = ticket_price(m->car_id); sprintf(msg_buffer,"X%d",last_payment); answerClient(m->client.sin_addr,msg_buffer); write_action(exit_log,WENT_OUT,m->car_id); } else if (m->in_out=='s' && parking_space[m->car_id] == NULL) printf("Ese ticket no est'a en circulaci'on, intente de nuevo\n"); else printf("Accion inesperada\n"); } /* Indicar que no hay puestos libres o aceptar ticket de salida */ while(free_parking_lots == 0) { while (its_empty(cb)) sleep(0.5); m = read_cb(&cb); if (m->in_out=='e') { strftime(time_string ,20 ,"%d%m%Y%H%M" ,parking_space[last_ticket]); sprintf(msg_buffer,"0%sXXX",time_string); answerClient(m->client.sin_addr,msg_buffer); write_action(entrance_log,FULL,last_ticket); } else if (m->in_out=='s' && parking_space[m->car_id] != NULL){ ++free_parking_lots; last_payment = ticket_price(m->car_id); sprintf(msg_buffer,"X%d",last_payment); answerClient(m->client.sin_addr,msg_buffer); write_action(exit_log,WENT_OUT,m->car_id); } else if (m->in_out=='s' && parking_space[m->car_id] == NULL) printf("Ese ticket no est'a en circulaci'on, intente de nuevo\n"); else printf("Accion inesperada\n"); } } }