Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'classpath/gnu/java/net/protocol/ikvmres/Handler.java')
-rw-r--r--classpath/gnu/java/net/protocol/ikvmres/Handler.java329
1 files changed, 0 insertions, 329 deletions
diff --git a/classpath/gnu/java/net/protocol/ikvmres/Handler.java b/classpath/gnu/java/net/protocol/ikvmres/Handler.java
deleted file mode 100644
index e122c484..00000000
--- a/classpath/gnu/java/net/protocol/ikvmres/Handler.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- Copyright (C) 2002, 2003, 2004, 2005, 2006 Jeroen Frijters
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jeroen Frijters
- jeroen@frijters.net
-
-*/
-
-package gnu.java.net.protocol.ikvmres;
-
-import cli.System.Reflection.Assembly;
-import java.net.*;
-import java.io.*;
-
-class IkvmresURLConnection extends URLConnection
-{
- private InputStream inputStream;
-
- IkvmresURLConnection(URL url)
- {
- super(url);
- doOutput = false;
- }
-
- public void connect() throws IOException
- {
- if(!connected)
- {
- String assembly = url.getHost();
- String resource = url.getFile();
- if(assembly == null || resource == null || !resource.startsWith("/"))
- {
- throw new MalformedURLException(url.toString());
- }
- try
- {
- inputStream = Handler.readResourceFromAssembly(assembly, url.getPort(), resource);
- connected = true;
- }
- catch(cli.System.IO.FileNotFoundException x)
- {
- throw (IOException)new FileNotFoundException(assembly).initCause(x);
- }
- catch(cli.System.BadImageFormatException x1)
- {
- throw (IOException)new IOException().initCause(x1);
- }
- catch(cli.System.Security.SecurityException x2)
- {
- throw (IOException)new IOException().initCause(x2);
- }
- }
- }
-
- public InputStream getInputStream() throws IOException
- {
- if(!connected)
- {
- connect();
- }
- return inputStream;
- }
-
- public OutputStream getOutputStream() throws IOException
- {
- throw new IOException("resource URLs are read only");
- }
-
- public long getLastModified()
- {
- return -1;
- }
-
- public int getContentLength()
- {
- return -1;
- }
-}
-
-public class Handler extends URLStreamHandler
-{
- private static final String RFC2396_DIGIT = "0123456789";
- private static final String RFC2396_LOWALPHA = "abcdefghijklmnopqrstuvwxyz";
- private static final String RFC2396_UPALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- private static final String RFC2396_ALPHA = RFC2396_LOWALPHA + RFC2396_UPALPHA;
- private static final String RFC2396_ALPHANUM = RFC2396_DIGIT + RFC2396_ALPHA;
- private static final String RFC2396_MARK = "-_.!~*'()";
- private static final String RFC2396_UNRESERVED = RFC2396_ALPHANUM + RFC2396_MARK;
- private static final String RFC2396_REG_NAME = RFC2396_UNRESERVED + "$,;:@&=+";
- private static final String RFC2396_PCHAR = RFC2396_UNRESERVED + ":@&=+$,";
- private static final String RFC2396_SEGMENT = RFC2396_PCHAR + ";";
- private static final String RFC2396_PATH_SEGMENTS = RFC2396_SEGMENT + "/";
-
- static InputStream readResourceFromAssembly(String assembly, int port, String resource)
- throws cli.System.IO.FileNotFoundException,
- cli.System.BadImageFormatException,
- cli.System.Security.SecurityException,
- IOException
- {
- if(assembly.equals("gen") && port != -1 && resource.endsWith(".class") && resource.indexOf('.') == resource.length() - 6)
- {
- ClassLoader loader = GetGenericClassLoaderById(port);
- try
- {
- Class c = Class.forName(resource.substring(1, resource.length() - 6).replace('/', '.'), false, loader);
- return new ByteArrayInputStream(GenerateStub(c));
- }
- catch(ClassNotFoundException _)
- {
- }
- catch(LinkageError _)
- {
- }
- }
- return readResourceFromAssembly(LoadAssembly(assembly), resource);
- }
-
- public static InputStream readResourceFromAssembly(Assembly asm, String resource)
- throws IOException
- {
- try
- {
- if(false) throw new cli.System.Security.SecurityException();
- if(false) throw new cli.System.IO.FileNotFoundException();
- if(false) throw new cli.System.IO.IOException();
- return new ikvm.io.InputStreamWrapper(ReadResourceFromAssemblyImpl(asm, resource));
- }
- catch (cli.System.Security.SecurityException x)
- {
- throw (IOException)new IOException().initCause(x);
- }
- catch (cli.System.IO.FileNotFoundException x)
- {
- if(resource.endsWith(".class") && resource.indexOf('.') == resource.length() - 6)
- {
- Class c = LoadClassFromAssembly(asm, resource.substring(1, resource.length() - 6).replace('/', '.'));
- if(c != null)
- {
- return new ByteArrayInputStream(GenerateStub(c));
- }
- }
- throw (FileNotFoundException)new FileNotFoundException().initCause(x);
- }
- catch(cli.System.IO.IOException x)
- {
- throw (IOException)new IOException().initCause(x);
- }
- }
-
- private static native byte[] GenerateStub(Class c);
- private static native cli.System.IO.Stream ReadResourceFromAssemblyImpl(Assembly asm, String resource);
- private static native Class LoadClassFromAssembly(Assembly asm, String className);
- private static native Assembly LoadAssembly(String name)
- throws cli.System.IO.FileNotFoundException, cli.System.BadImageFormatException, cli.System.Security.SecurityException;
- private static native ClassLoader GetGenericClassLoaderById(int id);
-
- protected URLConnection openConnection(URL url) throws IOException
- {
- return new IkvmresURLConnection(url);
- }
-
- protected void parseURL(URL url, String url_string, int start, int end)
- {
- try
- {
- // NOTE originally I wanted to use java.net.URI to handling parsing and constructing of these things,
- // but it turns out that URI uses regex and that depends on resource loading...
- url_string = url_string.substring(start, end);
- if(url_string.startsWith("//"))
- {
- int slash = url_string.indexOf('/', 2);
- if(slash == -1)
- {
- throw new RuntimeException("ikvmres: URLs must contain path");
- }
- String assembly = unquote(url_string.substring(2, slash));
- String file = unquote(url_string.substring(slash));
- setURL(url, "ikvmres", assembly, -1, file, null);
- }
- else if(url_string.startsWith("/"))
- {
- setURL(url, "ikvmres", url.getHost(), -1, url_string, null);
- }
- else
- {
- String[] baseparts = ((cli.System.String)(Object)url.getFile()).Split(new char[] { '/' });
- String[] relparts = ((cli.System.String)(Object)url_string).Split(new char[] { '/' });
- String[] target = new String[baseparts.length + relparts.length - 1];
- for(int i = 1; i < baseparts.length; i++)
- {
- target[i - 1] = baseparts[i];
- }
- int p = baseparts.length - 2;
- for(int i = 0; i < relparts.length; i++)
- {
- if(relparts[i].equals("."))
- {
- }
- else if(relparts[i].equals(".."))
- {
- p = Math.max(0, p - 1);
- }
- else
- {
- target[p++] = relparts[i];
- }
- }
- StringBuffer file = new StringBuffer();
- for(int i = 0; i < p; i++)
- {
- file.append('/').append(target[i]);
- }
- setURL(url, "ikvmres", url.getHost(), -1, file.toString(), null);
- }
- }
- catch(URISyntaxException x)
- {
- throw new RuntimeException(x.getMessage());
- }
- }
-
- protected String toExternalForm(URL url)
- {
- // NOTE originally I wanted to use java.net.URI to handle parsing and constructing of these things,
- // but it turns out that URI uses regex and that depends on resource loading...
- return "ikvmres://" + quote(url.getHost(), RFC2396_REG_NAME) + quote(url.getFile(), RFC2396_PATH_SEGMENTS);
- }
-
- protected InetAddress getHostAddress(URL url)
- {
- return null;
- }
-
- private static String quote (String str, String legalCharacters)
- {
- StringBuffer sb = new StringBuffer(str.length());
- for (int i = 0; i < str.length(); i++)
- {
- char c = str.charAt(i);
- if (legalCharacters.indexOf(c) == -1)
- {
- String hex = "0123456789ABCDEF";
- if (c <= 127)
- {
- sb.append('%')
- .append(hex.charAt(c / 16))
- .append(hex.charAt(c % 16));
- }
- else
- {
- try
- {
- // this is far from optimal, but it works
- byte[] utf8 = str.substring(i, i + 1).getBytes("utf-8");
- for (int j = 0; j < utf8.length; j++)
- {
- sb.append('%')
- .append(hex.charAt((utf8[j] & 0xff) / 16))
- .append(hex.charAt((utf8[j] & 0xff) % 16));
- }
- }
- catch (java.io.UnsupportedEncodingException x)
- {
- throw (Error)new InternalError().initCause(x);
- }
- }
- }
- else
- {
- sb.append(c);
- }
- }
- return sb.toString();
- }
-
- private static String unquote (String str)
- throws URISyntaxException
- {
- if (str == null)
- return null;
- byte[] buf = new byte[str.length()];
- int pos = 0;
- for (int i = 0; i < str.length(); i++)
- {
- char c = str.charAt(i);
- if (c > 127)
- throw new URISyntaxException(str, "Invalid character");
- if (c == '%')
- {
- if (i + 2 >= str.length())
- throw new URISyntaxException(str, "Invalid quoted character");
- String hex = "0123456789ABCDEF";
- int hi = hex.indexOf(str.charAt(++i));
- int lo = hex.indexOf(str.charAt(++i));
- if (lo < 0 || hi < 0)
- throw new URISyntaxException(str, "Invalid quoted character");
- buf[pos++] = (byte)(hi * 16 + lo);
- }
- else
- {
- buf[pos++] = (byte)c;
- }
- }
- try
- {
- return new String(buf, 0, pos, "utf-8");
- }
- catch (java.io.UnsupportedEncodingException x2)
- {
- throw (Error)new InternalError().initCause(x2);
- }
- }
-}