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

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.engine;
  18. import java.util.HashMap;
  19. import java.util.concurrent.CopyOnWriteArrayList;
  20. /**
  21.  * An <code>ImConnection</code> is an abstract representation of a connection
  22.  * to the IM server.
  23.  */
  24. public abstract class ImConnection {
  25.     /**
  26.      * Connection state that indicates the connection is not connected yet.
  27.      */
  28.     public static final int DISCONNECTED = 0;
  29.     /**
  30.      * Connection state that indicates the user is logging into the server.
  31.      */
  32.     public static final int LOGGING_IN = 1;
  33.     /**
  34.      * Connection state that indicates the user has logged into the server.
  35.      */
  36.     public static final int LOGGED_IN = 2;
  37.     /**
  38.      * Connection state that indicates the user is logging out the server.
  39.      */
  40.     public static final int LOGGING_OUT = 3;
  41.     /**
  42.      * Connection state that indicate the connection is suspending.
  43.      */
  44.     public static final int SUSPENDING = 4;
  45.     /**
  46.      * Connection state that indicate the connection has been suspended.
  47.      */
  48.     public static final int SUSPENDED = 5;
  49.     /**
  50.      * The capability of supporting group chat.
  51.      */
  52.     public static final int CAPABILITY_GROUP_CHAT = 1;
  53.     /**
  54.      * The capability of supporting session re-establishment.
  55.      */
  56.     public static final int CAPABILITY_SESSION_REESTABLISHMENT = 2;
  57.     /**
  58.      * The current state of the connection.
  59.      */
  60.     protected int mState;
  61.     protected CopyOnWriteArrayList<ConnectionListener> mConnectionListeners;
  62.     protected Presence mUserPresence;
  63.     protected ImConnection() {
  64.         mConnectionListeners = new CopyOnWriteArrayList<ConnectionListener>();
  65.         mState = DISCONNECTED;
  66.     }
  67.     public void addConnectionListener(ConnectionListener listener) {
  68.         if (listener != null) {
  69.             mConnectionListeners.add(listener);
  70.         }
  71.     }
  72.     public void removeConnectionListener(ConnectionListener listener) {
  73.         mConnectionListeners.remove(listener);
  74.     }
  75.     public abstract Contact getLoginUser();
  76.     public String getLoginUserName() {
  77.         Contact loginUser = getLoginUser();
  78.         return loginUser == null ? null : loginUser.getName();
  79.     }
  80.     public abstract int[] getSupportedPresenceStatus();
  81.     public Presence getUserPresence() {
  82.         if (mState == SUSPENDING || mState == SUSPENDED) {
  83.             return new Presence();
  84.         }
  85.         if (mState != LOGGED_IN) {
  86.             // In most cases we have a valid mUserPresence instance also
  87.             // in the LOGGING_OUT state. However there is one exception:
  88.             // if logout() is called before login finishes, the state may
  89.             // jump from LOGGING_IN directly to LOGGING_OUT, skipping the
  90.             // LOGGED_IN state. In this case we won't have a valid Presence
  91.             // in the LOGGING_OUT state.
  92.             return null;
  93.         }
  94.         return new Presence(mUserPresence);
  95.     }
  96.     public void updateUserPresenceAsync(Presence newPresence) throws ImException {
  97.         if (mState != LOGGED_IN) {
  98.             throw new ImException(ImErrorInfo.NOT_LOGGED_IN, "NOT logged in");
  99.         }
  100.         doUpdateUserPresenceAsync(newPresence);
  101.     }
  102.     /**
  103.      * Tells the engine that the network type has changed, e.g. switch from gprs
  104.      * to wifi. The engine should drop all the network connections created before
  105.      * because they are not available anymore.
  106.      *
  107.      * The engine might also need to redo authentication on the new network depending
  108.      * on the underlying protocol.
  109.      */
  110.     public void networkTypeChanged(){
  111.     }
  112.     /**
  113.      * Tells the current state of the connection.
  114.      */
  115.     public int getState() {
  116.         return mState;
  117.     }
  118.     /**
  119.      * Sets the state of the connection.
  120.      *
  121.      * @param state the new state of the connection.
  122.      * @param error the error information which caused the state change or null.
  123.      */
  124.     protected void setState(int state, ImErrorInfo error) {
  125.         if(state < DISCONNECTED || state > SUSPENDED){
  126.             throw new IllegalArgumentException("Invalid state: " + state);
  127.         }
  128.         if(mState != state){
  129.             mState = state;
  130.             for(ConnectionListener listener : mConnectionListeners){
  131.                 listener.onStateChanged(state, error);
  132.             }
  133.         }
  134.     }
  135.     protected void notifyUserPresenceUpdated() {
  136.         for (ConnectionListener listener : mConnectionListeners) {
  137.             listener.onUserPresenceUpdated();
  138.         }
  139.     }
  140.     protected void notifyUpdateUserPresenceError(ImErrorInfo error) {
  141.         for (ConnectionListener listener : mConnectionListeners) {
  142.             listener.onUpdatePresenceError(error);
  143.         }
  144.     }
  145.     /**
  146.      * Gets bit-or of capabilities supported by the underlying protocol. Valid
  147.      * capability bits are: {@value #CAPABILITY_GROUP_CHAT},
  148.      * {@value #CAPABILITY_SESSION_REESTABLISHMENT}
  149.      *
  150.      * @return bit-or of capabilities supported by the underlying protocol
  151.      */
  152.     public abstract int getCapability();
  153.     /**
  154.      * Log in to the IM server.
  155.      *
  156.      * @param loginInfo the login information.
  157.      */
  158.     public abstract void loginAsync(LoginInfo loginInfo);
  159.     /**
  160.      * Re-establish previous session using the session context persisted by the
  161.      * client. Only sessions that were dropped unexpectedly(e.g. power loss, crash,
  162.      * etc) can be re-established using the stored session context. If the
  163.      * session was terminated normally by either user logging out or server
  164.      * initiated disconnection, it can't be re-established again therefore the
  165.      * stored context should be removed by the client.
  166.      * <p>
  167.      * The client can query if session re-establishment is supported through
  168.      * {@link #getCapability()}.
  169.      *
  170.      * @param sessionContext
  171.      *            the session context which was fetched from previous session by
  172.      *            {@link #getSessionContext()} and persisted by the client.
  173.      * @throws UnsupportedOperationException
  174.      *             if session re-establishment is not supported by the
  175.      *             underlying protocol.
  176.      */
  177.     public abstract void reestablishSessionAsync(HashMap<String, String> sessionContext);
  178.     /**
  179.      * Log out from the IM server.
  180.      */
  181.     public abstract void logoutAsync();
  182.     /**
  183.      * Suspend connection with the IM server.
  184.      */
  185.     public abstract void suspend();
  186.     /**
  187.      * Gets the cookie of the current session. The client could store the
  188.      * context and use it to re-establish the session by
  189.      * {@link #reestablishSessionAsync(HashMap)}}. The stored context MUST be
  190.      * removed upon the connection logout/disconnect.
  191.      *
  192.      * @return the context of the current session or <code>null</code> if the
  193.      *         user has not logged in yet.
  194.      * @throws UnsupportedOperationException
  195.      *             if session re-establishment is not supported by the
  196.      *             underlying protocol.
  197.      */
  198.     public abstract HashMap<String, String> getSessionContext();
  199.     /**
  200.      * Gets the instance of ChatSessionManager for the connection.
  201.      *
  202.      * @return the instance of ChatSessionManager for the connection.
  203.      */
  204.     public abstract ChatSessionManager getChatSessionManager();
  205.     /**
  206.      * Gets the instance of ContactListManager for the connection.
  207.      *
  208.      * @return the instance of ContactListManager for the connection.
  209.      */
  210.     public abstract ContactListManager getContactListManager();
  211.     /**
  212.      * Gets the instance of ChatGroupManager for the connection.
  213.      *
  214.      * @return the instance of ChatGroupManager for the connection.
  215.      * @throws UnsupportedOperationException
  216.      *             if group chat is not supported by the underlying protocol.
  217.      */
  218.     public abstract ChatGroupManager getChatGroupManager();
  219.     protected abstract void doUpdateUserPresenceAsync(Presence presence);
  220. }