Changeset 36883 in vbox for trunk/src/VBox/Main/glue
- Timestamp:
- Apr 29, 2011 9:40:55 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 71461
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/glue/glue-java.xsl
r36814 r36883 288 288 <xsl:param name="type" /> 289 289 <xsl:param name="safearray" /> 290 <xsl:param name="forceelem" /> 291 292 <xsl:variable name="needarray" select="($safearray='yes') and not($forceelem='yes')" /> 293 294 <xsl:choose> 290 <xsl:param name="forceelem" /> 291 292 <xsl:choose> 295 293 <xsl:when test="($G_vboxGlueStyle='xpcom')"> 294 <xsl:variable name="needarray" select="($safearray='yes') and not($forceelem='yes')" /> 295 296 296 <xsl:choose> 297 297 <xsl:when test="$type='long long'"> … … 368 368 369 369 <xsl:when test="($G_vboxGlueStyle='jaxws')"> 370 <xsl:variable name="needarray" select="($safearray='yes' and not($type='octet')) and not($forceelem='yes')" /> 371 370 372 <xsl:if test="$needarray"> 371 373 <xsl:value-of select="'List<'" /> … … 388 390 </xsl:when> 389 391 392 <!-- we encode byte arrays as Base64 strings. --> 393 <xsl:when test="$type='octet'"> 394 <xsl:value-of select="'/*base64*/String'" /> 395 </xsl:when> 396 390 397 <xsl:when test="$type='long long'"> 391 398 <xsl:value-of select="'Long'" /> … … 405 412 406 413 <xsl:when test="$type='short'"> 407 <xsl:value-of select="'Short'" />408 </xsl:when>409 410 <xsl:when test="$type='octet'">411 414 <xsl:value-of select="'Short'" /> 412 415 </xsl:when> … … 650 653 </xsl:when> 651 654 <xsl:when test="$idltype='octet'"> 652 <xsl:value-of select="concat('Helper. wrapBytes(',$value,')')"/>655 <xsl:value-of select="concat('Helper.decodeBase64(',$value,')')"/> 653 656 </xsl:when> 654 657 <xsl:otherwise> … … 957 960 958 961 <xsl:when test="($idltype='octet') and ($safearray='yes')"> 959 <xsl:value-of select="concat('Helper. unwrapBytes(', $value,')')"/>962 <xsl:value-of select="concat('Helper.encodeBase64(', $value,')')"/> 960 963 </xsl:when> 961 964 … … 1031 1034 1032 1035 <xsl:when test="($idltype='octet') and ($safearray='yes')"> 1033 <xsl:value-of select="concat('Helper. unwrapBytes(',$value,')')"/>1036 <xsl:value-of select="concat('Helper.encodeBase64(',$value,')')"/> 1034 1037 </xsl:when> 1035 1038 … … 3240 3243 } 3241 3244 } 3242 // temporary methods, will bo away soon 3243 public static byte[] wrapBytes(List<Short> arr) 3244 { 3245 if (arr == null) 3246 return null; 3247 int i = 0; 3248 byte[] rv = new byte[arr.size()]; 3249 for (short s : arr) 3250 rv[i++] = (byte)(s & 0xff); 3251 return rv; 3252 } 3253 3254 public static List<Short> unwrapBytes(byte[] arr) 3255 { 3256 if (arr == null) 3257 return null; 3258 List<Short> ret = new ArrayList<Short>(arr.length); 3259 for (byte b : arr) { 3260 ret.add((short)b); 3261 } 3262 return ret; 3245 3246 /* Pretty naive Base64 encoder/decoder. */ 3247 private static final char[] valToChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); 3248 private static final int[] charToVal = new int[256]; 3249 3250 /* Initialize recoding alphabet. */ 3251 static 3252 { 3253 for (int i = 0; i < charToVal.length; i++) 3254 charToVal[i] = -1; 3255 3256 for (int i = 0; i < valToChar.length; i++) 3257 charToVal[valToChar[i]] = i; 3258 3259 charToVal['='] = 0; 3260 } 3261 3262 public static String encodeBase64(byte[] data) 3263 { 3264 if (data == null) 3265 return null; 3266 3267 if (data.length == 0) 3268 return ""; 3269 3270 int fullTriplets = data.length / 3; 3271 int resultLen = ((data.length - 1) / 3 + 1) * 4; 3272 char[] result = new char[resultLen]; 3273 int dataIndex = 0, stringIndex = 0; 3274 3275 for (int i = 0; i < fullTriplets; i++) 3276 { 3277 int ch1 = data[dataIndex++] & 0xff; 3278 result[stringIndex++] = valToChar[ch1 >> 2]; 3279 int ch2 = data[dataIndex++] & 0xff; 3280 result[stringIndex++] = valToChar[((ch1 << 4) & 0x3f) | (ch2 >> 4)]; 3281 int ch3 = data[dataIndex++] & 0xff; 3282 result[stringIndex++] = valToChar[((ch2 << 2) & 0x3f) | (ch3 >> 6)]; 3283 result[stringIndex++] = valToChar[ch3 & 0x3f]; 3284 } 3285 3286 switch (data.length - dataIndex) 3287 { 3288 case 0: 3289 // do nothing 3290 break; 3291 case 1: 3292 { 3293 int ch1 = data[dataIndex++] & 0xff; 3294 result[stringIndex++] = valToChar[ch1 >> 2]; 3295 result[stringIndex++] = valToChar[(ch1 << 4) & 0x3f]; 3296 result[stringIndex++] = '='; 3297 result[stringIndex++] = '='; 3298 break; 3299 } 3300 case 2: 3301 { 3302 int ch1 = data[dataIndex++] & 0xff; 3303 result[stringIndex++] = valToChar[ch1 >> 2]; 3304 int ch2 = data[dataIndex++] & 0xff; 3305 result[stringIndex++] = valToChar[((ch1 << 4) & 0x3f) | (ch2 >> 4)]; 3306 result[stringIndex++] = valToChar[(ch2 << 2) & 0x3f]; 3307 result[stringIndex++] = '='; 3308 break; 3309 } 3310 default: 3311 throw new RuntimeException("bug!"); 3312 } 3313 3314 return new String(result); 3315 } 3316 3317 private static int skipInvalid(String str, int stringIndex) 3318 { 3319 while (charToVal[str.charAt(stringIndex)] < 0) 3320 stringIndex++; 3321 3322 return stringIndex; 3323 } 3324 3325 public static byte[] decodeBase64(String str) 3326 { 3327 if (str == null) 3328 return null; 3329 3330 int stringLength = str.length(); 3331 if (stringLength == 0) 3332 return new byte[0]; 3333 3334 int validChars = 0, padChars = 0; 3335 for (int i = 0; i < str.length(); i++) 3336 { 3337 char ch = str.charAt(i); 3338 3339 if (charToVal[ch] >= 0) 3340 validChars++; 3341 3342 if (ch == '=') 3343 padChars++; 3344 } 3345 3346 if ((validChars * 3 % 4) != 0) 3347 throw new RuntimeException("invalid encoded string "+str); 3348 3349 int resultLength = validChars * 3 / 4 - padChars; 3350 byte[] result = new byte[resultLength]; 3351 3352 int dataIndex = 0, stringIndex = 0; 3353 int quadraplets = validChars / 4; 3354 3355 for (int i=0; i<quadraplets; i++) 3356 { 3357 stringIndex = skipInvalid(str, stringIndex); 3358 int ch1 = str.charAt(stringIndex++); 3359 stringIndex = skipInvalid(str, stringIndex); 3360 int ch2 = str.charAt(stringIndex++); 3361 stringIndex = skipInvalid(str, stringIndex); 3362 int ch3 = str.charAt(stringIndex++); 3363 stringIndex = skipInvalid(str, stringIndex); 3364 int ch4 = str.charAt(stringIndex++); 3365 3366 result[dataIndex++] = (byte)(((charToVal[ch1] << 2) | charToVal[ch2] >> 4) & 0xff); 3367 /* we check this to ensure that we don't override data with '=' padding. */ 3368 if (dataIndex < result.length) 3369 result[dataIndex++] = (byte)(((charToVal[ch2] << 4) | charToVal[ch3] >> 2) & 0xff); 3370 if (dataIndex < result.length) 3371 result[dataIndex++] = (byte)(((charToVal[ch3] << 6) | charToVal[ch4]) & 0xff); 3372 } 3373 3374 return result; 3263 3375 } 3264 3376 }
Note:
See TracChangeset
for help on using the changeset viewer.