1// 2// This file is part of the aMule Project. 3// 4// Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) 5// Copyright (c) 2004-2011 Angel Vidal (Kry) ( kry@amule.org / http://www.amule.org ) 6// 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 9// respective authors. 10// 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. 15// 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. 20// 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 24// 25 26#include "KadDlg.h" 27#include "muuli_wdr.h" 28#include "OScopeCtrl.h" 29#include "OtherFunctions.h" 30#include "HTTPDownload.h" 31#include "Logger.h" 32#include "amule.h" 33#include "Preferences.h" 34#include "StatisticsDlg.h" 35#include "ColorFrameCtrl.h" 36#include "amuleDlg.h" 37#include "MuleColour.h" 38#include "Statistics.h" 39 40#ifndef CLIENT_GUI 41#include "kademlia/kademlia/Kademlia.h" 42#endif 43 44 45BEGIN_EVENT_TABLE(CKadDlg, wxPanel) 46 EVT_TEXT(ID_NODE_IP1, CKadDlg::OnFieldsChange) 47 EVT_TEXT(ID_NODE_IP2, CKadDlg::OnFieldsChange) 48 EVT_TEXT(ID_NODE_IP3, CKadDlg::OnFieldsChange) 49 EVT_TEXT(ID_NODE_IP4, CKadDlg::OnFieldsChange) 50 EVT_TEXT(ID_NODE_PORT, CKadDlg::OnFieldsChange) 51 52 EVT_TEXT_ENTER(IDC_NODESLISTURL ,CKadDlg::OnBnClickedUpdateNodeList) 53 54 EVT_BUTTON(ID_NODECONNECT, CKadDlg::OnBnClickedBootstrapClient) 55 EVT_BUTTON(ID_KNOWNNODECONNECT, CKadDlg::OnBnClickedBootstrapKnown) 56 EVT_BUTTON(ID_KADDISCONNECT, CKadDlg::OnBnClickedDisconnectKad) 57 EVT_BUTTON(ID_UPDATEKADLIST, CKadDlg::OnBnClickedUpdateNodeList) 58END_EVENT_TABLE() 59 60 61 62CKadDlg::CKadDlg(wxWindow* pParent) 63 : wxPanel(pParent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, wxT("kadwnd") ) 64{ 65 m_kad_scope = NULL; 66} 67 68 69void CKadDlg::Init() 70{ 71 m_kad_scope = CastChild( wxT("kadScope"), COScopeCtrl ); 72 m_kad_scope->SetRanges(0.0, thePrefs::GetStatsMax()); 73 m_kad_scope->SetYUnits(wxT("Nodes")); 74 75#ifndef __WXMSW__ 76 // 77 // Get label with line breaks out of muuli.wdr, because generated code fails 78 // to compile in Windows. 79 // 80 // In Windows, setting a button label with a newline fails (the newline is ignored). 81 // Creating a button with such a label works however. :-/ 82 // So leave the label from the muuli (without line breaks) here, 83 // so it can still be fixed in the translation. 84 // 85 wxButton* bootstrap = CastChild(ID_KNOWNNODECONNECT, wxButton); 86 bootstrap->SetLabel(_("Bootstrap from \nknown clients")); 87#endif 88 89 SetUpdatePeriod(thePrefs::GetTrafficOMeterInterval()); 90 SetGraphColors(); 91} 92 93 94void CKadDlg::SetUpdatePeriod(int step) 95{ 96 // this gets called after the value in Preferences/Statistics/Update delay has been changed 97 if (step == 0) { 98 m_kad_scope->Stop(); 99 } else { 100 m_kad_scope->Reset(step); 101 } 102} 103 104 105void CKadDlg::SetGraphColors() 106{ 107 static const char aTrend[] = { 2, 1, 0 }; 108 static const int aRes[] = { IDC_C0, IDC_C0_3, IDC_C0_2 }; 109 110 m_kad_scope->SetBackgroundColor(CStatisticsDlg::getColors(0)); 111 m_kad_scope->SetGridColor(CStatisticsDlg::getColors(1)); 112 113 for (size_t i = 0; i < 3; ++i) { 114 m_kad_scope->SetPlotColor(CStatisticsDlg::getColors(12 + i), aTrend[i]); 115 116 CColorFrameCtrl* ctrl = CastChild(aRes[i], CColorFrameCtrl); 117 ctrl->SetBackgroundBrushColour(CMuleColour(CStatisticsDlg::getColors(12 + i))); 118 ctrl->SetFrameBrushColour(*wxBLACK); 119 } 120} 121 122 123void CKadDlg::UpdateGraph(const GraphUpdateInfo& update) 124{ 125 std::vector<float *> v(3); 126 v[0] = const_cast<float *>(&update.kadnodes[0]); 127 v[1] = const_cast<float *>(&update.kadnodes[1]); 128 v[2] = const_cast<float *>(&update.kadnodes[2]); 129 const std::vector<float *> &apfKad(v); 130 unsigned nodeCount = static_cast<unsigned>(update.kadnodes[2]); 131 132 if (!IsShownOnScreen()) { 133 m_kad_scope->DelayPoints(); 134 } else { 135 // Check the current node-count to see if we should increase the graph height 136 if (m_kad_scope->GetUpperLimit() < update.kadnodes[2]) { 137 // Grow the limit by 50 sized increments. 138 m_kad_scope->SetRanges(0.0, ((nodeCount + 49) / 50) * 50); 139 } 140 141 m_kad_scope->AppendPoints(update.timestamp, apfKad); 142 } 143 144 wxStaticText* label = CastChild( wxT("nodesListLabel"), wxStaticText ); 145 wxCHECK_RET(label, wxT("Failed to find kad-nodes label")); 146 147 label->SetLabel(CFormat(_("Nodes (%u)")) % nodeCount); 148 label->GetParent()->Layout(); 149} 150 151 152// Enables or disables the node connect button depending on the conents of the text fields 153void CKadDlg::OnFieldsChange(wxCommandEvent& WXUNUSED(evt)) 154{ 155 // These are the IDs of the search-fields 156 int textfields[] = { ID_NODE_IP1, ID_NODE_IP2, ID_NODE_IP3, ID_NODE_IP4, ID_NODE_PORT}; 157 158 bool enable = true; 159 for ( uint16 i = 0; i < itemsof(textfields); i++ ) { 160 enable &= !CastChild(textfields[i], wxTextCtrl)->GetValue().IsEmpty(); 161 } 162 163 // Enable the node connect button if all fields contain text 164 FindWindowById(ID_NODECONNECT)->Enable( enable ); 165} 166 167 168void CKadDlg::OnBnClickedBootstrapClient(wxCommandEvent& WXUNUSED(evt)) 169{ 170 if (FindWindowById(ID_NODECONNECT)->IsEnabled()) { 171 // Ip is reversed since StringIPtoUint32 returns anti-host and kad expects host order 172 uint32 ip = StringIPtoUint32( 173 ((wxTextCtrl*)FindWindowById( ID_NODE_IP4 ))->GetValue() + 174 wxT(".") + 175 ((wxTextCtrl*)FindWindowById( ID_NODE_IP3 ))->GetValue() + 176 wxT(".") + 177 ((wxTextCtrl*)FindWindowById( ID_NODE_IP2 ))->GetValue() + 178 wxT(".") + 179 ((wxTextCtrl*)FindWindowById( ID_NODE_IP1 ))->GetValue() ); 180 181 if (ip == 0) { 182 wxMessageBox(_("Invalid ip to bootstrap"), _("WARNING"), wxOK | wxICON_EXCLAMATION, this); 183 } else { 184 unsigned long port; 185 if (((wxTextCtrl*)FindWindowById( ID_NODE_PORT ))->GetValue().ToULong(&port)) { 186 theApp->BootstrapKad(ip, port); 187 } else { 188 wxMessageBox(_("Invalid port to bootstrap"), _("WARNING"), wxOK | wxICON_EXCLAMATION, this); 189 } 190 } 191 } else { 192 wxMessageBox(_("Please fill all fields required"), _("Message"), wxOK | wxICON_INFORMATION, this); 193 } 194} 195 196 197void CKadDlg::OnBnClickedBootstrapKnown(wxCommandEvent& WXUNUSED(evt)) 198{ 199 theApp->StartKad(); 200} 201 202 203void CKadDlg::OnBnClickedDisconnectKad(wxCommandEvent& WXUNUSED(evt)) 204{ 205 theApp->StopKad(); 206} 207 208 209void CKadDlg::OnBnClickedUpdateNodeList(wxCommandEvent& WXUNUSED(evt)) 210{ 211 if ( wxMessageBox( wxString(_("Are you sure you want to download a new nodes.dat file?\n")) + 212 _("Doing so will remove your current nodes and restart Kademlia connection.") 213 , _("Continue?"), wxICON_EXCLAMATION | wxYES_NO, this) == wxYES ) { 214 wxString strURL = ((wxTextCtrl*)FindWindowById( IDC_NODESLISTURL ))->GetValue(); 215 216 thePrefs::SetKadNodesUrl(strURL); 217 theApp->UpdateNotesDat(strURL); 218 } 219} 220// File_checked_for_headers 221