<?php

/*************************************************

applicationobject.php - a pseudo-implementation of ASPs application object

home page: www.samscripts.com/scripts/application_object
support: support.samscripts.com/index.php

licence: freeware / optionally giftware ( www.samscripts.com/donate.php )
author: Sam Yapp
date: 8th September 2002

documentation and examples at www.samscripts.com

*************************************************/


class _appdata{
    function 
_appdata(){}
}

class 
application{

    function 
application($appfilepath = "", $win98 = false){
        
$this->_win98 = $win98;
        
$this->_filepath = $appfilepath;
        
$this->_fp = 0;
        
$this->_mode = "";
        
$this->_fplock = 0;
    }


    function 
getdata(&$data){
        foreach(
$data as $k=>$v){
            
$this->$k = $v;
        }
    }

    function 
flock(&$fp, $mode){
        if( 
$this->_win98 ) return true;
        return 
flock($fp, $mode);
    }

    function 
open($mode = "r"){
        if( 
$this->_mode == "" ){
            switch( 
$mode ){
                case 
"w":
                    
$this->_fplock = @fopen($this->_filepath.".lock", "r");
                    if( !
$this->_fplock ){
                        
$this->_fplock = @fopen($this->_filepath.".lock", "w");
                    }
                    if( 
$this->_fplock ){
                        if( 
$this->flock($this->_fplock, LOCK_EX) ){
                            
$this->_fp = @fopen($this->_filepath, "rb");
                            if( 
$this->_fp){
                                
$data = unserialize(fread($this->_fp, filesize($this->_filepath)));
                                
fclose($this->_fp);
                            
$this->getdata(&$data);
                            }
                            
$this->_mode = "w";
                        }else{
                            
fclose($this->_fplock);
                        }
                    }
                    break;
                default:
                    
$this->_fp = @fopen($this->_filepath, "rb");
                    if( 
$this->_fp ){
                        if( 
$this->flock($this->_fp, LOCK_SH) ){
                            
$data = unserialize(fread($this->_fp, filesize($this->_filepath)));
                            
$this->flock($this->_fp, LOCK_UN);
                            
$this->getdata(&$data);
                        }
                        
fclose($this->_fp);
                        
$this->_fp = 0;
                    }
                    break;
            }
        }
    }

    function 
close(){
        if( 
$this->_mode == "w" && $this->_fplock != 0 ){
            
$data = new _appdata;
            foreach( 
$this as $k=>$v){
                if( !
in_array($k, array("_fplock", "_mode", "_fp", "_filepath", "_win98")) )
                    
$data->$k = $v;
            }
            
$this->_fp = @fopen($this->_filepath, "wb");
            if( 
$this->_fp ){
                if( 
$this->flock($this->_fp, LOCK_EX) ){
                    
fwrite($this->_fp, serialize($data));
                    
$this->flock($this->_fp, LOCK_UN);
                }
                
fclose($this->_fp);
            }
            
$this->flock($this->_fplock, LOCK_UN);
            
fclose($this->_fplock);
            
$this->_mode = "";
            
$this->_fp = 0;
            
$this->_fplock = 0;
        }
    }

}
?>