CVS: beepcore-java/src/org/beepcore/beep/core ChannelImpl.java,1.2,1.3

Huston Franklin <[email protected]> Fri, 16 May 2003 09:44:31 -0700
Newsgroups gmane.network.beep.beepcore.java.cvs
Message-ID <[email protected]>
Update of /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core
In directory sc8-pr-cvs1:/tmp/cvs-serv21584/src/org/beepcore/beep/core

Modified Files:
	ChannelImpl.java 
Log Message:
first pass at cleanup of frame validation

Index: ChannelImpl.java
===================================================================
RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/ChannelImpl.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** ChannelImpl.java	23 Apr 2003 15:23:04 -0000	1.2
--- ChannelImpl.java	16 May 2003 16:44:29 -0000	1.3
***************
*** 694,774 ****
          log.trace("Channel::postFrame");
  
-         boolean firstFrame = false;
-         boolean createAndPostMessage = false;
-         Message currentMessage = null;
-         int msgno = frame.getMsgno();
- 
          if (state != STATE_ACTIVE && state != STATE_TUNING) {
              throw new BEEPException("State is " + state);
          }
  
!         // Validate Frame
!         synchronized (this) {
! 
!             // assume the frame has already been parsed by the session and
!             // that the flags indicated are part of the frame object
! 
!             // is the message number correct?
!             if (frame.getMessageType() == Message.MESSAGE_TYPE_MSG) {
!                 if (previousFrame != null) {
!                     if (frame.getMsgno() != previousFrame.getMsgno()) {
!                         throw new BEEPException("Incorrect message number: was "
!                                                 + frame.getMsgno()
!                                                 + "; expecting "
!                                                 + previousFrame.getMsgno());
!                     }
!                 } else {
!                     synchronized (recvMSGQueue) {
!                         ListIterator i =
!                             recvMSGQueue.listIterator(recvMSGQueue.size());
!                         while (i.hasPrevious()) {
!                             if (((Message) i.previous()).getMsgno()
!                                 == frame.getMsgno())
!                             {
!                                 throw new BEEPException("Received a frame " +
!                                                         "with a duplicate " +
!                                                         "msgno (" +
!                                                         frame.getMsgno() +
!                                                         ")");
!                             }
!                         }
!                     }
!                 }
!             } else {
!                 MessageStatus mstatus;
! 
!                 synchronized (sentMSGQueue) {
!                     if (sentMSGQueue.size() == 0) {
!                         throw new BEEPException("Received unsolicited reply");
!                     }
! 
!                     mstatus = (MessageStatus) sentMSGQueue.get(0);
!                 }
! 
!                 if (frame.getMsgno() != mstatus.getMsgno()) {
!                     throw new BEEPException("Incorrect message number: was "
!                                             + frame.getMsgno()
!                                             + "; expecting "
!                                             + mstatus.getMsgno());
!                 }
!             }
! 
!             // is the sequence number correct?
!             if (frame.getSeqno() != recvSequence) {
!                 throw new BEEPException("Incorrect sequence number: was "
!                     + frame.getSeqno() + "; expecting "
!                     + recvSequence);
!             }
! 
!             // is the message type the same as the previous frames?
!             if ((previousFrame != null)
!                     && (previousFrame.getMessageType()
!                         != frame.getMessageType())) {
!                 throw new BEEPException("Incorrect message type: was "
!                     + frame.getMessageTypeString()
!                     + "; expecting "
!                     + previousFrame.getMessageTypeString());
!             }
!         }
  
          recvSequence += frame.getSize();
--- 694,702 ----
          log.trace("Channel::postFrame");
  
          if (state != STATE_ACTIVE && state != STATE_TUNING) {
              throw new BEEPException("State is " + state);
          }
  
!         validateFrame(frame);
  
          recvSequence += frame.getSize();
***************
*** 782,819 ****
          }
  
