check for revision mismatch errors in notify

This commit is contained in:
Robin Appelman 2017-08-17 16:12:11 +02:00
commit 206d6aa118
3 changed files with 34 additions and 0 deletions

View file

@ -27,4 +27,5 @@ class ErrorCodes {
const NotADirectory = 'NT_STATUS_NOT_A_DIRECTORY'; const NotADirectory = 'NT_STATUS_NOT_A_DIRECTORY';
const SharingViolation = 'NT_STATUS_SHARING_VIOLATION'; const SharingViolation = 'NT_STATUS_SHARING_VIOLATION';
const InvalidParameter = 'NT_STATUS_INVALID_PARAMETER'; const InvalidParameter = 'NT_STATUS_INVALID_PARAMETER';
const RevisionMismatch = 'NT_STATUS_REVISION_MISMATCH';
} }

View file

@ -0,0 +1,16 @@
<?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\Exception;
use Throwable;
class RevisionMismatchException extends Exception {
public function __construct($message = 'Protocol version mismatch', $code = 0, Throwable $previous = null) {
parent::__construct($message, $code, $previous);
}
}

View file

@ -9,6 +9,8 @@
namespace Icewind\SMB; namespace Icewind\SMB;
use Icewind\SMB\Exception\Exception;
class NotifyHandler implements INotifyHandler { class NotifyHandler implements INotifyHandler {
/** /**
* @var Connection * @var Connection
@ -22,6 +24,12 @@ class NotifyHandler implements INotifyHandler {
private $listening = true; private $listening = true;
// todo replace with static once <5.6 support is dropped
// see error.h
private static $exceptionMap = [
ErrorCodes::RevisionMismatch => '\Icewind\SMB\Exception\RevisionMismatchException',
];
/** /**
* @param Connection $connection * @param Connection $connection
* @param string $path * @param string $path
@ -43,6 +51,7 @@ class NotifyHandler implements INotifyHandler {
stream_set_blocking($this->connection->getOutputStream(), 0); stream_set_blocking($this->connection->getOutputStream(), 0);
$lines = []; $lines = [];
while (($line = $this->connection->readLine())) { while (($line = $this->connection->readLine())) {
$this->checkForError($line);
$lines[] = $line; $lines[] = $line;
} }
stream_set_blocking($this->connection->getOutputStream(), 1); stream_set_blocking($this->connection->getOutputStream(), 1);
@ -59,6 +68,7 @@ class NotifyHandler implements INotifyHandler {
public function listen($callback) { public function listen($callback) {
if ($this->listening) { if ($this->listening) {
$this->connection->read(function ($line) use ($callback) { $this->connection->read(function ($line) use ($callback) {
$this->checkForError($line);
$change = $this->parseChangeLine($line); $change = $this->parseChangeLine($line);
if ($change) { if ($change) {
return $callback($change); return $callback($change);
@ -80,6 +90,13 @@ class NotifyHandler implements INotifyHandler {
} }
} }
private function checkForError($line) {
if (substr($line, 0, 16) === 'notify returned ') {
$error = substr($line, 16);
throw Exception::fromMap(self::$exceptionMap, $error, 'Notify is not supported with the used smb version');
}
}
public function stop() { public function stop() {
$this->listening = false; $this->listening = false;
$this->connection->close(); $this->connection->close();