⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 p2p技术C源代码.rar
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -