📄 mainfrm.cpp
字号:
int i = sortItem(a, b);
return (i == ExListViewCtrl::SORT_STRING_NOCASE) ? 0 : i;
}
int MainFrame::sortSpeed(LPARAM a, LPARAM b) {
int i = sortItem(a, b);
if( i == ExListViewCtrl::SORT_STRING_NOCASE) {
ItemInfo* c = (ItemInfo*)a;
ItemInfo* d = (ItemInfo*)b;
return compare(c->speed, d->speed);
}
return i;
}
int MainFrame::sortTimeLeft(LPARAM a, LPARAM b) {
int i = sortItem(a, b);
if( i == ExListViewCtrl::SORT_STRING_NOCASE) {
ItemInfo* c = (ItemInfo*)a;
ItemInfo* d = (ItemInfo*)b;
return compare(c->timeLeft, d->timeLeft);
}
return i;
}
int MainFrame::sortItem(LPARAM a, LPARAM b) {
ItemInfo* c = (ItemInfo*)a;
ItemInfo* d = (ItemInfo*)b;
if(c->type == d->type) {
if(c->status == d->status || d->type == ItemInfo::TYPE_UPLOAD) {
return ExListViewCtrl::SORT_STRING_NOCASE;
} else {
return c->status == ItemInfo::STATUS_RUNNING ? -1 : 1;
}
} else {
return c->type == ItemInfo::TYPE_DOWNLOAD ? -1 : 1;
}
}
LRESULT MainFrame::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
if(wParam == ADD_DOWNLOAD_ITEM) {
StringListInfo* i = (StringListInfo*)lParam;
StringList l;
for(int j = 0; j < COLUMN_LAST; j++) {
l.push_back(i->columns[j]);
}
dcassert(ctrlTransfers.find(i->lParam) == -1);
ctrlTransfers.insert(l, IMAGE_DOWNLOAD, i->lParam);
delete i;
} else if(wParam == ADD_UPLOAD_ITEM) {
StringListInfo* i = (StringListInfo*)lParam;
StringList l;
for(int j = 0; j < COLUMN_LAST; j++) {
l.push_back(i->columns[j]);
}
dcassert(ctrlTransfers.find(i->lParam) == -1);
ctrlTransfers.insert(l, IMAGE_UPLOAD, i->lParam);
delete i;
} else if(wParam == REMOVE_ITEM) {
dcassert(ctrlTransfers.find(lParam) != -1);
ctrlTransfers.DeleteItem(ctrlTransfers.find(lParam));
delete (ItemInfo*)lParam;
} else if(wParam == SET_TEXT) {
StringListInfo* l = (StringListInfo*)lParam;
int n = ctrlTransfers.find(l->lParam);
if(n != -1) {
ctrlTransfers.SetRedraw(FALSE);
for(int i = 0; i < COLUMN_LAST; i++) {
if(!l->columns[i].empty()) {
ctrlTransfers.SetItemText(n, i, l->columns[i].c_str());
}
}
ctrlTransfers.SetRedraw(TRUE);
}
if(ctrlTransfers.getSortColumn() != COLUMN_USER)
ctrlTransfers.resort();
delete l;
} else if(wParam == SET_TEXTS) {
vector<StringListInfo*>* v = (vector<StringListInfo*>*)lParam;
ctrlTransfers.SetRedraw(FALSE);
for(vector<StringListInfo*>::iterator j = v->begin(); j != v->end(); ++j) {
StringListInfo* l = *j;
int n = ctrlTransfers.find(l->lParam);
if(n != -1) {
for(int i = 0; i < COLUMN_LAST; i++) {
if(!l->columns[i].empty()) {
ctrlTransfers.SetItemText(n, i, l->columns[i].c_str());
}
}
}
delete l;
}
ctrlTransfers.SetRedraw(TRUE);
ctrlTransfers.resort();
delete v;
} else if(wParam == DOWNLOAD_LISTING) {
DirectoryListInfo* i = (DirectoryListInfo*)lParam;
try {
DirectoryListingFrame* pChild = new DirectoryListingFrame(i->file, i->user);
pChild->setTab(&ctrlTab);
pChild->CreateEx(m_hWndClient);
pChild->setWindowTitle();
delete i;
} catch(const FileException&) {
// ...
}
} else if(wParam == STATS) {
StringList& str = *(StringList*)lParam;
if(ctrlStatus.IsWindow()) {
HDC dc = ::GetDC(ctrlStatus.m_hWnd);
bool u = false;
ctrlStatus.SetText(1, str[0].c_str());
for(int i = 1; i < 7; i++) {
int w = WinUtil::getTextWidth(str[i], dc);
if(statusSizes[i] < w) {
statusSizes[i] = w;
u = true;
}
ctrlStatus.SetText(i+1, str[i].c_str());
}
::ReleaseDC(ctrlStatus.m_hWnd, dc);
if(u)
UpdateLayout(TRUE);
}
delete &str;
} else if(wParam == AUTO_CONNECT) {
autoConnect(HubManager::getInstance()->getFavoriteHubs());
} else if(wParam == PARSE_COMMAND_LINE) {
parseCommandLine(GetCommandLine());
}
return 0;
}
void MainFrame::onConnectionAdded(ConnectionQueueItem* aCqi) {
ItemInfo::Types t = aCqi->getConnection() && aCqi->getConnection()->isSet(UserConnection::FLAG_UPLOAD) ? ItemInfo::TYPE_UPLOAD : ItemInfo::TYPE_DOWNLOAD;
ItemInfo* ii = new ItemInfo(aCqi->getUser(), t, ItemInfo::STATUS_WAITING);
{
Lock l(cs);
dcassert(transferItems.find(aCqi) == transferItems.end());
transferItems.insert(make_pair(aCqi, ii));
}
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_USER] = aCqi->getUser()->getFullNick();
i->columns[COLUMN_STATUS] = STRING(CONNECTING);
if(aCqi->getConnection() && aCqi->getConnection()->isSet(UserConnection::FLAG_UPLOAD)) {
PostMessage(WM_SPEAKER, ADD_UPLOAD_ITEM, (LPARAM)i);
} else {
PostMessage(WM_SPEAKER, ADD_DOWNLOAD_ITEM, (LPARAM)i);
}
}
void MainFrame::onConnectionStatus(ConnectionQueueItem* aCqi) {
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = aCqi->getState() == ConnectionQueueItem::CONNECTING ? STRING(CONNECTING) : STRING(WAITING_TO_RETRY);
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onConnectionRemoved(ConnectionQueueItem* aCqi) {
ItemInfo* ii;
{
Lock l(cs);
ItemInfo::MapIter i = transferItems.find(aCqi);
dcassert(i != transferItems.end());
ii = i->second;
transferItems.erase(i);
}
PostMessage(WM_SPEAKER, REMOVE_ITEM, (LPARAM)ii);
}
void MainFrame::onConnectionFailed(ConnectionQueueItem* aCqi, const string& aReason) {
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = aReason;
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onUploadStarting(Upload* aUpload) {
ConnectionQueueItem* aCqi = aUpload->getUserConnection()->getCQI();
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
ii->pos = 0;
ii->size = aUpload->getSize();
ii->status = ItemInfo::STATUS_RUNNING;
ii->speed = 0;
ii->timeLeft = 0;
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_FILE] = Util::getFileName(aUpload->getFileName());
i->columns[COLUMN_PATH] = Util::getFilePath(aUpload->getFileName());
i->columns[COLUMN_STATUS] = STRING(UPLOAD_STARTING);
i->columns[COLUMN_SIZE] = Util::formatBytes(aUpload->getSize());
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onUploadTick(const Upload::List& ul) {
vector<StringListInfo*>* v = new vector<StringListInfo*>();
v->reserve(ul.size());
char* buf = new char[STRING(UPLOADED_BYTES).size() + 64];
{
Lock l(cs);
for(Upload::List::const_iterator j = ul.begin(); j != ul.end(); ++j) {
Upload* u = *j;
ConnectionQueueItem* aCqi = u->getUserConnection()->getCQI();
ItemInfo* ii = transferItems[aCqi];
ii->pos = u->getPos();
ii->timeLeft = u->getSecondsLeft();
ii->speed = u->getAverageSpeed();
sprintf(buf, CSTRING(UPLOADED_BYTES), Util::formatBytes(u->getPos()).c_str(),
(double)u->getPos()*100.0/(double)u->getSize(), Util::formatSeconds((GET_TICK() - u->getStart())/1000).c_str());
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = buf;
i->columns[COLUMN_TIMELEFT] = Util::formatSeconds(u->getSecondsLeft());
i->columns[COLUMN_SPEED] = Util::formatBytes(u->getAverageSpeed()) + "/s";
v->push_back(i);
}
}
delete[] buf;
PostMessage(WM_SPEAKER, SET_TEXTS, (LPARAM)v);
}
void MainFrame::onUploadComplete(Upload* aUpload) {
ConnectionQueueItem* aCqi = aUpload->getUserConnection()->getCQI();
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
ii->status = ItemInfo::STATUS_WAITING;
ii->pos = 0;
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = STRING(UPLOAD_FINISHED_IDLE);
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onDownloadComplete(Download* p) {
ConnectionQueueItem* aCqi = p->getUserConnection()->getCQI();
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
ii->status = ItemInfo::STATUS_WAITING;
ii->pos = 0;
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = STRING(DOWNLOAD_FINISHED_IDLE);
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onDownloadFailed(Download* aDownload, const string& aReason) {
ConnectionQueueItem* aCqi = aDownload->getUserConnection()->getCQI();
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
ii->status = ItemInfo::STATUS_WAITING;
ii->pos = 0;
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = aReason;
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onDownloadStarting(Download* aDownload) {
ConnectionQueueItem* aCqi = aDownload->getUserConnection()->getCQI();
ItemInfo* ii;
{
Lock l(cs);
dcassert(transferItems.find(aCqi) != transferItems.end());
ii = transferItems[aCqi];
}
ii->status = ItemInfo::STATUS_RUNNING;
ii->pos = 0;
ii->size = aDownload->getSize();
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_FILE] = Util::getFileName(aDownload->getTarget());
i->columns[COLUMN_PATH] = Util::getFilePath(aDownload->getTarget());
i->columns[COLUMN_STATUS] = STRING(DOWNLOAD_STARTING);
i->columns[COLUMN_SIZE] = Util::formatBytes(aDownload->getSize());
PostMessage(WM_SPEAKER, SET_TEXT, (LPARAM)i);
}
void MainFrame::onDownloadTick(const Download::List& dl) {
vector<StringListInfo*>* v = new vector<StringListInfo*>();
v->reserve(dl.size());
char* buf = new char[STRING(DOWNLOADED_BYTES).size() + 64];
{
Lock l(cs);
for(Download::List::const_iterator j = dl.begin(); j != dl.end(); ++j) {
Download* d = *j;
sprintf(buf, CSTRING(DOWNLOADED_BYTES), Util::formatBytes(d->getPos()).c_str(),
(double)d->getPos()*100.0/(double)d->getSize(), Util::formatSeconds((GET_TICK()-d->getStart())/1000));
ConnectionQueueItem* aCqi = d->getUserConnection()->getCQI();
ItemInfo* ii = transferItems[aCqi];
ii->pos = d->getPos();
ii->timeLeft = d->getSecondsLeft();
ii->speed = d->getAverageSpeed();
StringListInfo* i = new StringListInfo((LPARAM)ii);
i->columns[COLUMN_STATUS] = buf;
i->columns[COLUMN_TIMELEFT] = Util::formatSeconds(d->getSecondsLeft());
i->columns[COLUMN_SPEED] = Util::formatBytes(d->getAverageSpeed()) + "/s";
v->push_back(i);
}
}
delete[] buf;
PostMessage(WM_SPEAKER, SET_TEXTS, (LPARAM)v);
}
void MainFrame::parseCommandLine(const string& cmdLine)
{
string::size_type i = 0;
string::size_type j;
if( (j = cmdLine.find("dchub://", i)) != string::npos) {
i = j + 8;
string server;
string user;
if( (j = cmdLine.find('/', i)) == string::npos) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -