VirtualBox

Changeset 36883 in vbox for trunk/src/VBox/Main/glue


Ignore:
Timestamp:
Apr 29, 2011 9:40:55 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
71461
Message:

webservice: pass octet arrays as base64 strings

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/glue/glue-java.xsl

    r36814 r36883  
    288288  <xsl:param name="type" />
    289289  <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>     
    295293    <xsl:when test="($G_vboxGlueStyle='xpcom')">
     294      <xsl:variable name="needarray" select="($safearray='yes') and not($forceelem='yes')" />
     295
    296296      <xsl:choose>
    297297        <xsl:when test="$type='long long'">
     
    368368
    369369    <xsl:when test="($G_vboxGlueStyle='jaxws')">
     370      <xsl:variable name="needarray" select="($safearray='yes' and not($type='octet')) and not($forceelem='yes')" />
     371     
    370372      <xsl:if test="$needarray">
    371373        <xsl:value-of select="'List&lt;'" />
     
    388390        </xsl:when>
    389391
     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
    390397        <xsl:when test="$type='long long'">
    391398          <xsl:value-of select="'Long'" />
     
    405412
    406413        <xsl:when test="$type='short'">
    407           <xsl:value-of select="'Short'" />
    408         </xsl:when>
    409 
    410         <xsl:when test="$type='octet'">
    411414          <xsl:value-of select="'Short'" />
    412415        </xsl:when>
     
    650653        </xsl:when>
    651654        <xsl:when test="$idltype='octet'">
    652           <xsl:value-of select="concat('Helper.wrapBytes(',$value,')')"/>
     655          <xsl:value-of select="concat('Helper.decodeBase64(',$value,')')"/>
    653656        </xsl:when>
    654657        <xsl:otherwise>
     
    957960
    958961    <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,')')"/>
    960963    </xsl:when>
    961964
     
    10311034
    10321035     <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,')')"/>
    10341037     </xsl:when>
    10351038
     
    32403243        }
    32413244    }
    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;
    32633375    }
    32643376}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette