You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/07/03 12:57:11 UTC

svn commit: r418741 - in /incubator/harmony/enhanced/classlib/trunk/modules/nio/src: main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java

Author: tellison
Date: Mon Jul  3 03:57:09 2006
New Revision: 418741

URL: http://svn.apache.org/viewvc?rev=418741&view=rev
Log:
Apply patch HARMONY-701 ([classlib][nio] java.nio.channels.DatagramChannel.send(ByteBuffer, SocketAddress) sends data incorrectly if the position of ByteBuffer is not zero)

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java
    incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java?rev=418741&r1=418740&r2=418741&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DatagramChannelImpl.java Mon Jul  3 03:57:09 2006
@@ -346,22 +346,24 @@
 
         try {
             begin();
-
             byte[] array;
-            // FIXME enhence the performance
+            int length = source.remaining();
+            int oldposition = source.position();
+            int start;
             if (source.hasArray()) {
                 array = source.array();
+                start = oldposition;
             } else {
-                array = new byte[source.remaining()];
+                array = new byte[length];
                 source.get(array);
-            }
-            DatagramPacket pack = new DatagramPacket(array, array.length, isa);
-
+                start = 0;
+            }            
             synchronized (writeLock) {
-                sendCount = networkSystem.sendDatagram(fd, pack.getData(), 0,
-                        pack.getLength(), isa.getPort(), false, trafficClass,
-                        isa.getAddress());
+                sendCount = networkSystem.sendDatagram(fd, array, start,
+                        length, isa.getPort(), false, trafficClass, isa
+                                .getAddress());
             }
+            source.position(oldposition + sendCount);            
             return sendCount;
         } finally {
             end(sendCount >= 0);

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java?rev=418741&r1=418740&r2=418741&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java Mon Jul  3 03:57:09 2006
@@ -2417,7 +2417,23 @@
         sourceBuf.position(postion);
         assertEquals(CAPACITY_NORMAL - postion, dc.write(sourceBuf));
     }
-    
+
+    public void test_send_LBuffer_LSocketAddress_PositonNotZero()
+            throws Exception {
+        // regression test for Harmony-701
+        int CAPACITY_NORMAL = 256;
+        int postion = 16;
+        DatagramChannel dc = DatagramChannel.open();
+        byte[] sourceArray = new byte[CAPACITY_NORMAL];
+        // send ByteBuffer whose position is not zero
+        ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray);
+        sourceBuf.position(postion);
+        int ret = dc.send(sourceBuf, localAddr1);
+        // assert send (256 - 16) bytes  
+        assertEquals(CAPACITY_NORMAL - postion, ret);
+        // assert the position of ByteBuffer has been set
+        assertEquals(CAPACITY_NORMAL, sourceBuf.position());
+    }
 
     // -------------------------------------------------------------------
     // Mock class for security test.