diff --git a/src/Adapter/ServerQuery.php b/src/Adapter/ServerQuery.php index a7453f2..cbf4728 100644 --- a/src/Adapter/ServerQuery.php +++ b/src/Adapter/ServerQuery.php @@ -139,7 +139,7 @@ public function request(string $cmd, bool $throw = true): Reply do { $str = $this->getTransport()->readLine(); $rpl[] = $str; - } while ($str->section(TeamSpeak3::SEPARATOR_CELL) != TeamSpeak3::ERROR); + } while ($this->getTransport()->is_connected() and $str->section(TeamSpeak3::SEPARATOR_CELL) != TeamSpeak3::ERROR); $this->getProfiler()->stop(); @@ -164,7 +164,7 @@ public function wait(): Event do { $evt = $this->getTransport()->readLine(); - } while (!$evt->section(TeamSpeak3::SEPARATOR_CELL)->startsWith(TeamSpeak3::EVENT)); + } while ($this->getTransport()->is_connected() and !$evt->section(TeamSpeak3::SEPARATOR_CELL)->startsWith(TeamSpeak3::EVENT)); return new Event($evt, $this->getHost()); } diff --git a/src/Transport/TCP.php b/src/Transport/TCP.php index 1d3e284..0a8ded8 100644 --- a/src/Transport/TCP.php +++ b/src/Transport/TCP.php @@ -110,6 +110,16 @@ public function disconnect(): void Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "Disconnected"); } + /** + * Returns true, if the connection to a remote server is established. + * + * @return bool + */ + public function is_connected(): bool + { + return ($this->stream === null) ? false : true; + } + /** * Reads data from the stream. * diff --git a/tests/Transport/TCPTest.php b/tests/Transport/TCPTest.php index f2ced7a..0c781b7 100644 --- a/tests/Transport/TCPTest.php +++ b/tests/Transport/TCPTest.php @@ -3,6 +3,7 @@ namespace PlanetTeamSpeak\TeamSpeak3Framework\Tests\Transport; use PHPUnit\Framework\TestCase; +use PlanetTeamSpeak\TeamSpeak3Framework\Adapter\MockServerQuery; use PlanetTeamSpeak\TeamSpeak3Framework\Adapter\ServerQuery; use PlanetTeamSpeak\TeamSpeak3Framework\Exception\ServerQueryException; use PlanetTeamSpeak\TeamSpeak3Framework\Transport\TCP; @@ -91,6 +92,25 @@ public function testGetStream() $this->assertNull($transport->getStream()); } + /** + * @throws AdapterException + */ + protected function createMockServerQuery(): MockServerQuery + { + return new MockServerQuery(['host' => '0.0.0.0', 'port' => 9987]); + } + + /** + * Tests if the connection status gets properly returned. + */ + public function testConnectionStatus() + { + $mockServerQuery = $this->createMockServerQuery(); + $this->assertTrue($mockServerQuery->getTransport()->is_connected()); + $mockServerQuery->getTransport()->disconnect(); + $this->assertFalse($mockServerQuery->getTransport()->is_connected()); + } + /** * @throws TransportException * @throws ServerQueryException