You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2013/06/07 12:23:48 UTC
svn commit: r1490569 -
/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
Author: solomax
Date: Fri Jun 7 10:23:48 2013
New Revision: 1490569
URL: http://svn.apache.org/r1490569
Log:
[OPENMEETINGS-667] recordings are viewable on both PC and iPad (stacktraces still need to be eliminated)
Modified:
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java?rev=1490569&r1=1490568&r2=1490569&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java Fri Jun 7 10:23:48 2013
@@ -22,7 +22,12 @@ import static org.apache.openmeetings.we
import static org.apache.openmeetings.web.app.WebSession.getUserId;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.io.input.BoundedInputStream;
import org.apache.openmeetings.data.flvrecord.FlvRecordingDao;
import org.apache.openmeetings.data.user.dao.UsersDao;
import org.apache.openmeetings.persistence.beans.domain.Organisation_Users;
@@ -32,8 +37,10 @@ import org.apache.wicket.request.resourc
import org.apache.wicket.request.resource.IResource.Attributes;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.ResourceStreamResource;
+import org.apache.wicket.util.lang.Bytes;
import org.apache.wicket.util.resource.FileResourceStream;
import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
import org.apache.wicket.util.string.StringValue;
public abstract class RecordingResourceReference extends ResourceReference {
@@ -47,14 +54,48 @@ public abstract class RecordingResourceR
public IResource getResource() {
return new ResourceStreamResource() {
private static final long serialVersionUID = -961779297961218109L;
+ private final static String ACCEPT_RANGES_HEADER = "Accept-Ranges";
+ private final static String RANGE_HEADER = "Range";
+ private final static String CONTENT_RANGE_HEADER = "Content-Range";
+ private final static String RANGES_BYTES = "bytes";
private File file;
+ private boolean isRange = false;
+ private int start = 0;
+ private int end = 0;
@Override
protected IResourceStream getResourceStream() {
return file == null ? null : new FileResourceStream(file) {
private static final long serialVersionUID = 2546785247219805747L;
+ private transient BoundedInputStream bi;
@Override
+ public InputStream getInputStream() throws ResourceStreamNotFoundException {
+ if (bi == null) {
+ bi = new BoundedInputStream(super.getInputStream(), isRange ? end + start + 1 : -1);
+ try {
+ bi.skip(start);
+ } catch (IOException e) {
+ throw new ResourceStreamNotFoundException(e);
+ }
+ }
+ return bi;
+ }
+
+ @Override
+ public Bytes length() {
+ return Bytes.bytes(isRange ? end - start + 1 : file.length());
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (bi != null) {
+ bi.close(); //also will close original stream
+ bi = null;
+ }
+ }
+
+ @Override
public String getContentType() {
return RecordingResourceReference.this.getContentType();
}
@@ -66,10 +107,26 @@ public abstract class RecordingResourceR
ResourceResponse rr = new ResourceResponse();
FlvRecording r = getRecording(attributes);
if (r != null) {
+ isRange = false;
file = getFile(r);
rr.setFileName(getFileName(r));
rr.setContentType(RecordingResourceReference.this.getContentType());
+ String range = ((HttpServletRequest)attributes.getRequest().getContainerRequest()).getHeader(RANGE_HEADER);
+ if (range != null && range.startsWith(RANGES_BYTES)) {
+ String[] bounds = range.substring(RANGES_BYTES.length() + 1).split("-"); //TODO open ranges !!
+ if (bounds != null && bounds.length > 1) {
+ isRange = true;
+ start = Integer.parseInt(bounds[0]);
+ end = Integer.parseInt(bounds[1]);
+ }
+ }
+
rr = super.newResourceResponse(attributes);
+ rr.getHeaders().addHeader(ACCEPT_RANGES_HEADER, RANGES_BYTES);
+ if (isRange) {
+ //Content-Range: bytes 229376-232468/232469
+ rr.getHeaders().addHeader(CONTENT_RANGE_HEADER, String.format("%s %d-%d/%d", RANGES_BYTES, start, end, file.length()));
+ }
} else {
rr.setError(404);
}