1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.luni.internal.net.www.protocol.file;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.Proxy;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URL;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URLConnection;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URLStreamHandler;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is the handler that is responsible for reading files from the file
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * system.
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Handler extends URLStreamHandler {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a connection to the a file pointed by this <code>URL</code> in
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the file system
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return A connection to the resource pointed by this url.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param url
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            URL The URL to which the connection is pointing to
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
443819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    public URLConnection openConnection(URL url) throws IOException {
453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return openConnection(url, null);
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The behaviour of this method is the same as openConnection(URL).
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>proxy</code> is not used in FileURLConnection.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @param url
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the URL which the connection is pointing to
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param proxy
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            Proxy
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a connection to the resource pointed by this url.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this handler fails to establish a connection.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the url argument is null.
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the protocol handler doesn't support this method.
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public URLConnection openConnection(URL url, Proxy proxy)
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IOException {
683819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (null == url) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // K034b=url and proxy can not be null
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K034b")); //$NON-NLS-1$
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
723819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
733819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        String host = url.getHost();
743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (host == null || host.length() == 0
753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                || host.equalsIgnoreCase("localhost")) { //$NON-NLS-1$
763819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            return new FileURLConnection(url);
773819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        }
783819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
793819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        // If a hostname is specified try to get the resource using FTP
803819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        URL ftpURL = new URL("ftp", host, url.getFile()); //$NON-NLS-1$
813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        return (proxy == null) ? ftpURL.openConnection() : ftpURL
823819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                .openConnection(proxy);
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Parse the <code>string</code>str into <code>URL</code> u which
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * already have the context properties. The string generally have the
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * following format: <code><center>/c:/windows/win.ini</center></code>.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param u
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            The URL object that's parsed into
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param str
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            The string equivalent of the specification URL
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            The index in the spec string from which to begin parsing
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param end
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            The index to stop parsing
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.net.URLStreamHandler#toExternalForm(URL)
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.net.URL
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void parseURL(URL u, String str, int start, int end) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (end < start) {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String parseString = ""; //$NON-NLS-1$
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (start < end) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            parseString = str.substring(start, end).replace('\\', '/');
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.parseURL(u, parseString, 0, parseString.length());
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
114