source: filezilla/trunk/fuentes/src/interface/queueview_failed.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: 9.8 KB
Line 
1#include <filezilla.h>
2#include "queue.h"
3#include "queueview_failed.h"
4#include "edithandler.h"
5
6BEGIN_EVENT_TABLE(CQueueViewFailed, CQueueViewBase)
7EVT_CONTEXT_MENU(CQueueViewFailed::OnContextMenu)
8EVT_MENU(XRCID("ID_REMOVEALL"), CQueueViewFailed::OnRemoveAll)
9EVT_MENU(XRCID("ID_REMOVE"), CQueueViewFailed::OnRemoveSelected)
10EVT_MENU(XRCID("ID_REQUEUE"), CQueueViewFailed::OnRequeueSelected)
11EVT_MENU(XRCID("ID_REQUEUEALL"), CQueueViewFailed::OnRequeueAll)
12EVT_CHAR(CQueueViewFailed::OnChar)
13END_EVENT_TABLE()
14
15CQueueViewFailed::CQueueViewFailed(CQueue* parent, int index)
16        : CQueueViewBase(parent, index, _("Failed transfers"))
17{
18        std::list<ColumnId> extraCols;
19        extraCols.push_back(colTime);
20        extraCols.push_back(colErrorReason);
21        CreateColumns(extraCols);
22}
23
24CQueueViewFailed::CQueueViewFailed(CQueue* parent, int index, const wxString& title)
25        : CQueueViewBase(parent, index, title)
26{
27}
28
29void CQueueViewFailed::OnContextMenu(wxContextMenuEvent&)
30{
31        wxMenu* pMenu = wxXmlResource::Get()->LoadMenu(_T("ID_MENU_QUEUE_FAILED"));
32        if (!pMenu)
33                return;
34
35#ifndef __WXMSW__
36        // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1)
37        const bool has_selection = GetSelectedItemCount() != 0;
38#else
39        const bool has_selection = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) != -1;
40#endif
41
42        pMenu->Enable(XRCID("ID_REMOVE"), has_selection);
43        pMenu->Enable(XRCID("ID_REQUEUE"), has_selection);
44        pMenu->Enable(XRCID("ID_REQUEUEALL"), !m_serverList.empty());
45
46        PopupMenu(pMenu);
47        delete pMenu;
48}
49
50void CQueueViewFailed::OnRemoveAll(wxCommandEvent&)
51{
52#ifndef __WXMSW__
53        // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1)
54        if (GetSelectedItemCount())
55#endif
56        {
57                // First, clear all selections
58                int item;
59                while ((item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != -1)
60                        SetItemState(item, 0, wxLIST_STATE_SELECTED);
61        }
62
63        CEditHandler* pEditHandler = CEditHandler::Get();
64        if (pEditHandler)
65                pEditHandler->RemoveAll(CEditHandler::upload_and_remove_failed);
66
67        for (auto iter = m_serverList.begin(); iter != m_serverList.end(); ++iter)
68                delete *iter;
69        m_serverList.clear();
70
71        m_itemCount = 0;
72        SaveSetItemCount(0);
73        m_fileCount = 0;
74        m_folderScanCount = 0;
75
76        DisplayNumberQueuedFiles();
77
78        RefreshListOnly();
79
80        if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount())
81                m_pQueue->SetSelection(0);
82}
83
84void CQueueViewFailed::OnRemoveSelected(wxCommandEvent&)
85{
86#ifndef __WXMSW__
87        // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1)
88        if (!GetSelectedItemCount())
89                return;
90#endif
91
92        std::list<CQueueItem*> selectedItems;
93        long item = -1;
94        for (;;)
95        {
96                item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
97                if (item == -1)
98                        break;
99
100                selectedItems.push_front(GetQueueItem(item));
101                SetItemState(item, 0, wxLIST_STATE_SELECTED);
102        }
103
104        CEditHandler* pEditHandler = CEditHandler::Get();
105
106        while (!selectedItems.empty())
107        {
108                CQueueItem* pItem = selectedItems.front();
109                selectedItems.pop_front();
110
111                CQueueItem* pTopLevelItem = pItem->GetTopLevelItem();
112
113                if (pItem->GetType() == QueueItemType::Server)
114                {
115                        CServerItem* pServerItem = (CServerItem*)pItem;
116                        if (pEditHandler && pEditHandler->GetFileCount(CEditHandler::remote, CEditHandler::upload_and_remove_failed, &pServerItem->GetServer()))
117                                pEditHandler->RemoveAll(CEditHandler::upload_and_remove_failed, &pServerItem->GetServer());
118                }
119                else if (pItem->GetType() == QueueItemType::File)
120                {
121                        CFileItem* pFileItem = (CFileItem*)pItem;
122                        if (pFileItem->m_edit == CEditHandler::remote && pEditHandler)
123                        {
124                                if (pFileItem->m_edit == CEditHandler::local)
125                                {
126                                        wxString fullPath(pFileItem->GetLocalPath().GetPath() + pFileItem->GetLocalFile());
127                                        enum CEditHandler::fileState state = pEditHandler->GetFileState(fullPath);
128                                        if (state == CEditHandler::upload_and_remove_failed)
129                                                pEditHandler->Remove(fullPath);
130                                }
131                                else
132                                {
133                                        CServerItem* pServerItem = (CServerItem*)pFileItem->GetTopLevelItem();
134                                        enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer());
135                                        if (state == CEditHandler::upload_and_remove_failed)
136                                                pEditHandler->Remove(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer());
137                                }
138                        }
139                }
140
141                if (!pTopLevelItem->GetChild(1))
142                {
143                        // Parent will get deleted
144                        // If next selected item is parent, remove it from list
145                        if (!selectedItems.empty() && selectedItems.front() == pTopLevelItem)
146                                selectedItems.pop_front();
147                }
148                RemoveItem(pItem, true, false, false);
149        }
150        DisplayNumberQueuedFiles();
151        SaveSetItemCount(m_itemCount);
152        RefreshListOnly();
153
154        if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount())
155                m_pQueue->SetSelection(0);
156}
157
158bool CQueueViewFailed::RequeueFileItem(CFileItem* pFileItem, CServerItem* pServerItem)
159{
160        CQueueView* pQueueView = m_pQueue->GetQueueView();
161
162        pFileItem->m_errorCount = 0;
163        pFileItem->SetStatusMessage(CFileItem::none);
164
165        if (!pFileItem->Download() && pFileItem->GetType() != QueueItemType::Folder && !wxFileName::FileExists(pFileItem->GetLocalPath().GetPath() + pFileItem->GetLocalFile())) {
166                delete pFileItem;
167                return false;
168        }
169
170        if (pFileItem->m_edit == CEditHandler::remote) {
171                CEditHandler* pEditHandler = CEditHandler::Get();
172                if (!pEditHandler) {
173                        delete pFileItem;
174                        return false;
175                }
176                enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer());
177                if (state == CEditHandler::unknown) {
178                        wxASSERT(pFileItem->Download());
179                        wxString file = pFileItem->GetRemoteFile();
180                        if (!pEditHandler->AddFile(CEditHandler::remote, file, pFileItem->GetRemotePath(), pServerItem->GetServer())) {
181                                delete pFileItem;
182                                return false;
183                        }
184                        pFileItem->SetTargetFile(file);
185                }
186                else if (state == CEditHandler::upload_and_remove_failed) {
187                        wxASSERT(!pFileItem->Download());
188                        bool ret = true;
189                        if (!pEditHandler->UploadFile(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer(), true))
190                                ret = false;
191                        delete pFileItem;
192                        return ret;
193                }
194                else {
195                        delete pFileItem;
196                        return false;
197                }
198        }
199
200        pFileItem->SetParent(pServerItem);
201        pQueueView->InsertItem(pServerItem, pFileItem);
202
203        return true;
204}
205
206bool CQueueViewFailed::RequeueServerItem(CServerItem* pServerItem)
207{
208        bool ret = true;
209
210        CQueueView* pQueueView = m_pQueue->GetQueueView();
211
212        CServerItem* pTargetServerItem = pQueueView->CreateServerItem(pServerItem->GetServer());
213
214        unsigned int childrenCount = pServerItem->GetChildrenCount(false);
215        for (unsigned int i = 0; i < childrenCount; ++i) {
216                CFileItem* pFileItem = (CFileItem*)pServerItem->GetChild(i, false);
217
218                ret &= RequeueFileItem(pFileItem, pTargetServerItem);
219        }
220
221        m_fileCount -= childrenCount;
222        m_itemCount -= childrenCount + 1;
223        pServerItem->DetachChildren();
224
225        std::vector<CServerItem*>::iterator iter;
226        for (iter = m_serverList.begin(); iter != m_serverList.end(); ++iter) {
227                if (*iter == pServerItem)
228                        break;
229        }
230        if (iter != m_serverList.end())
231                m_serverList.erase(iter);
232
233        delete pServerItem;
234
235        if (!pTargetServerItem->GetChildrenCount(false)) {
236                pQueueView->CommitChanges();
237                pQueueView->RemoveItem(pTargetServerItem, true, true, true);
238        }
239
240        return ret;
241}
242
243void CQueueViewFailed::OnRequeueSelected(wxCommandEvent&)
244{
245#ifndef __WXMSW__
246        // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1)
247        if (!GetSelectedItemCount())
248                return;
249#endif
250
251        bool failedToRequeueAll = false;
252        std::list<CQueueItem*> selectedItems;
253        long item = -1;
254        long skipTo = -1;
255        for (;;) {
256                item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
257                if (item == -1)
258                        break;
259                SetItemState(item, 0, wxLIST_STATE_SELECTED);
260                if (item < skipTo)
261                        continue;
262
263                CQueueItem* pItem = GetQueueItem(item);
264                if (pItem->GetType() == QueueItemType::Server)
265                        skipTo = item + pItem->GetChildrenCount(true) + 1;
266                selectedItems.push_back(GetQueueItem(item));
267        }
268
269        if (selectedItems.empty())
270                return;
271
272        CQueueView* pQueueView = m_pQueue->GetQueueView();
273
274        while (!selectedItems.empty()) {
275                CQueueItem* pItem = selectedItems.front();
276                selectedItems.pop_front();
277
278                if (pItem->GetType() == QueueItemType::Server) {
279                        CServerItem* pServerItem = (CServerItem*)pItem;
280                        failedToRequeueAll |= !RequeueServerItem(pServerItem);
281                }
282                else {
283                        CFileItem* pFileItem = (CFileItem*)pItem;
284
285                        CServerItem* pOldServerItem = (CServerItem*)pItem->GetTopLevelItem();
286                        CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer());
287                        RemoveItem(pItem, false, false, false);
288
289                        failedToRequeueAll |= !RequeueFileItem(pFileItem, pServerItem);
290
291                        if (!pServerItem->GetChildrenCount(false)) {
292                                pQueueView->CommitChanges();
293                                pQueueView->RemoveItem(pServerItem, true, true, true);
294                        }
295                }
296        }
297        m_fileCountChanged = true;
298
299        pQueueView->CommitChanges();
300
301        if (pQueueView->IsActive())
302                pQueueView->AdvanceQueue(false);
303
304        DisplayNumberQueuedFiles();
305        SaveSetItemCount(m_itemCount);
306        RefreshListOnly();
307
308        if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount())
309                m_pQueue->SetSelection(0);
310
311        if (failedToRequeueAll)
312                wxMessageBoxEx(_("Not all items could be requeued for transfer."));
313}
314
315void CQueueViewFailed::OnRequeueAll(wxCommandEvent&)
316{
317        bool ret = true;
318        while (!m_serverList.empty())
319                ret &= RequeueServerItem(m_serverList.front());
320
321        m_fileCountChanged = true;
322
323        CQueueView* pQueueView = m_pQueue->GetQueueView();
324        pQueueView->CommitChanges();
325
326        if (pQueueView->IsActive())
327                pQueueView->AdvanceQueue(false);
328
329        DisplayNumberQueuedFiles();
330        SaveSetItemCount(m_itemCount);
331        RefreshListOnly();
332
333        if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount())
334                m_pQueue->SetSelection(0);
335
336        if (!ret)
337                wxMessageBoxEx(_("Not all items could be requeued for transfer."));
338}
339
340void CQueueViewFailed::OnChar(wxKeyEvent& event)
341{
342        if (event.GetKeyCode() == WXK_DELETE || event.GetKeyCode() == WXK_NUMPAD_DELETE)
343        {
344                wxCommandEvent cmdEvt;
345                OnRemoveSelected(cmdEvt);
346        }
347        else
348                event.Skip();
349}
Note: See TracBrowser for help on using the repository browser.