+++ /dev/null
-/*\r
- * @(#) $Id: ByteToCharUTF7.java,v 1.1.2.1 2004/09/29 00:57:59 otsuka Exp $\r
- * $Revision: 1.1.2.1 $\r
- * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.\r
- */\r
-package com.ozacc.mail.fetch.impl.sk_jp.io;\r
-\r
-/**\r
- * UTF-7のデコーダです。\r
- * <p>\r
- * </p>\r
- * @author Shin\r
- */\r
-public class ByteToCharUTF7 extends sun.io.ByteToCharConverter {\r
- public String getCharacterEncoding() {\r
- return "UTF7";\r
- }\r
-\r
- public int flush(char[] chars, int off, int len) {\r
- byteOff = 0;\r
- charOff = 0;\r
- b64Context = false;\r
- currentB64Off = 0;\r
- currentChar = 0;\r
- return 0;\r
- }\r
- public void reset() {\r
- byteOff = 0;\r
- charOff = 0;\r
- b64Context = false;\r
- currentB64Off = 0;\r
- currentChar = 0;\r
- }\r
-\r
- private boolean b64Context = false;\r
- private int currentB64Off = 0;\r
- private char currentChar = 0;\r
-\r
- public int convert(\r
- byte[] bytes,\r
- int byteStart,\r
- int byteEnd,\r
- char[] chars,\r
- int charStart,\r
- int charEnd)\r
- throws\r
- sun.io.ConversionBufferFullException,\r
- sun.io.UnknownCharacterException {\r
- charOff = charStart;\r
-\r
- for (byteOff = byteStart; byteOff < byteEnd; byteOff++) {\r
- if (charOff >= charEnd) {\r
- throw new sun.io.ConversionBufferFullException();\r
- }\r
- if (b64Context) {\r
- if (bytes[byteOff] == '-') {\r
- if (currentB64Off != 0 && currentChar > 0) {\r
- chars[charOff] = currentChar;\r
- charOff++;\r
- }\r
- b64Context = false;\r
- continue;\r
- }\r
- int part =\r
- (\r
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\r
- + "abcdefghijklmnopqrstuvwxyz0123456789+/").indexOf(\r
- bytes[byteOff]);\r
- if (part == -1) {\r
- throw new sun.io.UnknownCharacterException(\r
- "Invalid UTF-7 code: " + (char)bytes[byteOff]);\r
- }\r
-\r
- switch (currentB64Off) {\r
- case 0 :\r
- currentChar = (char) (part << 10);\r
- break;\r
- case 1 :\r
- currentChar |= (char) (part << 4);\r
- break;\r
- case 2 :\r
- currentChar |= (char) (part >> 2);\r
- chars[charOff] = currentChar;\r
- charOff++;\r
- currentChar = (char) ((part & 0x03) << 14);\r
- break;\r
- case 3 :\r
- currentChar |= (char) (part << 8);\r
- break;\r
- case 4 :\r
- currentChar |= (char) (part << 2);\r
- break;\r
- case 5 :\r
- currentChar |= (char) (part >> 4);\r
- chars[charOff] = currentChar;\r
- charOff++;\r
- currentChar = (char) ((part & 0x0f) << 12);\r
- break;\r
- case 6 :\r
- currentChar |= (char) (part << 6);\r
- break;\r
- case 7 :\r
- currentChar |= (char)part;\r
- chars[charOff] = currentChar;\r
- charOff++;\r
- break;\r
- }\r
- currentB64Off = (currentB64Off + 1) % 8;\r
- continue;\r
- }\r
-\r
- if (bytes[byteOff] == '+') {\r
- // shift character\r
- // This is start of the Base64 sequence.\r
- b64Context = true;\r
- currentB64Off = 0;\r
- continue;\r
- }\r
- chars[charOff] = (char)bytes[byteOff];\r
- charOff++;\r
- }\r
- return charOff - charStart;\r
- }\r
-\r
- /*\r
- public static void main(String[] args) throws Exception {\r
- System.setProperty("file.encoding.pkg", "com.sk_jp.io");\r
- ByteArrayOutputStream o = new ByteArrayOutputStream();\r
- byte[] b = new byte[2048];\r
- int len;\r
- while ((len = System.in.read(b)) != -1) {\r
- o.write(b, 0, len);\r
- }\r
- byte[] bytes = o.toByteArray();\r
- \r
- System.out.println(new String(bytes, "UTF7"));\r
- }\r
- */\r
-}\r