package com.kurento.kmf.demo.group; import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.kurento.kmf.jsonrpcconnector.DefaultJsonRpcHandler; import com.kurento.kmf.jsonrpcconnector.Session; import com.kurento.kmf.jsonrpcconnector.Transaction; import com.kurento.kmf.jsonrpcconnector.internal.message.Request; public class ParticipantHandler extends DefaultJsonRpcHandler<JsonObject> { private static final Logger log = LoggerFactory .getLogger(ParticipantHandler.class); @Autowired private RoomManager roomManager; private Session session; private String name; private String roomName; private Participant myself; @Override public void handleRequest(Transaction transaction, Request<JsonObject> request) throws Exception { JsonObject params = request.getParams(); switch (request.getMethod()) { case "joinRoom": joinRoom(transaction, params); sendParticipantNames(transaction); break; case "receiveVideoFrom": receiveVideo(transaction, params); break; case "leaveRoom": leaveRoom(); break; default: break; } } @Override public void afterConnectionClosed(Session session, String status) throws Exception { leaveRoom(); } private void leaveRoom() throws IOException { log.debug("PARTICIPANT {}: Leaving room {}", this.name, this.roomName); roomManager.getRoom(roomName).removeParticipant(name); myself.close(); myself = null; } /** * @param transaction * @param params * @throws IOException */ private void receiveVideo(Transaction transaction, JsonObject params) throws IOException { String senderName = params.get("sender").getAsString(); @SuppressWarnings("resource") Participant sender = roomManager.getRoom(this.roomName).getParticipant( senderName); log.info("PARTICIPANT {}: connecting with {} in room {}", this.name, senderName, this.roomName); String ipSdpOffer = params.get("sdpOffer").getAsString(); log.trace("PARTICIPANT {}: SdpOffer is {}", this.name, ipSdpOffer); String ipSdpAnswer = myself.receiveVideoFrom(sender).processOffer( ipSdpOffer); JsonObject scParams = new JsonObject(); scParams.addProperty("sdpAnswer", ipSdpAnswer); log.trace("PARTICIPANT {}: SdpAnswer is {}", this.name, ipSdpAnswer); transaction.sendResponse(scParams); } @Override public void afterConnectionEstablished(Session participantSession) throws Exception { this.session = participantSession; } private void joinRoom(Transaction transaction, JsonObject params) throws IOException { this.roomName = params.get("room").getAsString(); this.name = params.get("name").getAsString(); Room room; log.info("PARTICIPANT {}: trying to join room {}", this.name, this.roomName); try { room = roomManager.getRoom(this.roomName); this.myself = room.join(this.name, session); } catch (IllegalArgumentException e) { // TODO don't send only the exception, add more info transaction.sendError(e); } } private void sendParticipantNames(Transaction transaction) throws IOException { Room room = this.roomManager.getRoom(roomName); JsonArray existingParticipantsAnnouncement = new JsonArray(); for (Participant participant : room.getParticipants()) { if (!participant.getName().equals(this.name)) { JsonElement participantName = new JsonPrimitive( participant.getName()); existingParticipantsAnnouncement.add(participantName); } } log.debug("PARTICIPANT {}: sending a list of {} participants", this.name, existingParticipantsAnnouncement.size()); transaction.sendResponse(existingParticipantsAnnouncement); } }