void handle_client_message(connection_info clients[], int sender) { int read_size; SBCP_message msg; if((read_size = recv(clients[sender].socket, &msg, sizeof(msg), 0)) == 0) { printf("User disconnected: %s.\n", clients[sender].username); close(clients[sender].socket); clients[sender].socket = 0; clients[sender].username[0] = 0; //send_disconnect_message(clients, clients[sender].username); } else { // interprete msg header_type h_type = getHeaderType( msg ); switch(h_type) { case JOIN: ; // JOIN // duplicated name char tempname[21]; getUsername(msg, tempname); int i; for(i = 0; i < MAX_CLIENTS; i++) { if(strcmp(clients[i].username, tempname) == 0) { puts("Dected one duplicated usename"); send_duplicated_name(clients[sender].socket); close(clients[sender].socket); clients[sender].socket = 0; return; } } puts("Server detected one JOIN"); strcpy(clients[sender].username, tempname); printf("User connected: %s\n", clients[sender].username); //send_connect_message(clients, sender); break; case SEND: puts("Server detected one SEND"); char msg_content[256]; getMessageContent(msg, msg_content); send_public_message(clients, sender, msg_content); //TODO break; default: fprintf(stderr, "Unknown message type received.\n"); break; } } }
// USER FUNCTIONS // Manages the user interaction void manage_user(int fd, int registration) { User user = None; char buffer[MAXBUF+1]; if (registration == 1) { _info("Serving the registration form."); User new_user = (struct UserType*)malloc(sizeof(struct UserType)); new_user->fd = fd; new_user->notifications = None; new_user->noti_count = 0; new_user->private_messages = None; do { _send(fd, " > Username: "******":q") == 0) { _error("Registration task was interrupted by user.."); return; } } while (find_username(Users, buffer) is_not None); new_user->username = (char*)malloc(sizeof(MAXBUF)); strcpy(new_user->username, buffer); _send(fd, " > Nome: "); _recv(fd, buffer, 1); if (strcmp(buffer, ":q") == 0) { _error("Registration task was interrupted by user.."); return; } new_user->name = (char*)malloc(sizeof(MAXBUF)); strcpy(new_user->name, buffer); _send(fd, " > Cognome: "); _recv(fd, buffer, 1); if (strcmp(buffer, ":q") == 0) { _error("Registration task was interrupted by user.."); return; } new_user->surname = (char*)malloc(sizeof(MAXBUF)); strcpy(new_user->surname, buffer); _send(fd, " > Posizione X (int): "); _recv(fd, buffer, 1); if (strcmp(buffer, ":q") == 0) { _error("Registration task was interrupted by user.."); return; } new_user->x = atoi(buffer) % 256; _send(fd, " > Posizione Y (int): "); _recv(fd, buffer, 1); if (strcmp(buffer, ":q") == 0) { _error("Registration task was interrupted by user.."); return; } new_user->y = atoi(buffer) % 256; _send(fd, " > Raggio d'Azione (int): "); _recv(fd, buffer, 1); if (strcmp(buffer, ":q") == 0) { _error("Registration task was interrupted by user.."); return; } new_user->rad = atoi(buffer) % 256; user = new_user; pthread_mutex_lock(&users_mutex); if (Users is None) { Users = (UserList)malloc(sizeof(struct UserListType)); Users->info = user; Users->next = NULL; } else { UserList N = (UserList)malloc(sizeof(struct UserListType)); N->info = user; N->next = Users; Users = N; } pthread_mutex_unlock(&users_mutex); pthread_mutex_lock(&map_mutex); map_user(user); pthread_mutex_unlock(&map_mutex); _infoUser("New user created.", user->username); } assert(user is_not None); _infoUser("User logged in.", user->username); int choice; do { memset(buffer, 0, MAXBUF); char notif[MAXBUF]; if (user->noti_count > 0) { sprintf(notif, "\n## MESSAGE SYSTEM MENU ## [Notifiche: %d]", user->noti_count); } else { sprintf(notif, "\n## MESSAGE SYSTEM MENU ##"); } strcat(notif, menu); _send(user->fd, notif); _recv(user->fd, buffer, 1); while (atoi(buffer) <= 0 or atoi(buffer) > 8) { _send(user->fd, " > "); _recv(user->fd, buffer, 1); } choice = atoi(buffer); switch (choice) { case 1: { show_users_available(user); } break; case 2: { send_public_message(user); } break; case 3: { send_private_message(user); } break; case 4: { read_public_messages(user); break; } break; case 5: { read_private_messages(user); break; } case 6: { move_user(user); } break; case 7: { read_notifications(user); } break; case 8: { return; } default: break; } } while (choice > 0 && choice < 8); }