<?
class tar
{//DigiHex Systems\\


	function init() {}


	function tar($archiwum, $sciezka, $exclude=false, $custom_root_path=false) {
		if(!is_dir($sciezka) && !is_file($sciezka)) return false;
		if(!is_array($exclude)) $exclude=array();

		require_once(LIBS_PATH.'/system/pear.php');
		require_once($this->PATH.'/tar.class.php');
		
		$tar = new Archive_Tar($archiwum);
		$files=$this->tar_file_list($sciezka, $archiwum, $exclude);
		$tar->add($files, (!empty($custom_root_path) ? $custom_root_path : ROOT_PATH));
	
		if(@file_exists($archiwum) && filesize($archiwum)>0) return true;
	}

	
	function untar($archiwum, $cel=false, $remove_all_path=false, $remove_path=false) {
		global $X;
		if(!file_exists($archiwum) || filesize($archiwum)==0) return false;
		require_once(LIBS_PATH.'/system/pear.php');
		require_once($this->PATH.'/tar.class.php');

		$tar=new Archive_Tar($archiwum);
		if($remove_all_path==true) $rand_temp='/'.$X->STR->random(8).'/';
		$tar->extract($cel.$rand_temp, $remove_path);

		if($remove_all_path==true) $this->flat_extract($cel, $rand_temp);
		return true;
	}


	function tar_file_list($dirname, $archive, $exclude) {
		if(!is_dir($dirname) && !is_file($dirname)) return false;
		$dscan=array(realpath($dirname));
		$darr=array();
		while(!empty($dscan)) {
			$dcur=array_pop($dscan);
			$darr[]=$dcur;

			$skipped=false;
			if(count($exclude)>0) foreach($exclude as $ex_dir) {
				if(stristr($darr[$i], $ex_dir) || stristr($darr[$i].'/', $ex_dir)) { $skipped=true; break; }
			}
			if(is_file($dcur) && $skipped==false) {
				if($dcur!=$archive) $lista[]=$dcur;
			} else {
				if($d=opendir($dcur)) {
					while($f=readdir($d)) {
						if($f=='.' || $f=='..') continue;
						$f=$dcur.'/'.$f;
						if(is_dir($f)) {
							$dscan[]=$f; 
						} else {
							$skipped=false;
							if(count($exclude)>0) foreach($exclude as $ex_dir) {
								if(stristr($f, $ex_dir) || stristr($f.'/', $ex_dir)) { $skipped=true; break; }
							}
							if($skipped==false) $lista[]=$f;
						}
					}
					closedir($d);
				}
			}
		}
		for($i=count($darr)-1; $i>=1; $i--) {
			$skipped=false;
			if(count($exclude)>0) foreach($exclude as $ex_dir) {
				if(stristr($darr[$i], $ex_dir) || stristr($darr[$i].'/', $ex_dir)) { $skipped=true; break; }
			}
			if($skipped==false) $lista[]=$darr[$i];
		}

		return $lista;
	}


	function flat_extract($cel, $temp) {
		global $X;

		$dirname=$cel.$temp;		
		if(!is_dir($dirname) && !is_file($dirname)) return false;
		$dscan=array(realpath($dirname));
		$darr=array();
		while(!empty($dscan)) {
			$dcur=array_pop($dscan);
			$darr[]=$dcur;

			$skipped=false;
			if(count($exclude)>0) foreach($exclude as $ex_dir) {
				if(stristr($darr[$i], $ex_dir) || stristr($darr[$i].'/', $ex_dir)) { $skipped=true; break; }
			}
			if(is_file($dcur) && $skipped==false) {
				if($dcur!=$archive) $lista[]=$dcur;
			} else {
				if($d=opendir($dcur)) {
					while($f=readdir($d)) {
						if($f=='.' || $f=='..') continue;
						$f=$dcur.'/'.$f;
						if(is_dir($f)) {
							$dscan[]=$f; 
						} else {
							$skipped=false;
							if(count($exclude)>0) foreach($exclude as $ex_dir) {
								if(stristr($f, $ex_dir) || stristr($f.'/', $ex_dir)) { $skipped=true; break; }
							}
							if($skipped==false) $lista[]=$f;
						}
					}
					closedir($d);
				}
			}
		}

		foreach($lista as $file) rename($file, $cel.'/'.basename($file));
		$X->UTIL->rmdir_rf($cel.$temp);
	}


}//DigiHex Systems\\
?>