#include "feiqmodel.h" #include FeiqModel::FeiqModel() { } void FeiqModel::addFellow(shared_ptr fellow) { lock_guard guard(mFellowLock); mFellows.push_back(fellow); } shared_ptr FeiqModel::getFullInfoOf(shared_ptr fellow) { lock_guard guard(mFellowLock); auto predict = [&fellow](shared_ptr tmp){return fellow->isSame(*tmp);}; auto found = std::find_if(mFellows.begin(), mFellows.end(), predict); return found == mFellows.end() ? nullptr : *found; } shared_ptr FeiqModel::findFirstFellowOf(const string &ip) { lock_guard guard(mFellowLock); auto predict = [&ip](shared_ptr tmp){return tmp->getIp() == ip;}; auto found = std::find_if(mFellows.begin(), mFellows.end(), predict); return found == mFellows.end() ? nullptr : *found; } list > FeiqModel::searchFellow(const string &text) { lock_guard guard(mFellowLock); list> fellows; if (text.empty()) { fellows = mFellows; } else { for (shared_ptr fellow : mFellows) { if (fellow->getName().find(text) != string::npos || fellow->getHost().find(text) != string::npos || fellow->getIp().find(text) != string::npos) fellows.push_back(fellow); } } return fellows; } shared_ptr FeiqModel::getShared(const Fellow *fellow) { if (fellow == nullptr) return nullptr; lock_guard guard(mFellowLock); for (shared_ptr f : mFellows) { if (f.get() == fellow) return f; } return nullptr; } shared_ptr FeiqModel::addDownloadTask(shared_ptr fellow, shared_ptr fileContent) { lock_guard guard(mFileTaskLock); auto task = make_shared(fileContent, FileTaskType::Download); task->setFellow(fellow); mFileTasks.push_back(task); return task; } shared_ptr FeiqModel::addUploadTask(shared_ptr fellow, shared_ptr fileContent) { lock_guard guard(mFileTaskLock); auto task = make_shared(fileContent, FileTaskType::Upload); task->setFellow(fellow); mFileTasks.push_back(task); return task; } void FeiqModel::removeFileTask(function predict) { lock_guard g(mFileTaskLock); mFileTasks.remove_if([predict](shared_ptr t){ return predict(*t); }); } shared_ptr FeiqModel::findTask(IdType packetNo, IdType fileId, FileTaskType type) { lock_guard g(mFileTaskLock); for (auto task : mFileTasks) { if (task->type() != type) continue; auto content = task->getContent(); if (content->fileId == fileId && content->packetNo == packetNo) return task; } return nullptr; } list > FeiqModel::searchTask(function predict) { lock_guard g(mFileTaskLock); list> allTask; for (auto task : mFileTasks) if (predict(*(task.get()))) allTask.push_back(task); return allTask; }