📄 uploadmanager.cpp
字号:
if(z) {
u->setFile(new FilteredInputStream<ZFilter, true>(u->getFile()));
u->setFlag(Upload::FLAG_ZUPLOAD);
}
aSource->sending(aBytes);
aSource->setState(UserConnection::STATE_DONE);
aSource->transmitFile(u->getFile());
fire(UploadManagerListener::Starting(), u);
}
}
}
void UploadManager::on(UserConnectionListener::Send, UserConnection* aSource) throw() {
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());
fire(UploadManagerListener::Starting(), u);
}
void UploadManager::on(UserConnectionListener::BytesSent, UserConnection* aSource, size_t aBytes, size_t aActual) throw() {
dcassert(aSource->getState() == UserConnection::STATE_DONE);
Upload* u = aSource->getUpload();
dcassert(u != NULL);
u->addPos(aBytes, aActual);
}
void UploadManager::on(UserConnectionListener::Failed, UserConnection* aSource, const string& aError) throw() {
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::on(UserConnectionListener::TransmitDone, UserConnection* aSource) throw() {
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) && !u->isSet(Upload::FLAG_TTH_LEAVES) && (BOOLSETTING(LOG_FILELIST_TRANSFERS) || !u->isSet(Upload::FLAG_USER_LIST))) {
StringMap params;
params["source"] = u->getFileName();
params["userNI"] = Util::toString(ClientManager::getInstance()->getNicks(aSource->getUser()->getCID()));
params["userI4"] = aSource->getRemoteIp();
StringList hubNames = ClientManager::getInstance()->getHubNames(aSource->getUser()->getCID());
if(hubNames.empty())
hubNames.push_back(STRING(OFFLINE));
params["hub"] = Util::toString(hubNames);
StringList hubs = ClientManager::getInstance()->getHubs(aSource->getUser()->getCID());
if(hubs.empty())
hubs.push_back(STRING(OFFLINE));
params["hubURL"] = Util::toString(hubs);
params["fileSI"] = Util::toString(u->getSize());
params["fileSIshort"] = Util::formatBytes(u->getSize());
params["fileSIchunk"] = Util::toString(u->getTotal());
params["fileSIchunkshort"] = Util::formatBytes(u->getTotal());
params["fileSIactual"] = Util::toString(u->getActual());
params["fileSIactualshort"] = Util::formatBytes(u->getActual());
params["speed"] = Util::formatBytes(u->getAverageSpeed()) + "/s";
params["time"] = Util::formatSeconds((GET_TICK() - u->getStart()) / 1000);
if(u->getTTH() != NULL) {
params["tth"] = u->getTTH()->toBase32();
}
LOG(LogManager::UPLOAD, params);
}
fire(UploadManagerListener::Complete(), u);
removeUpload(u);
}
void UploadManager::addFailedUpload(UserConnection::Ptr source, string filename) {
{
Lock l(cs);
if (!count_if(waitingUsers.begin(), waitingUsers.end(), UserMatch(source->getUser())))
waitingUsers.push_back(WaitingUser(source->getUser(), GET_TICK()));
waitingFiles[source->getUser()].insert(filename); //files for which user's asked
}
fire(UploadManagerListener::WaitingAddFile(), source->getUser(), filename);
}
void UploadManager::clearUserFiles(const User::Ptr& source) {
Lock l(cs);
//run this when a user's got a slot or goes offline.
UserDeque::iterator sit = find_if(waitingUsers.begin(), waitingUsers.end(), UserMatch(source));
if (sit == waitingUsers.end()) return;
FilesMap::iterator fit = waitingFiles.find(sit->first);
if (fit != waitingFiles.end()) waitingFiles.erase(fit);
fire(UploadManagerListener::WaitingRemoveUser(), sit->first);
waitingUsers.erase(sit);
}
vector<User::Ptr> UploadManager::getWaitingUsers() {
Lock l(cs);
vector<User::Ptr> u;
transform(waitingUsers.begin(), waitingUsers.end(), back_inserter(u), select1st<WaitingUser>());
return u;
}
const UploadManager::FileSet& UploadManager::getWaitingUserFiles(const User::Ptr &u) {
Lock l(cs);
return waitingFiles.find(u)->second;
}
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);
}
}
void UploadManager::on(TimerManagerListener::Minute, u_int32_t /* aTick */) throw() {
Lock l(cs);
UserDeque::iterator i = stable_partition(waitingUsers.begin(), waitingUsers.end(), WaitingUserFresh());
for (UserDeque::iterator j = i; j != waitingUsers.end(); ++j) {
FilesMap::iterator fit = waitingFiles.find(j->first);
if (fit != waitingFiles.end()) waitingFiles.erase(fit);
fire(UploadManagerListener::WaitingRemoveUser(), j->first);
}
waitingUsers.erase(i, waitingUsers.end());
}
void UploadManager::on(GetListLength, UserConnection* conn) throw() {
conn->listLen("42");
}
void UploadManager::on(AdcCommand::GET, UserConnection* aSource, const AdcCommand& c) throw() {
int64_t aBytes = Util::toInt64(c.getParam(3));
int64_t aStartPos = Util::toInt64(c.getParam(2));
const string& fname = c.getParam(1);
const string& type = c.getParam(0);
string tmp;
if(prepareFile(aSource, type, fname, aStartPos, aBytes, c.hasFlag("RE", 4))) {
Upload* u = aSource->getUpload();
dcassert(u != NULL);
if(aBytes == -1)
aBytes = u->getSize() - aStartPos;
dcassert(aBytes >= 0);
u->setStart(GET_TICK());
AdcCommand cmd(AdcCommand::CMD_SND);
cmd.addParam(c.getParam(0));
cmd.addParam(c.getParam(1));
cmd.addParam(Util::toString(u->getPos()));
cmd.addParam(Util::toString(u->getSize() - u->getPos()));
if(c.hasFlag("ZL", 4)) {
u->setFile(new FilteredInputStream<ZFilter, true>(u->getFile()));
u->setFlag(Upload::FLAG_ZUPLOAD);
cmd.addParam("ZL1");
}
aSource->send(cmd);
aSource->setState(UserConnection::STATE_DONE);
aSource->transmitFile(u->getFile());
fire(UploadManagerListener::Starting(), u);
}
}
void UploadManager::on(AdcCommand::GFI, UserConnection* aSource, const AdcCommand& c) throw() {
if(c.getParameters().size() < 2) {
aSource->send(AdcCommand(AdcCommand::SEV_RECOVERABLE, AdcCommand::ERROR_PROTOCOL_GENERIC, "Missing parameters"));
return;
}
const string& type = c.getParam(0);
const string& ident = c.getParam(1);
if(type == "file") {
SearchResult::List l;
StringList sl;
if(ident.compare(0, 4, "TTH/") != 0) {
aSource->send(AdcCommand(AdcCommand::SEV_RECOVERABLE, AdcCommand::ERROR_PROTOCOL_GENERIC, "Invalid identifier"));
return;
}
sl.push_back("TH" + ident.substr(4));
ShareManager::getInstance()->search(l, sl, 1);
if(l.empty()) {
aSource->send(AdcCommand(AdcCommand::SEV_RECOVERABLE, AdcCommand::ERROR_FILE_NOT_AVAILABLE, "Not found"));
} else {
aSource->send(l[0]->toRES(AdcCommand::TYPE_CLIENT));
l[0]->decRef();
}
}
}
// TimerManagerListener
void UploadManager::on(TimerManagerListener::Second, u_int32_t) throw() {
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);
}
void UploadManager::on(ClientManagerListener::UserDisconnected, const User::Ptr& aUser) throw() {
/// @todo Don't kick when /me disconnects
if( BOOLSETTING(AUTO_KICK) && !(BOOLSETTING(AUTO_KICK_NO_FAVS) && FavoriteManager::getInstance()->isFavoriteUser(aUser)) ) {
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(true);
// But let's grant him/her a free slot just in case...
if (!u->getUserConnection()->isSet(UserConnection::FLAG_HASEXTRASLOT))
reserveSlot(aUser);
LogManager::getInstance()->message(STRING(DISCONNECTED_USER) + Util::toString(ClientManager::getInstance()->getNicks(aUser->getCID())));
}
}
}
//Remove references to them.
if(!aUser->isOnline()) {
clearUserFiles(aUser);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -