Add check for a shutdown state and set engine state appropriately.

git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/java/branches/omd@999967 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java b/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
index e4cdb4e..77f8238 100644
--- a/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
+++ b/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
@@ -79,7 +79,7 @@
     private static native long initSSLEngine(long context);
     private static native HandshakeStatus connectImpl(long ssl);
     private static native HandshakeStatus acceptImpl(long ssl);
-    private static native SSLEngineResult wrapImpl(long sslEngineAddress,
+    private static native SSLEngineResult wrapImpl(long ssl, long sslEngineAddress,
             long src_address, int src_len, long dst_address, int dst_len);
     private static native SSLEngineResult unwrapImpl(long ssl, long sslEngineAddress,
             long src_address, int src_len, long dst_address, int dst_len);
@@ -570,7 +570,7 @@
             dst_address = AddressUtil.getDirectBufferAddress(dst_temp_buffer);
         }
         
-        SSLEngineResult result = wrapImpl(SSLEngineAddress, src_address, src_length, dst_address, dst_length);
+        SSLEngineResult result = wrapImpl(SSL, SSLEngineAddress, src_address, src_length, dst_address, dst_length);
         
         // update the buffers contents and positions
         srcs[0].position(srcs[0].position() + result.bytesConsumed());
diff --git a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
index f1d1f78..2123f39 100644
--- a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
+++ b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
@@ -130,13 +130,13 @@
 }
 
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
-  (JNIEnv *env, jclass clazz, jlong jsslengine, jlong src_address, int src_len, 
+  (JNIEnv *env, jclass clazz, jlong jssl, jlong jsslengine, jlong src_address, int src_len, 
   jlong dst_address, int dst_len) {
     _sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
     BIO *bio = sslengine->bio;
     BIO *bio_io = sslengine->bio_io;
-    SSL *ssl = NULL;
-    int write_result = 0, read_result = 0;
+    SSL *ssl = jlong2addr(SSL, jssl);
+    int write_result = 0, read_result = 0, shutdownState = 0;
     jobject handshake_state = NULL, engine_state = NULL, result = NULL;
     jclass result_class;
     jmethodID result_constructor;
@@ -144,7 +144,6 @@
     jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
     int initial_init_state, init_state;
 
-    BIO_get_ssl(bio, &ssl);
     initial_init_state = SSL_in_init(ssl);
     
     // write input data
@@ -162,6 +161,12 @@
         handshake_state = handshake_need_unwrap;
         engine_state = engine_ok;
     }
+
+    // Check if close_notify has been sent or received
+    shutdownState = SSL_get_shutdown(ssl);
+    if (shutdownState) {
+        engine_state = engine_closed;
+    }
     
     // read output data
     read_result = BIO_read(bio_io, dst_buffer, dst_len);
@@ -198,8 +203,8 @@
     _sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
     BIO *bio = sslengine->bio;
     BIO *bio_io = sslengine->bio_io;
-    SSL *ssl = NULL;
-    int write_result = 0, read_result = 0;
+    SSL *ssl = jlong2addr(SSL, jssl);
+    int write_result = 0, read_result = 0, shutdownState = 0;
     jobject handshake_state = NULL, engine_state = NULL, result = NULL;
     jclass result_class;
     jmethodID result_constructor;
@@ -207,7 +212,6 @@
     jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
     int initial_init_state, init_state;
 
-    BIO_get_ssl(bio, &ssl);
     initial_init_state = SSL_in_init(ssl);
     
     // write input data
@@ -218,11 +222,7 @@
     }
     
     // read output data
-    //read_result = BIO_read(bio, dst_buffer, dst_len);
-    read_result = SSL_read(ssl, dst_buffer, dst_len);
-    
-    // TODO: Check for  SSL_RECEIVED_SHUTDOWN
-
+    read_result = BIO_read(bio, dst_buffer, dst_len);
     if (read_result > 0) {
         // wrote some data so must not be handshaking
         handshake_state = handshake_not_handshaking;
@@ -236,6 +236,12 @@
         handshake_state = handshake_need_wrap;
         engine_state = engine_ok;
     }
+
+    // Check if close_notify has been sent or received
+    shutdownState = SSL_get_shutdown(ssl);
+    if (shutdownState) {
+        engine_state = engine_closed;
+    }
     
     init_state = SSL_in_init(ssl);
     // if not in SSL init state
diff --git a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
index 2b56fbe..80c1c59 100644
--- a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
+++ b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
@@ -32,7 +32,7 @@
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_connectImpl
   (JNIEnv *, jclass, jlong);
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
-  (JNIEnv *, jclass, jlong, jlong, int, jlong, int);
+  (JNIEnv *, jclass, jlong, jlong, jlong, int, jlong, int);
 JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_unwrapImpl
   (JNIEnv *, jclass, jlong, jlong, jlong, int, jlong, int);
 JNIEXPORT void JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_shutdownImpl