protected function get($args)
{
$target = $args['target'];
$volume = $this->volume($target);
$enc = false;
if (!$volume || ($file = $volume->file($target)) == false) {
return array('error' => $this->error(self::ERROR_OPEN, '#' . $target, self::ERROR_FILE_NOT_FOUND));
}
if (($content = $volume->getContents($target)) === false) {
return array('error' => $this->error(self::ERROR_OPEN, $volume->path($target), $volume->error()));
}
$mime = isset($file['mime']) ? $file['mime'] : '';
if ($mime && strtolower(substr($mime, 0, 4)) === 'text') {
$enc = '';
if (!$args['conv'] || $args['conv'] == '1') {
// detect encoding
if ($content === '') {
$enc = '';
} else {
if (function_exists('mb_detect_encoding')) {
if ($enc = mb_detect_encoding($content, mb_detect_order(), true)) {
$encu = strtoupper($enc);
if ($encu === 'UTF-8' || $encu === 'ASCII') {
$enc = '';
}
} else {
$enc = 'unknown';
}
} else {
if (!preg_match('//u', $content)) {
$enc = 'unknown';
}
}
if ($enc === 'unknown') {
$enc = $volume->getOption('encoding');
if (!$enc || strtoupper($enc) === 'UTF-8') {
$enc = 'unknown';
}
}
if ($enc && $enc !== 'unknown') {
$utf8 = iconv($enc, 'UTF-8', $content);
if ($utf8 === false && function_exists('mb_convert_encoding')) {
$utf8 = mb_convert_encoding($content, 'UTF-8', $enc);
if (mb_convert_encoding($utf8, $enc, 'UTF-8') !== $content) {
$enc = 'unknown';
}
} else {
if ($utf8 === false || iconv('UTF-8', $enc, $utf8) !== $content) {
$enc = 'unknown';
}
}
if ($enc !== 'unknown') {
$content = $utf8;
}
}
if ($enc) {
if ($args['conv'] == '1') {
$args['conv'] = $enc === 'unknown' ? '' : $enc;
} else {
if ($enc === 'unknown') {
return array('doconv' => $enc);
}
}
}
}
}
if ($args['conv']) {
$enc = $args['conv'];
if (strtoupper($enc) !== 'UTF-8') {
$_content = $content;
$content = iconv($enc, 'UTF-8', $content);
if ($content === false && function_exists('mb_convert_encoding')) {
$content = mb_convert_encoding($_content, 'UTF-8', $enc);
}
} else {
$enc = '';
}
}
}
if ($enc !== false) {
if ($content !== false) {
$json = json_encode($content);
}
if ($content === false || $json === false || strlen($json) < strlen($content)) {
return array('error' => $this->error(self::ERROR_CONV_UTF8, self::ERROR_NOT_UTF8_CONTENT, $volume->path($target)));
}
}
$res = array('content' => $content);
if ($enc) {
$res['encoding'] = $enc;
}
return $res;
}