亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? uploadmanager.cpp

?? dc++(一個(gè)曾經(jīng)大量使用的p2p)的源代碼,dc++,開(kāi)源的p2p源代碼
?? CPP
字號(hào):
/* 
 * Copyright (C) 2001-2003 Jacek Sieka, j_s@telia.com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "stdinc.h"
#include "DCPlusPlus.h"

#include "UploadManager.h"
#include "ConnectionManager.h"
#include "LogManager.h"
#include "ShareManager.h"
#include "ClientManager.h"

UploadManager* Singleton<UploadManager>::instance = NULL;

static const string UPLOAD_AREA = "Uploads";

UploadManager::UploadManager() throw() : running(0), extra(0), lastAutoGrant(0) { 
	ClientManager::getInstance()->addListener(this);
	TimerManager::getInstance()->addListener(this);
};

UploadManager::~UploadManager() throw() {
	ClientManager::getInstance()->addListener(this);
	TimerManager::getInstance()->removeListener(this);
	while(true) {
		{
			Lock l(cs);
			if(uploads.empty())
				break;
		}
		Thread::sleep(100);
	}
}

bool UploadManager::prepareFile(UserConnection* aSource, const string& aFile, int64_t aResume) {
	if(aSource->getState() != UserConnection::STATE_GET) {
		dcdebug("UM:onGet Wrong state, ignoring\n");
		return false;
	}
	
	Upload* u;
	dcassert(aFile.size() > 0);
	
	bool userlist = false;
	bool smallfile = false;

	string file;
	try {
		file = ShareManager::getInstance()->translateFileName(aFile);
	} catch(const ShareException&) {
		aSource->error("File Not Available");
		return false;
	}
	
	if( (Util::stricmp(aFile.c_str(), "MyList.bz2") == 0) ) {
		userlist = true;
	}

	if( File::getSize(file) < (int64_t)(16 * 1024) ) {
		smallfile = true;
	}

	cs.enter();
	SlotIter ui = reservedSlots.find(aSource->getUser());

	if( (!aSource->isSet(UserConnection::FLAG_HASSLOT)) && 
		(getFreeSlots()<=0) && 
		(ui == reservedSlots.end()) ) 
	{
		dcdebug("Average speed: %s/s\n", Util::formatBytes(UploadManager::getInstance()->getAverageSpeed()).c_str());
		if( ((getLastAutoGrant() + 30*1000) > GET_TICK()) || (SETTING(MIN_UPLOAD_SPEED) == 0) || ( (SETTING(MIN_UPLOAD_SPEED)*1024) < UploadManager::getInstance()->getAverageSpeed() ) ) {
			if( !(smallfile || userlist) ||
				!(aSource->isSet(UserConnection::FLAG_HASEXTRASLOT) || (getFreeExtraSlots() > 0) || (aSource->getUser()->isSet(User::OP)) ) || 
				!(aSource->getUser()->isSet(User::DCPLUSPLUS)) 
				) 
			{

				cs.leave();
				aSource->maxedOut();
				removeConnection(aSource);
				return false;
			}
		}
		setLastAutoGrant(GET_TICK());
	}

	File* f;
	try {
		f = new File(file, File::READ, File::OPEN);
	} catch(const FileException&) {
		// Why isn't this possible?...let's reload the directory listing...
		if(Util::stricmp(aFile.c_str(), "MyList.DcLst") == 0 || userlist) {
			
			ShareManager::getInstance()->refresh(true, true, true);
			try {
				f = new File(file, File::READ, File::OPEN);
			} catch(const FileException&) {
				// Still not...very strange...?
				cs.leave();
				aSource->error("File Not Available");
				return false;
			}
		} else {
			cs.leave();
			aSource->error("File Not Available");
			return false;
		}
	}
	
	u = new Upload();
	u->setUserConnection(aSource);
	u->setFile(f);
	u->setSize(f->getSize());
	u->setPos(aResume, true);
	u->setFileName(aFile);
	u->setLocalFileName(file);

	if(smallfile)
		u->setFlag(Upload::SMALL_FILE);
	if(userlist)
		u->setFlag(Upload::USER_LIST);

	dcassert(aSource->getUpload() == NULL);
	aSource->setUpload(u);
	uploads.push_back(u);
	if(!aSource->isSet(UserConnection::FLAG_HASSLOT)) {
		if(ui != reservedSlots.end()) {
			aSource->setFlag(UserConnection::FLAG_HASSLOT);
			running++;
			reservedSlots.erase(ui);
		} else {
			if( (getFreeSlots() == 0) && (smallfile || userlist)) {
				if(!aSource->isSet(UserConnection::FLAG_HASEXTRASLOT)) {
					extra++;
					aSource->setFlag(UserConnection::FLAG_HASEXTRASLOT);
				}
			} else {
				running++;
				aSource->setFlag(UserConnection::FLAG_HASSLOT);
			}
		}
	}
	
	if(aSource->isSet(UserConnection::FLAG_HASEXTRASLOT) && aSource->isSet(UserConnection::FLAG_HASSLOT)) {
		extra--;
		aSource->unsetFlag(UserConnection::FLAG_HASEXTRASLOT);
	}
	
	cs.leave();
	return true;

}

void UploadManager::onGet(UserConnection* aSource, const string& aFile, int64_t aResume) {
	if(prepareFile(aSource, aFile, aResume)) {
		aSource->setState(UserConnection::STATE_SEND);
		aSource->fileLength(Util::toString(aSource->getUpload()->getSize()));
	}
}

void UploadManager::onGetZBlock(UserConnection* aSource, const string& aFile, int64_t aResume, int64_t aBytes) {
	if(prepareFile(aSource, aFile, aResume)) {
		Upload* u = aSource->getUpload();
		dcassert(u != NULL);
		
		u->setStart(GET_TICK());
		aSource->sending();
		aSource->setState(UserConnection::STATE_DONE);
		aSource->transmitFile(u->getFile(), aBytes, true);
		fire(UploadManagerListener::STARTING, u);
	}
}

void UploadManager::onSend(UserConnection* aSource) {
	if(aSource->getState() != UserConnection::STATE_SEND) {
		dcdebug("UM::onSend Bad state, ignoring\n");
		return;
	}

	Upload* u = aSource->getUpload();
	dcassert(u != NULL);

	u->setStart(GET_TICK());
	aSource->setState(UserConnection::STATE_DONE);
	aSource->transmitFile(u->getFile(), u->getSize() - u->getPos());
	fire(UploadManagerListener::STARTING, u);
}

void UploadManager::onBytesSent(UserConnection* aSource, u_int32_t aBytes) {
	dcassert(aSource->getState() == UserConnection::STATE_DONE);
	Upload* u = aSource->getUpload();
	dcassert(u != NULL);
	u->addPos(aBytes);
}

void UploadManager::onFailed(UserConnection* aSource, const string& aError) {
	Upload* u = aSource->getUpload();

	if(u) {
		aSource->setUpload(NULL);
		fire(UploadManagerListener::FAILED, u, aError);

		dcdebug("UM::onFailed: Removing upload\n");
		removeUpload(u);
	}

	removeConnection(aSource);
}

void UploadManager::onTransmitDone(UserConnection* aSource) {
	dcassert(aSource->getState() == UserConnection::STATE_DONE);
	Upload* u = aSource->getUpload();
	dcassert(u != NULL);

	aSource->setUpload(NULL);
	aSource->setState(UserConnection::STATE_GET);

	if(BOOLSETTING(LOG_UPLOADS)) {
		StringMap params;
		params["source"] = u->getFileName();
		params["user"] = aSource->getUser()->getNick();
		params["hub"] = aSource->getUser()->getLastHubName();
		params["hubip"] = aSource->getUser()->getLastHubIp();
		params["size"] = Util::toString(u->getSize());
		params["sizeshort"] = Util::formatBytes(u->getSize());
		params["chunksize"] = Util::toString(u->getTotal());
		params["chunksizeshort"] = Util::formatBytes(u->getTotal());
		params["speed"] = Util::formatBytes(u->getAverageSpeed()) + "/s";
		params["time"] = Util::formatSeconds((GET_TICK() - u->getStart()) / 1000);
		LOG(UPLOAD_AREA, Util::formatParams(SETTING(LOG_FORMAT_POST_UPLOAD), params));
	}

	fire(UploadManagerListener::COMPLETE, u);
	removeUpload(u);
}

void UploadManager::removeConnection(UserConnection::Ptr aConn) {
	dcassert(aConn->getUpload() == NULL);
	aConn->removeListener(this);
	if(aConn->isSet(UserConnection::FLAG_HASSLOT)) {
		running--;
		aConn->unsetFlag(UserConnection::FLAG_HASSLOT);
	} 
	if(aConn->isSet(UserConnection::FLAG_HASEXTRASLOT)) {
		extra--;
		aConn->unsetFlag(UserConnection::FLAG_HASEXTRASLOT);
	}
	ConnectionManager::getInstance()->putUploadConnection(aConn);
}

void UploadManager::onTimerMinute(u_int32_t aTick) {
	Lock l(cs);
	for(SlotIter j = reservedSlots.begin(); j != reservedSlots.end();) {
		if(j->second + 600 * 1000 < aTick) {
			reservedSlots.erase(j++);
		} else {
			++j;
		}
	}
}	

// TimerManagerListener
void UploadManager::onAction(TimerManagerListener::Types type, u_int32_t aTick) throw() {
	switch(type) {
	case TimerManagerListener::SECOND: 
		{
			Lock l(cs);
			Upload::List ticks;
			
			for(Upload::Iter i = uploads.begin(); i != uploads.end(); ++i) {
				ticks.push_back(*i);
			}
			
			if(ticks.size() > 0)
				fire(UploadManagerListener::TICK, ticks);
		}
		break;
	case TimerManagerListener::MINUTE: onTimerMinute(aTick);	break;
		break;
	}
}

void UploadManager::onAction(ClientManagerListener::Types type, const User::Ptr& aUser) throw() {
	if( (type == ClientManagerListener::USER_UPDATED) && 
		(!aUser->isOnline()) && 
		(aUser->isSet(User::QUIT_HUB)) && 
		(BOOLSETTING(AUTO_KICK)) ){

		Lock l(cs);
		for(Upload::Iter i = uploads.begin(); i != uploads.end(); ++i) {
			Upload* u = *i;
			if(u->getUser() == aUser) {
				// Oops...adios...
				u->getUserConnection()->disconnect();
				// But let's grant him/her a free slot just in case...
				if (!u->getUserConnection()->isSet(UserConnection::FLAG_HASEXTRASLOT))
					reserveSlot(aUser);
			}
		}
	}
}


// UserConnectionListener
void UploadManager::onAction(UserConnectionListener::Types type, UserConnection* conn) throw() {
	switch(type) {
	case UserConnectionListener::TRANSMIT_DONE:
		onTransmitDone(conn); break;
	case UserConnectionListener::SEND:
		onSend(conn); break;
	case UserConnectionListener::GET_LIST_LENGTH:
		conn->listLen(ShareManager::getInstance()->getListLenString()); break;
	default: 
		break;
	}
}
void UploadManager::onAction(UserConnectionListener::Types type, UserConnection* conn, u_int32_t bytes) throw() {
	switch(type) {
	case UserConnectionListener::BYTES_SENT:
		onBytesSent(conn, bytes); break;
	default: 
		break;
	}
}
void UploadManager::onAction(UserConnectionListener::Types type, UserConnection* conn, const string& line) throw() {
	switch(type) {
	case UserConnectionListener::FAILED:
		onFailed(conn, line); break;
	default: 
		break;
	}
}
void UploadManager::onAction(UserConnectionListener::Types type, UserConnection* conn, const string& line, int64_t resume) throw() {
	switch(type) {
	case UserConnectionListener::GET:
		onGet(conn, line, resume); break;
	default: 
		break;
	}
}

void UploadManager::onAction(UserConnectionListener::Types type, UserConnection* conn, const string& line, int64_t resume, int64_t bytes) throw() {
	switch(type) {
	case UserConnectionListener::GET_ZBLOCK:
		onGetZBlock(conn, line, resume, bytes); break;
	default: 
		break;
	}
}

/**
 * @file
 * $Id: UploadManager.cpp,v 1.39 2003/05/13 11:34:07 arnetheduck Exp $
 */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级蜜桃2在线观看| 欧美成人一区二区三区 | 亚洲午夜私人影院| 国产网站一区二区三区| 欧美色国产精品| 99久久精品国产一区二区三区| 美女在线观看视频一区二区| 亚洲精品国产一区二区精华液| 国产亚洲欧美色| 欧美一区三区四区| 欧美午夜精品久久久久久超碰 | 国产日韩v精品一区二区| 欧美日韩精品高清| 91在线porny国产在线看| 久久国产人妖系列| 亚洲午夜电影网| 亚洲丝袜美腿综合| 国产精品色噜噜| 国产午夜亚洲精品理论片色戒| 欧美一区二区精美| 欧美乱熟臀69xxxxxx| 91在线免费看| 99国产精品一区| 99久久精品免费观看| 大尺度一区二区| 高清av一区二区| 国产精品888| 国产一区二区成人久久免费影院| 麻豆精品在线看| 美女任你摸久久| 色噜噜久久综合| 99久久免费精品| 91天堂素人约啪| 99re这里只有精品视频首页| 成人av电影免费观看| 成人黄色软件下载| 99久久久国产精品| 色哟哟日韩精品| 日本精品一区二区三区四区的功能| av电影天堂一区二区在线| caoporn国产一区二区| 99re66热这里只有精品3直播| 99国产精品久久久久久久久久 | 亚洲欧美国产毛片在线| 18成人在线视频| 依依成人综合视频| 亚洲午夜国产一区99re久久| 亚洲福中文字幕伊人影院| 五月婷婷另类国产| 久久精品国产亚洲aⅴ| 黄一区二区三区| 丰满白嫩尤物一区二区| 91亚洲精品久久久蜜桃网站| 在线精品视频免费播放| 亚洲国产cao| 奇米综合一区二区三区精品视频| 精品一区二区三区视频在线观看| 国产美女精品在线| 白白色亚洲国产精品| 日本高清不卡一区| 欧美一级夜夜爽| 国产欧美日韩一区二区三区在线观看| 中文字幕永久在线不卡| 亚洲与欧洲av电影| 久久99热国产| 97精品久久久午夜一区二区三区| 欧美在线观看视频一区二区| 日韩欧美一级特黄在线播放| 国产亚洲精品精华液| 中文字幕一区二区三区不卡| 图片区日韩欧美亚洲| 精品影院一区二区久久久| 99久久er热在这里只有精品15 | 国内成人自拍视频| 成人一区二区在线观看| 欧美日韩一区二区在线观看视频| 精品日韩一区二区三区免费视频| 国产一区二区h| 91久久精品一区二区三| 日韩精品一区国产麻豆| 亚洲欧美影音先锋| 青青草原综合久久大伊人精品| 成人在线一区二区三区| 欧美午夜寂寞影院| 国产亚洲成年网址在线观看| 亚洲第一久久影院| 国产精品一区二区91| 欧美图区在线视频| 日本一区二区三区四区| 日本伊人色综合网| 91麻豆免费在线观看| 日韩欧美三级在线| 亚洲精品中文字幕乱码三区| 国产一区二区不卡老阿姨| 欧美日韩中文一区| 国产精品美女www爽爽爽| 蜜桃视频在线观看一区二区| 99re在线精品| 国产欧美精品一区| 美女网站在线免费欧美精品| 欧洲一区二区三区在线| 中文一区二区在线观看| 美女一区二区久久| 欧美群妇大交群中文字幕| 亚洲人成精品久久久久| 国产 日韩 欧美大片| 日韩视频免费观看高清在线视频| 亚洲另类色综合网站| 国产91精品一区二区麻豆网站| 日韩一区二区三区视频| 亚洲在线视频一区| 97精品国产露脸对白| 国产喷白浆一区二区三区| 蜜桃av一区二区在线观看| 欧美日韩一区高清| 亚洲精品国产a| 色综合久久天天| 国产精品无码永久免费888| 国产制服丝袜一区| 欧美xxxx老人做受| 老司机精品视频一区二区三区| 欧美日韩成人综合天天影院| 亚洲精品视频在线| 91小视频免费看| 亚洲毛片av在线| 色屁屁一区二区| 亚洲男帅同性gay1069| 99精品久久99久久久久| 最新热久久免费视频| 99久久免费国产| 亚洲女人的天堂| 欧洲一区二区三区免费视频| 一区二区三区免费观看| 欧洲一区在线电影| 婷婷一区二区三区| 欧美精品视频www在线观看| 午夜视频在线观看一区二区| 欧美日韩精品一区二区三区蜜桃| 亚洲国产成人av好男人在线观看| 欧美三级午夜理伦三级中视频| 亚洲国产中文字幕在线视频综合| 欧美日韩小视频| 免费成人你懂的| 精品欧美乱码久久久久久| 国内欧美视频一区二区| 国产欧美一二三区| 色噜噜久久综合| 日韩精品免费视频人成| 欧美成va人片在线观看| 国产在线乱码一区二区三区| 国产日本欧洲亚洲| 99久久精品国产麻豆演员表| 一区二区三区精品在线| 欧美狂野另类xxxxoooo| 美脚の诱脚舐め脚责91| 久久色中文字幕| av电影在线观看一区| 亚洲一区二区成人在线观看| 欧美高清精品3d| 国内精品写真在线观看| 国产精品麻豆网站| 欧美日韩高清在线| 韩国欧美一区二区| 亚洲欧美一区二区三区孕妇| 欧美日韩一二区| 国产美女主播视频一区| 亚洲三级电影网站| 欧美一级日韩一级| 成人高清视频在线观看| 亚洲va欧美va国产va天堂影院| 精品国精品国产| 色狠狠桃花综合| 精品一区二区免费在线观看| 亚洲欧洲精品成人久久奇米网| 欧美三级视频在线观看| 国产精品亚洲综合一区在线观看| 亚洲精品日韩一| 精品乱码亚洲一区二区不卡| 91论坛在线播放| 精品一区二区在线观看| 亚洲视频 欧洲视频| 精品欧美一区二区久久| 日本高清视频一区二区| 激情综合色播激情啊| 一区二区三区中文字幕| 久久综合色8888| 色婷婷综合五月| 国产精品一区免费视频| 午夜视频在线观看一区二区| 国产精品久久久久影院| 日韩免费观看2025年上映的电影| 99精品久久免费看蜜臀剧情介绍| 麻豆久久久久久| 亚洲国产一二三| 亚洲欧洲美洲综合色网| 久久久精品黄色| 日韩一级免费观看| 91福利国产精品| 成人18视频在线播放| 国产麻豆91精品|