mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-07-27 03:01:47 +02:00
.github
bin
module
vendor
CPR
CivetWeb
ConcurrentQueue
Fmt
MDBC
MaxmindDB
POCO
ActiveRecord
ApacheConnector
CppParser
CppUnit
Crypto
Data
Encodings
Foundation
cmake
include
Poco
Dynamic
ASCIIEncoding.h
AbstractCache.h
AbstractDelegate.h
AbstractEvent.h
AbstractObserver.h
AbstractPriorityDelegate.h
AbstractStrategy.h
AccessExpirationDecorator.h
AccessExpireCache.h
AccessExpireLRUCache.h
AccessExpireStrategy.h
ActiveDispatcher.h
ActiveMethod.h
ActiveResult.h
ActiveRunnable.h
ActiveStarter.h
Activity.h
Alignment.h
Any.h
ArchiveStrategy.h
Array.h
Ascii.h
AsyncChannel.h
AtomicCounter.h
AtomicFlag.h
AutoPtr.h
AutoReleasePool.h
Base32Decoder.h
Base32Encoder.h
Base64Decoder.h
Base64Encoder.h
BasicEvent.h
BinaryReader.h
BinaryWriter.h
Buffer.h
BufferAllocator.h
BufferedBidirectionalStreamBuf.h
BufferedStreamBuf.h
Bugcheck.h
ByteOrder.h
Channel.h
Checksum.h
ClassLibrary.h
ClassLoader.h
Clock.h
Condition.h
Config.h
Configurable.h
ConsoleChannel.h
CountingStream.h
DataURIStream.h
DataURIStreamFactory.h
DateTime.h
DateTimeFormat.h
DateTimeFormatter.h
DateTimeParser.h
Debugger.h
DefaultStrategy.h
DeflatingStream.h
Delegate.h
DigestEngine.h
DigestStream.h
DirectoryIterator.h
DirectoryIteratorStrategy.h
DirectoryIterator_UNIX.h
DirectoryIterator_WIN32U.h
DirectoryWatcher.h
DynamicAny.h
DynamicAnyHolder.h
DynamicFactory.h
DynamicStruct.h
Environment.h
Environment_UNIX.h
Environment_VX.h
Environment_WIN32U.h
Environment_WINCE.h
Error.h
ErrorHandler.h
Event.h
EventArgs.h
EventChannel.h
EventLogChannel.h
Event_POSIX.h
Event_VX.h
Event_WIN32.h
Exception.h
ExpirationDecorator.h
Expire.h
ExpireCache.h
ExpireLRUCache.h
ExpireStrategy.h
FIFOBuffer.h
FIFOBufferStream.h
FIFOEvent.h
FIFOStrategy.h
FPEnvironment.h
FPEnvironment_C99.h
FPEnvironment_DEC.h
FPEnvironment_DUMMY.h
FPEnvironment_QNX.h
FPEnvironment_SUN.h
FPEnvironment_WIN32.h
File.h
FileChannel.h
FileStream.h
FileStreamFactory.h
FileStream_POSIX.h
FileStream_WIN32.h
File_UNIX.h
File_VX.h
File_WIN32U.h
File_WINCE.h
Format.h
Formatter.h
FormattingChannel.h
Foundation.h
FunctionDelegate.h
FunctionPriorityDelegate.h
Glob.h
HMACEngine.h
Hash.h
HashFunction.h
HashMap.h
HashSet.h
HashStatistic.h
HashTable.h
HexBinaryDecoder.h
HexBinaryEncoder.h
InflatingStream.h
Instantiator.h
JSONString.h
KeyValueArgs.h
LRUCache.h
LRUStrategy.h
Latin1Encoding.h
Latin2Encoding.h
Latin9Encoding.h
LineEndingConverter.h
LinearHashTable.h
ListMap.h
LocalDateTime.h
LogFile.h
LogFile_STD.h
LogFile_WIN32U.h
LogStream.h
Logger.h
LoggingFactory.h
LoggingRegistry.h
MD4Engine.h
MD5Engine.h
Manifest.h
MemoryPool.h
MemoryStream.h
Message.h
MetaObject.h
MetaProgramming.h
Mutex.h
Mutex_POSIX.h
Mutex_VX.h
Mutex_WIN32.h
Mutex_WINCE.h
NObserver.h
NamedEvent.h
NamedEvent_Android.h
NamedEvent_UNIX.h
NamedEvent_WIN32U.h
NamedMutex.h
NamedMutex_Android.h
NamedMutex_UNIX.h
NamedMutex_WIN32U.h
NamedTuple.h
NestedDiagnosticContext.h
Notification.h
NotificationCenter.h
NotificationQueue.h
NotificationStrategy.h
NullChannel.h
NullStream.h
Nullable.h
NumberFormatter.h
NumberParser.h
NumericString.h
ObjectPool.h
Observer.h
Optional.h
OrderedMap.h
OrderedSet.h
PBKDF2Engine.h
Path.h
Path_UNIX.h
Path_WIN32U.h
Path_WINCE.h
PatternFormatter.h
Pipe.h
PipeImpl.h
PipeImpl_DUMMY.h
PipeImpl_POSIX.h
PipeImpl_WIN32.h
PipeStream.h
Platform.h
Platform_POSIX.h
Platform_VX.h
Platform_WIN32.h
Poco.h
PriorityDelegate.h
PriorityEvent.h
PriorityExpire.h
PriorityNotificationQueue.h
PriorityStrategy.h
Process.h
Process_UNIX.h
Process_VX.h
Process_WIN32U.h
Process_WINCE.h
PurgeStrategy.h
RWLock.h
RWLock_Android.h
RWLock_POSIX.h
RWLock_VX.h
RWLock_WIN32.h
RWLock_WINCE.h
Random.h
RandomStream.h
RecursiveDirectoryIterator.h
RecursiveDirectoryIteratorImpl.h
RefCountedObject.h
RegularExpression.h
RotateStrategy.h
Runnable.h
RunnableAdapter.h
SHA1Engine.h
SHA2Engine.h
ScopedLock.h
ScopedUnlock.h
Semaphore.h
Semaphore_POSIX.h
Semaphore_VX.h
Semaphore_WIN32.h
SharedLibrary.h
SharedLibrary_HPUX.h
SharedLibrary_UNIX.h
SharedLibrary_VX.h
SharedLibrary_WIN32U.h
SharedMemory.h
SharedMemory_DUMMY.h
SharedMemory_POSIX.h
SharedMemory_WIN32.h
SharedPtr.h
SignalHandler.h
SimpleFileChannel.h
SimpleHashTable.h
SingletonHolder.h
SortedDirectoryIterator.h
SplitterChannel.h
Stopwatch.h
StrategyCollection.h
StreamChannel.h
StreamConverter.h
StreamCopier.h
StreamTokenizer.h
StreamUtil.h
String.h
StringTokenizer.h
SynchronizedObject.h
SyslogChannel.h
Task.h
TaskManager.h
TaskNotification.h
TeeStream.h
TemporaryFile.h
TextBufferIterator.h
TextConverter.h
TextEncoding.h
TextIterator.h
Thread.h
ThreadLocal.h
ThreadPool.h
ThreadTarget.h
Thread_POSIX.h
Thread_VX.h
Thread_WIN32.h
Thread_WINCE.h
TimedNotificationQueue.h
Timer.h
Timespan.h
Timestamp.h
Timezone.h
Token.h
Tuple.h
TypeList.h
Types.h
URI.h
URIStreamFactory.h
URIStreamOpener.h
UTF16Encoding.h
UTF32Encoding.h
UTF8Encoding.h
UTF8String.h
UTFString.h
UUID.h
UUIDGenerator.h
UnWindows.h
UnbufferedStreamBuf.h
Unicode.h
UnicodeConverter.h
UniqueAccessExpireCache.h
UniqueAccessExpireLRUCache.h
UniqueAccessExpireStrategy.h
UniqueExpireCache.h
UniqueExpireLRUCache.h
UniqueExpireStrategy.h
ValidArgs.h
Version.h
Void.h
Windows1250Encoding.h
Windows1251Encoding.h
Windows1252Encoding.h
WindowsConsoleChannel.h
ordered_hash.h
ordered_map.h
ordered_set.h
zconf.h
zlib.h
samples
src
testsuite
wcelibcex-1.0
CMakeLists.txt
Foundation_vs140.sln
Foundation_vs140.vcxproj
Foundation_vs140.vcxproj.filters
Foundation_vs150.sln
Foundation_vs150.vcxproj
Foundation_vs150.vcxproj.filters
Foundation_vs160.sln
Foundation_vs160.vcxproj
Foundation_vs160.vcxproj.filters
Makefile
extradirs
JSON
JWT
MongoDB
Net
NetSSL_OpenSSL
NetSSL_Win
PDF
PageCompiler
PocoDoc
ProGen
Redis
SevenZip
Util
XML
Zip
build
ci
cmake
contrib
doc
packaging
patches
release
.gitattributes
.gitignore
.gitmodules
CHANGELOG
CMakeLists.txt
CODE_OF_CONDUCT.md
CONTRIBUTING.md
CONTRIBUTORS
LICENSE
Makefile
NEWS
README
README.md
VERSION
build_cmake.cmd
build_cmake.sh
build_vs140.cmd
build_vs150.cmd
build_vs160.cmd
buildwin.cmd
buildwin.ps1
components
configure
cppignore.lnx
cppignore.win
env.bat
env.sh
libversion
PUGIXML
RPMalloc
SAJSON
SimpleIni
Squirrel
TinyDir
UTF8
ZMQ
xxHash
CMakeLists.txt
.gitignore
.gitmodules
CMakeLists.txt
LICENSE
README.md
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
233 lines
6.5 KiB
C++
233 lines
6.5 KiB
C++
//
|
|
// DirectoryWatcher.h
|
|
//
|
|
// Library: Foundation
|
|
// Package: Filesystem
|
|
// Module: DirectoryWatcher
|
|
//
|
|
// Definition of the DirectoryWatcher class.
|
|
//
|
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#ifndef Foundation_DirectoryWatcher_INCLUDED
|
|
#define Foundation_DirectoryWatcher_INCLUDED
|
|
|
|
|
|
#include "Poco/Foundation.h"
|
|
|
|
|
|
#ifndef POCO_NO_INOTIFY
|
|
|
|
|
|
#include "Poco/File.h"
|
|
#include "Poco/BasicEvent.h"
|
|
#include "Poco/Runnable.h"
|
|
#include "Poco/Thread.h"
|
|
#include "Poco/AtomicCounter.h"
|
|
|
|
|
|
namespace Poco {
|
|
|
|
|
|
class DirectoryWatcherStrategy;
|
|
|
|
|
|
class Foundation_API DirectoryWatcher: protected Runnable
|
|
/// This class is used to get notifications about changes
|
|
/// to the filesystem, more specifically, to a specific
|
|
/// directory. Changes to a directory are reported via
|
|
/// events.
|
|
///
|
|
/// A thread will be created that watches the specified
|
|
/// directory for changes. Events are reported in the context
|
|
/// of this thread.
|
|
///
|
|
/// Note that changes to files in subdirectories of the watched
|
|
/// directory are not reported. Separate DirectoryWatcher objects
|
|
/// must be created for these directories if they should be watched.
|
|
///
|
|
/// Changes to file attributes are not reported.
|
|
///
|
|
/// On Windows, this class is implemented using FindFirstChangeNotification()/FindNextChangeNotification().
|
|
/// On Linux, this class is implemented using inotify.
|
|
/// On FreeBSD and Darwin (Mac OS X, iOS), this class uses kevent/kqueue.
|
|
/// On all other platforms, the watched directory is periodically scanned
|
|
/// for changes. This can negatively affect performance if done too often.
|
|
/// Therefore, the interval in which scans are done can be specified in
|
|
/// the constructor. Note that periodic scanning will also be done on FreeBSD
|
|
/// and Darwin if events for changes to files (DW_ITEM_MODIFIED) are enabled.
|
|
///
|
|
/// DW_ITEM_MOVED_FROM and DW_ITEM_MOVED_TO events will only be reported
|
|
/// on Linux. On other platforms, a file rename or move operation
|
|
/// will be reported via a DW_ITEM_REMOVED and a DW_ITEM_ADDED event.
|
|
/// The order of these two events is not defined.
|
|
///
|
|
/// An event mask can be specified to enable only certain events.
|
|
{
|
|
public:
|
|
enum DirectoryEventType
|
|
{
|
|
DW_ITEM_ADDED = 1,
|
|
/// A new item has been created and added to the directory.
|
|
|
|
DW_ITEM_REMOVED = 2,
|
|
/// An item has been removed from the directory.
|
|
|
|
DW_ITEM_MODIFIED = 4,
|
|
/// An item has been modified.
|
|
|
|
DW_ITEM_MOVED_FROM = 8,
|
|
/// An item has been renamed or moved. This event delivers the old name.
|
|
|
|
DW_ITEM_MOVED_TO = 16
|
|
/// An item has been renamed or moved. This event delivers the new name.
|
|
};
|
|
|
|
enum DirectoryEventMask
|
|
{
|
|
DW_FILTER_ENABLE_ALL = 31,
|
|
/// Enables all event types.
|
|
|
|
DW_FILTER_DISABLE_ALL = 0
|
|
/// Disables all event types.
|
|
};
|
|
|
|
enum
|
|
{
|
|
DW_DEFAULT_SCAN_INTERVAL = 5 /// Default scan interval for platforms that don't provide a native notification mechanism.
|
|
};
|
|
|
|
struct DirectoryEvent
|
|
{
|
|
DirectoryEvent(const File& f, DirectoryEventType ev):
|
|
item(f),
|
|
event(ev)
|
|
{
|
|
}
|
|
|
|
const File& item; /// The directory or file that has been changed.
|
|
DirectoryEventType event; /// The kind of event.
|
|
};
|
|
|
|
BasicEvent<const DirectoryEvent> itemAdded;
|
|
/// Fired when a file or directory has been created or added to the directory.
|
|
|
|
BasicEvent<const DirectoryEvent> itemRemoved;
|
|
/// Fired when a file or directory has been removed from the directory.
|
|
|
|
BasicEvent<const DirectoryEvent> itemModified;
|
|
/// Fired when a file or directory has been modified.
|
|
|
|
BasicEvent<const DirectoryEvent> itemMovedFrom;
|
|
/// Fired when a file or directory has been renamed. This event delivers the old name.
|
|
|
|
BasicEvent<const DirectoryEvent> itemMovedTo;
|
|
/// Fired when a file or directory has been moved. This event delivers the new name.
|
|
|
|
BasicEvent<const Exception> scanError;
|
|
/// Fired when an error occurs while scanning for changes.
|
|
|
|
DirectoryWatcher(const std::string& path, int eventMask = DW_FILTER_ENABLE_ALL, int scanInterval = DW_DEFAULT_SCAN_INTERVAL);
|
|
/// Creates a DirectoryWatcher for the directory given in path.
|
|
/// To enable only specific events, an eventMask can be specified by
|
|
/// OR-ing the desired event IDs (e.g., DW_ITEM_ADDED | DW_ITEM_MODIFIED).
|
|
/// On platforms where no native filesystem notifications are available,
|
|
/// scanInterval specifies the interval in seconds between scans
|
|
/// of the directory.
|
|
|
|
DirectoryWatcher(const File& directory, int eventMask = DW_FILTER_ENABLE_ALL, int scanInterval = DW_DEFAULT_SCAN_INTERVAL);
|
|
/// Creates a DirectoryWatcher for the specified directory
|
|
/// To enable only specific events, an eventMask can be specified by
|
|
/// OR-ing the desired event IDs (e.g., DW_ITEM_ADDED | DW_ITEM_MODIFIED).
|
|
/// On platforms where no native filesystem notifications are available,
|
|
/// scanInterval specifies the interval in seconds between scans
|
|
/// of the directory.
|
|
|
|
~DirectoryWatcher();
|
|
/// Destroys the DirectoryWatcher.
|
|
|
|
void suspendEvents();
|
|
/// Suspends sending of events. Can be called multiple times, but every
|
|
/// call to suspendEvent() must be matched by a call to resumeEvents().
|
|
|
|
void resumeEvents();
|
|
/// Resumes events, after they have been suspended with a call to suspendEvents().
|
|
|
|
bool eventsSuspended() const;
|
|
/// Returns true iff events are suspended.
|
|
|
|
int eventMask() const;
|
|
/// Returns the value of the eventMask passed to the constructor.
|
|
|
|
int scanInterval() const;
|
|
/// Returns the scan interval in seconds.
|
|
|
|
const File& directory() const;
|
|
/// Returns the directory being watched.
|
|
|
|
bool supportsMoveEvents() const;
|
|
/// Returns true iff the platform supports DW_ITEM_MOVED_FROM/itemMovedFrom and
|
|
/// DW_ITEM_MOVED_TO/itemMovedTo events.
|
|
|
|
protected:
|
|
void init();
|
|
void stop();
|
|
void run();
|
|
|
|
private:
|
|
DirectoryWatcher();
|
|
DirectoryWatcher(const DirectoryWatcher&);
|
|
DirectoryWatcher& operator = (const DirectoryWatcher&);
|
|
|
|
Thread _thread;
|
|
File _directory;
|
|
int _eventMask;
|
|
AtomicCounter _eventsSuspended;
|
|
int _scanInterval;
|
|
DirectoryWatcherStrategy* _pStrategy;
|
|
};
|
|
|
|
|
|
//
|
|
// inlines
|
|
//
|
|
|
|
|
|
inline bool DirectoryWatcher::eventsSuspended() const
|
|
{
|
|
return _eventsSuspended.value() > 0;
|
|
}
|
|
|
|
|
|
inline int DirectoryWatcher::eventMask() const
|
|
{
|
|
return _eventMask;
|
|
}
|
|
|
|
|
|
inline int DirectoryWatcher::scanInterval() const
|
|
{
|
|
return _scanInterval;
|
|
}
|
|
|
|
|
|
inline const File& DirectoryWatcher::directory() const
|
|
{
|
|
return _directory;
|
|
}
|
|
|
|
|
|
} // namespace Poco
|
|
|
|
|
|
#endif // POCO_NO_INOTIFY
|
|
|
|
|
|
#endif // Foundation_DirectoryWatcher_INCLUDED
|
|
|