/*
* @(#)DataSource.java 1.4 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media.protocol;
import javax.media.*;
import javax.media.Duration;
import java.io.IOException;
import java.net.*;
/**
* A <CODE>DataSource</CODE> is an abstraction for media protocol-handlers.
* <CODE>DataSource</CODE> manages the life-cycle of the media source
* by providing a simple connection protocol.
*
* <h2>Source Controls</h2>
*
* A <code>DataSource</code> might support an operation
* that is not part of the <code>DataSource</code>
* class definition. For example a source could support
* positioning its media to a particular time.
* Some operations are dependent on the data stream that the
* source is managing, and support cannot be determined
* until after the source has been connected.
* <p>
*
* To obtain all of the objects that provide control
* over a <code>DataSource</code>, use <code>getControls</code>
* which returns an array of <code>Object</code>
* To determine if a particular kind of control
* is available and obtain the object that implements
* it, use <code>getControl</code> which takes
* the name of the Class or Interface that of the
* desired control.
*
* <h2>DataSource Properties</h2>
*
* A <code>DataSource</code> may implement the following few
* well-defined interfaces:
* <br>
* <code>Positionable</code>: if the <code>DataSource</code> can be positioned.
* <br>
* <code>RateConfigureable</code>: if the <code>DataSource</code> supports
* different playback rates.
* <br>
* <code>SourceCloneable</code>: if the <code>DataSource</code> can be
* cloned.
* <br>
* <code>CaptureDevice</code>: if the <code>DataSource</code> is a
* capture device.
*
*
* @see Manager
* @see Positionable
* @see RateConfigureable
* @see CaptureDevice
* @see SourceCloneable
*
* @version 1.4, 02/08/21
*/
abstract public class DataSource implements Controls, Duration {
MediaLocator sourceLocator;
/**
* A no-argument constructor required by pre 1.1 implementations
* so that this class can be instantiated by
* calling <CODE>Class.newInstance</CODE>.
*
*/
public DataSource() {
sourceLocator = null;
}
/**
* Construct a <CODE>DataSource</CODE> from a <CODE>MediaLocator</CODE>.
* This method should be overloaded by subclasses;
* the default implementation just keeps track of
* the <CODE>MediaLocator</CODE>.
*
*
* @param source The <CODE>MediaLocator</CODE> that describes
* the <CODE>DataSource</CODE>.
*/
public DataSource(MediaLocator source) {
sourceLocator = null;
setLocator(source);
}
/**
* Set the connection <CODE>source</CODE> for this <CODE>DataSource</CODE>.
* This method should only be called once; an error is thrown if
* the locator has already been set.
*
* @param source The <CODE>MediaLocator</CODE> that describes the
* media source.
*/
public void setLocator(MediaLocator source) {
if( sourceLocator == null) {
sourceLocator = source;
} else {
// $jdr: Should we name the error here?
throw new java.lang.Error("Locator already set on DataSource.");
}
}
/**
* Get the <CODE>MediaLocator</CODE> that describes this source.
* Returns <CODE>null</CODE> if the locator hasn't been set.
* (Very unlikely.)
* @return The <CODE>MediaLocator</CODE> for this source.
*/
public MediaLocator getLocator() {
return sourceLocator;
}
/**
* Check to see if this connection has been
* initialized with a <CODE>MediaLocator</CODE>.
* If the connection hasn't been initialized,
* <CODE>initCheck</CODE> throws an <CODE>UninitializedError</CODE>.
* Most methods should call <CODE>initCheck</CODE> on entry.
*
*/
protected void initCheck() {
if(sourceLocator == null) {
// $jdr: This should a real media error.
throw new java.lang.Error("Uninitialized DataSource error.");
}
}
/**
* Get a string that describes the content-type of the media
* that the source is providing.
* <p>
* It is an error to call <CODE>getContentType</CODE> if the source is
* not connected.
*
* @return The name that describes the media content.
*/
public abstract String getContentType();
/**
* Open a connection to the source described by
* the <CODE>MediaLocator</CODE>.
* <p>
*
* The <CODE>connect</CODE> method initiates communication with the source.
*
* @exception IOException Thrown if there are IO problems
* when <CODE>connect</CODE> is called.
*/
public abstract void connect() throws IOException;
/**
* Close the connection to the source described by the locator.
* <p>
* The <CODE>disconnect</CODE> method frees resources used to maintain a
* connection to the source.
* If no resources are in use, <CODE>disconnect</CODE> is ignored.
* If <CODE>stop</CODE> hasn't already been called,
* calling <CODE>disconnect</CODE> implies a stop.
*
*/
public abstract void disconnect();
/**
* Initiate data-transfer. The <CODE>start</CODE> method must be
* called before data is available.
*(You must call <CODE>connect</CODE> before calling <CODE>start</CODE>.)
*
* @exception IOException Thrown if there are IO problems with the source
* when <CODE>start</CODE> is called.
*/
public abstract void start() throws IOException;
/**
* Stop the data-transfer.
* If the source has not been connected and started,
* <CODE>stop</CODE> does nothing.
*/
public abstract void stop() throws IOException;
}
|