Have streams of files_external in sync

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
pull/14580/head
Roeland Jago Douma 2019-03-07 12:57:04 +07:00
parent 3de750c88c
commit f5f4673827
No known key found for this signature in database
GPG Key ID: F941078878347C0C
4 changed files with 28 additions and 16 deletions

@ -8,7 +8,7 @@
"classmap-authoritative": true "classmap-authoritative": true
}, },
"require": { "require": {
"icewind/streams": "0.6.1", "icewind/streams": "0.7.1",
"icewind/smb": "3.0.2" "icewind/smb": "3.0.2"
} }
} }

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "1357a8ac93fc039db0cf2c5cf5a45f13", "content-hash": "641ed61db5e07e8e9eaebfb6918ea521",
"packages": [ "packages": [
{ {
"name": "icewind/smb", "name": "icewind/smb",
@ -49,16 +49,16 @@
}, },
{ {
"name": "icewind/streams", "name": "icewind/streams",
"version": "0.6.1", "version": "v0.7.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/icewind1991/Streams.git", "url": "https://github.com/icewind1991/Streams.git",
"reference": "0a78597117d8a02937ea05206f219294449fb06e" "reference": "4db3ed6c366e90b958d00e1d4c6360a9b39b2121"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/icewind1991/Streams/zipball/0a78597117d8a02937ea05206f219294449fb06e", "url": "https://api.github.com/repos/icewind1991/Streams/zipball/4db3ed6c366e90b958d00e1d4c6360a9b39b2121",
"reference": "0a78597117d8a02937ea05206f219294449fb06e", "reference": "4db3ed6c366e90b958d00e1d4c6360a9b39b2121",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -86,7 +86,7 @@
} }
], ],
"description": "A set of generic stream wrappers", "description": "A set of generic stream wrappers",
"time": "2018-04-24T09:07:38+00:00" "time": "2019-02-15T12:57:29+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],

@ -44,17 +44,17 @@
}, },
{ {
"name": "icewind/streams", "name": "icewind/streams",
"version": "0.6.1", "version": "v0.7.1",
"version_normalized": "0.6.1.0", "version_normalized": "0.7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/icewind1991/Streams.git", "url": "https://github.com/icewind1991/Streams.git",
"reference": "0a78597117d8a02937ea05206f219294449fb06e" "reference": "4db3ed6c366e90b958d00e1d4c6360a9b39b2121"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/icewind1991/Streams/zipball/0a78597117d8a02937ea05206f219294449fb06e", "url": "https://api.github.com/repos/icewind1991/Streams/zipball/4db3ed6c366e90b958d00e1d4c6360a9b39b2121",
"reference": "0a78597117d8a02937ea05206f219294449fb06e", "reference": "4db3ed6c366e90b958d00e1d4c6360a9b39b2121",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -64,7 +64,7 @@
"phpunit/phpunit": "^4.8", "phpunit/phpunit": "^4.8",
"satooshi/php-coveralls": "v1.0.0" "satooshi/php-coveralls": "v1.0.0"
}, },
"time": "2018-04-24T09:07:38+00:00", "time": "2019-02-15T12:57:29+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {

@ -44,6 +44,11 @@ class CallbackWrapper extends Wrapper {
*/ */
protected $readDirCallBack; protected $readDirCallBack;
/**
* @var callable
*/
protected $preCloseCallback;
/** /**
* Wraps a stream with the provided callbacks * Wraps a stream with the provided callbacks
* *
@ -56,14 +61,15 @@ class CallbackWrapper extends Wrapper {
* *
* @throws \BadMethodCallException * @throws \BadMethodCallException
*/ */
public static function wrap($source, $read = null, $write = null, $close = null, $readDir = null) { public static function wrap($source, $read = null, $write = null, $close = null, $readDir = null, $preClose = null) {
$context = stream_context_create(array( $context = stream_context_create(array(
'callback' => array( 'callback' => array(
'source' => $source, 'source' => $source,
'read' => $read, 'read' => $read,
'write' => $write, 'write' => $write,
'close' => $close, 'close' => $close,
'readDir' => $readDir 'readDir' => $readDir,
'preClose' => $preClose,
) )
)); ));
return Wrapper::wrapSource($source, $context, 'callback', '\Icewind\Streams\CallbackWrapper'); return Wrapper::wrapSource($source, $context, 'callback', '\Icewind\Streams\CallbackWrapper');
@ -76,6 +82,7 @@ class CallbackWrapper extends Wrapper {
$this->writeCallback = $context['write']; $this->writeCallback = $context['write'];
$this->closeCallback = $context['close']; $this->closeCallback = $context['close'];
$this->readDirCallBack = $context['readDir']; $this->readDirCallBack = $context['readDir'];
$this->preCloseCallback = $context['preClose'];
return true; return true;
} }
@ -90,7 +97,7 @@ class CallbackWrapper extends Wrapper {
public function stream_read($count) { public function stream_read($count) {
$result = parent::stream_read($count); $result = parent::stream_read($count);
if (is_callable($this->readCallback)) { if (is_callable($this->readCallback)) {
call_user_func($this->readCallback, $count); call_user_func($this->readCallback, strlen($result));
} }
return $result; return $result;
} }
@ -104,6 +111,11 @@ class CallbackWrapper extends Wrapper {
} }
public function stream_close() { public function stream_close() {
if (is_callable($this->preCloseCallback)) {
call_user_func($this->preCloseCallback, $this->loadContext('callback')['source']);
// prevent further calls by potential PHP 7 GC ghosts
$this->preCloseCallback = null;
}
$result = parent::stream_close(); $result = parent::stream_close();
if (is_callable($this->closeCallback)) { if (is_callable($this->closeCallback)) {
call_user_func($this->closeCallback); call_user_func($this->closeCallback);