tcp_connect.cpp

Go to the documentation of this file.
00001 /* $Id$ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00014 #ifdef ENABLE_NETWORK
00015 
00016 #include "../../stdafx.h"
00017 #include "../../thread/thread.h"
00018 
00019 #include "tcp.h"
00020 
00022 static SmallVector<TCPConnecter *,  1> _tcp_connecters;
00023 
00028 TCPConnecter::TCPConnecter(const NetworkAddress &address) :
00029   connected(false),
00030   aborted(false),
00031   killed(false),
00032   sock(INVALID_SOCKET),
00033   address(address)
00034 {
00035   *_tcp_connecters.Append() = this;
00036   if (!ThreadObject::New(TCPConnecter::ThreadEntry, this, &this->thread)) {
00037     this->Connect();
00038   }
00039 }
00040 
00042 void TCPConnecter::Connect()
00043 {
00044   this->sock = this->address.Connect();
00045   if (this->sock == INVALID_SOCKET) {
00046     this->aborted = true;
00047   } else {
00048     this->connected = true;
00049   }
00050 }
00051 
00056 /* static */ void TCPConnecter::ThreadEntry(void *param)
00057 {
00058   static_cast<TCPConnecter*>(param)->Connect();
00059 }
00060 
00067 /* static */ void TCPConnecter::CheckCallbacks()
00068 {
00069   for (TCPConnecter **iter = _tcp_connecters.Begin(); iter < _tcp_connecters.End(); /* nothing */) {
00070     TCPConnecter *cur = *iter;
00071     if ((cur->connected || cur->aborted) && cur->killed) {
00072       _tcp_connecters.Erase(iter);
00073       if (cur->sock != INVALID_SOCKET) closesocket(cur->sock);
00074       delete cur;
00075       continue;
00076     }
00077     if (cur->connected) {
00078       _tcp_connecters.Erase(iter);
00079       cur->OnConnect(cur->sock);
00080       delete cur;
00081       continue;
00082     }
00083     if (cur->aborted) {
00084       _tcp_connecters.Erase(iter);
00085       cur->OnFailure();
00086       delete cur;
00087       continue;
00088     }
00089     iter++;
00090   }
00091 }
00092 
00094 /* static */ void TCPConnecter::KillAll()
00095 {
00096   for (TCPConnecter **iter = _tcp_connecters.Begin(); iter != _tcp_connecters.End(); iter++) (*iter)->killed = true;
00097 }
00098 
00099 #endif /* ENABLE_NETWORK */

Generated on Fri May 27 04:19:43 2011 for OpenTTD by  doxygen 1.6.1