/**
* Debug
* Designed for version 0.81 to 0.96.7 of the Arthropod Debugger.
*
* USE AT YOUR OWN RISK!
* Any trace that is made with arthropod may be viewed by others.
* The main purpose of arthropod and this debug class is to debug
* unpublished AIR applications or sites in their real
* environment (such as a web-browser). Future versions of
* Arthropod may change the trace-engine pattern and may cause
* traces for older versions not work properly.
*
* A big thanks goes out to:
* Stockholm Postproduction - www.stopp.se
* Lee Brimelow - www.theflashblog.com
*
* @author Carl Calderon 2008
* @version 0.73
* @link http.//www.carlcalderon.com/
* @since 0.61
*/
package com.carlcalderon.arthropod {
import flash.display.BitmapData;
import flash.events.StatusEvent;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.net.LocalConnection;
import flash.system.System;
import flash.utils.ByteArray;
public class Debug {
/**
* Version control
*/
public static const NAME :String = 'Debug';
public static const VERSION :String = '0.72';
/**
* Predefined colors
*/
public static var RED :uint = 0xCC0000;
public static var GREEN :uint = 0x00CC00;
public static var BLUE :uint = 0x6666CC;
public static var PINK :uint = 0xCC00CC;
public static var YELLOW :uint = 0xCCCC00;
public static var LIGHT_BLUE :uint = 0x00CCCC;
/**
* Status event
* If false, arthropod will trace error messages.
*/
public static var ignoreStatus :Boolean = true;
/**
* Security (not tested)
* If secure is true, only the secureDomain
will be accepted.
*/
public static var secure :Boolean = false;
/**
* A single domain to be used as the secure domain. (not tested)
*/
public static var secureDomain :String = '*';
/**
* Switches tracing on/off.
* TIP: Set this switch to false before release of AIR applications.
*/
public static var allowLog :Boolean = true;
/**
* DO NOT CHANGE THESE VALUES! IF CHANGED, ARTHROPOD MIGHT NOT WORK PROPERLY!
*/
private static const DOMAIN :String = 'com.carlcalderon.Arthropod';
private static const CHECK :String = '.161E714B6C1A76DE7B9865F88B32FCCE8FABA7B5.1';
private static const TYPE :String = 'app';
private static const CONNECTION :String = 'arthropod';
private static const SECURITY :String = 'CDC309AF';
private static const LOG_OPERATION :String = 'debug';
private static const ERROR_OPERATION :String = 'debugError';
private static const WARNING_OPERATION :String = 'debugWarning';
private static const ARRAY_OPERATION :String = 'debugArray';
private static const BITMAP_OPERATION :String = 'debugBitmapData';
private static const OBJECT_OPERATION :String = 'debugObject';
private static const MEMORY_OPERATION :String = 'debugMemory';
private static const CLEAR_OPERATION :String = 'debugClear';
private static var lc :LocalConnection = new LocalConnection();
private static var hasEventListeners :Boolean = false;
/**
* Traces a message to Arthropod
*
* @param message Message to be traced
* @param color opt. Color of the message
* @return True if successful
*/
public static function log(message:String,color:uint=0xFEFEFE) :Boolean {
return send ( LOG_OPERATION, message, color );
}
/**
* Traces a warning to Arthropod.
* The message will be displayed in yellow.
*
* @param message Message to be traced
* @return True if successful
*/
public static function error(message:String) :Boolean {
return send ( ERROR_OPERATION, message, 0xCC0000 );
}
/**
* Traces an error to Arthropod.
* The message will be displayed in red.
*
* @param message Message to be traced
* @return True if successful
*/
public static function warning(message:String) :Boolean {
return send ( WARNING_OPERATION, message, 0xCCCC00 );
}
/**
* Clears all the traces, including arrays and bitmaps
* from the Arthropod application window.
*
* @return True if successful
*/
public static function clear ( ) :Boolean {
return send ( CLEAR_OPERATION, 0, 0x000000 ) ;
}
/**
* Traces an array to Arthropod.
*
* If no earlier arrays have been traced,
* Arthropod will open up the array-window
* automatically. For each array that is traced,
* the array-window will clear and display the
* new one. This is useful for buffer-arrays, etc.
*
* @param arr Array to be traced
* @return True if successful
*/
public static function array ( arr:Array ) :Boolean {
return send ( ARRAY_OPERATION, arr,null ) ;
}
/**
* Traces a thumbnail of the specified BitmapData
* to Arthropod.
*
* The internal connection between Arthropod and
* the Debug class only accept calls less than
* 40Kb. The bitmap method converts the specified
* BitmapData to an acceptable size for the call.
*
* @param bmd BitmapData to be traced as
* a thumbnail
* @return True if successful
*/
public static function bitmap ( bmd:BitmapData ) :Boolean {
var bm:BitmapData = new BitmapData ( 100, 100, true, 0x00FFFFFF ) ;
var mtx:Matrix = new Matrix ( ) ;
var s:Number = 100 / (( bmd.width >= bmd.height ) ? bmd.width : bmd.height ) ;
mtx.scale ( s, s ) ;
bm.draw ( bmd, mtx,null,null,null,true ) ;
var bounds:Rectangle = new Rectangle ( 0, 0, Math.floor(bmd.width*s), Math.floor(bmd.height*s) ) ;
var ba:ByteArray = bm.getPixels ( bounds ) ;
return send ( BITMAP_OPERATION, ba, bounds ) ;
}
/**
* Traces an object
to Arthropod.
* The first level of arguments are traced as follows:
*
* trace:
* Debug.object( { name: Carl, surname: Calderon } );
*
* output:
* object
* name: Carl
* surname: Calderon
*
* @param obj Object to be traced
* @return True if successful
*/
public static function object ( obj:*) :Boolean {
return send ( OBJECT_OPERATION, obj, null ) ;
}
/**
* Traces the current memory size used by Adobe Flash Player.
* Observe that this also includes AIR applications (such as
* Arthropod). Use with care.
*
* @return True if successful
*/
public static function memory ( ) :Boolean {
return send ( MEMORY_OPERATION, System.totalMemory, null ) ;
}
/**
* [internal-use]
* Sends the message
*
* @param operation Operation name
* @param value Value to send
* @param color opt. Color of the message
*/
private static function send( operation:String,value:*, prop:* ):Boolean {
if (!secure) lc.allowInsecureDomain('*');
else lc.allowDomain(secureDomain);
if (!hasEventListeners) {
if ( ignoreStatus ) lc.addEventListener(StatusEvent.STATUS, ignore);
else lc.addEventListener(StatusEvent.STATUS, status);
hasEventListeners = true;
}
if(allowLog){
try {
lc.send ( TYPE + '#' + DOMAIN + CHECK + ':' + CONNECTION , operation, SECURITY, value, prop ) ;
return true;
} catch (e:Error) {
return false;
}
}
return false;
}
/**
* [internal-use]
* Traces the status of the Debugger.
*
* @see ignoreStatus
* @param e StatusEvent
*/
private static function status(e:StatusEvent):void {
trace( 'Arthropod status:\n' + e.toString() );
}
/**
* [internal-use]
* Method used to ignore StatusEvent's if an error occurs.
*
* @see ignoreStatus
* @param e StatusEvent
*/
private static function ignore(e:StatusEvent):void { }
}
}