<?php
/**
 *
 * @author Peter Csubak (chuby)
 * @copyright Peter Csubak (chuby)
 */

/**
 * Ajax alapú kapcsolatot biztosító osztály. A JSLib-ben található javascript függvények által vezérelhető
 * osztály, ami a kéréseket a PEA-beli metódushívásokra, illetve eseményekre fordít le, és azok visszatérési
 * értékét, illetve azok által kiváltott eseményeket adja eredményül a hívó javascripteknek.
 * Tehát ennek az osztálynak a példányával lehet vezérelni a web alapú PEA alkalmazásokat.
 * 
 * <<Singleton>>
 */
class AjaxConnector{

	private static $Instance = null;

	/**
	 * Szabályos singleton példánykérő metódus. Tehát egy példányt ad vissza, ha már létezik egy példány,
	 * akkor mindig ugyan azt. Ha nem akkor, létrehoz egyet. Gyakorlatilag ez a metódus szolgál a 
	 * példányosító utasítás helyett.
	 * 
	 * @return AjaxConnector
	 */
	public static function getInstance(){
		if (self::$Instance == null){
			self::$Instance = new AjaxConnector();
		}
		return self::$Instance;
	}

	/**
	 * A singleton miatt kell hogy privát metódus legyen a konstruktor, pélányosítás helyett a 
	 * getInstance metódust kell használni.
	 */
	private function __construct(){
	}

	/**
	 * Ajax alapú kérések feldolgozására szolgáló metódus. Egyetlen paramétere van, ami az
	 * üzenet átadására szolgál, alapértelmezett értéke (inpost) alapján a POST metódussal beküldött
	 * üzenetet dolgozza fel a metódus. Ezen túl elfogad még string formátumban laírt xml-t, illetve
	 * SimpleXMLElement típusú objektumot is. Visszatérési értékben pedig a kérésre adott választ adja 
	 * meg, string formában. Minthogy a kérés is lehet metódushívás, és esemény, így nyilván, ha 
	 * metódushívásról van szó, akkor a metódus hívás visszatérési értéke, amennyiben pedig esemény, 
	 * akkor az esemény feldolgozása alatt kiváltott események lesz a válasz.
	 * 
	 * @param mixed $message Az üzenet átadására szolgáló paraméter. Alapértelmezésben inpost érték
	 * ami azt jelenti, hogy az üzenet a POST változóban található, mint raw data. Természetesen
	 * lehet még string formátumú xml is, illetve SimpleXMLElement típusú objektum is.
	 * @return string A kérésre adott válasz, ha a kérés metódushívás volt, akkor a válasz a metódushívás 
	 * visszatérési értéke, a megfelelő módon serializálva. Amennyiben a kérés esemény volt, akkor az
	 * esemény feldolgozása által kiváltott események a válasz (amennyiben vannak), a megfelelő módon 
	 * serializálva. A visszatérési érték tartalmazhatja még természetesen a feldolgozás során kiváltott
	 * kivételt is. 
	 */
	public function processMessage($message = "inpost"){
		try{
			if ($message == "inpost"){
				$message = $GLOBALS["HTTP_RAW_POST_DATA"];
			}
			if(!($message instanceof SimpleXMLElement)){
				$message = new SimpleXMLElement($message);
			}
			if ($message->getName() == "call"){
				$name = $message->name."";
				$class = $message->class."";
				$params = null;
				if ($message->params != ""){
					$params = array();
					foreach ($message->params as $p){
						$params[$p->getName()] = $p."";
					}
				}
				SessionPeaHandler::getInstance()->ajaxMethodCall($class, $name, $params);
				return SessionPeaHandler::getInstance()->serializeExportableEvents(true);
			}elseif ($message->getName() == "event"){
				if ($_COOKIE["PHPSESSID"] == ""){
					throw new AjaxException("Hiba, nincs megnyitva aktív folyamat.", null, 903);
				}
				SessionPeaHandler::getInstance()->resumeSession($_COOKIE["PHPSESSID"]);
				$event = XmlSerializer::deserializeEvent($message, "ajax");
				//echo $event->getSendedFrom();
				$comps = SessionPeaHandler::getInstance()->getComponents();
				if (is_array($comps)){
					foreach ($comps as $comp){
						if ($comp->getId() == $event->getSendedFrom()){
							$event->setSender($comp);
							break;
						}
					}
				}else{
					$event->setSender($this);
				}
				EventHandler::sendEvent($event);
				SessionPeaHandler::getInstance()->pauseSession(session_id());
				return SessionPeaHandler::getInstance()->serializeExportableEvents();
			}else{
				throw new AjaxException("Feldolgozhatatlan üzenet.", null, 900);
			}
		}catch (Exception $e){
			return XmlSerializer::serializeException($e);
		}
	}

}
?>