2 // This file is part of the aMule Project.
4 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "Server.h" // Interface declarations.
28 #include <tags/ServerTags.h>
30 #include "NetworkFunctions.h" // Needed for StringIPtoUint32
31 #include "OtherStructs.h" // Needed for ServerMet_Struct
34 CServer::CServer(ServerMet_Struct
* in_data
)
42 CServer::CServer(uint16 in_port
, const wxString i_addr
)
46 ip
= StringIPtoUint32(i_addr
);
50 // GonoszTopi - Init() would clear dynip !
51 // Check that the ip isn't in fact 0.0.0.0
52 if (!ip
&& !StringIPtoUint32( i_addr
, ip
) ) {
53 // If ip == 0, the address is a hostname
59 CServer::CServer(CEC_Server_Tag
*tag
)
61 ip
= tag
->GetIPv4Data().IP();
63 port
= tag
->GetIPv4Data().m_port
;
67 listname
= tag
->ServerName();
68 description
= tag
->ServerDesc();
69 maxusers
= tag
->GetMaxUsers();
71 files
= tag
->GetFiles();
72 users
= tag
->GetUsers();
74 preferences
= tag
->GetPrio(); // SRV_PR_NORMAL = 0, so it's ok
75 staticservermember
= tag
->GetStatic();
77 ping
= tag
->GetPing();
78 failedcount
= tag
->GetFailed();
83 CServer::CServer(CServer
* pOld
)
85 wxASSERT(pOld
!= NULL
);
87 TagPtrList::iterator it
= pOld
->m_taglist
.begin();
88 for ( ; it
!= pOld
->m_taglist
.end(); ++it
) {
89 m_taglist
.push_back((*it
)->CloneTag());
93 realport
= pOld
->realport
;
94 staticservermember
=pOld
->IsStaticMember();
95 tagcount
= pOld
->tagcount
;
96 ipfull
= pOld
->ipfull
;
99 preferences
= pOld
->preferences
;
101 failedcount
= pOld
->failedcount
;
102 lastpinged
= pOld
->lastpinged
;
103 lastpingedtime
= pOld
->lastpingedtime
;
104 m_dwRealLastPingedTime
= pOld
->m_dwRealLastPingedTime
;
105 description
= pOld
->description
;
106 listname
= pOld
->listname
;
108 maxusers
= pOld
->maxusers
;
109 m_strVersion
= pOld
->m_strVersion
;
110 m_uTCPFlags
= pOld
->m_uTCPFlags
;
111 m_uUDPFlags
= pOld
->m_uUDPFlags
;
112 challenge
= pOld
->challenge
;
113 softfiles
= pOld
->softfiles
;
114 hardfiles
= pOld
->hardfiles
;
115 m_uDescReqChallenge
= pOld
->m_uDescReqChallenge
;
116 m_uLowIDUsers
= pOld
->m_uLowIDUsers
;
117 lastdescpingedcout
= pOld
->lastdescpingedcout
;
118 m_auxPorts
= pOld
->m_auxPorts
;
119 m_dwServerKeyUDP
= pOld
->m_dwServerKeyUDP
;
120 m_bCryptPingReplyPending
= pOld
->m_bCryptPingReplyPending
;
121 m_dwIPServerKeyUDP
= pOld
->m_dwIPServerKeyUDP
;
122 m_nObfuscationPortTCP
= pOld
->m_nObfuscationPortTCP
;
123 m_nObfuscationPortUDP
= pOld
->m_nObfuscationPortUDP
;
128 TagPtrList::iterator it
= m_taglist
.begin();
129 for ( ; it
!= m_taglist
.end(); ++it
) {
136 void CServer::Init() {
138 ipfull
= Uint32toStringIP(ip
);
152 m_dwRealLastPingedTime
= 0;
153 staticservermember
=false;
160 m_strVersion
= _("Unknown");
162 m_uDescReqChallenge
= 0;
163 lastdescpingedcout
= 0;
166 m_dnsfailure
= false;
168 m_dwServerKeyUDP
= 0;
169 m_bCryptPingReplyPending
= false;
170 m_dwIPServerKeyUDP
= 0;
171 m_nObfuscationPortTCP
= 0;
172 m_nObfuscationPortUDP
= 0;
177 bool CServer::AddTagFromFile(CFileDataIO
* servermet
)
179 if (servermet
== NULL
) {
183 CTag
tag(*servermet
, true);
185 switch(tag
.GetNameID()){
187 if (listname
.IsEmpty()) {
188 listname
= tag
.GetStr();
193 if (description
.IsEmpty()) {
194 description
= tag
.GetStr();
199 preferences
= tag
.GetInt();
207 if (dynip
.IsEmpty()) {
208 dynip
= tag
.GetStr();
213 failedcount
= tag
.GetInt();
217 lastpinged
= tag
.GetInt();
221 maxusers
= tag
.GetInt();
225 softfiles
= tag
.GetInt();
229 hardfiles
= tag
.GetInt();
234 // m_strVersion defaults to _("Unknown"), so check for that as well
235 if ((m_strVersion
.IsEmpty()) || (m_strVersion
== _("Unknown"))) {
236 m_strVersion
= tag
.GetStr();
238 } else if (tag
.IsInt()) {
239 m_strVersion
= wxString::Format(wxT("%u.%u"), tag
.GetInt() >> 16, tag
.GetInt() & 0xFFFF);
246 m_uUDPFlags
= tag
.GetInt();
249 case ST_AUXPORTSLIST
:
250 m_auxPorts
= tag
.GetStr();
252 // Some server.mets contain empty ST_AUXPORTSLIST tags
253 if (!m_auxPorts
.IsEmpty()) {
255 port
= StrToULong(m_auxPorts
.BeforeFirst(','));
260 m_uLowIDUsers
= tag
.GetInt();
264 m_dwServerKeyUDP
= tag
.GetInt();
268 m_dwIPServerKeyUDP
= tag
.GetInt();
271 case ST_TCPPORTOBFUSCATION
:
272 m_nObfuscationPortTCP
= (uint16
)tag
.GetInt();
275 case ST_UDPPORTOBFUSCATION
:
276 m_nObfuscationPortUDP
= (uint16
)tag
.GetInt();
280 if (!tag
.GetName().IsEmpty()) {
281 if (tag
.GetName() == wxT("files")) {
282 files
= tag
.GetInt();
283 } else if (tag
.GetName() == wxT("users")) {
284 users
= tag
.GetInt();
295 void CServer::SetListName(const wxString
& newname
)
300 void CServer::SetDescription(const wxString
& newname
)
302 description
= newname
;
305 void CServer::SetID(uint32 newip
)
309 ipfull
= Uint32toStringIP(ip
);
312 void CServer::SetDynIP(const wxString
& newdynip
)
318 void CServer::SetLastDescPingedCount(bool bReset
)
321 lastdescpingedcout
= 0;
323 lastdescpingedcout
++;
327 uint32
CServer::GetServerKeyUDP(bool bForce
) const
329 if (m_dwIPServerKeyUDP
!= 0 && m_dwIPServerKeyUDP
== theApp
->GetPublicIP() || bForce
) {
330 return m_dwServerKeyUDP
;
336 void CServer::SetServerKeyUDP(uint32 dwServerKeyUDP
)
338 wxASSERT( theApp
->GetPublicIP() != 0 || dwServerKeyUDP
== 0 );
339 m_dwServerKeyUDP
= dwServerKeyUDP
;
340 m_dwIPServerKeyUDP
= theApp
->GetPublicIP();
342 // File_checked_for_headers