mirror of
https://github.com/xPaw/PHP-Source-Query.git
synced 2026-05-18 13:53:35 +02:00
+30
-37
@@ -32,18 +32,6 @@
|
||||
public $Port;
|
||||
public $Timeout;
|
||||
|
||||
/**
|
||||
* Points to buffer class
|
||||
*
|
||||
* @var Buffer
|
||||
*/
|
||||
private $Buffer;
|
||||
|
||||
public function __construct( $Buffer )
|
||||
{
|
||||
$this->Buffer = $Buffer;
|
||||
}
|
||||
|
||||
public function Close( )
|
||||
{
|
||||
if( $this->Socket )
|
||||
@@ -80,22 +68,25 @@
|
||||
return $Length === FWrite( $this->Socket, $Command, $Length );
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads from socket and returns Buffer.
|
||||
*
|
||||
* @throws InvalidPacketException
|
||||
*
|
||||
* @return Buffer Buffer
|
||||
*/
|
||||
public function Read( $Length = 1400 )
|
||||
{
|
||||
$this->ReadBuffer( FRead( $this->Socket, $Length ), $Length );
|
||||
}
|
||||
|
||||
protected function ReadBuffer( $Buffer, $Length )
|
||||
{
|
||||
$this->Buffer->Set( $Buffer );
|
||||
$Buffer = new Buffer( );
|
||||
$Buffer->Set( FRead( $this->Socket, $Length ) );
|
||||
|
||||
if( $this->Buffer->Remaining( ) === 0 )
|
||||
if( $Buffer->Remaining( ) === 0 )
|
||||
{
|
||||
// TODO: Should we throw an exception here?
|
||||
return;
|
||||
}
|
||||
|
||||
$Header = $this->Buffer->GetLong( );
|
||||
$Header = $Buffer->GetLong( );
|
||||
|
||||
if( $Header === -1 ) // Single packet
|
||||
{
|
||||
@@ -103,19 +94,19 @@
|
||||
}
|
||||
else if( $Header === -2 ) // Split packet
|
||||
{
|
||||
$Packets = Array( );
|
||||
$Packets = [];
|
||||
$IsCompressed = false;
|
||||
$ReadMore = false;
|
||||
|
||||
do
|
||||
{
|
||||
$RequestID = $this->Buffer->GetLong( );
|
||||
$RequestID = $Buffer->GetLong( );
|
||||
|
||||
switch( $this->Engine )
|
||||
{
|
||||
case SourceQuery::GOLDSOURCE:
|
||||
{
|
||||
$PacketCountAndNumber = $this->Buffer->GetByte( );
|
||||
$PacketCountAndNumber = $Buffer->GetByte( );
|
||||
$PacketCount = $PacketCountAndNumber & 0xF;
|
||||
$PacketNumber = $PacketCountAndNumber >> 4;
|
||||
|
||||
@@ -124,31 +115,31 @@
|
||||
case SourceQuery::SOURCE:
|
||||
{
|
||||
$IsCompressed = ( $RequestID & 0x80000000 ) !== 0;
|
||||
$PacketCount = $this->Buffer->GetByte( );
|
||||
$PacketNumber = $this->Buffer->GetByte( ) + 1;
|
||||
$PacketCount = $Buffer->GetByte( );
|
||||
$PacketNumber = $Buffer->GetByte( ) + 1;
|
||||
|
||||
if( $IsCompressed )
|
||||
{
|
||||
$this->Buffer->GetLong( ); // Split size
|
||||
$Buffer->GetLong( ); // Split size
|
||||
|
||||
$PacketChecksum = $this->Buffer->GetUnsignedLong( );
|
||||
$PacketChecksum = $Buffer->GetUnsignedLong( );
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->Buffer->GetShort( ); // Split size
|
||||
$Buffer->GetShort( ); // Split size
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$Packets[ $PacketNumber ] = $this->Buffer->Get( );
|
||||
$Packets[ $PacketNumber ] = $Buffer->Get( );
|
||||
|
||||
$ReadMore = $PacketCount > sizeof( $Packets );
|
||||
}
|
||||
while( $ReadMore && $this->Sherlock( $Length ) );
|
||||
while( $ReadMore && $this->Sherlock( $Buffer, $Length ) );
|
||||
|
||||
$Buffer = Implode( $Packets );
|
||||
$Data = Implode( $Packets );
|
||||
|
||||
// TODO: Test this
|
||||
if( $IsCompressed )
|
||||
@@ -159,23 +150,25 @@
|
||||
throw new \RuntimeException( 'Received compressed packet, PHP doesn\'t have Bzip2 library installed, can\'t decompress.' );
|
||||
}
|
||||
|
||||
$Buffer = bzdecompress( $Buffer );
|
||||
$Data = bzdecompress( $Data );
|
||||
|
||||
if( CRC32( $Buffer ) !== $PacketChecksum )
|
||||
if( CRC32( $Data ) !== $PacketChecksum )
|
||||
{
|
||||
throw new InvalidPacketException( 'CRC32 checksum mismatch of uncompressed packet data.', InvalidPacketException::CHECKSUM_MISMATCH );
|
||||
}
|
||||
}
|
||||
|
||||
$this->Buffer->Set( SubStr( $Buffer, 4 ) );
|
||||
$Buffer->Set( SubStr( $Data, 4 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidPacketException( 'Socket read: Raw packet header mismatch. (0x' . DecHex( $Header ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH );
|
||||
}
|
||||
|
||||
return $Buffer;
|
||||
}
|
||||
|
||||
private function Sherlock( $Length )
|
||||
private function Sherlock( $Buffer, $Length )
|
||||
{
|
||||
$Data = FRead( $this->Socket, $Length );
|
||||
|
||||
@@ -184,8 +177,8 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->Buffer->Set( $Data );
|
||||
$Buffer->Set( $Data );
|
||||
|
||||
return $this->Buffer->GetLong( ) === -2;
|
||||
return $Buffer->GetLong( ) === -2;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user