示例#1
0
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);
}