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

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2007 Esmertec AG.
  3.  * Copyright (C) 2007 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 android.os.Parcel;
  19. import android.util.Log;
  20. import com.android.im.imps.ImpsContactListAddress;
  21. import com.android.im.imps.ImpsGroupAddress;
  22. import com.android.im.imps.ImpsUserAddress;
  23. /**
  24.  * A helper for marshalling and unmarshaling an Address Object to a Parcel.
  25.  * The Address is only an abstract representation, the underlying protocol
  26.  * implementation MUST provide a public default constructor and register
  27.  * their implementing class here.
  28.  */
  29. public class AddressParcelHelper {
  30.     private static Class[] sAddressClasses = new Class[] {
  31.         ImpsUserAddress.class,
  32.         ImpsGroupAddress.class,
  33.         ImpsContactListAddress.class,
  34.     };
  35.     private AddressParcelHelper() {
  36.     }
  37.     public static Address readFromParcel(Parcel source) {
  38.         int classIndex = source.readInt();
  39.         if(classIndex == -1) {
  40.             return null;
  41.         }
  42.         if(classIndex < 0 || classIndex >= sAddressClasses.length) {
  43.             throw new RuntimeException("Unknown Address type index: " + classIndex);
  44.         }
  45.         try {
  46.             Address address = (Address)sAddressClasses[classIndex].newInstance();
  47.             address.readFromParcel(source);
  48.             return address;
  49.         } catch (InstantiationException e) {
  50.             Log.e("AddressParcel", "Default constructor are required on Class"
  51.                     + sAddressClasses[classIndex].getName());
  52.             throw new RuntimeException(e);
  53.         } catch (IllegalAccessException e) {
  54.             Log.e("AddressParcel", "Default constructor are required on Class"
  55.                     + sAddressClasses[classIndex].getName());
  56.             throw new RuntimeException(e);
  57.         }
  58.     }
  59.     public static void writeToParcel(Parcel dest, Address address) {
  60.         if(address == null) {
  61.             dest.writeInt(-1);
  62.         } else {
  63.             dest.writeInt(getClassIndex(address));
  64.             address.writeToParcel(dest);
  65.         }
  66.     }
  67.     private static int getClassIndex(Address address) {
  68.         for(int i = 0; i < sAddressClasses.length; i++) {
  69.             if(address.getClass() == sAddressClasses[i]) {
  70.                 return i;
  71.             }
  72.         }
  73.         throw new RuntimeException("Unregistered Address type: " + address);
  74.     }
  75. }