/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.deskshare.server.servlet;
import java.util.*;
import java.awt.Point;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.bigbluebutton.deskshare.common.Dimension;
import org.bigbluebutton.deskshare.server.session.ISessionManagerGateway;
import org.springframework.context.ApplicationContext;
import org.springframework.http.HttpStatus;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class HttpTunnelStreamController extends MultiActionController {
private boolean hasSessionManager = false;
private ISessionManagerGateway sessionManager;
public ModelAndView screenCaptureHandler(HttpServletRequest request, HttpServletResponse response) throws Exception {
String event = request.getParameterValues("event")[0];
int captureRequest = Integer.parseInt(event);
if (0 == captureRequest) {
handleCaptureStartRequest(request, response);
} else if (1 == captureRequest) {
handleCaptureUpdateRequest(request, response);
if (isSharingStopped(request, response)) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
} else if (2 == captureRequest) {
handleCaptureEndRequest(request, response);
} else if (3 == captureRequest) {
handleUpdateMouseLocationRequest(request, response);
} else {
System.out.println("****Cannot handle screen capture event " + captureRequest);
}
return null;
}
private void handleUpdateMouseLocationRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String room = request.getParameterValues("room")[0];
String mouseX = request.getParameterValues("mousex")[0];
String mouseY = request.getParameterValues("mousey")[0];
String seqNum = request.getParameterValues("sequenceNumber")[0];
Point loc = new Point(Integer.parseInt(mouseX), Integer.parseInt(mouseY));
if (! hasSessionManager) {
sessionManager = getSessionManager();
hasSessionManager = true;
}
sessionManager.updateMouseLocation(room, loc, Integer.parseInt(seqNum));
}
private Boolean isSharingStopped(HttpServletRequest request, HttpServletResponse response) throws Exception {
String room = request.getParameterValues("room")[0];
return sessionManager.isSharingStopped(room);
}
private void handleCaptureStartRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String room = request.getParameterValues("room")[0];
String seqNum = request.getParameterValues("sequenceNumber")[0];
String screenInfo = request.getParameterValues("screenInfo")[0];
String blockInfo = request.getParameterValues("blockInfo")[0];
String svc2Info = request.getParameterValues("svc2")[0];
String[] screen = screenInfo.split("x");
String[] block = blockInfo.split("x");
Dimension screenDim, blockDim;
screenDim = new Dimension(Integer.parseInt(screen[0]), Integer.parseInt(screen[1]));
blockDim = new Dimension(Integer.parseInt(block[0]), Integer.parseInt(block[1]));
boolean useSVC2 = Boolean.parseBoolean(svc2Info);
if (! hasSessionManager) {
sessionManager = getSessionManager();
hasSessionManager = true;
}
sessionManager.createSession(room, screenDim, blockDim, Integer.parseInt(seqNum), useSVC2);
}
private void handleCaptureUpdateRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
String room = request.getParameterValues("room")[0];
String keyframe = "false"; // This data is never a keyframe
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Get the list of multipart files that are in this POST request.
// Get the block info from each embedded file and send it to the
// session manager to update the viewers.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Iterator uploadedFilenames = multipartRequest.getFileNames();
while(uploadedFilenames.hasNext())
{ // process each embedded upload-file (block)
String uploadedFilename = (String)uploadedFilenames.next();
MultipartFile multipartFile = multipartRequest.getFile(uploadedFilename);
// Parse the block info out of the upload file name
// The file name is of format "blockgroup_<seqnum>_<position>".
String[] uploadedFileInfo = uploadedFilename.split("[_]");
String seqNum = uploadedFileInfo[1];
String position = uploadedFileInfo[2];
// Update the viewers with the uploaded block data.
sessionManager.updateBlock(room,
Integer.valueOf(position),
multipartFile.getBytes(),
false, // This data is never a keyframe
Integer.parseInt(seqNum));
} // process each embedded upload-file (block)
/*
// MultipartFile is a copy of file in memory, not in file system
MultipartFile multipartFile = multipartRequest.getFile("blockdata");
long startRx = System.currentTimeMillis();
byte[] blockData = multipartFile.getBytes();
String room = request.getParameterValues("room")[0];
String seqNum = request.getParameterValues("sequenceNumber")[0];
String keyframe = request.getParameterValues("keyframe")[0];
String position = request.getParameterValues("position")[0];
if (! hasSessionManager) {
sessionManager = getSessionManager();
hasSessionManager = true;
}
sessionManager.updateBlock(room, Integer.valueOf(position), blockData, Boolean.parseBoolean(keyframe), Integer.parseInt(seqNum));
*/
}
private void handleCaptureEndRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String room = request.getParameterValues("room")[0];
String seqNum = request.getParameterValues("sequenceNumber")[0];
if (! hasSessionManager) {
sessionManager = getSessionManager();
hasSessionManager = true;
}
System.out.println("HttpTunnel: Received Capture Enfd Event.");
sessionManager.removeSession(room, Integer.parseInt(seqNum));
}
private ISessionManagerGateway getSessionManager() {
//Get the servlet context
ServletContext ctx = getServletContext();
//Grab a reference to the application context
ApplicationContext appCtx = (ApplicationContext) ctx.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
//Get the bean holding the parameter
ISessionManagerGateway manager = (ISessionManagerGateway) appCtx.getBean("sessionManagerGateway");
if (manager != null) {
System.out.println("****Got the SessionManager context: *****");
}
return manager;
}
}