Guest User

AMFDeserializer

a guest
May 11th, 2011
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.96 KB | None | 0 0
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package siedleronlineproxy.network;
  7.  
  8. import flex.messaging.io.MessageIOConstants;
  9. import flex.messaging.io.SerializationContext;
  10. import flex.messaging.io.amf.ActionMessage;
  11. import flex.messaging.io.amf.Amf0Input;
  12. import flex.messaging.io.amf.MessageBody;
  13. import flex.messaging.io.amf.MessageHeader;
  14. import java.io.ByteArrayInputStream;
  15. import java.io.IOException;
  16. import org.apache.commons.lang.ArrayUtils;
  17.  
  18.  
  19. /**
  20.  *
  21.  * @author nspecht
  22.  */
  23. public class MyAMFDeserializer {
  24.     private byte[] message = new byte[0];
  25.     private ActionMessage am = null;
  26.  
  27.     public MyAMFDeserializer(String message) {
  28.         this.message = message.getBytes();
  29.     }
  30.  
  31.     public MyAMFDeserializer(byte[] message) {
  32.         this.message = message;
  33.     }
  34.  
  35.     public MyAMFDeserializer() {
  36.  
  37.     }
  38.  
  39.     public void add(byte[] mess,int length) {
  40.  
  41.         while (mess.length > length) {
  42.             mess = ArrayUtils.remove(mess, mess.length-1);
  43.         }
  44.         this.message = ArrayUtils.addAll(this.message, mess);
  45.  
  46.     }
  47.  
  48.     public void readMessage() {
  49.         try {
  50.             byte[] mess;
  51.             boolean removeHeader=true;
  52.             if (removeHeader) {
  53.                 String tmp = new String(this.message);
  54.                 String pattern = "\r\n\r\n";
  55.                 int start = tmp.indexOf(pattern)+pattern.length();
  56.                 if (start>=tmp.length()) return;
  57.                 if (start > 0) {
  58.                     tmp = tmp.substring(start);
  59.                 }
  60.                 mess = tmp.getBytes();
  61.             } else {
  62.                 mess = this.message;
  63.             }
  64.              
  65.             if (mess.length > 0) {
  66.                 SerializationContext sc = SerializationContext.getSerializationContext();
  67.                 Amf0Input amf = new Amf0Input(sc);
  68.                 amf.setInputStream(new ByteArrayInputStream(mess));
  69.  
  70.                
  71.                 int amf_version = amf.readUnsignedShort();
  72.                 if (
  73.                         amf_version != MessageIOConstants.AMF0 &&
  74.                         amf_version != MessageIOConstants.AMF3
  75.                         ) return;
  76.  
  77.                 this.am = new ActionMessage();
  78.                 this.am.setVersion(amf_version);
  79.  
  80.                 int amf_headerCount = amf.readUnsignedShort();
  81.                 for(int i=0;i<amf_headerCount;i++) {
  82.                     this.am.addHeader(this.readHeader(amf,i));
  83.                 }
  84.                 int amf_bodyCount = amf.readUnsignedShort();
  85.                 for(int i=0;i<amf_bodyCount;i++) {
  86.                     this.am.addBody(this.readBody(amf,i));
  87.                 }
  88.             }
  89.         } catch (Exception e) {
  90.             e.printStackTrace(System.out);
  91.             this.am = null;
  92.         } finally {
  93.            
  94.         }
  95.     }
  96.  
  97.     private MessageHeader readHeader(Amf0Input amf,int index) throws IOException, ClassNotFoundException {
  98.         amf.reset();
  99.         System.out.println("parsing header "+index);
  100.         String name = amf.readUTF();
  101.         boolean mu = amf.readBoolean();
  102.         //int length = amf.readInt();
  103.        
  104.         Object o = amf.readObject();
  105.  
  106.         MessageHeader ret = new MessageHeader();
  107.         ret.setName(name);
  108.         ret.setMustUnderstand(mu);
  109.         ret.setData(o);
  110.  
  111.         return ret;
  112.     }
  113.  
  114.     private MessageBody readBody(Amf0Input amf, int index) throws IOException, ClassNotFoundException {
  115.         amf.reset();
  116.         System.out.println("parsing body "+index);
  117.        
  118.         String tu = amf.readUTF();
  119.         String ru = amf.readUTF();
  120.         //int length = amf.readInt();
  121.        
  122.         Object o  = amf.readObject();
  123.  
  124.         MessageBody ret = new MessageBody();
  125.         ret.setTargetURI(tu);
  126.         ret.setResponseURI(ru);
  127.         ret.setData(o);
  128.         return ret;
  129.     }
  130.  
  131.     public ActionMessage getMessage() {
  132.         return this.am;
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment