You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

feiqmodel.cpp 3.2 kB

8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "feiqmodel.h"
  2. #include <functional>
  3. FeiqModel::FeiqModel()
  4. {
  5. }
  6. void FeiqModel::addFellow(shared_ptr<Fellow> fellow)
  7. {
  8. lock_guard<mutex> guard(mFellowLock);
  9. mFellows.push_back(fellow);
  10. }
  11. shared_ptr<Fellow> FeiqModel::getFullInfoOf(shared_ptr<Fellow> fellow)
  12. {
  13. lock_guard<mutex> guard(mFellowLock);
  14. auto predict = [&fellow](shared_ptr<Fellow> tmp){return fellow->isSame(*tmp);};
  15. auto found = std::find_if(mFellows.begin(), mFellows.end(), predict);
  16. return found == mFellows.end() ? nullptr : *found;
  17. }
  18. shared_ptr<Fellow> FeiqModel::findFirstFellowOf(const string &ip)
  19. {
  20. lock_guard<mutex> guard(mFellowLock);
  21. auto predict = [&ip](shared_ptr<Fellow> tmp){return tmp->getIp() == ip;};
  22. auto found = std::find_if(mFellows.begin(), mFellows.end(), predict);
  23. return found == mFellows.end() ? nullptr : *found;
  24. }
  25. list<shared_ptr<Fellow> > FeiqModel::searchFellow(const string &text)
  26. {
  27. lock_guard<mutex> guard(mFellowLock);
  28. list<shared_ptr<Fellow>> fellows;
  29. if (text.empty())
  30. {
  31. fellows = mFellows;
  32. }
  33. else
  34. {
  35. for (shared_ptr<Fellow> fellow : mFellows)
  36. {
  37. if (fellow->getName().find(text) != string::npos
  38. || fellow->getHost().find(text) != string::npos
  39. || fellow->getIp().find(text) != string::npos)
  40. fellows.push_back(fellow);
  41. }
  42. }
  43. return fellows;
  44. }
  45. shared_ptr<Fellow> FeiqModel::getShared(const Fellow *fellow)
  46. {
  47. if (fellow == nullptr)
  48. return nullptr;
  49. lock_guard<mutex> guard(mFellowLock);
  50. for (shared_ptr<Fellow> f : mFellows)
  51. {
  52. if (f.get() == fellow)
  53. return f;
  54. }
  55. return nullptr;
  56. }
  57. shared_ptr<FileTask> FeiqModel::addDownloadTask(shared_ptr<Fellow> fellow, shared_ptr<FileContent> fileContent)
  58. {
  59. lock_guard<mutex> guard(mFileTaskLock);
  60. auto task = make_shared<FileTask>(fileContent, FileTaskType::Download);
  61. task->setFellow(fellow);
  62. mFileTasks.push_back(task);
  63. return task;
  64. }
  65. shared_ptr<FileTask> FeiqModel::addUploadTask(shared_ptr<Fellow> fellow, shared_ptr<FileContent> fileContent)
  66. {
  67. lock_guard<mutex> guard(mFileTaskLock);
  68. auto task = make_shared<FileTask>(fileContent, FileTaskType::Upload);
  69. task->setFellow(fellow);
  70. mFileTasks.push_back(task);
  71. return task;
  72. }
  73. void FeiqModel::removeFileTask(function<bool (const FileTask&)> predict)
  74. {
  75. lock_guard<mutex> g(mFileTaskLock);
  76. mFileTasks.remove_if([predict](shared_ptr<FileTask> t){
  77. return predict(*t);
  78. });
  79. }
  80. shared_ptr<FileTask> FeiqModel::findTask(IdType packetNo, IdType fileId, FileTaskType type)
  81. {
  82. lock_guard<mutex> g(mFileTaskLock);
  83. for (auto task : mFileTasks) {
  84. if (task->type() != type)
  85. continue;
  86. auto content = task->getContent();
  87. if (content->fileId == fileId && content->packetNo == packetNo)
  88. return task;
  89. }
  90. return nullptr;
  91. }
  92. list<shared_ptr<FileTask> > FeiqModel::searchTask(function<bool (const FileTask &)> predict)
  93. {
  94. lock_guard<mutex> g(mFileTaskLock);
  95. list<shared_ptr<FileTask>> allTask;
  96. for (auto task : mFileTasks)
  97. if (predict(*(task.get())))
  98. allTask.push_back(task);
  99. return allTask;
  100. }

mac下的“飞秋”大多数只是飞鸽传书协议,而且未发现令人满意的开源项目,所以基于c++与qt实现了基础的飞秋协议。

Contributors (1)