ImpsAddress.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.imps;
  18. import android.os.Parcel;
  19. import com.android.im.engine.Address;
  20. import com.android.im.engine.ImEntity;
  21. /**
  22.  * The abstract representation of an IMPS address.
  23.  */
  24. public abstract class ImpsAddress extends Address {
  25.     private static final char[] SPECIALS = {'/', '@', '+'};
  26.     protected String mUser;
  27.     protected String mResource;
  28.     protected String mDomain;
  29.     private String mFullAddress;
  30.     protected ImpsAddress() {
  31.     }
  32.     protected ImpsAddress(String user, String resource, String domain) {
  33.         // build the full address and unify the fields to lower case since imps
  34.         // address is case insensitive.
  35.         StringBuilder buf = new StringBuilder(ImpsConstants.ADDRESS_PREFIX);
  36.         if(user != null) {
  37.             buf.append(user.toLowerCase());
  38.         }
  39.         if(resource != null) {
  40.             buf.append('/').append(resource.toLowerCase());
  41.         }
  42.         if(domain != null) {
  43.             buf.append('@').append(domain.toLowerCase());
  44.         }
  45.         mFullAddress = buf.toString();
  46.         mUser = user;
  47.         mResource = resource;
  48.         mDomain = domain;
  49.         verifyAddress();
  50.     }
  51.     protected ImpsAddress(String full){
  52.         this(full, true);
  53.     }
  54.     protected ImpsAddress(String full, boolean verify) {
  55.         if (full == null || full.length() == 0) {
  56.             throw new IllegalArgumentException();
  57.         }
  58.         //TODO: escape reserved characters.
  59.         if(!full.startsWith(ImpsConstants.ADDRESS_PREFIX)) {
  60.             full = ImpsConstants.ADDRESS_PREFIX + full;
  61.         }
  62.         parse(full);
  63.         mFullAddress = full;
  64.         if (verify) {
  65.             verifyAddress();
  66.         }
  67.     }
  68.     private void parse(String full) {
  69.         mUser = parseUser(full);
  70.         mResource = parseResource(full);
  71.         mDomain = parseDomain(full);
  72.     }
  73.     private void verifyAddress() throws IllegalArgumentException {
  74.         ImpsLog.log("verifyAddress:" + mUser + ", " + mResource + ",  " + mDomain);
  75.         if(mUser == null && mResource == null) {
  76.             throw new IllegalArgumentException();
  77.         }
  78.         if(mUser != null) {
  79.             if(mUser.length() == 0) {
  80.                 throw new IllegalArgumentException("Invalid user");
  81.             }
  82.             if(mUser.charAt(0) == '+') {//mobile number
  83.                 for(int i = 1; i < mUser.length(); i++) {
  84.                     if(!Character.isDigit(mUser.charAt(i))) {
  85.                         throw new IllegalArgumentException("Invalid user");
  86.                     }
  87.                 }
  88.             } else if(!isAlphaSequence(mUser)) {
  89.                 throw new IllegalArgumentException("Invalid user");
  90.             }
  91.         }
  92.         if(mResource != null && !isAlphaSequence(mResource)) {
  93.             throw new IllegalArgumentException("Invalid resource");
  94.         }
  95.         if(mDomain != null && !isAlphaSequence(mDomain)) {
  96.             throw new IllegalArgumentException("Invalid domain");
  97.         }
  98.     }
  99.     /**
  100.      * Gets the User-part of the address which refers to the identification of
  101.      * the IMPS user.
  102.      *
  103.      * @return the User-part of the address.
  104.      */
  105.     public String getUser() {
  106.         return mUser;
  107.     }
  108.     /**
  109.      * Gets the Resource-part of the address which identifies the referred
  110.      * public or private resource.
  111.      *
  112.      * @return the Resource-part of the address.
  113.      */
  114.     public String getResource() {
  115.         return mResource;
  116.     }
  117.     /**
  118.      * Gets the Domain-part of the address which identifies the IMPS server
  119.      * domain.
  120.      *
  121.      * @return the Domain-part of the address.
  122.      */
  123.     public String getDomain() {
  124.         return mDomain;
  125.     }
  126.     /**
  127.      * Gets the full string representation of the address.
  128.      */
  129.     @Override
  130.     public String getFullName() {
  131.         return mFullAddress;
  132.     }
  133.     @Override
  134.     public void writeToParcel(Parcel dest) {
  135.         dest.writeString(mFullAddress);
  136.     }
  137.     @Override
  138.     public void readFromParcel(Parcel source) {
  139.         mFullAddress = source.readString();
  140.         parse(mFullAddress);
  141.     }
  142.     @Override
  143.     public boolean equals(Object other) {
  144.         return other instanceof ImpsAddress
  145.                 && mFullAddress.equalsIgnoreCase(((ImpsAddress)other).mFullAddress);
  146.     }
  147.     @Override
  148.     public int hashCode() {
  149.         return mFullAddress.toLowerCase().hashCode();
  150.     }
  151.     /**
  152.      * Formats the address to a PrimitiveElement which can be used as the
  153.      * content of Sender or Recipient.
  154.      *
  155.      * @return a PrimitiveElement.
  156.      */
  157.     public abstract PrimitiveElement toPrimitiveElement();
  158.     /**
  159.      * Gets the entity this address object refers to.
  160.      *
  161.      * @param connection
  162.      * @return the entity this address refers to or <code>null</code> if the
  163.      *         entity not found.
  164.      */
  165.     abstract ImEntity getEntity(ImpsConnection connection);
  166.     /**
  167.      * Constructs an ImpsAddress from the Sender or Recipient element in a
  168.      * primitive.
  169.      *
  170.      * @param elem the Sender of Recipient element.
  171.      * @return the ImpsAddress object or <code>null</code> if it's not a valid
  172.      *         element.
  173.      */
  174.     public static ImpsAddress fromPrimitiveElement(PrimitiveElement elem) {
  175.         String type = elem.getTagName();
  176.         if(ImpsTags.User.equals(type)) {
  177.             return new ImpsUserAddress(elem.getChildContents(ImpsTags.UserID), false);
  178.         } else if(ImpsTags.Group.equals(type)) {
  179.             PrimitiveElement child = elem.getFirstChild();
  180.             if(child == null) {
  181.                 throw new IllegalArgumentException();
  182.             }
  183.             if(ImpsTags.GroupID.equals(child.getTagName())){
  184.                 return new ImpsGroupAddress(child.getContents());
  185.             } else {
  186.                 String screeName = child.getChildContents(ImpsTags.SName);
  187.                 String groupId = child.getChildContents(ImpsTags.GroupID);
  188.                 return new ImpsGroupAddress(groupId, screeName);
  189.             }
  190.         } else if(ImpsTags.ContactList.equals(type)) {
  191.             return new ImpsContactListAddress(elem.getContents(), false);
  192.         } else {
  193.             throw new IllegalArgumentException();
  194.         }
  195.     }
  196.     private String parseUser(String full) {
  197.         int index = full.indexOf('/');
  198.         if(index == 3) {
  199.             return null;
  200.         }
  201.         if (index == -1) {
  202.             index = full.lastIndexOf('@');
  203.         }
  204.         if (index == -1) {
  205.             index = full.length();
  206.         }
  207.         return full.substring(3, index);
  208.     }
  209.     private String parseResource(String full) {
  210.         int beginIndex = full.indexOf('/');
  211.         if (beginIndex == -1) {
  212.             return null;
  213.         }
  214.         int endIndex = full.lastIndexOf('@');
  215.         if (endIndex == -1 || endIndex < beginIndex) {
  216.             endIndex = full.length();
  217.         }
  218.         return full.substring(beginIndex + 1, endIndex);
  219.     }
  220.     private String parseDomain(String full) {
  221.         int beginIndex = full.lastIndexOf('@');
  222.         return beginIndex == -1 ? null : full.substring(beginIndex + 1);
  223.     }
  224.     private boolean isAlphaSequence(String str) {
  225.         for(int i = 0; i < str.length(); i++) {
  226.             char ch = str.charAt(i);
  227.             if(ch < 32 || ch > 126 || isSpecial(ch)) {
  228.                 return false;
  229.             }
  230.         }
  231.         return true;
  232.     }
  233.     private boolean isSpecial(char ch) {
  234.         for (char element : SPECIALS) {
  235.             if(ch == element) {
  236.                 return true;
  237.             }
  238.         }
  239.         return false;
  240.     }
  241. }