📄 transferview.cpp
字号:
} else if(wParam == UPDATE_ITEM) {
auto_ptr<UpdateInfo> ui(reinterpret_cast<UpdateInfo*>(lParam));
int ic = ctrlTransfers.GetItemCount();
for(int i = 0; i < ic; ++i) {
ItemInfo* ii = ctrlTransfers.getItemData(i);
if(ii->download == ui->download && ii->user == ui->user) {
ii->update(*ui);
ctrlTransfers.updateItem(i);
break;
}
}
} else if(wParam == UPDATE_ITEMS) {
auto_ptr<vector<UpdateInfo*> > v(reinterpret_cast<vector<UpdateInfo*>* >(lParam));
ctrlTransfers.SetRedraw(FALSE);
int ic = ctrlTransfers.GetItemCount();
for(int i = 0; i < ic; ++i) {
ItemInfo* ii = ctrlTransfers.getItemData(i);
for(vector<UpdateInfo*>::iterator j = v->begin(); j != v->end(); ++j) {
UpdateInfo* ui = *j;
if(*ui == *ii) {
ii->update(*ui);
ctrlTransfers.updateItem(i);
}
}
}
if(ctrlTransfers.getSortColumn() != COLUMN_STATUS)
ctrlTransfers.resort();
ctrlTransfers.SetRedraw(TRUE);
for_each(v->begin(), v->end(), DeleteFunction());
}
return 0;
}
LRESULT TransferView::onSearchAlternates(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i = ctrlTransfers.GetNextItem(-1, LVNI_SELECTED);
if(i != -1) {
ItemInfo *ii = ctrlTransfers.getItemData(i);
QueueItem::StringMap queue = QueueManager::getInstance()->lockQueue();
string tmp = Text::fromT(ii->getText(COLUMN_PATH) + ii->getText(COLUMN_FILE));
QueueItem::StringIter qi = queue.find(&tmp);
//create a copy of the tth to avoid holding the filequeue lock while calling
//into searchframe, searchmanager and all of that
TTHValue *val = NULL;
if(qi != queue.end() && qi->second->getTTH()) {
val = new TTHValue(*qi->second->getTTH());
}
QueueManager::getInstance()->unlockQueue();
if(val) {
WinUtil::searchHash(val);
delete val;
}
}
return 0;
}
TransferView::ItemInfo::ItemInfo(const User::Ptr& u, bool aDownload) : UserInfoBase(u), download(aDownload), transferFailed(false),
status(STATUS_WAITING), pos(0), size(0), start(0), actual(0), speed(0), timeLeft(0)
{
columns[COLUMN_USER] = WinUtil::getNicks(u);
columns[COLUMN_HUB] = WinUtil::getHubNames(u).first;
columns[COLUMN_CID] = Text::toT(u->getCID().toBase32());
}
void TransferView::ItemInfo::update(const UpdateInfo& ui) {
if(ui.updateMask & UpdateInfo::MASK_STATUS) {
status = ui.status;
}
if(ui.updateMask & UpdateInfo::MASK_STATUS_STRING) {
// No slots etc from transfermanager better than disconnected from connectionmanager
if(!transferFailed)
columns[COLUMN_STATUS] = ui.statusString;
transferFailed = ui.transferFailed;
}
if(ui.updateMask & UpdateInfo::MASK_SIZE) {
size = ui.size;
columns[COLUMN_SIZE] = Text::toT(Util::formatBytes(size));
}
if(ui.updateMask & UpdateInfo::MASK_START) {
start = ui.start;
}
if(ui.updateMask & UpdateInfo::MASK_POS) {
pos = start + ui.pos;
}
if(ui.updateMask & UpdateInfo::MASK_ACTUAL) {
actual = start + ui.actual;
columns[COLUMN_RATIO] = Text::toT(Util::toString(getRatio()));
}
if(ui.updateMask & UpdateInfo::MASK_SPEED) {
speed = ui.speed;
if (status == STATUS_RUNNING) {
columns[COLUMN_SPEED] = Text::toT(Util::formatBytes(speed) + "/s");
} else {
columns[COLUMN_SPEED] = Util::emptyStringT;
}
}
if(ui.updateMask & UpdateInfo::MASK_FILE) {
columns[COLUMN_FILE] = ui.file;
columns[COLUMN_PATH] = ui.path;
}
if(ui.updateMask & UpdateInfo::MASK_TIMELEFT) {
timeLeft = ui.timeLeft;
if (status == STATUS_RUNNING) {
columns[COLUMN_TIMELEFT] = Text::toT(Util::formatSeconds(timeLeft));
} else {
columns[COLUMN_TIMELEFT] = Util::emptyStringT;
}
}
if(ui.updateMask & UpdateInfo::MASK_IP) {
columns[COLUMN_IP] = ui.IP;
}
}
void TransferView::on(ConnectionManagerListener::Added, ConnectionQueueItem* aCqi) {
UpdateInfo* ui = new UpdateInfo(aCqi->getUser(), aCqi->getDownload());
ui->setStatus(ItemInfo::STATUS_WAITING);
ui->setStatusString(TSTRING(CONNECTING));
speak(ADD_ITEM, ui);
}
void TransferView::on(ConnectionManagerListener::StatusChanged, ConnectionQueueItem* aCqi) {
UpdateInfo* ui = new UpdateInfo(aCqi->getUser(), aCqi->getDownload());
ui->setStatusString((aCqi->getState() == ConnectionQueueItem::CONNECTING) ? TSTRING(CONNECTING) : TSTRING(WAITING_TO_RETRY));
speak(UPDATE_ITEM, ui);
}
void TransferView::on(ConnectionManagerListener::Removed, ConnectionQueueItem* aCqi) {
speak(REMOVE_ITEM, new UpdateInfo(aCqi->getUser(), aCqi->getDownload()));
}
void TransferView::on(ConnectionManagerListener::Failed, ConnectionQueueItem* aCqi, const string& aReason) {
UpdateInfo* ui = new UpdateInfo(aCqi->getUser(), aCqi->getDownload());
ui->setStatusString(Text::toT(aReason));
speak(UPDATE_ITEM, ui);
}
void TransferView::on(DownloadManagerListener::Starting, Download* aDownload) {
UpdateInfo* ui = new UpdateInfo(aDownload->getUserConnection()->getUser(), true);
ui->setStatus(ItemInfo::STATUS_RUNNING);
ui->setPos(aDownload->getTotal());
ui->setActual(aDownload->getActual());
ui->setStart(aDownload->getPos());
ui->setSize(aDownload->getSize());
ui->setFile(Text::toT(aDownload->getTarget()));
ui->setStatusString(TSTRING(DOWNLOAD_STARTING));
tstring country = Text::toT(Util::getIpCountry(aDownload->getUserConnection()->getRemoteIp()));
tstring ip = Text::toT(aDownload->getUserConnection()->getRemoteIp());
if(country.empty()) {
ui->setIP(ip);
} else {
ui->setIP(country + _T(" (") + ip + _T(")"));
}
if(aDownload->isSet(Download::FLAG_TREE_DOWNLOAD)) {
ui->file = _T("TTH: ") + ui->file;
}
speak(UPDATE_ITEM, ui);
}
void TransferView::on(DownloadManagerListener::Tick, const Download::List& dl) {
vector<UpdateInfo*>* v = new vector<UpdateInfo*>();
v->reserve(dl.size());
AutoArray<TCHAR> buf(TSTRING(DOWNLOADED_BYTES).size() + 64);
for(Download::List::const_iterator j = dl.begin(); j != dl.end(); ++j) {
Download* d = *j;
UpdateInfo* ui = new UpdateInfo(d->getUserConnection()->getUser(), true);
ui->setActual(d->getActual());
ui->setPos(d->getTotal());
ui->setTimeLeft(d->getSecondsLeft());
ui->setSpeed(d->getRunningAverage());
_stprintf(buf, CTSTRING(DOWNLOADED_BYTES), Text::toT(Util::formatBytes(d->getPos())).c_str(),
(double)d->getPos()*100.0/(double)d->getSize(), Text::toT(Util::formatSeconds((GET_TICK() - d->getStart())/1000)).c_str());
tstring statusString;
if(d->getUserConnection()->isSecure()) {
statusString += _T("[S]");
}
if(d->isSet(Download::FLAG_TTH_CHECK)) {
statusString += _T("[T]");
}
if(d->isSet(Download::FLAG_ZDOWNLOAD)) {
statusString += _T("[Z]");
}
if(d->isSet(Download::FLAG_ROLLBACK)) {
statusString += _T("[R]");
}
if(!statusString.empty()) {
statusString += _T(" ");
}
statusString += buf;
ui->setStatusString(statusString);
v->push_back(ui);
}
speak(UPDATE_ITEMS, v);
}
void TransferView::on(DownloadManagerListener::Failed, Download* aDownload, const string& aReason) {
UpdateInfo* ui = new UpdateInfo(aDownload->getUserConnection()->getUser(), true, true);
ui->setStatus(ItemInfo::STATUS_WAITING);
ui->setPos(0);
ui->setStatusString(Text::toT(aReason));
ui->setSize(aDownload->getSize());
ui->setFile(Text::toT(aDownload->getTarget()));
if(aDownload->isSet(Download::FLAG_TREE_DOWNLOAD)) {
ui->file = _T("TTH: ") + ui->file;
}
speak(UPDATE_ITEM, ui);
}
void TransferView::on(UploadManagerListener::Starting, Upload* aUpload) {
UpdateInfo* ui = new UpdateInfo(aUpload->getUserConnection()->getUser(), false);
ui->setStatus(ItemInfo::STATUS_RUNNING);
ui->setPos(aUpload->getTotal());
ui->setActual(aUpload->getActual());
ui->setStart(aUpload->getPos());
ui->setSize(aUpload->getSize());
ui->setFile(Text::toT(aUpload->getFileName()));
ui->setStatusString(TSTRING(UPLOAD_STARTING));
tstring country = Text::toT(Util::getIpCountry(aUpload->getUserConnection()->getRemoteIp()));
tstring ip = Text::toT(aUpload->getUserConnection()->getRemoteIp());
if(country.empty()) {
ui->setIP(ip);
} else {
ui->setIP(country + _T(" (") + ip + _T(")"));
}
if(aUpload->isSet(Download::FLAG_TREE_DOWNLOAD)) {
ui->file = _T("TTH: ") + ui->file;
}
speak(UPDATE_ITEM, ui);
}
void TransferView::on(UploadManagerListener::Tick, const Upload::List& ul) {
vector<UpdateInfo*>* v = new vector<UpdateInfo*>();
v->reserve(ul.size());
AutoArray<TCHAR> buf(TSTRING(UPLOADED_BYTES).size() + 64);
for(Upload::List::const_iterator j = ul.begin(); j != ul.end(); ++j) {
Upload* u = *j;
UpdateInfo* ui = new UpdateInfo(u->getUserConnection()->getUser(), false);
ui->setActual(u->getActual());
ui->setPos(u->getTotal());
ui->setTimeLeft(u->getSecondsLeft());
ui->setSpeed(u->getRunningAverage());
_stprintf(buf, CTSTRING(UPLOADED_BYTES), Text::toT(Util::formatBytes(u->getPos())).c_str(),
(double)u->getPos()*100.0/(double)u->getSize(), Text::toT(Util::formatSeconds((GET_TICK() - u->getStart())/1000)).c_str());
tstring statusString;
if(u->getUserConnection()->isSecure()) {
statusString += _T("[S]");
}
if(u->isSet(Upload::FLAG_ZUPLOAD)) {
statusString += _T("[Z]");
}
if(!statusString.empty()) {
statusString += _T(" ");
}
statusString += buf;
ui->setStatusString(statusString);
v->push_back(ui);
}
speak(UPDATE_ITEMS, v);
}
void TransferView::onTransferComplete(Transfer* aTransfer, bool isUpload) {
UpdateInfo* ui = new UpdateInfo(aTransfer->getUserConnection()->getUser(), !isUpload);
ui->setStatus(ItemInfo::STATUS_WAITING);
ui->setPos(0);
ui->setStatusString(isUpload ? TSTRING(UPLOAD_FINISHED_IDLE) : TSTRING(DOWNLOAD_FINISHED_IDLE));
speak(UPDATE_ITEM, ui);
}
void TransferView::ItemInfo::disconnect() {
ConnectionManager::getInstance()->disconnect(user, download);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -