source: filezilla/trunk/fuentes/src/interface/clearprivatedata.cpp @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 2 years ago

Update new version: 3.15.02

File size: 4.8 KB
Line 
1#include <filezilla.h>
2#include "clearprivatedata.h"
3#include "Mainfrm.h"
4#include "recentserverlist.h"
5#include "quickconnectbar.h"
6#include "state.h"
7#include "commandqueue.h"
8#include "Options.h"
9#include "ipcmutex.h"
10#include "queue.h"
11#include "recursive_operation.h"
12
13BEGIN_EVENT_TABLE(CClearPrivateDataDialog, wxDialogEx)
14EVT_TIMER(wxID_ANY, CClearPrivateDataDialog::OnTimer)
15END_EVENT_TABLE()
16
17CClearPrivateDataDialog::CClearPrivateDataDialog(CMainFrame* pMainFrame)
18        : m_pMainFrame(pMainFrame)
19{
20}
21
22void CClearPrivateDataDialog::Run()
23{
24        if (!Load(m_pMainFrame, _T("ID_CLEARPRIVATEDATA")))
25                return;
26
27        if (ShowModal() != wxID_OK)
28                return;
29
30        wxCheckBox *pSitemanagerCheck = XRCCTRL(*this, "ID_CLEARSITEMANAGER", wxCheckBox);
31        wxCheckBox *pQueueCheck = XRCCTRL(*this, "ID_CLEARQUEUE", wxCheckBox);
32        if (pSitemanagerCheck->GetValue() && pQueueCheck->GetValue())
33        {
34                int res = wxMessageBoxEx(_("Do you really want to delete all Site Manager entries and the transfer queue?"), _("Clear private data"), wxYES | wxNO | wxICON_QUESTION);
35                if (res != wxYES)
36                        return;
37        }
38        else if (pQueueCheck->GetValue())
39        {
40                int res = wxMessageBoxEx(_("Do you really want to delete the transfer queue?"), _("Clear private data"), wxYES | wxNO | wxICON_QUESTION);
41                if (res != wxYES)
42                        return;
43        }
44        else if (pSitemanagerCheck->GetValue())
45        {
46                int res = wxMessageBoxEx(_("Do you really want to delete all Site Manager entries?"), _("Clear private data"), wxYES | wxNO | wxICON_QUESTION);
47                if (res != wxYES)
48                        return;
49        }
50
51        wxCheckBox *pCheck = XRCCTRL(*this, "ID_CLEARQUICKCONNECT", wxCheckBox);
52        if (!pCheck)
53                return;
54
55        if (pCheck->GetValue())
56        {
57                CRecentServerList::Clear();
58                if (m_pMainFrame->GetQuickconnectBar())
59                        m_pMainFrame->GetQuickconnectBar()->ClearFields();
60        }
61
62        pCheck = XRCCTRL(*this, "ID_CLEARRECONNECT", wxCheckBox);
63
64        if (pCheck->GetValue())
65        {
66                bool asked = false;
67
68                const std::vector<CState*> *states = CContextManager::Get()->GetAllStates();
69
70                for (std::vector<CState*>::const_iterator iter = states->begin(); iter != states->end(); ++iter)
71                {
72                        CState* pState = *iter;
73                        if (pState->IsRemoteConnected() || !pState->IsRemoteIdle())
74                        {
75                                if (!asked)
76                                {
77                                        int res = wxMessageBoxEx(_("Reconnect information cannot be cleared while connected to a server.\nIf you continue, your connection will be disconnected."), _("Clear private data"), wxOK | wxCANCEL);
78                                        if (res != wxOK)
79                                                return;
80                                        asked = true;
81                                }
82
83                                pState->GetRecursiveOperationHandler()->StopRecursiveOperation();
84                                if (!pState->m_pCommandQueue->Cancel())
85                                {
86                                        m_timer.SetOwner(this);
87                                        m_timer.Start(250, true);
88                                }
89                                else
90                                        pState->Disconnect();
91                        }
92                }
93
94                // Doesn't harm to do it now, but has to be repeated later just to be safe
95                ClearReconnect();
96        }
97
98        if (pSitemanagerCheck->GetValue())
99        {
100                CInterProcessMutex sitemanagerMutex(MUTEX_SITEMANAGERGLOBAL, false);
101                while (sitemanagerMutex.TryLock() == 0)
102                {
103                        int res = wxMessageBoxEx(_("The Site Manager is opened in another instance of FileZilla 3.\nPlease close it or the data cannot be deleted."), _("Clear private data"), wxOK | wxCANCEL);
104                        if (res != wxYES)
105                                return;
106                }
107                CInterProcessMutex mutex(MUTEX_SITEMANAGER);
108                RemoveXmlFile(_T("sitemanager"));
109        }
110
111        if (pQueueCheck->GetValue())
112        {
113                m_pMainFrame->GetQueue()->SetActive(false);
114                m_pMainFrame->GetQueue()->RemoveAll();
115
116                CInterProcessMutex mutex(MUTEX_QUEUE);
117                RemoveXmlFile(_T("queue"));
118        }
119}
120
121void CClearPrivateDataDialog::OnTimer(wxTimerEvent&)
122{
123        const std::vector<CState*> *states = CContextManager::Get()->GetAllStates();
124
125        for (std::vector<CState*>::const_iterator iter = states->begin(); iter != states->end(); ++iter)
126        {
127                CState* pState = *iter;
128
129                if (pState->IsRemoteConnected() || !pState->IsRemoteIdle())
130                {
131                        if (!pState->m_pCommandQueue->Cancel())
132                                return;
133
134                        pState->Disconnect();
135                }
136
137                if (pState->IsRemoteConnected() || !pState->IsRemoteIdle())
138                        return;
139
140        }
141
142        m_timer.Stop();
143        ClearReconnect();
144        Delete();
145}
146
147void CClearPrivateDataDialog::Delete()
148{
149        if (m_timer.IsRunning())
150                return;
151
152        Destroy();
153}
154
155bool CClearPrivateDataDialog::ClearReconnect()
156{
157        COptions::Get()->SetLastServer(CServer());
158        COptions::Get()->SetOption(OPTION_LASTSERVERPATH, _T(""));
159
160        const std::vector<CState*> *states = CContextManager::Get()->GetAllStates();
161        for (std::vector<CState*>::const_iterator iter = states->begin(); iter != states->end(); ++iter)
162        {
163                CState* pState = *iter;
164
165                pState->SetLastServer(CServer(), CServerPath());
166        }
167
168        return true;
169}
170
171void CClearPrivateDataDialog::RemoveXmlFile(const wxString& name)
172{
173        {
174                wxFileName fn(COptions::Get()->GetOption(OPTION_DEFAULT_SETTINGSDIR), name + _T(".xml"));
175                if (fn.FileExists())
176                        wxRemoveFile(fn.GetFullPath());
177        }
178        {
179                wxFileName fn(COptions::Get()->GetOption(OPTION_DEFAULT_SETTINGSDIR), name + _T("xml~"));
180                if (fn.FileExists())
181                        wxRemoveFile(fn.GetFullPath());
182        }
183}
Note: See TracBrowser for help on using the repository browser.