blob: a244677dfe52e34210b3be2d7f0ad2e9be63aa0e [file] [log] [blame]
/*
* Copyright (C) 2007 Esmertec AG.
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.im.imps;
import com.android.im.engine.ImException;
/**
* The IMPS transport binding is divided into two channels: a mandatory data
* channel and a conditional CIR channel. All the exchange of CSP primitives is
* done in the data channel.
*/
abstract class DataChannel {
protected ImpsConnection mConnection;
protected PrimitiveParser mParser;
protected PrimitiveSerializer mSerializer;
protected long mMinPollMillis;
protected DataChannel(ImpsConnection connection) throws ImException {
mConnection = connection;
}
/**
* Establishes a data channel with the IMPS server.
*
* @throws ImException if an error occur during establishing the data
* channel.
*/
public abstract void connect() throws ImException;
/**
* Suspend the data channel. No data will be sent through the data channel
* after suspended. It can be recovered from {@link #resume()}.
*/
public abstract void suspend();
/**
* Resume the suspended data channel.
*
* @return <code>true</code> if the channel is resumed successfully;
* <code>false</code> if the channel is timeout and a new one must
* be established.
*/
public abstract boolean resume();
/**
* Shutdown the data channel.
*/
public abstract void shutdown();
/**
* Sends a CSP primitive to the IMPS server through this data channel.
*
* @param p the primitive to send.
*/
public abstract void sendPrimitive(Primitive p);
/**
* Receives a primitive from this data channel, waiting until a primitive
* from the server arrived or being interrupted.
*
* @return the received primitive
* @throws InterruptedException
*/
public abstract Primitive receivePrimitive() throws InterruptedException;
/**
* Gets the time when the last primitive was sent to the server through the
* data channel.
*
* @return the time last primitive was sent.
*/
public abstract long getLastActiveTime();
/**
* Tells if there is any primitive waiting to send.
*
* @return <code>true</code> if there is one or more primitives waiting to send.
*/
public abstract boolean isSendingQueueEmpty();
/**
* Starts the keep alive task. KeepAliveRequest will be sent to the server
* if no other transaction has occurred during the KeepAliveTime interval.
*/
public abstract void startKeepAlive(long interval);
/**
* Set the ServerMinPoll value (in seconds) after capability negotiation.
* The DataChannel <b>MUST NOT</b> send more than 1 PollingRequest within
* this interval.
*/
public void setServerMinPoll(long interval)
{
mMinPollMillis = interval * 1000;
}
}