#pragma once class File; class StatsCounter; class User; class File; class Stat; class StatsSyncher { private: static const int SAVE_INTERVAL = 20 * 5; static const int SEND_INTERVAL = 20 * 60; volatile bool busy; volatile std::unordered_map *serverStats; volatile std::unordered_map *failedSentStats; StatsCounter *statsCounter; File *unsentFile, *lastServerFile; File *unsentFileTmp, *lastServerFileTmp; File *unsentFileOld, *lastServerFileOld; User *user; int noSaveIn, noSendIn; public: StatsSyncher(User *user, StatsCounter *statsCounter, File *dir); private: void attemptRename(File *dir, const std::wstring& name, File *to); std::unordered_map *loadStatsFromDisk(File *file, File *tmp, File *old); std::unordered_map *loadStatsFromDisk(File *file); void doSend(std::unordered_map *stats); void doSave(std::unordered_map *stats, File *file, File *tmp, File *old); protected: std::unordered_map *doGetStats(); public: void getStatsFromServer(); void saveUnsent(std::unordered_map *stats); void sendUnsent(std::unordered_map *stats, std::unordered_map *fullStats); void forceSendUnsent(std::unordered_map *stats); void forceSaveUnsent(std::unordered_map *stats); bool maySave(); bool maySend(); void tick(); };