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

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.Map;
  19. import com.android.im.engine.ConnectionConfig;
  20. import com.android.im.engine.ImException;
  21. import com.android.im.imps.ImpsConstants.ImpsVersion;
  22. import com.android.im.plugin.ImpsConfigNames;
  23. /**
  24.  * The configuration for IMPS connection.
  25.  */
  26. public class ImpsConnectionConfig extends ConnectionConfig {
  27.     private static final int DEFAULT_KEEPALIVE_SECONDS  = 120;
  28.     private static final int DEFAULT_MIN_SERVER_POLL    = 30;    // seconds
  29.     // DeliveryReport is good for acknowledgment but consumes 2 extra
  30.     // transactions + 1 possible CIR notification per message. Should not
  31.     // be enabled on limited/slow connections.
  32.     private static final boolean NEED_DELIVERY_REPORT   = false;
  33.     private ImpsVersion mImpsVersion = ImpsVersion.IMPS_VERSION_12;
  34.     private TransportType mDataChannelBinding = TransportType.HTTP;
  35.     private CirMethod mCirChannelBinding = CirMethod.STCP;
  36.     private EncodingType mDataEncoding = EncodingType.WBXML;
  37.     private boolean mSecureLogin = true;    // default to use 4-way login
  38.     private boolean mBasicPresenceOnly = false;
  39.     private String mHost         = "";
  40.     private String mClientId     = "JiMMY";
  41.     private String mMsisdn;
  42.     private int mUdpPort = 3717;
  43.     private int mReplyTimeout = 45 * 1000;
  44.     private String mContentType;
  45.     private String mVersionNs;
  46.     private String mTransactionNs;
  47.     private String mPresenceNs;
  48.     private PresenceMapping mPresenceMapping;
  49.     private PasswordDigest mPasswordDigest;
  50.     private String mDefaultDomain;
  51.     private String mCustomPasswordDigest;
  52.     private String mCustomPresenceMapping;
  53.     private String mPluginPath;
  54.     public ImpsConnectionConfig() {
  55.         setupVersionStrings();
  56.     }
  57.     public ImpsConnectionConfig(Map<String, String> map) {
  58.         String dataChannel = map.get(ImpsConfigNames.DATA_CHANNEL);
  59.         try {
  60.             mDataChannelBinding = TransportType.valueOf(dataChannel);
  61.         } catch (IllegalArgumentException e) {
  62.             ImpsLog.log("Unknown DataChannel: " + dataChannel +", using HTTP");
  63.             mDataChannelBinding = TransportType.HTTP;
  64.         }
  65.         String dataEncoding = map.get(ImpsConfigNames.DATA_ENCODING);
  66.         try {
  67.             mDataEncoding = EncodingType.valueOf(dataEncoding);
  68.         } catch (IllegalArgumentException e) {
  69.             ImpsLog.log("Unknown DataEncoding: " + dataEncoding +", using WBXML");
  70.             mDataEncoding = EncodingType.WBXML;
  71.         }
  72.         String cirChannel = map.get(ImpsConfigNames.CIR_CHANNEL);
  73.         try {
  74.             mCirChannelBinding = CirMethod.valueOf(cirChannel);
  75.         } catch (IllegalArgumentException e) {
  76.             ImpsLog.log("Unknown CirChannel: " + cirChannel +", using TCP");
  77.             mCirChannelBinding = CirMethod.STCP;
  78.         }
  79.         mHost = map.get(ImpsConfigNames.HOST);
  80.         if (map.get(ImpsConfigNames.CLIENT_ID) != null) {
  81.             mClientId = map.get(ImpsConfigNames.CLIENT_ID);
  82.         }
  83.         if (map.get(ImpsConfigNames.MSISDN) != null) {
  84.             mMsisdn = map.get(ImpsConfigNames.MSISDN);
  85.         }
  86.         if (map.get(ImpsConfigNames.SECURE_LOGIN) != null) {
  87.             mSecureLogin = "true".equalsIgnoreCase(map.get(ImpsConfigNames.SECURE_LOGIN));
  88.         }
  89.         if (map.get(ImpsConfigNames.BASIC_PA_ONLY) != null) {
  90.             mBasicPresenceOnly = "true".equalsIgnoreCase(
  91.                 map.get(ImpsConfigNames.BASIC_PA_ONLY));
  92.         }
  93.         setupVersionStrings();
  94.         mDefaultDomain = map.get(ImpsConfigNames.DEFAULT_DOMAIN);
  95.         mPluginPath = map.get(ImpsConfigNames.PLUGIN_PATH);
  96.         mCustomPasswordDigest = map.get(ImpsConfigNames.CUSTOM_PASSWORD_DIGEST);
  97.         mCustomPresenceMapping = map.get(ImpsConfigNames.CUSTOM_PRESENCE_MAPPING);
  98.     }
  99.     @Override
  100.     public String getProtocolName() {
  101.         return "IMPS";
  102.     }
  103.     private void setupVersionStrings() {
  104.         if (mImpsVersion == ImpsVersion.IMPS_VERSION_12) {
  105.             if (mDataEncoding == EncodingType.XML) {
  106.                 mContentType = "application/vnd.wv.csp.xml";
  107.             } else if (mDataEncoding == EncodingType.WBXML) {
  108.                 mContentType = "application/vnd.wv.csp.wbxml";
  109.             } else if (mDataEncoding == EncodingType.SMS) {
  110.                 mContentType = "application/vnd.wv.csp.sms";
  111.             }
  112.             mVersionNs = ImpsConstants.VERSION_12_NS;
  113.             mTransactionNs = ImpsConstants.TRANSACTION_12_NS;
  114.             mPresenceNs = ImpsConstants.PRESENCE_12_NS;
  115.         } else if (mImpsVersion == ImpsVersion.IMPS_VERSION_13){
  116.             if (mDataEncoding == EncodingType.XML) {
  117.                 mContentType = "application/vnd.wv.csp+xml";
  118.             } else if (mDataEncoding == EncodingType.WBXML) {
  119.                 mContentType = "application/vnd.wv.csp+wbxml";
  120.             } else if (mDataEncoding == EncodingType.SMS) {
  121.                 mContentType = "application/vnd.wv.csp.sms";
  122.             }
  123.             mVersionNs = ImpsConstants.VERSION_13_NS;
  124.             mTransactionNs = ImpsConstants.TRANSACTION_13_NS;
  125.             mPresenceNs = ImpsConstants.PRESENCE_13_NS;
  126.         }
  127.     }
  128.     public String getClientId() {
  129.         return mClientId;
  130.     }
  131.     public String getMsisdn() {
  132.         return mMsisdn;
  133.     }
  134.     public boolean use4wayLogin() {
  135.         return mSecureLogin;
  136.     }
  137.     public boolean needDeliveryReport() {
  138.         return NEED_DELIVERY_REPORT;
  139.     }
  140.     /**
  141.      * Gets the type of protocol binding for data channel.
  142.      *
  143.      * @return the type of protocol binding for data channel.
  144.      */
  145.     public TransportType getDataChannelBinding() {
  146.         return mDataChannelBinding;
  147.     }
  148.     /**
  149.      * Gets the type of protocol binding for CIR channel.
  150.      *
  151.      * @return the type of protocol binding for CIR channel.
  152.      */
  153.     public CirMethod getCirChannelBinding() {
  154.         return mCirChannelBinding;
  155.     }
  156.     /**
  157.      * Gets the host name of the server.
  158.      *
  159.      * @return the host name of the server.
  160.      */
  161.     public String getHost() {
  162.         return mHost;
  163.     }
  164.     /**
  165.      * Sets the host name of the server.
  166.      *
  167.      * @param host the host name.
  168.      */
  169.     public void setHost(String host) {
  170.         mHost = host;
  171.     }
  172.     /**
  173.      * Gets the number of milliseconds to wait for a response from the server.
  174.      * The default value is 45 seconds.
  175.      *
  176.      * @return the milliseconds to wait for a response from the server
  177.      */
  178.     public int getReplyTimeout() {
  179.         return mReplyTimeout;
  180.     }
  181.     /**
  182.      * XXX: Workaround for the OZ IMPS GTalk server which supports only basic
  183.      * presence attributes and don't support GetAttributeList.
  184.      *
  185.      * @return <code>true</code> if only basic presence attribute is
  186.      *         supported.
  187.      */
  188.     public boolean supportBasicPresenceOnly() {
  189.         return mBasicPresenceOnly;
  190.     }
  191.     public String getTransportContentType() {
  192.         return mContentType;
  193.     }
  194.     public ImpsVersion getImpsVersion() {
  195.         return mImpsVersion;
  196.     }
  197.     // TODO: should remove this and let the serializer to handle all the name
  198.     // spaces.
  199.     public String getPresenceNs() {
  200.         return mPresenceNs;
  201.     }
  202.     public PrimitiveParser createPrimitiveParser() throws ImException {
  203.         if(mDataEncoding == EncodingType.WBXML) {
  204.             return new WbxmlPrimitiveParser();
  205.         } else if (mDataEncoding == EncodingType.XML) {
  206.             return new XmlPrimitiveParser();
  207.         } else if (mDataEncoding == EncodingType.SMS) {
  208.             return new PtsPrimitiveParser();
  209.         }
  210.         ImpsLog.log("Unknown DataEncoding: " + mDataEncoding);
  211.         return null;
  212.     }
  213.     public PrimitiveSerializer createPrimitiveSerializer() {
  214.         if(mDataEncoding == EncodingType.WBXML) {
  215.             return new WbxmlPrimitiveSerializer(mImpsVersion,
  216.                     mVersionNs, mTransactionNs);
  217.         } else if (mDataEncoding == EncodingType.XML) {
  218.             return new XmlPrimitiveSerializer(mVersionNs, mTransactionNs);
  219.         } else if (mDataEncoding == EncodingType.SMS) {
  220.             try {
  221.                 return new PtsPrimitiveSerializer(mImpsVersion);
  222.             } catch (SerializerException e) {
  223.                 ImpsLog.logError(e);
  224.                 return null;
  225.             }
  226.         }
  227.         ImpsLog.log("Unknown DataEncoding: " + mDataEncoding);
  228.         return null;
  229.     }
  230.     /**
  231.      * Gets the port number for the standalone UDP/IP CIR method. This is only
  232.      * useful when UDP CIR method is used. The default port number is 3717.
  233.      *
  234.      * @return the port number for the standalone UDP/IP CIR method.
  235.      */
  236.     public int getUdpPort() {
  237.         return mUdpPort;
  238.     }
  239.     public int getDefaultServerPollMin() {
  240.         return DEFAULT_MIN_SERVER_POLL;
  241.     }
  242.     public int getDefaultKeepAliveInterval() {
  243.         return DEFAULT_KEEPALIVE_SECONDS;
  244.     }
  245.     public PresenceMapping getPresenceMapping() {
  246.         if (mPresenceMapping != null) {
  247.             return mPresenceMapping;
  248.         }
  249.         if (mCustomPresenceMapping != null) {
  250.             try {
  251.                 mPresenceMapping = new CustomPresenceMapping(mPluginPath,
  252.                         mCustomPresenceMapping);
  253.             } catch (ImException e) {
  254.                 ImpsLog.logError("Failed to load custom presence mapping", e);
  255.             }
  256.         }
  257.         if (mPresenceMapping == null) {
  258.             mPresenceMapping = new DefaultPresenceMapping();
  259.         }
  260.         return mPresenceMapping;
  261.     }
  262.     public PasswordDigest getPasswordDigest() {
  263.         if (mPasswordDigest != null) {
  264.             return mPasswordDigest;
  265.         }
  266.         if (mCustomPasswordDigest != null) {
  267.             try {
  268.                 mPasswordDigest = new CustomPasswordDigest(mPluginPath, mCustomPasswordDigest);
  269.             } catch (ImException e) {
  270.                 ImpsLog.logError("Can't load custom password digest method", e);
  271.             }
  272.         }
  273.         if (mPasswordDigest == null) {
  274.             mPasswordDigest = new StandardPasswordDigest();
  275.         }
  276.         return mPasswordDigest;
  277.     }
  278.     public String getDefaultDomain() {
  279.         return mDefaultDomain;
  280.     }
  281.     /**
  282.      * Represents the type of protocol binding for data channel.
  283.      */
  284.     public static enum TransportType {
  285.         WAP, HTTP, HTTPS, SMS,
  286.     }
  287.     /**
  288.      * Represents the type of the data encoding.
  289.      */
  290.     public static enum EncodingType {
  291.         XML, WBXML, SMS,
  292.     }
  293.     /**
  294.      * Represents the type of protocol binding for CIR channel.
  295.      */
  296.     public static enum CirMethod {
  297.         /**
  298.          * WAP 1.2 or WAP 2.0 push using WSP unit push message and SMS as a
  299.          * bearer
  300.          */
  301.         WAPSMS,
  302.         /**
  303.          * WAP 1.2 or WAP 2.0 push using WSP unit push message and UDP/IP as a
  304.          * bearer
  305.          */
  306.         WAPUDP,
  307.         /**
  308.          * Standalone SMS binding
  309.          */
  310.         SSMS,
  311.         /**
  312.          * Standalone UDP/IP binding
  313.          */
  314.         SUDP,
  315.         /**
  316.          * Standalone TCP/IP binding
  317.          */
  318.         STCP,
  319.         /**
  320.          * Standalone HTTP binding
  321.          */
  322.         SHTTP,
  323.         /**
  324.          * No CIR channel
  325.          */
  326.         NONE,
  327.     }
  328. }