Fix installation/uninstallation and distribution of Russian manpages
[amule.git] / src / amule-gui.cpp
blobdfd2a8e627e373dc5fd03db66813e051fd54022c
1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 //
6 // Any parts of this program derived from the xMule, lMule or eMule project,
7 // or contributed by third-party developers are copyrighted by their
8 // respective authors.
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "amule.h" // Interface declarations.
27 #include <common/EventIDs.h>
28 #include <common/ClientVersion.h>
30 #include <wx/clipbrd.h> // Needed for wxClipBoard
31 #include <wx/tokenzr.h> // Needed for wxStringTokenizer
33 #include "SharedFilesWnd.h" // Needed for CSharedFilesWnd
34 #include "Timer.h" // Needed for CTimer
35 #include "PartFile.h" // Needed for CPartFile
37 #include "muuli_wdr.h" // Needed for IDs
38 #include "amuleDlg.h" // Needed for CamuleDlg
39 #include "PartFileConvert.h"
40 #include "ThreadTasks.h"
41 #include "Logger.h" // Needed for EVT_MULE_LOGGING
42 #include "GuiEvents.h" // Needed for EVT_MULE_NOTIFY
44 #ifdef __WXMAC__
45 #include <CoreFoundation/CFBundle.h> // Do_not_auto_remove
46 #include <ApplicationServices/ApplicationServices.h> // For LSRegisterURL // Do_not_auto_remove
47 #endif
49 #ifndef CLIENT_GUI
50 #include "InternalEvents.h" // Needed for wxEVT_*
52 BEGIN_EVENT_TABLE(CamuleGuiApp, wxApp)
54 // Socket handlers
55 // Listen Socket
56 EVT_SOCKET(ID_LISTENSOCKET_EVENT, CamuleGuiApp::ListenSocketHandler)
58 // UDP Socket (servers)
59 EVT_SOCKET(ID_SERVERUDPSOCKET_EVENT, CamuleGuiApp::UDPSocketHandler)
60 // UDP Socket (clients)
61 EVT_SOCKET(ID_CLIENTUDPSOCKET_EVENT, CamuleGuiApp::UDPSocketHandler)
63 // Socket timers (TCP + UDP)
64 EVT_MULE_TIMER(ID_SERVER_RETRY_TIMER_EVENT, CamuleGuiApp::OnTCPTimer)
66 // Core timer
67 EVT_MULE_TIMER(ID_CORE_TIMER_EVENT, CamuleGuiApp::OnCoreTimer)
69 EVT_MULE_NOTIFY(CamuleGuiApp::OnNotifyEvent)
71 // Async dns handling
72 EVT_MULE_INTERNAL(wxEVT_CORE_UDP_DNS_DONE, -1, CamuleGuiApp::OnUDPDnsDone)
74 EVT_MULE_INTERNAL(wxEVT_CORE_SOURCE_DNS_DONE, -1, CamuleGuiApp::OnSourceDnsDone)
76 EVT_MULE_INTERNAL(wxEVT_CORE_SERVER_DNS_DONE, -1, CamuleGuiApp::OnServerDnsDone)
78 // Hash ended notifier
79 EVT_MULE_HASHING(CamuleGuiApp::OnFinishedHashing)
80 EVT_MULE_AICH_HASHING(CamuleGuiApp::OnFinishedAICHHashing)
82 // File completion ended notifier
83 EVT_MULE_FILE_COMPLETED(CamuleGuiApp::OnFinishedCompletion)
85 // HTTPDownload finished
86 EVT_MULE_INTERNAL(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD, -1, CamuleGuiApp::OnFinishedHTTPDownload)
88 // Disk space preallocation finished
89 EVT_MULE_ALLOC_FINISHED(CamuleGuiApp::OnFinishedAllocation)
90 END_EVENT_TABLE()
93 IMPLEMENT_APP(CamuleGuiApp)
95 #endif // CLIENT_GUI
97 CamuleGuiBase::CamuleGuiBase()
99 amuledlg = NULL;
100 m_FileDetailDialogActive = 0;
104 CamuleGuiBase::~CamuleGuiBase()
106 #ifndef CLIENT_GUI
107 CPartFileConvert::StopThread();
108 #endif
112 int CamuleGuiBase::ShowAlert(wxString msg, wxString title, int flags)
114 return wxMessageBox(msg, title, flags);
118 int CamuleGuiBase::InitGui(bool geometry_enabled, wxString &geom_string)
120 // Standard size is 800x600 at position (0,0)
121 int geometry_x = 0;
122 int geometry_y = 0;
123 unsigned int geometry_width = 800;
124 unsigned int geometry_height = 600;
126 if ( geometry_enabled ) {
127 // I plan on moving this to a separate function, as it just clutters up OnInit()
129 This implementation might work with mac, provided that the
130 SetSize() function works as expected.
133 // Remove possible prefix
134 if ( geom_string.GetChar(0) == '=' ) {
135 geom_string.Remove( 0, 1 );
138 // Stupid ToLong functions forces me to use longs =(
139 long width = geometry_width;
140 long height = geometry_height;
142 // Get the avilable display area
143 wxRect display = wxGetClientDisplayRect();
145 // We want to place aMule inside the client area by default
146 long x = display.x;
147 long y = display.y;
149 // Tokenize the string
150 wxStringTokenizer tokens(geom_string, wxT("xX+-"));
152 // First part: Program width
153 if ( tokens.GetNextToken().ToLong( &width ) ) {
154 wxString prefix = geom_string[ tokens.GetPosition() - 1 ];
155 if ( prefix == wxT("x") || prefix == wxT("X") ) {
156 // Second part: Program height
157 if ( tokens.GetNextToken().ToLong( &height ) ) {
158 prefix = geom_string[ tokens.GetPosition() - 1 ];
159 if ( prefix == wxT("+") || prefix == wxT("-") ) {
160 // Third part: X-Offset
161 if ( tokens.GetNextToken().ToLong( &x ) ) {
162 if ( prefix == wxT("-") )
163 x = display.GetRight() - ( width + x );
164 prefix = geom_string[ tokens.GetPosition() - 1 ];
165 if ( prefix == wxT("+") || prefix == wxT("-") ) {
166 // Fourth part: Y-Offset
167 if ( tokens.GetNextToken().ToLong( &y ) ) {
168 if ( prefix == wxT("-") )
169 y = display.GetBottom() - ( height + y );
174 // We need at least height and width to override default geometry
175 geometry_enabled = true;
176 geometry_x = x;
177 geometry_y = y;
178 geometry_width = width;
179 geometry_height = height;
185 // Should default/last-used position be overridden?
186 #ifdef SVNDATE
187 #ifdef CLIENT_GUI
188 m_FrameTitle = CFormat(wxT("aMule remote control %s %s")) % wxT( VERSION ) % wxT( SVNDATE );
189 #else
190 m_FrameTitle = CFormat(wxT("aMule %s %s")) % wxT( VERSION ) % wxT( SVNDATE );
191 #endif
192 #else
193 #ifdef CLIENT_GUI
194 m_FrameTitle = _("aMule remote control");
195 #else
196 m_FrameTitle = _("aMule");
197 #endif
198 #endif
199 if ( geometry_enabled ) {
200 amuledlg = new CamuleDlg(NULL, m_FrameTitle,
201 wxPoint(geometry_x,geometry_y),
202 wxSize( geometry_width, geometry_height - 58 ));
203 } else {
204 amuledlg = new CamuleDlg(NULL, m_FrameTitle);
207 return 0;
211 // Sets the contents of the clipboard. Prior content erased.
212 bool CamuleGuiBase::CopyTextToClipboard(wxString strText)
214 bool ClipBoardOpen = wxTheClipboard->Open();
215 if (ClipBoardOpen) {
216 wxTheClipboard->UsePrimarySelection(false);
217 wxTheClipboard->SetData(new wxTextDataObject(strText));
218 wxTheClipboard->Close();
221 return ClipBoardOpen;
225 void CamuleGuiBase::AddGuiLogLine(const wxString& line)
227 if (amuledlg) {
228 while ( !m_logLines.empty() ) {
229 amuledlg->AddLogLine(m_logLines.front());
230 m_logLines.pop_front();
232 amuledlg->AddLogLine(line);
233 } else {
234 m_logLines.push_back(line);
239 #ifndef CLIENT_GUI
241 int CamuleGuiApp::InitGui(bool geometry_enable, wxString &geometry_string)
243 CamuleGuiBase::InitGui(geometry_enable, geometry_string);
244 SetTopWindow(amuledlg);
245 return 0;
249 int CamuleGuiApp::ShowAlert(wxString msg, wxString title, int flags)
251 return CamuleGuiBase::ShowAlert(msg, title, flags);
255 int CamuleGuiApp::OnExit()
257 delete core_timer;
259 return CamuleApp::OnExit();
263 void CamuleGuiApp::ShutDown(wxCloseEvent &WXUNUSED(evt))
265 amuledlg->DlgShutDown();
266 amuledlg->Destroy();
267 CamuleApp::ShutDown();
271 bool CamuleGuiApp::OnInit()
273 amuledlg = NULL;
275 if ( !CamuleApp::OnInit() ) {
276 return false;
279 // Create the Core timer
280 core_timer = new CTimer(this,ID_CORE_TIMER_EVENT);
281 if (!core_timer) {
282 AddLogLineCS(_("Fatal Error: Failed to create Core Timer"));
283 OnExit();
286 // Start the Core and Gui timers
288 // Note: wxTimer can be off by more than 10% !!!
289 // In addition to the systematic error introduced by wxTimer, we are losing
290 // timer cycles due to high CPU load. I've observed about 0.5% random loss of cycles under
291 // low load, and more than 6% lost cycles with heavy download traffic and/or other tasks
292 // in the system, such as a video player or a VMware virtual machine.
293 // The upload queue process loop has now been rewritten to compensate for timer errors.
294 // When adding functionality, assume that the timer is only approximately correct;
295 // for measurements, always use the system clock [::GetTickCount()].
296 core_timer->Start(CORE_TIMER_PERIOD);
297 amuledlg->StartGuiTimer();
299 #ifdef __WXMAC__
300 // This tells the OS to notice the ed2kHelperScript.app inside aMule.app.
301 // ed2kHelperScript.app describes itself (Info.plist) as handling ed2k URLs.
302 // So, from then on the OS will know to pass ed2k URLs to the helper app.
303 CFURLRef ed2kHelperUrl = CFBundleCopyAuxiliaryExecutableURL(
304 CFBundleGetMainBundle(), CFSTR("ed2kHelperScript.app"));
305 if (ed2kHelperUrl) {
306 LSRegisterURL(ed2kHelperUrl, true);
307 CFRelease(ed2kHelperUrl);
309 #endif
311 return true;
315 wxString CamuleGuiApp::GetLog(bool reset)
317 if ( reset ) {
318 amuledlg->ResetLog(ID_LOGVIEW);
320 return CamuleApp::GetLog(reset);
324 wxString CamuleGuiApp::GetServerLog(bool reset)
326 if ( reset ) {
327 amuledlg->ResetLog(ID_SERVERINFO);
329 return CamuleApp::GetServerLog(reset);
333 void CamuleGuiApp::AddServerMessageLine(wxString &msg)
335 amuledlg->AddServerMessageLine(msg);
336 CamuleApp::AddServerMessageLine(msg);
339 #endif /* CLIENT_GUI */
340 // File_checked_for_headers