summaryrefslogtreecommitdiffstats
path: root/apps/files_external/3rdparty/icewind/smb/src/Parser.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_external/3rdparty/icewind/smb/src/Parser.php')
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/Parser.php130
1 files changed, 130 insertions, 0 deletions
diff --git a/apps/files_external/3rdparty/icewind/smb/src/Parser.php b/apps/files_external/3rdparty/icewind/smb/src/Parser.php
new file mode 100644
index 00000000000..645678d9855
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/smb/src/Parser.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\SMB;
+
+use Icewind\SMB\Exception\AccessDeniedException;
+use Icewind\SMB\Exception\AlreadyExistsException;
+use Icewind\SMB\Exception\Exception;
+use Icewind\SMB\Exception\FileInUseException;
+use Icewind\SMB\Exception\InvalidTypeException;
+use Icewind\SMB\Exception\NotEmptyException;
+use Icewind\SMB\Exception\NotFoundException;
+
+class Parser {
+ /**
+ * @var string
+ */
+ protected $timeZone;
+
+ /**
+ * @param string $timeZone
+ */
+ public function __construct($timeZone) {
+ $this->timeZone = $timeZone;
+ }
+
+ public function checkForError($output, $path) {
+ if (count($output) === 0) {
+ return true;
+ } else {
+ if (strpos($output[0], 'does not exist')) {
+ throw new NotFoundException($path);
+ }
+ $parts = explode(' ', $output[0]);
+ $error = false;
+ foreach ($parts as $part) {
+ if (substr($part, 0, 9) === 'NT_STATUS') {
+ $error = $part;
+ }
+ }
+ switch ($error) {
+ case ErrorCodes::PathNotFound:
+ case ErrorCodes::ObjectNotFound:
+ case ErrorCodes::NoSuchFile:
+ throw new NotFoundException($path);
+ case ErrorCodes::NameCollision:
+ throw new AlreadyExistsException($path);
+ case ErrorCodes::AccessDenied:
+ throw new AccessDeniedException($path);
+ case ErrorCodes::DirectoryNotEmpty:
+ throw new NotEmptyException($path);
+ case ErrorCodes::FileIsADirectory:
+ case ErrorCodes::NotADirectory:
+ throw new InvalidTypeException($path);
+ case ErrorCodes::SharingViolation:
+ throw new FileInUseException($path);
+ default:
+ $message = 'Unknown error (' . $error . ')';
+ if ($path) {
+ $message .= ' for ' . $path;
+ }
+ throw new Exception($message);
+ }
+ }
+ }
+
+ public function parseMode($mode) {
+ $result = 0;
+ $modeStrings = array(
+ 'R' => FileInfo::MODE_READONLY,
+ 'H' => FileInfo::MODE_HIDDEN,
+ 'S' => FileInfo::MODE_SYSTEM,
+ 'D' => FileInfo::MODE_DIRECTORY,
+ 'A' => FileInfo::MODE_ARCHIVE,
+ 'N' => FileInfo::MODE_NORMAL
+ );
+ foreach ($modeStrings as $char => $val) {
+ if (strpos($mode, $char) !== false) {
+ $result |= $val;
+ }
+ }
+ return $result;
+ }
+
+ public function parseStat($output) {
+ $mtime = 0;
+ $mode = 0;
+ $size = 0;
+ foreach ($output as $line) {
+ list($name, $value) = explode(':', $line, 2);
+ $value = trim($value);
+ if ($name === 'write_time') {
+ $mtime = strtotime($value);
+ } else if ($name === 'attributes') {
+ $mode = hexdec(substr($value, 1, -1));
+ } else if ($name === 'stream') {
+ list(, $size,) = explode(' ', $value);
+ $size = intval($size);
+ }
+ }
+ return array(
+ 'mtime' => $mtime,
+ 'mode' => $mode,
+ 'size' => $size
+ );
+ }
+
+ public function parseDir($output, $basePath) {
+ //last line is used space
+ array_pop($output);
+ $regex = '/^\s*(.*?)\s\s\s\s+(?:([NDHARS]*)\s+)?([0-9]+)\s+(.*)$/';
+ //2 spaces, filename, optional type, size, date
+ $content = array();
+ foreach ($output as $line) {
+ if (preg_match($regex, $line, $matches)) {
+ list(, $name, $mode, $size, $time) = $matches;
+ if ($name !== '.' and $name !== '..') {
+ $mode = $this->parseMode($mode);
+ $time = strtotime($time . ' ' . $this->timeZone);
+ $content[] = new FileInfo($basePath . '/' . $name, $name, $size, $time, $mode);
+ }
+ }
+ }
+ return $content;
+ }
+}