/* * Copyright (C) 2007 Esmertec AG. Copyright (C) 2007 The Android Open Source * Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package info.guardianproject.otr.app.im.engine; import info.guardianproject.otr.app.im.plugin.xmpp.XmppAddress; import android.os.Parcel; import android.util.Log; /** * A helper for marshalling and unmarshaling an Address Object to a Parcel. The * Address is only an abstract representation, the underlying protocol * implementation MUST provide a public default constructor and register their * implementing class here. */ public class AddressParcelHelper { @SuppressWarnings("rawtypes") private static Class[] sAddressClasses = new Class[] { XmppAddress.class }; private AddressParcelHelper() { } public static Address readFromParcel(Parcel source) { int classIndex = source.readInt(); if (classIndex == -1) { return null; } if (classIndex < 0 || classIndex >= sAddressClasses.length) { throw new RuntimeException("Unknown Address type index: " + classIndex); } try { Address address = (Address) sAddressClasses[classIndex].newInstance(); address.readFromParcel(source); return address; } catch (InstantiationException e) { Log.e("AddressParcel", "Default constructor are required on Class" + sAddressClasses[classIndex].getName()); throw new RuntimeException(e); } catch (IllegalAccessException e) { Log.e("AddressParcel", "Default constructor are required on Class" + sAddressClasses[classIndex].getName()); throw new RuntimeException(e); } } public static void writeToParcel(Parcel dest, Address address) { if (address == null) { dest.writeInt(-1); } else { dest.writeInt(getClassIndex(address)); address.writeToParcel(dest); } } private static int getClassIndex(Address address) { for (int i = 0; i < sAddressClasses.length; i++) { if (address.getClass() == sAddressClasses[i]) { return i; } } throw new RuntimeException("Unregistered Address type: " + address); } }