-
Notifications
You must be signed in to change notification settings - Fork 89
Expand file tree
/
Copy pathfeiqmodel.cpp
More file actions
119 lines (100 loc) · 3.17 KB
/
feiqmodel.cpp
File metadata and controls
119 lines (100 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "feiqmodel.h"
#include <functional>
FeiqModel::FeiqModel()
{
}
void FeiqModel::addFellow(shared_ptr<Fellow> fellow)
{
lock_guard<mutex> guard(mFellowLock);
mFellows.push_back(fellow);
}
shared_ptr<Fellow> FeiqModel::getFullInfoOf(shared_ptr<Fellow> fellow)
{
lock_guard<mutex> guard(mFellowLock);
auto predict = [&fellow](shared_ptr<Fellow> tmp){return fellow->isSame(*tmp);};
auto found = std::find_if(mFellows.begin(), mFellows.end(), predict);
return found == mFellows.end() ? nullptr : *found;
}
shared_ptr<Fellow> FeiqModel::findFirstFellowOf(const string &ip)
{
lock_guard<mutex> guard(mFellowLock);
auto predict = [&ip](shared_ptr<Fellow> tmp){return tmp->getIp() == ip;};
auto found = std::find_if(mFellows.begin(), mFellows.end(), predict);
return found == mFellows.end() ? nullptr : *found;
}
list<shared_ptr<Fellow> > FeiqModel::searchFellow(const string &text)
{
lock_guard<mutex> guard(mFellowLock);
list<shared_ptr<Fellow>> fellows;
if (text.empty())
{
fellows = mFellows;
}
else
{
for (shared_ptr<Fellow> 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<Fellow> FeiqModel::getShared(const Fellow *fellow)
{
if (fellow == nullptr)
return nullptr;
lock_guard<mutex> guard(mFellowLock);
for (shared_ptr<Fellow> f : mFellows)
{
if (f.get() == fellow)
return f;
}
return nullptr;
}
shared_ptr<FileTask> FeiqModel::addDownloadTask(shared_ptr<Fellow> fellow, shared_ptr<FileContent> fileContent)
{
lock_guard<mutex> guard(mFileTaskLock);
auto task = make_shared<FileTask>(fileContent, FileTaskType::Download);
task->setFellow(fellow);
mFileTasks.push_back(task);
return task;
}
shared_ptr<FileTask> FeiqModel::addUploadTask(shared_ptr<Fellow> fellow, shared_ptr<FileContent> fileContent)
{
lock_guard<mutex> guard(mFileTaskLock);
auto task = make_shared<FileTask>(fileContent, FileTaskType::Upload);
task->setFellow(fellow);
mFileTasks.push_back(task);
return task;
}
void FeiqModel::removeFileTask(function<bool (const FileTask&)> predict)
{
lock_guard<mutex> g(mFileTaskLock);
mFileTasks.remove_if([predict](shared_ptr<FileTask> t){
return predict(*t);
});
}
shared_ptr<FileTask> FeiqModel::findTask(IdType packetNo, IdType fileId, FileTaskType type)
{
lock_guard<mutex> 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<shared_ptr<FileTask> > FeiqModel::searchTask(function<bool (const FileTask &)> predict)
{
lock_guard<mutex> g(mFileTaskLock);
list<shared_ptr<FileTask>> allTask;
for (auto task : mFileTasks)
if (predict(*(task.get())))
allTask.push_back(task);
return allTask;
}