Loading core/java/com/android/internal/util/XmlUtils.java +78 −6 Original line number Diff line number Diff line Loading @@ -392,10 +392,10 @@ public class XmlUtils { StringBuilder sb = new StringBuilder(val.length*2); for (int i=0; i<N; i++) { int b = val[i]; int h = b>>4; sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); h = b&0xff; sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); int h = (b >> 4) & 0x0f; sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h))); h = b & 0x0f; sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h))); } out.text(sb.toString()); Loading Loading @@ -995,6 +995,73 @@ public class XmlUtils { "Document ended before " + endTag + " end tag"); } /** * Read a byte[] object from an XmlPullParser. The XML data could * previously have been generated by writeByteArrayXml(). The XmlPullParser * must be positioned <em>after</em> the tag that begins the list. * * @param parser The XmlPullParser from which to read the list data. * @param endTag Name of the tag that will end the list, usually "list". * @param name An array of one string, used to return the name attribute * of the list's tag. * * @return Returns a newly generated byte[]. * * @see #writeByteArrayXml */ public static final byte[] readThisByteArrayXml(XmlPullParser parser, String endTag, String[] name) throws XmlPullParserException, java.io.IOException { int num; try { num = Integer.parseInt(parser.getAttributeValue(null, "num")); } catch (NullPointerException e) { throw new XmlPullParserException( "Need num attribute in byte-array"); } catch (NumberFormatException e) { throw new XmlPullParserException( "Not a number in num attribute in byte-array"); } byte[] array = new byte[num]; int eventType = parser.getEventType(); do { if (eventType == parser.TEXT) { if (num > 0) { String values = parser.getText(); if (values == null || values.length() != num * 2) { throw new XmlPullParserException( "Invalid value found in byte-array: " + values); } // This is ugly, but keeping it to mirror the logic in #writeByteArrayXml. for (int i = 0; i < num; i ++) { char nibbleHighChar = values.charAt(2 * i); char nibbleLowChar = values.charAt(2 * i + 1); int nibbleHigh = nibbleHighChar > 'a' ? (nibbleHighChar - 'a' + 10) : (nibbleHighChar - '0'); int nibbleLow = nibbleLowChar > 'a' ? (nibbleLowChar - 'a' + 10) : (nibbleLowChar - '0'); array[i] = (byte) ((nibbleHigh & 0x0F) << 4 | (nibbleLow & 0x0F)); } } } else if (eventType == parser.END_TAG) { if (parser.getName().equals(endTag)) { return array; } else { throw new XmlPullParserException( "Expected " + endTag + " end tag at: " + parser.getName()); } } eventType = parser.next(); } while (eventType != parser.END_DOCUMENT); throw new XmlPullParserException( "Document ended before " + endTag + " end tag"); } /** * Read an int[] object from an XmlPullParser. The XML data could * previously have been generated by writeIntArrayXml(). The XmlPullParser Loading @@ -1018,10 +1085,10 @@ public class XmlUtils { num = Integer.parseInt(parser.getAttributeValue(null, "num")); } catch (NullPointerException e) { throw new XmlPullParserException( "Need num attribute in byte-array"); "Need num attribute in int-array"); } catch (NumberFormatException e) { throw new XmlPullParserException( "Not a number in num attribute in byte-array"); "Not a number in num attribute in int-array"); } parser.next(); Loading Loading @@ -1377,6 +1444,11 @@ public class XmlUtils { "Unexpected end of document in <string>"); } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) { // all work already done by readThisPrimitiveValueXml } else if (tagName.equals("byte-array")) { res = readThisByteArrayXml(parser, "byte-array", name); name[0] = valueName; //System.out.println("Returning value for " + valueName + ": " + res); return res; } else if (tagName.equals("int-array")) { res = readThisIntArrayXml(parser, "int-array", name); name[0] = valueName; Loading Loading
core/java/com/android/internal/util/XmlUtils.java +78 −6 Original line number Diff line number Diff line Loading @@ -392,10 +392,10 @@ public class XmlUtils { StringBuilder sb = new StringBuilder(val.length*2); for (int i=0; i<N; i++) { int b = val[i]; int h = b>>4; sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); h = b&0xff; sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); int h = (b >> 4) & 0x0f; sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h))); h = b & 0x0f; sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h))); } out.text(sb.toString()); Loading Loading @@ -995,6 +995,73 @@ public class XmlUtils { "Document ended before " + endTag + " end tag"); } /** * Read a byte[] object from an XmlPullParser. The XML data could * previously have been generated by writeByteArrayXml(). The XmlPullParser * must be positioned <em>after</em> the tag that begins the list. * * @param parser The XmlPullParser from which to read the list data. * @param endTag Name of the tag that will end the list, usually "list". * @param name An array of one string, used to return the name attribute * of the list's tag. * * @return Returns a newly generated byte[]. * * @see #writeByteArrayXml */ public static final byte[] readThisByteArrayXml(XmlPullParser parser, String endTag, String[] name) throws XmlPullParserException, java.io.IOException { int num; try { num = Integer.parseInt(parser.getAttributeValue(null, "num")); } catch (NullPointerException e) { throw new XmlPullParserException( "Need num attribute in byte-array"); } catch (NumberFormatException e) { throw new XmlPullParserException( "Not a number in num attribute in byte-array"); } byte[] array = new byte[num]; int eventType = parser.getEventType(); do { if (eventType == parser.TEXT) { if (num > 0) { String values = parser.getText(); if (values == null || values.length() != num * 2) { throw new XmlPullParserException( "Invalid value found in byte-array: " + values); } // This is ugly, but keeping it to mirror the logic in #writeByteArrayXml. for (int i = 0; i < num; i ++) { char nibbleHighChar = values.charAt(2 * i); char nibbleLowChar = values.charAt(2 * i + 1); int nibbleHigh = nibbleHighChar > 'a' ? (nibbleHighChar - 'a' + 10) : (nibbleHighChar - '0'); int nibbleLow = nibbleLowChar > 'a' ? (nibbleLowChar - 'a' + 10) : (nibbleLowChar - '0'); array[i] = (byte) ((nibbleHigh & 0x0F) << 4 | (nibbleLow & 0x0F)); } } } else if (eventType == parser.END_TAG) { if (parser.getName().equals(endTag)) { return array; } else { throw new XmlPullParserException( "Expected " + endTag + " end tag at: " + parser.getName()); } } eventType = parser.next(); } while (eventType != parser.END_DOCUMENT); throw new XmlPullParserException( "Document ended before " + endTag + " end tag"); } /** * Read an int[] object from an XmlPullParser. The XML data could * previously have been generated by writeIntArrayXml(). The XmlPullParser Loading @@ -1018,10 +1085,10 @@ public class XmlUtils { num = Integer.parseInt(parser.getAttributeValue(null, "num")); } catch (NullPointerException e) { throw new XmlPullParserException( "Need num attribute in byte-array"); "Need num attribute in int-array"); } catch (NumberFormatException e) { throw new XmlPullParserException( "Not a number in num attribute in byte-array"); "Not a number in num attribute in int-array"); } parser.next(); Loading Loading @@ -1377,6 +1444,11 @@ public class XmlUtils { "Unexpected end of document in <string>"); } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) { // all work already done by readThisPrimitiveValueXml } else if (tagName.equals("byte-array")) { res = readThisByteArrayXml(parser, "byte-array", name); name[0] = valueName; //System.out.println("Returning value for " + valueName + ": " + res); return res; } else if (tagName.equals("int-array")) { res = readThisIntArrayXml(parser, "int-array", name); name[0] = valueName; Loading