From 78866ed1495435c38377a056b06baf1590866690 Mon Sep 17 00:00:00 2001 From: Jan Philipp Timme Date: Sat, 25 Jun 2011 23:04:19 +0000 Subject: [PATCH] [TASK] Optimized structure for public function work() --- Classes/Client/ClientManager.php | 78 +++++++++++++++++++------------- README | 2 +- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/Classes/Client/ClientManager.php b/Classes/Client/ClientManager.php index eda05d0..b57e30a 100644 --- a/Classes/Client/ClientManager.php +++ b/Classes/Client/ClientManager.php @@ -80,21 +80,16 @@ class Client_ClientManager { /** * Main worker function. * Processes incoming data, calls clients and much more. - * TODO: refactor this? (split it into handleFoobar() functions) * @return void */ public function work() { //firstly, create clients for connections without one. foreach($this->connectionPool->getConnectionHandlers() AS $connectionHandler) { - if(!isset($this->clientPool[$connectionHandler->getID()])) { - //new connections might need a client, so we'll create one here. - $this->addClientForConnectionHandler($connectionHandler); - //allow client to send initial stuff right after connecting to the server. - $this->clientPool[$connectionHandler->getID()]->initializeConnection(); - //after initializing, have it process an empty string in order to get stuff to write. >.< - $result = $this->clientPool[$connectionHandler->getID()]->processRawData(""); - if($result !== "") $connectionHandler->write($result); - } + if(isset($this->clientPool[$connectionHandler->getID()])) continue; + //new connections might need a client, so we'll create one here. + $this->addClientForConnectionHandler($connectionHandler); + //allow client to send initial stuff right after connecting to the server. + $this->initializeClientForConnectionHandler($connectionHandler); } //then, process all connections that have stuff to read. @@ -105,33 +100,18 @@ class Client_ClientManager { if($connectionHandler->isConnected() === FALSE && $connectionHandler->isListening() === FALSE) { //check whether the reconnect-flag is set if($connectionHandler->getReconnect() === TRUE) { - //have the connectionHandler do the reconnect. - $newConnectionHandler = $connectionHandler->reconnect(); - //get the client and reset it. - $client = $this->clientPool[$connectionHandler->getID()]; - $client->resetConnectionStatus(); - //assign the client to the new connectionHandler. - $this->clientPool[$newConnectionHandler->getID()] = $client; - //get the config and assign it to the new connectionHandler, too. - $config = $this->configPool[$connectionHandler->getID()]; - $this->configPool[$newConnectionHandler->getID()] = $config; - //remove old connection - $this->removeConnection($connectionHandler); - //re-initialize the client - $this->clientPool[$newConnectionHandler->getID()]->initializeConnection(); - //and of course, process stuff to get the buffer filled. :/ - $result = $this->clientPool[$newConnectionHandler->getID()]->processRawData(""); - if($result !== "") $newConnectionHandler->write($result); + //do the reconnect stuff... + $this->handleReconnectForConnectionHandler($connectionHandler); } - $this->removeClientForConnectionHandler($connectionHandler); //this connectionHandler won't do much anymore - kill it. + $this->removeClientForConnectionHandler($connectionHandler); continue; } //handle accepted sockets, adopt them and treat them with care :-) if($connectionHandler->isListening() === TRUE) { $this->addClientForConnectionHandler($connectionHandler); //TODO: maybe we want to trigger the "client" here, too? -- YES - $this->clientPool[$connectionHandler->getID()]->initializeConnection(); + $this->initializeClientForConnectionHandler($connectionHandler); } //call the registered client @@ -139,9 +119,7 @@ class Client_ClientManager { //let the client process the data, send the results back. while($data = $connectionHandler->read()) { $result = $this->clientPool[$connectionHandler->getID()]->processRawData($data); - if($result !== "") { - $connectionHandler->write($result); - } + if($result !== "") $connectionHandler->write($result); } } } @@ -212,6 +190,42 @@ class Client_ClientManager { } } + /** + * Initializes the client of a given connectionHandler. + * This should be done after establishing a connection. + * @param Connection_ConnectionHandler $connectionHandler + * @return void + */ + protected function initializeClientForConnectionHandler($connectionHandler) { + $this->clientPool[$connectionHandler->getID()]->initializeConnection(); + //after initializing, have it process an empty string in order to get stuff to write. >.< + $result = $this->clientPool[$connectionHandler->getID()]->processRawData(""); + if($result !== "") $connectionHandler->write($result); + } + + /** + * Creates a new connectionHandler, resets the clients connection status, + * copies the old config and assigns the new connectionHandler to the client. + * @param Connection_ConnectionHandler $connectionHandler + * @return void + */ + protected function handleReconnectForConnectionHandler($connectionHandler) { + //have the connectionHandler do the reconnect. + $newConnectionHandler = $connectionHandler->reconnect(); + //get the client and reset it. + $client = $this->clientPool[$connectionHandler->getID()]; + $client->resetConnectionStatus(); + //assign the client to the new connectionHandler. + $this->clientPool[$newConnectionHandler->getID()] = $client; + //get the config and assign it to the new connectionHandler, too. + $config = $this->configPool[$connectionHandler->getID()]; + $this->configPool[$newConnectionHandler->getID()] = $config; + //re-initialize the client + $this->initializeClientForConnectionHandler($newConnectionHandler); + //remove old connection + $this->removeConnection($connectionHandler); + } + /** * Adds a client to our client pool. * @param Connection_ConnectionHandler $connectionHandler diff --git a/README b/README index 59d33aa..5db0d2a 100644 --- a/README +++ b/README @@ -14,4 +14,4 @@ The Code itself should also give you an idea of how this works :-) # License -This project is a private one, i don't know what license i will use yet. \ No newline at end of file +This project is a private one, i don't know what license i will use yet. Maybe something like GPL v2+ \ No newline at end of file