/** * Called to disconnect a user (eventually remove the reserved {@link Room}) when one of the * conference legs are cut, i.e. a WebSocket connection is closed */ public static void disconnect(String token) { if (token != null) { String[] values = token.split("/"); String room_key = values[0]; String user = values[1]; logger.info("Removing user " + user + " from room " + room_key); Room room = Room.get_by_key_name(room_key); if (room != null && room.has_user(user)) { String other_user = room.get_other_user(user); room.remove_user(user); logger.info("Room " + room_key + " has state " + room.toString()); if (other_user != null) { SignalingWebSocket.send(Helper.make_token(room, other_user), "{'type':'bye'}"); logger.info("Sent BYE to " + other_user); } else { room.delete(); } } else logger.warning("Unknown room " + room_key); } }
/** * Renders the main page. When this page is shown, we create a new channel to push asynchronous * updates to the client. */ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // String PATH = req.getContextPath().replace("/", ""); String query = req.getQueryString(); System.out.println("Consulta " + query); if (query == null) { String redirect = "/" + PATH + "/?r=" + Helper.generate_random(16); logger.info( "Sin consulta (query Room) -> Redirigiendo al visitante de la base URL a " + redirect); resp.sendRedirect(redirect); return; } Map<String, String> params = Helper.get_query_map(query); String room_key = Helper.sanitize(params.get("r")); // String debug = params.get("debug"); if (room_key == null || room_key.equals("")) { room_key = Helper.generate_random(16); String redirect = "/" + PATH + "/?r=" + room_key; logger.info("Sin habitacion (room key) -> Redirigiendo al usuario de base URL a " + redirect); resp.sendRedirect(redirect); return; } else { String user = null; int initiator = 0; Room room = Room.get_by_key_name(room_key); if (room == null) { user = Helper.generate_random(16); room = new Room(room_key); room.add_user(user); initiator = 0; logger.info("Nueva habitacion " + room_key); } else if (room != null && room.get_occupancy() == 1) { user = Helper.generate_random(16); room.add_user(user); initiator = 1; logger.info("Habitacion " + room_key + " con 1 usuario, anadiendo a otro usuario: " + user); } else { Map<String, String> template_values = new HashMap<String, String>(); template_values.put("room_key", room_key); resp.setContentType("text/html"); String filepath = getServletContext().getRealPath("webrtc/full.jtpl"); File file = new File(filepath); resp.getWriter().print(Helper.generatePage(file, template_values)); logger.info("Habitacion " + room_key + " con 2 usuarios (completo)."); return; } String server_name = req.getServerName(); int server_port = req.getServerPort(); // int server_port = 8080; String room_link = "http://" + server_name + ":" + server_port + "/" + PATH + "/?r=" + room_key; // String stun_server = ""; String username = "******"; setToken(Helper.make_token(room_key, user)); setRoomKey(room_key); String pc_config = Helper.make_pc_config(""); Map<String, String> template_values = new HashMap<String, String>(); template_values.put("server_name", server_name); template_values.put("server_port", server_port + ""); template_values.put("PATH", PATH); template_values.put("token", token); template_values.put("me", user); template_values.put("username", username); template_values.put("room_key", room_key); template_values.put("room_link", room_link); template_values.put("initiator", "" + initiator); template_values.put("pc_config", pc_config); resp.setContentType("text/html"); File file = new File(getServletContext().getRealPath("webrtc/index.jtpl")); resp.getWriter().println(Helper.generatePage(file, template_values)); logger.info("Usuario " + user + " anadido a la habitacion " + room_key); logger.info("La habitacion " + room_key + " tiene el estado " + room); resp.setStatus(HttpServletResponse.SC_OK); } }