| Index: src/org/adblockplus/android/configurators/ProxyConfigurators.java |
| diff --git a/src/org/adblockplus/android/configurators/ProxyConfigurators.java b/src/org/adblockplus/android/configurators/ProxyConfigurators.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7ccc99aa584b751587b663f02433ba446ff6d10c |
| --- /dev/null |
| +++ b/src/org/adblockplus/android/configurators/ProxyConfigurators.java |
| @@ -0,0 +1,148 @@ |
| +/* |
| + * This file is part of Adblock Plus <http://adblockplus.org/>, |
| + * Copyright (C) 2006-2014 Eyeo GmbH |
| + * |
| + * Adblock Plus is free software: you can redistribute it and/or modify |
| + * it under the terms of the GNU General Public License version 3 as |
| + * published by the Free Software Foundation. |
| + * |
| + * Adblock Plus is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +package org.adblockplus.android.configurators; |
| + |
| +import java.lang.reflect.Constructor; |
| +import java.net.InetAddress; |
| +import java.util.ArrayList; |
| +import java.util.HashMap; |
| + |
| +import org.adblockplus.android.Utils; |
| + |
| +import android.content.Context; |
| +import android.util.Log; |
| + |
| +/** |
| + * Common proxy configurator methods. |
| + */ |
| +public final class ProxyConfigurators |
| +{ |
| + private static final String TAG = Utils.getTag(ProxyConfigurators.class); |
| + private static final ArrayList<Class<?>> CONFIGURATORS = new ArrayList<Class<?>>(); |
| + private static final HashMap<ProxyRegistrationType, Class<?>> CONFIGURATOR_MAP = new HashMap<ProxyRegistrationType, Class<?>>(); |
| + private static final HashMap<Class<?>, ProxyRegistrationType> CONFIGURATOR_INV_MAP = new HashMap<Class<?>, ProxyRegistrationType>(); |
| + |
| + static |
| + { |
| + /* |
| + * Add new proxy-configurators here. |
| + * |
| + * Note: order of adding is important (as later added configurators act as fallbacks for earlier ones). |
| + */ |
| + add(CyanogenProxyConfigurator.class); |
| + add(IptablesProxyConfigurator.class); |
| + add(NativeProxyConfigurator.class); |
| + add(ManualProxyConfigurator.class); |
| + } |
| + |
| + private ProxyConfigurators() |
| + { |
| + // no instantiation |
| + } |
| + |
| + private static void add(final Class<?> clazz) |
| + { |
| + try |
| + { |
| + final Constructor<?> ctor = clazz.getConstructor(Context.class); |
| + final ProxyConfigurator pc = (ProxyConfigurator) ctor.newInstance((Context) null); |
| + final ProxyRegistrationType type = pc.getType(); |
| + |
| + if (!CONFIGURATOR_MAP.containsKey(type)) |
| + { |
| + CONFIGURATORS.add(clazz); |
| + CONFIGURATOR_MAP.put(type, clazz); |
| + CONFIGURATOR_INV_MAP.put(clazz, type); |
| + } |
| + else |
| + { |
| + // We fail hard here. |
| + throw new IllegalArgumentException("Duplicate proxy configurator (" + clazz + ") for type: " + type); |
| + } |
| + } |
| + catch (final Exception e) |
| + { |
| + // We fail hard here. |
| + throw new IllegalStateException("Failed to register proxy configurator (" + clazz + ")", e); |
| + } |
| + } |
| + |
| + private static ProxyConfigurator initialize(final Context context, final ProxyConfigurator from) |
| + { |
| + int i = 0; |
| + |
| + if (from != null) |
| + { |
| + // Scan through configurators to find last used one |
| + while (i < CONFIGURATORS.size() && !CONFIGURATORS.get(i).equals(from.getClass())) |
| + { |
| + i++; |
| + } |
| + // One after last-used |
| + i++; |
| + } |
| + |
| + // Loop through configurators until one succeeds to initialize |
| + while (i < CONFIGURATORS.size()) |
| + { |
| + try |
| + { |
| + final Class<?> clazz = CONFIGURATORS.get(i); |
| + final Constructor<?> ctor = clazz.getConstructor(Context.class); |
| + final ProxyConfigurator pc = (ProxyConfigurator) ctor.newInstance(context); |
| + if (pc.initialize()) |
| + { |
| + return pc; |
| + } |
| + } |
| + catch (final Exception e) |
| + { |
| + Log.d(TAG, "Configurator exception", e); |
| + // We don't need to handle exceptions here, only success matters |
| + } |
| + |
| + i++; |
| + } |
| + |
| + return null; |
| + } |
| + |
| + public static ProxyConfigurator registerProxy(final Context context, final InetAddress address, final int port) |
| + { |
| + ProxyConfigurator pc = null; |
| + |
| + do |
| + { |
| + pc = initialize(context, pc); |
| + |
| + if (pc != null) |
| + { |
| + if (pc.registerProxy(address, port)) |
| + { |
| + Log.d(TAG, "Using '" + pc.toString() + "'"); |
| + return pc; |
| + } |
| + |
| + pc.shutdown(); |
| + } |
| + } |
| + while (pc != null); |
| + |
| + return null; |
| + } |
| +} |