Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   *  Licensed to the Apache Software Foundation (ASF) under one or more
   *  contributor license agreements.  See the NOTICE file distributed with
   *  this work for additional information regarding copyright ownership.
   *  The ASF licenses this file to You under the Apache License, Version 2.0
   *  (the "License"); you may not use this file except in compliance with
   *  the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
  *
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
 
 package org.apache.tomcat.util.buf;
 
NIO based character encoder.

Author(s):
Remy Maucherat
 
 public class C2BConverter {
     
     protected CharsetEncoder encoder = null;
     protected ByteBuffer bb = null;
     protected CharBuffer cb = null;

    
Leftover buffer used for multi-characters characters.
 
     protected CharBuffer leftovers = null;

    
Create an encoder for the specified charset.
 
     public C2BConverter(String charset)
         throws IOException {
         try {
              = EncodingToCharset.toCharset(charset).newEncoder();
         } catch (UnsupportedCharsetException e) {
             throw new UnsupportedEncodingException(charset);
         }
         char[] left = new char[4];
          = CharBuffer.wrap(left);
     }

    
Reset the encoder state.
 
     public void recycle() {
         .reset();
         .position(0);
     }
 
     public boolean isUndeflow() {
         return (.position() > 0);
     }

    
Convert the given characters to bytes.

Parameters:
cc char input
bc byte output
 
     public void convert(CharChunk ccByteChunk bc
     throws IOException {
         if (( == null) || (.array() != bc.getBuffer())) {
             // Create a new byte buffer if anything changed
              = ByteBuffer.wrap(bc.getBuffer(), bc.getEnd(), 
                     bc.getBuffer().length - bc.getEnd());
         } else {
             // Initialize the byte buffer
             .limit(bc.getBuffer().length);
             .position(bc.getEnd());
         }
         if (( == null) || (.array() != cc.getBuffer())) {
             // Create a new char buffer if anything changed
              = CharBuffer.wrap(cc.getBuffer(), cc.getStart(), 
                     cc.getLength());
         } else {
             // Initialize the char buffer
             .limit(cc.getEnd());
             .position(cc.getStart());
         }
         CoderResult result = null;
         // Parse leftover if any are present
        if (.position() > 0) {
            int pos = .position();
            // Loop until one char is encoded or there is a encoder error
            do {
                .put((charcc.substract());
                .flip();
                result = .encode(false);
                .position(.limit());
                .limit(.array().length);
            } while (result.isUnderflow() && (.position() == pos));
            if (result.isError() || result.isMalformed()) {
                result.throwException();
            }
            .position(cc.getStart());
            .position(0);
        }
        // Do the decoding and get the results into the byte chunk and the char chunk
        result = .encode(false);
        if (result.isError() || result.isMalformed()) {
            result.throwException();
        } else if (result.isOverflow()) {
            // Propagate current positions to the byte chunk and char chunk
            bc.setEnd(.position());
            cc.setOffset(.position());
        } else if (result.isUnderflow()) {
            // Propagate current positions to the byte chunk and char chunk
            bc.setEnd(.position());
            cc.setOffset(.position());
            // Put leftovers in the leftovers char buffer
            if (cc.getLength() > 0) {
                .limit(.array().length);
                .position(cc.getLength());
                cc.substract(.array(), 0, cc.getLength());
            }
        }
    }
    
New to GrepCode? Check out our FAQ X