/*
*
* Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* 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 version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
package javax.microedition.media.protocol;
import javax.microedition.media.Controllable;
import javax.microedition.media.Control;
import java.io.IOException;
/**
* A <CODE>DataSource</CODE> is an abstraction for media protocol-handlers.
* It hides the details of how the data is read from source--whether
* the data is
* coming from a file, streaming server or proprietary delivery mechanism.
* It provides the methods for a <code>Player</code> to access
* the input data.
* <p>
* An application-defined protocol can be implemented with a custom
* <code>DataSource</code>. A <code>Player</code> can then be
* created for playing back the media from the custom
* <code>DataSource</code> using the
* <a href="../Manager.html#createPlayer(javax.microedition.media.protocol.DataSource)">
* <code>Manager.createPlayer</code></a> method.
* <p>
* There are a few reasons why one would choose to implement
* a <code>DataSource</code> as opposed to an <code>InputStream</code>
* for a custom protocol:
* <ul>
* <li>
* <code>DataSource/SourceStream</code> provides the random
* seeking API that
* is not supported by an <code>InputStream</code>. i.e., if
* the custom protocol
* requires random seeking capabilities, a custom
* <code>DataSource</code> can be used.
* <li>
* <code>DataSource/SourceStream</code> supports the concept of
* transfer size
* that is more suited for frame-delimited data, e.g. video.
* </ul>
* <p>
* A <code>DataSource</code> contains a set of <code>SourceStream</code>s.
* Each <code>SourceStream</code> represents one elementary data stream
* of the source. In the most common case, a <code>DataSource</code>
* only provides one <code>SourceStream</code>. A <code>DataSource</code>
* may provide multiple <code>SourceStream</code>s if it encapsulates
* multiple elementary data streams.
* <p>
* Each of the <code>SourceStream</code>s provides the methods to allow
* a <code>Player</code> to read data for processing.
* <p>
* <CODE>DataSource</CODE> manages the life-cycle of the media source
* by providing a simple connection protocol.
*
* <p>
* <a name="controls">
* <code>DataSource</code> implements <code>Controllable</code> which
* provides extra controls via some type-specific <code>Control</code>
* interfaces. <code>getControl</code> and <code>getControls</code>
* can only be called when the <code>DataSource</code> is connected.
* An <code>IllegalStateException</code> will be thrown otherwise.
*
* @see javax.microedition.media.Manager
* @see javax.microedition.media.protocol.SourceStream
* @see javax.microedition.media.protocol.ContentDescriptor
*/
abstract public class DataSource implements Controllable {
private String sourceLocator;
/**
* Construct a <CODE>DataSource</CODE> from a locator.
* This method should be overloaded by subclasses;
* the default implementation just keeps track of
* the locator.
*
* @param locator The locator that describes
* the <CODE>DataSource</CODE>.
*/
public DataSource(String locator) {
sourceLocator = locator;
}
/**
* Get the locator that describes this source.
* Returns <CODE>null</CODE> if the locator hasn't been set.
*
* @return The locator for this source.
*/
public String getLocator() {
return sourceLocator;
}
/**
* Get a string that describes the content-type of the media
* that the source is providing.
*
* @return The name that describes the media content.
* Returns <code>null</code> if the content is unknown.
* @exception IllegalStateException Thrown if the source is
* not connected.
*/
public abstract String getContentType();
/**
* Open a connection to the source described by
* the locator and initiate communication.
*
* @exception IOException Thrown if there are IO problems
* when <CODE>connect</CODE> is called.
* @exception SecurityException Thrown if the caller does not
* have security permission to call <code>connect</code>.
*/
public abstract void connect() throws IOException;
/**
* Close the connection to the source described by the locator
* and free resources used to maintain the connection.
* <p>
* 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 for reading.
*
* @exception IllegalStateException Thrown if the
* <code>DataSource</code> is not connected.
* @exception IOException Thrown if the <code>DataSource</code>
* cannot be started due to some IO problems.
* @exception SecurityException Thrown if the caller does not
* have security permission to call <code>start</code>.
*/
public abstract void start() throws IOException;
/**
* Stop the data-transfer.
* If the <code>DataSource</code> has not been connected and started,
* <CODE>stop</CODE> is ignored.
*
* @exception IOException Thrown if the <code>DataSource</code>
* cannot be stopped due to some IO problems.
*/
public abstract void stop() throws IOException;
/**
* Get the collection of streams that this source
* manages. The collection of streams is entirely
* content dependent. The MIME type of this
* <CODE>DataSource</CODE> provides the only indication of
* what streams may be available on this connection.
*
* @return The collection of streams for this source.
* @exception IllegalStateException Thrown if the source
* is not connected.
*/
public abstract SourceStream[] getStreams();
// These two methods are declared here (Controllable interface)
// because of a feature in KVM/VM when code is compiled with JDK 1.4
// Need to declare these abstract
public abstract Control [] getControls();
public abstract Control getControl(String controlType);
}
|