void CFileItem::SetPriority(enum QueuePriority priority) { if (priority == m_priority) return; CServerItem* parent = (CServerItem*)m_parent; parent->SetChildPriority(this, m_priority, priority); m_priority = priority; }
void CFileItem::SetPriority(QueuePriority priority) { if (priority == m_priority) return; if (m_parent) { CServerItem* parent = reinterpret_cast<CServerItem*>(m_parent); parent->SetChildPriority(this, m_priority, priority); } m_priority = priority; }
bool CQueueViewFailed::RequeueServerItem(CServerItem* pServerItem) { bool ret = true; CQueueView* pQueueView = m_pQueue->GetQueueView(); CServerItem* pTargetServerItem = pQueueView->CreateServerItem(pServerItem->GetServer()); unsigned int childrenCount = pServerItem->GetChildrenCount(false); for (unsigned int i = 0; i < childrenCount; ++i) { CFileItem* pFileItem = (CFileItem*)pServerItem->GetChild(i, false); ret &= RequeueFileItem(pFileItem, pTargetServerItem); } m_fileCount -= childrenCount; m_itemCount -= childrenCount + 1; pServerItem->DetachChildren(); std::vector<CServerItem*>::iterator iter; for (iter = m_serverList.begin(); iter != m_serverList.end(); ++iter) { if (*iter == pServerItem) break; } if (iter != m_serverList.end()) m_serverList.erase(iter); delete pServerItem; if (!pTargetServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pTargetServerItem, true, true, true); } return ret; }
void CQueueViewFailed::OnRemoveSelected(wxCommandEvent& event) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) return; #endif std::list<CQueueItem*> selectedItems; long item = -1; while (true) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; selectedItems.push_front(GetQueueItem(item)); SetItemState(item, 0, wxLIST_STATE_SELECTED); } CEditHandler* pEditHandler = CEditHandler::Get(); while (!selectedItems.empty()) { CQueueItem* pItem = selectedItems.front(); selectedItems.pop_front(); CQueueItem* pTopLevelItem = pItem->GetTopLevelItem(); if (pItem->GetType() == QueueItemType_Server) { CServerItem* pServerItem = (CServerItem*)pItem; if (pEditHandler && pEditHandler->GetFileCount(CEditHandler::remote, CEditHandler::upload_and_remove_failed, &pServerItem->GetServer())) pEditHandler->RemoveAll(CEditHandler::upload_and_remove_failed, &pServerItem->GetServer()); } else if (pItem->GetType() == QueueItemType_File) { CFileItem* pFileItem = (CFileItem*)pItem; if (pFileItem->m_edit == CEditHandler::remote && pEditHandler) { wxFileName fn(pFileItem->GetLocalFile()); if (pFileItem->m_edit == CEditHandler::local) { enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetLocalFile()); if (state == CEditHandler::upload_and_remove_failed) pEditHandler->Remove(pFileItem->GetLocalFile()); } else { CServerItem* pServerItem = (CServerItem*)pFileItem->GetTopLevelItem(); enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); if (state == CEditHandler::upload_and_remove_failed) pEditHandler->Remove(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); } } } if (!pTopLevelItem->GetChild(1)) { // Parent will get deleted // If next selected item is parent, remove it from list if (!selectedItems.empty() && selectedItems.front() == pTopLevelItem) selectedItems.pop_front(); } RemoveItem(pItem, true, false, false); } DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); }
void CQueueViewFailed::OnRequeueSelected(wxCommandEvent& event) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) return; #endif bool failedToRequeueAll = false; std::list<CQueueItem*> selectedItems; long item = -1; long skipTo = -1; while (true) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; SetItemState(item, 0, wxLIST_STATE_SELECTED); if (item < skipTo) continue; CQueueItem* pItem = GetQueueItem(item); if (pItem->GetType() == QueueItemType_Server) skipTo = item + pItem->GetChildrenCount(true) + 1; selectedItems.push_back(GetQueueItem(item)); } if (selectedItems.empty()) return; CQueueView* pQueueView = m_pQueue->GetQueueView(); while (!selectedItems.empty()) { CQueueItem* pItem = selectedItems.front(); selectedItems.pop_front(); if (pItem->GetType() == QueueItemType_Server) { CServerItem* pOldServerItem = (CServerItem*)pItem; CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer()); unsigned int childrenCount = pOldServerItem->GetChildrenCount(false); for (unsigned int i = 0; i < childrenCount; i++) { CFileItem* pFileItem = (CFileItem*)pItem->GetChild(i, false); pFileItem->m_errorCount = 0; pFileItem->m_statusMessage.Clear(); if (!pFileItem->Download() && !wxFileName::FileExists(pFileItem->GetLocalFile())) { failedToRequeueAll = true; RemoveItem(pItem, true, false, false); continue; } if (pFileItem->m_edit == CEditHandler::remote) { CEditHandler* pEditHandler = CEditHandler::Get(); if (!pEditHandler) { failedToRequeueAll = true; delete pFileItem; continue; } enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); if (state == CEditHandler::unknown) { wxASSERT(pFileItem->Download()); wxString file = pFileItem->GetRemoteFile(); if (!pEditHandler->AddFile(CEditHandler::remote, file, pFileItem->GetRemotePath(), pServerItem->GetServer())) { failedToRequeueAll = true; delete pFileItem; continue; } pFileItem->SetLocalFile(file); } else if (state == CEditHandler::upload_and_remove_failed) { wxASSERT(!pFileItem->Download()); if (!pEditHandler->UploadFile(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer(), true)) failedToRequeueAll = true; delete pFileItem; continue; } else { failedToRequeueAll = true; delete pFileItem; continue; } } pFileItem->SetParent(pServerItem); pQueueView->InsertItem(pServerItem, pFileItem); } m_fileCount -= childrenCount; m_itemCount -= childrenCount + 1; pOldServerItem->DetachChildren(); delete pOldServerItem; std::vector<CServerItem*>::iterator iter; for (iter = m_serverList.begin(); iter != m_serverList.end(); iter++) { if (*iter == pOldServerItem) break; } if (iter != m_serverList.end()) m_serverList.erase(iter); if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } } else { CFileItem* pFileItem = (CFileItem*)pItem; pFileItem->m_errorCount = 0; pFileItem->m_statusMessage.Clear(); if (!pFileItem->Download() && !wxFileName::FileExists(pFileItem->GetLocalFile())) { failedToRequeueAll = true; RemoveItem(pItem, true, false, false); continue; } CServerItem* pOldServerItem = (CServerItem*)pItem->GetTopLevelItem(); CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer()); RemoveItem(pItem, false, false, false); if (pFileItem->m_edit == CEditHandler::remote) { CEditHandler* pEditHandler = CEditHandler::Get(); if (!pEditHandler) { if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } failedToRequeueAll = true; delete pItem; continue; } enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); if (state == CEditHandler::unknown) { wxASSERT(pFileItem->Download()); wxString file = pFileItem->GetRemoteFile(); if (!pEditHandler->AddFile(CEditHandler::remote, file, pFileItem->GetRemotePath(), pServerItem->GetServer())) { if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } failedToRequeueAll = true; delete pItem; continue; } pFileItem->SetLocalFile(file); } else if (state == CEditHandler::upload_and_remove_failed) { wxASSERT(!pFileItem->Download()); if (!pEditHandler->UploadFile(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer(), true)) failedToRequeueAll = true; if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } delete pItem; continue; } else { if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } failedToRequeueAll = true; delete pItem; continue; } } pItem->SetParent(pServerItem); pQueueView->InsertItem(pServerItem, pItem); } } m_fileCountChanged = true; pQueueView->CommitChanges(); if (pQueueView->IsActive()) pQueueView->AdvanceQueue(false); DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); if (failedToRequeueAll) wxMessageBox(_("Not all items could be requeued for viewing/editing.")); }
wxString CQueueViewBase::OnGetItemText(long item, long column) const { CQueueViewBase* pThis = const_cast<CQueueViewBase*>(this); CQueueItem* pItem = pThis->GetQueueItem(item); if (!pItem) return _T(""); switch (pItem->GetType()) { case QueueItemType_Server: { CServerItem* pServerItem = reinterpret_cast<CServerItem*>(pItem); if (!column) return pServerItem->GetName(); } break; case QueueItemType_File: { CFileItem* pFileItem = reinterpret_cast<CFileItem*>(pItem); switch (column) { case 0: return pFileItem->GetIndent() + pFileItem->GetLocalFile(); case 1: if (pFileItem->Download()) if (pFileItem->Queued()) return _T("<--"); else return _T("<<--"); else if (pFileItem->Queued()) return _T("-->"); else return _T("-->>"); break; case 2: return pFileItem->GetRemotePath().FormatFilename(pFileItem->GetRemoteFile()); case 3: { const wxLongLong& size = pFileItem->GetSize(); if (size >= 0) return FormatSize(size); else return _T("?"); } case 4: switch (pFileItem->GetPriority()) { case 0: return _("Lowest"); case 1: return _("Low"); default: case 2: return _("Normal"); case 3: return _("High"); case 4: return _("Highest"); } break; case 5: return pFileItem->m_statusMessage; default: break; } } break; case QueueItemType_FolderScan: { CFolderScanItem* pFolderItem = reinterpret_cast<CFolderScanItem*>(pItem); switch (column) { case 0: return _T(" ") + pFolderItem->GetLocalPath(); case 1: if (pFolderItem->Download()) if (pFolderItem->Queued()) return _T("<--"); else return _T("<<--"); else if (pFolderItem->Queued()) return _T("-->"); else return _T("-->>"); break; case 2: return pFolderItem->GetRemotePath().GetPath(); case 5: return pFolderItem->m_statusMessage; default: break; } } break; case QueueItemType_Folder: { CFileItem* pFolderItem = reinterpret_cast<CFolderItem*>(pItem); switch (column) { case 0: if (pFolderItem->Download()) return pFolderItem->GetIndent() + pFolderItem->GetLocalFile(); break; case 1: if (pFolderItem->Download()) if (pFolderItem->Queued()) return _T("<--"); else return _T("<<--"); else if (pFolderItem->Queued()) return _T("-->"); else return _T("-->>"); break; case 2: if (!pFolderItem->Download()) { if (pFolderItem->GetRemoteFile() == _T("")) return pFolderItem->GetRemotePath().GetPath(); else return pFolderItem->GetRemotePath().FormatFilename(pFolderItem->GetRemoteFile()); } break; case 4: switch (pFolderItem->GetPriority()) { case 0: return _("Lowest"); case 1: return _("Low"); default: case 2: return _("Normal"); case 3: return _("High"); case 4: return _("Highest"); } break; case 5: return pFolderItem->m_statusMessage; default: break; } } break; default: break; } return _T(""); }
wxString CQueueViewBase::OnGetItemText(CQueueItem* pItem, ColumnId column) const { switch (pItem->GetType()) { case QueueItemType::Server: { CServerItem* pServerItem = reinterpret_cast<CServerItem*>(pItem); if (!column) return pServerItem->GetName(); } break; case QueueItemType::File: { CFileItem* pFileItem = reinterpret_cast<CFileItem*>(pItem); switch (column) { case colLocalName: return pFileItem->GetIndent() + pFileItem->GetLocalPath().GetPath() + pFileItem->GetLocalFile(); case colDirection: if (pFileItem->Download()) if (pFileItem->queued()) return _T("<--"); else return _T("<<--"); else if (pFileItem->queued()) return _T("-->"); else return _T("-->>"); break; case colRemoteName: return pFileItem->GetRemotePath().FormatFilename(pFileItem->GetRemoteFile()); case colSize: { const wxLongLong& size = pFileItem->GetSize(); if (size >= 0) return CSizeFormat::Format(size); else return _T("?"); } case colPriority: switch (pFileItem->GetPriority()) { case QueuePriority::lowest: return _("Lowest"); case QueuePriority::low: return _("Low"); default: case QueuePriority::normal: return _("Normal"); case QueuePriority::high: return _("High"); case QueuePriority::highest: return _("Highest"); } break; case colTransferStatus: case colErrorReason: return pFileItem->m_statusMessage; case colTime: return CTimeFormat::FormatDateTime(pItem->GetTime()); default: break; } } break; case QueueItemType::FolderScan: { CFolderScanItem* pFolderItem = reinterpret_cast<CFolderScanItem*>(pItem); switch (column) { case colLocalName: return _T(" ") + pFolderItem->GetLocalPath().GetPath(); case colDirection: if (pFolderItem->Download()) if (pFolderItem->queued()) return _T("<--"); else return _T("<<--"); else if (pFolderItem->queued()) return _T("-->"); else return _T("-->>"); break; case colRemoteName: return pFolderItem->GetRemotePath().GetPath(); case colTransferStatus: case colErrorReason: return pFolderItem->m_statusMessage; case colTime: return CTimeFormat::FormatDateTime(pItem->GetTime()); default: break; } } break; case QueueItemType::Folder: { CFileItem* pFolderItem = reinterpret_cast<CFolderItem*>(pItem); switch (column) { case colLocalName: if (pFolderItem->Download()) return pFolderItem->GetIndent() + pFolderItem->GetLocalPath().GetPath() + pFolderItem->GetLocalFile(); break; case colDirection: if (pFolderItem->Download()) if (pFolderItem->queued()) return _T("<--"); else return _T("<<--"); else if (pFolderItem->queued()) return _T("-->"); else return _T("-->>"); break; case colRemoteName: if (!pFolderItem->Download()) { if (pFolderItem->GetRemoteFile().empty()) return pFolderItem->GetRemotePath().GetPath(); else return pFolderItem->GetRemotePath().FormatFilename(pFolderItem->GetRemoteFile()); } break; case colPriority: switch (pFolderItem->GetPriority()) { case QueuePriority::lowest: return _("Lowest"); case QueuePriority::low: return _("Low"); default: case QueuePriority::normal: return _("Normal"); case QueuePriority::high: return _("High"); case QueuePriority::highest: return _("Highest"); } break; case colTransferStatus: case colErrorReason: return pFolderItem->m_statusMessage; case colTime: return CTimeFormat::FormatDateTime(pItem->GetTime()); default: break; } } break; default: break; } return wxString(); }
void CQueueViewFailed::OnRequeueSelected(wxCommandEvent&) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) return; #endif bool failedToRequeueAll = false; std::list<CQueueItem*> selectedItems; long item = -1; long skipTo = -1; for (;;) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; SetItemState(item, 0, wxLIST_STATE_SELECTED); if (item < skipTo) continue; CQueueItem* pItem = GetQueueItem(item); if (pItem->GetType() == QueueItemType::Server) skipTo = item + pItem->GetChildrenCount(true) + 1; selectedItems.push_back(GetQueueItem(item)); } if (selectedItems.empty()) return; CQueueView* pQueueView = m_pQueue->GetQueueView(); while (!selectedItems.empty()) { CQueueItem* pItem = selectedItems.front(); selectedItems.pop_front(); if (pItem->GetType() == QueueItemType::Server) { CServerItem* pServerItem = (CServerItem*)pItem; failedToRequeueAll |= !RequeueServerItem(pServerItem); } else { CFileItem* pFileItem = (CFileItem*)pItem; CServerItem* pOldServerItem = (CServerItem*)pItem->GetTopLevelItem(); CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer()); RemoveItem(pItem, false, false, false); failedToRequeueAll |= !RequeueFileItem(pFileItem, pServerItem); if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } } } m_fileCountChanged = true; pQueueView->CommitChanges(); if (pQueueView->IsActive()) pQueueView->AdvanceQueue(false); DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); if (failedToRequeueAll) wxMessageBoxEx(_("Not all items could be requeued for transfer.")); }
bool CQueueStorage::Impl::SaveServer(const CServerItem& item) { bool kiosk_mode = COptions::Get()->GetOptionVal(OPTION_DEFAULT_KIOSKMODE) != 0; const CServer& server = item.GetServer(); Bind(insertServerQuery_, server_table_column_names::host, server.GetHost()); Bind(insertServerQuery_, server_table_column_names::port, static_cast<int>(server.GetPort())); Bind(insertServerQuery_, server_table_column_names::protocol, static_cast<int>(server.GetProtocol())); Bind(insertServerQuery_, server_table_column_names::type, static_cast<int>(server.GetType())); enum LogonType logonType = server.GetLogonType(); if (server.GetLogonType() != ANONYMOUS) { Bind(insertServerQuery_, server_table_column_names::user, server.GetUser()); if (server.GetLogonType() == NORMAL || server.GetLogonType() == ACCOUNT) { if (kiosk_mode) { logonType = ASK; BindNull(insertServerQuery_, server_table_column_names::password); BindNull(insertServerQuery_, server_table_column_names::account); } else { Bind(insertServerQuery_, server_table_column_names::password, server.GetPass()); if (server.GetLogonType() == ACCOUNT) Bind(insertServerQuery_, server_table_column_names::account, server.GetAccount()); else BindNull(insertServerQuery_, server_table_column_names::account); } } else { BindNull(insertServerQuery_, server_table_column_names::password); BindNull(insertServerQuery_, server_table_column_names::account); } } else { BindNull(insertServerQuery_, server_table_column_names::user); BindNull(insertServerQuery_, server_table_column_names::password); BindNull(insertServerQuery_, server_table_column_names::account); } Bind(insertServerQuery_, server_table_column_names::logontype, static_cast<int>(logonType)); Bind(insertServerQuery_, server_table_column_names::timezone_offset, server.GetTimezoneOffset()); switch (server.GetPasvMode()) { case MODE_PASSIVE: Bind(insertServerQuery_, server_table_column_names::transfer_mode, _T("passive")); break; case MODE_ACTIVE: Bind(insertServerQuery_, server_table_column_names::transfer_mode, _T("active")); break; default: Bind(insertServerQuery_, server_table_column_names::transfer_mode, _T("default")); break; } Bind(insertServerQuery_, server_table_column_names::max_connections, server.MaximumMultipleConnections()); switch (server.GetEncodingType()) { default: case ENCODING_AUTO: Bind(insertServerQuery_, server_table_column_names::encoding, _T("Auto")); break; case ENCODING_UTF8: Bind(insertServerQuery_, server_table_column_names::encoding, _T("UTF-8")); break; case ENCODING_CUSTOM: Bind(insertServerQuery_, server_table_column_names::encoding, server.GetCustomEncoding()); break; } if (CServer::SupportsPostLoginCommands(server.GetProtocol())) { const std::vector<wxString>& postLoginCommands = server.GetPostLoginCommands(); if (!postLoginCommands.empty()) { wxString commands; for (std::vector<wxString>::const_iterator iter = postLoginCommands.begin(); iter != postLoginCommands.end(); ++iter) { if (!commands.empty()) commands += _T("\n"); commands += *iter; } Bind(insertServerQuery_, server_table_column_names::post_login_commands, commands); } else BindNull(insertServerQuery_, server_table_column_names::post_login_commands); } else BindNull(insertServerQuery_, server_table_column_names::post_login_commands); Bind(insertServerQuery_, server_table_column_names::bypass_proxy, server.GetBypassProxy() ? 1 : 0); if (!server.GetName().empty()) Bind(insertServerQuery_, server_table_column_names::name, server.GetName()); else BindNull(insertServerQuery_, server_table_column_names::name); int res; do { res = sqlite3_step(insertServerQuery_); } while (res == SQLITE_BUSY); sqlite3_reset(insertServerQuery_); bool ret = res == SQLITE_DONE; if (ret) { sqlite3_int64 serverId = sqlite3_last_insert_rowid(db_); Bind(insertFileQuery_, file_table_column_names::server, static_cast<int64_t>(serverId)); const std::vector<CQueueItem*>& children = item.GetChildren(); for (std::vector<CQueueItem*>::const_iterator it = children.begin() + item.GetRemovedAtFront(); it != children.end(); ++it) { CQueueItem & childItem = **it; if (childItem.GetType() == QueueItemType::File) ret &= SaveFile(serverId, static_cast<CFileItem&>(childItem)); else if (childItem.GetType() == QueueItemType::Folder) ret &= SaveDirectory(serverId, static_cast<CFolderItem&>(childItem)); } } return ret; }