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("","|~|",$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; } }