5efee6dfb0
While enums are presented much more clearly in the docs and the values didn't change this apparently caused some issues so we're going back to using #defines. Also update the docs changing the \var tags to \def tag and putting the description in a \brief tag.
507 lines
12 KiB
Plaintext
507 lines
12 KiB
Plaintext
/*
|
|
* Copyright 2003-2014 Haiku, Inc. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Axel Dörfler, axeld@pinc-software.de
|
|
* John Scipione, jscipione@gmail.com
|
|
* Ingo Weinhold, bonefish@users.sf.net
|
|
* Clemens Zeidler, haiku@clemens-zeidler.de
|
|
*
|
|
* Corresponds to:
|
|
* headers/os/storage/NodeMonitor.h hrev47403
|
|
* src/kits/storage/NodeMonitor.cpp hrev47403
|
|
*/
|
|
|
|
|
|
/*!
|
|
\file NodeMonitor.h
|
|
\ingroup storage
|
|
\ingroup libbe
|
|
\brief Provides functions and constants for monitoring changes to a node.
|
|
|
|
The are three main node monitoring functions are watch_volume(),
|
|
watch_node(), and stop_watching().
|
|
- watch_volume() starts watching a volume and sends a message
|
|
when a requested event occurs.
|
|
- watch_node() starts or stops watching a node, or watches for volumes
|
|
to be mounted and unmounted, and sends a message when an event occurs.
|
|
- stop_watching() stops monitoring a node or volume and no longer sends
|
|
messages.
|
|
*/
|
|
|
|
|
|
//// Flags for the watch_node() call.
|
|
|
|
|
|
/*!
|
|
\var B_STOP_WATCHING
|
|
\brief Unsubscribe from watching a node.
|
|
|
|
Flag for watch_node().
|
|
|
|
\attention \c B_STOP_WATCHING does not apply to volume watching, you must
|
|
call stop_watching() instead.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_NAME
|
|
\brief Subscribe to watching for change to the name of a node.
|
|
|
|
Flag for watch_volume() and watch_node().
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_STAT
|
|
\brief Subscribe to watching for changes to the stat information of a node.
|
|
|
|
Flag for watch_volume() and watch_node().
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_ATTR
|
|
\brief Subscribe to watching for changes to the attributes of a node.
|
|
|
|
Flag for watch_volume() and watch_node().
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_DIRECTORY
|
|
\brief Subscribe to watching for changes to the contents of a directory.
|
|
|
|
Flag for watch_node().
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_ALL
|
|
\brief Flag for watch_node().
|
|
|
|
Subscribe to watching for changes to all information of a node except
|
|
\c B_WATCH_MOUNT.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_MOUNT
|
|
\brief Subscribe to watching for when a volume is mounted or unmounted.
|
|
|
|
You may prefer to use BVolumeRoster for volume watching instead.
|
|
|
|
Flag for watch_node().
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_WATCH_INTERIM_STAT
|
|
\brief To avoid a flood of messages for small and frequent write operations
|
|
on an open file the file system can limit the number of
|
|
notifications and mark them with the \c B_WATCH_INTERIM_STAT flag.
|
|
|
|
\internal Implementation detail, not in Be Book.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
// The "opcode" field of the B_NODE_MONITOR notification message you get.
|
|
|
|
|
|
/*!
|
|
\def B_ENTRY_CREATED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" is set when entry is
|
|
created.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_ENTRY_REMOVED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" is set when entry is
|
|
removed.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_ENTRY_MOVED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" is set when entry is
|
|
moved.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_STAT_CHANGED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" set when stat info
|
|
changes.
|
|
|
|
More information can be found in the "fields" field.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_ATTR_CHANGED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" set when attribute
|
|
changes.
|
|
|
|
More information can be found in the "cause" field.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_DEVICE_MOUNTED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" set when device is
|
|
mounted.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_DEVICE_UNMOUNTED
|
|
\brief \c B_NODE_MONITOR notification message "opcode" set when device is
|
|
unmounted.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
// More specific info in the "cause" field of B_ATTR_CHANGED notification
|
|
// messages.
|
|
|
|
|
|
/*!
|
|
\def B_ATTR_CREATED
|
|
\brief \c B_ATTR_CHANGED notification message "cause" set when attribute is
|
|
created.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\def B_ATTR_REMOVED
|
|
\brief \c B_ATTR_CHANGED notification message "cause" set when attribute is
|
|
removed.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
// More specific info in the "fields" field of B_STAT_CHANGED notification
|
|
// messages, specifying what parts of the stat data have actually been
|
|
// changed.
|
|
|
|
|
|
/*!
|
|
\var B_STAT_MODE
|
|
\brief Set when stat mode changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_UID
|
|
\brief Set when UID changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_GID
|
|
\brief Set when GID changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_SIZE
|
|
\brief Set when stat size changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_ACCESS_TIME
|
|
\brief Set when access time changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_MODIFICATION_TIME
|
|
\brief Set when modification time changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_CREATION_TIME
|
|
\brief Set when creation time changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_CHANGE_TIME
|
|
\brief Set when access, modification or creation time changes.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\var B_STAT_INTERIM_UPDATE
|
|
\brief Set when file is written to.
|
|
|
|
\internal Implementation detail, not in Be Book.
|
|
|
|
\c B_STAT_CHANGED notification messages "fields" flag.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\fn status_t watch_volume(dev_t volume, uint32 flags, BMessenger target)
|
|
\brief Subscribes \a target to watch node changes on \a volume.
|
|
|
|
Depending of \a flags the action performed by this function varies:
|
|
- \a flags contains at least one of \c B_WATCH_NAME, \c B_WATCH_STAT,
|
|
or <tt>B_WATCH_ATTR</tt>: The target is subscribed to watching the specified
|
|
aspects of any node on the volume.
|
|
|
|
\a flags may include:
|
|
- \c B_WATCH_NAME
|
|
- \c B_WATCH_STAT
|
|
- \c B_WATCH_ATTR
|
|
|
|
\c B_WATCH_VOLUME flag is assumed.
|
|
|
|
\param volume dev_t referring to the volume to be watched.
|
|
\param flags Flags indicating the actions to be performed.
|
|
\param target Messenger referring to the target. Must be valid.
|
|
|
|
\return A status code.
|
|
\retval B_OK Everything went fine.
|
|
\retval B_BAD_VALUE \a flags did not include one of \c B_WATCH_NAME,
|
|
\c B_WATCH_STAT, or \c B_WATCH_ATTR.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\fn status_t watch_volume(dev_t volume, uint32 flags,
|
|
const BHandler* handler, const BLooper* looper)
|
|
\brief Subscribes \a handler or \a looper to watch node changes on
|
|
\a volume.
|
|
|
|
Depending of \a flags the action performed by this function varies:
|
|
- \a flags contains at least one of \c B_WATCH_NAME, \c B_WATCH_STAT,
|
|
or <tt>B_WATCH_ATTR</tt>: The target is subscribed to watching the specified
|
|
aspects of any node on the volume.
|
|
|
|
\a flags may include:
|
|
- \c B_WATCH_NAME
|
|
- \c B_WATCH_STAT
|
|
- \c B_WATCH_ATTR
|
|
|
|
\c B_WATCH_VOLUME flag is assumed.
|
|
|
|
\param volume dev_t referring to the volume to be watched.
|
|
\param flags Flags indicating the actions to be performed.
|
|
\param handler The target \a handler. May be \c NULL, if \a looper is not
|
|
\c NULL. Then the preferred handler of the looper is targeted.
|
|
\param looper The target \a looper. May be \c NULL, if \a handler is not
|
|
\c NULL. Then the handler's looper is the target looper.
|
|
|
|
\return A status code.
|
|
\retval B_OK Everything went fine.
|
|
\retval B_BAD_VALUE \a flags did not include one of \c B_WATCH_NAME,
|
|
\c B_WATCH_STAT, or \c B_WATCH_ATTR.
|
|
|
|
\since Haiku R1
|
|
*/
|
|
|
|
|
|
/*!
|
|
\fn status_t watch_node(const node_ref* node, uint32 flags,
|
|
BMessenger target)
|
|
\brief Subscribes or unsubscribes \a target to node and/or mount watching.
|
|
|
|
Depending of \a flags the action performed by this function varies:
|
|
- \a flags is 0: The target is unsubscribed from watching the node.
|
|
\a node must not be \c NULL in this case.
|
|
- \a flags contains \c B_WATCH_MOUNT: The target is subscribed to mount
|
|
watching.
|
|
- \a flags contains at least one of \c B_WATCH_NAME, \c B_WATCH_STAT,
|
|
\c B_WATCH_ATTR, or <tt>B_WATCH_DIRECTORY</tt>: The target is subscribed to
|
|
watching the specified aspects of the node. \a node must not be \c NULL
|
|
in this case.
|
|
|
|
\a flags may include:
|
|
- \c B_STOP_WATCHING
|
|
|
|
or one or more of the following:
|
|
- \c B_WATCH_NAME
|
|
- \c B_WATCH_STAT
|
|
- \c B_WATCH_ATTR
|
|
- \c B_WATCH_DIRECTORY
|
|
- \c B_WATCH_ALL
|
|
- \c B_WATCH_MOUNT
|
|
|
|
Note that the latter two cases are not mutual exclusive, i.e. mount and
|
|
node watching can be requested with a single call.
|
|
|
|
\param node node_ref referring to the node to be watched. May be \c NULL,
|
|
if only mount watching is requested.
|
|
\param flags Flags indicating the actions to be performed.
|
|
\param target BMessenger object referring to the \a target.
|
|
|
|
\return \c B_OK if everything went fine, an error code otherwise.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\fn status_t watch_node(const node_ref* node, uint32 flags,
|
|
const BHandler* handler, const BLooper* looper)
|
|
\brief Subscribes or unsubscribes \a handler or \a looper to node and/or
|
|
mount watching.
|
|
|
|
Depending of \a flags the action performed by this function varies:
|
|
- \a flags is 0: The target is unsubscribed from watching the node.
|
|
\a node must not be \c NULL in this case.
|
|
- \a flags contains \c B_WATCH_MOUNT: The target is subscribed to mount
|
|
watching.
|
|
- \a flags contains at least one of \c B_WATCH_NAME, \c B_WATCH_STAT,
|
|
\c B_WATCH_ATTR, or <tt>B_WATCH_DIRECTORY</tt>: The target is subscribed to
|
|
watching the specified aspects of the node. \a node must not be \c NULL
|
|
in this case.
|
|
|
|
\a flags may include:
|
|
- \c B_STOP_WATCHING
|
|
|
|
or one or more of the following:
|
|
- \c B_WATCH_NAME
|
|
- \c B_WATCH_STAT
|
|
- \c B_WATCH_ATTR
|
|
- \c B_WATCH_DIRECTORY
|
|
- \c B_WATCH_ALL
|
|
- \c B_WATCH_MOUNT
|
|
|
|
Note that the latter two cases are not mutual exclusive, i.e. mount and
|
|
node watching can be requested with a single call.
|
|
|
|
\param node node_ref referring to the node to be watched. May be \c NULL,
|
|
if only mount watching is requested.
|
|
\param flags Flags indicating the actions to be performed.
|
|
\param handler The target handler. May be \c NULL, if \a looper is not
|
|
\c NULL. Then the preferred handler of the looper is targeted.
|
|
\param looper The target looper. May be \c NULL, if \a handler is not
|
|
\c NULL. Then the handler's looper is the target looper.
|
|
|
|
\return \c B_OK if everything went fine, an error code otherwise.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\fn status_t stop_watching(BMessenger target)
|
|
\brief Unsubscribes \a target from node and mount monitoring.
|
|
|
|
You may still receive notification messages after calling stop_watching()
|
|
because while node monitoring is asynchronous and all changes are atomic,
|
|
message sending is not atomic so there is a lag time from when you
|
|
stop monitoring and when the message is received in your message receiving
|
|
thread. You can check the timestamp of the message to determine if
|
|
it was sent after stop_watching() was called.
|
|
|
|
\param target BMessenger object referring to the \a target.
|
|
|
|
\return A status code.
|
|
\retval B_OK Stopped sending notification messages to the \a target.
|
|
\retval B_BAD_VALUE \a target was invalid.
|
|
\retval B_ENTRY_NOT_FOUND Node not found.
|
|
|
|
\since BeOS R3
|
|
*/
|
|
|
|
|
|
/*!
|
|
\fn status_t stop_watching(const BHandler* handler, const BLooper* looper)
|
|
\brief Unsubscribes \a handler or \a looper target from node and mount
|
|
monitoring.
|
|
|
|
You may still receive notification messages after calling stop_watching()
|
|
because while node monitoring is asynchronous and all changes are atomic,
|
|
message sending is not atomic so there is a lag time from when you
|
|
stop monitoring and when the message is received in your message receiving
|
|
thread. You can check the timestamp of the message to determine if
|
|
it was sent after stop_watching() was called.
|
|
|
|
\param handler The target handler, may be \c NULL. If \a looper is not
|
|
\c NULL then the looper's preferred handler is targeted.
|
|
\param looper The target looper, may be \c NULL. If \a handler is not
|
|
\c NULL then the handler's looper is targeted.
|
|
|
|
\return A status code.
|
|
\retval B_OK Stopped sending notification messages to the target.
|
|
\retval B_BAD_VALUE Target from \a handler or \a looper was invalid.
|
|
\retval B_ENTRY_NOT_FOUND Node not found.
|
|
|
|
\since BeOS R3
|
|
*/
|