2010-11-21 23:48:11 +01:00
< ? php
2011-12-03 12:28:02 +01:00
namespace JPT\SocketFramework\Connection ;
2010-11-21 23:48:11 +01:00
/**
2011-06-29 21:16:08 +02:00
* This class is a decorator for the SocketHandler class .
2010-11-21 23:48:11 +01:00
* It provides a buffer for the SocketHandler , so reading and writing
* a full line won ' t be that much pain .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ author jpt
* @ package Connection
* @ depends Socket
* @ depends Misc
*/
2011-12-03 12:28:02 +01:00
class ConnectionHandler {
2010-11-21 23:48:11 +01:00
/**
* Buffer that contains incoming data .
* Contents were received from the SocketHandler .
2010-12-01 00:25:15 +01:00
* This buffer does not use a linebreak , it ' s a temporary store for data .
2011-12-03 12:28:02 +01:00
*
* @ var \JPT\SocketFramework\Misc\Buffer
2010-11-21 23:48:11 +01:00
*/
2011-06-26 01:16:28 +02:00
protected $bufferIncoming ;
2010-11-21 23:48:11 +01:00
/**
* Buffer that contains outgoing data .
* Contents will be sent to the SocketHandler .
2010-12-01 00:25:15 +01:00
* This buffer does not use a linebreak , it ' s a temporary store for data .
2011-12-03 12:28:02 +01:00
*
* @ var \JPT\SocketFramework\Misc\Buffer
2010-11-21 23:48:11 +01:00
*/
2011-06-26 01:16:28 +02:00
protected $bufferOutgoing ;
2010-11-21 23:48:11 +01:00
/**
* Contains the instance of the SocketHandler class .
* According to the Liskov substitution principle , decoration pattern must be used in this case .
2011-12-03 12:28:02 +01:00
*
* @ var \JPT\SocketFramework\Socket\SocketHandler
2010-11-21 23:48:11 +01:00
*/
protected $socketHandler ;
2010-11-28 17:38:03 +01:00
/**
2011-12-03 12:28:02 +01:00
* @ var \JPT\SocketFramework\Connection\ConnectionPool
2010-11-28 17:38:03 +01:00
*/
protected $connectionPool ;
2010-11-21 23:48:11 +01:00
/**
* A boolean that indicates whether this Connection is a listening server socket or a usual client socket .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ var boolean
*/
2011-06-26 01:16:28 +02:00
protected $isServer ;
2010-11-21 23:48:11 +01:00
/**
* Unique Connection ID .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ var int
*/
protected $id ;
/**
* Connection Group .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ var string
*/
protected $group ;
/**
* @ var string
*/
protected $protocol ;
2010-11-28 17:38:03 +01:00
/**
* @ var boolean
*/
protected $IPv6 ;
/**
* @ var string
*/
protected $host ;
/**
* @ var int
*/
protected $port ;
/**
* @ var boolean
*/
2011-06-26 01:16:28 +02:00
protected $reconnectOnDisconnect ;
2010-11-28 17:38:03 +01:00
2010-11-21 23:48:11 +01:00
/**
* Calls parent constructor .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ param $socket
* @ param $linebreak
* @ return void
*/
2010-12-18 15:42:56 +01:00
public function __construct ( $socket , $id , $group = " " , $protocol = " " ) {
2011-12-03 12:28:02 +01:00
$this -> bufferIncoming = new \JPT\SocketFramework\Misc\Buffer ();
$this -> bufferOutgoing = new \JPT\SocketFramework\Misc\Buffer ();
$this -> socketHandler = new \JPT\SocketFramework\Socket\SocketHandler ( $socket );
2010-11-21 23:48:11 +01:00
$this -> id = $id ;
$this -> group = $group ;
$this -> protocol = $protocol ;
2011-06-26 01:16:28 +02:00
$this -> isServer = FALSE ;
2010-11-28 17:38:03 +01:00
$this -> host = " " ;
$this -> port = 0 ;
2011-06-26 01:16:28 +02:00
$this -> reconnectOnDisconnect = FALSE ;
2010-11-28 17:38:03 +01:00
$this -> IPv6 = FALSE ;
2010-11-21 23:48:11 +01:00
}
/**
* Calls parent destructor .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ return void
*/
2010-12-18 15:42:56 +01:00
public function __destruct () {
2010-11-21 23:48:11 +01:00
unset ( $this -> socketHandler );
}
2010-11-28 17:38:03 +01:00
/**
* Injector for the internal ConnectionPool access .
2011-12-03 12:28:02 +01:00
*
* @ param \JPT\SocketFramework\Connection\ConnectionPool $connectionPool
2010-12-19 15:26:32 +01:00
* @ return void
2010-11-28 17:38:03 +01:00
*/
public function injectConnectionPool ( $connectionPool ) {
$this -> connectionPool = $connectionPool ;
}
2010-11-21 23:48:11 +01:00
/**
* @ return string
*/
public function getProtocol () {
return $this -> protocol ;
}
/**
* @ return string Connection Group
*/
public function getGroup () {
return $this -> group ;
}
/**
* @ return int Connection ID
*/
public function getID () {
return $this -> id ;
}
/**
* Returns whether this connection is a listening socket or a general client connection socket .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function isServer () {
2011-06-26 01:16:28 +02:00
return $this -> isServer ;
2010-11-21 23:48:11 +01:00
}
2010-11-28 17:38:03 +01:00
/**
* Sets the IPv6 - flag .
2011-12-03 12:28:02 +01:00
*
2010-11-28 17:38:03 +01:00
* @ param boolean $IPv6
2010-12-19 15:26:32 +01:00
* @ return void
2010-11-28 17:38:03 +01:00
*/
public function setIPv6 ( $IPv6 ) {
$this -> IPv6 = $IPv6 ;
}
/**
2011-06-26 01:16:28 +02:00
* Sets reconnectOnDisconnect flag .
2011-12-03 12:28:02 +01:00
*
2010-11-28 17:38:03 +01:00
* @ param boolean $reconnect
2010-12-19 15:26:32 +01:00
* @ return void
2010-11-28 17:38:03 +01:00
*/
public function setReconnect ( $reconnect ) {
2011-06-26 01:16:28 +02:00
$this -> reconnectOnDisconnect = $reconnect ;
2010-11-28 17:38:03 +01:00
}
/**
2011-06-26 01:16:28 +02:00
* Gets reconnectOnDisconnect flag .
2011-12-03 12:28:02 +01:00
*
2010-11-28 17:38:03 +01:00
* @ return boolean
*/
public function getReconnect () {
2011-06-26 01:16:28 +02:00
return $this -> reconnectOnDisconnect ;
2010-11-28 17:38:03 +01:00
}
/**
* This function is called when socket_read () or socket_write () fail .
* It creates a new ConnectionHandler that will reconnect .
2011-12-03 12:28:02 +01:00
*
2010-11-28 17:38:03 +01:00
* @ return void
*/
protected function shutdown () {
$this -> setConnected ( FALSE );
$this -> close ();
}
2010-11-21 23:48:11 +01:00
/**
2011-06-26 01:16:28 +02:00
* Reads from SocketHandler , writes into bufferIncoming .
2010-11-21 23:48:11 +01:00
* Returns a boolean that will indicate whether the socket is still okay .
2011-12-03 12:28:02 +01:00
*
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function readToBuffer () {
$data = $this -> socketHandler -> read ();
2010-11-28 17:38:03 +01:00
//set connection status flag properly.
if ( $data === " " ) {
$this -> shutdown ();
return FALSE ;
}
2011-06-26 01:16:28 +02:00
$this -> bufferIncoming -> addData ( $data );
2010-11-21 23:48:11 +01:00
return TRUE ;
}
/**
2011-06-26 01:16:28 +02:00
* Writes the bufferOutgoing to the SocketHandler .
2010-11-21 23:48:11 +01:00
* Returns a boolean that will indicate whether the socket is still okay .
2011-12-03 12:28:02 +01:00
*
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function writeFromBuffer () {
2011-06-26 01:16:28 +02:00
$bufferContent = $this -> bufferOutgoing -> getAllBufferContents ();
2011-06-26 00:13:53 +02:00
//this might not be cool, but it should do.
if ( $bufferContent === " " ) return TRUE ;
$result = $this -> socketHandler -> write ( $bufferContent );
2010-12-01 00:25:15 +01:00
if ( $result === FALSE ) {
$this -> shutdown ();
return FALSE ;
2010-11-21 23:48:11 +01:00
}
return TRUE ;
}
/**
2011-12-03 12:28:02 +01:00
* Calls error () on \JPT\SocketFramework\Socket\SocketHandler .
*
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return void
*/
public function handleSocketError () {
$this -> socketHandler -> error ();
}
/**
* Determines whether this ConnectionHandler has data to read .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function canRead () {
2011-06-26 01:16:28 +02:00
return $this -> bufferIncoming -> hasData ();
2010-11-21 23:48:11 +01:00
}
/**
* Determines whether this ConnectionHandler has data to write .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function canWrite () {
2011-06-26 01:16:28 +02:00
return $this -> bufferOutgoing -> hasData ();
2010-11-21 23:48:11 +01:00
}
/**
2011-06-26 01:16:28 +02:00
* Reads new data into bufferIncoming .
* Returns a full line from bufferIncoming .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ return string
*/
public function read () {
2011-06-26 01:16:28 +02:00
return $this -> bufferIncoming -> getAllBufferContents ();
2010-11-21 23:48:11 +01:00
}
/**
2011-06-26 01:16:28 +02:00
* Writes data into bufferOutgoing .
* Sends data from bufferOutgoing to the SocketHandler .
2011-12-03 12:28:02 +01:00
*
2010-11-21 23:48:11 +01:00
* @ param $data
* @ return void
*/
public function write ( $data ) {
2011-06-26 01:16:28 +02:00
$this -> bufferOutgoing -> addData ( $data );
2010-11-21 23:48:11 +01:00
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return ressource
*/
public function accept () {
return $this -> socketHandler -> accept ();
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return string
*/
public function getRemoteName () {
return $this -> socketHandler -> getRemoteName ();
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return string
*/
public function getLocalName () {
return $this -> socketHandler -> getLocalName ();
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return void
*/
public function close () {
return $this -> socketHandler -> close ();
}
/**
2010-11-28 17:38:03 +01:00
* Calls SocketHandler , stores connection data .
2011-12-03 12:28:02 +01:00
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-28 17:38:03 +01:00
* @ param string $address
* @ param int $port
2010-11-21 23:48:11 +01:00
* @ return void
*/
public function connect ( $address , $port ) {
2010-11-28 17:38:03 +01:00
$this -> host = $address ;
$this -> port = $port ;
2010-11-21 23:48:11 +01:00
return $this -> socketHandler -> connect ( $address , $port );
}
2010-11-28 17:38:03 +01:00
/**
* Calls SocketHandler , uses stored connection data to fork a new instance of itself .
2011-12-03 12:28:02 +01:00
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
* @ throws \JPT\SocketFramework\Exception\GeneralException
* @ return \JPT\SocketFramework\Connection\ConnectionHandler
2010-11-28 17:38:03 +01:00
*/
public function reconnect () {
2011-12-03 12:28:02 +01:00
if ( $this -> reconnectOnDisconnect === FALSE ) throw new \JPT\SocketFramework\Exception\GeneralException ( " Cannot reconnect: Reconnect-Flag not set! " , 1290951385 );
if ( empty ( $this -> host ) === TRUE ) throw new \JPT\SocketFramework\Exception\GeneralException ( " Cannot reconnect: No host specified. " , 1290950818 );
if ( empty ( $this -> port ) === TRUE ) throw new \JPT\SocketFramework\Exception\GeneralException ( " Cannot reconnect: No port specified. " , 1290950844 );
2010-11-28 17:38:03 +01:00
$newConnectionHandler = $this -> connectionPool -> createTcpConnection ( $this -> group , $this -> protocol , $this -> IPv6 );
$newConnectionHandler -> setReconnect ( $this -> getReconnect ());
$newConnectionHandler -> connect ( $this -> host , $this -> port );
return $newConnectionHandler ;
}
2010-11-21 23:48:11 +01:00
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return void
*/
public function bind ( $address , $port ) {
2010-11-28 17:38:03 +01:00
$this -> host = $address ;
$this -> port = $port ;
2010-11-21 23:48:11 +01:00
return $this -> socketHandler -> bind ( $address , $port );
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return void
*/
public function listen () {
2011-06-26 01:16:28 +02:00
$this -> isServer = TRUE ;
2010-11-21 23:48:11 +01:00
return $this -> socketHandler -> listen ();
}
/**
2011-12-03 12:28:02 +01:00
* @ see \JPT\SocketFramework\Socket\SocketHandler
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function isConnected () {
return $this -> socketHandler -> isConnected ();
}
2010-11-28 17:38:03 +01:00
/**
* Sets the is_connected - flag in the socket handler .
2011-12-03 12:28:02 +01:00
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
2010-11-28 17:38:03 +01:00
* @ param boolean $connected
* @ return void
*/
2011-06-26 16:03:32 +02:00
protected function setConnected ( $connected ) {
2010-11-28 17:38:03 +01:00
return $this -> socketHandler -> setConnected ( $connected );
}
2010-11-21 23:48:11 +01:00
/**
2011-12-03 12:28:02 +01:00
* @ see \JPT\SocketFramework\Socket\SocketHandler
2010-11-21 23:48:11 +01:00
* @ return boolean
*/
public function isListening () {
return $this -> socketHandler -> isListening ();
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
* @ throws \JPT\SocketFramework\Exception\SocketException
2010-11-21 23:48:11 +01:00
* @ return ressource
*/
public function getSocket () {
return $this -> socketHandler -> getSocket ();
}
/**
2011-12-03 12:28:02 +01:00
* @ return \JPT\SocketFramework\Socket\SocketHandler
2010-11-21 23:48:11 +01:00
*/
public function getSocketHandler () {
return $this -> socketHandler ;
}
/**
2011-12-03 12:28:02 +01:00
* Calls SocketHandler .
*
* @ see \JPT\SocketFramework\Socket\SocketHandler
2010-11-21 23:48:11 +01:00
* @ return void
*/
public function hasBeenAccepted () {
return $this -> socketHandler -> hasBeenAccepted ();
}
}
?>