Polyphase Game Engine
Loading...
Searching...
No Matches
FileWatcher.h
Go to the documentation of this file.
1#pragma once
2
3#include "EngineTypes.h"
4#include <string>
5#include <vector>
6#include <functional>
7#include <thread>
8#include <atomic>
9#include <unordered_map>
10#include <mutex>
11
12#if PLATFORM_WINDOWS
13#include <Windows.h>
14#endif
15
16enum class FileAction
17{
18 Added,
20 Removed,
22};
23
25{
26 std::string filePath;
28 std::string oldPath; // For rename events
29};
30
31using FileChangeCallback = std::function<void(const FileChangeEvent&)>;
32
34{
35public:
38
39 // Initialize the file watcher
40 bool Initialize();
41
42 // Shutdown the file watcher
43 void Shutdown();
44
45 // Add a directory to watch
46 bool WatchDirectory(const std::string& directory, bool recursive = true);
47
48 // Remove a directory from watching
49 void UnwatchDirectory(const std::string& directory);
50
51 // Set callback for file change events
53
54 // Update function to process events (called from main thread)
55 void Update();
56
57 // Enable/disable the file watcher
58 void SetEnabled(bool enabled);
59 bool IsEnabled() const { return mEnabled; }
60
61private:
62 void WatcherThread();
63 void ProcessEvents();
64
65#if PLATFORM_WINDOWS
66 struct WatchInfo
67 {
68 HANDLE directoryHandle;
69 OVERLAPPED overlapped;
70 char buffer[8192];
71 std::string path;
72 bool recursive;
73 };
74
75 std::vector<WatchInfo> mWatchInfos;
76 HANDLE mCompletionPort;
77#endif
78
79 std::thread mWatcherThread;
80 std::atomic<bool> mRunning;
81 std::atomic<bool> mEnabled;
82
83 FileChangeCallback mCallback;
84
85 std::vector<FileChangeEvent> mPendingEvents;
86 std::mutex mEventsMutex;
87
88 // Track last modification times to avoid duplicate events
89 std::unordered_map<std::string, uint64_t> mLastModifyTimes;
90};
91
92// Global file watcher instance
void CreateFileWatcher()
Definition FileWatcher.cpp:19
std::function< void(const FileChangeEvent &)> FileChangeCallback
Definition FileWatcher.h:31
FileWatcher * GetFileWatcher()
Definition FileWatcher.cpp:14
void DestroyFileWatcher()
Definition FileWatcher.cpp:27
FileAction
Definition FileWatcher.h:17
Definition FileWatcher.h:34
FileWatcher()
Definition FileWatcher.cpp:36
~FileWatcher()
Definition FileWatcher.cpp:45
void SetFileChangeCallback(FileChangeCallback callback)
Definition FileWatcher.cpp:201
void UnwatchDirectory(const std::string &directory)
Definition FileWatcher.cpp:186
void SetEnabled(bool enabled)
Definition FileWatcher.cpp:214
void Shutdown()
Definition FileWatcher.cpp:71
bool Initialize()
Definition FileWatcher.cpp:50
void Update()
Definition FileWatcher.cpp:206
bool IsEnabled() const
Definition FileWatcher.h:59
bool WatchDirectory(const std::string &directory, bool recursive=true)
Definition FileWatcher.cpp:110
Definition FileWatcher.h:25
std::string filePath
Definition FileWatcher.h:26
std::string oldPath
Definition FileWatcher.h:28
FileAction action
Definition FileWatcher.h:27