Author: mheath
Date: Tue Mar 20 08:53:28 2007
New Revision: 520447

URL: http://svn.apache.org/viewvc?view=rev&rev=520447
Log:
Fixed support for heap ByteBuffers and writes.

Modified:
    mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp

Modified: mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp
URL: 
http://svn.apache.org/viewvc/mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp?view=diff&rev=520447&r1=520446&r2=520447
==============================================================================
--- mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp (original)
+++ mina/sandbox/mheath/aioj/trunk/src/main/c/org_apache_aio.cpp Tue Mar 20 
08:53:28 2007
@@ -359,7 +359,7 @@
 
 jobject doReadWrite(JNIEnv *env, jobject channel, jobject buffer, jlong 
position, int flag)
 {
-               jclass bufferClass = env->GetObjectClass(buffer);
+       jclass bufferClass = env->GetObjectClass(buffer);
        
        // Get buffer limit and position
        jint bufferPosition = getByteBufferPosition(env, buffer, bufferClass);
@@ -386,11 +386,21 @@
        req->buffers[0].allocatedBufferSize = bufferSizeToAllocate;
        if (address == NULL) {
                address = getBufferAddress(req, 0);
+
+               // Copy contents of Byte Buffer to address
+               if (byteBufferHasArray(env, buffer, bufferClass)) {
+                       jbyteArray array = getByteBufferArray(env, buffer, 
bufferClass);
+                       jbyte *arrayPtr = (jbyte 
*)env->GetPrimitiveArrayCritical(array, NULL);
+                       memcpy(address, arrayPtr, bufferSize);
+                       env->ReleasePrimitiveArrayCritical(array, arrayPtr, 0);
+                       env->DeleteLocalRef(array);
+               } else {
+                       // TODO: Handle byte buffers that don't support arrays
+                       LOG_DEBUG("Buffer does not have array\n");
+               }
        }
        req->buffers[0].buffer = address;
        
-       // TODO: If doing write with heap buffer, copy data from byteBuffer to 
allocated space 
-       
        // Create future object
        jobject future = createPosixReadWriteAioFuture(env, channel, req, 
buffer, position);
        req->future = env->NewGlobalRef(future);
@@ -440,6 +450,8 @@
                        cleanupPosixAio(env, req);
                        env->ThrowNew(aioException, "error issuing aio_read 
request");
                }
+               // Advance byteBuffer position
+               setByteBufferPosition(env, buffer, bufferClass, bufferSize);    
                        
        } else {
                LOG_DEBUG("Oops doing nothing\n");
                // Throw exception


Reply via email to