HttpCirChannel.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:3k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2007-2008 Esmertec AG.
  3.  * Copyright (C) 2007-2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.imps;
  18. import android.os.SystemClock;
  19. import java.io.IOException;
  20. import java.net.HttpURLConnection;
  21. import java.net.MalformedURLException;
  22. import java.net.URL;
  23. /**
  24.  * An implementation of CIR channel with standalone HTTP binding.
  25.  */
  26. class HttpCirChannel extends CirChannel implements Runnable {
  27.     private static final int HTTP_CIR_PING_INTERVAL = 10000;
  28.     private DataChannel mDataChannel;
  29.     private boolean mStopped;
  30.     private Thread mPollingTask;
  31.     private URL mCirUrl;
  32.     private long mServerPollMin;
  33.     public HttpCirChannel(ImpsConnection connection, DataChannel dataChannel) {
  34.         super(connection);
  35.         this.mDataChannel = dataChannel;
  36.     }
  37.     @Override
  38.     public void connect() {
  39.         ImpsSession session = mConnection.getSession();
  40.         try {
  41.             if (session.getCirHttpAddress() != null) {
  42.                 mCirUrl = new URL(session.getCirHttpAddress());
  43.             }
  44.         } catch (MalformedURLException e) {
  45.             // Ignore
  46.         }
  47.         mServerPollMin = session.getServerPollMin() * 1000;
  48.         mPollingTask = new Thread(this, "HTTPCIRChannel");
  49.         mPollingTask.setDaemon(true);
  50.         mPollingTask.start();
  51.     }
  52.     @Override
  53.     public void shutdown() {
  54.         mStopped = true;
  55.     }
  56.     public void run() {
  57.         while (!mStopped) {
  58.             long lastActive = mDataChannel.getLastActiveTime();
  59.             if (mCirUrl != null) {
  60.                 if (SystemClock.elapsedRealtime() - lastActive >= HTTP_CIR_PING_INTERVAL) {
  61.                     HttpURLConnection urlConnection;
  62.                     try {
  63.                         urlConnection = (HttpURLConnection) mCirUrl
  64.                                 .openConnection();
  65.                         if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
  66.                             mConnection.sendPollingRequest();
  67.                         }
  68.                     } catch (IOException e) {
  69.                         mStopped = true;
  70.                     }
  71.                 }
  72.                 try {
  73.                     Thread.sleep(HTTP_CIR_PING_INTERVAL);
  74.                 } catch (InterruptedException e) {
  75.                     // Ignore.
  76.                 }
  77.             } else {
  78.                 // The server didn't provide a URL for CIR poll in the
  79.                 // capability negotiation, just send PollingRequest.
  80.                 if (SystemClock.elapsedRealtime() - lastActive >= mServerPollMin
  81.                         && mDataChannel.isSendingQueueEmpty()) {
  82.                     mConnection.sendPollingRequest();
  83.                 }
  84.                 try {
  85.                     Thread.sleep(mServerPollMin);
  86.                 } catch (InterruptedException e) {
  87.                     // Ignore.
  88.                 }
  89.             }
  90.         }
  91.     }
  92. }