<?php
//vim: set expandtab tabstop=4 shiftwidth=4:

// Copyright (C) 1999-2006 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant � g�rer du contenu et des
// applications web.
                                                                                                      
// Ce logiciel est regi par la licence CeCILL soumise au droit francais et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusee par le CEA, le CNRS et l'INRIA 
// sur le site "http://www.cecill.info".

// En contrepartie de l'accessibilite au code source et des droits de copie,
// de modification et de redistribution accordes par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitee.  Pour les memes raisons,
// seule une responsabilite restreinte pese sur l'auteur du programme,  le
// titulaire des droits patrimoniaux et les concedants successifs.

// A cet egard  l'attention de l'utilisateur est attiree sur les risques
// associes au chargement,  a l'utilisation,  a la modification et/ou au
// developpement et a la reproduction du logiciel par l'utilisateur etant 
// donne sa specificite de logiciel libre, qui peut le rendre complexe a 
// manipuler et qui le reserve donc a des developpeurs et des professionnels
// avertis possedant  des  connaissances  informatiques approfondies.  Les
// utilisateurs sont donc invites a charger  et  tester  l'adequation  du
// logiciel a leurs besoins dans des conditions permettant d'assurer la
// securite de leurs systemes et ou de leurs donnees et, plus generalement, 
// a l'utiliser et l'exploiter dans les memes conditions de securite. 

// Le fait que vous puissiez acceder a cet en-tete signifie que vous avez 
// pris connaissance de la licence CeCILL, et que vous en avez accepte les
// termes.
// ----
// CVS : $Id: ezmlmAccessObject.class.php,v 1.6 2008-08-25 15:16:59 alexandre_tb Exp $

/**
* Application projet
*
* La classe ezmlmAccessObject
*
*@package projet
//Auteur original :
*@author        Alexandre Granier <alexandre@tela-botanica.org>
//Autres auteurs :
*@author        Aucun
*@copyright     Tela-Botanica 2000-2006
*@version       $Revision: 1.6 $
// +------------------------------------------------------------------------------------------------------+
*/

/** Etend XML_Parser_Simple */
require_once 'XML/Parser/Simple.php' ;

/**
 * Les codes erreurs
 */
 
define ('EZMLM_ACCESS_OBJECT_ACTION_NON_SUPPORTEE', 206) ;
/**
 * classe ezmlmAccessObject parse les fichiers XML
 * issue de ezmlm
 * 
 * @category XML  
 * @package projet
 * @author alex  
 */
 
class ezmlmAccessObject extends XML_Parser_Simple {
	
	/**
	 * Le domaine de la liste
	 */
	 
	var $domaine ;
	 
	 /**
	  * Le nom de la liste
	 */
	  
	var $liste ;
	  
	  /**
	  * Les actions valides
	  */
	   
	var $actions_supportees = array ('calendrier_messages',
									 'message',
									 'derniers_messages',
									 'messages_auteur',
									 'messages_mois',
									 'messages_thread',
									 'supprimer',
									 'liste_abonnes',
									 'nombre_messages');
	   
	/**
	* l'action selectionnee
	*/
	var $action ;
	
	/**
	 * La langue 'fr-FR'
	 */
	 var $langue ;
	
	/**
	 * L'url de base
	 */
	 var $url ;
	
	/**
	 * L'identifiant du repertoire
	 */ 
	var $identifiant_repertoire ;
	
	/**
	 * Identifiant message
	 */
	
	var $identifiant_message;

	/**
	 * L'identifiant du repertoire
	 */ 
	var $_numeroRepertoireSuivant ;
	
	/**
	 * L'identifiant du repertoire
	 */ 
	var $hash_auteur ;
	
	/**
	 * Le mois a afficher
	 */ 
	var $mois ;
	
	var $_numeraRepertoirePrecedent;
	
	/**
	 * Identifiant message
	 */
	
	var $_numeroFichierSuivant;
	
	var $_numeroFichierPrecedent;
	
	var $chemin_fichier_xml;
	
	/**
	 * Creation de l'objet d'acces
	 * 
	 */
	
	function ezmlmAccessObject ($action, $domaine, $liste, $langue = 'fr', $url = '') {
		$this->XML_Parser_Simple(null, 'func') ;
		$this->action = $action ;
		$this->domaine = $domaine ;
		$this->liste = $liste ;
		$this->langue = $langue ;
		$this->url = $url ;
	}
	
	/**
	 * Gestion des balises
	 * 
	 * Cette methode specifie les balises reconnus par ezmlmAccessObject
	 * Elle remplace la methode handleElement de XML_Parser_Simple
	 * 
	 * @access public
	 * @param string nom de l'element (Voir la doc de PHP)
	 * @param array attributes
	 * @param 
	 * @link http://fr.php.net/manual/fr/ref.xml.php manuel
	 */
	
	function handleElement_ezmlm_message ($name, $attribs, $data) {
		echo $data ;		
	}
	
	function handleElement_message_suivant ($name, $attribs, $data) {
		$this->_numeroRepertoireSuivant = $attribs['NUMERO_REPERTOIRE'] ;
		$this->_numeroFichierSuivant = $attribs['NUMERO'] ;
	}
	
	function handleElement_message_precedent ($name, $attribs, $data) {
		$this->_numeroRepertoirePrecedent = $attribs['NUMERO_REPERTOIRE'] ;
		$this->_numeroFichierPrecedent = $attribs['NUMERO'] ;
	}
	function handleElement_ezmlm_calendrier_messages ($name, $attribs, $data) { echo $data ; }
	
	function handleElement_ezmlm_derniers_messages ($name, $attribs, $data) { echo $data ; }
	
