@SuppressWarnings("unchecked") protected List<Object> readAMF3VectorObject() throws IOException { final int type = readAMF3UnsignedInteger(); final int lengthOrIndex = type >>> 1; if ((type & 0x01) == 0) // stored vector. return (List<Object>)storedObjects.get(lengthOrIndex); readByte(); // fixed flag: unused... readAMF3String(); // component class name: unused... List<Object> vector = new ArrayList<Object>(lengthOrIndex); storedObjects.add(vector); for (int i = 0; i < lengthOrIndex; i++) vector.add(readObject()); return vector; }
return Boolean.TRUE; case AMF3_INTEGER: // 0x04; return Integer.valueOf(readAMF3Integer()); case AMF3_NUMBER: // 0x05; return readAMF3Double(); case AMF3_STRING: // 0x06; return readAMF3String(); case AMF3_XML: // 0x07; return readAMF3Xml(); case AMF3_DATE: // 0x08; return readAMF3Date(); case AMF3_ARRAY: // 0x09; return readAMF3Array(); case AMF3_OBJECT: // 0x0A; return readAMF3Object(); case AMF3_XMLSTRING: // 0x0B; return readAMF3XmlString(); case AMF3_BYTEARRAY: // 0x0C; return readAMF3ByteArray(); case AMF3_VECTOR_INT: // 0x0D; return readAMF3VectorInt(); case AMF3_VECTOR_UINT: // 0x0E; return readAMF3VectorUint(); case AMF3_VECTOR_NUMBER: // 0x0F; return readAMF3VectorNumber(); case AMF3_VECTOR_OBJECT: // 0x10; return readAMF3VectorObject(); case AMF3_DICTIONARY: // 0x11; return readAMF3Dictionary();
public Object readObject() throws IOException { ensureAvailable(1); int type = buffer[position++]; return readObject(type); }
/** * Reads object * * @return the AMF3 decoded object */ protected Object readAMF3Data() throws IOException { AMF3Deserializer amf3 = (AMF3Deserializer)dataInput; amf3.reset(); return amf3.readObject(); }
protected byte[] readAMF3ByteArray() throws IOException { byte[] result = null; int type = readAMF3Integer(); if ((type & 0x01) == 0) // stored object. result = (byte[])getFromStoredObjects(type >> 1); else { result = readBytes(type >> 1); addToStoredObjects(result); } if (debugMore) logMore.debug("readAMF3ByteArray() -> %s", result); return result; }
@Override public Message[] decode(InputStream input) throws IOException { SimpleGraniteContext.createThreadInstance(config.getGraniteConfig(), config.getServicesConfig(), new HashMap<String, Object>(0), getClientType().toString()); try { AMF3Deserializer deserializer = new AMF3Deserializer(input); Object[] objects = (Object[])deserializer.readObject(); deserializer.close(); if (objects != null) { Message[] messages = new Message[objects.length]; System.arraycopy(objects, 0, messages, 0, objects.length); for (Message message : messages) { if (message != null && Boolean.TRUE.equals(message.getHeader(Channel.BYTEARRAY_BODY_HEADER))) { byte[] body = (byte[])message.getBody(); deserializer = new AMF3Deserializer(new ByteArrayInputStream(body)); message.setBody(deserializer.readObject()); deserializer.close(); } } return messages; } return new Message[0]; } finally { GraniteContext.release(); } } }
int type = readAMF3Integer(); if (debug) log.debug("readAMF3Object() - type=0x%02X", type); result = getFromStoredObjects(type >> 1); else { boolean inlineClassDef = (((type >> 1) & 0x01) != 0); String alias = readAMF3String(); String className = context.getGraniteConfig().getAliasRegistry().getTypeForAlias(alias); if (debug) log.debug("readAMF3Object() - alias=%, className=%s", alias, className); addToStoredClassDescriptors(desc); String name = readAMF3String(); if (debug) log.debug("readAMF3Object() - defining property name=%s", name); desc.defineProperty(name); desc = getFromStoredClassDescriptors(type >> 2); int index = addToStoredObjects(result); if (debug) log.debug("readAMF3Object() - reading defined properties..."); for (int i = 0; i < desc.getPropertiesCount(); i++) { byte vType = readByte(); Object value = readObject(vType); if (debug) log.debug("readAMF3Object() - setting defined property: %s=%s", desc.getPropertyName(i), value); desc.setPropertyValue(i, result, value); if (debug) log.debug("readAMF3Object() - reading dynamic properties...");
protected void readStandard(ActionScriptClassDescriptor desc, Object result) throws IOException { // defined values... final int count = desc.getPropertiesCount(); for (int i = 0; i < count; i++) { Property property = desc.getProperty(i); Object value = readObject(readUnsignedByte()); if (value != null && value.getClass() == property.getType()) property.setValue(result, value, false); else property.setValue(result, value, true); } // dynamic values... if (desc.isDynamic()) { while (true) { String name = readAMF3String(); if (name.length() == 0) break; Object value = readObject(readUnsignedByte()); desc.setPropertyValue(name, result, value); } } }
protected Object readAMF3VectorObject() throws IOException { Object result = null; int type = readAMF3Integer(); if ((type & 0x01) == 0) // stored vector. result = getFromStoredObjects(type >> 1); else { final int length = type >> 1; List<Object> vector = new ArrayList<Object>(length); addToStoredObjects(result); readAMF3Integer(); // always 0x00? readAMF3Integer(); // always 0x01? for (int i = 0; i < length; i++) vector.add(readObject()); result = vector; } if (debugMore) logMore.debug("readAMF3VectorObject() -> %s", result); return result; }
@SuppressWarnings("unchecked") protected Map<Object, Object> readAMF3Dictionary() throws IOException { final int type = readAMF3UnsignedInteger(); final int lengthOrIndex = type >>> 1; if ((type & 0x01) == 0) // stored dictionary. return (Map<Object, Object>)storedObjects.get(lengthOrIndex); readByte(); // weak keys flag: unused... // AS3 Dictionary doesn't have a strict Java equivalent: use an HashMap, which // could (unlikely) lead to duplicated keys collision... Map<Object, Object> dictionary = new HashMap<Object, Object>(lengthOrIndex); storedObjects.add(dictionary); for (int i = 0; i < lengthOrIndex; i++) { Object key = readObject(); Object value = readObject(); dictionary.put(key, value); } return dictionary; }
protected Object readAMF3Array() throws IOException { final int type = readAMF3UnsignedInteger(); final int lengthOrIndex = type >>> 1; if ((type & 0x01) == 0) // stored array. return storedObjects.get(lengthOrIndex); String key = readAMF3String(); if (key.length() == 0) { Object[] objects = new Object[lengthOrIndex]; storedObjects.add(objects); for (int i = 0; i < lengthOrIndex; i++) objects[i] = readObject(); return objects; } Map<Object, Object> map = new HashMap<Object, Object>(lengthOrIndex); storedObjects.add(map); while (key.length() > 0) { map.put(key, readObject()); key = readAMF3String(); } for (int i = 0; i < lengthOrIndex; i++) map.put(Integer.valueOf(i), readObject()); return map; }
protected Date readAMF3Date() throws IOException { Date result = null; int type = readAMF3Integer(); if ((type & 0x01) == 0) // stored Date result = (Date)getFromStoredObjects(type >> 1); else { result = new Date((long)readDouble()); addToStoredObjects(result); } if (debugMore) logMore.debug("readAMF3Date() -> %s", result); return result; }
protected Object readAMF3VectorInt() throws IOException { Object result = null; int type = readAMF3Integer(); if ((type & 0x01) == 0) // stored vector. result = getFromStoredObjects(type >> 1); else { final int length = type >> 1; List<Integer> vector = new ArrayList<Integer>(length); addToStoredObjects(result); readAMF3Integer(); // always 0x00? for (int i = 0; i < length; i++) vector.add(readInt()); result = vector; } if (debugMore) logMore.debug("readAMF3VectorInt() -> %s", result); return result; }
public Object readObject() throws IOException { if (debugMore) logMore.debug("readObject()..."); try { int type = readAMF3Integer(); return readObject(type); } catch (IOException e) { throw e; } catch (Exception e) { throw new AMF3SerializationException(e); } }
@Override public Object readObject() throws IOException { OSGiGraniteClassUtil.setDestination(null); Object obj = super.readObject(); if (obj instanceof AbstractMessage && ! (obj instanceof CommandMessage)) { AbstractMessage message = (AbstractMessage) obj; OSGiGraniteClassUtil.setDestination(message.getDestination()); if (Boolean.TRUE.equals(message.getHeader(OSGiConstants.BYTEARRAY_BODY_HEADER))) { byte[] byteArray = (byte[]) message.getBody(); ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); AMF3Deserializer deser = new AMF3Deserializer(bais); message.setBody(deser.readObject()); } } return obj; } }
int type = readAMF3Integer(); if ((type & 0x01) == 0) // stored string result = getFromStoredStrings(type >> 1); else { int length = type >> 1; char[] utfChars = new char[length]; readFully(utfBytes); addToStoredStrings(result); } else result = "";
final byte encoding = (byte)((flags >>> 2) & 0x03); String alias = readAMF3String(); String className = aliasRegistry.getTypeForAlias(alias); String name = readAMF3String(); desc.defineProperty(name);
@Override public Message[] decode(InputStream input) throws IOException { SimpleGraniteContext.createThreadInstance(config.getGraniteConfig(), config.getServicesConfig(), new HashMap<String, Object>(0), getClientType().toString()); try { AMF3Deserializer deserializer = new AMF3Deserializer(input); Object[] objects = (Object[])deserializer.readObject(); deserializer.close(); if (objects != null) { Message[] messages = new Message[objects.length]; System.arraycopy(objects, 0, messages, 0, objects.length); for (Message message : messages) { if (message != null && Boolean.TRUE.equals(message.getHeader(Channel.BYTEARRAY_BODY_HEADER))) { byte[] body = (byte[])message.getBody(); deserializer = new AMF3Deserializer(new ByteArrayInputStream(body)); message.setBody(deserializer.readObject()); deserializer.close(); } } return messages; } return new Message[0]; } finally { GraniteContext.release(); } } }
protected void readStandard(ActionScriptClassDescriptor desc, Object result) throws IOException { // defined values... final int count = desc.getPropertiesCount(); for (int i = 0; i < count; i++) { Property property = desc.getProperty(i); Object value = readObject(readUnsignedByte()); if (value != null && value.getClass() == property.getType()) property.setValue(result, value, false); else property.setValue(result, value, true); } // dynamic values... if (desc.isDynamic()) { while (true) { String name = readAMF3String(); if (name.length() == 0) break; Object value = readObject(readUnsignedByte()); desc.setPropertyValue(name, result, value); } } }
protected Object readAMF3Array() throws IOException { Object result = null; int type = readAMF3Integer(); if ((type & 0x01) == 0) // stored array. result = getFromStoredObjects(type >> 1); else { final int size = type >> 1; String key = readAMF3String(); if (key.length() == 0) { Object[] objects = new Object[size]; addToStoredObjects(objects); for (int i = 0; i < size; i++) objects[i] = readObject(); result = objects; } else { Map<Object, Object> map = new HashMap<Object, Object>(); addToStoredObjects(map); while(key.length() > 0) { map.put(key, readObject()); key = readAMF3String(); } for (int i = 0; i < size; i++) map.put(Integer.valueOf(i), readObject()); result = map; } } if (debugMore) logMore.debug("readAMF3Array() -> %s", result); return result; }