/* * @(#)RTPPushDataSource.java 1.8 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package javax.media.rtp; import javax.media.protocol.*; import java.io.*; import javax.media.*; /** * This is an abstraction for a RTP data handler. The source allows * the underlying network/transport protocol to be abstracted from the * RTP handler. The source is a TWO WAY datasource in that it has an * output data stream (PushSourceStream) as well as an input data * stream (OutputDataStream). RTPDataSocket extends * javax.media.protocol.DataSource. Data flowing out of or in to this * source is a stream of bytes in the form of a RTP packet and does not * contain any information dependant on the network/transport protocol * that will be used to transmit these bytes. Note: an RTPPushDataSource * can either handle the DataChannel of an RTP session or the control * channel of an RTP session. An RTPPushDataSource that handles the data * channel of an RTP session must implement the interface defined in * javax.media.rtp.DataChannel. * * @deprecated This inferface has been replaced with the RTPConnector interface. * * @see DataChannel */ public class RTPPushDataSource extends PushDataSource{ /** * The output stream of this socket. Implements * javax.media.protocol.PushSourceStream. Data on this stream is * transferrred to the SourceTransferHandler */ PushSourceStream outputstream; /** * The input stream of this socket. Data on this stream is sent * out on the wire using the underlying network/transport protocol * Implements javax.media.rtp.OutputDataStream * @className OutputDataStream */ OutputDataStream inputstream; /** * The content type of this socket. needs to be set by the * creator of this datasocket before a player can be created for * this datasource. */ String contentType = null; /** * Used to ensure that DataSource methods like getContentType() * cannot be called till this datasource has been connected. */ private boolean connected = false; /** * Used to check if the datasource has been started. This will * initiate data transfer to and from this data source */ private boolean started = false; /** * The actual datasource created by the RTPSM and passed to the handler */ DataSource childsrc = null; /** * The RTPControl interface that is exported by this datasource * and will be used to configure information for this datasource */ private RTPControl rtpcontrol = null; public RTPPushDataSource(){ // since we cannot access the RTPControlImpl class in the // javax.media packages, we will load the class based on the // classname Class eClass = null; try{ eClass = Class.forName("com.sun.media.rtp.RTPControlImpl"); rtpcontrol = (RTPControl) eClass.newInstance(); }catch (Exception e){ rtpcontrol = null; } } public void setChild(DataSource source){ childsrc = source; } /** * Method to retrive the output stream of this two way data source */ public PushSourceStream getOutputStream(){ return outputstream; } /** * Method to retrieve the input stream of this two way data source */ public OutputDataStream getInputStream(){ return inputstream; } /** * Method to set the output stream of this two way data source */ public void setOutputStream(PushSourceStream outputstream){ this.outputstream = outputstream; } /** * Method to set the input stream of this two way data source */ public void setInputStream(OutputDataStream inputstream){ this.inputstream = inputstream; } /** *Implementation of javax.media.protocol.DataSource.getContentType() */ public String getContentType(){ if (!connected){ System.err.println("Error: DataSource not connected"); return null; } return ContentDescriptor.mimeTypeToPackageName(contentType); } /** * Method used to set the content type of this two way data source */ public void setContentType(String contentType){ this.contentType = contentType; } /** * Set the boolean to true and dont do anything else in connect for now */ public void connect() throws IOException{ connected = true; if (childsrc != null) childsrc.connect(); } /** * Set the boolean to false and dont do anything else in connect * for now */ public void disconnect(){ connected = false; if (childsrc != null) childsrc.disconnect(); } /** * This two way data source does not have any medialocator and * datasource will throw an Uninitialized DataSource error incase * initCheck() is called on this datasource. So, here this method is * overrident to esnure that no errors are thrown and in the absence * of a MediaLocator, nothing is done for now */ protected void initCheck(){ } /** * Initiates data-transfer. Start must be called before * data is available. Connect must be called before start. * * @exception IOException thrown if the source has IO trouble * at startup time. */ public void start() throws IOException{ if (!connected) return; started = true; if (childsrc != null) childsrc.start(); } /** * Stops data-transfer. * If the source has not already been connected and started, * stop does nothing. */ public void stop() throws IOException{ if ((!connected) && (!started)) return; started = false; if (childsrc != null) childsrc.stop(); } /** * Method to find out if the source had been started */ public boolean isStarted(){ return started; } /** * Returns an zero length array because no controls * are supported. * * @return a zero length <code>Object</code> array. */ public Object[] getControls(){ // return a one element array of rtpcontrol object RTPControl[] controls = new RTPControl[1]; controls[0] = rtpcontrol; return controls; } /** * Returns <code>null</code> because no controls are implemented. * * @return <code>null</code>. */ public Object getControl(String controlName){ if (controlName.equals("javax.media.rtp.RTPControl")) return rtpcontrol; return null; } /** * Returns null since the duration of the streams of this * datasource are not known */ public Time getDuration(){ return null; } public PushSourceStream[] getStreams(){ PushSourceStream[] outstream = new PushSourceStream[1]; outstream[0]= outputstream; return outstream; } }