android: Create a new VpnService.Builder after VPN has been established

This commit is contained in:
Tobias Brunner
2012-09-06 11:25:24 +02:00
parent 4dbb193190
commit 0326ceda64
@@ -519,12 +519,19 @@ public class CharonVpnService extends VpnService implements Runnable
*/ */
public class BuilderAdapter public class BuilderAdapter
{ {
VpnService.Builder builder; private final String mName;
private VpnService.Builder mBuilder;
public BuilderAdapter(String name) public BuilderAdapter(String name)
{ {
builder = new CharonVpnService.Builder(); mName = name;
builder.setSession(name); mBuilder = createBuilder(name);
}
private VpnService.Builder createBuilder(String name)
{
VpnService.Builder builder = new CharonVpnService.Builder();
builder.setSession(mName);
/* even though the option displayed in the system dialog says "Configure" /* even though the option displayed in the system dialog says "Configure"
* we just use our main Activity */ * we just use our main Activity */
@@ -533,13 +540,14 @@ public class CharonVpnService extends VpnService implements Runnable
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, PendingIntent pending = PendingIntent.getActivity(context, 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK); Intent.FLAG_ACTIVITY_NEW_TASK);
builder.setConfigureIntent(pending); builder.setConfigureIntent(pending);
return builder;
} }
public synchronized boolean addAddress(String address, int prefixLength) public synchronized boolean addAddress(String address, int prefixLength)
{ {
try try
{ {
builder.addAddress(address, prefixLength); mBuilder.addAddress(address, prefixLength);
} }
catch (IllegalArgumentException ex) catch (IllegalArgumentException ex)
{ {
@@ -552,7 +560,7 @@ public class CharonVpnService extends VpnService implements Runnable
{ {
try try
{ {
builder.addDnsServer(address); mBuilder.addDnsServer(address);
} }
catch (IllegalArgumentException ex) catch (IllegalArgumentException ex)
{ {
@@ -565,7 +573,7 @@ public class CharonVpnService extends VpnService implements Runnable
{ {
try try
{ {
builder.addRoute(address, prefixLength); mBuilder.addRoute(address, prefixLength);
} }
catch (IllegalArgumentException ex) catch (IllegalArgumentException ex)
{ {
@@ -578,7 +586,7 @@ public class CharonVpnService extends VpnService implements Runnable
{ {
try try
{ {
builder.addSearchDomain(domain); mBuilder.addSearchDomain(domain);
} }
catch (IllegalArgumentException ex) catch (IllegalArgumentException ex)
{ {
@@ -591,7 +599,7 @@ public class CharonVpnService extends VpnService implements Runnable
{ {
try try
{ {
builder.setMtu(mtu); mBuilder.setMtu(mtu);
} }
catch (IllegalArgumentException ex) catch (IllegalArgumentException ex)
{ {
@@ -605,7 +613,7 @@ public class CharonVpnService extends VpnService implements Runnable
ParcelFileDescriptor fd; ParcelFileDescriptor fd;
try try
{ {
fd = builder.establish(); fd = mBuilder.establish();
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -616,6 +624,9 @@ public class CharonVpnService extends VpnService implements Runnable
{ {
return -1; return -1;
} }
/* now that the TUN device is created we don't need the current
* builder anymore, but we might need another when reestablishing */
mBuilder = createBuilder(mName);
return fd.detachFd(); return fd.detachFd();
} }
} }