<?

// поскольку серийный номер тома это очень не стабильная вещь, используем свой идентификатор, который вставляем в нашу папку

/*

$Disc_info = new Disc_info();
$disc_unid = new Disc_unid();

// берем все
$disc_unid->get($Disc_info->get_all(false));



*/

// unid может не сущестовать для диска если мы в него еще ничего не писали
class Disc_unid {

	private $base_folder_name;
	private $all_disc_unid = false; // Массив. Чтобы каждый раз не пересканировать диски, храним здесь все найденные unid


	function __construct() {
		GLOBAL $Disc_info, $Paths;

		$this->base_folder_name = $Paths->folder_root;
		
		if($disc_mas = $Disc_info->get_all(false))
			$this->all_disc_unid = $this->get($disc_mas);
	}
	
	// сканирует переданные диски и ищем там нашу папку с unid
	function get($disc_ar_or_letter) {
		GLOBAL $Disc_info;

		if(is_array($disc_ar_or_letter))
			$disc_ar = $disc_ar_or_letter;
		else $disc_ar = array($disc_ar_or_letter);

		$result_ar = array();
		foreach($disc_ar as $disc_name) {
			$disc_name = strtoupper($disc_name);
			$unid = '';

			if(!$Disc_info->isReady($disc_name))
				continue;

			$folder_ar = false;
			err_no(); // вдруг попадем на диск где туго с правами чтения
			$folder_ar = list_folders($disc_name.':\\');
			err_yes();
			
			if($folder_ar) {
				foreach($folder_ar as $folder) {
					if($res = $this->get_from_str($folder)) {
						$unid = $res;
						break;
					}
				}
			}

			$result_ar[$disc_name] = $unid;
		}

		if(is_array($disc_ar_or_letter))
			 return $result_ar;
		else return reset($result_ar); // потому что там индеск буква диска
	}

	// поиск в строке
	function get_from_str($str) {
		if(!strstr($str, $this->base_folder_name))
			return false;

		if(!preg_match('#ID([a-z\d]+)#i', $str, $res))
			return false;

		return $res[1];
	}

	// добавление unid в конец строки
	function add_to_str($str, $unid) {
		if($this->get_from_str($str))
			throw new Error_def("В строке уже есть unid");
		
		$str .= "_ID$unid";
		return $str;
	}

	function get_disc_name($unid) {
		if($this->all_disc_unid === false)
			throw new Error_def("Не определен all_disc_unid");

		$letter = array_search($unid, $this->all_disc_unid);
		return $letter;
	}


	// у диска unid есть только в случае если мы уже записывали на него что-то и создали папку для тестовых блоков
	function get_by_disc_name($name) {
		if($this->all_disc_unid === false)
			throw new Error_def("Не определен all_disc_unid");

		$name = strtoupper($name);
		$unid = false; 
		if(isset($this->all_disc_unid[$name]))
			$unid = $this->all_disc_unid[$name];
		
		return $unid;
	}

	// создаем unid. просто берем время с микросекудами и переводим в 36-ную систему для экономии места
	function generate() {
		list($usec, $sec) = explode(" ", microtime());
		$usec = substr($usec, 2 , 5);

		// потому что если их сначала соединить ($sec . $usec), получится число выходящее за рамки int
		$sec36 = base_convert($sec, 10, 36);
		$usec36 = base_convert($usec, 10, 36);

		//print "$sec $usec\n";
		//print "$sec36 $usec36\n";

		$unid = $sec36 . $usec36;
		return $unid;
	}

}


?>