<?php if(!defined('IN_GS')){ die('you cannot load this page directly.'); }

/*
 * Logging Class for GetSimple
 * 
 * Writes log records to log files in data/other/logs
 * Deletes Log Files
 * No methods for reading log files ATM
 *
 * @author Shawn Alverson
 *
 * @requires basic.php
 *
 * @uses SimpleXMLExtended
 * @uses XMLSave
 * @uses addCData
 * @uses GSDATAOTHERPATH
 *
 * @param string $filename - filename.log
 * @param bool $logdefaults=true - logs default info, see defaults()
 *
 * example
 * $class= new GS_Logging_Class('logfilename.log'); // new log record for logfile (filename)
 * $class->add('field','value'); // add record entries to log record
 * $class->save(); // write log record to file
 * $class->clear(); // removes log file
 */
 
class GS_Logging_Class {

        private $_xml;
        private $_xmlfile;
        private $_entry;
  
        function __construct($filename,$logdefaults=true) {
                // check filename, must be .log
                
                if($this->validFilename($filename)){
                    $this->_xmlfile = GSDATAOTHERPATH.'logs/'.$filename;
                    if ( file_exists($this->_xmlfile) )  {
                        $xml = file_get_contents($this->_xmlfile);
                        if($xml) $this->_xml = simplexml_load_string($xml, 'SimpleXMLExtended', LIBXML_NOCDATA);
                        else $this->_xml = new SimpleXMLExtended('<?xml version="1.0" encoding="UTF-8"?><channel></channel>');
                    } else {
                        $this->_xml = new SimpleXMLExtended('<?xml version="1.0" encoding="UTF-8"?><channel></channel>');
                    }
                    
                    // create entry and add date
                    $thislog = $this->_xml->addChild('entry');
                    $thislog->addChild('date', date('r'));                
                    $this->_entry = $thislog;
                    
                    if($logdefaults==true) $this->defaults();  
                }
                else return false;
        }

         /* 
         * Checks valid filenames
         * Filename must have extension .log and not have path info
         *
         * @thows Exception
         * @returns bool success
         * 
         */   
        private static function validFilename($filename){
                $pathinfo=pathinfo($filename);
                if(!isset($pathinfo['extension']) || strtolower($pathinfo['extension']) != 'log' || $pathinfo['dirname']!='.'){
                  throw new Exception("Filename is not valid in GS_Logging_Class");                 
                }  else {
                  return true;
                }
        }
        
        /* 
         * Add default fields to log
         * Adds Username(If logged in),IP Address
         * 
         */   
        private function defaults(){
                GLOBAL $USR;
                
                if(isset($USR)){
                  $cdata = $this->_entry->addChild('Username');
                  $cdata->addCData(htmlentities($USR, ENT_QUOTES));
                }
                
                $cdata = $this->_entry->addChild('IP_Address');
                $ip = getenv("REMOTE_ADDR"); 
                $cdata->addCData(htmlentities($ip, ENT_QUOTES));  
        }

        /* 
         * Save Log Record
         * Writes file
         * 
         * @return success
         */    
        public function save(){
                return XMLsave($this->_xml, $this->_xmlfile);
        }

        /* 
         * Clear Log File
         * Deletes Log File
         * 
         * @return success
         */    
        public function clear(){
                if (is_file($this->_xmlfile)) {
                        $res = unlink($this->_xmlfile);
                        exec_action('logfile_delete');
                        return $res;
                }
        }
        
        /* 
         * Add Log Record Field
         * 
         * @param string $field
         * @param string $value
         *
         * @return success
         */    
        public function add($field,$value){
                if(isset($field) && isset($value) && isset($this->_entry)){
                      $cdata = $this->_entry->addChild(htmlentities($field, ENT_QUOTES));
                      $cdata->addCData(safe_slash_html($value));
                }  
        }
  
} // end of class                   

?>