<?php
/**
 * The Exception class is the internal static class used to output user defined
 * exceptions to the output stream.
 * 
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 * @copyright (c) 2003 amfphp.org
 * @package flashservices
 * @subpackage exception
 * @author Justin Watkins Original Design 
 * @version $Id$
 */

/**
 * Linked classes
 */
require_once(AMFPHP_BASE . "shared/app/Constants.php");

/**
 * Remove the html formatting of the error messages so they can be easily formatted
 * inside flash.
 */
@ini_set("html_errors", 0);

class MessageException {
	/**
	 * Constructor for the Exception class. This is how you build a new
	 * error instance.
	 * 
	 * @param string $code The code string to return to the flash client :: THIS SHOULD PROBABLY BE SET AUTOMATICALLY ::
	 * @param string $description A short reason why the error occured
	 * @param string $file The file name that the error occured
	 * @param int $line The line number where the error was detected
	 */
	function MessageException ($code, $description, $file, $line, $detailCode = 'AMFPHP_RUNTIME_ERROR') {
		$this->code = $detailCode;
		$this->description = $description; // pass the description    
		$this->details = $file; // pass the details
		$this->level = MessageException::getFriendlyError($code); 
		$this->line = $line; // pass the line number
	}
	
	/**
	 * throwException provides the means to raise an exception.  This method will 
	 * stop the further execution of the remote method, but not hault the execution
	 * of the entire process.  Using the built in PHP exception system will stop
	 * the entire process and not allow us to report very detailed information back
	 * to the client, especially if there are multiple methods.
	 * 
	 * When we upgrade to PHP 5, using the try...catch syntax will make this much easier.
	 * 
	 * @static
	 * @param AMFBody $body The AMFBody object to apply the exception to.
	 * @param AMFException @exception The exception object to throw
	 * @see AMFBody
	 */ 
	function throwException (&$body, $exception) {
		$body->responseURI = $body->responseIndex . "/onStatus";
		$results = &$body->getResults();

		if($GLOBALS['amfphp']['encoding'] == 'amf3')
		{
			$results = new ErrorMessage();
			$results->correlationId = $GLOBALS['amfphp']['lastMessageId'];
			$results->faultCode = $exception->code;
			$results->faultDetail = $exception->details . ' on line ' . $exception->line;
			$results->faultString = $exception->description;
		}
		elseif($GLOBALS['amfphp']['encoding'] == 'amf0')
		{
			$results["description"] = $exception->description;
			$results["details"] = $exception->details;
			$results["level"] = $exception->level;
			$results["line"] = $exception->line;
			$results["code"] = $exception->code;
		}
		else
		{
			$results['faultCode'] = $exception->code;
			$results['faultDetail'] = $exception->details . ' on line ' . $exception->line;
			$results['faultString'] = $exception->description;
		}
	} 
	
	function getFriendlyError ($err) {
		$errortype = array (1 => "Error",
			2 => "Warning",
			4 => "Parsing Error",
			8 => "Notice",
			16 => "Core Error",
			32 => "Core Warning",
			64 => "Compile Error",
			128 => "Compile Warning",
			256 => "User Error",
			512 => "User Warning",
			1024 => "User Notice",
			2048 => "Strict error",
			);
		if(isset($errortype[$err]))
		{
			return $errortype[$err];
		}
		else
		{
			return "Unknown error type";
		}
	} 
} 

?>