| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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 |
| ]; |
| |
| } |
| |
| } |