int CamuleDaemonApp::OnRun() { if (!thePrefs::AcceptExternalConnections()) { AddLogLineCS(_("ERROR: aMule daemon cannot be used when external connections are disabled. To enable External Connections, use either a normal aMule, start amuled with the option --ec-config or set the key \"AcceptExternalConnections\" to 1 in the file ~/.aMule/amule.conf")); return 0; } else if (thePrefs::ECPassword().IsEmpty()) { AddLogLineCS(_("ERROR: A valid password is required to use external connections, and aMule daemon cannot be used without external connections. To run aMule deamon, you must set the \"ECPassword\" field in the file ~/.aMule/amule.conf with an appropriate value. Execute amuled with the flag --ec-config to set the password. More information can be found at http://wiki.amule.org")); return 0; } #ifndef __WXMSW__ // Process the return code of dead children so that we do not create // zombies. wxBase does not implement wxProcess callbacks, so no one // actualy calls wxHandleProcessTermination() in console applications. // We do our best here. int ret = 0; ret = sigaction(SIGCHLD, NULL, &m_oldSignalChildAction); m_newSignalChildAction = m_oldSignalChildAction; m_newSignalChildAction.sa_sigaction = OnSignalChildHandler; m_newSignalChildAction.sa_flags |= SA_SIGINFO; m_newSignalChildAction.sa_flags &= ~SA_RESETHAND; ret = sigaction(SIGCHLD, &m_newSignalChildAction, NULL); if (ret == -1) { AddDebugLogLineC(logStandard, CFormat(wxT("CamuleDaemonApp::OnRun(): Installation of SIGCHLD callback with sigaction() failed: %m."))); } else { AddDebugLogLineN(logGeneral, wxT("CamuleDaemonApp::OnRun(): Installation of SIGCHLD callback with sigaction() succeeded.")); } #endif // __WXMSW__ #ifdef AMULED28 while ( !m_Exit ) { m_table->RunSelect(); ProcessPendingEvents(); ((CDaemonAppTraits *)GetTraits())->DeletePending(); } // ShutDown is beeing called twice. Once here and again in OnExit(). ShutDown(); return 0; #else #ifdef AMULED_DUMMY return 0; #else return wxApp::OnRun(); #endif #endif }
int CamuleDaemonApp::ShowAlert(wxString msg, wxString title, int flags) { if ( flags | wxICON_ERROR ) { title = CFormat(_("ERROR: %s")) % title; } AddLogLineCS(title + wxT(" ") + msg); return 0; // That's neither yes nor no, ok, cancel }
int CamuleDaemonApp::OnRun() { if (!thePrefs::AcceptExternalConnections()) { AddLogLineCS(_("ERROR: aMule daemon cannot be used when external connections are disabled. To enable External Connections, use either a normal aMule, start amuled with the option --ec-config or set the key \"AcceptExternalConnections\" to 1 in the file ~/.aMule/amule.conf")); return 0; } else if (thePrefs::ECPassword().IsEmpty()) { AddLogLineCS(_("ERROR: A valid password is required to use external connections, and aMule daemon cannot be used without external connections. To run aMule deamon, you must set the \"ECPassword\" field in the file ~/.aMule/amule.conf with an appropriate value. Execute amuled with the flag --ec-config to set the password. More information can be found at http://wiki.amule.org")); return 0; } #ifdef __WINDOWS__ SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE); #endif // __WINDOWS__ #ifdef AMULED_APPTRAITS // Process the return code of dead children so that we do not create // zombies. wxBase does not implement wxProcess callbacks, so no one // actualy calls wxHandleProcessTermination() in console applications. // We do our best here. DEBUG_ONLY( int ret = 0; )
bool CamuleGuiApp::OnInit() { amuledlg = NULL; if ( !CamuleApp::OnInit() ) { return false; } // Create the Core timer core_timer = new CTimer(this,ID_CORE_TIMER_EVENT); if (!core_timer) { AddLogLineCS(_("Fatal Error: Failed to create Core Timer")); OnExit(); } // Start the Core and Gui timers // Note: wxTimer can be off by more than 10% !!! // In addition to the systematic error introduced by wxTimer, we are losing // timer cycles due to high CPU load. I've observed about 0.5% random loss of cycles under // low load, and more than 6% lost cycles with heavy download traffic and/or other tasks // in the system, such as a video player or a VMware virtual machine. // The upload queue process loop has now been rewritten to compensate for timer errors. // When adding functionality, assume that the timer is only approximately correct; // for measurements, always use the system clock [::GetTickCount()]. core_timer->Start(CORE_TIMER_PERIOD); amuledlg->StartGuiTimer(); #ifdef __WXMAC__ // This tells the OS to notice the ed2kHelperScript.app inside aMule.app. // ed2kHelperScript.app describes itself (Info.plist) as handling ed2k URLs. // So, from then on the OS will know to pass ed2k URLs to the helper app. CFURLRef ed2kHelperUrl = CFBundleCopyAuxiliaryExecutableURL( CFBundleGetMainBundle(), CFSTR("ed2kHelperScript.app")); if (ed2kHelperUrl) { LSRegisterURL(ed2kHelperUrl, true); CFRelease(ed2kHelperUrl); } #endif return true; }
CListenSocket::CListenSocket(wxIPaddress &addr, const CProxyData *ProxyData) : // wxSOCKET_NOWAIT - means non-blocking i/o // wxSOCKET_REUSEADDR - means we can reuse the socket imediately (wx-2.5.3) CSocketServerProxy(addr, wxSOCKET_NOWAIT|wxSOCKET_REUSEADDR, ProxyData) { // 0.42e - vars not used by us bListening = false; shutdown = false; m_OpenSocketsInterval = 0; m_nPendingConnections = 0; totalconnectionchecks = 0; averageconnections = 0.0; // Set the listen socket event handler -- The handler is written in amule.cpp if (IsOk()) { SetEventHandler(*theApp, ID_LISTENSOCKET_EVENT); SetNotify(wxSOCKET_CONNECTION_FLAG); Notify(true); AddLogLineNS(_("ListenSocket: Ok.")); } else { AddLogLineCS(_("ERROR: Could not listen to TCP port.") ); } }
void CDownloadQueue::LoadMetFiles(const CPath& path) { AddLogLineNS(CFormat(_("Loading temp files from %s.")) % path.GetPrintable()); std::vector<CPath> files; // Locate part-files to be loaded CDirIterator TempDir(path); CPath fileName = TempDir.GetFirstFile(CDirIterator::File, wxT("*.part.met")); while (fileName.IsOk()) { files.push_back(path.JoinPaths(fileName)); fileName = TempDir.GetNextFile(); } // Loading in order makes it easier to figure which // file is broken in case of crashes, or the like. std::sort(files.begin(), files.end()); // Load part-files for ( size_t i = 0; i < files.size(); i++ ) { AddLogLineNS(CFormat(_("Loading PartFile %u of %u")) % (i + 1) % files.size()); fileName = files[i].GetFullName(); CPartFile *toadd = new CPartFile(); bool result = toadd->LoadPartFile(path, fileName) != 0; if (!result) { // Try from backup result = toadd->LoadPartFile(path, fileName, true) != 0; } if (result && !IsFileExisting(toadd->GetFileHash())) { { wxMutexLocker lock(m_mutex); m_filelist.push_back(toadd); } NotifyObservers(EventType(EventType::INSERTED, toadd)); Notify_DownloadCtrlAddFile(toadd); } else { wxString msg; if (result) { msg << CFormat(wxT("WARNING: Duplicate partfile with hash '%s' found, skipping: %s")) % toadd->GetFileHash().Encode() % fileName; } else { // If result is false, then reading of both the primary and the backup .met failed AddLogLineN(_("ERROR: Failed to load backup file. Search http://forum.amule.org for .part.met recovery solutions.")); msg << CFormat(wxT("ERROR: Failed to load PartFile '%s'")) % fileName; } AddLogLineCS(msg); // Delete the partfile object in the end. delete toadd; } } AddLogLineNS(_("All PartFiles Loaded.")); if ( GetFileCount() == 0 ) { AddLogLineN(_("No part files found")); } else { AddLogLineN(CFormat(wxPLURAL("Found %u part file", "Found %u part files", GetFileCount())) % GetFileCount()); DoSortByPriority(); CheckDiskspace( path ); Notify_ShowUpdateCatTabTitles(); } }