////////////////////////////////////////////////////////////////////////////////
//
//  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 mx.utils
{

import flash.utils.ByteArray;


[ExcludeClass]

/**
 *  Documentation is not currently available.
 *  Ported to ActionScript from flex/messaging/util/Hex.java
 *  @private
 */
public class HexDecoder
{
    /**
     *  @private
     *  Constructor.
     */
    public function HexDecoder()
    {
        super();
        _output = new ByteArray();
    }

    /**
     *  @private
     */
    public function decode(encoded:String):void
    {
        for (var i:int = 0; i < encoded.length; i++)
        {
            _work[0] = digit(encoded.charAt(i));
            
            i++;
            _work[1] = digit(encoded.charAt(i));

            _output.writeByte(((_work[0] << 4) | (_work[1])) & 0xff);
        }
    }

    /**
     * Returns the decimal representation of a hex digit.
     * @private 
     */
    public function digit(char:String):int
    {
        switch (char) 
        {
            case "A": 
            case "a":           
                return 10;
            case "B":
            case "b":
                return 11;
            case "C":
            case "c":
                return 12;
            case "D":
            case "d":
                return 13;
            case "E":
            case "e":
                return 14;                
            case "F":
            case "f":
                return 15;
            default:
                return new Number(char);
        }    
    }

    /**
     *  @private
     */
    public function drain():ByteArray
    {
        var result:ByteArray = _output;
        _output = new ByteArray();
        result.position = 0;
        return result;
    }

    /**
     *  @private
     */
    public function flush():ByteArray
    {
        return drain();
    }

    /**
     *  @private
     */
    private var _output:ByteArray;

    /**
     *  @private
     */
    private var _work:Array = [ 0, 0 ];

}

}
