package com.kurento.kmf.phone;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.google.gson.JsonObject;
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;
import com.kurento.kmf.media.factory.MediaPipelineFactory;
public class PhoneHandler extends DefaultJsonRpcHandler<JsonObject> {
private final Logger log = LoggerFactory.getLogger(PhoneHandler.class);
@Autowired
private MediaPipelineFactory mpf;
@Autowired
private Registry registry;
private Session session;
private String name;
private Call call;
private Session getSession() {
return session;
}
@Override
public void handleRequest(Transaction transaction,
Request<JsonObject> request) throws Exception {
JsonObject params = request.getParams();
switch (request.getMethod()) {
case "register":
register(transaction, params);
break;
case "call":
call(transaction, params);
break;
default:
break;
}
}
@Override
public void afterConnectionEstablished(Session session) throws Exception {
this.session = session;
}
private void call(Transaction transaction, JsonObject params)
throws IOException {
String to = params.get("callTo").getAsString();
Session toSession = registry.get(to).getSession();
JsonObject icParams = new JsonObject();
params.addProperty("from", name);
JsonObject icResponse = (JsonObject) toSession.sendRequest(
"incommingCall", icParams);
String callResponse = icResponse.get("callResponse").getAsString();
if ("Accept".equals(callResponse)) {
log.info("Accepted call from '{}' to '{}'", name, to);
call = new Call(mpf);
call.setOutgoingPeer(name, session);
call.setIncommingPeer(to, toSession);
String ipSdpOffer = icResponse.get("sdpOffer").getAsString();
log.info("SdpOffer: {}", ipSdpOffer);
String ipSdpAnswer = call.getWebRtcForIncommingPeer().processOffer(
ipSdpOffer);
JsonObject scParams = new JsonObject();
scParams.addProperty("sdpAnswer", ipSdpAnswer);
log.info("SdpAnswer: {}", ipSdpAnswer);
// TODO Should we expect something from client?
toSession.sendRequest("startCommunication", scParams);
String opSdpOffer = params.getAsJsonPrimitive("sdpOffer")
.getAsString();
String opSdpAnswer = call.getWebRtcForOutgoingPeer().processOffer(
opSdpOffer);
JsonObject response = new JsonObject();
response.addProperty("callResponse", "Accepted");
response.addProperty("sdpAnswer", opSdpAnswer);
transaction.sendResponse(response);
} else {
JsonObject response = new JsonObject();
response.addProperty("callResponse", "rejected");
transaction.sendResponse(response);
}
}
private void register(Transaction transaction, JsonObject params)
throws IOException {
this.name = params.getAsJsonPrimitive("name").getAsString();
registry.register(name, this);
transaction.sendResponse("registered");
}
}