* @category class
* @package core
* @subpackage util
* @copyright 2005-2017 Titan Framework
* @license http://www.titanframework.com/license/ BSD License (3 Clause)
* @see Instance
*/
class Archive
{
static private $archive = FALSE;
private $mimeTypes = array ();
private $fileTable = '';
private $dataPath = '/dev/null';
const OPEN = '_FILE_OPEN_';
const IMAGE = '_FILE_IMAGE_';
const VIDEO = '_FILE_VIDEO_';
const AUDIO = '_FILE_AUDIO_';
const DOWNLOAD = '_FILE_DOWNLOAD_';
private final function __construct ()
{
$array = Instance::singleton ()->getArchive ();
if (!array_key_exists ('data-path', $array) || trim ($array ['data-path']) == '')
throw new Exception (__ ('The property [data-path] was not found or its empty in the tag from file [configure/titan.xml]!'));
$this->dataPath = $array ['data-path'];
if (!array_key_exists ('xml-path', $array))
throw new Exception (__ ('The property [xml-path] was not found in the tag of file [configure/titan.xml]!'));
$file = $array ['xml-path'];
if (!file_exists ($file))
throw new Exception (__ ('The Titan configuration file system does not exist at path [ [1] ]', $file));
$cacheFile = Instance::singleton ()->getCachePath () .'parsed/'. fileName ($file) .'_'. md5_file ($file) .'.php';
if (file_exists ($cacheFile))
$array = include $cacheFile;
else
{
$xml = new Xml ($file);
$array = $xml->getArray ();
$array = $array ['archive-mapping'][0];
xmlCache ($cacheFile, $array);
}
if (array_key_exists ('mime-type', $array))
{
if (!is_array ($array ['mime-type']))
$array ['mime-type'] = array ($array ['mime-type']);
foreach ($array ['mime-type'] as $key => $mime)
if (array_key_exists (0, $mime))
{
$key = $mime [0];
unset ($mime [0]);
$this->mimeTypes [$key] = $mime;
}
}
}
static public function singleton ()
{
if (self::$archive !== FALSE)
return self::$archive;
$class = __CLASS__;
self::$archive = new $class ();
return self::$archive;
}
public function getDataPath ()
{
return $this->dataPath;
}
public function getFilePath ($id)
{
return file_exists (File::getLegacyFilePath ($id)) ? File::getLegacyFilePath ($id) : File::getFilePath ($id);
}
public function isAcceptable ($mime, $assume = FALSE)
{
if ($assume !== FALSE && $assume != $this->getAssume ($mime))
return FALSE;
return array_key_exists ($mime, $this->mimeTypes);
}
public function getInfo ($mime)
{
if (!array_key_exists ($mime, $this->mimeTypes))
return array ();
return $this->mimeTypes [$mime];
}
public function getAllMimes ()
{
return $this->mimeTypes;
}
public function getMimesByType ($type)
{
switch ($type)
{
case self::IMAGE:
$assume = 'image';
break;
case self::VIDEO:
$assume = 'video';
break;
case self::AUDIO:
$assume = 'audio';
break;
case self::DOWNLOAD:
$assume = 'download';
break;
case self::OPEN:
$assume = 'open';
break;
default:
return array ();
}
$array = array ();
foreach ($this->mimeTypes as $mime => $data)
if ($data ['assume'] == $assume)
$array [] = $mime;
return $array;
}
public function getAssume ($mime)
{
if (!array_key_exists ($mime, $this->mimeTypes))
return self::DOWNLOAD;
if (!array_key_exists ('assume', $this->mimeTypes [$mime]))
return self::DOWNLOAD;
switch ($this->mimeTypes [$mime]['assume'])
{
case 'image':
return self::IMAGE;
case 'video':
return self::VIDEO;
case 'audio':
return self::AUDIO;
case 'open':
return self::OPEN;
}
return self::DOWNLOAD;
}
public function getFilter ($assume = FALSE)
{
$aux = array ();
foreach ($this->mimeTypes as $mime => $trash)
if ($assume === FALSE || $this->getAssume ($mime) == $assume)
$aux [] = $mime;
return implode (',', $aux);
}
public function getIcon ($mime)
{
if (!array_key_exists ($mime, $this->mimeTypes))
return 'file';
if (!array_key_exists ('icon', $this->mimeTypes [$mime]))
return 'file';
return $this->mimeTypes [$mime]['icon'];
}
public function getMimeByExtension ($extension)
{
foreach ($this->mimeTypes as $mime => $array)
{
if (array_key_exists ('extension', $array) && $array ['extension'] == $extension)
return $mime;
if (array_key_exists ('icon', $array) && $array ['icon'] == $extension)
return $mime;
}
return NULL;
}
public function getExtensionByMime ($mime)
{
if (!array_key_exists ($mime, $this->mimeTypes))
return '';
if (array_key_exists ('extension', $this->mimeTypes [$mime]) && trim ($this->mimeTypes [$mime]['extension']) != '')
return $this->mimeTypes [$mime]['extension'];
if (array_key_exists ('icon', $this->mimeTypes [$mime]) && trim ($this->mimeTypes [$mime]['icon']) != '')
return $this->mimeTypes [$mime]['icon'];
return '';
}
public function getUploadLimit ()
{
return self::getServerUploadLimit ();
}
public static function mimeType ($file)
{
if (function_exists ('finfo_open'))
{
$finfo = finfo_open (FILEINFO_MIME);
$mimeType = finfo_file ($finfo, $file);
finfo_close ($finfo);
return $mimeType;
}
if (function_exists ('mime_content_type'))
return mime_content_type ($file);
return NULL;
}
public static function getServerUploadLimit ()
{
$upload = (int) (ini_get ('upload_max_filesize'));
$post = (int) (ini_get ('post_max_size'));
$memory = (int) (ini_get ('memory_limit'));
return min ($upload, $post, $memory);
}
public static function is3GPPVideo ($file)
{
if (!file_exists ($file) || !is_readable ($file) || !(int) filesize ($file))
return FALSE;
return strpos (file_get_contents ($file), 'vide') !== FALSE;
}
}