| [7161] | 1 | /* | 
|---|
|  | 2 | *   ORXONOX - the hottest 3D action shooter ever to exist | 
|---|
|  | 3 | *                    > www.orxonox.net < | 
|---|
|  | 4 | * | 
|---|
|  | 5 | * | 
|---|
|  | 6 | *   License notice: | 
|---|
|  | 7 | * | 
|---|
|  | 8 | *   This program is free software; you can redistribute it and/or | 
|---|
|  | 9 | *   modify it under the terms of the GNU General Public License | 
|---|
|  | 10 | *   as published by the Free Software Foundation; either version 2 | 
|---|
|  | 11 | *   of the License, or (at your option) any later version. | 
|---|
|  | 12 | * | 
|---|
|  | 13 | *   This program is distributed in the hope that it will be useful, | 
|---|
|  | 14 | *   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 15 | *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 16 | *   GNU General Public License for more details. | 
|---|
|  | 17 | * | 
|---|
|  | 18 | *   You should have received a copy of the GNU General Public License | 
|---|
|  | 19 | *   along with this program; if not, write to the Free Software | 
|---|
|  | 20 | *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
|---|
|  | 21 | * | 
|---|
|  | 22 | *   Author: | 
|---|
| [8858] | 23 | *      Sandro 'smerkli' Merkli | 
|---|
| [7161] | 24 | *   Co-authors: | 
|---|
| [8858] | 25 | *      Oliver Scheuss (original) | 
|---|
| [7161] | 26 | * | 
|---|
|  | 27 | */ | 
|---|
|  | 28 |  | 
|---|
| [7630] | 29 | #include "WANDiscovery.h" | 
|---|
| [7161] | 30 |  | 
|---|
|  | 31 | #include <enet/enet.h> | 
|---|
|  | 32 | #include <cstring> | 
|---|
|  | 33 |  | 
|---|
|  | 34 | #include "core/CoreIncludes.h" | 
|---|
|  | 35 |  | 
|---|
|  | 36 |  | 
|---|
|  | 37 | namespace orxonox | 
|---|
| [7284] | 38 | { | 
|---|
| [7630] | 39 | WANDiscovery::WANDiscovery() | 
|---|
| [7161] | 40 | { | 
|---|
| [7737] | 41 | /* debugging output */ | 
|---|
| [8858] | 42 | orxout(verbose, context::master_server) << "Creating WANDiscovery." << endl; | 
|---|
| [7737] | 43 |  | 
|---|
| [7750] | 44 | /* register object in orxonox */ | 
|---|
| [7737] | 45 | RegisterObject(WANDiscovery); | 
|---|
| [7631] | 46 |  | 
|---|
| [7750] | 47 | /* check for the masterserver address option in orxonox.ini */ | 
|---|
| [7737] | 48 | this->setConfigValues(); | 
|---|
|  | 49 |  | 
|---|
| [7631] | 50 | /* initialize it and see if it worked */ | 
|---|
|  | 51 | if( msc.initialize() ) | 
|---|
| [8858] | 52 | orxout(internal_error, context::master_server) << "Could not initialize master server communications!" << endl; | 
|---|
| [7631] | 53 |  | 
|---|
|  | 54 | /* connect and see if it worked */ | 
|---|
| [7744] | 55 | if( msc.connect( this->msaddress.c_str(), ORX_MSERVER_PORT ) ) | 
|---|
| [8858] | 56 | orxout(internal_error, context::master_server) << "Could not connect to master server at " | 
|---|
|  | 57 | << this->msaddress << endl; | 
|---|
| [7667] | 58 |  | 
|---|
| [7737] | 59 | /* debugging output */ | 
|---|
| [8858] | 60 | orxout(verbose, context::master_server) << "Initialization of WANDiscovery complete." << endl; | 
|---|
| [7161] | 61 | } | 
|---|
|  | 62 |  | 
|---|
| [7739] | 63 | void WANDiscovery::setConfigValues() | 
|---|
|  | 64 | { | 
|---|
| [7750] | 65 | /* update msaddress string from orxonox.ini config file, if it | 
|---|
|  | 66 | * has changed. | 
|---|
|  | 67 | */ | 
|---|
| [8327] | 68 | SetConfigValue( msaddress, "master.orxonox.net"); | 
|---|
| [7739] | 69 | } | 
|---|
|  | 70 |  | 
|---|
| [7630] | 71 | WANDiscovery::~WANDiscovery() | 
|---|
| [7631] | 72 | { | 
|---|
|  | 73 | /* clear server list */ | 
|---|
|  | 74 | this->servers_.clear(); | 
|---|
| [7161] | 75 | } | 
|---|
| [7284] | 76 |  | 
|---|
| [7631] | 77 | /* callback for the network reply poller */ | 
|---|
| [8858] | 78 | int WANDiscovery::rhandler( char *addr, ENetEvent *ev ) | 
|---|
| [7631] | 79 | { | 
|---|
| [7657] | 80 | /* error recognition */ | 
|---|
|  | 81 | if( !ev || !ev->packet || !ev->packet->data ) | 
|---|
| [8858] | 82 | { orxout(internal_warning, context::master_server) << "Bad arguments received in WANDiscovery's reply handler." << endl; | 
|---|
| [7657] | 83 | return 0; | 
|---|
|  | 84 | } | 
|---|
|  | 85 |  | 
|---|
| [7650] | 86 | /* handle incoming data */ | 
|---|
|  | 87 | /* if a list entry arrives add to list */ | 
|---|
| [7651] | 88 | if( !strncmp( (char*)ev->packet->data, MSPROTO_SERVERLIST_ITEM, | 
|---|
| [7650] | 89 | MSPROTO_SERVERLIST_ITEM_LEN ) ) | 
|---|
|  | 90 | { | 
|---|
|  | 91 | /* create server structure from that item */ | 
|---|
| [7651] | 92 | packet::ServerInformation toadd; | 
|---|
| [7631] | 93 |  | 
|---|
| [7747] | 94 | /* fill in data, -1 for the index: index should be length -1 */ | 
|---|
| [7651] | 95 | toadd.setServerName( std::string((char*)ev->packet->data + | 
|---|
| [7749] | 96 | MSPROTO_SERVERLIST_ITEM_LEN+1) ); | 
|---|
| [7651] | 97 | toadd.setServerIP( std::string((char*)ev->packet->data + | 
|---|
| [7749] | 98 | MSPROTO_SERVERLIST_ITEM_LEN+1) ); | 
|---|
| [7650] | 99 |  | 
|---|
|  | 100 | /* add to list */ | 
|---|
| [8858] | 101 | this->servers_.push_back( toadd ); | 
|---|
| [7650] | 102 | } | 
|---|
| [7651] | 103 | else if( !strncmp( (char*)ev->packet->data, MSPROTO_SERVERLIST_END, | 
|---|
| [7650] | 104 | MSPROTO_SERVERLIST_END_LEN ) ) | 
|---|
| [7672] | 105 | { | 
|---|
| [7749] | 106 | /* this is the only case where 2 should be returned, | 
|---|
| [7672] | 107 | * as 1 is used to signal that we're done receiving | 
|---|
|  | 108 | * the list | 
|---|
|  | 109 | */ | 
|---|
| [7692] | 110 | return 2; | 
|---|
| [7672] | 111 | } | 
|---|
| [7650] | 112 |  | 
|---|
| [7631] | 113 | /* done handling, return all ok code 0 */ | 
|---|
| [7692] | 114 | return 1; | 
|---|
| [7631] | 115 | } | 
|---|
|  | 116 |  | 
|---|
| [7630] | 117 | void WANDiscovery::discover() | 
|---|
| [7161] | 118 | { | 
|---|
| [7631] | 119 | /* clear list */ | 
|---|
| [7161] | 120 | this->servers_.clear(); | 
|---|
| [7631] | 121 |  | 
|---|
|  | 122 | /* send request to server */ | 
|---|
| [7657] | 123 | this->msc.sendRequest( MSPROTO_CLIENT " " MSPROTO_REQ_LIST ); | 
|---|
| [7631] | 124 |  | 
|---|
| [7672] | 125 | /* poll for replies */ | 
|---|
| [7692] | 126 | int i = WANDISC_MAXTRIES; | 
|---|
|  | 127 | while( i > 0 ) | 
|---|
|  | 128 | { | 
|---|
|  | 129 | /* poll for reply and act according to what was received */ | 
|---|
| [8858] | 130 | switch( this->msc.pollForReply( this, 500 ) ) | 
|---|
| [7692] | 131 | { case 0: /* no event occured, decrease timeout */ | 
|---|
|  | 132 | --i; break; | 
|---|
|  | 133 | case 1: /* got a list element, continue */ | 
|---|
|  | 134 | break; | 
|---|
|  | 135 | case 2: /* done. */ | 
|---|
|  | 136 | i = 0; break; | 
|---|
|  | 137 | } | 
|---|
|  | 138 | } | 
|---|
| [7630] | 139 | } | 
|---|
| [7284] | 140 |  | 
|---|
| [7630] | 141 | std::string WANDiscovery::getServerListItemName(unsigned int index) | 
|---|
|  | 142 | { | 
|---|
| [7631] | 143 | /* if the index is out of range, return empty */ | 
|---|
|  | 144 | if( index >= this->servers_.size() ) | 
|---|
|  | 145 | return BLANKSTRING; | 
|---|
|  | 146 | else | 
|---|
|  | 147 | /* else return the name of the server */ | 
|---|
|  | 148 | return this->servers_[index].getServerName(); | 
|---|
| [7161] | 149 | } | 
|---|
| [7284] | 150 |  | 
|---|
| [7630] | 151 | std::string WANDiscovery::getServerListItemIP(unsigned int index) | 
|---|
| [7161] | 152 | { | 
|---|
| [7631] | 153 | /* if the index is out of range, return empty */ | 
|---|
|  | 154 | if( index >= this->servers_.size() ) | 
|---|
|  | 155 | return BLANKSTRING; | 
|---|
|  | 156 | else | 
|---|
|  | 157 | /* else return the IP of the server */ | 
|---|
|  | 158 | return this->servers_[index].getServerIP(); | 
|---|
| [7161] | 159 | } | 
|---|
| [7284] | 160 |  | 
|---|
|  | 161 |  | 
|---|
| [7161] | 162 | } // namespace orxonox | 
|---|