	function handleElement_ezmlm_messages_auteur ($name, $attribs, $data) { echo $data ; }
	
	function handleElement_ezmlm_messages_mois ($name, $attribs, $data) { echo $data ; }
	
	function handleElement_ezmlm_messages_thread ($name, $attribs, $data) { echo $data ; }
	
	function handleElement_ezmlm_liste_abonnes ($name, $attribs, $data) { echo $data ; }
	
	function handleElement_ezmlm_nombre_messages ($name, $attribs, $data) { echo $data ; }
	/**
	 * Choix de l'action
	 * 
	 * Liste des actions :
	 * 'calendrier_messages'
	 * 
	 * @access public
	 * @param string	une action qui doit etre support�
	 */
	
	function setAction($action) {
		// verification de l'action 
		if (!in_array($action, $this->actions_supportees)) {
			return raiseError(EZMLM_ACCESS_OBJECT_ACTION_NON_SUPPORTEE) ;	
		}
		$this->action = $action ;
		
		// Libere les ressources (XML_Parser::free)
		$this->free();
		
		// On vide l url
		//$this->url = '';
		$this->chemin_fichier_xml = '';
		// Charge la nouvelle action
		$this->load() ;
	}
	
	/**
	 * Charge une action
	 * 
	 * cad affecte un fichier xml au parser
	 * 
	 * @access public
	 */
	function load() {
		$this->chemin_fichier_xml = PROJET_SERVEUR_VPOPMAIL.'/'.$this->action.'.php?domaine='.
                         $this->domaine.'&liste='.$this->liste.'&langue='.
                         $this->langue ;
		if ($this->url != '') $this->chemin_fichier_xml.= '&url='.urlencode($this->url) ; 
		if (isset ($this->identifiant_repertoire)) 
			$this->chemin_fichier_xml .= '&actionargs[]='.$this->identifiant_repertoire ;
		if (isset ($this->identifiant_message)) 
			$this->chemin_fichier_xml .= '&actionargs[]='.$this->identifiant_message ;
		if (isset ($this->hash_auteur)) 
			$this->chemin_fichier_xml .= '&actionargs[]='.$this->hash_auteur ;
		if (isset ($this->mois)) 
			$this->chemin_fichier_xml .= '&actionargs[]='.$this->mois ;
		
		$this->setInputFile($this->chemin_fichier_xml) ;
	}
	
	/**
	 * Precise un message a extraire
	 * 
	 * On indique le numero de repertoire ezmlm et le numero du message
	 * @param	integer	le numero du repertoire
	 * @param 	integer le numero du message
	 * 
	 */
	 
	 function setIdMessage ($identifiant_repertoire, $identifiant_message) {
	 	$this->identifiant_repertoire = $identifiant_repertoire ;
	 	$this->identifiant_message = $identifiant_message ;	
	 }
	 
	 	/**
	 * Precise un auteur
	 * 
	 * On indique le numero de repertoire ezmlm et le numero du message
	 * @param	string	le hash d'un auteur
	 * 
	 */
	 
	 function setHashAuteur ($hash_auteur) {
	 	$this->hash_auteur = $hash_auteur;	
	 }
	 /**
	 * Precise un mois
	 * 
	 * On indique le numero de repertoire ezmlm et le num�ro du message
	 * @param	string	le hash d'un auteur
	 * 
	 */
	 
	 function setMois ($mois) {
	 	$this->mois = $mois;	
	 }
	 
	 /**
	  * Renvoi le numero du repertoire suivant
	  * 
	  * 
	 */
	 function getNumeroRepertoireSuivant() { return $this->_numeroRepertoireSuivant; } 
	 
	 function getNumeroFichierSuivant () { return $this->_numeroFichierSuivant ; }
	 
	 function getNumeroRepertoirePrecedent() { return $this->_numeroRepertoirePrecedent; }
	 
	 function getNumeroFichierPrecedent () { return $this->_numeroFichierPrecedent ; }
	 
	 function getNumeroMessage () { return $this->_numeroMessage ; }
	 
	 function getNombreTotalMessage () { return $this->_nombreTotalMessage ; }
	 
	 function parse()
    {
  		if (substr(phpversion(), 0, 1) == '5') {
  			try {
			    $xml = new SimpleXMLElement($this->chemin_fichier_xml, null, true);
			    switch ($this->action) {
  				case 'calendrier_messages' :echo $xml; 
	  				echo $xml->ezmlm_calendrier_messages;
	  				break;
	  				case 'message':
	  				echo $xml;
	  				$this->_numeroRepertoirePrecedent = $xml->message_precedent['numero_repertoire'];
	  				$this->_numeroRepertoireSuivant = $xml->message_suivant['numero_repertoire'];
	  				$this->_numeroFichierSuivant = $xml->message_suivant['numero'];
	  				$this->_numeroFichierPrecedent = $xml->message_precedent['numero'];
	  				$this->_numeroMessage = $xml->numero;
	  				$this->_nombreTotalMessage = $xml->numero['total_message'];
  				break;
  					case 'nombre_messages':
  					
  					echo $xml[0];
  					
  				break;
  					case 'liste_abonnes':
  					return $xml;
  				break;
  				default :
  					echo $xml;
  					
  				}
			    $error = 'Erreur dans l\'acc&egrave;s au fichier:<br />'.$this->chemin_fichier_xml.'<br />';
			    $error = '';
			   throw new Exception($error);
			}
			catch (Exception $e) {
			    echo $e->getMessage().'<br />';
			    //echo $this->chemin_fichier_xml;
			}
  			
  		} else {
  			return parent::parse();
  		}
    }
}

?>