package com.google.android.net;
import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache;
import android.content.Context;
import android.provider.Settings;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import com.android.internal.net.DbSSLSessionCache;
/**
* Factory that returns the appropriate implementation of a {@link SSLClientSessionCache} based
* on gservices.
*
* @hide
*/
// TODO: return a proxied implementation that is updated as the gservices value changes.
public final class SSLClientSessionCacheFactory {
private static final String TAG = "SSLClientSessionCacheFactory";
public static final String DB = "db";
public static final String FILE = "file";
// utility class
private SSLClientSessionCacheFactory() {}
/**
* Returns a new {@link SSLClientSessionCache} based on the persistent cache that's specified,
* if any, in gservices. If no cache is specified, returns null.
* @param context The application context used for the per-process persistent cache.
* @return A new {@link SSLClientSessionCache}, or null if no persistent cache is configured.
*/
public static SSLClientSessionCache getCache(Context context) {
String type = Settings.Gservices.getString(context.getContentResolver(),
Settings.Gservices.SSL_SESSION_CACHE);
if (type != null) {
if (DB.equals(type)) {
return DbSSLSessionCache.getInstanceForPackage(context);
} else if (FILE.equals(type)) {
File dir = context.getFilesDir();
File cacheDir = new File(dir, "sslcache");
if (!cacheDir.exists()) {
cacheDir.mkdir();
}
try {
return FileClientSessionCache.usingDirectory(cacheDir);
} catch (IOException ioe) {
Log.w(TAG, "Unable to create FileClientSessionCache in " + cacheDir.getName(), ioe);
return null;
}
} else {
Log.w(TAG, "Ignoring unrecognized type: '" + type + "'");
}
}
return null;
}
}