void TMap::deleteArea( int id ) { if( areas.contains( id ) ) { TArea * pA = areas[id]; QList<int> rl; for( int i=0; i< pA->rooms.size(); i++ ) { rl.push_back( pA->rooms[i] ); } for( int i=0; i<rl.size(); i++ ) { deleteRoom( rl[i] ); } areas.remove( id ); areaNamesMap.remove( id ); mMapGraphNeedsUpdate = true; } }
/** * Ejecuta en el servidor la cadena recibida */ int execParams(user* conn, int connTam, char* str, int socketID, int sock, sqlite3* db, room* rooms, int dim){ PDEBUG("INFO: Analizando lista de parámetros\n"); char saux[10][DIM]; bzero(saux, 10 * DIM); int error = 0; // tienes permisos para ejecutar comandos en el servidor??? PDEBUG("INFO: Comprobando permisos\n"); int aux = searchConn(conn, connTam, socketID); // almacenamos en la base de datos sms auxMsj; strcpy(auxMsj.name, (*(conn + aux)).name); strcpy(auxMsj.text, str); db_addLog(auxMsj, &db); if((*(conn + aux)).rol != ADMIN){ PDEBUG("INFO: Usuario sin permisos\n"); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); strcpy(auxMsj.text, "Usuario sin permisos"); SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); PDEBUG("INFO: Mensaje de usuario no válido enviado al emisor\n"); return -1; } PDEBUG("INFO: Usuario autorizado\n"); str = trim(str); // eliminamos os espacios en blanco if(strcmp(str, "-x") == 0){ // comando de salida PDEBUG("EXIT: Cerrando el servidor\n"); shutdown(sock, SHUT_RDWR); // cerramos el socket sms auxMsj; auxMsj.flag = SERV_EXIT; strcpy(auxMsj.name, SERVER); broadcast(conn, &connTam, auxMsj, socketID, db); closeAll(conn, &connTam); // cerramos todas las conexiones PDEBUG("EXIT: Cerrando la conexión con la base de datos\n"); db_close(&db); PDEBUG("EXIT: Liberando espacio\n"); free(conn); PDEBUG("EXIT: Cerrando el proceso\n"); exit(0); }else if(sscanf(str, "--add-user %s %s %s", saux[0], saux[1], saux[2]) == 3){ // añadiendo un usuario //saux[0] es el nombre //saux[1] es el password //saux[2] es el rol PDEBUG("INFO: Añadiendo usuario 3 param\n"); int rol = 0; if(strcmp(saux[2], "admin") == 0){ rol = ADMIN; }else if(strcmp(saux[2], "user") == 0){ rol = USER; }else{ PDEBUG("INFO: tercer argumento no válido"); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); strcpy(auxMsj.text, "Rol no reconocido."); SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); return 0; } error = db_addUser(saux[0], saux[1], rol, &db); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); if(error == 0){ strcpy(auxMsj.text, "Usuario creado"); }else if(error == 1){ strcpy(auxMsj.text, "Nombre de usuario en uso"); }else{ strcpy(auxMsj.text, "Error al crear el usuario"); } SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); }else if(sscanf(str, "--add-user %s %s", saux[0], saux[1]) == 2){ // añadiendo un usuario // se usará el rol por defecto //saux[0] es el nombre //saux[1] es el password PDEBUG("INFO: Añadiendo usuario 2 param\n"); error = db_addUser(saux[0], saux[1], USER, &db); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); if(error == 0){ strcpy(auxMsj.text, "Usuario creado"); }else if(error == 1){ strcpy(auxMsj.text, "Nombre de usuario en uso"); }else{ strcpy(auxMsj.text, "Error al crear el usuario"); } SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); }else if(sscanf(str, "--delete-user %s", saux[0]) == 1){ // borrando un usuario //saux[0] es el nombre PDEBUG("INFO: Borrando usuario\n"); int num = 0; num = db_deleteUser(saux[0], &db); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); if(num > 0){ PDEBUG("INFO: Usuario borrado\n"); strcpy(auxMsj.text, "Usuario borrado"); }else{ PDEBUG("INFO: Usuario no encontrado\n"); strcpy(auxMsj.text, "Usuario no encontrado"); } SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); }else if(strcmp(str, "--list-user") == 0){ // listando usuarios //saux[0] es el nombre PDEBUG("INFO: listando usuarios\n"); int num = 0; num = db_listUser(socketID, &db); }else if(sscanf(str, "--log %s %s", saux[0], saux[1]) == 2){ // listando usuarios //saux[0] es la fecha de inicio //saux[1] es la fecha de finalización PDEBUG("INFO: listando usuarios\n"); int num = 0; struct tm tm1, tm2; long t1, t2; if (strptime(saux[0], "%d/%m/%Y", &tm1) == 0 || strptime(saux[1], "%d/%m/%Y", &tm2) == 0){ PDEBUG("INFO: Formato de fecha no válido\n"); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); strcpy(auxMsj.text, "Formato de fecha no válido -> dd/mm/YYYY"); SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); return -1; } t1 = (long)mktime(&tm1); t2 = (long)mktime(&tm2); sprintf(saux[0], " WHERE time > %ld AND time < %ld", t1, t2); num = db_getLogPar(socketID, &db, saux[0]); }else if(strcmp(str, "--log") == 0){ // listando usuarios PDEBUG("INFO: listando usuarios\n"); int num = 0; num = db_getLog(socketID, &db); }else if(sscanf(str, "--add-room %s", saux[0]) == 1){ // creacion de un cana // saux[0] es el nombre del canal PDEBUG("INFO: añadiendo canales\n"); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); if(addRoom(saux[0], rooms, dim) == -1){ strcpy(auxMsj.text, "Error al crear el canal, mire el log para más información"); }else{ strcpy(auxMsj.text, "Canal creado"); } SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); }else if(sscanf(str, "--delete-room %s", saux[0]) == 1){ // creacion de un cana // saux[0] es el nombre del canal PDEBUG("INFO: borrando canal\n"); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); PDEBUG("INFO: Moviendo usuarios\n"); strcpy(saux[1], "general"); moveAllTo(conn, &connTam, saux[0], rooms, dim, db, saux[1]); if(deleteRoom(saux[0], rooms, dim) == -1){ strcpy(auxMsj.text, "Error al borrar el canal, mire el log para más información"); }else{ strcpy(auxMsj.text, "Canal borrado"); } SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); }else if(sscanf(str, "--kick %s", saux[0]) == 1){ // expulsión de un usuario // saux[0] es el nombre del usuario PDEBUG("INFO: expulsión de un usuario\n"); //PDEBUG("INFO: Moviendo usuarios\n"); //strcpy(saux[1], "general"); sms auxMsj; auxMsj.flag = SERV_EXIT; strcpy(auxMsj.name, SERVER); strcpy(auxMsj.text, "Usuario expulsado."); int aux = searchName(conn, connTam, saux[0]); SSL_write((*(conn+aux)).ssl, &auxMsj, sizeof(sms)); //moveAllTo(conn, &connTam, saux[0], rooms, dim, db, saux[1]); if(deleteRoom(saux[0], rooms, dim) == -1){ strcpy(auxMsj.text, "Error al borrar el canal, mire el log para más información"); }else{ strcpy(auxMsj.text, "Canal borrado"); } SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); }else if(sscanf(str, "--list-room") == 0){ // listando de canales sendRoomList((*(conn + aux)).ssl, rooms, dim); }else{ // error, comando no válido PDEBUG("INFO: Comando no válido\n"); sms auxMsj; auxMsj.flag = MSJ; strcpy(auxMsj.name, SERVER); strcpy(auxMsj.text, "Comando no válido"); SSL_write((*(conn + aux)).ssl, &auxMsj, sizeof(sms)); PDEBUG("INFO: Mensaje de comando no válido enviado al emisor\n"); return -1; } return 0; }
void Grid::buildRooms() { std::random_device rd; std::mt19937_64 gen(rd()); std::uniform_int_distribution<int> sizeDistrib(m_roomMin,m_roomMax); std::uniform_int_distribution<int> widthDistrib(2,m_width-2); std::uniform_int_distribution<int> heightDistrib(2,m_height-2); for(int i=0;i<m_roomAttempts;i++) { printGrid(); int discard=false; while(!discard) { int origY=heightDistrib(gen); int origX=widthDistrib(gen); int sizeX=sizeDistrib(gen); int sizeY=sizeDistrib(gen); std::cout<<"Y="<<sizeY<<"\n"; if((m_grid[origY-1][origX]->getWall()==false)||(m_grid[origY][origX-1]->getWall()==false)||(m_grid[origY-1][origX-1]->getWall()==false)) { discard=true; break; } for(int y=origY;(y<=(origY+sizeY));y++) { if(y>=m_height-1){break;} for(int x=origX;(x<=(origX+sizeX));x++) { if(x>=m_width-1){break;} if((m_grid[y+1][x]->getWall()==false)\ ||(m_grid[y][x+1]->getWall()==false)\ ||(m_grid[y+1][x+1]->getWall()==false)\ ||(m_grid[origY-1][x]->getWall()==false)\ ||(m_grid[y][origX-1]->getWall()==false)) { deleteRoom(origY,y,origX,x); discard=true; break; } else { m_grid[y][x]->setWall(false); } } } discard=true; } } }
int main() { struct Ordered_container* people; struct Ordered_container* rooms; people = OC_create_container((OC_comp_fp_t)comparePeople); rooms = OC_create_container((OC_comp_fp_t)compareRooms); while (1) { char cmd1; char cmd2; printf("\nEnter command: "); scanf(" %c", &cmd1); scanf("%c", &cmd2); switch (cmd1) { case 'p': switch (cmd2) { case 'i': printIndividual(people); break; case 'r': printRoom(rooms); break; case 'm': printMeeting(rooms); break; case 's': printSchedule(rooms); break; case 'g': printGroup(people); break; default: printErrUnrecCmd(); break; } break; case 'a': switch (cmd2) { case 'i': addIndividual(people); break; case 'r': addRoom(rooms); break; case 'm': addMeeting(rooms); break; case 'p': addParticipant(rooms, people); break; default: printErrUnrecCmd(); break; } break; case 'r': switch (cmd2) { case 'm': rescheduleMeeting(rooms); break; default: printErrUnrecCmd(); break; } break; case 'd': switch (cmd2) { case 'i': deleteIndividual(people, rooms); break; case 'r': deleteRoom(rooms); break; case 'm': deleteMeeting(rooms); break; case 'p': deleteParticipant(rooms, people); break; case 's': deleteSchedule(rooms); break; case 'g': deleteGroup(rooms, people); break; case 'a': deleteAll(rooms, people); break; default: printErrUnrecCmd(); break; } break; case 's': break; case 'l': break; case 'q': switch (cmd2) { case 'q' : printf("All meetings deleted\n"); printf("All rooms deleted\n"); printf("All persons deleted\n"); printf("Done\n"); return 0; break; default: printErrUnrecCmd(); break; } break; default: printErrUnrecCmd(); break; } } return 0; }