<?php
/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
* Fichier UserSessionManager.php
*
* Ce fichier contient la classe UserSessionManager
*
* @author Initiance <www.initiance.com|olivier@initiance.com & Christophe HEURTAUX>
* @link www.rooty.me
* @since 2004/06/05
* @version 0.3
* @package system_data
* @subpackage UserSession
* @copyright Copyright &copy; 2009-2018, Rooty
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################

/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
* <p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}


/**
* Appel à la classe UserSession...
*/
require ($CONF_LIB_PATH."lib/system/system_data/usersession/usersession.php");

/**
* Classe UserSessionManager
* 
* <p>Classe de gestion des instances de UserSessions <br>
*   (permet de fabriquer, detruire, mettre à jour des objet UserSessions)<br>
* Cette classe se sert des ressources à sa disposition (dans ./ressource)<br>
* Les Classes de ressource doivent avoir toutes les methodes correspondantes <br>
* aux methodes de la classe intitulés sourceXXX</p>
* 
* <p>Est configuré dans data_acces.php : <br>
* - La Source d'information (Db)<br>
* l'objet ressource se sert lui-même des classes d'accés aux données(lib/data_source/...)<br>
* </p>
* @package system_data
* @subpackage UserSession
*/
class UserSessionManager extends Manager
{

