1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185aafac4db69e6d087c512cdfa5c7c0e2f1611681Jesse Wilsonpackage libcore.net.url;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Proxy;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URLConnection;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URLStreamHandler;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is the handler that is responsible for reading files from the file
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * system.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
305aafac4db69e6d087c512cdfa5c7c0e2f1611681Jesse Wilsonpublic class FileHandler extends URLStreamHandler {
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a connection to the a file pointed by this <code>URL</code> in
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the file system
35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return A connection to the resource pointed by this url.
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            URL The URL to which the connection is pointing to
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
42f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    public URLConnection openConnection(URL url) throws IOException {
43f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return openConnection(url, null);
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
475501a3d4b3d7657c183ed5446fe67fa011fbf70bElliott Hughes     * The behavior of this method is the same as openConnection(URL).
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>proxy</code> is not used in FileURLConnection.
49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
50f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @param url
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL which the connection is pointing to
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param proxy
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            Proxy
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a connection to the resource pointed by this url.
55f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this handler fails to establish a connection.
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
59f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the url argument is null.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedOperationException
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the protocol handler doesn't support this method.
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
64b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes    public URLConnection openConnection(URL url, Proxy proxy) throws IOException {
65b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        if (url == null) {
66b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("url == null");
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
68f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
69f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        String host = url.getHost();
70b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        if (host == null || host.isEmpty() || host.equalsIgnoreCase("localhost")) {
71f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return new FileURLConnection(url);
72f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
73f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
74f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // If a hostname is specified try to get the resource using FTP
75f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        URL ftpURL = new URL("ftp", host, url.getFile());
76b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        return (proxy == null) ? ftpURL.openConnection() : ftpURL.openConnection(proxy);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parse the <code>string</code>str into <code>URL</code> u which
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * already have the context properties. The string generally have the
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * following format: <code><center>/c:/windows/win.ini</center></code>.
83f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
845292410e4ebf7fb5149eefd2f52fcb94c46690a6Jesse Wilson     * @param url
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The URL object that's parsed into
865292410e4ebf7fb5149eefd2f52fcb94c46690a6Jesse Wilson     * @param spec
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The string equivalent of the specification URL
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The index in the spec string from which to begin parsing
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The index to stop parsing
92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.net.URLStreamHandler#toExternalForm(URL)
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.net.URL
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
975292410e4ebf7fb5149eefd2f52fcb94c46690a6Jesse Wilson    protected void parseURL(URL url, String spec, int start, int end) {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (end < start) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
101f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        String parseString = "";
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (start < end) {
1035292410e4ebf7fb5149eefd2f52fcb94c46690a6Jesse Wilson            parseString = spec.substring(start, end).replace('\\', '/');
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1055292410e4ebf7fb5149eefd2f52fcb94c46690a6Jesse Wilson        super.parseURL(url, parseString, 0, parseString.length());
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
108