package com.qiniu.android.storage;
import com.qiniu.android.common.AutoZone;
import com.qiniu.android.common.FixedZone;
import com.qiniu.android.common.Zone;
import com.qiniu.android.dns.DnsManager;
import com.qiniu.android.dns.IResolver;
import com.qiniu.android.dns.NetworkInfo;
import com.qiniu.android.dns.local.AndroidDnsServer;
import com.qiniu.android.dns.local.Resolver;
import com.qiniu.android.http.ProxyConfiguration;
import com.qiniu.android.http.UrlConverter;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
public final class Configuration {
/**
* 断点上传时的分块大小(默认的分块大小, 不建议改变)
*/
public static final int BLOCK_SIZE = 4 * 1024 * 1024;
public final Recorder recorder;
public final KeyGenerator keyGen;
public final ProxyConfiguration proxy;
/**
* 断点上传时的分片大小(可根据网络情况适当调整)
*/
public final int chunkSize;
/**
* 如果文件大小大于此值则使用断点上传, 否则使用Form上传
*/
public final int putThreshold;
/**
* 连接超时时间,单位 秒
*/
public final int connectTimeout;
/**
* 服务器响应超时时间 单位 秒
*/
public final int responseTimeout;
/**
* 上传失败重试次数
*/
public final int retryMax;
/**
* 特别定制的url转换
*/
public UrlConverter urlConverter;
/**
* dns 解析客户端
*/
public DnsManager dns;
/**
* 上传区域
*/
public Zone zone;
/**
* 使用https域名
*/
public boolean useHttps;
private Configuration(Builder builder) {
useHttps = builder.useHttps;
chunkSize = builder.chunkSize;
putThreshold = builder.putThreshold;
connectTimeout = builder.connectTimeout;
responseTimeout = builder.responseTimeout;
recorder = builder.recorder;
keyGen = getKeyGen(builder.keyGen);
retryMax = builder.retryMax;
proxy = builder.proxy;
urlConverter = builder.urlConverter;
zone = builder.zone == null ? AutoZone.autoZone : builder.zone;
dns = initDns(builder);
}
private static DnsManager initDns(Builder builder) {
DnsManager d = builder.dns;
return d;
}
private KeyGenerator getKeyGen(KeyGenerator keyGen) {
if (keyGen == null) {
keyGen = new KeyGenerator() {
@Override
public String gen(String key, File file) {
return key + "_._" + new StringBuffer(file.getAbsolutePath()).reverse();
}
};
}
return keyGen;
}
public static class Builder {
private Zone zone = null;
private Recorder recorder = null;
private KeyGenerator keyGen = null;
private ProxyConfiguration proxy = null;
private boolean useHttps = false;
private int chunkSize = 256 * 1024;
private int putThreshold = 512 * 1024;
private int connectTimeout = 10;
private int responseTimeout = 60;
private int retryMax = 3;
private UrlConverter urlConverter = null;
private DnsManager dns = null;
public Builder() {
IResolver r1 = AndroidDnsServer.defaultResolver();
IResolver r2 = null;
try {
r2 = new Resolver(InetAddress.getByName("119.29.29.29"));
} catch (IOException ex) {
ex.printStackTrace();
}
dns = new DnsManager(NetworkInfo.normal, new IResolver[]{r1, r2});
}
public Builder zone(Zone zone) {
this.zone = zone;
return this;
}
public Builder recorder(Recorder recorder) {
this.recorder = recorder;
return this;
}
public Builder recorder(Recorder recorder, KeyGenerator keyGen) {
this.recorder = recorder;
this.keyGen = keyGen;
return this;
}
public Builder proxy(ProxyConfiguration proxy) {
this.proxy = proxy;
return this;
}
public Builder chunkSize(int size) {
this.chunkSize = size;
return this;
}
public Builder putThreshhold(int size) {
this.putThreshold = size;
return this;
}
public Builder connectTimeout(int timeout) {
this.connectTimeout = timeout;
return this;
}
public Builder responseTimeout(int timeout) {
this.responseTimeout = timeout;
return this;
}
public Builder retryMax(int times) {
this.retryMax = times;
return this;
}
public Builder urlConverter(UrlConverter converter) {
this.urlConverter = converter;
return this;
}
public Builder dns(DnsManager dns) {
this.dns = dns;
return this;
}
public Builder useHttps(boolean useHttps) {
this.useHttps = useHttps;
return this;
}
public Configuration build() {
return new Configuration(this);
}
}
}