/*
* File : ByteDataSource.java
* Created : 20-sep-2001 9:14
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.media;
import edu.xtec.util.ExtendedByteArrayInputStream;
import edu.xtec.util.StreamIO;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.10
*/
public class ByteDataSource extends javax.media.protocol.PullDataSource{
protected ByteSourceStream[] pss;
protected javax.media.protocol.ContentDescriptor contentType;
protected String fName;
public ByteDataSource(ExtendedByteArrayInputStream is) throws IOException{
super();
this.pss = new ByteSourceStream[1];
init(is);
}
public ByteDataSource(InputStream is, String name) throws IOException{
super();
this.pss = new ByteSourceStream[1];
if(is instanceof ExtendedByteArrayInputStream)
init((ExtendedByteArrayInputStream)is);
else
init(new ExtendedByteArrayInputStream(StreamIO.readInputStream(is), name));
}
public ByteDataSource(byte[] src, String name) throws IOException{
super();
this.pss = new ByteSourceStream[1];
init(new ExtendedByteArrayInputStream(src, name));
}
private void init(ExtendedByteArrayInputStream is) throws IOException{
contentType=getContentDescriptor(is.getName());
pss[0]=new ByteSourceStream(is, contentType);
fName=null;
}
private ByteDataSource(){
this.pss = new ByteSourceStream[1];
}
public ByteDataSource duplicate() throws IOException{
ByteDataSource result=new ByteDataSource();
result.contentType=contentType;
result.fName=fName;
result.pss[0]=((ByteSourceStream)pss[0]).duplicate();
return result;
}
public ExtendedByteArrayInputStream getInputStream(){
if(pss[0]!=null)
return pss[0].inputStream;
else return null;
}
public String getFName(){
return fName;
}
public void setFName(String name){
fName=name;
}
public java.lang.Object[] getControls() {
return null;
}
public void connect() throws IOException {
}
public void disconnect() {
}
public void start() throws IOException {
}
public javax.media.Time getDuration() {
return javax.media.Duration.DURATION_UNKNOWN;
}
public void stop() throws IOException {
}
public java.lang.Object getControl(java.lang.String str) {
return null;
}
public java.lang.String getContentType() {
return contentType.toString();
}
public javax.media.protocol.PullSourceStream[] getStreams() {
return pss;
}
static Method getMimeTypeMethod;
static{
try{
Class<?> cl=null;
// 03-Apr-2008: Perform a previous check of the class as resource in order to avoid
// uncatchable exceptions in applets
if(ByteDataSource.class.getResource("/com/sun/media/MimeManager.class")!=null &&
(cl=Class.forName("com.sun.media.MimeManager"))!=null){
getMimeTypeMethod=cl.getMethod("getMimeType", new Class[]{String.class});
}
} catch(Exception ex){
// no com.sun classes available!
}
}
public javax.media.protocol.ContentDescriptor getContentDescriptor(String fName){
String mimeType=null;
if(fName!=null){
int p=fName.lastIndexOf('.')+1;
String ext=(p>0 && p<fName.length() ? fName.substring(p) : fName).toLowerCase();
//mimeType=com.sun.media.MimeManager.getMimeType(ext);
if(getMimeTypeMethod!=null){
try{
mimeType=(String)getMimeTypeMethod.invoke(null, new Object[]{ext});
} catch(Exception ex){
//
}
}
}
if(mimeType==null){
mimeType="unknown";
}
// Todo: implement some standard mime types...
return new javax.media.protocol.ContentDescriptor(javax.media.protocol.ContentDescriptor.mimeTypeToPackageName(mimeType));
}
class ByteSourceStream implements javax.media.protocol.PullSourceStream, javax.media.protocol.Seekable{
protected ExtendedByteArrayInputStream inputStream;
javax.media.protocol.ContentDescriptor contentType;
public ByteSourceStream(ExtendedByteArrayInputStream in, javax.media.protocol.ContentDescriptor type) throws IOException{
inputStream=in;
contentType = type;
}
public ByteSourceStream duplicate() throws IOException{
return new ByteSourceStream(inputStream.duplicate(), contentType);
}
public javax.media.protocol.ContentDescriptor getContentDescriptor() {
return contentType;
}
public long getContentLength() {
return inputStream.getCount();
}
public boolean willReadBlock() {
return inputStream.eosReached();
}
public int read(byte[] buffer, int offset, int length) throws IOException {
return inputStream.read(buffer, offset, length);
}
public void close() throws IOException {
inputStream.close();
}
public boolean endOfStream() {
return inputStream.eosReached();
}
public Object[] getControls() {
return new Object[0];
}
public Object getControl(String controlName) {
return null;
}
public boolean isRandomAccess() {
return true;
}
public long seek(long param) {
try{
return inputStream.seek(param);
} catch(Exception ex){
return 0L;
}
}
public long tell() {
return inputStream.getPos();
}
}
}