1/*
2 * Copyright 2007-2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _PATH_MONITOR_H
6#define _PATH_MONITOR_H
7
8
9#include <NodeMonitor.h>
10
11
12// Monitoring a path always implies B_WATCH_NAME for the path itself. I.e. even
13// if only B_WATCH_STAT is specified, B_ENTRY_{CREATED,MOVED,REMOVED}
14// notifications are sent when the respective entry is created/moved/removed.
15
16// additional flags (combined with those in NodeMonitor.h)
17#define B_WATCH_RECURSIVELY			0x0100
18	// Watch not only the entry specified by the path, but also recursively all
19	// descendents. A recursive B_WATCH_DIRECTORY is implied, i.e.
20	// B_ENTRY_{CREATED,MOVED,REMOVED} notifications will be sent for any entry
21	// change below the given path, unless explicitly suppressed by
22	// B_WATCH_{FILES,DIRECTORIES}_ONLY.
23#define	B_WATCH_FILES_ONLY			0x0200
24	// A notification will only be sent when the node it concerns is not a
25	// directory. No effect in non-recursive mode.
26#define	B_WATCH_DIRECTORIES_ONLY	0x0400
27	// A notification will only be sent when the node it concerns is a
28	// directory. No effect in non-recursive mode.
29
30#define B_PATH_MONITOR		'_PMN'
31
32
33namespace BPrivate {
34
35
36class BPathMonitor {
37public:
38			class BWatchingInterface;
39
40public:
41	static	status_t			StartWatching(const char* path, uint32 flags,
42									const BMessenger& target);
43
44	static	status_t			StopWatching(const char* path,
45									const BMessenger& target);
46	static	status_t			StopWatching(const BMessenger& target);
47
48	static	void				SetWatchingInterface(
49									BWatchingInterface* watchingInterface);
50									// pass NULL to reset to default
51
52private:
53								BPathMonitor();
54								~BPathMonitor();
55
56	static	status_t			_InitIfNeeded();
57	static	void				_Init();
58};
59
60
61/*!	Base class just delegates to the respective C functions.
62 */
63class BPathMonitor::BWatchingInterface {
64public:
65								BWatchingInterface();
66	virtual						~BWatchingInterface();
67
68	virtual	status_t			WatchNode(const node_ref* node, uint32 flags,
69									const BMessenger& target);
70	virtual	status_t			WatchNode(const node_ref* node, uint32 flags,
71                    				const BHandler* handler,
72							  		const BLooper* looper = NULL);
73
74	virtual	status_t			StopWatching(const BMessenger& target);
75	virtual	status_t			StopWatching(const BHandler* handler,
76									const BLooper* looper = NULL);
77};
78
79
80}	// namespace BPrivate
81
82
83using BPrivate::BPathMonitor;
84
85
86#endif	// _PATH_MONITOR_H
87