DatStatus.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #ifndef LOTRO_DAT_LIBRARY_DATSTATUS_H
  2. #define LOTRO_DAT_LIBRARY_DATSTATUS_H
  3. #include <string>
  4. #include <functional>
  5. #include <set>
  6. namespace LOTRO_DAT {
  7. class DatFile;
  8. /*!
  9. * \brief Модуль статуса dat-файла
  10. * \author Gi1dor
  11. * \date 06.07.2018
  12. *
  13. * Класс для хранения информации о выполняемых процессах в dat-файле. Позволяет отслеживать прогресс выполнения
  14. * во время операций создания резервных копий, применения патчей или извлечения файлов
  15. *
  16. * \warning Объекты этого класса не должны создаваться отдельно! Созданием и управлением ими занимается класс DatFile
  17. */
  18. class DatStatus {
  19. public:
  20. enum DAT_STATUS: int {
  21. E_INITIALISING,
  22. E_EXTRACTING,
  23. E_PATCHING,
  24. E_COMMITING,
  25. E_BACKUP_CREATING,
  26. E_BACKUP_RESTORING,
  27. E_BACKUP_REMOVING,
  28. E_GATHERING_INFO,
  29. E_FREE
  30. };
  31. struct ProgressInfo {
  32. DAT_STATUS status;
  33. double percentage;
  34. unsigned long long finished_parts;
  35. unsigned long long total_parts;
  36. };
  37. using Callback = std::function<void(ProgressInfo)>;
  38. struct CallbackStorage{
  39. public:
  40. CallbackStorage(Callback function_handle) {
  41. func_ = function_handle;
  42. handler_ = free_handler_++;
  43. }
  44. CallbackStorage(unsigned long long handler) {
  45. func_ = nullptr;
  46. handler_ = handler;
  47. }
  48. unsigned long long GetHandler() const {
  49. return handler_;
  50. }
  51. bool operator<(const CallbackStorage& other) const {
  52. return handler_ < other.handler_;
  53. }
  54. bool operator==(const CallbackStorage& other) const {
  55. return handler_ == other.handler_;
  56. }
  57. template<class ... Types>
  58. void operator()(Types ... args) const {
  59. func_(args...);
  60. }
  61. private:
  62. Callback func_;
  63. unsigned long long handler_;
  64. static unsigned long long free_handler_;
  65. };
  66. DatStatus() = delete;
  67. DatStatus(const DatStatus &other) = delete;
  68. DatStatus &operator=(const DatStatus &other) = delete;
  69. ~DatStatus() = default;
  70. explicit DatStatus(DatFile *datFilePtr);
  71. void SetStatus(DAT_STATUS status);
  72. void SetFinishedParts(unsigned long long finished_parts);
  73. void SetTotalParts(unsigned long long total_parts);
  74. void SetDebugMessage(const std::string &message);
  75. DAT_STATUS GetStatus();
  76. double GetPercentage();
  77. unsigned long long GetFinishedParts();
  78. unsigned long long GetTotalParts();
  79. std::string GetDebugMessage();
  80. void SetDefaultStatus();
  81. bool CheckIfNotPatched();
  82. unsigned long long AddStatusChangedCallbackFunction(Callback func);
  83. void RemoveStatusChangedCallbackFunction(unsigned long long handler);
  84. void EraseAllCallbackFunctions();
  85. void InvokeCallbackFunctions();
  86. private:
  87. DatFile *dat = nullptr;
  88. DAT_STATUS status_ = DAT_STATUS::E_FREE;
  89. unsigned long long finished_parts_ = 0;
  90. unsigned long long total_parts_ = 0;
  91. double percentage_ = 0;
  92. std::string debug_message_ = "";
  93. std::set<CallbackStorage> callback_functions_;
  94. };
  95. }
  96. #endif //LOTRO_DAT_LIBRARY_DATSTATUS_H