/**
*******************************************************************************
* Copyright (C) 2007, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
*******************************************************************************
*/ 
package com.ibm.icu.charset;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;

class CharsetUTF32BE extends CharsetUTF32 {
    public CharsetUTF32BE(String icuCanonicalName, String javaCanonicalName, String[] aliases){
        super(icuCanonicalName, javaCanonicalName, aliases);
    }
    class CharsetDecoderUTF32BE extends CharsetDecoderUTF32{
        
        public CharsetDecoderUTF32BE(CharsetICU cs) {
            super(cs);
            mode=1;
        }
        protected CoderResult decodeLoopImpl(ByteBuffer source, CharBuffer target, IntBuffer offsets, boolean flush){
            return decodeLoopUTF32BE(source, target, offsets, flush);
        }
        protected int getChar(byte[] bytes, int length){
            int i=0, ch=0;
            while (i<length){
                ch |= (bytes[i] & UConverterConstants.UNSIGNED_BYTE_MASK) << ((3-i) * 8);
                i++;
            }
            return ch;
        }
    }
    public CharsetDecoder newDecoder() {
        return new CharsetDecoderUTF32BE(this);
    }
    class CharsetEncoderUTF32BE extends CharsetEncoderUTF32{

        public CharsetEncoderUTF32BE(CharsetICU cs) {
            super(cs);
            implReset();
        }

        protected void implReset() {
            super.implReset();
            fromUnicodeStatus = 0;
            writeBOM = false;
        }
    }
    public CharsetEncoder newEncoder() {
        return new CharsetEncoderUTF32BE(this);
    }
}
