summaryrefslogtreecommitdiff
path: root/src/shared/fileregister.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/fileregister.h')
-rw-r--r--src/shared/fileregister.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/shared/fileregister.h b/src/shared/fileregister.h
new file mode 100644
index 00000000..d5e360c1
--- /dev/null
+++ b/src/shared/fileregister.h
@@ -0,0 +1,58 @@
+#ifndef MO_REGISTER_FILESREGISTER_INCLUDED
+#define MO_REGISTER_FILESREGISTER_INCLUDED
+
+#include "fileregisterfwd.h"
+#include <mutex>
+#include <boost/shared_ptr.hpp>
+
+namespace MOShared
+{
+
+class FileRegister
+{
+public:
+ FileRegister(boost::shared_ptr<OriginConnection> originConnection);
+
+ // noncopyable
+ FileRegister(const FileRegister&) = delete;
+ FileRegister& operator=(const FileRegister&) = delete;
+
+ bool indexValid(FileIndex index) const;
+
+ FileEntryPtr createFile(
+ std::wstring name, DirectoryEntry *parent, DirectoryStats& stats);
+
+ FileEntryPtr getFile(FileIndex index) const;
+
+ size_t highestCount() const
+ {
+ std::scoped_lock lock(m_Mutex);
+ return m_Files.size();
+ }
+
+ void reserve(std::size_t n)
+ {
+ m_Files.reserve(n);
+ }
+
+ bool removeFile(FileIndex index);
+ void removeOrigin(FileIndex index, int originID);
+ void removeOriginMulti(std::set<FileIndex> indices, int originID);
+
+ void sortOrigins();
+
+private:
+ using FileMap = std::vector<FileEntryPtr>;
+
+ mutable std::mutex m_Mutex;
+ FileMap m_Files;
+ boost::shared_ptr<OriginConnection> m_OriginConnection;
+ std::atomic<FileIndex> m_NextIndex;
+
+ void unregisterFile(FileEntryPtr file);
+ FileIndex generateIndex();
+};
+
+} // namespace
+
+#endif // MO_REGISTER_FILESREGISTER_INCLUDED