1340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang/*
2340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Copyright (C) 2013 The Android Open Source Project
3340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang *
4340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Licensed under the Apache License, Version 2.0 (the "License");
5340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * you may not use this file except in compliance with the License.
6340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * You may obtain a copy of the License at
7340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang *
8340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang *      http://www.apache.org/licenses/LICENSE-2.0
9340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang *
10340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Unless required by applicable law or agreed to in writing, software
11340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * distributed under the License is distributed on an "AS IS" BASIS,
12340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * See the License for the specific language governing permissions and
14340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * limitations under the License.
15340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang */
16340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
17340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangpackage com.android.settings.vpn2;
18340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
19340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport android.util.Log;
20340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
21340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport com.android.internal.net.VpnProfile;
22340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
23340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport org.xml.sax.Attributes;
24340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport org.xml.sax.SAXException;
25340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport org.xml.sax.helpers.DefaultHandler;
26340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
27340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.io.IOException;
28340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.io.InputStream;
29340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.util.HashMap;
30340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.util.Map;
31340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
32340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport javax.xml.parsers.ParserConfigurationException;
33340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport javax.xml.parsers.SAXParser;
34340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport javax.xml.parsers.SAXParserFactory;
35340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
36340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang/**
37340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Parse VPN profiles from an XML file
38340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang */
39340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangpublic class VpnProfileParser {
40340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang    private final static String TAG = "VpnProfileParser";
41340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang    private static Map<Integer, VpnInfo> mVpnPool = new HashMap<Integer, VpnInfo>();
42340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
43340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang    static DefaultHandler mHandler = new DefaultHandler() {
44340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean name;
45340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean type;
46340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean server;
47340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean username;
48340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean password;
49340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean dnsServers;
50340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean searchDomains;
51340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean routes;
52340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean mppe;
53340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean l2tpSecret;
54340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean ipsecIdentifier;
55340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean ipsecSecret;
56340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean ipsecUserCert;
57340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean ipsecCaCert;
58340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean ipsecServerCert;
59340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean certFile;
60340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        boolean certFilePassword;
61340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        VpnProfile profile = null;
62340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        VpnInfo vpnInfo = null;
63340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
64340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
65340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        @Override
66340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        public void startElement(String uri, String localName, String tagName,
67340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                Attributes attributes) throws SAXException {
68340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("vpn")) {
69340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                //create a new VPN profile
70340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile = new VpnProfile(Long.toHexString(System.currentTimeMillis()));
71340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                vpnInfo = new VpnInfo(profile);
72340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
73340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("name")) {
74340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                name = true;
75340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
76340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("type")) {
77340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                type = true;
78340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
79340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("server")) {
80340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                server = true;
81340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
82340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("username")) {
83340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                username = true;
84340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
85340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("password")) {
86340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                password = true;
87340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
88340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("dnsServers")) {
89340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                dnsServers = true;
90340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
91340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("searchDomains")) {
92340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                searchDomains = true;
93340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
94340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("mppe")) {
95340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                mppe = true;
96340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
97340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("l2tpSecret")) {
98340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                l2tpSecret = true;
99340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
100340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("ipsecIdentifier")) {
101340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecIdentifier = true;
102340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
103340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("ipsecSecret")) {
104340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecSecret = true;
105340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
106340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("ipsecUserCert")) {
107340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecUserCert = true;
108340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
109340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("ipsecCaCert")) {
110340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecCaCert = true;
111340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
112340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("ipsecServerCert")) {
113340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecServerCert = true;
114340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
115340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("routes")) {
116340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                routes = true;
117340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
118340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("cert-file")) {
119340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                certFile = true;
120340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
121340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("cert-file-password")) {
122340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                certFilePassword = true;
123340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
124340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        }
125340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
126340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        @Override
127340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        public void endElement(String uri, String localName, String tagName) throws SAXException {
128340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (tagName.equalsIgnoreCase("vpn")) {
129340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                mVpnPool.put(profile.type, vpnInfo);
130340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
131340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        }
132340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
133340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        @Override
134340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        public void characters(char ch[], int start, int length) throws SAXException {
135340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            String strValue = new String(ch, start, length);
136340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (name) {
137340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.name = strValue;
138340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                name = false;
139340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
140340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (type) {
141340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                int t = getVpnProfileType(strValue);
142340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                if (t < 0) {
143340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                    throw new SAXException("not a valid VPN type");
144340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                } else {
145340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                    profile.type = t;
146340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                }
147340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                type = false;
148340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
149340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (server) {
150340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.server = strValue;
151340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                server = false;
152340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
153340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (username) {
154340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.username = strValue;
155340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                username = false;
156340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
157340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (password) {
158340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.password = strValue;
159340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                password = false;
160340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
161340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (dnsServers) {
162340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.dnsServers = strValue;
163340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                dnsServers = false;
164340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
165340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (searchDomains) {
166340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.searchDomains = strValue;
167340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                searchDomains = false;
168340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
169340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (mppe) {
170340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.mppe = Boolean.valueOf(strValue);
171340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                mppe = false;
172340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
173340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (l2tpSecret) {
174340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.l2tpSecret = strValue;
175340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                l2tpSecret = false;
176340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
177340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (ipsecIdentifier) {
178340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.ipsecIdentifier = strValue;
179340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecIdentifier = false;
180340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
181340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (ipsecSecret) {
182340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.ipsecSecret = strValue;
183340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecSecret = false;
184340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
185340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (ipsecUserCert) {
186340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.ipsecUserCert = strValue;
187340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecUserCert = false;
188340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
189340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (ipsecCaCert) {
190340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.ipsecCaCert = strValue;
191340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecCaCert = false;
192340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
193340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (ipsecServerCert) {
194340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.ipsecServerCert = strValue;
195340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                ipsecServerCert = false;
196340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
197340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (routes) {
198340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                profile.routes = strValue;
199340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                routes = false;
200340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
201340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (certFile) {
202340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                vpnInfo.setCertificateFile(strValue);
203340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                certFile = false;
204340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
205340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (certFilePassword) {
206340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                vpnInfo.setPassword(strValue);
207340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                certFilePassword = false;
208340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
209340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        }
210340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
211340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        private int getVpnProfileType(String type) {
212340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            if (type.equalsIgnoreCase("TYPE_PPTP")) {
213340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return VpnProfile.TYPE_PPTP;
214340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            } else if (type.equalsIgnoreCase("TYPE_L2TP_IPSEC_PSK")) {
215340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return VpnProfile.TYPE_L2TP_IPSEC_PSK;
216340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            } else if (type.equalsIgnoreCase("TYPE_L2TP_IPSEC_RSA")) {
217340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return VpnProfile.TYPE_L2TP_IPSEC_RSA;
218340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            } else if (type.equalsIgnoreCase("TYPE_IPSEC_XAUTH_PSK")) {
219340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return VpnProfile.TYPE_IPSEC_XAUTH_PSK;
220340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            } else if (type.equalsIgnoreCase("TYPE_IPSEC_XAUTH_RSA")) {
221340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return VpnProfile.TYPE_IPSEC_XAUTH_RSA;
222340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            } else if (type.equalsIgnoreCase("TYPE_IPSEC_HYBRID_RSA")) {
223340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return VpnProfile.TYPE_IPSEC_HYBRID_RSA;
224340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            } else {
225340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                Log.v(TAG, "Invalid VPN type: " + type);
226340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang                return -1;
227340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            }
228340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        }
229340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang    };
230340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang
231340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang    public static Map<Integer, VpnInfo> parse(InputStream in) {
232340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        try {
233340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            SAXParserFactory factory = SAXParserFactory.newInstance();
234340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            SAXParser saxParser = factory.newSAXParser();
235340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            saxParser.parse(in, mHandler);
236340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        } catch (SAXException e) {
237340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            Log.e(TAG, "Parse vpn profile exception: " + e.toString());
238340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        } catch (IOException e) {
239340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            Log.e(TAG, "Parse vpn profile exception: " + e.toString());
240340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        } catch (ParserConfigurationException e) {
241340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            Log.e(TAG, "Parse vpn profile exception: " + e.toString());
242340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        } finally {
243340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang            return mVpnPool;
244340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang        }
245340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang    }
246340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang}
247