blob: 738fce015dbffdca894f354e00fbe10bc6f69eba [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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 HexEncoder
{
/**
* @private
* Set encodingStyle to this value to encode using upper case 'A'-'F'.
*/
public static const UPPER_CASE:String = "upper";
/**
* @private
* Set encodingStyle to this value to encode using lower case 'a'-'f'.
*/
public static const LOWER_CASE:String = "lower";
/**
* @private
* The default encoding style for all HexEncoders.
*/
public static var encodingStyle:String = UPPER_CASE;
/**
* @private
* Constructor.
*/
public function HexEncoder()
{
super();
_buffers = [];
_buffers.push([]);
}
/**
* @private
* The encoding style for this HexEncoder instance.
* If not set, the default static encodingStyle is used.
*/
public var encodingStyle:String;
/**
* @private
*/
public function encode(data:ByteArray, offset:uint = 0, length:uint = 0):void
{
if (length == 0)
length = data.length;
if (offset < length)
{
data.position = offset;
}
var style:String = (this.encodingStyle != null) ? this.encodingStyle : HexEncoder.encodingStyle;
// Validate style; coerce invalid values to UPPER.
if (style != UPPER_CASE && style != LOWER_CASE)
style = UPPER_CASE;
var digits:Array = (style == UPPER_CASE) ? UPPER_CHAR_CODES : LOWER_CHAR_CODES;
while (data.bytesAvailable > 0)
{
encodeBlock(data.readByte(), digits);
} // while
}
/**
* @private
*/
public function drain():String
{
var result:String = "";
for (var i:uint = 0; i < _buffers.length; i++)
{
var buffer:Array = _buffers[i] as Array;
result += String.fromCharCode.apply(null, buffer);
}
_buffers = [];
_buffers.push([]);
return result;
}
/**
* @private
*/
public function flush():String
{
return drain();
}
/**
* @private
*/
private function encodeBlock(_work:int, digits:Array):void
{
var currentBuffer:Array = _buffers[_buffers.length - 1] as Array;
if (currentBuffer.length >= MAX_BUFFER_SIZE)
{
currentBuffer = [];
_buffers.push(currentBuffer);
}
currentBuffer.push(digits[(_work & 0xF0) >>> 4]);
currentBuffer.push(digits[(_work & 0x0F)]);
}
/**
* An Array of buffer Arrays.
* @private
*/
private var _buffers:Array;
/**
* @private
*/
private var _work:int = 0;
/**
* This value represents a safe number of characters (i.e. arguments) that
* can be passed to String.fromCharCode.apply() without exceeding the AVM+
* stack limit.
*
* @private
*/
public static const MAX_BUFFER_SIZE:uint = 32767;
/*
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
*/
private static const UPPER_CHAR_CODES:Array =
[
48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 65, 66, 67, 68, 69, 70,
];
/*
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
*/
private static const LOWER_CHAR_CODES:Array =
[
48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 97, 98, 99, 100, 101, 102
];
}
}