/* * 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; } }