1
2
3
4
5
6 package com.ozacc.mail.fetch.impl.sk_jp.io;
7
8 /***
9 * UTF-7のデコーダです。
10 * <p>
11 * </p>
12 * @author Shin
13 */
14 public class ByteToCharUTF7 extends sun.io.ByteToCharConverter {
15 public String getCharacterEncoding() {
16 return "UTF7";
17 }
18
19 public int flush(char[] chars, int off, int len) {
20 byteOff = 0;
21 charOff = 0;
22 b64Context = false;
23 currentB64Off = 0;
24 currentChar = 0;
25 return 0;
26 }
27 public void reset() {
28 byteOff = 0;
29 charOff = 0;
30 b64Context = false;
31 currentB64Off = 0;
32 currentChar = 0;
33 }
34
35 private boolean b64Context = false;
36 private int currentB64Off = 0;
37 private char currentChar = 0;
38
39 public int convert(
40 byte[] bytes,
41 int byteStart,
42 int byteEnd,
43 char[] chars,
44 int charStart,
45 int charEnd)
46 throws
47 sun.io.ConversionBufferFullException,
48 sun.io.UnknownCharacterException {
49 charOff = charStart;
50
51 for (byteOff = byteStart; byteOff < byteEnd; byteOff++) {
52 if (charOff >= charEnd) {
53 throw new sun.io.ConversionBufferFullException();
54 }
55 if (b64Context) {
56 if (bytes[byteOff] == '-') {
57 if (currentB64Off != 0 && currentChar > 0) {
58 chars[charOff] = currentChar;
59 charOff++;
60 }
61 b64Context = false;
62 continue;
63 }
64 int part =
65 (
66 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
67 + "abcdefghijklmnopqrstuvwxyz0123456789+/").indexOf(
68 bytes[byteOff]);
69 if (part == -1) {
70 throw new sun.io.UnknownCharacterException(
71 "Invalid UTF-7 code: " + (char)bytes[byteOff]);
72 }
73
74 switch (currentB64Off) {
75 case 0 :
76 currentChar = (char) (part << 10);
77 break;
78 case 1 :
79 currentChar |= (char) (part << 4);
80 break;
81 case 2 :
82 currentChar |= (char) (part >> 2);
83 chars[charOff] = currentChar;
84 charOff++;
85 currentChar = (char) ((part & 0x03) << 14);
86 break;
87 case 3 :
88 currentChar |= (char) (part << 8);
89 break;
90 case 4 :
91 currentChar |= (char) (part << 2);
92 break;
93 case 5 :
94 currentChar |= (char) (part >> 4);
95 chars[charOff] = currentChar;
96 charOff++;
97 currentChar = (char) ((part & 0x0f) << 12);
98 break;
99 case 6 :
100 currentChar |= (char) (part << 6);
101 break;
102 case 7 :
103 currentChar |= (char)part;
104 chars[charOff] = currentChar;
105 charOff++;
106 break;
107 }
108 currentB64Off = (currentB64Off + 1) % 8;
109 continue;
110 }
111
112 if (bytes[byteOff] == '+') {
113
114
115 b64Context = true;
116 currentB64Off = 0;
117 continue;
118 }
119 chars[charOff] = (char)bytes[byteOff];
120 charOff++;
121 }
122 return charOff - charStart;
123 }
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 }