CharsetCallback.java
12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/*
* Decompiled with CFR 0_118.
*/
package com.adobe.agl.charset;
import com.adobe.agl.charset.CharsetDecoderICU;
import com.adobe.agl.charset.CharsetEncoderICU;
import com.adobe.agl.charset.CharsetICU;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
import java.nio.charset.CoderResult;
public class CharsetCallback {
static final String SUB_STOP_ON_ILLEGAL = "i";
static final String SKIP_STOP_ON_ILLEGAL = "i";
static final String ESCAPE_ICU = null;
static final String ESCAPE_JAVA = "J";
static final String ESCAPE_C = "C";
static final String ESCAPE_XML_DEC = "D";
static final String ESCAPE_XML_HEX = "X";
static final String ESCAPE_UNICODE = "U";
static final String ESCAPE_CSS2 = "S";
public static final Encoder FROM_U_CALLBACK_SKIP = new Encoder(){
public CoderResult call(CharsetEncoderICU encoder, Object context, CharBuffer source, ByteBuffer target, IntBuffer offsets, char[] buffer, int length, int cp, CoderResult cr) {
if (context == null) {
return CoderResult.UNDERFLOW;
}
if (((String)context).equals("i")) {
if (!cr.isUnmappable()) {
return cr;
}
return CoderResult.UNDERFLOW;
}
return cr;
}
};
public static final Decoder TO_U_CALLBACK_SKIP = new Decoder(){
public CoderResult call(CharsetDecoderICU decoder, Object context, ByteBuffer source, CharBuffer target, IntBuffer offsets, char[] buffer, int length, CoderResult cr) {
if (context == null) {
return CoderResult.UNDERFLOW;
}
if (((String)context).equals("i")) {
if (!cr.isUnmappable()) {
return cr;
}
return CoderResult.UNDERFLOW;
}
return cr;
}
};
public static final Encoder FROM_U_CALLBACK_SUBSTITUTE = new Encoder(){
public CoderResult call(CharsetEncoderICU encoder, Object context, CharBuffer source, ByteBuffer target, IntBuffer offsets, char[] buffer, int length, int cp, CoderResult cr) {
if (context == null) {
return encoder.cbFromUWriteSub(encoder, source, target, offsets);
}
if (((String)context).equals("i")) {
if (!cr.isUnmappable()) {
return cr;
}
return encoder.cbFromUWriteSub(encoder, source, target, offsets);
}
return cr;
}
};
private static final char[] kSubstituteChar1 = new char[]{'\u001a'};
private static final char[] kSubstituteChar = new char[]{'\ufffd'};
public static final Decoder TO_U_CALLBACK_SUBSTITUTE = new Decoder(){
public CoderResult call(CharsetDecoderICU decoder, Object context, ByteBuffer source, CharBuffer target, IntBuffer offsets, char[] buffer, int length, CoderResult cr) {
CharsetICU cs = (CharsetICU)decoder.charset();
if (decoder.invalidCharLength == 1 && cs.subChar1 != 0) {
return CharsetDecoderICU.toUWriteUChars(decoder, kSubstituteChar1, 0, 1, target, offsets, source.position());
}
return CharsetDecoderICU.toUWriteUChars(decoder, kSubstituteChar, 0, 1, target, offsets, source.position());
}
};
public static final Encoder FROM_U_CALLBACK_STOP = new Encoder(){
public CoderResult call(CharsetEncoderICU encoder, Object context, CharBuffer source, ByteBuffer target, IntBuffer offsets, char[] buffer, int length, int cp, CoderResult cr) {
return cr;
}
};
public static final Decoder TO_U_CALLBACK_STOP = new Decoder(){
public CoderResult call(CharsetDecoderICU decoder, Object context, ByteBuffer source, CharBuffer target, IntBuffer offsets, char[] buffer, int length, CoderResult cr) {
return cr;
}
};
private static final int VALUE_STRING_LENGTH = 32;
private static final char UNICODE_PERCENT_SIGN_CODEPOINT = '%';
private static final char UNICODE_U_CODEPOINT = 'U';
private static final char UNICODE_X_CODEPOINT = 'X';
private static final char UNICODE_RS_CODEPOINT = '\\';
private static final char UNICODE_U_LOW_CODEPOINT = 'u';
private static final char UNICODE_X_LOW_CODEPOINT = 'x';
private static final char UNICODE_AMP_CODEPOINT = '&';
private static final char UNICODE_HASH_CODEPOINT = '#';
private static final char UNICODE_SEMICOLON_CODEPOINT = ';';
private static final char UNICODE_PLUS_CODEPOINT = '+';
private static final char UNICODE_LEFT_CURLY_CODEPOINT = '{';
private static final char UNICODE_RIGHT_CURLY_CODEPOINT = '}';
private static final char UNICODE_SPACE_CODEPOINT = ' ';
public static final Encoder FROM_U_CALLBACK_ESCAPE = new Encoder(){
public CoderResult call(CharsetEncoderICU encoder, Object context, CharBuffer source, ByteBuffer target, IntBuffer offsets, char[] buffer, int length, int cp, CoderResult cr) {
char[] valueString = new char[32];
int valueStringLength = 0;
int i = 0;
cr = CoderResult.UNDERFLOW;
if (context == null || !(context instanceof String)) {
while (i < length) {
valueString[valueStringLength++] = 37;
valueString[valueStringLength++] = 85;
valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[i++] & 65535, 16, 4);
}
} else if (((String)context).equals("J")) {
while (i < length) {
valueString[valueStringLength++] = 92;
valueString[valueStringLength++] = 117;
valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[i++] & 65535, 16, 4);
}
} else if (((String)context).equals("C")) {
valueString[valueStringLength++] = 92;
if (length == 2) {
valueString[valueStringLength++] = 85;
valueStringLength = CharsetCallback.itou(valueString, valueStringLength, cp, 16, 8);
} else {
valueString[valueStringLength++] = 117;
valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[0] & 65535, 16, 4);
}
} else if (((String)context).equals("D")) {
valueString[valueStringLength++] = 38;
valueString[valueStringLength++] = 35;
valueStringLength = length == 2 ? (valueStringLength += CharsetCallback.itou(valueString, valueStringLength, cp, 10, 0)) : (valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[0] & 65535, 10, 0));
valueString[valueStringLength++] = 59;
} else if (((String)context).equals("X")) {
valueString[valueStringLength++] = 38;
valueString[valueStringLength++] = 35;
valueString[valueStringLength++] = 120;
valueStringLength = length == 2 ? (valueStringLength += CharsetCallback.itou(valueString, valueStringLength, cp, 16, 0)) : (valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[0] & 65535, 16, 0));
valueString[valueStringLength++] = 59;
} else if (((String)context).equals("U")) {
valueString[valueStringLength++] = 123;
valueString[valueStringLength++] = 85;
valueString[valueStringLength++] = 43;
valueStringLength = length == 2 ? (valueStringLength += CharsetCallback.itou(valueString, valueStringLength, cp, 16, 4)) : (valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[0] & 65535, 16, 4));
valueString[valueStringLength++] = 125;
} else if (((String)context).equals("S")) {
valueString[valueStringLength++] = 92;
valueStringLength += CharsetCallback.itou(valueString, valueStringLength, cp, 16, 0);
valueString[valueStringLength++] = 32;
} else {
while (i < length) {
valueString[valueStringLength++] = 37;
valueString[valueStringLength++] = 85;
valueStringLength += CharsetCallback.itou(valueString, valueStringLength, buffer[i++] & 65535, 16, 4);
}
}
cr = CoderResult.UNDERFLOW;
cr = encoder.cbFromUWriteUChars(encoder, CharBuffer.wrap(valueString, 0, valueStringLength), target, offsets);
return cr;
}
};
public static final Decoder TO_U_CALLBACK_ESCAPE = new Decoder(){
public CoderResult call(CharsetDecoderICU decoder, Object context, ByteBuffer source, CharBuffer target, IntBuffer offsets, char[] buffer, int length, CoderResult cr) {
char[] uniValueString = new char[32];
int valueStringLength = 0;
int i = 0;
if (context == null || !(context instanceof String)) {
while (i < length) {
uniValueString[valueStringLength++] = 37;
uniValueString[valueStringLength++] = 88;
valueStringLength += CharsetCallback.itou(uniValueString, valueStringLength, buffer[i++] & 255, 16, 2);
}
} else if (((String)context).equals("D")) {
while (i < length) {
uniValueString[valueStringLength++] = 38;
uniValueString[valueStringLength++] = 35;
valueStringLength += CharsetCallback.itou(uniValueString, valueStringLength, buffer[i++] & 255, 10, 0);
uniValueString[valueStringLength++] = 59;
}
} else if (((String)context).equals("X")) {
while (i < length) {
uniValueString[valueStringLength++] = 38;
uniValueString[valueStringLength++] = 35;
uniValueString[valueStringLength++] = 120;
valueStringLength += CharsetCallback.itou(uniValueString, valueStringLength, buffer[i++] & 255, 16, 0);
uniValueString[valueStringLength++] = 59;
}
} else if (((String)context).equals("C")) {
uniValueString[valueStringLength++] = 37;
uniValueString[valueStringLength++] = 88;
valueStringLength += CharsetCallback.itou(uniValueString, valueStringLength, buffer[i++] & 255, 16, 2);
} else {
while (i < length) {
uniValueString[valueStringLength++] = 37;
uniValueString[valueStringLength++] = 88;
CharsetCallback.itou(uniValueString, valueStringLength, buffer[i++] & 255, 16, 2);
valueStringLength += 2;
}
}
cr = CoderResult.UNDERFLOW;
CharsetDecoderICU.toUWriteUChars(decoder, uniValueString, 0, valueStringLength, target, offsets, 0);
return cr;
}
};
private static final int itou(char[] buffer, int sourceIndex, int i, int radix, int minwidth) {
int length = 0;
do {
int digit = i % radix;
buffer[sourceIndex + length++] = (char)(digit <= 9 ? 48 + digit : 48 + digit + 7);
} while ((i /= radix) != 0 && sourceIndex + length < buffer.length);
while (length < minwidth) {
buffer[sourceIndex + length++] = 48;
}
for (int j = 0; j < length / 2; ++j) {
char temp = buffer[sourceIndex + length - 1 - j];
buffer[sourceIndex + length - 1 - j] = buffer[sourceIndex + j];
buffer[sourceIndex + j] = temp;
}
return length;
}
public static interface Encoder {
public CoderResult call(CharsetEncoderICU var1, Object var2, CharBuffer var3, ByteBuffer var4, IntBuffer var5, char[] var6, int var7, int var8, CoderResult var9);
}
public static interface Decoder {
public CoderResult call(CharsetDecoderICU var1, Object var2, ByteBuffer var3, CharBuffer var4, IntBuffer var5, char[] var6, int var7, CoderResult var8);
}
}