Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.tcf.core/src/org/eclipse/tcf/services/IStreams.java')
-rw-r--r--plugins/org.eclipse.tcf.core/src/org/eclipse/tcf/services/IStreams.java218
1 files changed, 218 insertions, 0 deletions
diff --git a/plugins/org.eclipse.tcf.core/src/org/eclipse/tcf/services/IStreams.java b/plugins/org.eclipse.tcf.core/src/org/eclipse/tcf/services/IStreams.java
new file mode 100644
index 000000000..61749932a
--- /dev/null
+++ b/plugins/org.eclipse.tcf.core/src/org/eclipse/tcf/services/IStreams.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tm.tcf.services;
+
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+
+/**
+ * Streams service is a generic interface to support streaming of data between host and remote agents.
+ *
+ * The service supports:
+ * 1. Asynchronous overlapped data streaming: multiple 'read' or 'write' command can be issued at same time, both peers
+ * can continue data processing concurrently with data transmission.
+ * 2. Multicast: multiple clients can receive data from same stream.
+ * 3. Subscription model: clients are required to expressed interest in particular streams by subscribing for the service.
+ * 4. Flow control: peers can throttle data flow of individual streams by delaying 'read' and 'write' commands.
+ */
+public interface IStreams extends IService {
+
+ /**
+ * Service name.
+ */
+ static final String NAME = "Streams";
+
+ /**
+ * Clients can implement StreamsListener interface to be notified
+ * when a stream is created or disposed. The interface is registered with 'subscribe' command.
+ *
+ * When new stream is created, client must decide if it is interested in that particular stream instance.
+ * If not interested, client should send 'disconnect' command to allow remote peer to free resources and bandwidth.
+ * If not disconnected, client is required to send 'read' commands as necessary to prevent stream buffer overflow.
+ */
+ interface StreamsListener {
+
+ /**
+ * Called when a new stream is created.
+ * @param stream_type - source type of the stream.
+ * @param stream_id - ID of the stream.
+ * @param context_id - a context ID that is associated with the stream, or null.
+ * Exact meaning of the context ID depends on stream type.
+ * Stream types and context IDs are defined by services that use Streams service to transmit data.
+ */
+ void created(String stream_type, String stream_id, String context_id);
+
+ /**
+ * Called when a stream is disposed.
+ * @param stream_type - source type of the stream.
+ * @param stream_id - ID of the stream.
+ */
+ void disposed(String stream_type, String stream_id);
+ }
+
+ /**
+ * Clients must subscribe for one or more stream types to be able to send or receive stream data.
+ * Subscribers receive notifications when a stream of given type is created or disposed.
+ * Subscribers are required to respond with 'read' or 'disconnect' commands as necessary.
+ * @param stream_type - the stream source type.
+ * @param listener - client implementation of StreamsListener interface.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken subscribe(String stream_type, StreamsListener listener, DoneSubscribe done);
+
+ /**
+ * Call back interface for 'subscribe' command.
+ */
+ interface DoneSubscribe {
+ void doneSubscribe(IToken token, Exception error);
+ }
+
+ /**
+ * Unsubscribe the client from given stream source type.
+ * @param stream_type - the stream source type.
+ * @param listener - client implementation of StreamsListener interface.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken unsubscribe(String stream_type, StreamsListener listener, DoneUnsubscribe done);
+
+ /**
+ * Call back interface for 'unsubscribe' command.
+ */
+ interface DoneUnsubscribe {
+ void doneUnsubscribe(IToken token, Exception error);
+ }
+
+ /**
+ * Read data from a stream. If stream buffer is empty, the command will wait until data is available.
+ * Remote peer will continue to process other commands while 'read' command is pending.
+ * Client can send more 'read' commands without waiting for the first command to complete.
+ * Doing that improves communication channel bandwidth utilization.
+ * Pending 'read' commands will be executed in same order as issued.
+ * Client can delay sending of 'read' command if it is not ready to receive more data,
+ * however, delaying for too long can cause stream buffer overflow and lost of data.
+ * @param stream_id - ID of the stream.
+ * @param size - max number of bytes to read.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken read(String stream_id, int size, DoneRead done);
+
+ /**
+ * Call back interface for 'read' command.
+ */
+ interface DoneRead {
+ /**
+ * Called when 'read' command is done.
+ * @param token - command handle.
+ * @param error - error object or null.
+ * @param lost_size - number of bytes that were lost because of buffer overflow.
+ * 'lost_size' -1 means unknown number of bytes were lost.
+ * if both 'lost_size' and 'data.length' are non-zero then lost bytes are considered
+ * located right before read bytes.
+ * @param data - bytes read from the stream.
+ * @param eos - true if end of stream was reached.
+ */
+ void doneRead(IToken token, Exception error, int lost_size, byte[] data, boolean eos);
+ }
+
+ /**
+ * Write data to a stream. If stream buffer is full, the command will wait until space is available.
+ * Remote peer will continue to process other commands while 'write' command is pending.
+ * Client can send more 'write' commands without waiting for the first command to complete.
+ * Doing that improves communication channel bandwidth utilization.
+ * Pending 'write' commands will be executed in same order as issued.
+ * @param stream_id - ID of the stream.
+ * @param buf - buffer that contains stream data.
+ * @param offset - byte offset in the buffer.
+ * @param size - number of bytes to write.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken write(String stream_id, byte[] buf, int offset, int size, DoneWrite done);
+
+ /**
+ * Call back interface for 'write' command.
+ */
+ interface DoneWrite {
+ /**
+ * Called when 'write' command is done.
+ * @param token - command handle.
+ * @param error - error object or null.
+ */
+ void doneWrite(IToken token, Exception error);
+ }
+
+ /**
+ * Send End Of Stream marker to a stream. No more writing to the stream is allowed after that.
+ * @param stream_id - ID of the stream.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken eos(String stream_id, DoneEOS done);
+
+ /**
+ * Call back interface for 'eos' command.
+ */
+ interface DoneEOS {
+ /**
+ * Called when 'eos' command is done.
+ * @param token - command handle.
+ * @param error - error object or null.
+ */
+ void doneEOS(IToken token, Exception error);
+ }
+
+ /**
+ * Connect client to a stream.
+ * Some data might be dropped from the stream by the time "connect" command is executed.
+ * Client should be able to re-sync with stream data if it wants to read from such stream.
+ * If a client wants to read a stream from the beginning it should use "subscribe" command
+ * instead of "connect".
+ * @param stream_id - ID of the stream.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken connect(String stream_id, DoneConnect done);
+
+ /**
+ * Call back interface for 'connect' command.
+ */
+ interface DoneConnect {
+ /**
+ * Called when 'connect' command is done.
+ * @param token - command handle.
+ * @param error - error object or null.
+ */
+ void doneConnect(IToken token, Exception error);
+ }
+
+ /**
+ * Disconnect client from a stream.
+ * @param stream_id - ID of the stream.
+ * @param done - command result call back object.
+ * @return - pending command handle.
+ */
+ IToken disconnect(String stream_id, DoneDisconnect done);
+
+ /**
+ * Call back interface for 'disconnect' command.
+ */
+ interface DoneDisconnect {
+ /**
+ * Called when 'disconnect' command is done.
+ * @param token - command handle.
+ * @param error - error object or null.
+ */
+ void doneDisconnect(IToken token, Exception error);
+ }
+}

Back to the top