Initial Commit
This commit is contained in:
7
dependencies/amphp/windows-registry/lib/KeyNotFoundException.php
vendored
Normal file
7
dependencies/amphp/windows-registry/lib/KeyNotFoundException.php
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace WP_Ultimo\Dependencies\Amp\WindowsRegistry;
|
||||
|
||||
class KeyNotFoundException extends \Exception
|
||||
{
|
||||
}
|
68
dependencies/amphp/windows-registry/lib/WindowsRegistry.php
vendored
Normal file
68
dependencies/amphp/windows-registry/lib/WindowsRegistry.php
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace WP_Ultimo\Dependencies\Amp\WindowsRegistry;
|
||||
|
||||
use WP_Ultimo\Dependencies\Amp\ByteStream;
|
||||
use WP_Ultimo\Dependencies\Amp\Process\Process;
|
||||
use WP_Ultimo\Dependencies\Amp\Promise;
|
||||
use function WP_Ultimo\Dependencies\Amp\call;
|
||||
class WindowsRegistry
|
||||
{
|
||||
public function read(string $key) : Promise
|
||||
{
|
||||
return call(function () use($key) {
|
||||
$key = \strtr($key, '/', "\\");
|
||||
$parts = \explode("\\", $key);
|
||||
$value = \array_pop($parts);
|
||||
$key = \implode("\\", $parts);
|
||||
$lines = (yield $this->query($key));
|
||||
$lines = \array_filter($lines, function ($line) {
|
||||
return '' !== $line && $line[0] === ' ';
|
||||
});
|
||||
$values = \array_map(function ($line) {
|
||||
return \preg_split("(\\s+)", \ltrim($line), 3);
|
||||
}, $lines);
|
||||
$foundValue = null;
|
||||
foreach ($values as $v) {
|
||||
if ($v[0] === $value) {
|
||||
if (\count($v) >= 3) {
|
||||
return $v[2];
|
||||
}
|
||||
$foundValue = $v;
|
||||
}
|
||||
}
|
||||
if ($foundValue) {
|
||||
throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' was found, but could not be read correctly, got " . \var_export($foundValue, \true));
|
||||
}
|
||||
throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' not found.");
|
||||
});
|
||||
}
|
||||
public function listKeys(string $key) : Promise
|
||||
{
|
||||
return call(function () use($key) {
|
||||
$lines = (yield $this->query($key));
|
||||
$lines = \array_filter($lines, function ($line) {
|
||||
return '' !== $line && $line[0] !== ' ';
|
||||
});
|
||||
return $lines;
|
||||
});
|
||||
}
|
||||
private function query(string $key) : Promise
|
||||
{
|
||||
return call(function () use($key) {
|
||||
if (0 !== \stripos(\PHP_OS, 'WIN')) {
|
||||
throw new \Error('Not running on Windows.');
|
||||
}
|
||||
$key = \strtr($key, '/', "\\");
|
||||
$cmd = \sprintf('reg query %s', \escapeshellarg($key));
|
||||
$process = new Process($cmd);
|
||||
(yield $process->start());
|
||||
$stdout = (yield ByteStream\buffer($process->getStdout()));
|
||||
$code = (yield $process->join());
|
||||
if ($code !== 0) {
|
||||
throw new KeyNotFoundException("Windows registry key '{$key}' not found.");
|
||||
}
|
||||
return \explode("\n", \str_replace("\r", '', $stdout));
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user