package org.bigbluebutton.app.screenshare.red5;
import java.util.HashMap;
import java.util.Map;
import org.bigbluebutton.app.screenshare.events.*;
import com.google.gson.Gson;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
public class EventListenerImp implements IEventListener {
private static Logger log = Red5LoggerFactory.getLogger(EventListenerImp.class, "screenshare");
private ConnectionInvokerService sender;
@Override
public void handleMessage(IEvent event) {
if (event instanceof ScreenShareStartedEvent) {
sendShareStartedEvent((ScreenShareStartedEvent) event);
} else if (event instanceof ScreenShareStoppedEvent) {
sendShareStoppedEvent((ScreenShareStoppedEvent) event);
} else if (event instanceof ScreenSharePausedEvent) {
sendSharePausedEvent((ScreenSharePausedEvent) event);
} else if (event instanceof ScreenShareRequestTokenSuccessResponse) {
sendStartShareRequestResponse((ScreenShareRequestTokenSuccessResponse) event);
} else if (event instanceof ScreenShareRequestTokenFailedResponse) {
sendStartShareRequestFailedResponse((ScreenShareRequestTokenFailedResponse) event);
} else if (event instanceof IsScreenSharingResponse) {
sendIsScreenSharingResponse((IsScreenSharingResponse) event);
} else if (event instanceof ScreenShareClientPing) {
sendScreenShareClientPing((ScreenShareClientPing) event);
}
}
private void sendScreenShareClientPing(ScreenShareClientPing event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("meetingId", event.meetingId);
data.put("session", event.session);
data.put("timestamp", event.timestamp);
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
if (log.isDebugEnabled()) {
log.debug("Sending ScreenShareClientPing to client, meetingId=" + event.meetingId + " userid=" + event.userId);
}
DirectClientMessage msg = new DirectClientMessage(event.meetingId, event.userId, "screenShareClientPingMessage", message);
sender.sendMessage(msg);
}
private void sendIsScreenSharingResponse(IsScreenSharingResponse event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("sharing", event.info.sharing);
if (event.info.sharing) {
data.put("streamId", event.info.streamId);
data.put("width", event.info.width);
data.put("height", event.info.height);
data.put("url", event.info.url);
data.put("session", event.info.session);
}
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
if (log.isDebugEnabled()) {
log.debug("Sending isSharingScreenRequestResponse to client, meetingId=" + event.meetingId + " userid=" + event.userId);
}
DirectClientMessage msg = new DirectClientMessage(event.meetingId, event.userId, "isSharingScreenRequestResponse", message);
sender.sendMessage(msg);
}
private void sendStartShareRequestFailedResponse(ScreenShareRequestTokenFailedResponse event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("reason", event.reason);
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
DirectClientMessage msg = new DirectClientMessage(event.meetingId, event.userId, "startShareRequestRejectedResponse", message);
sender.sendMessage(msg);
Map<String, Object> logData = new HashMap<String, Object>();
logData.put("meetingId", event.meetingId);
logData.put("userId", event.userId);
logData.put("reason", event.reason);
Gson gson2 = new Gson();
String logStr = gson2.toJson(logData);
log.info("Send to client start screen share request rejected response: data={}", logStr);
}
private void sendStartShareRequestResponse(ScreenShareRequestTokenSuccessResponse event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("authToken", event.token);
data.put("jnlp", event.jnlp);
data.put("streamId", event.streamId);
data.put("session", event.session);
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
DirectClientMessage msg = new DirectClientMessage(event.meetingId, event.userId, "startShareRequestResponse", message);
sender.sendMessage(msg);
Map<String, Object> logData = new HashMap<String, Object>();
logData.put("meetingId", event.meetingId);
logData.put("userId", event.userId);
logData.put("session", event.session);
logData.put("authToken", event.token);
logData.put("jnlp", event.jnlp);
Gson gson2 = new Gson();
String logStr = gson2.toJson(logData);
log.info("Send to client start screen share request response: data={}", logStr);
}
private void sendSharePausedEvent(ScreenSharePausedEvent event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("meetingId", event.meetingId);
data.put("session", event.session);
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
BroadcastClientMessage msg = new BroadcastClientMessage(event.meetingId, "screenSharePausedMessage", message);
sender.sendMessage(msg);
Map<String, Object> logData = new HashMap<String, Object>();
logData.put("meetingId", event.meetingId);
logData.put("session", event.session);
gson = new Gson();
String logStr = gson.toJson(logData);
log.info("Send to client screen share paused message: data={}", logStr);
}
private void sendShareStartedEvent(ScreenShareStartedEvent event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("meetingId", event.meetingId);
data.put("streamId", event.streamId);
data.put("width", event.width);
data.put("height", event.height);
data.put("url", event.url);
data.put("session", event.session);
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
BroadcastClientMessage msg = new BroadcastClientMessage(event.meetingId, "screenShareStartedMessage", message);
sender.sendMessage(msg);
Map<String, Object> logData = new HashMap<String, Object>();
logData.put("meetingId", event.meetingId);
logData.put("streamId", event.streamId);
logData.put("width", event.width);
logData.put("height", event.height);
logData.put("url", event.url);
logData.put("session", event.session);
gson = new Gson();
String logStr = gson.toJson(logData);
log.info("Send to client screen share started message: data={}", logStr);
}
private void sendShareStoppedEvent(ScreenShareStoppedEvent event) {
Map<String, Object> data = new HashMap<String, Object>();
data.put("meetingId", event.meetingId);
data.put("session", event.session);
data.put("reason", event.reason);
Map<String, Object> message = new HashMap<String, Object>();
Gson gson = new Gson();
message.put("msg", gson.toJson(data));
BroadcastClientMessage msg = new BroadcastClientMessage(event.meetingId, "screenShareStoppedMessage", message);
sender.sendMessage(msg);
Map<String, Object> logData = new HashMap<String, Object>();
logData.put("meetingId", event.meetingId);
logData.put("session", event.session);
logData.put("reason", event.reason);
gson = new Gson();
String logStr = gson.toJson(logData);
log.info("Send to client screen share stopped message: data={}", logStr);
}
public void setMessageSender(ConnectionInvokerService sender) {
this.sender = sender;
}
}