/**
* A RequestNodeListAnswerOkay handler
*
- * @author Roland Haeder <webmaster@ship-simu.org>
+ * @author Roland Haeder <webmaster@shipsimu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Hub Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Hub Developer Team
* @license GNU GPL 3.0 or any newer version
- * @link http://www.ship-simu.org
+ * @link http://www.shipsimu.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
// Call parent constructor
parent::__construct(__CLASS__);
+ // Init array
+ $this->searchData = array(
+ XmlRequestNodeListAnswerTemplateEngine::REQUEST_DATA_SESSION_ID,
+ );
+
// Set handler name
$this->setHandlerName('request_node_list_answer_okay');
}
* @return void
* @throws NodeSessionIdVerficationException If the provided session id is not matching
* @todo Do some more here: Handle karma, et cetera?
- * @todo Rewrite this to use DHT
*/
public function handleAnswerMessageData (array $messageData, Receivable $packageInstance) {
- // Get a database wrapper instance
- $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_list_db_wrapper_class');
-
- // Get also a search criteria instance
- $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
-
- // Lookup external session id/external IP/port
- $searchInstance->addCriteria('session_id' , $messageData[XmlRequestNodeListAnswerTemplateEngine::REQUEST_DATA_SESSION_ID]);
+ // Make sure node-list is found in array
+ assert(isset($messageData[XmlRequestNodeListAnswerTemplateEngine::REQUEST_DATA_NODE_LIST]));
- // Only one entry is fine
- $searchInstance->setLimit(1);
+ // Save node list
+ $nodeList = json_decode(base64_decode($messageData[XmlRequestNodeListAnswerTemplateEngine::REQUEST_DATA_NODE_LIST]));
- // Run the query
- $resultInstance = $wrapperInstance->doSelectByCriteria($searchInstance);
+ // Make sure it is completely decoded
+ assert(is_array($nodeList));
- // Is there an try?
- if (!$resultInstance->next()) {
- // This is fatal, caused by "stolen" session id and/or not matching IP number/port combination
- throw new NodeSessionIdVerficationException(array($this, $messageData), BaseHubSystem::EXCEPTION_NODE_SESSION_ID_NOT_VERIFYING);
- } // END - if
+ // ... and remove it as it should not be included now
+ unset($messageData[XmlRequestNodeListAnswerTemplateEngine::REQUEST_DATA_NODE_LIST]);
- // Get the node instance
- $nodeInstance = Registry::getRegistry()->getInstance('node');
+ // Write node list to DHT
+ $this->getDhtInstance()->insertNodeList($nodeList);
- // Change state
- $nodeInstance->getStateInstance()->nodeRequestNodeListSuccessful();
+ /*
+ * Query DHT and force update (which will throw an exception if the
+ * node is not found).
+ */
+ $this->getDhtInstance()->registerNodeByMessageData($messageData, $this, TRUE);
// Prepare next message ("hello" message to all returned nodes)
- $this->prepareNextMessage($messageData, $packageInstance);
+ //$this->prepareNextMessage($messageData, $packageInstance);
}
/**