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

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

First release to xenial

File size: 5.8 KB
Line 
1#include <filezilla.h>
2#include "quickconnectbar.h"
3#include "recentserverlist.h"
4#include "commandqueue.h"
5#include "state.h"
6#include "Options.h"
7#include "loginmanager.h"
8#include "Mainfrm.h"
9#include "asksavepassworddialog.h"
10
11BEGIN_EVENT_TABLE(CQuickconnectBar, wxPanel)
12EVT_BUTTON(XRCID("ID_QUICKCONNECT_OK"), CQuickconnectBar::OnQuickconnect)
13EVT_BUTTON(XRCID("ID_QUICKCONNECT_DROPDOWN"), CQuickconnectBar::OnQuickconnectDropdown)
14EVT_MENU(wxID_ANY, CQuickconnectBar::OnMenu)
15EVT_TEXT_ENTER(wxID_ANY, CQuickconnectBar::OnQuickconnect)
16END_EVENT_TABLE()
17
18CQuickconnectBar::CQuickconnectBar()
19        : m_pHost()
20        , m_pUser()
21        , m_pPass()
22        , m_pPort()
23        , m_pMainFrame()
24{
25}
26
27CQuickconnectBar::~CQuickconnectBar()
28{
29}
30
31bool CQuickconnectBar::Create(CMainFrame* pParent)
32{
33        m_pMainFrame = pParent;
34        if (!wxXmlResource::Get()->LoadPanel(this, pParent, _T("ID_QUICKCONNECTBAR")))
35        {
36                wxLogError(_("Cannot load Quickconnect bar from resource file"));
37                return false;
38        }
39
40#ifdef __WXMAC__
41        // Under OS X default buttons are toplevel window wide, where under Windows / GTK they stop at the parent panel.
42        wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(pParent), wxTopLevelWindow);
43        if (tlw)
44                tlw->SetDefaultItem(0);
45#endif
46
47        m_pHost = XRCCTRL(*this, "ID_QUICKCONNECT_HOST", wxTextCtrl);
48        m_pUser = XRCCTRL(*this, "ID_QUICKCONNECT_USER", wxTextCtrl);
49        m_pPass = XRCCTRL(*this, "ID_QUICKCONNECT_PASS", wxTextCtrl);
50        m_pPort = XRCCTRL(*this, "ID_QUICKCONNECT_PORT", wxTextCtrl);
51
52        if (!m_pHost || !m_pUser || !m_pPass || !m_pPort)
53        {
54                wxLogError(_("Cannot load Quickconnect bar from resource file"));
55                return false;
56        }
57
58        return true;
59}
60
61void CQuickconnectBar::OnQuickconnect(wxCommandEvent& event)
62{
63        CState* pState = CContextManager::Get()->GetCurrentContext();
64        if (!pState || !pState->m_pEngine)
65        {
66                wxMessageBoxEx(_("FTP Engine not initialized, can't connect"), _("FileZilla Error"), wxICON_EXCLAMATION);
67                return;
68        }
69
70        wxString host = m_pHost->GetValue();
71        wxString user = m_pUser->GetValue();
72        wxString pass = m_pPass->GetValue();
73        wxString port = m_pPort->GetValue();
74
75        CServer server;
76
77        wxString error;
78
79        CServerPath path;
80        if (!server.ParseUrl(host, port, user, pass, error, path))
81        {
82                wxString msg = _("Could not parse server address:");
83                msg += _T("\n");
84                msg += error;
85                wxMessageBoxEx(msg, _("Syntax error"), wxICON_EXCLAMATION);
86                return;
87        }
88
89        host = server.FormatHost(true);
90        ServerProtocol protocol = server.GetProtocol();
91        switch (protocol)
92        {
93        case FTP:
94        case UNKNOWN:
95                if (CServer::GetProtocolFromPort(server.GetPort()) != FTP &&
96                        CServer::GetProtocolFromPort(server.GetPort()) != UNKNOWN)
97                        host = _T("ftp://") + host;
98                break;
99        default:
100                {
101                        const wxString prefix = server.GetPrefixFromProtocol(protocol);
102                        if (!prefix.empty())
103                                host = prefix + _T("://") + host;
104                }
105                break;
106        }
107
108        m_pHost->SetValue(host);
109        if (server.GetPort() != server.GetDefaultPort(server.GetProtocol()))
110                m_pPort->SetValue(wxString::Format(_T("%d"), server.GetPort()));
111        else
112                m_pPort->SetValue(_T(""));
113
114        m_pUser->SetValue(server.GetUser());
115        if (server.GetLogonType() != ANONYMOUS)
116                m_pPass->SetValue(server.GetPass());
117        else
118                m_pPass->SetValue(_T(""));
119
120        if (protocol == HTTP || protocol == HTTPS) {
121                wxString protocolError = _("Invalid protocol specified. Valid protocols are:\nftp:// for normal FTP with optional encryption,\nsftp:// for SSH file transfer protocol,\nftps:// for FTP over TLS (implicit) and\nftpes:// for FTP over TLS (explicit).");
122                wxMessageBoxEx(protocolError, _("Syntax error"), wxICON_EXCLAMATION);
123                return;
124        }
125
126        if (event.GetId() == 1)
127                server.SetBypassProxy(true);
128
129        if (server.GetLogonType() != ANONYMOUS && !CAskSavePasswordDialog::Run(this))
130                return;
131
132        if (COptions::Get()->GetOptionVal(OPTION_DEFAULT_KIOSKMODE) && server.GetLogonType() == NORMAL) {
133                server.SetLogonType(ASK);
134                CLoginManager::Get().RememberPassword(server);
135        }
136        if (!m_pMainFrame->ConnectToServer(server, path))
137                return;
138
139        CRecentServerList::SetMostRecentServer(server);
140}
141
142void CQuickconnectBar::OnQuickconnectDropdown(wxCommandEvent& event)
143{
144        wxMenu* pMenu = new wxMenu;
145
146        // We have to start with id 1 since menu items with id 0 don't work under OS X
147        if (COptions::Get()->GetOptionVal(OPTION_FTP_PROXY_TYPE))
148                pMenu->Append(1, _("Connect bypassing proxy settings"));
149        pMenu->Append(2, _("Clear quickconnect bar"));
150        pMenu->Append(3, _("Clear history"));
151
152        m_recentServers = CRecentServerList::GetMostRecentServers();
153        if (!m_recentServers.empty())
154        {
155                pMenu->AppendSeparator();
156
157                unsigned int i = 0;
158                for (std::list<CServer>::const_iterator iter = m_recentServers.begin();
159                        iter != m_recentServers.end();
160                        ++iter, ++i)
161                {
162                        wxString name(iter->FormatServer());
163                        name.Replace(_T("&"), _T("&&"));
164                        pMenu->Append(10 + i, name);
165                }
166        }
167        else
168                pMenu->Enable(3, false);
169
170        XRCCTRL(*this, "ID_QUICKCONNECT_DROPDOWN", wxButton)->PopupMenu(pMenu);
171        delete pMenu;
172        m_recentServers.clear();
173}
174
175void CQuickconnectBar::OnMenu(wxCommandEvent& event)
176{
177        const int id = event.GetId();
178        if (id == 1)
179                OnQuickconnect(event);
180        else if (id == 2)
181                ClearFields();
182        else if (id == 3)
183                CRecentServerList::Clear();
184
185        if (id < 10)
186                return;
187
188        unsigned int index = id - 10;
189        if (index >= m_recentServers.size())
190                return;
191
192        std::list<CServer>::const_iterator iter = m_recentServers.begin();
193        std::advance(iter, index);
194
195        CServer server = *iter;
196        if (server.GetLogonType() == ASK) {
197                if (!CLoginManager::Get().GetPassword(server, false))
198                        return;
199        }
200
201        CState* pState = CContextManager::Get()->GetCurrentContext();
202        if (!pState || !pState->m_pEngine)
203        {
204                wxMessageBoxEx(_("FTP Engine not initialized, can't connect"), _("FileZilla Error"), wxICON_EXCLAMATION);
205                return;
206        }
207
208        m_pMainFrame->ConnectToServer(server);
209}
210
211void CQuickconnectBar::ClearFields()
212{
213        m_pHost->SetValue(_T(""));
214        m_pPort->SetValue(_T(""));
215        m_pUser->SetValue(_T(""));
216        m_pPass->SetValue(_T(""));
217}
Note: See TracBrowser for help on using the repository browser.