/** * Reads a string * * @return String String */ @Override public String readString(Type target) { int len = readAMF3Integer(); log.debug("readString - length: {}", len); // get the length of the string (0x03 = 1, 0x05 = 2, 0x07 = 3 etc..) // 0x01 is special and it means "empty" if (len == 1) { // Empty string return ""; } if ((len & 1) == 0) { // if the refs are empty an IndexOutOfBoundsEx will be thrown if (refStorage.stringReferences.isEmpty()) { log.debug("String reference list is empty"); } // Reference return refStorage.stringReferences.get(len >> 1); } len >>= 1; log.debug("readString - new length: {}", len); int limit = buf.limit(); log.debug("readString - limit: {}", limit); final ByteBuffer strBuf = buf.buf(); strBuf.limit(strBuf.position() + len); final String string = AMF.CHARSET.decode(strBuf).toString(); log.debug("String: {}", string); buf.limit(limit); // reset the limit refStorage.stringReferences.add(string); return string; }
/** {@inheritDoc} */ public Document readXML(Type target) { int len = readAMF3Integer(); if (len == 1) { // Empty string, should not happen return null; } if ((len & 1) == 0) { // Reference return (Document) getReference(len >> 1); } len >>= 1; int limit = buf.limit(); final ByteBuffer strBuf = buf.buf(); strBuf.limit(strBuf.position() + len); final String xmlString = AMF.CHARSET.decode(strBuf).toString(); buf.limit(limit); // Reset the limit Document doc = null; try { doc = XMLUtils.stringToDoc(xmlString); } catch (IOException ioex) { log.error("IOException converting xml to dom", ioex); } storeReference(doc); return doc; }
/** {@inheritDoc} */ public void writeUTF(String value) { // fix from issue #97 try { byte[] strBuf = value.getBytes(AMF.CHARSET.name()); buffer.putShort((short) strBuf.length); buffer.put(strBuf); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
/** * Reads a string of a set length. This does not use the string reference table. * * @param length the length of the string * @return String */ public String readString(int length) { log.debug("readString - length: {}", length); int limit = buf.limit(); final ByteBuffer strBuf = buf.buf(); strBuf.limit(strBuf.position() + length); final String string = AMF.CHARSET.decode(strBuf).toString(); log.debug("String: {}", string); buf.limit(limit); // check for null termination byte b = buf.get(); if (b != 0) { buf.position(buf.position() - 1); } return string; }
/** {@inheritDoc} */ public void writeUTFBytes(String value) { final java.nio.ByteBuffer strBuf = AMF.CHARSET.encode(value); buffer.put(strBuf); }