OpenTTD
tcp_connect.cpp
Go to the documentation of this file.
1 /* $Id: tcp_connect.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * 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.
6  * 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.
7  * 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/>.
8  */
9 
14 #ifdef ENABLE_NETWORK
15 
16 #include "../../stdafx.h"
17 #include "../../thread/thread.h"
18 
19 #include "tcp.h"
20 
21 #include "../../safeguards.h"
22 
25 
31  connected(false),
32  aborted(false),
33  killed(false),
34  sock(INVALID_SOCKET),
35  address(address)
36 {
37  *_tcp_connecters.Append() = this;
39  this->Connect();
40  }
41 }
42 
45 {
46  this->sock = this->address.Connect();
47  if (this->sock == INVALID_SOCKET) {
48  this->aborted = true;
49  } else {
50  this->connected = true;
51  }
52 }
53 
58 /* static */ void TCPConnecter::ThreadEntry(void *param)
59 {
60  static_cast<TCPConnecter*>(param)->Connect();
61 }
62 
69 /* static */ void TCPConnecter::CheckCallbacks()
70 {
71  for (TCPConnecter **iter = _tcp_connecters.Begin(); iter < _tcp_connecters.End(); /* nothing */) {
72  TCPConnecter *cur = *iter;
73  if ((cur->connected || cur->aborted) && cur->killed) {
74  _tcp_connecters.Erase(iter);
75  if (cur->sock != INVALID_SOCKET) closesocket(cur->sock);
76  delete cur;
77  continue;
78  }
79  if (cur->connected) {
80  _tcp_connecters.Erase(iter);
81  cur->OnConnect(cur->sock);
82  delete cur;
83  continue;
84  }
85  if (cur->aborted) {
86  _tcp_connecters.Erase(iter);
87  cur->OnFailure();
88  delete cur;
89  continue;
90  }
91  iter++;
92  }
93 }
94 
96 /* static */ void TCPConnecter::KillAll()
97 {
98  for (TCPConnecter **iter = _tcp_connecters.Begin(); iter != _tcp_connecters.End(); iter++) (*iter)->killed = true;
99 }
100 
101 #endif /* ENABLE_NETWORK */