blob: 77d6bf51d82689be3dd109d81ba7cf939916c390 [file] [log] [blame]
/*
* Copyright (C) 2007-2008 Esmertec AG.
* Copyright (C) 2007-2008 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 android.os.SystemClock;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* An implementation of CIR channel with standalone HTTP binding.
*/
class HttpCirChannel extends CirChannel implements Runnable {
private static final int HTTP_CIR_PING_INTERVAL = 10000;
private DataChannel mDataChannel;
private boolean mStopped;
private Thread mPollingTask;
private URL mCirUrl;
private long mServerPollMin;
public HttpCirChannel(ImpsConnection connection, DataChannel dataChannel) {
super(connection);
this.mDataChannel = dataChannel;
}
@Override
public synchronized void connect() {
ImpsSession session = mConnection.getSession();
try {
if (session.getCirHttpAddress() != null) {
mCirUrl = new URL(session.getCirHttpAddress());
}
} catch (MalformedURLException e) {
// Ignore
}
mServerPollMin = session.getServerPollMin() * 1000;
mStopped = false;
mPollingTask = new Thread(this, "HTTPCIRChannel");
mPollingTask.setDaemon(true);
mPollingTask.start();
}
public synchronized boolean isShutdown() {
return mStopped;
}
@Override
public synchronized void shutdown() {
mStopped = true;
}
public void run() {
while (!mStopped) {
long lastActive = mDataChannel.getLastActiveTime();
if (mCirUrl != null) {
if (SystemClock.elapsedRealtime() - lastActive >= HTTP_CIR_PING_INTERVAL) {
HttpURLConnection urlConnection;
try {
urlConnection = (HttpURLConnection) mCirUrl
.openConnection();
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
mConnection.sendPollingRequest();
}
} catch (IOException e) {
mStopped = true;
}
}
try {
Thread.sleep(HTTP_CIR_PING_INTERVAL);
} catch (InterruptedException e) {
// Ignore.
}
} else {
// The server didn't provide a URL for CIR poll in the
// capability negotiation, just send PollingRequest.
if (SystemClock.elapsedRealtime() - lastActive >= mServerPollMin
&& mDataChannel.isSendingQueueEmpty()) {
mConnection.sendPollingRequest();
}
try {
Thread.sleep(mServerPollMin);
} catch (InterruptedException e) {
// Ignore.
}
}
}
}
}