!         if (frame.getMessageType() != Message.MESSAGE_TYPE_MSG) {
!             MessageStatus mstatus;
! 
!             synchronized (sentMSGQueue) {
!                 if (sentMSGQueue.size() == 0) {
!                     throw new BEEPException("Received unsolicited reply");
!                 }
! 
!                 mstatus = (MessageStatus) sentMSGQueue.get(0);
! 
!                 if (mstatus.getMsgno() != frame.getMsgno()) {
!                     throw new BEEPException("Received reply out of order");
!                 }
!             }
!         }
! 
!         try {
!             receiveFrame(frame);
!         } catch (BEEPException e) {
!             // @todo change this to do the right thing
!             throw new BEEPException(e.getMessage());
!         }
! 
!         // is this the last frame in the message?
!         if (frame.isLast() == true) {
!             log.trace("Got the last frame");
!         }
! 
!         // save the previous frame to compare message types
!         if (frame.isLast()) {
!             previousFrame = null;
!         } else {
!             previousFrame = frame;
!         }
      }
  
--- 710,714 ----
          }
  
!         receiveFrame(frame);
      }
  
***************
*** 1036,1039 ****
--- 931,1028 ----
      }
  
+     private void validateFrame(Frame frame) throws BEEPException 
+     {
+         synchronized (this) {
+ 
+             if (previousFrame == null) {
+                 // is the message number correct?
+                 if (frame.getMessageType() == Message.MESSAGE_TYPE_MSG) {
+                     synchronized (recvMSGQueue) {
+                         ListIterator i =
+                             recvMSGQueue.listIterator(recvMSGQueue.size());
+                         while (i.hasPrevious()) {
+                             if (((Message) i.previous()).getMsgno()
+                                 == frame.getMsgno())
+                             {
+                                 throw new BEEPException("Received a frame " +
+                                                         "with a duplicate " +
+                                                         "msgno (" +
+                                                         frame.getMsgno() +
+                                                         ")");
+                             }
+                         }
+                     }
+                 } else {
+                     MessageStatus mstatus;
+ 
+                     synchronized (sentMSGQueue) {
+                         if (sentMSGQueue.size() == 0) {
+                             throw new BEEPException("Received unsolicited reply");
+                         }
+ 
+                         mstatus = (MessageStatus) sentMSGQueue.get(0);
+                     }
+ 
+                     if (frame.getMsgno() != mstatus.getMsgno()) {
+                         throw new BEEPException("Incorrect message number: was "
+                                                 + frame.getMsgno()
+                                                 + "; expecting "
+                                                 + mstatus.getMsgno());
+                     }
+                 }
+             } else {
+                 // is the message type the same as the previous frames?
+                 if (previousFrame.getMessageType() != frame.getMessageType()) {
+                     throw new BEEPException("Incorrect message type: was "
+                         + frame.getMessageTypeString()
+                         + "; expecting "
+                         + previousFrame.getMessageTypeString());
+                 }
+ 
+                 // is the message number correct?
+                 if (frame.getMessageType() == Message.MESSAGE_TYPE_MSG &&
+                     frame.getMsgno() != previousFrame.getMsgno())
+                 {
+                     throw new BEEPException("Incorrect message number: was "
+                                             + frame.getMsgno()
+                                             + "; expecting "
+                                             + previousFrame.getMsgno());
+                 }
+             }
+ 
+             // is the sequence number correct?
+             if (frame.getSeqno() != recvSequence) {
+                 throw new BEEPException("Incorrect sequence number: was "
+                     + frame.getSeqno() + "; expecting "
+                     + recvSequence);
+             }
+ 
+         }
+ 
+         if (frame.getMessageType() != Message.MESSAGE_TYPE_MSG) {
+             MessageStatus mstatus;
+ 
+             synchronized (sentMSGQueue) {
+                 if (sentMSGQueue.size() == 0) {
+                     throw new BEEPException("Received unsolicited reply");
+                 }
+ 
+                 mstatus = (MessageStatus) sentMSGQueue.get(0);
+ 
+                 if (mstatus.getMsgno() != frame.getMsgno()) {
+                     throw new BEEPException("Received reply out of order");
+                 }
+             }
+         }
+ 
+         // save the previous frame to compare message types
+         if (frame.isLast()) {
+             previousFrame = null;
+         } else {
+             previousFrame = frame;
+         }
+         
+     }
+     
      synchronized void freeReceiveBufferBytes(int size)
      {



-------------------------------------------------------
Enterprise Linux Forum Conference & Expo, June 4-6, 2003, Santa Clara
The only event dedicated to issues related to Linux enterprise solutions
www.enterpriselinuxforum.com