WriteRequest processWrite()

in core/src/main/java/org/apache/mina/transport/nio/SslHelper.java [394:443]


    WriteRequest processWrite(AbstractIoSession session, Object message, Queue<WriteRequest> writeQueue) {
        WriteRequest request = null;
        
        switch (state) {
        case CREDENTAILS_AVAILABLE:
            ByteBuffer buf = (ByteBuffer) message;
            ByteBuffer appBuffer = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
            try {
                boolean done = false;
                while (!done) {
                    // Encrypt the message
                    SSLEngineResult result = sslEngine.wrap(buf, appBuffer);

                    switch (result.getStatus()) {
                    case BUFFER_OVERFLOW:
                        // Increase the buffer size as needed
                        appBuffer = ByteBuffer.allocate(appBuffer.capacity() + 4096);
                        break;
                    case CLOSED:
                        switchToNoSecure(session);
                        done = true;
                        break;

                    case BUFFER_UNDERFLOW:
                    case OK:
                        // We are done. Flip the buffer and push it to the write queue.
                        appBuffer.flip();
                        done = buf.remaining() == 0;
                        if (done) {
                            request = new DefaultWriteRequest(appBuffer, buf, done);
                        } else {
                            writeQueue.offer(new DefaultWriteRequest(appBuffer, buf, done));
                            appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity());
                        }
                        break;
                    }
                }
            } catch (SSLException se) {
                throw new IllegalStateException(se.getMessage());
            }
            break;
        case CREDENTIALS_NOT_YET_AVAILABLE:
            messages.add(new DefaultWriteRequest(message));
            break;
        case NO_CREDENTIALS:
            request = new DefaultWriteRequest(message);
            break;
        }
        return request;
    }