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

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 java.util.HashMap;
  19. import com.android.im.engine.ImErrorInfo;
  20. import com.android.im.imps.Primitive.TransactionMode;
  21. public class ImpsTransactionManager {
  22.     private ImpsConnection mConnection;
  23.     private int mTransactionId;
  24.     /** Keep track of the client initialized transactions. */
  25.     private HashMap<String, AsyncTransaction> mClientTransactions;
  26.     private HashMap<String, ServerTransactionListener> mServerTransactionListeners;
  27.     /**
  28.      * Constructs an instance of transaction manager.
  29.      */
  30.     ImpsTransactionManager(ImpsConnection connection) {
  31.         this.mConnection = connection;
  32.         mClientTransactions = new HashMap<String, AsyncTransaction>();
  33.         mServerTransactionListeners = new HashMap<String, ServerTransactionListener>();
  34.     }
  35.     /**
  36.      * Sets a ServerTransactionListener on this manager so that it will be
  37.      * notified when a specified transaction has been initialized by the server.
  38.      *
  39.      * @param type the primitive type of the transaction.
  40.      * @param listener the ServerTransactionListener to be notified, or
  41.      *            <code>null</code> to clear the listener on specified type.
  42.      */
  43.     public void setTransactionListener(String type, ServerTransactionListener listener) {
  44.         synchronized(mServerTransactionListeners) {
  45.             if (listener == null) {
  46.                 mServerTransactionListeners.remove(type);
  47.             } else {
  48.                 mServerTransactionListeners.put(type, listener);
  49.             }
  50.         }
  51.     }
  52.     /**
  53.      * Originates an async transaction from the client.
  54.      * @param tx
  55.      */
  56.     void beginClientTransaction(AsyncTransaction tx) {
  57.         synchronized(mClientTransactions) {
  58.             tx.setTransactionInfo(nextTransactionId(), mConnection);
  59.             mClientTransactions.put(tx.getId(), tx);
  60.         }
  61.     }
  62.     /**
  63.      * Terminates a transaction which was originated from the client.
  64.      *
  65.      * @param tx the transaction to terminate.
  66.      */
  67.     void endClientTransaction(AsyncTransaction tx) {
  68.         synchronized(mClientTransactions) {
  69.             mClientTransactions.remove(tx.getId());
  70.         }
  71.     }
  72.     void reassignTransactionId(Primitive p) {
  73.         synchronized (mClientTransactions) {
  74.             AsyncTransaction tx = mClientTransactions.remove(p.getTransactionID());
  75.             if(tx != null) {
  76.                 String newId = nextTransactionId();
  77.                 tx.setTransactionInfo(newId, mConnection);
  78.                 p.setTransactionId(newId);
  79.                 mClientTransactions.put(newId, tx);
  80.             }
  81.         }
  82.     }
  83.     /**
  84.      * TODO: This should not be called from the DataChannel thread.
  85.      *
  86.      * @param transactionId
  87.      * @param code
  88.      * @param info
  89.      */
  90.     public void notifyErrorResponse(String transactionId,
  91.             int code, String info) {
  92.         AsyncTransaction tx;
  93.         synchronized(mClientTransactions) {
  94.             tx = mClientTransactions.get(transactionId);
  95.         }
  96.         if (tx != null) {
  97.             tx.notifyError(new ImErrorInfo(code, info));
  98.         } else {
  99.             ImpsLog.log("Ignoring possible server transaction error " + code + info);
  100.         }
  101.     }
  102.     /**
  103.      * Notifies the TransactionManager that a new primitive from the server has
  104.      * arrived.
  105.      *
  106.      * @param primitive the incoming primitive.
  107.      */
  108.     public void notifyIncomingPrimitive(Primitive primitive) {
  109.         String transactionId = primitive.getTransactionID();
  110.         if (primitive.getTransactionMode() == TransactionMode.Response) {
  111.             AsyncTransaction tx;
  112.             synchronized(mClientTransactions) {
  113.                 tx = mClientTransactions.get(transactionId);
  114.             }
  115.             // The transaction might has been terminated by the client,
  116.             // just ignore the incoming primitive in that case.
  117.             if (tx != null) {
  118.                 tx.notifyResponse(primitive);
  119.             }
  120.         } else {
  121.             ServerTransaction serverTx = new ServerTransaction(transactionId,
  122.                     mConnection, primitive);
  123.             ServerTransactionListener listener;
  124.             synchronized(mServerTransactionListeners) {
  125.                 listener = mServerTransactionListeners.get(primitive.getType());
  126.             }
  127.             if (listener != null) {
  128.                 listener.notifyServerTransaction(serverTx);
  129.             } else {
  130.                 ImpsLog.log("Unhandled Server transaction: " + primitive.getType());
  131.             }
  132.         }
  133.     }
  134.     /**
  135.      * Generates a new transaction ID.
  136.      *
  137.      * @return a new transaction ID.
  138.      */
  139.     private synchronized String nextTransactionId() {
  140.         if(mTransactionId >= 999) {
  141.             mTransactionId = 0;
  142.         }
  143.         return String.valueOf(++mTransactionId);
  144.     }
  145. }