source: filezilla/trunk/fuentes/src/interface/FileZilla.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 3 years ago

First release to xenial

File size: 20.9 KB
Line 
1#include <filezilla.h>
2#ifdef _MSC_VER
3#pragma hdrstop
4#endif
5#include "filezillaapp.h"
6#include "Mainfrm.h"
7#include "Options.h"
8#include "wrapengine.h"
9#include "buildinfo.h"
10#include <wx/tokenzr.h>
11#include "cmdline.h"
12#include "welcome_dialog.h"
13#include <msgbox.h>
14#include "local_filesys.h"
15
16#include <wx/xrc/xh_animatctrl.h>
17#include <wx/xrc/xh_bmpbt.h>
18#include <wx/xrc/xh_bttn.h>
19#include <wx/xrc/xh_chckb.h>
20#include <wx/xrc/xh_chckl.h>
21#include <wx/xrc/xh_choic.h>
22#include <wx/xrc/xh_dlg.h>
23#include <wx/xrc/xh_gauge.h>
24#include <wx/xrc/xh_listb.h>
25#include <wx/xrc/xh_listc.h>
26#include <wx/xrc/xh_menu.h>
27#include <wx/xrc/xh_notbk.h>
28#include <wx/xrc/xh_panel.h>
29#include <wx/xrc/xh_radbt.h>
30#include <wx/xrc/xh_scwin.h>
31#include <wx/xrc/xh_sizer.h>
32#include <wx/xrc/xh_spin.h>
33#include <wx/xrc/xh_stbmp.h>
34#include <wx/xrc/xh_stbox.h>
35#include <wx/xrc/xh_stlin.h>
36#include <wx/xrc/xh_sttxt.h>
37#include "xh_text_ex.h"
38#include <wx/xrc/xh_tree.h>
39#include <wx/xrc/xh_hyperlink.h>
40#include "xh_toolb_ex.h"
41#ifdef __WXMSW__
42#include <wx/socket.h>
43#include <wx/dynlib.h>
44#endif
45#ifdef WITH_LIBDBUS
46#include <../dbus/session_manager.h>
47#endif
48
49#if defined(__WXMAC__) || defined(__UNIX__)
50#include <wx/stdpaths.h>
51#endif
52
53#include "locale_initializer.h"
54
55#ifdef ENABLE_BINRELOC
56        #define BR_PTHREADS 0
57        #include "prefix.h"
58#endif
59
60#ifndef __WXGTK__
61IMPLEMENT_APP(CFileZillaApp)
62#else
63IMPLEMENT_APP_NO_MAIN(CFileZillaApp)
64#endif //__WXGTK__
65
66CFileZillaApp::CFileZillaApp()
67{
68        m_profilingActive = true;
69        AddStartupProfileRecord(_T("CFileZillaApp::CFileZillaApp()"));
70}
71
72CFileZillaApp::~CFileZillaApp()
73{
74        COptions::Destroy();
75}
76
77#ifdef __WXMSW__
78extern "C"
79{
80        typedef HRESULT (WINAPI *t_SetCurrentProcessExplicitAppUserModelID)(PCWSTR AppID);
81}
82
83static void SetAppId()
84{
85        wxDynamicLibrary dll;
86        if (!dll.Load(_T("shell32.dll")))
87                return;
88
89        if (!dll.HasSymbol(_T("SetCurrentProcessExplicitAppUserModelID")))
90                return;
91
92        t_SetCurrentProcessExplicitAppUserModelID pSetCurrentProcessExplicitAppUserModelID =
93                (t_SetCurrentProcessExplicitAppUserModelID)dll.GetSymbol(_T("SetCurrentProcessExplicitAppUserModelID"));
94
95        if (!pSetCurrentProcessExplicitAppUserModelID)
96                return;
97
98        pSetCurrentProcessExplicitAppUserModelID(_T("FileZilla.Client.AppID"));
99}
100
101#endif //__WXMSW__
102
103void CFileZillaApp::InitLocale()
104{
105        wxString language = COptions::Get()->GetOption(OPTION_LANGUAGE);
106        const wxLanguageInfo* pInfo = wxLocale::FindLanguageInfo(language);
107        if (!language.empty()) {
108#ifdef __WXGTK__
109                if (CInitializer::error) {
110                        wxString error;
111
112                        wxLocale *loc = wxGetLocale();
113                        const wxLanguageInfo* currentInfo = loc ? loc->GetLanguageInfo(loc->GetLanguage()) : 0;
114                        if (!loc || !currentInfo) {
115                                if (!pInfo)
116                                        error.Printf(_("Failed to set language to %s, using default system language."),
117                                                language);
118                                else
119                                        error.Printf(_("Failed to set language to %s (%s), using default system language."),
120                                                pInfo->Description, language);
121                        }
122                        else {
123                                wxString currentName = currentInfo->CanonicalName;
124
125                                if (!pInfo)
126                                        error.Printf(_("Failed to set language to %s, using default system language (%s, %s)."),
127                                                language, loc->GetLocale(),
128                                                currentName);
129                                else
130                                        error.Printf(_("Failed to set language to %s (%s), using default system language (%s, %s)."),
131                                                pInfo->Description, language, loc->GetLocale(),
132                                                currentName);
133                        }
134
135                        error += _T("\n");
136                        error += _("Please make sure the requested locale is installed on your system.");
137                        wxMessageBoxEx(error, _("Failed to change language"), wxICON_EXCLAMATION);
138
139                        COptions::Get()->SetOption(OPTION_LANGUAGE, _T(""));
140                }
141#else
142                if (!pInfo || !SetLocale(pInfo->Language)) {
143                        for( language = GetFallbackLocale(language); !language.empty(); language = GetFallbackLocale(language) ) {
144                                const wxLanguageInfo* fallbackInfo = wxLocale::FindLanguageInfo(language);
145                                if( fallbackInfo && SetLocale(fallbackInfo->Language )) {
146                                        COptions::Get()->SetOption(OPTION_LANGUAGE, language);
147                                        return;
148                                }
149                        }
150                        COptions::Get()->SetOption(OPTION_LANGUAGE, wxString());
151                        if (pInfo && !pInfo->Description.empty())
152                                wxMessageBoxEx(wxString::Format(_("Failed to set language to %s (%s), using default system language"), pInfo->Description, language), _("Failed to change language"), wxICON_EXCLAMATION);
153                        else
154                                wxMessageBoxEx(wxString::Format(_("Failed to set language to %s, using default system language"), language), _("Failed to change language"), wxICON_EXCLAMATION);
155                }
156#endif
157        }
158}
159
160bool CFileZillaApp::OnInit()
161{
162        AddStartupProfileRecord(_T("CFileZillaApp::OnInit()"));
163
164        srand( (unsigned)time( NULL ) );
165
166#ifdef __WXMSW__
167        // Need to call WSAStartup. Let wx do that for us
168        wxSocketBase::Initialize();
169
170        SetAppId();
171#endif
172
173        //wxSystemOptions is slow, if a value is not set, it keeps querying the environment
174        //each and every time...
175        wxSystemOptions::SetOption(_T("filesys.no-mimetypesmanager"), 0);
176        wxSystemOptions::SetOption(_T("window-default-variant"), _T(""));
177#ifdef __WXMSW__
178        wxSystemOptions::SetOption(_T("no-maskblt"), 0);
179        wxSystemOptions::SetOption(_T("msw.window.no-clip-children"), 0);
180        wxSystemOptions::SetOption(_T("msw.font.no-proof-quality"), 0);
181        wxSystemOptions::SetOption(_T("msw.remap"), 0);
182        wxSystemOptions::SetOption(_T("msw.staticbox.optimized-paint"), 0);
183#endif
184#ifdef __WXMAC__
185        wxSystemOptions::SetOption(_T("mac.listctrl.always_use_generic"), 1);
186        wxSystemOptions::SetOption(_T("mac.textcontrol-use-spell-checker"), 0);
187#endif
188
189        int cmdline_result = ProcessCommandLine();
190        if (!cmdline_result)
191                return false;
192
193        LoadLocales();
194
195        if (cmdline_result < 0) {
196                if (m_pCommandLine) {
197                        m_pCommandLine->DisplayUsage();
198                }
199                return false;
200        }
201
202        InitDefaultsDir();
203
204        COptions::Init();
205
206        InitLocale();
207
208#ifndef _DEBUG
209        const wxString& buildType = CBuildInfo::GetBuildType();
210        if (buildType == _T("nightly")) {
211                wxMessageBoxEx(_T("You are using a nightly development version of FileZilla 3, do not expect anything to work.\r\nPlease use the official releases instead.\r\n\r\n\
212Unless explicitly instructed otherwise,\r\n\
213DO NOT post bugreports,\r\n\
214DO NOT use it in production environments,\r\n\
215DO NOT distribute the binaries,\r\n\
216DO NOT complain about it\r\n\
217USE AT OWN RISK"), _T("Important Information"));
218        }
219        else {
220                wxString v;
221                if (!wxGetEnv(_T("FZDEBUG"), &v) || v != _T("1")) {
222                        COptions::Get()->SetOption(OPTION_LOGGING_DEBUGLEVEL, 0);
223                        COptions::Get()->SetOption(OPTION_LOGGING_RAWLISTING, 0);
224                }
225        }
226#endif
227
228        if (!LoadResourceFiles()) {
229                COptions::Destroy();
230                return false;
231        }
232
233        CheckExistsFzsftp();
234
235        // Turn off idle events, we don't need them
236        wxIdleEvent::SetMode(wxIDLE_PROCESS_SPECIFIED);
237
238        wxUpdateUIEvent::SetMode(wxUPDATE_UI_PROCESS_SPECIFIED);
239
240#ifdef WITH_LIBDBUS
241        CSessionManager::Init();
242#endif
243
244        // Load the text wrapping engine
245        m_pWrapEngine = std::make_unique<CWrapEngine>();
246        m_pWrapEngine->LoadCache();
247
248        CMainFrame *frame = new CMainFrame();
249        frame->Show(true);
250        SetTopWindow(frame);
251
252        CWelcomeDialog *welcome_dialog = new CWelcomeDialog;
253        welcome_dialog->Run(frame, false, true);
254
255        frame->ProcessCommandLine();
256        frame->PostInitialize();
257
258        ShowStartupProfile();
259
260        return true;
261}
262
263int CFileZillaApp::OnExit()
264{
265        COptions::Get()->SaveIfNeeded();
266
267#ifdef WITH_LIBDBUS
268        CSessionManager::Uninit();
269#endif
270#ifdef __WXMSW__
271        wxSocketBase::Shutdown();
272#endif
273        return wxApp::OnExit();
274}
275
276bool CFileZillaApp::FileExists(const wxString& file) const
277{
278        int pos = file.Find('*');
279        if (pos < 0)
280                return wxFileExists(file);
281
282        wxASSERT(pos > 0);
283        wxASSERT(file[pos - 1] == '/');
284        wxASSERT(file.size() > static_cast<size_t>(pos + 1) && file[pos + 1] == '/');
285
286        wxLogNull nullLog;
287        wxDir dir(file.Left(pos));
288        if (!dir.IsOpened())
289                return false;
290
291        wxString subDir;
292        bool found = dir.GetFirst(&subDir, _T(""), wxDIR_DIRS);
293        while (found) {
294                if (FileExists(file.Left(pos) + subDir + file.Mid(pos + 1)))
295                        return true;
296
297                found = dir.GetNext(&subDir);
298        }
299
300        return false;
301}
302
303CLocalPath CFileZillaApp::GetDataDir(wxString fileToFind) const
304{
305        /*
306         * Finding the resources in all cases is a difficult task,
307         * due to the huge variety of diffent systems and their filesystem
308         * structure.
309         * Basically we just check a couple of paths for presence of the resources,
310         * and hope we find them. If not, the user can still specify on the cmdline
311         * and using environment variables where the resources are.
312         *
313         * At least on OS X it's simple: All inside application bundle.
314         */
315
316#ifdef __WXMAC__
317        CLocalPath path(wxStandardPaths::Get().GetDataDir());
318        if (FileExists(path.GetPath() + fileToFind))
319                return path;
320
321        return CLocalPath();
322#else
323
324        wxPathList pathList;
325        // FIXME: --datadir cmdline
326
327        // First try the user specified data dir.
328        pathList.AddEnvList(_T("FZ_DATADIR"));
329
330        // Next try the current path and the current executable path.
331        // Without this, running development versions would be difficult.
332        pathList.Add(wxGetCwd());
333
334#ifdef ENABLE_BINRELOC
335        const char* path = SELFPATH;
336        if (path && *path) {
337                wxString datadir(SELFPATH , *wxConvCurrent);
338                wxFileName fn(datadir);
339                datadir = fn.GetPath();
340                if (!datadir.empty())
341                        pathList.Add(datadir);
342
343        }
344        path = DATADIR;
345        if (path && *path) {
346                wxString datadir(DATADIR, *wxConvCurrent);
347                if (!datadir.empty())
348                        pathList.Add(datadir);
349        }
350#elif defined __WXMSW__
351        wxChar path[1024];
352        int res = GetModuleFileName(0, path, 1000);
353        if (res > 0 && res < 1000) {
354                wxFileName fn(path);
355                pathList.Add(fn.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR));
356        }
357#endif //ENABLE_BINRELOC and __WXMSW__ blocks
358
359        // Now scan through the path
360        pathList.AddEnvList(_T("PATH"));
361
362#ifndef __WXMSW__
363        // Try some common paths
364        pathList.Add(_T("/usr/share/filezilla"));
365        pathList.Add(_T("/usr/local/share/filezilla"));
366#endif
367
368        // For each path, check for the resources
369        wxPathList::const_iterator node;
370        for (node = pathList.begin(); node != pathList.end(); ++node) {
371                wxString cur = CLocalPath(*node).GetPath();
372                if (FileExists(cur + fileToFind))
373                        return CLocalPath(cur);
374                if (FileExists(cur + _T("share/filezilla/") + fileToFind))
375                        return CLocalPath(cur + _T("/share/filezilla"));
376                if (FileExists(cur + _T("filezilla/") + fileToFind))
377                        return CLocalPath(cur + _T("filezilla"));
378        }
379
380        for (node = pathList.begin(); node != pathList.end(); ++node) {
381                wxString cur = CLocalPath(*node).GetPath();
382                if (FileExists(cur + _T("../") + fileToFind))
383                        return CLocalPath(cur + _T("/.."));
384                if (FileExists(cur + _T("../share/filezilla/") + fileToFind))
385                        return CLocalPath(cur + _T("../share/filezilla"));
386        }
387
388        for (node = pathList.begin(); node != pathList.end(); ++node) {
389                wxString cur = CLocalPath(*node).GetPath();
390                if (FileExists(cur + _T("../../") + fileToFind))
391                        return CLocalPath(cur + _T("../.."));
392        }
393
394        return CLocalPath();
395#endif //__WXMAC__
396}
397
398bool CFileZillaApp::LoadResourceFiles()
399{
400        AddStartupProfileRecord(_T("CFileZillaApp::LoadResourceFiles"));
401        m_resourceDir = GetDataDir(_T("resources/theme.xml"));
402
403        wxImage::AddHandler(new wxPNGHandler());
404
405        if (m_resourceDir.empty()) {
406                wxString msg = _("Could not find the resource files for FileZilla, closing FileZilla.\nYou can set the data directory of FileZilla using the '--datadir <custompath>' commandline option or by setting the FZ_DATADIR environment variable.");
407                wxMessageBoxEx(msg, _("FileZilla Error"), wxOK | wxICON_ERROR);
408                return false;
409        }
410
411        m_resourceDir.AddSegment(_T("resources"));
412
413        wxXmlResource *pResource = wxXmlResource::Get();
414
415#ifndef __WXDEBUG__
416        pResource->SetFlags(pResource->GetFlags() | wxXRC_NO_RELOADING);
417#endif
418
419        pResource->AddHandler(new wxMenuXmlHandler);
420        pResource->AddHandler(new wxMenuBarXmlHandler);
421        pResource->AddHandler(new wxDialogXmlHandler);
422        pResource->AddHandler(new wxPanelXmlHandler);
423        pResource->AddHandler(new wxSizerXmlHandler);
424        pResource->AddHandler(new wxButtonXmlHandler);
425        pResource->AddHandler(new wxBitmapButtonXmlHandler);
426        pResource->AddHandler(new wxStaticTextXmlHandler);
427        pResource->AddHandler(new wxStaticBoxXmlHandler);
428        pResource->AddHandler(new wxStaticBitmapXmlHandler);
429        pResource->AddHandler(new wxTreeCtrlXmlHandler);
430        pResource->AddHandler(new wxListCtrlXmlHandler);
431        pResource->AddHandler(new wxCheckListBoxXmlHandler);
432        pResource->AddHandler(new wxChoiceXmlHandler);
433        pResource->AddHandler(new wxGaugeXmlHandler);
434        pResource->AddHandler(new wxCheckBoxXmlHandler);
435        pResource->AddHandler(new wxSpinCtrlXmlHandler);
436        pResource->AddHandler(new wxRadioButtonXmlHandler);
437        pResource->AddHandler(new wxNotebookXmlHandler);
438        pResource->AddHandler(new wxTextCtrlXmlHandlerEx);
439        pResource->AddHandler(new wxListBoxXmlHandler);
440        pResource->AddHandler(new wxToolBarXmlHandlerEx);
441        pResource->AddHandler(new wxStaticLineXmlHandler);
442        pResource->AddHandler(new wxScrolledWindowXmlHandler);
443        pResource->AddHandler(new wxHyperlinkCtrlXmlHandler);
444        pResource->AddHandler(new wxAnimationCtrlXmlHandler);
445        pResource->AddHandler(new wxStdDialogButtonSizerXmlHandler);
446
447        if (CLocalFileSystem::GetFileType(m_resourceDir.GetPath() + _T("xrc/resources.xrc")) == CLocalFileSystem::file) {
448                pResource->LoadFile(m_resourceDir.GetPath() + _T("xrc/resources.xrc"));
449        }
450        else {
451                CLocalFileSystem fs;
452                wxString dir = m_resourceDir.GetPath() + _T("xrc/");
453                bool found = fs.BeginFindFiles(dir, false);
454                while (found) {
455                        wxString name;
456                        found = fs.GetNextFile(name);
457                        if (name.Right(4) != _T(".xrc")) {
458                                continue;
459                        }
460                        pResource->LoadFile(dir + name);
461                }
462        }
463
464        return true;
465}
466
467bool CFileZillaApp::InitDefaultsDir()
468{
469        AddStartupProfileRecord(_T("InitDefaultsDir"));
470#ifdef __WXGTK__
471        m_defaultsDir = COptions::GetUnadjustedSettingsDir();
472        if( m_defaultsDir.empty() || !wxFileName::FileExists(m_defaultsDir.GetPath() + _T("fzdefaults.xml"))) {
473                if (wxFileName::FileExists(_T("/etc/filezilla/fzdefaults.xml"))) {
474                        m_defaultsDir.SetPath(_T("/etc/filezilla"));
475                }
476                else {
477                        m_defaultsDir.clear();
478                }
479        }
480
481#endif
482        if( m_defaultsDir.empty() ) {
483                m_defaultsDir = GetDataDir(_T("fzdefaults.xml"));
484        }
485
486        return !m_defaultsDir.empty();
487}
488
489bool CFileZillaApp::LoadLocales()
490{
491        AddStartupProfileRecord(_T("CFileZillaApp::LoadLocales"));
492#ifndef __WXMAC__
493        m_localesDir = GetDataDir(_T("../locale/*/filezilla.mo"));
494        if (m_localesDir.empty())
495                m_localesDir = GetDataDir(_T("../locale/*/LC_MESSAGES/filezilla.mo"));
496        if (!m_localesDir.empty()) {
497                m_localesDir.ChangePath( _T("../locale") );
498        }
499        else {
500                m_localesDir = GetDataDir(_T("locales/*/filezilla.mo"));
501                if (!m_localesDir.empty()) {
502                        m_localesDir.AddSegment(_T("locales"));
503                }
504        }
505#else
506        m_localesDir.SetPath(wxStandardPaths::Get().GetDataDir() + _T("/locales"));
507#endif
508
509        if (!m_localesDir.empty()) {
510                wxLocale::AddCatalogLookupPathPrefix(m_localesDir.GetPath());
511        }
512
513        SetLocale(wxLANGUAGE_DEFAULT);
514
515        return true;
516}
517
518bool CFileZillaApp::SetLocale(int language)
519{
520        // First check if we can load the new locale
521        auto pLocale = std::make_unique<wxLocale>();
522        wxLogNull log;
523        pLocale->Init(language);
524        if (!pLocale->IsOk() || !pLocale->AddCatalog(_T("filezilla"))) {
525                return false;
526        }
527
528        // Now unload old locale
529        // We unload new locale as well, else the internal locale chain in wxWidgets get's broken.
530        pLocale.reset();
531        m_pLocale.reset();
532
533        // Finally load new one
534        pLocale = std::make_unique<wxLocale>();
535        pLocale->Init(language);
536        if (!pLocale->IsOk() || !pLocale->AddCatalog(_T("filezilla"))) {
537                return false;
538        }
539        m_pLocale = std::move(pLocale);
540
541        return true;
542}
543
544int CFileZillaApp::GetCurrentLanguage() const
545{
546        if (!m_pLocale)
547                return wxLANGUAGE_ENGLISH;
548
549        return m_pLocale->GetLanguage();
550}
551
552wxString CFileZillaApp::GetCurrentLanguageCode() const
553{
554        if (!m_pLocale)
555                return wxString();
556
557        return m_pLocale->GetCanonicalName();
558}
559
560#if wxUSE_DEBUGREPORT && wxUSE_ON_FATAL_EXCEPTION
561void CFileZillaApp::OnFatalException()
562{
563}
564#endif
565
566void CFileZillaApp::DisplayEncodingWarning()
567{
568        static bool displayedEncodingWarning = false;
569        if (displayedEncodingWarning)
570                return;
571
572        displayedEncodingWarning = true;
573
574        wxMessageBoxEx(_("A local filename could not be decoded.\nPlease make sure the LC_CTYPE (or LC_ALL) environment variable is set correctly.\nUnless you fix this problem, files might be missing in the file listings.\nNo further warning will be displayed this session."), _("Character encoding issue"), wxICON_EXCLAMATION);
575}
576
577CWrapEngine* CFileZillaApp::GetWrapEngine()
578{
579        return m_pWrapEngine.get();
580}
581
582void CFileZillaApp::CheckExistsFzsftp()
583{
584        AddStartupProfileRecord(_T("CFileZillaApp::CheckExistsFzstp"));
585        // Get the correct path to the fzsftp executable
586
587#ifdef __WXMAC__
588        wxString executable = wxStandardPaths::Get().GetExecutablePath();
589        int pos = executable.Find('/', true);
590        if (pos != -1)
591                executable = executable.Left(pos);
592        executable += _T("/fzsftp");
593        if (!wxFileName::FileExists(executable))
594        {
595                wxMessageBoxEx(wxString::Format(_("%s could not be found. Without this component of FileZilla, SFTP will not work.\n\nPlease download FileZilla again. If this problem persists, please submit a bug report."), executable),
596                        _("File not found"), wxICON_ERROR);
597                executable.clear();
598        }
599
600#else
601
602        wxString program = _T("fzsftp");
603#ifdef __WXMSW__
604        program += _T(".exe");
605#endif
606
607        bool found = false;
608
609        // First check the FZ_FZSFTP environment variable
610        wxString executable;
611        if (wxGetEnv(_T("FZ_FZSFTP"), &executable)) {
612                if (wxFileName::FileExists(executable))
613                        found = true;
614        }
615
616        if (!found) {
617                wxPathList pathList;
618
619                // Add current working directory
620                const wxString &cwd = wxGetCwd();
621                pathList.Add(cwd);
622#ifdef __WXMSW__
623
624                // Add executable path
625                wxChar modulePath[1000];
626                DWORD len = GetModuleFileName(0, modulePath, 999);
627                if (len) {
628                        modulePath[len] = 0;
629                        wxString path(modulePath);
630                        int pos = path.Find('\\', true);
631                        if (pos != -1) {
632                                path = path.Left(pos);
633                                pathList.Add(path);
634                        }
635                }
636#endif
637
638                // Add a few paths relative to the current working directory
639                pathList.Add(cwd + _T("/bin"));
640                pathList.Add(cwd + _T("/src/putty"));
641                pathList.Add(cwd + _T("/putty"));
642
643                executable = pathList.FindAbsoluteValidPath(program);
644                if (!executable.empty())
645                        found = true;
646        }
647
648#ifdef __UNIX__
649        if (!found) {
650                const wxString prefix = ((const wxStandardPaths&)wxStandardPaths::Get()).GetInstallPrefix();
651                if (prefix != _T("/usr/local")) {
652                        // /usr/local is the fallback value. /usr/local/bin is most likely in the PATH
653                        // environment variable already so we don't have to check it. Furthermore, other
654                        // directories might be listed before it (For example a developer's own
655                        // application prefix)
656                        wxFileName fn(prefix + _T("/bin/"), program);
657                        fn.Normalize();
658                        if (fn.FileExists()) {
659                                executable = fn.GetFullPath();
660                                found = true;
661                        }
662                }
663        }
664#endif
665
666        if (!found) {
667                // Check PATH
668                wxPathList pathList;
669                pathList.AddEnvList(_T("PATH"));
670                executable = pathList.FindAbsoluteValidPath(program);
671                if (!executable.empty())
672                        found = true;
673        }
674
675        if (!found) {
676                // Quote path if it contains spaces
677                if (executable.Find(_T(" ")) != -1 && executable[0] != '"' && executable[0] != '\'')
678                        executable = _T("\"") + executable + _T("\"");
679
680                wxMessageBoxEx(wxString::Format(_("%s could not be found. Without this component of FileZilla, SFTP will not work.\n\nPossible solutions:\n- Make sure %s is in a directory listed in your PATH environment variable.\n- Set the full path to %s in the FZ_FZSFTP environment variable."), program, program, program),
681                        _("File not found"), wxICON_ERROR | wxOK);
682                executable.clear();
683        }
684#endif
685
686        COptions::Get()->SetOption(OPTION_FZSFTP_EXECUTABLE, executable);
687}
688
689#ifdef __WXMSW__
690extern "C" BOOL CALLBACK EnumWindowCallback(HWND hwnd, LPARAM)
691{
692        HWND child = FindWindowEx(hwnd, 0, 0, _T("FileZilla process identificator 3919DB0A-082D-4560-8E2F-381A35969FB4"));
693        if (child) {
694                ::PostMessage(hwnd, WM_ENDSESSION, (WPARAM)TRUE, (LPARAM)ENDSESSION_LOGOFF);
695        }
696
697        return TRUE;
698}
699#endif
700
701int CFileZillaApp::ProcessCommandLine()
702{
703        AddStartupProfileRecord(_T("CFileZillaApp::ProcessCommandLine"));
704        m_pCommandLine = std::make_unique<CCommandLine>(argc, argv);
705        int res = m_pCommandLine->Parse() ? 1 : -1;
706
707        if (res > 0) {
708                if (m_pCommandLine->HasSwitch(CCommandLine::close)) {
709#ifdef __WXMSW__
710                        EnumWindows((WNDENUMPROC)EnumWindowCallback, 0);
711#endif
712                        return 0;
713                }
714
715                if (m_pCommandLine->HasSwitch(CCommandLine::version)) {
716                        wxString out = wxString::Format(_T("FileZilla %s"), CBuildInfo::GetVersion());
717                        if (!CBuildInfo::GetBuildType().empty())
718                                out += _T(" ") + CBuildInfo::GetBuildType() + _T(" build");
719                        out += _T(", compiled on ") + CBuildInfo::GetBuildDateString();
720
721                        printf("%s\n", (const char*)out.mb_str());
722                        return 0;
723                }
724        }
725
726        return res;
727}
728
729void CFileZillaApp::AddStartupProfileRecord(const wxString& msg)
730{
731        if (!m_profilingActive)
732                return;
733
734        m_startupProfile.push_back(std::make_pair(wxDateTime::UNow(), msg));
735}
736
737void CFileZillaApp::ShowStartupProfile()
738{
739        m_profilingActive = false;
740
741        std::list<std::pair<wxDateTime, wxString> > profile;
742        profile.swap(m_startupProfile);
743
744        if (m_pCommandLine && !m_pCommandLine->HasSwitch(CCommandLine::debug_startup))
745                return;
746
747        wxString msg = _T("Profile:\n");
748        for (auto const& p : profile) {
749                msg += p.first.Format(_T("%Y-%m-%d %H:%M:%S %l"));
750                msg += _T(" ");
751                msg += p.second;
752                msg += _T("\n");
753        }
754
755        wxMessageBoxEx(msg);
756}
757
758wxString CFileZillaApp::GetSettingsFile(wxString const& name) const
759{
760        return COptions::Get()->GetOption(OPTION_DEFAULT_SETTINGSDIR) + name + _T(".xml");
761}
Note: See TracBrowser for help on using the repository browser.