Author: toad
Date: 2007-04-18 18:41:52 +0000 (Wed, 18 Apr 2007)
New Revision: 12782

Modified:
   trunk/freenet/src/freenet/io/comm/Message.java
Log:
Basic sub-messages support. Probably breaks message parsing. Untested!

Modified: trunk/freenet/src/freenet/io/comm/Message.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Message.java      2007-04-18 18:31:09 UTC 
(rev 12781)
+++ trunk/freenet/src/freenet/io/comm/Message.java      2007-04-18 18:41:52 UTC 
(rev 12782)
@@ -38,6 +38,7 @@
        private final MessageType _spec;
        private final PeerContext _source;
        private final HashMap _payload = new HashMap(8, 1.0F); // REDFLAG at 
the moment memory is more of an issue than CPU so we use a high load factor
+       private Vector _subMessages;
        public final long localInstantiationTime;
        final int _receivedByteCount;

@@ -45,10 +46,10 @@
                DataInputStream dis
            = new DataInputStream(new ByteArrayInputStream(buf,
                offset, length));
-               return decodeMessage(dis, peer, length + overhead);
+               return decodeMessage(dis, peer, length + overhead, true, false);
        }

-       public static Message decodeMessage(DataInputStream dis, PeerContext 
peer, int recvByteCount) {
+       public static Message decodeMessage(DataInputStream dis, PeerContext 
peer, int recvByteCount, boolean mayHaveSubMessages, boolean inSubMessage) {
                MessageType mspec;
         try {
             mspec = MessageType.getSpec(new Integer(dis.readInt()));
@@ -73,11 +74,22 @@
                            m.set(name, 
Serializer.readFromDataInputStream(type, dis));
                        }
                    }
+                   if(mayHaveSubMessages) {
+                       while(true) {
+                               Message subMessage = decodeMessage(dis, peer, 
0, false, true);
+                               if(subMessage == null) return m;
+                               m.addSubMessage(subMessage);
+                       }
+                   }
                } catch (EOFException e) {
-                   Logger.normal(Message.class,peer.getPeer()+" sent a message 
packet that ends prematurely while deserialising "+mspec.getName(), e);
+                       String msg = peer.getPeer()+" sent a message packet 
that ends prematurely while deserialising "+mspec.getName();
+                       if(inSubMessage)
+                               Logger.minor(Message.class, msg+" in 
sub-message", e);
+                       else
+                               Logger.error(Message.class, msg, e);
                    return null;
                } catch (IOException e) {
-                   Logger.error(Message.class, "WTF?: "+e+" reading from 
buffer stream", e);
+                   Logger.error(Message.class, "Unexpected IOException: "+e+" 
reading from buffer stream", e);
                    return null;
                }
                return m;
@@ -242,4 +254,31 @@
        public int receivedByteCount() {
                return _receivedByteCount;
        }
+       
+       private void addSubMessage(Message subMessage) {
+               if(_subMessages == null) _subMessages = new Vector();
+               _subMessages.add(subMessage);
+       }
+       
+       public Message getSubMessage(MessageType t) {
+               if(_subMessages == null) return null;
+               for(int i=0;i<_subMessages.size();i++) {
+                       Message m = (Message) _subMessages.get(i);
+                       if(m.getSpec() == t) return m;
+               }
+               return null;
+       }
+
+       public Message grabSubMessage(MessageType t) {
+               if(_subMessages == null) return null;
+               for(int i=0;i<_subMessages.size();i++) {
+                       Message m = (Message) _subMessages.get(i);
+                       if(m.getSpec() == t) {
+                               _subMessages.remove(i);
+                               return m;
+                       }
+               }
+               return null;
+       }
+
 }
\ No newline at end of file


Reply via email to