	//
	// Constructor
	//
/**
* Constructeur de la classe UserSessionManager (PHP5)
*
* @access public
*/
	function __construct()
	{
	}


###########################################################################
#### Méthodes abstraites
###########################################################################

/**
* doLoadId: Charge la UserSession depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit être un entier
* </p>
* @access public
* @abstract
* @param entier identifiant de l'association UserSession
* @return tableau
*/
	function doLoadFromId($id)
	{
		return array();
	}

/**
* doInsert: Insert la UserSession dans la BD
*
* <P>Insertion dans la Bd</P>
* @param entier identifiant de l'utilisateur
* @param entier identifiant du groupe
* @param booleen is node only
* @param booleen is forbidden
* @abstract
* @access public
* @return entier
*/
	function doInsert($id, $user, $userPreference, $langue, $ip, $entryNodeId, $navigationNodeId, $session_begin, $lastAction, $url, $session_vars="")
	{
		return 0;
	}

/**
* doUpdate:Modifie la UserSession dans la BD
*
* <P>Mise à jour de la UserSession</P>
* @param entier identifiant de l'association
* @param entier identifiant de l'utilisateur
* @param entier identifiant du groupe
* @param booleen is node only
* @param booleen is forbidden
* @access public 
* @abstract
* @return booleen
*/
	function doUpdate($id, $user, $userPreference, $langue, $ip, $entryNodeId, $navigationNodeId, $session_begin, $lastAction, $url, $session_vars="")
	{
		return 0;
	}

/**
* doDelete : Detruit le UserSession dans la BD
*
* <P>Suppression de l'association Group et User à partir de son identifiant</P>
* @param entier identifiant
* @abstract
* @access public
* @return booleen
*/
	function doDelete($id)
	{
		return true;
	}

/**
* doClean : Detruit les users sessions dont le délai est dépassé
*
* @param entier identifiant
* @abstract
* @access public
* @return booleen
*/
	function doClean( $time )
	{
	}


###########################################################################
#### Methodes privee
###########################################################################

/**
* sourceLoadFromUserId : charge à partir d'un identifiant utilisateur
*
* <p>Permet le récupération des infos d'un objet UserSession à partir de son identifiant</p>
* <p>Retourne un tableau contenant les infos de l'objets<br>
* <br>ou faux si n'existe pas
* </p>
* @param identifiant de l'association UserSession
* @access private
* @return tableau
*/
	function sourceLoadFromId($id)
	{
		$tab=$this->doLoadFromId($id);
		# Gestion d'un tableau intermediaire avec la reprise des elements

		if ((isset($tab["user_obj"])))
		{
			$tab["user_obj"]= unserialize(base64_decode($tab["user_obj"]));
			$tab["user_preference"]= unserialize(base64_decode($tab["user_preference"]));
			$tab["langue"]= unserialize(base64_decode($tab["langue"]));
			$tab["session_vars"]=unserialize(base64_decode($tab["session_vars"]));
		}
		return $tab;
	}

/**
* sourceInsertFromParam : Insert la UserSession
* 
* <p>Insertion de l'objet UserSession dans la source de données<br>
* indifférement du type de cette source</p>
* <p>Retourne L'identifiant de l'objet insérer</p>
* @param chaine libelle de la UserSession
* @param chaine repertoire de la UserSession
* @param chaine icone de la UserSession
* @param entier état de la UserSession (active ou inactive)
* @access private
* @return entier
*/
	function sourceInsert($id, $user, $userPreference, $langue, $ip, $entryNodeId, $navigationNodeId, $session_begin, $lastAction, $url, $session_vars="")
	{
		return $this->doInsert($id, base64_encode(serialize($user)),  base64_encode(serialize($userPreference)),  base64_encode(serialize($langue)), $ip, $entryNodeId, $navigationNodeId, $session_begin, $lastAction, $url, base64_encode(serialize($session_vars)));
	}

/**
* sourceUpdateFromParam : Met à jour la UserSession
*
* <p>Mise à jour de l'objet indifferemment de la source de données</p>
* @param entier identifiant
* @param chaine libelle de la UserSession
* @param chaine repertoire de la UserSession
* @param chaine icone de la UserSession
* @param entier état de la UserSession (active ou inactive)
* @access private
* @return booleen
*/
	function sourceUpdate($id, $user, $userPreference, $langue, $ip, $entryNodeId, $navigationNodeId, $session_begin, $lastAction, $url, $session_vars="")
	{
		return $this->doUpdate($id, base64_encode(serialize($user)),  base64_encode(serialize($userPreference)),  base64_encode(serialize($langue)), $ip, $entryNodeId, $navigationNodeId, $session_begin, $lastAction, $url, base64_encode(serialize($session_vars)));
	}

/**
* sourceDeleteFromId : Detruit la UserSession
*
* <p>Suppression de l'objet à partir de son identifiant</p>
* @param entier identifiant de l'association UserSession
* @access private
* @return booleen
*/
	function sourceDeleteFromId($ids)
	{
		return $this->doDelete($ids);
	}


###########################################################################
#### Methodes public
###########################################################################

/**
* createNewInstance : créer un objet vierge
*
* @access public
* @return object
*/
	function createNewInstance()
	{
		return new UserSession();
	}



/**
* createInstance : récupére l'instance de la session courante
*
* @param entier identifiant de l'association UserSession
* @access public
* @return object retourne un objet de type UserSession
*/
	function createInstance()
	{
		$return = new UserSession();
		/* Récupération des infos */
		$tab=$this->sourceLoadFromId($return->id);
		if (is_array($tab) && isset($tab["id"]))
		{
			if ( $GLOBALS["CONF_CHECK_IP"]==true )
			{
				if ( $GLOBALS["SYSTEM_IP"]==$tab["ip"] )
				{
					/* création et alimentation de l'objet */
					$return->doLoad($tab["user_obj"], $tab["user_preference"], $tab["langue"], $tab["ip"], $tab["entry_node_id"], $tab["navigation_node_id"], $tab["session_begin"], $tab["last_action"], $tab["url"], $tab["session_vars"]);
					$return->isNew=false;
					return $return;
				}
			}else{
				/* création et alimentation de l'objet */
				$return->doLoad($tab["user_obj"], $tab["user_preference"], $tab["langue"], $tab["ip"], $tab["entry_node_id"], $tab["navigation_node_id"], $tab["session_begin"], $tab["last_action"], $tab["url"], $tab["session_vars"]);
				$return->isNew=false;
				return $return;
			}
		}

		/* si l'objet n'a pas peu être loadé */
		$return->defaultSession();
		$return->isNew=true;

		return $return;
	}
/**
* deleteInstance : detruit l'objet physique
*
* @param object objet UserSession à effacer
* @access public
* @return object objetUserSession mis à jour
*/
	function deleteInstance($obj)
	{
		$return = false;
		if ((strtolower(get_class($obj))=="usersession") )
		{
			/* Récupération des infos */
			$this->CallSystemPlugin("__deleteUserSession", $obj);
			$return=$this->sourceDeleteFromId($obj->id);
			return $obj;
		}

		return $obj;
	}

/**
* updateInstance : met à jour l'objet
*
* @param object objet UserSession à modifier
* @access public
* @return object objetUserSession mis à jour
*/
	function updateInstance($obj)
	{
		$return = false;
		if ((strtolower(get_class($obj))=="usersession") && ($obj->isNew==false))
		{
			/* Récupération des infos */
			$id=$this->sourceUpdate($obj->id, $obj->user, $obj->userPreference, $obj->langue, $obj->ip, $obj->entryNodeId, $obj->navigationNodeId, $obj->begin, $obj->lastAction, $obj->url, $obj->session_vars);
			$this->CallSystemPlugin("__updateUserSession", $obj);
			return $obj;
		}
		/* Erreur */
		$systemError=3;
		$classe="UserSessionManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}

/**
* insertInstance : créer enregistre l'objet
*
* <p>affecte l'id de l'objet si nécessaire</p>
* @param object objet UserSession à inserer
* @access public
* @return object objetUserSession mis à jour
*/
	function insertInstance($obj)
	{
		if ((strtolower(get_class($obj))=="usersession"))
		{
			if ($obj->isNew==true)
			{
				/* Récupération des infos */
				$id=$this->sourceInsert($obj->id, $obj->user, $obj->userPreference, $obj->langue, $obj->ip, $obj->entryNodeId, $obj->navigationNodeId, $obj->begin, $obj->lastAction, $obj->url, $obj->session_vars);
				$this->CallSystemPlugin("__insertUserSession", $obj);
				return $obj;
			}
		}
		/* Erreur */
		$systemError=3;
		$classe="UserSessionManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);

		return $obj;
	}

/**
* saveInstance : créer enregistre l'objet
*
* @param object objet UserSession à sauvegarder
* @access public
* @return object objetUserSession mis à jour
*/
	function saveInstance($obj)
	{
		if ((strtolower(get_class($obj))=="usersession"))
		{
			if ($obj->isNew==true)
			{
				$return=$this->insertInstance($obj);
			}else{
				$return=$this->updateInstance($obj);
			}
			return $return;
		}
		/* Erreur */
		$systemError=3;
		$classe="UserSessionManager";
		$message="Erreur objet invalide ";
		addError($systemError, $classe, $message, __line__, __file__);
		$return=$obj;

		return $return;
	}

/**
* cleanInstance : detruit les instance non valides
*
* @param time temps de validitée des instances de session
* @access public
* @return object objetUserSession mis à jour
*/
	function cleanInstance($time)
	{
		$this->doClean( $time );
	}
}
?>
