/*
* Copyright 2011 yingxinwu.g@gmail.com
*
* 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 xink.vpn.wrapper;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.UUID;
import android.content.Context;
public abstract class VpnProfile extends AbstractWrapper {
private String username;
private String password;
private VpnState state = VpnState.UNKNOWN;
protected VpnProfile(final Context ctx, final String stubClass) {
super(ctx, stubClass);
}
public static VpnProfile newInstance(final VpnType vpnType, final Context ctx) {
Class<? extends VpnProfile> profileClass = vpnType.getProfileClass();
if (profileClass == null) {
throw new IllegalArgumentException("profile class is null for " + vpnType);
}
try {
return profileClass.getConstructor(Context.class).newInstance(ctx);
} catch (Exception e) {
throw new WrapperException("failed to create instance for " + vpnType, e);
}
}
public void postConstruct() {
setId(UUID.randomUUID().toString());
}
public void postUpdate() {
}
public void validate() {
}
public void preConnect() {
}
/**
* Sets an ID for this profile. The caller should make sure the uniqueness of the ID.
*/
public void setId(final String id) {
invokeStubMethod("setId", id);
}
public String getId() {
return invokeStubMethod("getId");
}
/**
* Sets a user-friendly name for this profile.
*/
public void setName(final String name) {
invokeStubMethod("setName", name);
}
public String getName() {
return invokeStubMethod("getName");
}
/**
* Sets the name of the VPN server. Used for DNS lookup.
*/
public void setServerName(final String name) {
invokeStubMethod("setServerName", name);
}
public String getServerName() {
return invokeStubMethod("getServerName");
}
public String getUsername() {
return username;
}
public void setUsername(final String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(final String password) {
this.password = password;
}
/**
* Sets the domain suffices for DNS resolution.
*
* @param entries
* a comma-separated(or space-separated) list of domain suffices
*/
public void setDomainSuffices(final String entries) {
invokeStubMethod("setDomainSuffices", entries);
}
public String getDomainSuffices() {
return invokeStubMethod("getDomainSuffices");
}
/**
* Sets the routing info for this VPN connection.
*
* @param entries
* a comma-separated(or space-separated) list of routes; each entry is in the format of
* "(network address)/(network mask)"
*/
public void setRouteList(final String entries) {
invokeStubMethod("setRouterList", entries);
}
public String getRouteList() {
return invokeStubMethod("getRouteList");
}
public Class<?> getGenericProfileClass() {
try {
return loadClass("android.net.vpn.VpnProfile");
} catch (ClassNotFoundException e) {
throw new WrapperException("load class failed", e);
}
}
public VpnState getState() {
return state;
}
public void setState(final VpnState state) {
this.state = state;
}
public abstract VpnType getType();
public void write(final ObjectOutputStream os) throws IOException {
os.writeObject(getType());
os.writeObject(getStub());
os.writeObject(username);
os.writeObject(password);
}
public void read(final Object obj, final ObjectInputStream is) throws Exception {
setStub(obj);
username = (String) is.readObject();
password = (String) is.readObject();
}
public boolean isCompatible(final Object obj) {
return getStubClass().equals(obj.getClass());
}
@Override
public String toString() {
return getId() + "#" + getName();
}
public boolean needKeyStoreToSave() {
return false;
}
public boolean needKeyStoreToConnect() {
return false;
}
@Override
public VpnProfile clone() {
VpnProfile c = (VpnProfile) super.clone();
c.setId(getId());
c.setName(getName());
c.setServerName(getServerName());
c.setDomainSuffices(getDomainSuffices());
return c;
}
public VpnProfile dulicateToConnect() {
return clone();
}
}