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);
 				}