Implemented natives for TwoStackPlainSocketImpl
authorJan Vrany <jan.vrany@fit.cvut.cz>
Wed, 05 Nov 2014 11:01:57 +0000
changeset 3265 dcaeeee3e396
parent 3264 69fc19f5e37d
child 3266 c8b892ed8c91
child 3276 e35a94591cb1
Implemented natives for TwoStackPlainSocketImpl IPv6 not supported (BCC has no IPv6 support at all) so only IPv4 is supported. As the layout of the object and native methods are sufficiently similar to PlainSocketImpl, just dispatch to natives for is (i.e., call natives for PlainSocketImpl)
JavaNativeMethodImpl_OpenJDK6.st
JavaNativeMethodImpl_OracleJDK7.st
--- a/JavaNativeMethodImpl_OpenJDK6.st	Tue Nov 04 13:58:33 2014 +0000
+++ b/JavaNativeMethodImpl_OpenJDK6.st	Wed Nov 05 11:01:57 2014 +0000
@@ -739,7 +739,7 @@
 
     file isNil ifTrue:[
         JavaVM
-    throwIOExceptionWithMessage:('stream with file descriptor %1 closed or was never open'
+            throwIOExceptionWithMessage:('stream with file descriptor %1 closed or was never open'
             bindWith:fileNo).
         ^ nil
     ].
@@ -13127,11 +13127,14 @@
     "Modified: / 17-08-2012 / 15:27:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-_java_net_PlainSocketImpl_socketSendUrgentData: this _: a1
+_java_net_PlainSocketImpl_socketSendUrgentData: this _: data
 
     <javanative: 'java/net/PlainSocketImpl' name: 'socketSendUrgentData(I)V'>
 
-    ^ JavaVM unimplementedNativeMethodSignal raise
+    | sock |
+
+    sock := self validateFile: this.
+    sock nextPut: (data & 16rFF)
 !
 
 _java_net_PlainSocketImpl_socketSetOption: this _:a1 _: a2 _: a3
@@ -13209,11 +13212,14 @@
     "Modified: / 14-08-2013 / 15:37:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-_java_net_PlainSocketImpl_socketShutdown: this _: a1
-
+_java_net_PlainSocketImpl_socketShutdown: this _: what
     <javanative: 'java/net/PlainSocketImpl' name: 'socketShutdown(I)V'>
-
-    ^ JavaVM unimplementedNativeMethodSignal raise
+    "Shuts down either reading (what = 0) or writing (what = 1) end of a socket"
+
+    | sock |
+
+    sock := self validateFile: this.
+    sock shutdown: what.
 !
 
 _java_net_SocketInputStream_init: this
--- a/JavaNativeMethodImpl_OracleJDK7.st	Tue Nov 04 13:58:33 2014 +0000
+++ b/JavaNativeMethodImpl_OracleJDK7.st	Wed Nov 05 11:01:57 2014 +0000
@@ -108,6 +108,106 @@
     ^ JavaVM unimplementedNativeMethodSignal raise
 ! !
 
+!JavaNativeMethodImpl_OracleJDK7 class methodsFor:'native - java.net'!
+
+_java_net_TwoStacksPlainSocketImpl_initProto: this 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'initProto()V'>
+
+    "/ Nothing to do here...
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketAccept: this _: a1 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketAccept(Ljava/net/SocketImpl;)V'>
+
+    ^ self _java_net_PlainSocketImpl_socketAccept: this _:a1
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketAvailable: this 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketAvailable()I'>
+
+    ^self _java_net_PlainSocketImpl_socketAvailable: this
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketBind: this _: addr _: port _: boolean 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketBind(Ljava/net/InetAddress;IZ)V'>
+
+    | family |
+
+    family := (addr instVarNamed: #holder) instVarNamed: #family.
+    family == 2"IPv6" ifTrue:[
+        JavaVM throwSocketException: 'IPv6 protocol not supported'.
+        ^self.
+    ].
+
+    (this instVarNamed: #fd) isNil ifTrue:[
+        JavaVM throwSocketException: 'Socket closed'.
+        ^self.
+    ].
+
+    ^self _java_net_PlainSocketImpl_socketBind: this _: addr _:  port
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketClose0: this _: a1 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketClose0(Z)V'>
+
+    self commonClose: this
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketConnect: this _:jaddr _: port _: timeout
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketConnect(Ljava/net/InetAddress;II)V'>
+
+    self _java_net_PlainSocketImpl_socketConnect: this _:jaddr _: port _: timeout
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketCreate: this _: a1 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketCreate(Z)V'>
+
+    self _java_net_PlainSocketImpl_socketCreate: this _: a1.
+    this instVarNamed: #fd1 put: nil.
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketGetOption: this _: a1 _: a2 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketGetOption(ILjava/lang/Object;)I'>
+
+    ^ self _java_net_PlainSocketImpl_socketGetOption: this _:a1 _: a2
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketListen: this _: a1 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketListen(I)V'>
+
+    ^self _java_net_PlainSocketImpl_socketListen: this _:a1
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketNativeSetOption: this _: a1 _: a2 _: a3 
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketNativeSetOption(IZLjava/lang/Object;)V'>
+
+    ^self _java_net_PlainSocketImpl_socketSetOption: this _:a1 _: a2 _: a3
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketSendUrgentData: this _: data
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketSendUrgentData(I)V'>
+
+    ^ self _java_net_PlainSocketImpl_socketSendUrgentData: this _: data
+!
+
+_java_net_TwoStacksPlainSocketImpl_socketShutdown: this _: what
+
+    <javanative: 'java/net/TwoStacksPlainSocketImpl' name: 'socketShutdown(I)V'>
+
+    ^ self _java_net_PlainSocketImpl_socketShutdown: this _: what
+! !
+
 !JavaNativeMethodImpl_OracleJDK7 class methodsFor:'native - sun.misc'!
 
 _sun_misc_Unsafe_shouldBeInitialized: this _: a1