getRequestMode() != -1) return true;
return false;
}
function processRequest()
{
$requestMode = $this->getRequestMode();
$sFunctionName = "";
$bFoundFunction = true;
$aArgs = array();
$bEndRequest = false;
$objResponse = $this->_objXajax->getGlobalResponse();
$objTempResponse = NULL;
$aFunctions = $this->_objXajax->getRegisteredFunctions();
$aEvents = $this->_objXajax->getRegisteredEvents();
$aCallableObjects = $this->_objXajax->getRegisteredCallableObjects();
// Check to see if headers have already been sent out, in which case we can't do our job
if (headers_sent($filename, $linenumber)) {
echo "Output has already been sent to the browser at $filename:$linenumber.\nPlease make sure the command " . '$xajax->processRequests() is placed before this.';
if ($this->_objXajax->getFlag("exitAllowed")) {
exit();
}
else {
return;
}
}
// Load in the xajax function and arguments
if ($requestMode == XAJAX_POST) {
$sFunctionName = $_POST["xajax"];
if (!empty($_POST["xajaxargs"]))
$aArgs = $_POST["xajaxargs"];
} else {
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
$sFunctionName = $_GET["xajax"];
if (!empty($_GET["xajaxargs"]))
$aArgs = $_GET["xajaxargs"];
}
$aArgs = $this->_processInputArgs($aArgs);
// Use xajax error handler if necessary
if ($this->_objXajax->getFlag("errorHandler")) {
$GLOBALS['xajaxErrorHandlerText'] = "";
set_error_handler("xajaxErrorHandler");
}
// Call "beforeProcessing" events
if (!empty($aEvents["beforeProcessing"])) {
foreach ($aEvents["beforeProcessing"] as $callback)
{
$mReturn = call_user_func_array($callback, array($sFunctionName, $aArgs, &$this->_objXajax));
if (is_array($mReturn)) {
if ($mReturn[0] === false) {
$bEndRequest = true;
}
$objTempResponse = $mReturn[1];
}
else {
$objTempResponse = $mReturn;
}
if ($objTempResponse != $objResponse) {
$objResponse->loadCommands($objTempResponse);
}
}
if ($bEndRequest) {
$this->_outputResponse($objResponse);
return;
}
}
// Check to see if a function can be found or not
if (array_key_exists($sFunctionName, $aFunctions))
{
// Include any external dependencies associated with this function name
if (isset($aFunctions[$sFunctionName]["include"])) {
ob_start();
include_once($aFunctions[$sFunctionName]["include"]);
ob_end_clean();
}
// Call the function
$callback = $aFunctions[$sFunctionName]["callback"];
$objTempResponse = call_user_func_array($callback, $aArgs);
if (!is_a($objTempResponse, 'xajaxResponse')) {
$this->_outputError("No xajaxResponse Was Returned By Function $sFunctionName.");
return;
}
if ($objTempResponse != $objResponse) {
// Load any previous response commands into the new response object
$objTempResponse->loadCommands($objResponse, true);
}
// We're successful; output the response now!
$this->_outputResponse($objTempResponse);
return;
}
// A function was not found. Let's check callable objects
if ($aCallableObjects) {
foreach ($aCallableObjects as $object) {
$names[] = get_class($object);
if (method_exists($object, $sFunctionName) || method_exists($object, "__call")) {
// Attemping to call the object
$objTempResponse = call_user_func_array(array(&$object, $sFunctionName), $aArgs);
if (!is_a($objTempResponse, 'xajaxResponse')) {
$this->_outputError("No xajaxResponse Was Returned By Method $sFunctionName of " . get_class($object));
return;
}
if ($objTempResponse != $objResponse) {
// Load any previous response commands into the new response object
$objTempResponse->loadCommands($objResponse, true);
}
// We're successful; output the response now!
$this->_outputResponse($objTempResponse);
return;
}
}
}
// Call "onMissingFunction" events
if (!empty($aEvents["onMissingFunction"])) {
$bEndRequest = false;
foreach ($aEvents["onMissingFunction"] as $callback)
{
$bEndRequest = true;
$objTempResponse = call_user_func_array($callback, array($sFunctionName, $aArgs, &$this->_objXajax));
if ($objTempResponse != $objResponse) {
$objResponse->loadCommands($objTempResponse);
}
}
if ($bEndRequest) {
$this->_outputResponse($objResponse);
return;
}
}
// We've made it this far and nothing has handled the request. Darn!
$this->_outputError("The Registered Function $sFunctionName Could Not Be Found.\n\nIf there are any functions requiring an automatic PHP include, make sure the filenames are correct.");
}
function _outputResponse($objResponse)
{
$sEncoding = $this->_objXajax->getCharEncoding();
$bErrorHandler = $this->_objXajax->getFlag("errorHandler");
$sLogFile = $this->_objXajax->getLogFile();
// Output content type
$sContentHeader = "Content-type: ".$objResponse->getContentType().";";
if ($sEncoding && strlen(trim($sEncoding)) > 0)
$sContentHeader .= " charset=".$sEncoding;
header($sContentHeader);
// If there are errors recorded by xajax's error handler, output them
if ($bErrorHandler && !empty($GLOBALS['xajaxErrorHandlerText'])) {
$errorResponse = new xajaxResponse();
$errorResponse->alert("** PHP Error Messages: **" . $GLOBALS['xajaxErrorHandlerText']);
if ($sLogFile) {
$fH = @fopen($sLogFile, "a");
if (!$fH) {
$errorResponse->alert("** Logging Error **\n\nxajax was unable to write to the error log file:\n" . $sLogFile);
}
else {
fwrite($fH, "** xajax Error Log - " . strftime("%b %e %Y %I:%M:%S %p") . " **" . $GLOBALS['xajaxErrorHandlerText'] . "\n\n\n");
fclose($fH);
}
}
$objResponse->loadCommands($errorResponse, true);
}
// Clean buffer maybe
if ($this->_objXajax->getFlag("cleanBuffer")) while (@ob_end_clean());
// Output the response and exit (maybe!)
if ($this->_objXajax->getFlag("allowBlankResponse") && $objResponse->getCommandCount() === 0) {
// do nothing
} else {
print $objResponse->getOutput();
}
if ($bErrorHandler) restore_error_handler();
if ($this->_objXajax->getFlag("exitAllowed")) exit();
}
function _outputError($errorMsg)
{
$objResponse = new xajaxResponse();
$objResponse->alert($errorMsg);
$this->_outputResponse($objResponse);
}
/**
* Converts the raw input arguments into proper xajax arguments.
* You can subclass xajax and extend this method to perform additional conversion
* steps such as input filtering.
*
* @param array the arguments to process
* @access protected
* @return array
*/
function _processInputArgs($aArgs) {
for ($i = 0; $i < sizeof($aArgs); $i++)
{
// If magic quotes is on, then we need to strip the slashes from the args
if (get_magic_quotes_gpc() == 1 && is_string($aArgs[$i])) {
$aArgs[$i] = stripslashes($aArgs[$i]);
}
if (stristr($aArgs[$i],"") != false)
{
$aArgs[$i] = $this->_xmlToArray("xjxobj",$aArgs[$i]);
}
else if (stristr($aArgs[$i],"") != false)
{
$aArgs[$i] = $this->_xmlToArray("xjxquery",$aArgs[$i]);
}
else if ($this->_objXajax->getFlag("decodeUTF8Input"))
{
$aArgs[$i] = $this->_decodeUTF8Data($aArgs[$i]);
}
}
return $aArgs;
}
/**
* Takes a string containing xajax xjxobj XML or xjxquery XML and builds an
* array representation of it to pass as an argument to the PHP function
* being called.
*
* @param string the root tag of the XML
* @param string XML to convert
* @access protected
* @return array
*/
function _xmlToArray($rootTag, $sXml)
{
$aArray = array();
$sXml = str_replace("<$rootTag>","<$rootTag>|~|",$sXml);
$sXml = str_replace("$rootTag>","$rootTag>|~|",$sXml);
$sXml = str_replace("","|~|",$sXml);
$sXml = str_replace("","|~|",$sXml);
$sXml = str_replace("","|~|",$sXml);
$sXml = str_replace("","|~||~|",$sXml);
$sXml = str_replace("","|~|",$sXml);
$sXml = str_replace("","|~||~|",$sXml);
$sXml = str_replace("","|~|",$sXml);
$sXml = str_replace("
","|~|
|~|",$sXml);
$this->aObjArray = explode("|~|",$sXml);
$this->iPos = 0;
$aArray = $this->_parseObjXml($rootTag);
return $aArray;
}
/**
* A recursive function that generates an array from the contents of
* $this->aObjArray.
*
* @param string the root tag of the XML
* @access protected
* @return array
*/
function _parseObjXml($rootTag)
{
$aArray = array();
if ($rootTag == "xjxobj")
{
while(!stristr($this->aObjArray[$this->iPos],""))
{
$this->iPos++;
if(stristr($this->aObjArray[$this->iPos],""))
{
$key = "";
$value = null;
$this->iPos++;
while(!stristr($this->aObjArray[$this->iPos],""))
{
if(stristr($this->aObjArray[$this->iPos],""))
{
$this->iPos++;
while(!stristr($this->aObjArray[$this->iPos],""))
{
$key .= $this->aObjArray[$this->iPos];
$this->iPos++;
}
}
if(stristr($this->aObjArray[$this->iPos],""))
{
$this->iPos++;
while(!stristr($this->aObjArray[$this->iPos],""))
{
if(stristr($this->aObjArray[$this->iPos],""))
{
$value = $this->_parseObjXml("xjxobj");
$this->iPos++;
}
else
{
$value .= $this->aObjArray[$this->iPos];
if ($this->_objXajax->getFlag("decodeUTF8Input"))
{
$value = $this->_decodeUTF8Data($value);
}
}
$this->iPos++;
}
}
$this->iPos++;
}
//decode the CDATA stuff
$key = str_replace(array(''), '', $key);
$value = str_replace(array(''), '', $value);
$aArray[$key]=$value;
}
}
}
if ($rootTag == "xjxquery")
{
$sQuery = "";
$this->iPos++;
while(!stristr($this->aObjArray[$this->iPos],""))
{
if (stristr($this->aObjArray[$this->iPos],"") || stristr($this->aObjArray[$this->iPos],"
"))
{
$this->iPos++;
continue;
}
$sQuery .= $this->aObjArray[$this->iPos];
$this->iPos++;
}
parse_str($sQuery, $aArray);
if ($this->_objXajax->getFlag("decodeUTF8Input"))
{
foreach($aArray as $key => $value)
{
$aArray[$key] = $this->_decodeUTF8Data($value);
}
}
// If magic quotes is on, then we need to strip the slashes from the
// array values because of the parse_str pass which adds slashes
if (get_magic_quotes_gpc() == 1) {
$newArray = array();
foreach ($aArray as $sKey => $sValue) {
if (is_string($sValue))
$newArray[$sKey] = stripslashes($sValue);
else
$newArray[$sKey] = $sValue;
}
$aArray = $newArray;
}
}
return $aArray;
}
/**
* Decodes string data from UTF-8 to the current xajax encoding.
*
* @param string data to convert
* @access protected
* @return string converted data
*/
function _decodeUTF8Data($sData)
{
$sValue = $sData;
if ($this->_objXajax->getFlag("decodeUTF8Input"))
{
$sFuncToUse = NULL;
if (function_exists('iconv'))
{
$sFuncToUse = "iconv";
}
else if (function_exists('mb_convert_encoding'))
{
$sFuncToUse = "mb_convert_encoding";
}
else if ($this->_objXajax->getCharEncoding() == "ISO-8859-1")
{
$sFuncToUse = "utf8_decode";
}
else
{
trigger_error("The incoming xajax data could not be converted from UTF-8", E_USER_NOTICE);
}
if ($sFuncToUse)
{
if (is_string($sValue))
{
if ($sFuncToUse == "iconv")
{
$sValue = iconv("UTF-8", $this->_objXajax->getCharEncoding().'//TRANSLIT', $sValue);
}
else if ($sFuncToUse == "mb_convert_encoding")
{
$sValue = mb_convert_encoding($sValue, $this->_objXajax->getCharEncoding(), "UTF-8");
}
else
{
$sValue = utf8_decode($sValue);
}
}
}
}
return $sValue;
}
}