mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-06-28 01:49:33 -06:00
Common: Add class 'FilesystemWatcher' that is used to watch paths and receive callbacks about filesystem level events for anything under that path
This commit is contained in:
@ -64,6 +64,8 @@ add_library(common
|
|||||||
FatFsUtil.h
|
FatFsUtil.h
|
||||||
FileSearch.cpp
|
FileSearch.cpp
|
||||||
FileSearch.h
|
FileSearch.h
|
||||||
|
FilesystemWatcher.cpp
|
||||||
|
FilesystemWatcher.h
|
||||||
FileUtil.cpp
|
FileUtil.cpp
|
||||||
FileUtil.h
|
FileUtil.h
|
||||||
FixedSizeQueue.h
|
FixedSizeQueue.h
|
||||||
@ -184,6 +186,7 @@ PRIVATE
|
|||||||
FatFs
|
FatFs
|
||||||
Iconv::Iconv
|
Iconv::Iconv
|
||||||
spng::spng
|
spng::spng
|
||||||
|
watcher
|
||||||
${VTUNE_LIBRARIES}
|
${VTUNE_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
67
Source/Core/Common/FilesystemWatcher.cpp
Normal file
67
Source/Core/Common/FilesystemWatcher.cpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright 2025 Dolphin Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "Common/FilesystemWatcher.h"
|
||||||
|
|
||||||
|
#include <wtr/watcher.hpp>
|
||||||
|
|
||||||
|
#include "Common/Logging/Log.h"
|
||||||
|
#include "Common/StringUtil.h"
|
||||||
|
|
||||||
|
namespace Common
|
||||||
|
{
|
||||||
|
FilesystemWatcher::FilesystemWatcher() = default;
|
||||||
|
FilesystemWatcher::~FilesystemWatcher() = default;
|
||||||
|
|
||||||
|
void FilesystemWatcher::Watch(const std::string& path)
|
||||||
|
{
|
||||||
|
const auto [iter, inserted] = m_watched_paths.try_emplace(path, nullptr);
|
||||||
|
if (inserted)
|
||||||
|
{
|
||||||
|
iter->second = std::make_unique<wtr::watch>(path, [this](wtr::event e) {
|
||||||
|
const auto watched_path = PathToString(e.path_name);
|
||||||
|
if (e.path_type == wtr::event::path_type::watcher)
|
||||||
|
{
|
||||||
|
if (watched_path.starts_with('e'))
|
||||||
|
ERROR_LOG_FMT(COMMON, "Filesystem watcher: '{}'", watched_path);
|
||||||
|
else if (watched_path.starts_with('w'))
|
||||||
|
WARN_LOG_FMT(COMMON, "Filesystem watcher: '{}'", watched_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.effect_type == wtr::event::effect_type::create)
|
||||||
|
{
|
||||||
|
const auto path = WithUnifiedPathSeparators(watched_path);
|
||||||
|
PathAdded(path);
|
||||||
|
}
|
||||||
|
else if (e.effect_type == wtr::event::effect_type::modify)
|
||||||
|
{
|
||||||
|
const auto path = WithUnifiedPathSeparators(watched_path);
|
||||||
|
PathModified(path);
|
||||||
|
}
|
||||||
|
else if (e.effect_type == wtr::event::effect_type::rename)
|
||||||
|
{
|
||||||
|
if (!e.associated)
|
||||||
|
{
|
||||||
|
WARN_LOG_FMT(COMMON, "Rename on path '{}' seen without association!", watched_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto old_path = WithUnifiedPathSeparators(watched_path);
|
||||||
|
const auto new_path = WithUnifiedPathSeparators(PathToString(e.associated->path_name));
|
||||||
|
PathRenamed(old_path, new_path);
|
||||||
|
}
|
||||||
|
else if (e.effect_type == wtr::event::effect_type::destroy)
|
||||||
|
{
|
||||||
|
const auto path = WithUnifiedPathSeparators(watched_path);
|
||||||
|
PathDeleted(path);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FilesystemWatcher::Unwatch(const std::string& path)
|
||||||
|
{
|
||||||
|
m_watched_paths.erase(path);
|
||||||
|
}
|
||||||
|
} // namespace Common
|
47
Source/Core/Common/FilesystemWatcher.h
Normal file
47
Source/Core/Common/FilesystemWatcher.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright 2025 Dolphin Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
namespace wtr
|
||||||
|
{
|
||||||
|
inline namespace watcher
|
||||||
|
{
|
||||||
|
class watch;
|
||||||
|
}
|
||||||
|
} // namespace wtr
|
||||||
|
|
||||||
|
namespace Common
|
||||||
|
{
|
||||||
|
// A class that can watch a path and receive callbacks
|
||||||
|
// when files or directories underneath that path receive events
|
||||||
|
class FilesystemWatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FilesystemWatcher();
|
||||||
|
virtual ~FilesystemWatcher();
|
||||||
|
|
||||||
|
void Watch(const std::string& path);
|
||||||
|
void Unwatch(const std::string& path);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// A new file or folder was added to one of the watched paths
|
||||||
|
virtual void PathAdded(std::string_view path) {}
|
||||||
|
|
||||||
|
// A file or folder was modified in one of the watched paths
|
||||||
|
virtual void PathModified(std::string_view path) {}
|
||||||
|
|
||||||
|
// A file or folder was renamed in one of the watched paths
|
||||||
|
virtual void PathRenamed(std::string_view old_path, std::string_view new_path) {}
|
||||||
|
|
||||||
|
// A file or folder was deleted in one of the watched paths
|
||||||
|
virtual void PathDeleted(std::string_view path) {}
|
||||||
|
|
||||||
|
std::map<std::string, std::unique_ptr<wtr::watch>> m_watched_paths;
|
||||||
|
};
|
||||||
|
} // namespace Common
|
@ -59,6 +59,7 @@
|
|||||||
<ClInclude Include="Common\Event.h" />
|
<ClInclude Include="Common\Event.h" />
|
||||||
<ClInclude Include="Common\FatFsUtil.h" />
|
<ClInclude Include="Common\FatFsUtil.h" />
|
||||||
<ClInclude Include="Common\FileSearch.h" />
|
<ClInclude Include="Common\FileSearch.h" />
|
||||||
|
<ClInclude Include="Common\FilesystemWatcher.h" />
|
||||||
<ClInclude Include="Common\FileUtil.h" />
|
<ClInclude Include="Common\FileUtil.h" />
|
||||||
<ClInclude Include="Common\FixedSizeQueue.h" />
|
<ClInclude Include="Common\FixedSizeQueue.h" />
|
||||||
<ClInclude Include="Common\Flag.h" />
|
<ClInclude Include="Common\Flag.h" />
|
||||||
@ -813,6 +814,7 @@
|
|||||||
<ClCompile Include="Common\ENet.cpp" />
|
<ClCompile Include="Common\ENet.cpp" />
|
||||||
<ClCompile Include="Common\FatFsUtil.cpp" />
|
<ClCompile Include="Common\FatFsUtil.cpp" />
|
||||||
<ClCompile Include="Common\FileSearch.cpp" />
|
<ClCompile Include="Common\FileSearch.cpp" />
|
||||||
|
<ClCompile Include="Common\FilesystemWatcher.cpp" />
|
||||||
<ClCompile Include="Common\FileUtil.cpp" />
|
<ClCompile Include="Common\FileUtil.cpp" />
|
||||||
<ClCompile Include="Common\FloatUtils.cpp" />
|
<ClCompile Include="Common\FloatUtils.cpp" />
|
||||||
<ClCompile Include="Common\GekkoDisassembler.cpp" />
|
<ClCompile Include="Common\GekkoDisassembler.cpp" />
|
||||||
|
Reference in New Issue
Block a user